HubSpot + Dynamics 365 Sales integration
Dynamics 365 Sales keeps leads, opportunities and accounts in Dataverse. HubSpot's own app syncs them both ways; the real work is ownership and matching.
Connects by APIScope this integration Book a scoping call Estimate the cost
- Into HubSpot
- Two way
Is there an official Dynamics 365 Sales + HubSpot integration?
Yes. Dynamics 365 Sales connects through HubSpot's own Microsoft Dynamics 365 app, listed in the HubSpot App Marketplace as of September 2026, which syncs accounts, contacts, leads, opportunities and activities one way or both ways. We recommend configuring it, 8 to 24 hours of work rather than a build. A custom API integration over the Dataverse Web API joins it for an on-premises server, which the app does not reach, or for matching rules its mapping cannot express.
- Recommended route
- Marketplace app
- Build effort
- 8 to 24 hours
- In the HubSpot App Marketplace?
- Yes, Microsoft Dynamics 365 by HubSpot
- Typical elapsed time
- 1 to 2 weeks
Marketplace checked September 2026.
Why teams connect Dynamics 365 Sales to HubSpot
In Dynamics 365 Sales, an opportunity is a row in Dataverse, the same store that Customer Service, Power Apps and Power Automate flows read and write, so it can feed processes well beyond the sales team. When marketing chooses HubSpot, the real question is how much of that shared record HubSpot should be allowed to touch.
What each side cannot see is concrete. A seller working an opportunity cannot see which emails the contact opened or which form brought them in. A marketer building a nurture list cannot see which accounts already have an open opportunity, so the list includes people a seller is about to close. HubSpot’s app answers both halves: it pairs the records in the two systems, and its HubSpot Embed feature puts a record’s HubSpot timeline and workflow enrolments inside the Dynamics form, where a seller can also enrol the contact in a sequence.
Scope is the decision that shapes the project. If Dynamics is staying, this is an integration, and every synced field needs one owner. If Dynamics is being retired, it is a migration with a sync for the months in between, and the migration or integration guide is the place to start before anything is configured.
What syncs
HubSpot’s app works table by table, and each pairing gets its own direction. Accounts become companies, opportunities become deals, and tasks and appointments move both ways as activities. Phone calls and emails logged in Dynamics come into HubSpot one way. Custom tables pair with HubSpot custom objects on Enterprise subscriptions, and a sales order raised from a HubSpot deal comes back as a HubSpot order.
Contacts are where the matching needs thought. Dynamics keeps leads and contacts in separate tables, and HubSpot’s app offers both against the one HubSpot contact object, matched on email. A person held in both tables therefore competes for a single HubSpot record. We decide which table feeds HubSpot before the first sync rather than learning it from the list of failing records.
After the first match, data sync holds each pair by record id, so a renamed account or a changed email does not split it. Deal pipelines and stages are mapped by label, only opportunities in mapped stages sync, and a task linked to a Dynamics lead only ever moves into HubSpot.
| | | Direction | Match key | Notes |
|---|---|---|---|---|
| Account | Company | Two way | Company name or domain for the first match, then the paired record ids | Once paired, a renamed account stays matched to its HubSpot company. |
| Contact | Contact | Two way | Email for the first match, then the paired record ids | |
| Lead | Contact | Two way | Email, the same key the contact table uses | A person held as both a lead and a contact competes for one HubSpot record. |
| Opportunity | Deal | Two way | Paired record ids, with pipelines and stages mapped by label | Only opportunities in mapped stages sync at all. |
| Task and appointment | Engagement | Two way | Paired record ids, carried by the associated contact or deal | A task tied to a Dynamics lead moves one way, into HubSpot. |
| Phone call and email | Engagement | Into HubSpot | Paired record ids | |
| Custom table | Custom object | Two way | Paired record ids, after a first match on a field agreed in setup | Needs an Enterprise subscription on the HubSpot side. |
Architecture
With the app there is no runtime to host. When a sync is switched on, HubSpot indexes every record on both sides, pairs what matches, then works incrementally; its documentation says a change syncs within ten minutes once the initial sync is complete. A conflict setting per table names the system whose value wins, and a filter limits which records enter the sync.
Where custom work is needed, it sits beside the app on a watermark. A service registered in Microsoft Entra ID calls the Dataverse Web API as an application user, asks for changes with the odata.track-changes preference, and stores the delta link each response returns as the watermark for that table. Deleted rows arrive in the same response, marked as deleted. Writes into HubSpot are batch upserts keyed on the Dataverse id, followed by a separate association pass. Writes into Dataverse go through an alternate key, so a replayed batch updates the same row instead of creating a second one.
What the API allows
- API style
- REST
- Authentication
- OAuth 2.0
- Webhooks
- Yes
- Changed-since filter
- Yes
- Sandbox
- Yes
- Rate limit
- 6,000 requests per user in a five minute sliding window on each web server, with 20 minutes of combined execution time and 52 concurrent requests
Developer documentation learn.microsoft.com
Three ways to connect
Three facts decide the route for Dynamics. First, where the organization runs: HubSpot’s listing says the app supports only cloud domains on dynamics.com, so an on-premises Customer Engagement server rules it out. Second, whether email, company name and domain are good enough match keys; where HubSpot offers it for a table, the app can match on a text field you choose instead, but only for records not yet paired. Third, the HubSpot tier, since custom field mappings need a paid Data Hub subscription and custom object sync needs Enterprise.
When all three favour the app, configuration beats code. We steer away from a per-task automation platform in the middle: its flows sign in as one Dataverse user, so every call lands on one user’s service protection budget, and it charges per record for work the app already does.
-
Marketplace app
RecommendedHubSpot builds and supports the Dynamics 365 app, which carries the core sales tables and their activities in the direction you set per table, and can raise a Dynamics sales order from a HubSpot deal without code.
-
Custom API integration
PossibleA service over the Dataverse Web API earns its cost for an on-premises Customer Engagement server, which the app cannot reach, and for match keys or filters that email, name and domain cannot express.
-
iPaaS
AvoidEach flow on a per-task platform signs in as one Dataverse user, so its traffic lands on that user's service protection budget, and it bills per record for data the app already moves.
What breaks and how we prevent it
Leads and contacts sharing an address
Dynamics lets the same person sit in the lead table and the contact table, and HubSpot’s app offers both against one HubSpot contact matched on email. Left alone, the two tables compete for a single record. We count the overlap in discovery, then choose which table feeds HubSpot or clean the overlap in Dynamics before the first sync.
Saving a mapping restarts the sync
HubSpot’s documentation says saving the sync restarts the initial sync, which re-indexes every record on both sides. On a large organization that is days of work, with the API calls to match. We settle the field list in a sandbox, then change production mappings in batches, outside business hours.
Owners missing on one side
Data sync matches record owners by email, and HubSpot notes that a record whose owner is a user in only one of the two systems will not sync. We compare the two user lists before cutover and provision the gaps, including sellers who never log in to HubSpot.
Delta links older than seven days
On the custom side, Dataverse keeps change tracking for seven days by default, set by the organization’s ExpireChangeTrackingInDays value, and changes older than that cannot be fetched. A job that stops for a long weekend recovers; one that stops for a fortnight does not. We alert on any table whose delta link has not moved in a day, and rebuild from a full read once the window has passed.
Our approach
- Scope. We confirm the organization is on dynamics.com, list the tables in scope, and count the people held as both leads and contacts.
- Architect. One owner and one direction per table, the conflict winner, the pipeline and stage map, and the match keys, written down before anything is switched on.
- Build. HubSpot’s app is configured first against a Dataverse sandbox environment, which needs a gigabyte of free capacity, or against a filtered subset where none exists.
- Validate. We compare counts per table, spot check paired records, and test the conflict rule by editing one field on each side.
- Operate. We review the failing and excluded records in HubSpot’s sync health view every week, and alert on any custom watermark that stops advancing.
Common questions
Does HubSpot's Microsoft Dynamics 365 app work with an on-premises Dynamics server?
No. HubSpot's own listing for the app says it supports only cloud domains hosted on dynamics.com, and setup asks for your Microsoft Dynamics 365 subdomain. An organization running Dynamics 365 Customer Engagement on its own servers needs a different route, which we scope as a custom API integration once we know the server version and how it is reached from outside the network.
How quickly does a Dynamics 365 change show up in HubSpot?
HubSpot's data sync documentation says records sync within ten minutes of a change once the initial sync is complete, and that HubSpot checks its own side for changes every five minutes. The initial sync is slower: it indexes every record in both systems, and HubSpot warns that a sync over millions of records can take several days. Saving the sync settings starts that initial sync again.
Which Dynamics 365 and HubSpot subscriptions does the HubSpot app need?
HubSpot's listing asks for Dynamics 365 Sales Professional, Sales Enterprise or Sales Premium. On the HubSpot side the app runs on every plan, custom field mappings need a paid Data Hub subscription, custom object sync needs Enterprise, and creating sales orders from a workflow needs Professional or Enterprise. Installing it takes Super Admin or App Marketplace Access in HubSpot, and write permission in Dynamics for any two-way table.
Can a HubSpot deal create a sales order in Dynamics 365?
Yes. HubSpot's app adds a Sales Orders card to the deal record and an action for deal-based workflows, and either one creates the order in Dynamics along with a HubSpot order associated to the deal. Configure the Dynamics sales order to HubSpot order sync first, or no HubSpot order appears. Changing a line item price on the deal afterwards does not update the order in Dynamics.
Can sellers see HubSpot activity without leaving Dynamics 365?
Yes, through HubSpot Embed, which the app adds to a Dynamics form as a web resource. It shows the HubSpot timeline, properties and workflow enrolments for a contact, company or deal, and lets a seller book a meeting or enrol a contact in a sequence. Each seller has to be a user in both systems, logged in to HubSpot with permission to view records.
How does HubSpot decide which Dynamics 365 value wins a conflict?
Each table's sync has a data conflict setting that names a default app, and that app's value overwrites the other when the two disagree. If the default app holds no value for a field, nothing changes on the other side. The setting never overrides the sync direction, so a one-way table still moves one way. We choose the winner table by table in discovery.
Does a custom Dynamics 365 integration count against Microsoft's API limits?
Yes, on two levels. Service protection limits apply per user on each web server: 6,000 requests and 20 minutes of combined execution time in a five minute sliding window, and 52 concurrent requests. Separately, application users draw on a tenant pool of 500,000 requests a day plus 5,000 for each Dynamics 365 Enterprise or Professional user licence. A throttled request returns 429 with a Retry-After header, which our service honours.
What does a Dynamics 365 Sales and HubSpot setup take in hours?
Plan on 4 to 8 hours of discovery and 8 to 24 hours of configuration: the table list, the lead and contact decision, owners provisioned on both sides, pipelines and stages mapped by label, and a filtered first sync checked before the full one. A custom addition for an on-premises server or unusual matching is a separate build, which we scope at 70 to 150 hours.
Also in Sales and marketing platforms
Related reading
Partnerships and accreditations
HubSpot accreditations
Industry specializations
Partnerships
Trust and compliance
We design integrations to support the security and privacy rules your business works under, and we build them on independently audited platforms.
-
SOC 2
We build to support SOC 2 security controls, on platforms that hold SOC 2 reports of their own.
-
ISO/IEC 27001:2022
We build to support your information security program under ISO/IEC 27001:2022.
-
HIPAA
We scope BAA needs in discovery, then design builds around them for covered entities and their business associates.
-
GDPR
We scope data-processing needs in discovery and design builds to support your GDPR duties.
About the GDPR at the European Commission (opens in a new tab)
-
PIPEDA
We design builds to support your accountability for personal information as it moves between systems.
-
CASL
We can build consent capture and sync that support your CASL consent records.
Our builds run on
How we build
- Sandbox first. We build and test in a sandbox before anything reaches production.
- Fail-closed allowlists. An integration runs only against the HubSpot accounts it is approved for.
- Least-privilege access. Each integration gets only the API scopes it needs.
- Secrets in a vault. Keys and tokens live in a secrets vault, never in plain text.
- Sensitive data scoped early. Discovery covers sensitive data, access controls and any BAA or data-processing needs.
- A compliance package for regulated industries: audit logging, field-level encryption and sensitive-data handling.
Scope a Dynamics 365 Sales 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.
Sources
- Connect HubSpot and Microsoft Dynamics 365 knowledge.hubspot.com
- Microsoft Dynamics 365 - CRM App for HubSpot ecosystem.hubspot.com
- Connect and use HubSpot data sync knowledge.hubspot.com
- Match records in data sync knowledge.hubspot.com
- Understand your data sync field mappings knowledge.hubspot.com
- Sync custom objects between HubSpot and data sync apps knowledge.hubspot.com
- Embed HubSpot data into a Microsoft Dynamics 365 app knowledge.hubspot.com
- Use OAuth authentication with Microsoft Dataverse learn.microsoft.com
- Service protection API limits learn.microsoft.com
- Requests limits and allocations learn.microsoft.com
- Use change tracking to synchronize data with external systems learn.microsoft.com
- Use webhooks to create external handlers for server events learn.microsoft.com
- Work with alternate keys learn.microsoft.com
- Create and manage environments in the Power Platform admin center learn.microsoft.com