Clean up HubSpot contacts from your Amazon SES suppression list

Every morning, find the addresses that hard bounced or filed a spam complaint, update the matching HubSpot contacts, and post a short Slack recap.

Agentic Task
Amazon SESHubSpotSlack BotSalesMarketingData SyncNotifications & Alerts
PromptCreate

Every morning at 8am, pull the email addresses Amazon SES added to my account suppression list in the last 24 hours and clean up the matching records in HubSpot, so my team stops emailing people who already hard bounced or filed a spam complaint.

Start with the Amazon SES List Suppressed Destinations operation, scoped to the last 24 hours using its start and end date filters. Page through the results so nothing is missed on a heavy day. For each entry, capture the email address, the reason SES recorded (BOUNCE or COMPLAINT), and the time it was added.

For each suppressed address, locate the person in HubSpot using Search Contacts, matching on the email property. Then apply the treatment that fits the reason using Update Contact.

A COMPLAINT reason means the recipient explicitly reported the mail as spam. Mark that contact as opted out of marketing email so no further campaigns go to them.

A BOUNCE reason means the address is undeliverable rather than unwanted. Flag the email address as invalid on the contact record, using the dedicated contact property set aside for that, and leave subscription and opt out status alone. Do not opt a bounced contact out of marketing email. If no suitable property exists to hold the flag, say so in the Slack summary instead of writing the flag somewhere it does not belong.

Two hard rules. Never delete, merge, or archive a contact. Write changes to contact properties only, so the record and its history, notes, and deal associations stay intact. If a contact already carries the correct flag from an earlier run, leave it alone and do not count it as a new update.

If a suppressed address has no matching HubSpot contact, do not create one. Collect those addresses separately for the summary.

Finish by posting one summary to Slack with Send a Message. Keep it short. This is a receipt of what changed, not a deliverability report. Cover how many addresses were suppressed in the window, which contacts were updated and under which reason, and every suppressed address that had no matching HubSpot contact, so I can trace which imported list it came from. If nothing was suppressed in the last 24 hours, post a single line saying so rather than an empty report.

What does this prompt do?

  • Each morning, gathers every email address Amazon SES suppressed in the last 24 hours, along with the reason it was suppressed.
  • Finds the matching person in HubSpot and applies the right treatment: a spam complaint marks the contact as opted out of marketing email, while a hard bounce flags the address itself as unusable and leaves subscription status untouched.
  • Never deletes a contact. Every change is written to the contact record, so history, notes, and deal associations stay intact.
  • Posts one short Slack recap covering how many addresses were suppressed, which contacts were updated under which reason, and any suppressed addresses with no matching contact.

What do I need to use this?

  • An Amazon SES account with sending set up. The account suppression list is on by default and fills itself in whenever a message hard bounces or someone reports it as spam.
  • A HubSpot login with permission to view and edit contacts.
  • A Slack workspace and a channel where the daily recap should land.
  • A HubSpot contact property to hold the bad address flag, so bounced contacts can be marked without changing anything else on the record.

How can I customize it?

  • Change the timing. Run it later in the morning, or more than once a day if you send at high volume.
  • Pick where the recap goes: a shared channel for the whole team, or a direct message to just you.
  • Decide how bounces are handled. Flag the address on the contact, add the contact to a cleanup list for review, or do both.

FAQs

Will this delete any of my HubSpot contacts?
No. Contacts are never deleted, merged, or archived. The agent only updates fields on the contact record, so the person, their history, notes, and any linked deals all stay exactly where they are. If you later confirm an address was suppressed by mistake, nothing has been lost.
Why treat a bounce differently from a spam complaint?
They are different problems. A complaint is someone explicitly saying stop emailing me, so the right response is to opt them out of marketing email. A hard bounce means the address does not exist or cannot receive mail, which is an address problem rather than a preference. That gets flagged on the email field, and the person's subscription settings are left alone.
Will this work on HubSpot Free?
The core cleanup does. Free accounts can store and edit contact properties, which is where the bounced address flag goes. The marketing opt out treatment depends on HubSpot's marketing email settings, so if you do not use HubSpot to send marketing email, the agent can record the complaint on a contact property instead.
What happens to a suppressed address that is not in HubSpot at all?
It gets listed by name in the Slack recap rather than quietly dropped. Those are usually the most useful entries, because an address that bounced but was never a contact normally points back to a purchased or imported list, and the recap gives you the thread to pull on.
Why does this matter for my sending account?
Amazon watches your bounce and complaint rates and expects bounces under 5 percent and complaints under 0.1 percent. Sending again to addresses you already know are bad pushes those numbers the wrong way and can eventually get sending paused. Clearing them out of the CRM is what stops the same addresses being emailed next campaign.

Related templates

Build a credential rotation checklist when someone leaves

When someone leaves, we check which shared passwords they used in their final months and post a ranked rotation list to your security channel.

1Password
Rippling
Slack Bot
+1
Agentic Task
Weekly Amazon S3 bucket security audit posted to Slack

Every Monday, check every S3 bucket for public exposure, missing encryption and weak backup settings, then get the risks ranked in Slack.

Amazon S3
Slack Bot
Google Sheets
Agentic Task
Log Agorapulse social conversations to HubSpot contacts

Twice every weekday, the conversations from your social inbox land on the right HubSpot contact timelines, with a Slack recap for sales.

Agorapulse
HubSpot
Slack Bot
Agentic Task
Turn procurement portal tenders into CRM deals each morning

Every weekday at 7am, sign in to the tender portals you track, filter new notices against your bid criteria, and open a deal for the ones worth chasing.

Anchor Browser
Google Sheets
HubSpot
+1
Agentic Task
Draft polite follow-ups for emails that never got a reply

Every weekday at 4pm, spot the threads that went quiet, stage a ready-to-send nudge in your mailbox, and get a ranked Slack recap.

Aurinko
Google Sheets
Slack Bot
Agentic Task
Replay failed SQS messages when a bug fix is merged

When you merge a fix in GitHub, this agent checks the matching dead-letter queue, replays the failed messages, and reports back on the pull request and in Slack.

Amazon SQS
GitHub
Slack Bot
Agentic Task

Stop emailing people who already bounced.

Amazon SES already knows which addresses are dead. This puts that knowledge into your CRM every morning, before your team sends the next campaign.