On this page7 sections
- Gather four records before you start
- Set the cut-off: delivery time, account time zone, a week's grace
- Match 1: delivered messages by category and market
- Match 2: priced counts against wallet debits
- Match 3: wallet debits against the GST invoice
- When the numbers don't match: symptom, cause, where to look
- Where InfiQ fits
Reconciling a WhatsApp API bill means making three matches every month: delivered messages by category and market against your wallet debits, those debits against the GST invoice, and your own message count against Meta's. Most gaps trace to four causes: counting sent instead of delivered, recategorised templates, foreign numbers, and service replies charged since 1 October 2026.
This is the check you run after the month closes. If you are budgeting ahead, start with the 2026 WhatsApp API pricing guide. If your developer needs the queries, the billing reconciliation glossary entry has them. What follows is the finance side: which records to pull, in what order, and what each kind of mismatch usually means.
Gather four records before you start
You need one record for each layer of the bill, plus the rate card that applied for the month.
| Record | What it tells you | Where it comes from |
|---|---|---|
| Message log with final status | Which messages were delivered, to which country code, in which category | Your provider's delivery reports, or the pricing object on Meta's status webhooks if you integrate directly |
| Meta's pricing analytics | Meta's own count of delivered messages by category, country and pricing type | The pricing_analytics field on your WhatsApp Business Account |
| Wallet statement | Top-ups, and the debits taken for messages | Your provider's billing section |
| GST invoice | Taxable value, GST and your GSTIN | Your provider's invoices |
On the rate card: Meta changes its prices only on the first day of a quarter (1 January, 1 April, 1 July and 1 October), with at least one month's notice for a rate change, according to its pricing documentation. A calendar month therefore never straddles two Meta rate cards, but the January, April, July and October closes may need a new one.
Set the cut-off: delivery time, account time zone, a week's grace
Meta charges for a message when it is delivered, not when it is sent, and its pricing analytics groups messages by when they were delivered. Count the same way. A campaign that starts at 11:50 pm IST on 31 October and keeps delivering after midnight belongs partly to November.
Draw the month boundary in the time zone of your WhatsApp Business Account. Meta resets its monthly volume tiers and each number's free service tier at midnight in that time zone, so a boundary drawn in another zone moves messages between months.
Then wait a week. Meta retries failed webhooks for up to seven days, as its throughput guidance notes, so a delivery update for 30 October can arrive well into November. Closing on the 8th instead of the 1st lets the late updates land first.
Match 1: delivered messages by category and market
Build a grid with pricing categories down the side and markets across the top, and fill it with delivered messages only. Five rules keep the grid honest.
- Count delivered messages only. A message that failed or was never delivered is not charged.
- Count each message once. On Meta's status webhooks, the pricing object arrives with the sent status and again with either the delivered or the read status. A ledger that sums every pricing object roughly doubles. Key each row on the message ID (the
wamid). - Use the category Meta billed. The pricing object's
categoryis what Meta charged, whatever category you chose when you submitted the template. A template Meta has moved from utility to marketing shows up here first. - Separate paid from free with
type.regularmeans billable.free_entry_pointmeans the message went inside a free entry point window opened by a Click-to-WhatsApp ad. Since 1 October 2026,free_customer_servicemarks a service message inside the number's free tier. - Set the market from the country calling code. Meta prices by the recipient's country calling code, so a +91 number is India wherever the user is, +1 is North America and +971 is the UAE.
Then compare the grid with Meta's own count. Pull pricing analytics for the same dates with PRICING_CATEGORY, PRICING_TYPE and COUNTRY as dimensions. Meta describes all insights data as approximate, so expect volumes to agree closely rather than exactly. If your account shares a Solution Partner's credit line, Meta returns volume but not cost, and the money side comes from your provider.
Match 2: priced counts against wallet debits
Multiply each cell of the grid by the rate on your account's rate card. Use the card in your dashboard, not a public one, because volume-commitment discounts can make your account's rates differ. InfiQ's India card is per delivered message, ex-GST: ₹0.94 for marketing, ₹0.19 for utility, ₹0.14 for authentication, and ₹0.145 for service messages since 1 October 2026. Every other market uses the international rate table on the pricing page.
Take a hypothetical snack brand in Indore closing October 2026. Its grid shows, to Indian numbers, 9,200 marketing, 41,000 utility, 18,500 authentication and 6,300 service messages (service replies have been charged since 1 October 2026), plus 700 utility messages to UAE numbers. Expected debits are 9,200 × ₹0.94 + 41,000 × ₹0.19 + 18,500 × ₹0.14 + 6,300 × ₹0.145 + 700 × the UAE utility rate.
If the wallet's October debits come out higher, look first at marketing volume that your log filed as utility. If they come out lower, look for messages your log counted that were never delivered.
Match 3: wallet debits against the GST invoice
Message rates are ex-GST. On InfiQ, 18% GST is added at invoicing, and the GSTIN you add in billing settings appears on every invoice. The GST cost breakdown walks through how the tax sits on top of the message and platform charges.
Check three things on each invoice:
- The taxable value equals the message debits plus any plan or add-on charges billed on that invoice.
- GST is 18% of that taxable value.
- Your GSTIN and legal name are correct, because those are what your accountant needs for the input credit claim.
Keep top-ups and debits in separate columns. A top-up moves money into the wallet; the debits are the month's messaging cost. A month with a large pre-Diwali top-up and modest sending is not an overspend, and booking it as one makes the next month look cheap.
When the numbers don't match: symptom, cause, where to look
Most variances fall into a handful of patterns. Find the symptom, then check the field that usually explains it.
| Symptom | Usual cause | Where to look |
|---|---|---|
| Sent count far above the debits | Undelivered messages are not charged, including marketing to users who stopped your messages (error 131050) and messages held back under error 131049 | Final status of each message |
| Your ledger is about double the debits | Pricing object counted on both sent and delivered or read | Deduplicate on wamid |
| Marketing up, utility down, same sends | A template was recategorised | category per template, month on month |
| A service line that was not there before October | Service replies and in-window utility templates have been charged since 1 October 2026 | type and category on replies |
| Authentication costs more than OTPs × the India rate | OTPs to foreign numbers bill at that market's rate, or at the authentication-international rate | Country code column; authentication-international category |
| Replies to ad traffic cost nothing | Free entry point window | type free_entry_point |
| Small gaps against Meta's analytics | Insights are approximate; deliveries near midnight | Delivery timestamps at the month boundary |
Meta's error code reference explains both delivery errors in the first row. Neither should ever appear as a debit, because neither message was delivered.
When a line still will not tie out, send your provider the evidence: message IDs, delivery dates, category, pricing type and country code for the disputed messages. Leave customers' phone numbers out of the file; the message ID is enough to trace each one. The webhook pricing object entry shows which fields to export.
Where InfiQ fits
On InfiQ, Meta's charges are drawn from a prepaid wallet you top up by card, UPI or bank transfer, and the dashboard rate card shows your account's exact rates. Campaign analytics reports delivery, read and reply rates per campaign alongside message spend against the rate card, which is the starting point for the first two matches. Invoices add 18% GST and carry your GSTIN; for a line that will not reconcile, contact us with the message IDs.

