Realtime sync between Sheet ↔ HubSpot (missing Record IDs + auto-create companies)

We have an ICP company list in a Google Sheet that we want to keep in real-time sync with HubSpot, both ways.

Current setup / what works

  • We use Coefficient to sync.

  • For companies that are already marked as ICP in HubSpot, it works well:

    • We did a one-time export from HubSpot → Sheet to get the HubSpot Company Record ID into the sheet.
    • With that Record ID present, we can continuously update fields from Sheet → HubSpot.
    • Updates from Hubspot → Sheets are done with the native Sheets integration via workflows.

The problem

In the sheet, an automation can change a company’s status so that it becomes an ICP based on certain conditions. These “new ICPs” create two issues, because the sheet does not have the HubSpot Record ID yet (that is needed to sync).

Questions

  1. Company exists in HubSpot, but the sheet doesn’t have its Record ID yet

How should we (automatically) update this company from Sheet → HubSpot if we only have the domain name but not the Record ID?

  1. Company does not exist in HubSpot, but does exist in the sheet

How can we ensure that if a company is not found in HubSpot (based on domain), it is automatically created as a new company record in HubSpot?

Does anyone have experience with this setup, or recommendations for tools, workflows, or best practices to solve this?

Thanks in advance!

Hello @EvieSchellens !

This is a very common scenario when Google Sheets becomes a decision layer (ICP logic) while HubSpot remains the system of record. The key point here is: without the Company Record ID, there is no reliable bidirectional sync in HubSpot.

Therefore, the architecture must guarantee matching, enrichment, and automatic ID creation.

The Recommended approach: Domain-based upsert (match + enrich)

In HubSpot, the domain is the best natural identifier for a Company (not perfect, but it is the market standard).

I recommend you use API:

Use the Search Companies endpoint:

The Sheet automation sends:

  • domain

The HubSpot API:

  • searches for the company by domain

  • if found:

    • returns the companyId
    • writes that ID back to the Sheet
    • from that point on, the sync becomes ID-based

Important to know:

  • Never update a Company without an ID after the first successful match
  • Normalize the domain in the Sheet (lowercase, no http/https/www)
  • Do not rely only on the company name
  • Do not create companies without searching first
  • In Brazil, for example, each company has a unique identifier called CNPJ (Cadastro Nacional de Pessoa Jurídica). If your country has a similar unique business identifier, you can use it as a safe matching key between HubSpot and Google Sheets.

Hope It’s helps!

Hi Brenner,
Thank you very much for your detailed explanation. So if I understand correctly, this can’t be done with the native Coefficient → HubSpot integration, and you need to use the API for this.
Can this be handled entirely within HubSpot, or would you need to use tooling like Zapier, for example?

Hello @EvieSchellens

I’m not entirely familiar with Coefficient, but you can try to match the records using a domain or a unique ID.

If you can’t do this using Coefficient, you can use n8n, Zapier, Make, or create a private app to sync data via the API. Then, you can easily control which information is synced between HubSpot and Sheets.

Hey @EvieSchellens

This is a super common challenge and Brenner is right that the Record ID is the critical piece. Without it, you’re stuck building custom matching logic.

To answer your specific questions:

Company exists in HubSpot but Sheet doesnt have the ID:
You need to do a lookup by domain before updating. The HubSpot Search API (POST /crm/v3/objects/companies/search) lets you filter by domain property. Your flow would be: Sheet triggers update → search HubSpot by domain → if found, grab the ID and write it back to the Sheet → then push updates using that ID going forward. Coefficient cant do this natively, you’d need Zapier/Make/n8n or a custom script to handle the search step.

Company doesnt exist in HubSpot:
Same search first approach, but if the search returns nothing, you create the company via API (POST /crm/v3/objects/companies) and then write the new ID back to your Sheet.

The tricky part is doing this reliably at scale. You need to handle:

  • Domain normalization (strip www, http, trailing slashes)
  • Rate limits on the search API
  • Race conditions if multiple rows update simultaneously
  • Error handling when creates fail

This is exactly the kind of integration plumbing that eats up engineering time. At Stacksync we handle this pattern constantly, bidirectional sync between databases (or sheets via connected DB) and HubSpot with automatic record matching and creation. The domain based upsert logic, ID mapping, and conflict resolution all happen automatically without building custom Zapier flows or scripts.

If you want to stick with the current approach, Make.com probably gives you the most flexibility for the search > match > create/update flow. But if you’re finding the maintenance overhead is growing, might be worth looking at a dedicated sync layer. Transparency note: This response is grounded in my own experience and was lightly polished using AI.

Good luck!

Hi @EvieSchellensIt’s awesome to hear you’re already using Coefficient to power your ICP list. I’m a Solution Engineer here, and you’ve actually hit on one of the most powerful workflows we support.

The “Missing Record ID” is a common hurdle, but you can bypass it entirely by using Domain-based matching. Here is the most efficient way to solve your two scenarios:

  1. Update existing companies
    You should set up a separate Coefficient import from HubSpot that includes only two columns: Company Domain Name and Record ID. Once that data is in your sheet, you can use an XLOOKUP or VLOOKUP formula in your main ICP list to find the matching Record ID based on the domain. This can be automatically done after the initial one-time setup since the formulas will update with the scheduled refreshes. If you are not comfortable writing formulas, you can use our AI Sheets Assistant to build this for you by simply describing what you need to match.
  2. Create new records
    You can set up a export to create new records in HubSpot directly on your spreadsheet. Here is a help center guide on how to set it up. This will automatically assign a HubSpot Record ID in the sheet that you can refer back to in HubSpot.

I hope this is helpful! Please feel free to let me know if you have more questions.