AI agents for GTM and RevOps · Part 6 of 13

Connecting HubSpot, Clay and your sending tool

What the AI SDR reads and writes in each system, why it reads HubSpot again just before it sends, and how an unsubscribe reaches every tool before the next step goes out.

The short version

Give each system one job: Clay finds and enriches contacts, HubSpot holds the record, and the sending tool sends and hears back. The AI SDR reads HubSpot just before each send, because the record moves after the list is built. Unsubscribes cross both ways before the contact’s next message, and each job gets its own key, with only the scopes it uses. Four steps:

  1. Map what each system reads and writes
  2. Read HubSpot when it sends
  3. Carry unsubscribes both ways
  4. Give each job its own key

Step 1Map what each system reads and writes

Take Example Software, an invented company that sells software to finance teams. It runs on three systems: Clay for finding and enriching contacts, HubSpot as the CRM that knows who unsubscribed, and a sending tool for the email itself. Draw what flows between them, and which system owns each fact.

ClaySending tool HubSpot its HubSpot actionsthe recordsends, then hears Look up objectFind ownerCreate objectUpdate object lifecycle stagecontact owneropen dealsUnsubscribed fromall email repliesunsubscribesand keeps its ownunsubscribe list writesnew contacts,found fields readscontacts,owners writesreplies,unsubscribes readscontacts,unsubscribes THE AI SDR finds and enrichessends through it reads it just before each send

Clay

Finds and enriches. Its HubSpot actions: Look up object, Find owner, Create object, Update object.

Writes to HubSpot
new contacts, found fields
Reads from HubSpot
contacts, owners
↕

HubSpot: the record

Lifecycle stage, contact owner, open deals, Unsubscribed from all email.

The AI SDR reads it just before each send.

↕

Sending tool

Sends, then hears replies and unsubscribes, and keeps its own unsubscribe list.

Writes to HubSpot
replies, unsubscribes
Reads from HubSpot
contacts, unsubscribes
Example Software’s three systems, as an example. Clay and the sending tool write what they learn into HubSpot, and the AI SDR reads it there.

Have Clay look up whether a person is already a contact, and who owns them, before it creates one. Map only the fields Clay found, and leave lifecycle stage, owner and subscription status to HubSpot. Keep Clay’s “Ignore blank values” on, as it is by default, “so blank values coming from Clay are left alone in HubSpot”. Which found fields to trust is part 4.

Step 2Read HubSpot when it sends

A list is a snapshot, and so is a sending tool’s copy of HubSpot: after the list is built, a contact may unsubscribe, a rep may open a deal, the company may sign. So just before each message, the AI SDR reads the four facts from part 4 in HubSpot itself, by the contact’s record ID: lifecycle stage, contact owner, open deals and subscription status.

ONE CONTACT: A FINANCE DIRECTOR AT A 300-PERSON LOGISTICS FIRM Day 1Day 3Day 4, 09:00 Clay builds the list: no owner,no open deal. Step 1 goes out. A rep opens a deal with the firmand becomes the contact’s owner. Step 2 is due. THE LIST, FROM DAY 1THE SENDING TOOL’S COPY HUBSPOT, READ AT THE SEND No owner, no open deal. No deal until its next syncbrings in day 3’s change. An open deal, with the repas the contact’s owner.

One contact: a finance director at a 300-person logistics firm

Day 1

Clay builds the list: no owner, no open deal. Step 1 goes out.

↓

Day 3

A rep opens a deal with the firm and becomes the contact’s owner.

↓

Day 4, 09:00: step 2 is due

The list, from day 1
no owner, no open deal
The sending tool’s copy
no deal until its next sync brings in day 3’s change
HubSpot, read at the send
an open deal, with the rep as the contact’s owner
One contact’s timeline, as an example. On day 4, only HubSpot itself shows the deal the rep opened on day 3.

A copy is only as fresh as its last sync. Apollo’s HubSpot settings page, updated on 15 October 2026: “Apollo automatically checks HubSpot for new or updated contacts and accounts. The interval between checks can vary.” And: “HubSpot owner refreshes are scheduled hourly, but may be deferred.”

Apollo, “Configure HubSpot Sync Settings”

A sending tool that sends follow-ups on its own schedule reads only its copy. So either the AI SDR sends each step itself, after its read, or HubSpot’s changes reach the tool as they happen, as step 3 sets up for unsubscribes. Which facts rule out a message is part 8’s subject.

Step 3Carry unsubscribes both ways

An unsubscribe lands in the tool where the contact clicked. Smartlead marks a lead who clicks its unsubscribe link as unsubscribed across all future campaigns; HubSpot, and the reps’ sequences that read it, hear nothing until something carries it there. An opt-out made in HubSpot misses the sending tool the same way. Carry each across by an event, before the contact’s next message from anyone.

