Skip to content
The InfiQ GlossaryFeature

Pricing & billing

Pricing Analytics

The pricing_analytics field on a WhatsApp Business Account in the Graph API, which returns delivered volume and approximate cost by category, market and period.

Also called: pricing_analytics · WhatsApp pricing analytics API · Pricing insights · WhatsApp cost analytics

InfiQ Glossaryreviewed Expert

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?

2 / 2
GEThttps://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

Request

2 headers
GET /v26.0/102290129340398?fields=pricing_analytics.start(1788201000).end(1790793000).granularity(MONTHLY).dimensions(PRICING_CATEGORY,PRICING_TYPE) HTTP/1.1
Host: graph.facebook.com
Authorization: Bearer {ACCESS_TOKEN}

Response

200 OK
HTTP/1.1 200 OK
Content-Type: application/json
{
"pricing_analytics": {
"data": [
{
"data_points": [
{
"start": 1788201000,
"end": 1790793000,
"pricing_type": "REGULAR",
"pricing_category": "MARKETING",
"volume": 24180,
"cost": 20979.57
},
{
"start": 1788201000,
"end": 1790793000,
"pricing_type": "REGULAR",
"pricing_category": "UTILITY",
"volume": 61240,
"cost": 7042.6
},
{
"start": 1788201000,
"end": 1790793000,
"pricing_type": "REGULAR",
"pricing_category": "AUTHENTICATION",
"volume": 18950,
"cost": 2179.25
},
{
"start": 1788201000,
"end": 1790793000,
"pricing_type": "FREE_CUSTOMER_SERVICE",
"pricing_category": "SERVICE",
"volume": 15320,
"cost": 0
},
{
"start": 1788201000,
"end": 1790793000,
"pricing_type": "FREE_CUSTOMER_SERVICE",
"pricing_category": "UTILITY",
"volume": 2210,
"cost": 0
},
{
"start": 1788201000,
"end": 1790793000,
"pricing_type": "FREE_ENTRY_POINT",
"pricing_category": "MARKETING",
"volume": 840,
"cost": 0
}
]
}
]
},
"id": "102290129340398"
}
Try another response
A pricing_analytics call for one month, broken down by category and pricing type (illustrative values). Toggle the alternatives to see a credit-line account with no cost metric and a malformed request.

Response: 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?

  1. Get a token with access to the WABA

    Use a system user access token with the whatsapp_business_management permission on that account, sent as Authorization: Bearer {ACCESS_TOKEN}.

  2. Choose the window and granularity

    Convert the period to Unix timestamps in one consistent timezone, then pick DAILY for dashboards, MONTHLY for invoice checks or HALF_HOUR for detail on a campaign day.

  3. Pick the dimensions

    Request PRICING_CATEGORY, PRICING_TYPE and COUNTRY for a spend breakdown; add TIER (with category and country) to see volume-tier bands, or PHONE to split by number.

  4. Parse the data points

    Iterate pricing_analytics.data[].data_points[]. Each point has start, end, the dimension values, volume and cost; free messages carry no tier, and marketing reports 0:MAX.

  5. 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 start and end in 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 by PRICING_TYPE before 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.

— Explaining a jump in September spend

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, the TIER dimension shows where utility traffic sits in Meta's volume tiers, and FREE_ENTRY_POINT volume 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 TIER with 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_analytics field counted conversations under the retired model. pricing_analytics is 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_types was not limited to VOLUME.
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 pricing object from each status webhook.

Try it on the official WhatsApp Business API

InfiQ is an official Meta Business Partner. Start a 7-day free trial — no card needed — and see this running on your own number.