HubSpot + Microsoft Fabric integration

A Fabric lakehouse already holds the operational tables, so notebooks can carry them into HubSpot and take a form submission back the other way.

Built by us

Scope this integration Book a scoping call

Is there a native Microsoft Fabric + HubSpot integration?

Yes, but not from HubSpot or Microsoft. The only Fabric app in the HubSpot App Marketplace as of September 2026 is Microsoft Fabric Integration from Datawarehouse.io, a third party, and it suits reporting loads rather than a two-way sync. Where a lakehouse already holds the data, we build notebooks that read it and call HubSpot directly, a 300 to 450 hour build.

Recommended route
Custom middleware
Build effort
300 to 450 hours
In the HubSpot App Marketplace?
Yes, Microsoft Fabric Integration by Datawarehouse.io
Typical elapsed time
8 to 14 weeks

Marketplace checked September 2026.

Why teams connect Microsoft Fabric to HubSpot

The request usually starts with a data team that already runs a Fabric workspace, a lakehouse full of operational tables, and a marketing team that cannot see any of it in the CRM. Somebody asks why a prospect takes a week to reach a campaign, and the honest answer is that nothing carries it.

Fabric earns the middle position when the operational system is hard to reach. We built this pattern for a senior living operator whose property management system speaks SOAP, returns XML and has no concept of a webhook. Pointing a packaged connector at that interface was never an option, and neither was a second runtime nobody would own a year later. The lakehouse was already there, already governed, already on the tenant’s identity and its own key vault.

So Fabric becomes the integration hub rather than the reporting destination. Notebooks pull the operational system into raw tables, clean them, and push contacts, deals and timeline events into HubSpot. The same workspace carries the other direction: a website form in HubSpot becomes a record in the operational system within the hour, with the marketing email that follows recorded back on the source record. The data team keeps one platform, one place for credentials and one set of logs.

The cost of that choice is worth saying out loud. Fabric is a capacity you pay for, notebooks are code somebody maintains, and a lakehouse in the middle adds a hop that a plain REST source would never need.

What syncs

Five streams carry most of the value, and every one of them keys on an identifier the source system already owns, held in a custom HubSpot property. Contacts upsert on the source contact identifier rather than on email, because households share an address and a returning person often arrives with a second record. Deals upsert on the prospect identifier, one deal per prospect, and the stage is set on creation only, so a salesperson who moves a deal keeps that move.

Activity history is the stream that surprises people. Three years of calls, tours and emails is hundreds of thousands of rows, and it belongs on the timeline rather than in properties, so it lands as custom behavioural events with an append-only ledger recording every event ever sent. The ledger, not the source, is what makes a replay safe.

A reference table decides scope. One row per site or property, carrying a flag that says whether that site syncs at all, keeps a business decision in a table the client can read instead of buried in code.

Objects that sync between Microsoft Fabric and HubSpot
Source object HubSpot object Direction Match key Notes
Prospect table Contact Into HubSpot Source prospect identifier in a custom HubSpot property Email is not an identity here, since households share one address.
Contact table Contact Into HubSpot Source contact identifier, never the email address
Opportunity table Deal Into HubSpot Source prospect identifier, one deal per prospect The stage is set on creation only, so a salesperson's move survives.
Activity history table Engagement Into HubSpot Activity identifier, recorded in an append-only sent ledger Custom behavioural events, because history belongs on a timeline.
Site reference table Company Into HubSpot Site or property code A flag on each row decides whether that site syncs at all.
Outbound queue table Contact Out of HubSpot Our own reference, stamped on every record we create

Architecture

The shape is polling on a watermark, with the lakehouse holding the state. A pipeline runs the inbound notebooks in order, each one gated on the previous one succeeding: reference data first, then prospects, then residents or accounts, then events. Each stream stores where it read up to, so a failed run costs one interval rather than a full reload.

Outbound is a staged queue. Changes are collected, written to a queue table with their payload, transformed into whatever the source accepts, checked against the safety gates, sent, then verified by reading the record back. Every attempt lands in a ledger with its result, and anything that fails a contract check goes to a dead letter table with the reason rather than vanishing into a log file.

Replay is the test of all of it. Re-running a notebook inside a blackout window does nothing at all, and re-running it outside one sends only what the ledger has not already sent.

  1. Sources

    • Operational system Pulled into raw tables
    • HubSpot Website forms for the write-back
  2. Lakehouse

    • Microsoft Fabric A watermark for every stream
    • Inbound notebooks Run in order, each gated on the last
    • Outbound queue Transformed, gated, sent, read back
    • Ledger and dead letters Every attempt, with its result
  3. Destinations

    • HubSpot Contacts, deals, timeline events
    • Operational system Each write confirmed by a read back
Notebooks in a Microsoft Fabric lakehouse pull the operational system into raw tables and push contacts, deals and timeline events into HubSpot. The other way, website forms wait in a queue table, pass the safety gates, and each write is confirmed by reading the record back.
The service reads the source on a schedule using a changed-since watermark, upserts each record keyed on its source identifier, then runs a separate associations pass.

What the API allows

API style
REST
Authentication
OAuth 2.0
Webhooks
Partial
Changed-since filter
Yes
Sandbox
On paid plans
Rate limit
200 calls per minute per identity for each unified quota group, in a fixed 60 second window

Developer documentation learn.microsoft.com

Three ways to connect

