# WhatsApp opt-in register your team checks before every send

> See who has really said yes to WhatsApp, build a segment from only those people, and push it to your broadcast tool with a record of who got what.

- Workflow type: app
- Services: Heyy, HubSpot, Google Sheets
- Categories: Marketing, Operations
- Published: 2026-08-24

## What it does

- Shows every contact who could receive a WhatsApp broadcast in one register: their number, where and when they said yes, the reason you are allowed to message them, whether they ever opted out, and when you last messaged them.
- Keeps live counts at the top so you know before you start how many people are eligible, how many are missing proof, and how many are blocked outright.
- Lists your connected WhatsApp numbers next to your approved message templates, so every saved audience is tied to the template it is allowed to use.
- Pushes only the eligible people to Heyy in one click, stamps the campaign back onto each CRM record, and writes the full send list to a Google Sheet so you can prove later exactly who received what.
- Runs an assistant in the background that reads every contact's record, flags anyone whose proof is missing, out of date or unclear, and files the cleanup list to the sheet.

## What you'll need

- A Heyy workspace with at least one connected WhatsApp number and your approved message templates
- A HubSpot account where contact records hold the opt-in details: where the person signed up, the date, the reason you are allowed to message them, and whether they have opted out
- A Google Sheet to hold the send history and the audit findings
- The names of the people who should be allowed to run a push, since everyone else can only propose an audience

## Prompt

Build me a WhatsApp opt-in register and audience builder that my marketing ops person opens before every broadcast, so we stop keeping consent in a spreadsheet nobody trusts. This app never drafts message copy, because our Heyy templates are already approved. Its job is to govern who is eligible to be messaged and to record the evidence.

The main view is the register. Pull contacts with HubSpot "Search Contacts", filtered to people who have a phone number, and show one row per person with their name, phone, the opt-in source, the opt-in date, the lawful basis, whether they have ever opted out and when, and when we last messaged them. Across the top show live counts for eligible, missing evidence and blocked, recalculated as filters change. The register also reads our send history from the Google Sheet with "Get Values" and joins it onto each row, so every person shows which campaigns and templates they have already been sent. Give me search and filters over source, date range, lawful basis, opt-out status and last-messaged date.

A second view lists our connected numbers from Heyy "List Channels" beside the approved templates from Heyy "List Message Templates", showing each template's name, language and status. Saving a segment means picking a channel and a template here, so every saved segment is tied to the template it is allowed to use, and a segment whose template is no longer approved is shown as unusable.

Building a segment is just filtering the register and saving that filter with a name, the chosen channel, the chosen template, and any personalisation fields to carry over. Saved segments persist in the app so the same audience can be reused and re-run for the next campaign.

A "Push to Heyy" action turns a saved segment into a campaign. It first creates the campaign label with Heyy "Create Label", then adds only the eligible people with Heyy "Create Contact", passing phone, name, the campaign label and the personalisation values as custom fields. Those custom fields are set up once, on first run, with Heyy "Create Contact Attribute", and the app should reuse existing attribute identifiers where they already exist rather than creating duplicates. Creating the labelled contact is what fires the Heyy template automation, so the app itself never sends a message. The same action then stamps the campaign name and push date onto each person with HubSpot "Update Contact", and writes the full push manifest to the Google Sheet with "Append Values": contact id, name, phone, campaign, channel, template, timestamp and who ran the push. Deduplicate by phone number so nobody is pushed twice in one campaign, and skip anyone already recorded in the manifest for that campaign so a re-run never double-sends.

Add an "Audit consent evidence" button that starts a background agent. It walks the register, reads each contact's properties with HubSpot "Get Contact", and judges each person's opt-in evidence as clear, missing, stale or ambiguous. Missing means no source or no date. Stale means the opt-in is older than the retention window set in the app, twelve months by default. Ambiguous means the source does not name a real consent capture point, or the lawful basis contradicts the opt-out flag. The agent writes the verdict and a short reason back with HubSpot "Update Contact" and files the full findings list to the Google Sheet with "Append Values", so the cleanup queue is ready before the next send. Show the agent's progress in the app while it runs, and show the findings in the register once it finishes.

Rules to bake in. Anyone marked opted out is hard blocked: they stay visible in the register with the reason shown, but they cannot be selected and cannot be pushed even by an admin. People without evidence are visible but unselectable until an audit clears them, with a hint saying what is missing. Marketers can filter, save and propose a segment, but only an admin can run the push, so show the push button disabled with an explanation for non-admins rather than hiding it. Every push and every audit run should be recorded with the person who ran it, since the whole point is being able to prove later exactly who received what and why we were allowed to message them.

## How to customize

- Change what counts as out of date proof, for example anything older than twelve months
- Point the register at whichever CRM fields your team already uses to record consent
- Choose who is an admin allowed to run a push and who can only build and propose audiences
- Add the personalisation details you want carried into the template, such as first name, city or plan

## FAQ

### Does this app send the WhatsApp messages itself?

No. It decides who is allowed to be messaged and hands that audience to Heyy with the right campaign label. Your existing Heyy automation sends the approved template, so nobody is writing message copy in this app.

### What happens to someone who has opted out?

They are hard blocked. They still appear in the register so you can see why, but they cannot be selected or pushed, and an admin cannot override it.

### Can anyone on the marketing team run a broadcast push?

No. Marketers can filter the register, save an audience and propose it, but only an admin can run the push that creates the contacts in Heyy.

### What if our consent details are incomplete today?

That is the point of the audit button. It starts a background assistant that reads every contact, flags the people whose proof is missing, out of date or unclear, and writes the cleanup list to your sheet. Until someone is cleared, they show in the register but cannot be selected.

### Where is the proof of what we sent kept?

Every push appends a full manifest to your Google Sheet: who was included, which number and template was used, the campaign name and the date. The register reads that history back, so each person's row shows what they have already been sent.

### Will this work if we use a different CRM?

This version reads and writes HubSpot contacts. The same register works against another CRM as long as it can store the opt-in source, date, reason and opt-out flag on each contact record.

Use this prompt in General Input: https://www.generalinput.com/prompts/whatsapp-opt-in-register-your-team-checks-before-every-send