Hi,
This is a quick read on how the MonoSkin Engine handles WhatsApp outreach end-to-end. It is written in plain language and also doubles as the onboarding doc for anyone joining the team. By the end of this you should understand what a broadcast is, what a campaign is, how the system protects doctors from being spammed, and where to look when something goes wrong.
When you open the engine and create a new broadcast, you choose between two modes:
| Mode | What it does | Best for |
|---|---|---|
| Single template | One Meta-approved WhatsApp message goes out to every doctor in your audience, once. That's it. | Announcements, reminders, alerts. |
| Multi-step sequence | A funnel. First message goes out, then the engine waits, then it sends a follow-up, and the follow-up depends on whether the doctor replied, ignored us, or tapped a quick-reply button. | Nurturing, re-engagement, sample requests. |
Every broadcast moves through these four states. You can pause and resume any time before it completes.
| Paused | → | Scheduled | → | Running | → | Completed |
| default on creation |
if you scheduled it |
cron picks it up · 65% throttle |
all recipients processed |
The engine then sends the messages at a steady, polite pace — about 52 messages per second — which is 65% of what WhatsApp allows. We deliberately stay under the cap so our account stays healthy and Meta keeps us in their high-trust tier.
This is where things get interesting. A sequence is a flowchart of what the engine does over days or weeks, based on how each doctor responds. Below is what a real "nurture funnel" looks like:
Send template "patient_leakages" | ||||
| ↓ | ||||
Wait 72 hours | ||||
| ↓ | ||||
Did the doctor reply? | ||||
|
You design this flowchart visually using the Workflows Canvas editor. Drag nodes onto the canvas, connect them, save. Then attach this workflow to a broadcast.
What's important to understand: every doctor in the broadcast runs the sequence independently. Dr Sharma might be at Step 2 (waiting 72 hours after the first message), while Dr Verma is already at Step 4 because she replied early. The engine remembers exactly where each doctor is.
This is the most important rule in the entire engine, and it is enforced in multiple places to make sure it never breaks. Here is what happens the moment a doctor replies "STOP":
Doctor replies "STOP" | |||
| ↓ | |||
|
|||
| ↓ | |||
Doctor gets one confirmation "You will no longer receive messages. Reply START to opt back in." |
This is enforced at four different layers — by the inbound webhook, by the recipient-row cleaner, by the workflow halter, and by the messaging service itself as the last line of defense. Even if a future broadcast tries to message this doctor, the messaging service refuses to call WhatsApp.
This is not just polite. It is the law (DPDP Act 2023) and it is also Meta's policy. One missed STOP can downgrade our entire WhatsApp account's quality rating, which slows delivery for every other doctor.
You (create broadcast) |
→ | Dispatcher (every 60s) |
→ | Compliance gate (opt-out check) |
→ | Meta API (throttled 52/sec) |
→ | Doctor's |
Doctor replies |
→ | Meta webhook (real-time) |
→ | STOP check (cascade) |
→ | AI chatbot (Claude + KB) |
→ | Inbox (MR reviews) |
Every broadcast has a live report page at /whatsapp/broadcasts/{id}. It updates automatically every 10 seconds while the broadcast is running, then every 30 seconds for the next 24 hours while we collect delivery and read receipts.
| Number | What it means |
|---|---|
| Audience | Total doctors queued for the broadcast. |
| Sent | We successfully handed the message to Meta. |
| Delivered | Meta successfully delivered it to the doctor's phone. |
| Read | The doctor opened the chat and read it (blue ticks). |
| Replied | The doctor sent us a message back. |
| Failed | Something went wrong — bad number, Meta rejected, doctor opted out. |
Per recipient, you also see: doctor name, clinic, phone (one-click copy), open chat in inbox, the current sequence Step they are on, and their full profile in a click-to-open pop-up. CSV export of the entire recipient list is one click. Pause and Resume controls work even mid-broadcast.
Behind the inbox, there is an AI assistant that reads every inbound message from a doctor and either drafts a reply for the MR to review, or — for confident, simple FAQ-style questions — replies on its own. It uses Claude (with OpenAI as a backup, switchable through a config), and it can ground its answers in a Knowledge Base that you upload (PDFs, images of brochures, clinical brief sheets).
This means the chatbot doesn't just guess — it answers based on the latest MonoSkin clinical and product info that you've fed it. Upload a new PDF, and the chatbot is smarter that same day.
It also "learns" without being fine-tuned. Every night, the engine scans recent conversations, finds the ones that went well (no opt-outs, doctor stayed engaged), and promotes those question-and-answer pairs into a "good examples" library that the chatbot uses as reference in future replies. So the more the engine runs, the more polished its answers get — without any retraining bills.
| Piece | Status |
|---|---|
| Meta-approved templates | 28 live |
| Doctor database | ~3,900 doctors · 3,280 WhatsApp-eligible |
| Pilot broadcast #4 | 11 of 11 sent · 1 test recipient added live |
| STOP master rule | Live and verified |
| Dispatcher | Live (runs every minute, throttle 65% of Meta cap = 52 msg/sec) |
| Multi-step sequence engine | Live · waiting on first real sequence to be designed |
| AI inbox listener | Live · Claude + OpenAI switchable · knowledge base ready |
| Knowledge base upload | Live · PDF + image OCR |
And for inbound conversations: