What is the pricing_analytics field?
Pricing analytics is the pricing_analytics field on the WhatsApp Business Account (WABA) node of the Graph API. It reports what per-message pricing produced: how many messages were delivered and roughly what they cost, over a time range you choose. You request it with GET /{WABA_ID}?fields=pricing_analytics.start(…).end(…).granularity(…) on the account's WABA ID, adding filters and breakdowns as further chained modifiers.
start and end are Unix timestamps and granularity is HALF_HOUR, DAILY or MONTHLY. Optional filters narrow the data by phone_numbers, country_codes, metric_types (COST, VOLUME), pricing_types (REGULAR, FREE_CUSTOMER_SERVICE, FREE_ENTRY_POINT) and pricing_categories (MARKETING, MARKETING_LITE, UTILITY, AUTHENTICATION, AUTHENTICATION_INTERNATIONAL, SERVICE, REFERRAL_CONVERSION). dimensions sets the breakdown — COUNTRY, PHONE, PRICING_CATEGORY, PRICING_TYPE and TIER — and each returned data point carries start, end, the requested dimension values, volume and cost in the account's currency. A tier value such as 0:750000 appears only where volume tier pricing applies; marketing reports 0:MAX and free messages carry none.
It is the developer's source of spend data, and it differs from conversation analytics, which is the account-level reporting view of volume and engagement trends. The webhook pricing object on each status webhook reports one billable message at a time; pricing_analytics aggregates. Meta describes all insights data as approximate, so the invoice stays the record in billing reconciliation. Two limits matter in practice: COST is not returned for accounts that share a Solution Partner's credit line, and since 1 December 2025 the maximum look-back is one year (down from ten).
Key takeaways
- The pricing_analytics field on a WhatsApp Business Account returns delivered message volume and approximate cost for a time range.
- start and end (Unix seconds) and granularity (HALF_HOUR, DAILY or MONTHLY) are required; filters and dimensions are optional.
- COST is not returned for accounts that share a Solution Partner's credit line; those accounts get VOLUME only.
- Since 1 December 2025 the maximum look-back is one year, so store the data points as you go.
- Meta calls all insights data approximate: use it to explain and forecast, and reconcile money to the invoice.
Figure 1
Send the request: what did September cost?
https://graph.facebook.com/v26.0/102290129340398?fields=pricing_analytics.start(1788201000).end(1790793000).granularity(MONTHLY).dimensions(PRICING_CATEGORY,PRICING_TYPE)GET 200 in 900 ms(simulated)
Request
2 headersResponse
200 OKResponse: 200 OK after 900 ms.
The pricing_analytics field in code
curl -G "https://graph.facebook.com/v26.0/{WABA_ID}" \-H "Authorization: Bearer {ACCESS_TOKEN}" \--data-urlencode "fields=pricing_analytics.start(1788201000).end(1790793000).granularity(DAILY).dimensions(PRICING_CATEGORY,PRICING_TYPE,COUNTRY)"
September 2026 (00:00 IST on 1 September to 00:00 IST on 1 October), daily, by category, pricing type and country.
How does the pricing_analytics field work?
Get a token with access to the WABA
Use a system user access token with the
whatsapp_business_managementpermission on that account, sent asAuthorization: Bearer {ACCESS_TOKEN}.Choose the window and granularity
Convert the period to Unix timestamps in one consistent timezone, then pick
DAILYfor dashboards,MONTHLYfor invoice checks orHALF_HOURfor detail on a campaign day.Pick the dimensions
Request
PRICING_CATEGORY,PRICING_TYPEandCOUNTRYfor a spend breakdown; addTIER(with category and country) to see volume-tier bands, orPHONEto split by number.Parse the data points
Iterate
pricing_analytics.data[].data_points[]. Each point hasstart,end, the dimension values,volumeandcost; free messages carry notier, and marketing reports0:MAX.Store, refresh and reconcile
Write points to a table keyed by period and dimensions, re-fetch the last few days because late data happens, and compare monthly totals with the invoice.
Common mistakes with the pricing_analytics field
Treating analytics as the invoice
Meta calls insights data approximate. Use it to explain and forecast, and reconcile to the invoice for anything finance signs off.
Expecting cost on a credit-line account
Accounts that share a partner's credit line get volume but no
COST. Multiply volume by your contracted rates, or ask the partner for cost data.Mixing timezones at the boundaries
Building
startandendin UTC while the account bills in India time shifts five and a half hours of traffic between days and months. Pick one timezone and keep it.Waiting too long to fetch history
The look-back is limited to one year. Store data points as you go instead of relying on the API for last year's comparisons.
Comparing September and October 2026 like for like
Service replies and in-window utility templates were free until 30 September 2026 and showed under
FREE_CUSTOMER_SERVICE. Since 1 October 2026 in-window utility is charged, and Meta charges service messages once a phone number passes its first 1,000 of the month, so service volume now splits across both pricing types. Split byPRICING_TYPEbefore reading the jump as a change in behaviour.
Example: Explaining a jump in September spend
An ed-tech platform in Bengaluru sees its September invoice rise although campaign volume was flat. Its nightly job had stored pricing_analytics by PRICING_CATEGORY and PRICING_TYPE at daily granularity. The breakdown shows FREE_ENTRY_POINT volume collapsing in the second half of the month: Click-to-WhatsApp ads had been paused, but the sales team kept following up leads with templates, so deliveries that used to carry no charge became REGULAR marketing and utility. Restarting the ads — and alerting when free-entry-point share drops — brought October's forecast back in line.
Why it matters
Why does the pricing_analytics field matter?
When finance asks why this month's WhatsApp bill is higher, pricing analytics is how a developer answers with data instead of guesses. Cost by category reveals a marketing push, cost by country reveals OTPs going abroad, theTIERdimension shows where utility traffic sits in Meta's volume tiers, andFREE_ENTRY_POINTvolume shows what Click-to-WhatsApp ads saved. Pulled daily into a warehouse, it powers budgets, unusual-spend alerts and the reconciliation of invoices against your own send logs.
Best practices for the pricing_analytics field
- Request
dimensions(PRICING_TYPE)to separate charged deliveries from free entry point traffic. - Add
TIERwith category and country to see how close utility volume is to the next tier. - Re-fetch the trailing three days in every nightly run to absorb late corrections.
- Alert on daily cost per category, not just monthly totals.
Pricing Analytics FAQs
- Is pricing_analytics the same as conversation analytics?
- No. Conversation analytics is account-level reporting of volume and engagement over time, usually read in a dashboard, and the older
conversation_analyticsfield counted conversations under the retired model.pricing_analyticsis the API source of delivered volume and cost under per-message pricing. - Why is COST missing from my response?
- Most often because the account shares a Solution Partner's credit line, in which case Meta returns volume only. Check also that
metric_typeswas not limited toVOLUME. - How far back can I query WhatsApp pricing analytics?
- One year. Meta reduced the maximum look-back for pricing analytics from ten years to one year on 1 December 2025.
- Does pricing_analytics show per-message detail?
- No. It aggregates by period and dimension. For individual messages, store the
pricingobject from each status webhook.