FROM THE SENDING TOOL TO HUBSPOTFROM HUBSPOT TO THE SENDING TOOL16:40: THE UNSUBSCRIBE 08:00 NEXT DAY: NEXT STEP By an eventBy a daily syncBy a HubSpot triggerBy a scheduled check as it happensas it happens, if it fires09:00 next daycan vary

16:40: the contact unsubscribes. 08:00 the next day: the next step goes out.

From the sending tool to HubSpot

By an event
as it happens
By a daily sync
09:00 the next day, after the next step

From HubSpot to the sending tool

By a HubSpot trigger
as it happens, if it fires
By a scheduled check
on an interval that can vary
Two routes each way, as an example. An event arrives as it happens; a schedule, such as a daily sync or Apollo’s checks, can arrive after the next step.

Into HubSpot: its “Unsubscribed from all email” property “is automatically set by HubSpot”, so write an unsubscribe through its subscriptions API, which can “unsubscribe a contact from all email communication”.

In Instantly, build two Automations: the trigger Lead Unsubscribed, then an HTTP Request step that calls that API; and a HubSpot contact trigger, then the action Add blocklist entry. Instantly’s help page doesn’t say whether a subscription change alone fires that trigger, so opt out a test contact in HubSpot and watch the Automation’s Live Feed.

In Smartlead, send the LEAD_UNSUBSCRIBED webhook to the same API call: its ready-made HubSpot templates sync replies, once a day. When you upload a list, leave out previously unsubscribed leads, which it lets you include. Whatever the route, the read at the send catches an opt-out still on its way.

Date what you read about these syncs. In 2025, answers to a HubSpot Community question said Instantly’s native connection only imported leads from HubSpot; its help centre, read on 21 October 2026, lists HubSpot triggers and actions in its Automations.

Step 4Give each job its own key

Each job gets its own key, with only the scopes it uses; support part 6 covers why. In HubSpot, that’s a private app per job, under Development, then Legacy apps: each gets its own access token, and you can “click Delete next to that scope to remove it”.

ClayAI SDR: writesUnsubscribes AI SDR: reads its connectionpart 9’s fieldsinto HubSpot read only HUBSPOT SCOPE crm.objects.contacts.readcrm.objects.contacts.writecrm.objects.deals.readcrm.objects.deals.writecrm.objects.owners.readcommunication_preferences.readcommunication_preferences.write offoff off: Clay requests it by default; switch it off if Clay doesn’t use it.

Clay, its connection

crm.objects.contacts.readcrm.objects.contacts.writecrm.objects.owners.read

Its deal scopes are requested by default: switched off.

AI SDR: reads, before each send

crm.objects.contacts.readcrm.objects.deals.readcrm.objects.owners.readcommunication_preferences.read

Read only.

AI SDR: writes part 9’s fields

crm.objects.contacts.write

The fields it may change are listed in its tool.

Unsubscribes into HubSpot

communication_preferences.write

Its only scope.

Four HubSpot keys for Example Software, as an example, with the contact, deal, owner and subscription scopes each holds. The AI SDR reads with one key and writes with another.

HubSpot’s scope for writing contacts lets a key “create, delete, and make changes to contacts”. So the fields the AI SDR may change (part 9) are listed in its tool, and its writes use a key you can switch off alone. When you connect Clay, its write scopes “are requested by default but can be disabled”: switch off the ones it doesn’t use. The figure uses the subscription scopes’ names in HubSpot’s scope list, communication_preferences.read and .write; its 2026-09 subscriptions API names them subscriptions-status-read and subscriptions-status-write, so use the names your API version asks for.

Next in this series

Part 7: letting the AI SDR send: messages, follow-ups and replies. See all 13 parts.

Sources

  1. Clay Docs, “HubSpot integration”, read on 21 October 2026.
  2. Apollo, “Configure HubSpot Sync Settings”, read on 21 October 2026.
  3. Smartlead, “How Does Unsubscribing Work in Smartlead?”, read on 21 October 2026.
  4. HubSpot, “HubSpot’s default contact properties”, read on 21 October 2026.
  5. HubSpot developer docs, “Communication preferences API guide”, read on 21 October 2026.
  6. Instantly, “HubSpot Integration in Automations”, read on 21 October 2026.
  7. Smartlead API docs, “Webhook Integration Guide”, read on 21 October 2026.
  8. Smartlead, “Smartlead x HubSpot Integration Guide (SmartAgents)”, read on 21 October 2026.
  9. HubSpot Community, “How to sync Instantly.ai activity to HubSpot in real time?”, asked on 19 March 2025, with answers to 6 October 2025, read on 21 October 2026.
  10. HubSpot developer docs, “Legacy private apps”, read on 21 October 2026.
  11. HubSpot developer docs, “Scopes”, read on 21 October 2026.