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.
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?
Why treat a bounce differently from a spam complaint?
Will this work on HubSpot Free?
What happens to a suppressed address that is not in HubSpot at all?
Why does this matter for my sending account?
Related templates
When someone leaves, we check which shared passwords they used in their final months and post a ranked rotation list to your security channel.
Every Monday, check every S3 bucket for public exposure, missing encryption and weak backup settings, then get the risks ranked in Slack.
Twice every weekday, the conversations from your social inbox land on the right HubSpot contact timelines, with a Slack recap for sales.
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.
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.
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.
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.