HubSpot to BigQuery connector that keeps deals and contacts current
The HubSpot to BigQuery integration from Adapters loads contacts, companies, deals, and engagements from the HubSpot CRM API into partitioned BigQuery tables on an incremental schedule, so pipeline, attribution, and funnel models run on a full history instead of a manual export. Field mapping is no-code, so try it against sample records in the live demo.
The live demo needs no card, and Starter is $49 a month.
Field mapping auto-plugged · tap a port to rewire
Plug a source port into
Transform on this cable
JSON in
JSON out
5 sample records ready
What running HubSpot to BigQuery by hand costs you
- The HubSpot API paginates and enforces per-second and daily limits, so backfilling every contact, company, and deal into BigQuery by hand is slow to script and easy to throttle.
- Deals move stages and properties change after creation, so a naive nightly dump into BigQuery misses the edits that funnel and velocity models depend on.
- Blending HubSpot pipeline with product usage and ad spend for real attribution needs a partitioned warehouse table, not a folder of exported reports.
The field mapping, out of the box
All 6 of these HubSpot to BigQuery fields arrive mapped. Rewire any of them, or add your own, in the same visual data mapping tool you use for every adapter.
Input / HUBSPOT
Output / BIGQUERY
Transforms included
Incremental loads use the hs_lastmodifieddate watermark so stage moves and property edits flow through on the next run; HubSpot object ids become stable keys, amount properties cast to BigQuery NUMERIC, epoch-millisecond timestamps become TIMESTAMP in UTC, tables partition by modified date, and writes MERGE on the object id so pipeline and attribution models read one deduplicated history.
HubSpot to BigQuery in depth
The HubSpot side of this pipeline is governed by rate limits and the BigQuery side by load-job quotas. Neither is generous enough to ignore, and both are easy to design around once you know the numbers. Read from HubSpot and Google Cloud documentation on 20 August 2026.
Google's own HubSpot transfer is free in Preview and reloads everything
The BigQuery Data Transfer Service has a HubSpot connector in Preview, and Google does not charge for Preview connectors; billing starts at GA, in slot-hours. Two documented details decide whether it fits. "With every transfer run, the HubSpot connector transfers all available data", so run time and HubSpot API use track portal size rather than change volume. And it authenticates with a private app token, while HubSpot ends legacy private app creation for existing accounts on October 26, 2026. Read from Google and HubSpot documentation on 22 September 2026; both native routes are compared on HubSpot to BigQuery integration tools, and the cost of each on HubSpot to BigQuery connector pricing.
Batch the reads and keep Search out of the loop
HubSpot private apps get 100 requests per 10 seconds on Free and Starter and 190 on Professional and Enterprise, against daily account totals of 250,000, 625,000 and 1,000,000. Batch endpoints move 100 records per call, which is the difference between a backfill that finishes before breakfast and one that does not finish. The CRM Search API is a separate and stricter ceiling at 5 requests per second, capped at 200 records per page and 10,000 results per query, so resolving IDs one record at a time throttles the whole pipeline. Detail in the HubSpot API rate limits guide.
Load jobs are capped per table per day, and it is lower than you think
BigQuery allows 1,500 load jobs per table per day and 100,000 per project per day. A pipeline that writes a load job every minute for a single contacts table exhausts that in just over 24 hours of operation, and the next job fails with a quota error rather than queueing. Micro-batch to something like every 10 or 15 minutes, or use the Storage Write API for genuinely streaming needs. A single load job can carry up to 15 TB and may run for up to 6 hours, so batching larger and less often is almost always the right trade.
Batch loads are free, which changes the cost model
Batch load jobs run on a shared slot pool at no charge, so the cost of this pipeline sits in storage and in the queries your analysts run, not in ingestion. That is worth knowing before anybody proposes streaming inserts for a CRM sync that nobody queries in real time. Streaming is billed, batch loading is not, and HubSpot data almost never justifies the difference.
File and row ceilings that stop a backfill
CSV and newline-delimited JSON have a maximum row size of 100 MB, and a compressed CSV or ndJSON file is capped at 4 GB against 5 TB uncompressed. HubSpot rich text and notes properties can be large, so a single pathological record can fail a load that ran fine for months. Tables are capped at 10,000 columns, which sounds generous until somebody proposes one column per HubSpot property across a portal with heavy customization.
Partition and cluster on the columns your queries actually filter
Partition the deals table by close date or last modified date and cluster by pipeline and stage. Partitioning is what stops every funnel query scanning the full history, and on a CRM table that grows monotonically the saving compounds every month. Getting this wrong is not a correctness bug, it is a bill, and it shows up as a query cost that rises steadily while the data volume looks flat.
HubSpot properties change shape, so decide the schema policy up front
Custom properties get added, renamed and retyped by people who do not know a warehouse is reading them. Two workable answers: a wide typed table you evolve deliberately, or a narrow table with the record ID, the load timestamp and the raw payload in a JSON column that you unnest in a view. The second absorbs schema drift without a failed load, at the cost of query verbosity. The answer that does not work is a wide table nobody owns, which fails on the first renamed property and gets fixed by whoever is on call.
Use MERGE for upserts, and deduplicate on ingestion timestamp
Append-only loading is simpler and gives you an audit trail, but every downstream model then has to pick the latest row per object ID. Either MERGE into a current-state table on the HubSpot object ID, or keep the append log and build a view that takes the row with the greatest ingestion timestamp per ID. Choose one and apply it to every object. Mixing the two across contacts and deals is how two dashboards end up disagreeing about the same pipeline.
Watch the timestamp semantics
HubSpot returns many timestamps as epoch milliseconds in UTC. BigQuery TIMESTAMP is timezone-aware and DATETIME is not, so casting an epoch into DATETIME strips the zone and any later comparison against a TIMESTAMP column is quietly wrong. Standardize on TIMESTAMP for anything ingested, and convert to a local date only in the presentation layer where the business definition of a day is actually decided.
How it goes live
Moving HubSpot data into BigQuery on flat data integration pricing from $49 a month.
STEP 01
Pick the pair
Authorize a read scope on HubSpot and a write scope on BigQuery, nothing wider.
STEP 02
Confirm the mapping
Check that contact.vid lands in dim_contact.contact_id and deal.properties.hs_lastmodifieddate in fct_deal.loaded_at on a sample record.
STEP 03
Schedule the sync
Turn on the HUBSPOT → BIGQUERY schedule; failed records retry and every run is logged.
Still choosing how to run this route? Every option, from the vendors' own native paths to managed pipelines, is compared with its billing model and trade-offs on HubSpot to BigQuery integration tools.
HubSpot to BigQuery sync common questions
How do I connect HubSpot to BigQuery?
Authorize HubSpot once, select the objects you need (contacts, companies, deals, engagements), map the properties onto BigQuery columns, and pick a sync interval. Adapters paginates the CRM API within its rate limits, writes into date-partitioned tables and merges on the HubSpot object id, so re-running a load does not duplicate deals.
Is there a HubSpot BigQuery connector?
HubSpot does not ship a native BigQuery connector, so this runs through a third-party tool or your own job against the CRM API. The practical difference between options is custom property support: HubSpot portals accumulate hundreds of custom properties, and a connector that only carries the standard set leaves the interesting columns behind.
How should HubSpot data be partitioned in BigQuery?
Partition on the record modified date and cluster on the object id or pipeline. HubSpot tables are read most often as time slices (deals created this quarter, engagements last month), so a date partition cuts the bytes scanned on almost every query. Without partitioning, a wide contacts table scans in full every time a dashboard refreshes.
Why do HubSpot deal counts differ between BigQuery and the CRM?
Usually deletion and stage movement. HubSpot deals get deleted or merged, and an append-only pipeline keeps the old row forever. Deals also move stages, so a snapshot taken nightly misses intra-day transitions. Merge on the object id, carry the archived flag through, and count from the current state rather than from every row ever loaded.
How does the HubSpot to BigQuery sync work?
The HubSpot to BigQuery integration from Adapters loads contacts, companies, deals, and engagements from the HubSpot CRM API into partitioned BigQuery tables on an incremental schedule, so pipeline, attribution, and funnel models run on a full history instead of a manual export. Field mapping is no-code, so try it against sample records in the live demo.
How much does the HubSpot BigQuery integration cost?
The HubSpot to BigQuery pair is included on every plan: Starter $49, Growth $149, Scale $399 a month. You pay per plan, not per row or task, so a busier month costs the same.
Do I need to write code to connect HubSpot and BigQuery?
No. Fields are auto-mapped the moment you pick the pair, and you can rewire any mapping visually before the first sync. Incremental loads use the hs_lastmodifieddate watermark so stage moves and property edits flow through on the next run; HubSpot object ids become stable keys, amount properties cast to BigQuery NUMERIC, epoch-millisecond timestamps become TIMESTAMP in UTC, tables partition by modified date, and writes MERGE on the object id so pipeline and attribution models read one deduplicated history.
Related HubSpot and BigQuery connectors
Browse the full api connector library, or request a pair you do not see.
HubSpot and BigQuery, finally in agreement
Map the pair once and let it sync on schedule. Flat price from $49 a month, no per-task fees.
The live demo needs no card, and Starter is $49 a month.