HubSpot + sales-i and Pronto Xi integration
sales-i holds a decade of account history and call logs read off a distributor's Pronto Xi order book, and distributors usually want it moved out.
Built by us- Into HubSpot
Is there a native sales-i and Pronto Xi + HubSpot integration?
No. sales-i is missing from the HubSpot App Marketplace entirely, with no app published under that name, as of September 2026. For most distributors the first piece of work is a one time migration of customers, contacts, opportunities and call history, run as a keyed batch upsert from an export rather than through the import screen.
- Recommended route
- Custom middleware
- Build effort
- 70 to 150 hours
- In the HubSpot App Marketplace?
- No listed app
- Typical elapsed time
- 4 to 8 weeks
Marketplace checked September 2026.
Why teams connect sales-i and Pronto Xi to HubSpot
Distributors rarely start this conversation wanting an integration. They want to leave a tool. Years of account history, quotes and call logs have accumulated in a sales intelligence layer that reads the order book, the business has decided HubSpot is where selling will happen from now on, and somebody has to get the history across without losing the thread of a customer relationship that goes back a decade.
What makes it awkward is the shape of the data. A distributor’s account list is mostly dormant: web ordering accounts that have never spoken to a person, prospects created and forgotten, branches of the same customer recorded separately. Contacts are thin, because most accounts are just an account number. The call log, on the other hand, is thick and genuinely valuable: tens of thousands of records with a type, an outcome and a duration, which is the only written record of who has been looking after which customer.
Behind both sits the ERP. The sales intelligence layer has no database of its own to speak of, so an export from it is a snapshot of the ERP with a sales view applied. That matters for scoping, because the things a sales team asks for next, product history, live pricing, stock, are not in the export and never were. They are a second project against the ERP, and saying so early stops the migration from quietly turning into an integration halfway through.
What syncs
Four objects move in the migration and a fifth follows later. Customers become companies, contacts become contacts, opportunities become deals, call notes become call engagements, and order and line history comes afterwards from the ERP.
Every object keys on its own source identifier, stored in a HubSpot property marked unique. The account number is the backbone: contacts, opportunities and notes all carry it, and it resolves cleanly, which is what makes the load order safe. Contacts never key on email. A distributor’s export routinely has thousands of contacts with no email and hundreds sharing a branch address, so an email key would merge unrelated people and discard the rest.
Calls are the exception to everything. HubSpot activities have no unique property, so a call cannot be upserted at all. They are created once, deduplicated against what is already in the portal, and they cannot be edited afterwards, which makes the first production run of calls the one moment in the project with no second chance.
| | | Direction | Match key | Notes |
|---|---|---|---|---|
| Customer | Company | Into HubSpot | Account number, held in a unique custom HubSpot property | The account number is the backbone key every other file points at. |
| Contact | Contact | Into HubSpot | Source contact identifier, never email | Thousands of contacts carry no email, and hundreds share one. |
| Opportunity | Deal | Into HubSpot | Source opportunity identifier | Stage and pipeline must be internal identifiers, not the labels on screen. |
| Note | Engagement | Into HubSpot | Source note identifier, created and deduplicated rather than upserted | These are call logs with a type, an outcome and a duration, not free text. |
| Order and line history | Line item | Into HubSpot | Order number plus line number | Not in the sales intelligence export. It comes from the ERP on a second track. |
Architecture
The pattern is a batch migration. A transform step reads the export, applies the cleanup rules and writes HubSpot shaped records to disk. A load step creates the custom properties and the deal pipeline, then upserts each object in batches keyed on its source identifier, then runs a separate associations pass once every parent record exists. HubSpot API paths are pinned to version 2026-03.
Load order is a chain of gates: companies, then contacts, then deals, then calls, then associations, then reconciliation. Nothing advances until the count of records created plus updated matches the source and the failure count is zero or explained. Object identifiers are stable across re-runs, so the association pass resolves source keys to HubSpot records deterministically.
Every record carries a batch marker and a source system stamp. Those two fields are what makes the load reversible: they identify the cohort precisely, so it can be archived and reloaded after a transform fix without touching anything a user has since created.
What the API allows
- API style
- File transfer
- Authentication
- None
- Webhooks
- No
- Changed-since filter
- No
- Sandbox
- Unknown
- Rate limit
- Not documented
Three ways to connect
The import screen is the route most teams try first, and it is the wrong tool for a load this shape. It caps a job at roughly two objects, which turns four objects and six association types into a chain of manual steps nobody can repeat identically in a second portal. A scripted batch upsert runs the same way twice: one credential swap between the sandbox rehearsal and the production run, against code that has already proven itself. The managed sync question arrives later, for the ongoing ERP feed over Pronto Connect, where a stable mapping on a schedule is exactly what a packaged tool is good at.
-
Custom middleware
RecommendedA scripted batch upsert keyed on a unique source identifier per object, followed by a separate associations pass, is repeatable, idempotent and runs identically against a sandbox and production.
-
Managed sync on Skyvia
PossibleOnce the history is loaded, the ongoing feed of order and product data from the ERP is a stable scheduled mapping, which is what a managed sync is for.
-
Native app
AvoidThere is no sales-i app in the HubSpot App Marketplace, and the import screen caps a job at roughly two objects, which does not cover four objects and six association types.
What breaks and how we prevent it
On a migration like this, three of the four failures are data problems rather than API ones.
Sentinel last-order dates
Sentinel dates load as real ones. Distribution exports use a placeholder date for customers who have never ordered, and a large share of the account list carries it. Loaded as written, it produces a portal where most customers appear to have last ordered nearly a century ago. The defence is an explicit rule that converts the sentinel to an empty value before the load.
Invalid emails that fail a batch
One bad row sinks a batch. An invalid email address fails the whole request, not just the offending record. The defence is a loader that splits a failed batch and retries down to single records, then salvages what it can rather than discarding a hundred good rows for one bad one.
Stage labels instead of identifiers
Deal stages are written as labels rather than identifiers. HubSpot wants internal identifiers for pipeline and stage, and a label looks close enough to work until nothing lands. The defence is to create the pipeline in code and read the generated identifiers back, so the values are never typed by hand.
Calls with no timestamp or association
Calls land without a timestamp or an association. Both mistakes make them invisible: an activity with no historical timestamp collapses to today, and one with no association is attached to nothing. The defence is to set the historical timestamp and the association in the same pass, and to check both in the sandbox before a single call is written to production.
Our approach
- Scope. We profile the export before promising anything: row counts, key uniqueness, how many fields are actually populated, and which columns are dead on arrival. That report is the scoping document.
- Architect. We agree the object model, the unique keys, the pipeline and the cleanup rules in writing, because every one of them is expensive to change once records exist.
- Build. Transform and load as separate steps, batch upserts keyed on source identifiers, a separate associations pass, and a batch marker on every record.
- Validate. The full chain runs against a sandbox portal behind a fail closed allowlist, is re-run to prove idempotency, and is reconciled object by object before production is scheduled.
- Operate. After the load we reconcile counts, spot check records against the source, and hand over the rollback path along with the code.
Common questions
Is there a HubSpot app for sales-i?
Nothing comes up published under the name sales-i when you search the HubSpot App Marketplace, only listings that mention the words. That check covered sales-i alone. We have not separately verified whether Pronto Xi is listed under its own name, so treat that one as unconfirmed.
Should a sales-i migration use the HubSpot import screen?
No, for a load of this shape. The import job caps at roughly two objects at a time, so four objects with six association types becomes a chain of manual, click driven steps that cannot be repeated identically against a sandbox and then production. A scripted batch upsert can be re-run as often as you need.
What should a sales-i to HubSpot migration key on?
A unique custom property per object, holding the source identifier. Companies key on the account number, contacts on the contact identifier, deals on the opportunity identifier. Every HubSpot object including the company supports a property marked unique, which is what makes an idempotent upsert possible without a search and create workaround.
What happens to sales-i contacts with no email or a shared one?
They survive, because email is not the key. A large share of contacts in a distributor's export carry no email at all, and a smaller set share one branch address between many people. The first owner keeps the email field, the rest keep theirs in a separate property, and nobody is merged or dropped.
Can sales-i call notes be upserted into HubSpot?
No. HubSpot activities have no unique property, so a call cannot be upserted on an external identifier the way a company can. The loader creates calls and deduplicates against a map of what is already in the portal, which means the fields have to be right on the first production run because a call cannot be corrected afterwards.
What does sales-i hold that Pronto Xi does not?
Almost nothing, and that is the point. sales-i is a sales intelligence layer that reads the ERP data a distributor already has, so an export from it is effectively a snapshot of the ERP with a sales view on top. Order and line history, the product catalogue, live inventory and account pricing stay in the ERP and need their own feed.
How do you re-run a sales-i migration without creating duplicates?
By keying every object on its source identifier and stamping each record with a batch marker. An upsert re-run updates in place, so a second run reports almost nothing created and everything updated. The batch marker is also the rollback: query the cohort, archive it, fix the transform and run again.
How long does a sales-i to HubSpot migration take?
A four object load with associations, cleanup rules and a full sandbox rehearsal takes ten to twenty hours of discovery and seventy to a hundred and fifty hours of build. Most of that time goes on the data, not the API. Profiling the export and agreeing the cleanup rules is the long pole.
Related reading
Partnerships and accreditations
HubSpot accreditations
Industry specializations
Partnerships
Scope a sales-i and Pronto Xi integration
Send the systems, the direction and the record volume. We reply with a scope and an effort band within one business day.
Thanks, we will reply within one business day
Prash or Sean reads every one of these and comes back with a scope, or with the one question we need answered first.
Where these facts come from
- sales-i | Simple, Effective Sales Intelligence Platform sales-i.com
- SugarAI (formerly SugarCRM) | Precision selling platform sugarai.com
- API Integration Platform pronto.net
- Developer Tools pronto.net