We Audited Our WhatsApp Bill Line by Line — 60% Was Paying for Infrastructure We Never Used — UnifyPort
$187.42. That was the total on a four-person support team’s WhatsApp invoice for the month, up from $134 the month before with no change in message volume or headcount. Finance didn’t ask “is this too much” — they asked “what is this, specifically?” So the team pulled the itemized breakdown from their BSP (Business Solution Provider) dashboard and went through it line by line.
Four charges made up the total:
| Line item | Amount |
|---|---|
| Service conversation charges (Meta) | $74.10 |
| Template message charges (reclassified) | $41.20 |
| BSP markup | $23.12 |
| Platform fee | $49.00 |
| Total | $187.42 |
What follows is that audit — what each line is actually for, and whether this team’s day-to-day work (customers message them, they reply) ever triggers it.
Line 1: Service conversation charges — $74.10, the only line that maps to real usage
This is Meta’s charge for conversations the team is actually having: a customer messages first, the team replies within the open conversation window. This is the cheapest, simplest category WhatsApp bills for, and it directly reflects what the team does all day. No complaints here — this is the cost of the work.
Line 2: Template message charges — $41.20, for messages nobody knew were “templates”
This one needed explaining. A handful of the team’s replies weren’t simple in-window responses — they were follow-ups: an order-status update sent the next morning, a “did this get resolved?” check-in sent a day later. Once a reply falls outside the 24-hour conversation window, WhatsApp no longer treats it as a reply — it becomes a template message, priced individually by category and recipient country, same as a marketing broadcast would be.
Nobody on the team had submitted a template, approved a template, or thought of these messages as anything other than “replying a bit late.” But billing-wise, an 18-hour-late follow-up and a marketing blast go through the same meter.
Line 3: BSP markup — $23.12, a percentage of charges that shouldn’t have existed
On top of whatever Meta charges — both the legitimate service-conversation charges and the accidental template charges — the BSP adds its own margin. Industry-wide this commonly runs 15–20%. $23.12 on $115.30 of Meta charges works out to right around 20%.
The markup itself isn’t the problem — BSPs charge it because they provide real infrastructure (more on that below). The problem is that it compounds on top of Line 2, a charge the team didn’t know it was incurring in the first place. A billing surprise got a 20% surcharge automatically stacked on it.
Line 4: Platform fee — $49.00, for a toolkit nobody opens
This is the flat monthly charge for the BSP connection to exist at all — independent of message volume. What it buys: a template submission and approval workflow, a broadcast/campaign builder, an inbox UI with marketing-message scheduling.
The team checked: none of their four agents had opened the campaign builder. Ever. Their actual workflow — messages arrive, agents reply from a queue — doesn’t touch any of the tooling this fee pays for.
The tally: 60% of the bill, zero outbound activity
Add it up: $41.20 (Line 2) + $23.12 (Line 3) + $49.00 (Line 4) = $113.32, or 60% of the $187.42 total — and every dollar of it traces back to outbound infrastructure (template billing, BSP margin, campaign tooling) that this team has never used and has no plans to use. The remaining 40%, Line 1, is the actual cost of “customer messages us, we reply.”
What they switched to
The team connected their existing WhatsApp number to UnifyPort’s unofficial inbound interface instead of the BSP. Same number, no Business Verification, no re-onboarding. Inbound messages now arrive as a normalized message.received webhook event:
{
"event": "message.received",
"account_id": "acct_3qPmRz",
"provider": "whatsapp",
"from": "user_88c1ae",
"text": "Hi, do you have an update on order #4471?",
"timestamp": 1749974400,
"message_id": "wa_msg_9f2b7c"
}
The backend verifies each delivery with an HMAC-SHA256 check against the signing_secret configured on the webhook endpoint, then drops the message into the same queue agents already worked from:
app.post("/webhook", (req, res) => {
if (!verifySignature(req)) return res.sendStatus(401);
const evt = req.body;
if (evt.event === "message.received") {
supportQueue.add({
channel: evt.provider,
customer: evt.from,
text: evt.text,
messageId: evt.message_id,
});
}
res.sendStatus(200);
});
Replies go out through a single POST /v1/messages call naming the account and recipient, landing in the same conversation the customer opened — no template, no category, no per-message meter. Lines 2 through 4 don’t have an equivalent here, because nothing in this setup is outbound campaign infrastructure: there’s no template billing because there’s no template system, no BSP markup because there’s no BSP, and no platform fee for a toolkit that was never the point.
Run this audit on your own bill
If your WhatsApp usage looks like this team’s — customers message first, you reply, no campaigns — pull your own itemized invoice and ask three questions:
- Which lines are for conversations you’re actually having? (Keep this — it’s the real cost of the work.)
- Which lines are template/category charges for messages you thought were just replies? Check how many of your “replies” fall outside the 24-hour window.
- Which lines are markup or platform fees for tooling — campaign builders, broadcast schedulers, template approval — that nobody on your team has opened?
For this team, questions 2 and 3 added up to 60% of the bill. If inbound is genuinely all you need, that 60% is a number a normalized inbound webhook doesn’t have a line item for at all.