What does this tool do?
HubSpot charges us based on how many contacts are marked as "Marketing." Many of those contacts are people who never opened our emails, have invalid email addresses, or are from Taiwan (not our target market). This tool finds those contacts and removes them from the billing list.
When should I run this?
Everything runs automatically — scan, cleanup, and email notification. You don't need to do anything. You'll receive a result email at service@watersonusa.com showing how many contacts were removed.
You can also run it manually anytime — for example, after importing a large batch of contacts, or before a billing cycle.
How to run the cleanup (step by step)
Open Google Sheet →In the Sheet, click the menu: HubSpot Cleanup → Run Scan Now. Wait 2–5 minutes. The scan will automatically find inactive contacts, flag them for downgrade, and trigger the HubSpot Workflow.
Click the Summary tab at the bottom (e.g. Summary_2026-03-26). You'll see how many contacts were processed and the estimated count after cleanup.
A summary email will be sent to service@watersonusa.com showing: total contacts scanned, how many were downgraded, how many remain as marketing, and any reactivated contacts.
Everything is automatic — no extra buttons to click. The marketing status change will take effect at HubSpot's next billing renewal, not immediately.
What if a removed contact comes back?
The system automatically checks every month. If a non-marketing contact does any of the following within 90 days, they show up in the Reactivated tab:
- Opened a marketing email
- Clicked a link in an email
- Replied to an email (marketing or sales)
- Submitted a form on our website
- Had a call or meeting logged in HubSpot
To restore them: go to HubSpot Cleanup → Set Reactivated as Marketing.
What kind of contacts get removed?
A contact is removed from marketing if it matches any of these:
- Email bounced (undeliverable)
- Unsubscribed from marketing emails
- No email address
- Never opened any email (and has been a contact for over 30 days)
- Last opened an email over 6 months ago
- Never been sent any email (and has been a contact for over 30 days)
- Taiwan-based contact (country, IP, .tw email, or LINE user)
- Chinese name or company name (likely non-US market)
How it works behind the scenes
HubSpot does not allow changing marketing status directly through its API. So we use a two-step approach with custom properties and HubSpot Workflows:
Downgrade flow (Non-Marketing)
The Apps Script sets "Request Non-Marketing" = Yes on each candidate contact via HubSpot batch API.
HubSpot Workflow detects the property change → sets the contact as Non-Marketing → clears the property to avoid re-triggering.
HubSpot marks the contact as "non-marketing at next renewal." The actual billing change takes effect at the next billing cycle, not immediately.
Reactivation flow (Marketing)
Same mechanism in reverse: the script sets "Request Marketing" = Yes → Workflow sets contact as Marketing → clears the property.
1. "Set Non-Marketing" — triggers when Request Non-Marketing = Yes
2. "Set Marketing" — triggers when Request Marketing = Yes
These workflows are essential for the cleanup system to work.