Meta recently introduced something called as Frequency capping. Explaining in a simple manner, it noticed that users get a lot of Marketing messages from businesses, and to limit SPAM daily, it restricts how many Marketing messages a user can get during a rolling period of X days.
To prevent misuse and gaming the system, they haven’t told us how many messages are allowed in how many days. You can read more about this in their own words here.
Now if you read it properly, you probably caught that this affects only Marketing HSM templates. But you applied for Utility templates.
So why is this affecting you?? Meta realised that people wrote Utility messages in a “marketing” way (Maybe you wrote a message to engage users) or used variables to send messages which marketed something (some new content/new lesson/why they should engage with your bot etc).
PS** Now if you apply for a Utility Template, and deselect the checkbox “Allow Meta to recategorise”, and Meta detects anything which sounds “Marketing”, it approves your template as Marketing bypassing your preference – read more here
Refresher on HSM – WhatsApp Business message templates, known as Highly Structured Messages (HSMs), are categorized into three types: Marketing, Utility, and Authentication. Each serves distinct communication purposes and has specific guidelines. We are not going to go into what they are in detail, or into user-initiated service messages. We are only interested in Marketing and Utility Messages.
Key Differences Between Marketing and Utility Templates
| Feature | Marketing Template | Utility Template |
| Purpose | Promote products/services, send offers, or re-engage users. Can be sent to both existing and new users | Provide updates related to transactions, accounts, or subscriptions to existing users |
| Content Nature | Promotional, general, or unrelated to a specific user action | Tied to a specific user-initiated action or ongoing interaction |
| Approval Bias | Easier approval; Meta often categorizes ambiguous content as marketing | Stricter approval; requires clear linkage to a user action or transaction |
| Cost | Higher (e.g., ₹0.76 per message in India) | Lower (e.g., ₹0.11 per message in India) |
| Delivery Limits | Subject to frequency capping; may not reach all recipients | More reliable delivery; not subject to frequency capping |
| Examples | New product announcements, promotional offers, event invitations | Order confirmations, payment reminders, account updates |
Illustrative Example to highlight the difference between the two
Scenario: A new article titled “Top 5 Tips for Healthy Living” has been published, and you wish to notify users.
- Marketing Template – Hi {first_name}, we’ve just published a new article: “Top 5 Tips for Healthy Living”. Discover how to enhance your well-being today! Read here: {link}. This is Classified as Marketing because the message promotes new content without referencing any prior user
- Utility Template – Hello {first_name}, as part of your Health Tips subscription, here’s your latest article: “Top 5 Tips for Healthy Living”. Access it here: {link}. This is Classified as Utility because the message delivers content the user has opted in to receive, linking directly to their subscription.
Tip for Template Approval
To increase the likelihood of a template being approved as Utility (and benefit from lower costs and higher delivery rates), ensure the message
- Directly relates to a user-initiated action or ongoing transaction.
- Uses clear, specific language indicating the message’s purpose (e.g., “Your subscription update”, “Order confirmation”).
- Avoids promotional language or general content not tied to user activity.
- Careful wording and clear linkage to user actions can help in getting the desired template classification.
We have a tool you can use to help draft Utility HSM messages here. If you switch to Utility messages, your challenges should reduce.
Now coming back to the reality that some of our messages will be classified as Marketing, how can you solve the problem?
- We suggest you enable this dashboard called the HSM error dashboard for yourself. More later in this blog.
- For each broadcast, export all the users who failed to get the message (Ecosystem error) requires you to make a minor edit to the dashboard (see our documentation on how to do that). Import them into a new collection, and try again after 4 days. Then on, it is Rinse repeat till you are able to minimise how many users are affected.
Now on how to create this dashboard –
To Enable you to understand most affected users, templates, and campaigns (based on dates the message was sent) so you can pre-empt the number of people you might not be able to message.
Query you need to create a view in your Google BigQuery-
“SELECT
JSON_EXTRACT_SCALAR(m.errors, ‘$.app’) AS app,
JSON_EXTRACT_SCALAR(m.errors, ‘$.payload.destination’) AS destination,
STRING_AGG(cc.group_name, ‘, ‘) AS group_names,
JSON_EXTRACT_SCALAR(m.errors, ‘$.payload.type’) AS type,
JSON_EXTRACT_SCALAR(m.errors, ‘$.payload.payload.reason’) AS reason,
DATE(m.sent_at) AS sent_on,
m.flow_name AS flow_name,
m.uuid AS template_id,
m.body AS message,
m.media_url,
m.is_hsm,
m.contact_name,
m.contact_phone
FROM dataset.messagesAS m JOINdataset.contact_collection` AS cc
ON JSON_EXTRACT_SCALAR(m.errors, ‘$.payload.destination’) = cc.phone
WHERE m.bsp_status = “error”
GROUP BY
app, destination, type, reason, sent_on, flow_name, template_id, message, m.media_url, m.is_hsm, m.contact_name, m.contact_phone;“
How to set this up
- Sign into Bigquery using the appropriate email account and select the options to run a query. Incase you dont know how to do this
- Navigate to bigquery. Expand the phone number (aka dataset) and select Contacts table
- Click on the “Query’ button to create an empty query
- You will get an empty query which looks like this
- Copy paste the query above into the query window. Replace the phrase “dataset” with the values from the empty query. Copy everything (projectname.dataset) from the ‘ symbol till the .(dot) before contacts and paste it in the 2 places it says “dataset”. Delete the empty query so that only what you pasted is visible on the screen.
- Hit the ‘Run’ button. You will see Query Results coming once the query has run
- Click on Save and select “Save View”
- In the popup you see, select the correct values. Name the table “error_hsm_and_media”
- You will now see a new table/view popping up in the list of tables in the left of the screen
- Navigate to bigquery. Expand the phone number (aka dataset) and select Contacts table
Now that the data is formatted as you need it, lets move to Part 2 – setting up the visualization.
- Sign in to your Look Studio space using your work google account associated with BigQuery
- Open this link – https://lookerstudio.google.com/u/0/reporting/bcf8f57f-fe0d-4e7a-a2d1-79858507a9d3/page/oBhGF/preview in your browser
- In the top right corner, you will see 2 buttons next to your user profile icon
- Click on Use my own data
- Navigate the options, to select your project. Then the data set, and then finally the view we just created. Your dashboard is ready!
- To see a list of users and numbers, select Edit. Then Select Add a chart. Select a table. Drag and drop the fields contact_name and contact_phone under “Dimension”. You can now extract all the affected users when apply the relevant filters by Hovering on the top right corner of the chart, clicking on “more”, then Export and selecting the format you prefer!
Leave a Reply