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

A brand asset library your marketing team actually searches

Every logo, photo, video cut and ad export in one searchable grid, with previews, campaign tags and rights expiry dates at a glance.

General Input Storage
General Input Database
JigsawStack
+1
App
Turn Mailjet email clicks into ranked HubSpot follow-ups

Twice a day we spot the people clicking your pricing and demo pages, create a follow-up task for their owner, and post a ranked recap to Slack.

Mailjet
HubSpot
Slack Bot
Agentic Task
Clean out the Looker dashboards and Looks nobody opens

One board showing every dashboard and Look with its folder, owner and favorite count, so you can find dead content and retire it safely.

Looker
Slack Bot
App
LiveKit live operations console for room moderation

Watch every live room on one screen, remove disruptive guests, start recordings and end stuck sessions without anyone opening a terminal.

LiveKit
Slack Bot
General Input Database
App
Wake up dormant Keap leads with a researched reason

Every Monday we find leads who never bought, research a real reason to reach out, and send a short personal email instead of another check in.

Keap
Slack Bot
Agentic Task
iMessage campaign console with pre-flight checks and delivery board

Build every text campaign in one screen: check who is actually reachable, see a realistic send plan, then watch delivery land row by row.

LoopMessage
Google Sheets
HubSpot
App

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.