Skip to main content

Analytics

Updated: Nov 19, 2025 Starting December 1, 2025, the maximum lookback window for messaging, conversation, and pricing analytics is changing from 10 years to 1 year. The lookback window for template and template group analytics will be unaffected and will continue to be 90 days. This document describes how to get messaging, conversation, and template analytics, such as the number of messages sent from a business phone number, the number of conversations and their costs for a WhatsApp Business Account (WABA), or the number of times a given template has been read. Only metrics for business phone numbers and templates associated with your WABA at the time of the request will be included in responses.

Get data

Use the GET /<WHATSAPP_BUSINESS_ACCOUNT_ID> endpoint to get analytics.

Request syntax

Request parameters

Messaging analytics

The analytics field provides the number and type of messages sent and delivered by the phone numbers associated with a specific WABA — for conversation metrics, see Conversation Analytics. When calling /&lt;WHATSAPP_BUSINESS_ACCOUNT_ID&gt;?fields=analytics.{filtering-parameters}, you can attach the following parameters.

Messaging analytics parameters

Example

Scenario: You need to get the number of messages sent and delivered by all phone numbers associated with your WABA. Suggested Solution: Assemble the URL you want to call and include the following filtering parameters: start, end, granularity. Then, make a GET request to that URL:
A successful response returns an analytics object with the data you have requested:

Conversation analytics

The conversation_analytics field provides cost and conversation information for a specific WABA. When calling /&lt;WHATSAPP_BUSINESS_ACCOUNT_ID&gt;?fields=conversation_analytics.{filtering-parameters}, you can attach the following parameters.

Conversation analytics parameters

Analytics data is approximate and may differ from what’s shown on invoices due to small variations in data processing.

Examples

Given a time range, you can get conversation and cost information associated with your WABA. If you want, you can filter and break down your results. See the code samples below for examples.

Get monthly data, using all breakdowns

Scenario: Given a month, you want to retrieve all conversation and cost information for all phone numbers associated with a WABA. Suggested Solution: Assemble the URL you want to call and include the following filtering parameters: start: Start of your time range. In this case, the beginning of the month you want metrics for. end: End of your time range. In this case, the end of the month you want metrics for. granularity: How granular you want your data points to be. In the example below, we use MONTHLY, so each datapoint will represent a month’s worth of data. phone_numbers: Send an empty array and we return information for all phone numbers associated with the WABA. dimensions: Set it to all available breakdowns: "CONVERSATION_CATEGORY", "CONVERSATION_TYPE", "COUNTRY", and "PHONE". In this case, you do not need to specify country_codes, metric_types, conversation_types and conversation_categories. If you don’t send us anything for those fields, we return all available options. Once you set up the URL, make a GET request:
A successful response returns a conversation_analytics object with the data you have requested. In the following example, the WABA contains only one phone number.

Get data for a specific phone number, using all breakdowns and half hour granularity

Scenario: Given a time range, you want to retrieve all conversation and cost information for a specific phone number associated with a WABA. In the results, you want to use all possible breakdowns. You need each data point to represent half an hour’s worth of data. Suggested Solution: Assemble the URL you want to call and include the following filtering parameters: start: Start of your time range. end: End of your time range. granularity: How granular you want your data points to be. In the example below, we use HALF_HOUR, so each datapoint represents half an hour’s worth of data. phone_numbers: The phone number you need information for. dimensions: Set it to all available breakdowns: CONVERSATION_CATEGORY, CONVERSATION_TYPE, COUNTRY, and PHONE. In this case, you do not need to specify country_codes, metric_types, conversation_types, or conversation_categories. If you don’t send us anything for those fields, we return all available options. Once you set up the URL, make a GET request:
A successful response returns a conversation_analytics object with the data you have requested:

Get monthly data, using conversation type breakdowns

Scenario: Given a time range, you want to retrieve all conversation and cost information for all phone numbers associated with a WABA. In the results, you want to break down by conversation type. Suggested Solution: Assemble the URL you want to call and include the following filtering parameters: start: Start of your time range. end: End of your time range. granularity: How granular you want your data points to be. In the example below, we use MONTHLY, so each datapoint represents half a month’s worth of data. phone_numbers: Send an empty array and we’ll return information for all phone numbers associated with the WABA. dimensions: Set it to CONVERSATION_TYPE. In this case, you do not need to specify country_codes, metric_types, conversation_types, conversation_directions, or conversation_categories. If you don’t send us anything for those fields, we return all available options. Once you set up the URL, make a GET request:
A successful response returns a conversation_analytics object with the data you have requested:

Get half-hour data broken down by conversation category

Request:
Response:

Get half-hour data broken down by conversation category and conversation type

Request:
Response:

Pricing analytics

The pricing_analytics field allows you to get pricing breakdowns for any messages delivered within a specified date range.

Request syntax

Pricing analytics parameters

Volume tier information

Include the TIER, PRICING_CATEGORY, and COUNTRY parameters in the dimensions array to get volume tier information. Data points representing messages affected by volume tier pricing will have a tier property in the response.

Example response syntax with tier information

The tier property value represents a concatenation of the lower and upper bounds for the tier specific to the market–category pair (country and pricing_category) that that data point represents. &lt;LOWER&gt; – An integer representing the lower bound of the tier (inclusive). &lt;UPPER&gt; – An integer representing the upper bound of the tier (inclusive), or the string MAX. Notes To determine your current volume tier, read the tier, country, and pricing_category values. The tier value’s &lt;UPPER&gt; integer (the integer after the colon) tells you your current tier for the country and pricing_category (for example, (India and utility, respectively). To determine how many messages you need to send to reach the next tier for a given country and pricing_category, subtract the volume integer from the tier value’s &lt;UPPER&gt; integer. Volume tiers will only be available for utility and authentication template messages. For marketing template messages (where volume tiers will not apply), tier will be set to 0:MAX. The tier property will be omitted for data points that represent free messages, since free messages don’t contribute to tiering counts. Volume tiers will be determined solely by Meta. All insights data is approximate due to small variations in data processing. Undue reliance should not be placed on insights data.

Example request

Example response

Template analytics

Template analytics describe the number of times a template has been sent, delivered, and read, and the number of times URL buttons or Quick Reply buttons in the template have been clicked. Additionally, onboarded MM API for WhatsApp businesses can track offsite conversion metrics. Data is returned with a daily granularity in the default timezone of UTC and WABA’s timezone, with a lookback window of up to 90 days. To show data in the WABA’s configured timezone, pass in the use_waba_timezone param with a value of true. Display data in the WABA’s configured timezone by passing in the use_waba_timezone param with a value of true.