Features
Contacts and opt-outs
The address book, how it fills itself, and how STOP is honoured.
Contacts are organised into address books. One book is the default and fills itself from inbound WhatsApp messages; the others you build by hand, by import, or by API. Campaigns target a whole book, so the books are also your audiences.
Auto-capture from inbound messages
Anyone who messages your number is saved to the default book, named Saved from WhatsApp when it is created, with whatever WhatsApp reports about them. Nobody types these in.
What is captured from an inbound message
| Field | Required | Type | Description |
|---|---|---|---|
| displayName | No | string | The sender's WhatsApp profile name. Refreshed on every message, people rename themselves. |
| username | No | string | The account's username, on accounts that have set one. |
| waId | No | string | WhatsApp's id for the sender, the thing you reply to. |
| countryCode | No | string | Derived from the number's dialling code. Filled once and then left alone. |
| messageCount | No | integer | Incremented on every inbound message. |
| firstSeenAt / lastSeenAt | No | timestamp | First and most recent message. The list sorts by last contact, not by date added. |
| referral | No | object | The click-to-WhatsApp ad that started the conversation, when there was one. Only the first is kept, later ones are noise, the first is the acquisition source. |
| source | No | string | Provenance, shown on every row: Messaged you, Shared card, Added by hand, Imported or Via API. |
Turning capture off
The default book carries a Save people who message me checkbox. Unticking it stops new contacts being created; the header then reads “auto-save off”. Capture also stops silently when your plan's contact ceiling is reached, existing contacts still get their counters updated, because that costs no new rows.
Business or person
WhatsApp does not disclose whether an account is a business, so the platform does not guess. A new contact is Not known, and the drawer shows the evidence behind whatever it says. The only thing that sets Business without a human deciding is a shared contact card naming a company.
Shared contact cards
When a customer forwards a contact card into the chat, that card is saved as its own contact with source Shared card, not merged into the sender.
A card is the richest source available: company, job title, department, email, website, postal address and birthday, none of which a normal message exposes. A card whose phone number cannot be read is skipped. The phone is the identity key, and a contact without one cannot be messaged or de-duplicated.
Adding contacts yourself
Quick add
The row above the table takes a number with its country code, a first and last name and an optional company. Entering a company is you telling the platform this is a business, and it is recorded as such.Import a CSV
Columns are
phone, first name, last name, email, company, one per line. A header row is skipped automatically, detected by its first cell containing no digits. Quoted fields and both line-ending conventions are handled, so an Excel export works as-is.contacts.csv 919876543210,Priya,Sharma,[email protected],Homeomead 447700900000,Jane,SmithNumbers need the country code and no plus. Rows with fewer than 8 digits are dropped, and the panel says how many rows look usable before you commit. The result reports added, updated and skipped counts.
Export
Downloads the selected book as CSV.

Custom fields
Admin-defined attributes, product interest, plan tier, whatever you need, appear in the contact drawer and become {{key}} options in the campaign variable mapper, so a broadcast can be personalised from them. Types are text, number, date, URL, select and boolean.
Opt-outs and STOP
WooCommerce
The plugin keeps its own register and checks it before every send it makes.
- Opt-out keywords
STOP,UNSUBSCRIBE,OPTOUT,OPT OUT,CANCEL,STOP PROMO- Opt-in keywords
START,SUBSCRIBE,RESUME,UNSTOP- How they are matched
- The whole reply must equal the keyword, after trimming and upper-casing. “Please stop sending me these” does not match. A quick-reply button tap matches on its title, so a STOP button works the same way.
- Scope
- All categories. An explicit opt-out wins in every consent mode, for every category, including authentication. It is the one rule with no override.
- Expiry
- None. An opt-out is cleared only by an opt-in keyword, by the customer re-ticking the checkout box, or by an admin removing it.
- Acknowledgement
- None is sent. Replying STOP records the opt-out and writes one log row; replying START clears it silently.
- Where to see it
- WhatsApp → Logs in wp-admin lists the opt-out register beneath the delivery log, with a remove button per number.
When an opted-out number is targeted, the send is logged with status skipped and the reason Recipient has opted out of WhatsApp messages. Nothing is queued, nothing is sent, and no credit is spent.
Consent modes
The plugin's Consent mode setting decides what counts as permission in the first place. The default is implied.
Consent modes
| Field | Required | Type | Description |
|---|---|---|---|
| implied | No | mode | Giving a number at checkout is consent to order updates. The default. Default: implied |
| checkbox | No | mode | Offers a pre-ticked opt-in at checkout. In terms of what is allowed to send, it behaves the same as implied, the checkbox itself is controlled by a separate Checkout field toggle. |
| required | No | mode | Nothing is sent without an explicit opt-in, and the checkout box renders unticked whatever the default-state setting says. |
Separately, Marketing messages need an explicit opt-in is on by default. With it on, a marketing event to a customer who has not actively opted in is skipped with Marketing messages need an explicit opt-in and this customer has not given one.
Customers opt in at the classic checkout, at the block checkout, or from My Account → Account details. Unticking it on the account page adds the number to the opt-out register; ticking the checkout box clears a previous opt-out on that number.
Shopify
The Shopify app keeps the same keyword lists and applies its opt-out check to every event, including utility ones. There is deliberately no override. A subscribe attempt from an opted-out number is refused with This number has asked not to receive messages from this store. Reply START on WhatsApp to opt back in.
The Shopify app reads no Shopify consent field, not accepts_marketing, not sms_marketing_consent. Its only suppression list is the one built from inbound STOP replies.
When a contact is not created
- Auto-save is switched off on the default book.
- The plan's contact ceiling is reached. Existing contacts keep updating; new ones stop being created.
- The message carries no readable phone number, for a shared card, that means the card is skipped entirely.
- An import row has fewer than 8 digits in the phone column. It is dropped before the import runs.
Cost
Storing contacts costs no credits. What contacts cost you is the messages you send to them, see Credits and billing and Campaigns and broadcasts. The number of contacts is a plan limit, though, and hitting it stops auto-capture rather than billing you more.
