Mirror new HubSpot contacts into Google Contacts

The moment a contact is created in HubSpot, they land in your Google Contacts so your phone shows their name the next time they call or text.

Deterministic Code
HubSpotGoogle ContactsSalesOperationsData SyncLead Enrichment

Build a code workflow that mirrors every new HubSpot contact into my Google Contacts so my phone shows their name the next time they call or text.

Trigger: a HubSpot webhook on the contact.creation event. HubSpot posts the new contact's vid and properties to the workflow; respond with a 2xx immediately so HubSpot does not retry.

From the HubSpot payload, pull these contact properties: firstname, lastname, email, phone, mobilephone, company, jobtitle, lifecyclestage. If any are missing on the webhook payload, fetch the contact from HubSpot by id to fill them in.

Step 1 (dedupe): call Google Contacts Search Contacts with the contact's email as the query. If there is a hit on the same email, stop and log skipped-duplicate. Per Google's docs, send a warmup Search Contacts call with an empty query once at the start of the workflow before the real search.

Step 2 (ensure the HubSpot group exists): call Google Contacts List Contact Groups and look for a group named "HubSpot". If it does not exist, call Create Contact Group with name "HubSpot". Cache the resourceName for use in step 4.

Step 3 (create the contact): call Google Contacts Create Contact with these mapped fields:

  • names: a single entry with givenName = firstname and familyName = lastname (names is a singleton field, only one entry allowed)

  • emailAddresses: one entry with value = email and type = "work"

  • phoneNumbers: one entry per non-empty phone, with phone tagged type "work" and mobilephone tagged type "mobile"

  • organizations: one entry with name = company and title = jobtitle

  • userDefined: two entries, { key: "source", value: "HubSpot" } and { key: "lifecycleStage", value: lifecyclestage }

Capture the resourceName returned by Create Contact.

Step 4 (add to the group): call Google Contacts Modify Contact Group Members with the HubSpot group resourceName and resourceNamesToAdd = [new contact's resourceName].

Important Google People API constraints to respect in the code: singleton fields (names, biographies, birthdays, genders) must have at most one entry; mutations for the same user must be sent sequentially (steps 2 -> 3 -> 4 in order, no parallel calls); writes may take a few minutes to propagate, so do not read back the created contact and assert on it.

Error behavior: on any non-2xx from Google, log the HubSpot vid and the error and stop. Do not retry blindly on 409 conflicts because that usually means the contact group name collided or the contact already exists.

This is a deterministic CRM-to-address-book mirror. No AI drafting, no enrichment, no email or Slack notifications. Just the webhook in, the four ordered Google Contacts calls, and a 2xx back to HubSpot.

Additional information

What does this prompt do?
  • Listens for new contacts created in HubSpot and copies them straight into your Google Contacts.
  • Maps name, email, phone, mobile, company, and job title so the entry looks complete on your phone.
  • Skips duplicates by checking Google Contacts for the same email before creating anything new.
  • Files every mirrored person under a Google Contacts group called HubSpot so they are easy to find later.
What do I need to use this?
  • A HubSpot account where you can turn on outbound webhooks for the contact creation event.
  • A Google account connected to General Input with permission to read and write your Google Contacts.
  • About five minutes to confirm the field mapping and pick the contact group name you want to use.
How can I customize it?
  • Change the Google Contacts group name from HubSpot to anything you prefer, like Sales Leads or 2026 Inbound.
  • Only mirror contacts whose lifecycle stage is Lead or Customer, so you do not flood your phone with low-quality records.
  • Add or drop fields in the mapping, for example skip job title or include the lifecycle stage as a note.

Frequently asked questions

Will my phone really show the contact name when they call?
Yes. Once a person is in your Google Contacts and your phone is signed into the same Google account with contact sync turned on, incoming calls and texts show the saved name instead of an unknown number.
What happens if the same person already exists in my Google Contacts?
Before creating anything, the workflow searches your Google Contacts by email. If a match is found, it skips that record so you do not get duplicate entries cluttering your address book.
Does this work for contacts that were already in HubSpot before I turned the workflow on?
No. This one only fires on brand new contacts going forward. If you want to backfill existing HubSpot contacts in one pass, ask Geni for a separate backfill workflow that reads your contact list and creates the missing ones in Google Contacts.
Can I use this on HubSpot Free?
Yes. HubSpot Free supports outbound contact creation webhooks, which is all this workflow needs on the HubSpot side.
What if a contact has no phone number in HubSpot?
They still get added to Google Contacts using whatever fields are present, usually name, email, and company. You can edit the workflow to skip contacts with no phone if you only care about the caller ID use case.

Stop saving leads as contacts by hand.

Connect HubSpot and Google Contacts once, and every new lead lands on your phone before they call you back.