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 API

Scope this integration Book a scoping call Estimate the cost

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.

Objects that sync between Dynamics 365 Sales and HubSpot
Source object HubSpot object 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.

HubSpot's app pairs Dynamics 365 and HubSpot records and syncs each change within about ten minutes, in the direction set per table. Where the app falls short, a custom service reads Dataverse change tracking from a stored delta link and upserts on the Dataverse id.

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.

  • Custom API integration

    Possible

    A 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

    Avoid

    Each 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.

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

  1. Scope. We confirm the organization is on dynamics.com, list the tables in scope, and count the people held as both leads and contacts.
  2. 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.
  3. 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.
  4. Validate. We compare counts per table, spot check paired records, and test the conflict rule by editing one field on each side.
  5. 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.

Partnerships and accreditations

  • HubSpot Elite Solutions Partner
  • HubSpot Custom Integration Accreditation
  • HubSpot CRM Data Migration Accreditation
  • HubSpot Solutions Architecture Design Accreditation

HubSpot accreditations

  • HubSpot Onboarding Accreditation
  • HubSpot Academy Accreditations

Industry specializations

  • HubSpot Healthcare Industry Specialist
  • HubSpot Financial Services Industry Specialist
  • HubSpot Manufacturing Industry Specialist
  • HubSpot Quote to Cash Capability

Partnerships

  • Anthropic Solutions Partner

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.

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.

  • Dynamics 365 Sales

Type any system and its version, such as Sage 300 or Sage 50. Press Enter or a comma after each one.

Add more detail (optional)

Optional. A sentence or two about the workflow is enough.

We use these answers to scope the work and for nothing else. Privacy policy.

Prefer to talk it through first? Book a technical scoping call

Talk to the people who build these

  • Nijat
  • Sean
  • Prash

Book a scoping call