Salesforce to BigQuery
Sync Salesforce opportunities, accounts, contacts, leads and the rest of your org's objects into BigQuery, and keep them current with incremental syncs. Weld authorises with OAuth, lands each object as its own table, and slows down before your org's API limit is reached.
Checked against Weld and vendor docs on
- opportunity7 cols
- account7 cols
- lead7 cols
- contact7 cols
- opportunity_line_item7 cols
- opportunity_contact_role7 cols
- Extract
- Load
- Keep in sync
- salesforce.opportunitySynced
- salesforce.accountSyncing
- salesforce.leadSynced
- salesforce.contactSynced
- salesforce.opportunity_line_itemSynced
- salesforce.opportunity_contact_roleSynced
- Salesforce tables
- 16
- fields, typed
- 112
- agent context included
- MCP
Trusted by data and AI teams
Three ways to get Salesforce data into BigQuery
Google has a generally available Salesforce connector in BigQuery Data Transfer Service, billed on the compute it uses. It fits teams that live in Google Cloud and only need Sales Cloud objects. The differences show up in setup, deleted records and how the transfer handles schema changes.
BigQuery Data Transfer Service
- Best for
- Google Cloud teams that want a Google managed transfer
- Effort
- Medium: create a Salesforce Connected App, then a transfer per set of objects
- Freshness
- Scheduled, at least 15 minutes apart; default every 24 hours
- Good to know
- Sales Cloud only, through Bulk API V1. Google recommends at most 10 objects per transfer configuration, and incremental transfers cannot sync deletes. Charged in slot-hours.
Custom script on the Salesforce APIs
- Best for
- Teams with engineers to own a pipeline
- Effort
- High: OAuth, pagination, API limits, schema changes
- Freshness
- Whatever you schedule
- Good to know
- Every request counts against the same org wide API limits your other Salesforce integrations use, so the script has to throttle itself.
Weld
- Best for
- Reporting and agents on Salesforce data next to your other sources
- Effort
- Low: authorise, pick objects, choose a schedule
- Freshness
- Incremental syncs on your schedule
- Good to know
- OAuth setup with no Connected App to create, deleted records kept and flagged, and syncs that slow down at 80% of your API limit.
How to sync Salesforce to Google BigQuery with Weld.
In the app, with the API or an agent.
What lands in Google BigQuery
Every Salesforce table, keys intact.
Salesforce has no fixed table list: Weld offers the objects your Salesforce user can query, standard and custom, and lands each one as a table named after the object in snake_case, with fields in snake_case too. Most sales reporting starts from these.
- opportunity7 columns
- idPKstring
- created_datedate
- created_by_idstring
- last_modified_datedate
- last_modified_by_idstring
One row per deal with stage_name, amount, close_date, is_won and is_closed. The base for pipeline, win rate and bookings.
- account7 columns
- idPKstring
- created_datedate
- created_by_idstring
- last_modified_datedate
- last_modified_by_idstring
The companies you sell to. Opportunities and contacts link to it through account_id.
- lead7 columns
- idPKstring
- created_datedate
- created_by_idstring
- last_modified_datedate
- last_modified_by_idstring
Prospects with their status and created_date, and an is_converted flag once they become contacts and opportunities. The base for lead volume and conversion.
- task and event
Calls, emails and meetings logged against records, with activity_date. Useful for activity reporting per rep.
- account
- contact
- lead
- opportunity
- opportunity_line_item
- opportunity_contact_role
- case
- campaign
- campaign_member
- task
- event
- user
- product_2
- pricebook_2
- pricebook_entry
- contract
Quarterly win rate and won amount.
In Google BigQuery SQL.
Runs in BigQuery against the opportunity table Weld lands, here in a dataset named salesforce. Deleted opportunities stay in the table with is_deleted set, so they are filtered out.
1select2 date_trunc(close_date, quarter) as quarter,3 count(*) as closed_opportunities,4 countif(is_won) as won,5 round(safe_divide(countif(is_won), count(*)), 3) as win_rate,6 sum(if(is_won, amount, 0)) as won_amount7from salesforce.opportunity8where is_closed9 and not is_deleted10group by quarter11order by quarter descAsk your agent.
It queries Google BigQuery for you.
Connect Claude, Cursor, ChatGPT or your own agent to Weld over MCP. It reads the Salesforce context, finds the tables it needs and runs the query in Google BigQuery.
How many account rows do we have in Google BigQuery?
Reading the Salesforce context first, so the query uses the right tables and keys.
Things to know.
Before you sync Salesforce.
ELT vs. reverse ETL: Salesforce and Google BigQuery
ELT (Extract, Load, Transform) moves data from Salesforce into Google BigQuery for analysis. This is the approach shown on this page, and the one to use for dashboards, reports, and data models.
Reverse ETL works the other direction: it pushes enriched data from Google BigQuery back into Salesforce. For example, you could sync computed lead scores or customer segments from your warehouse into Salesforce to personalize outreach.
Weld supports both directions, so you can build a complete data loop between Salesforce and Google BigQuery.
Google BigQuery to Salesforce- API limits are shared across your org
- Salesforce applies its rate limits to the whole account, so Weld competes with every other integration that calls the API. When usage reaches 80% of the limit, Weld slows its Salesforce syncs down so the others keep working.
- Deleted records stay, flagged
- Weld reads deleted and archived records as well, so a record removed in Salesforce keeps its row with is_deleted set to true. Filter on it in reports. Google's transfer, by contrast, cannot sync deletes in incremental mode.
- Not every object is incremental
- Objects with a last modified or created date sync incrementally on those timestamps. Objects without one are reloaded in full each run, which matters for very large reference objects.
- Field names change shape
- Salesforce API names become snake_case columns, so StageName lands as stage_name. Compound address and geolocation fields are skipped; use their component fields, such as billing_city.
- No history tables
- Weld keeps the current version of each Salesforce record, not snapshots. If you need to report what a pipeline looked like on a past date, snapshot the tables you need in BigQuery on a schedule.
Keep reading.
Guides, docs and schema.
Common questions.
About Salesforce to Google BigQuery.
Start syncing Salesforce to Google BigQuery.
Set up your Salesforce data pipeline in minutes. No credit card required. Free for 14 days.