The route turns on three things. A lakehouse that already exists changes the arithmetic, because standing up a Fabric capacity to move four objects is a poor trade and a managed sync is cheaper in every dimension. The source protocol matters as much: a SOAP interface with per-site scoping and vendor rules about what may be written needs somewhere to put that logic, and a notebook is somewhere. Direction decides the rest. Reporting loads run happily on a listed connector, and a two-way sync that creates records in the operational system and writes activities back to them does not.

Where all three point at Fabric, the build is large and the running cost is a capacity the business is already paying for. Where they do not, the Skyvia page is the cheaper conversation.

  • Automation platform

    Possible

    The listed third-party Fabric connector moves lakehouse tables into HubSpot on a schedule, which is enough for a reporting-shaped load with no write-back and no associations logic.

  • HubSpot Data Sync

    Avoid

    HubSpot Data Sync has no lakehouse source, so it cannot see a Fabric table at all. It is the right tool for the SaaS products it lists, and the wrong one here.

What breaks and how we prevent it

Fabric’s fixed 60 second window

Throttling arrives from both ends. Fabric allows 200 calls a minute per identity for each quota group, in a fixed 60 second window that refills all at once, so a burst at the start of a window can leave the rest of it blocked. HubSpot counts separately, per app. We batch, spread requests across the window and honour the Retry-After header instead of retrying blind.

A 429 with two meanings

A 429 from Fabric carries two different meanings. RequestBlocked is a rate limit and clears after a wait. CapacityLimitExceeded means the capacity itself is overloaded, and retrying immediately makes the problem worse, so the two get different handling.

A three hour history pull

Long runs overlap. A full activity history pull can take around three hours, which is longer than the interval anyone wanted, so the history stream runs on its own schedule and the short streams chain inside one pipeline.

Tables invisible to the SQL endpoint

Tables go missing from the SQL surface. Delta tables created outside the tables folder are invisible to the lakehouse SQL analytics endpoint, which turns a reporting query into a silent zero rather than an error. We keep everything the endpoint must see in that folder and count rows on both sides.

Identical test and live identifiers

The last one is environment. Record identifiers in a vendor’s test and live systems look identical, so every write is gated on the connected portal and on the endpoint matching the live secret. Both gates fail closed.

Our approach

  1. Scope. We read the source interface documentation, then prove what it actually accepts, because a vendor interface often takes a field and silently drops it.
  2. Architect. We agree the identity keys, the layer boundaries and the scope table before a notebook is written.
  3. Build. Notebooks over a shared utilities module, with credentials fetched from the key vault at run time and the portal gate in that shared code rather than in each job.
  4. Validate. A dry run mode that computes and ledgers everything without writing anything, run against a sandbox portal and the vendor’s test environment.
  5. Operate. Watermarks, ledgers and a reconciliation count, with every notebook exported to a repository so the deployed code and the repository agree.

Common questions

Is there a HubSpot app for Microsoft Fabric?

Not from HubSpot or Microsoft. Two third-party listings sit in the HubSpot App Marketplace, Microsoft Fabric Integration and Power BI Integration, both published by Datawarehouse.io. A scheduled table load is what they are for. Anything involving write-back, associations or per-record rules is a build rather than an install.

How fresh is HubSpot data when Fabric sits in the middle?

As fresh as the schedule, and the schedule is a choice. Inbound streams usually run every few hours because the source pull is the slow part. Outbound, where a form submission has to become a record in the operational system, runs hourly or faster. Nothing here is instant, and a lakehouse in the middle is the reason.

Can Fabric notebooks write back to the operational system as well as to HubSpot?

Yes, and that is usually the harder half. The notebook stages each change in a queue table, transforms it to whatever the source accepts, checks it against the safety gates, sends it, then reads the record back to confirm the write landed. Every attempt is recorded with its result, so nothing is sent twice.

What stops a Fabric notebook from writing to the wrong HubSpot portal?

A portal gate in the shared code. Before any write, the job asks HubSpot which portal the token belongs to and refuses unless it matches the allowed identifier. The same check runs against the source system endpoint. Both fail closed, so a mistaken credential stops the run rather than quietly filling production with test data.

Does the lakehouse have to hold a copy of HubSpot data?

It holds what the sync needs to be safe: a watermark per stream, a ledger of everything sent, a queue of pending writes and a dead letter table. It does not need a full mirror of the CRM. Keeping that state in the lakehouse is what makes a replay cheap instead of frightening.

How does a Fabric sync avoid creating duplicate HubSpot contacts?

Every object upserts on the identifier the source system already owns, held in a custom HubSpot property, and the associations run as a separate pass afterwards. Matching on email creates duplicates the first time two people share an address, and merges two real people the first time a shared mailbox appears.

Do we need a paid Fabric capacity to run a HubSpot integration?

For anything ongoing, yes. Microsoft offers a 60 day trial capacity, and its own documentation says the trial is for evaluation and testing rather than production. A trial is a fine place to prove the shape of the pipeline. The live integration needs a capacity the business is paying for anyway.

What does a Microsoft Fabric to HubSpot integration take to build?

A two-way sync across five or more streams runs 20 to 40 hours of discovery and 300 to 450 hours of build. Most of that is not HubSpot. It goes on proving what the operational interface really accepts, modelling identity, and building the replay and reconciliation machinery that makes the thing operable.

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

  • Google Partner
  • Anthropic Solutions Partner

Scope a Microsoft Fabric integration

Send the systems, the direction and the record volume. We reply with a scope and an effort band within one business day.

  • Microsoft Fabric

Press Enter or comma to add another system.

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