Updated on October 25, 2026
A WhatsApp billing reminder sequence (in Brazil, a régua de cobrança) is a series of reminders sent before, on and after an invoice’s due date, using utility templates approved by Meta. To avoid getting blocked, every message must be about the customer’s own account only, with no promotional tone and no threats, short sending intervals and a clear stop point. WhatsApp’s policy lists “debt collection” among prohibited services, so a sequence is for a business reminding its own customers about their own invoices, not for running collections on behalf of third parties.
This guide shows where Meta draws the line, the steps of a sequence, how to write the templates, how to add Pix and boleto payment buttons, and what Brazil’s Consumer Protection Code says about how to collect. (Quick context: Pix is Brazil’s instant payment system; a boleto is a bank payment slip with a due date and a numeric “digitable line”.)
What Meta allows and what it prohibits
Two Meta rules define the space for billing reminders.
The first is in the template categorization guidelines. Among utility examples, under “account alerts or updates”, Meta lists a payment reminder: “Reminder: Your monthly payment for {{service}} will be billed on {{date}} to the {{card}} you have saved on file.” Reminding customers about their own bill is an expected use.
The second is section 4 of the WhatsApp Business Messaging Policy (updated September 23, 2026), which prohibits using WhatsApp for Business to buy, sell, promote or facilitate certain goods and services. The list includes “payday loans, paycheck advances, peer-to-peer lending, debt collection, and bail bonds”, and the ban applies “irrespective of the global or local licenses, registrations, or other approvals your business may hold”.
In practice:
| Scenario | Reading |
|---|---|
| School, gym, SaaS or internet provider reminding its own customer of a monthly fee | Account reminder, a listed utility use |
| Store warning about the boleto due date for an order | Notice about the customer’s transaction |
| Collection agency hired to recover third-party debts | Fits “debt collection”, a prohibited service |
| Company that buys debt portfolios and contacts debtors | Fits “debt collection”, a prohibited service |
Meta decides cases at its own discretion. If collections are your business, read the whole policy before investing in the integration.
Steps of a reminder sequence
There is no official sequence. The table below is a model to adapt to your terms and payment history:
| Step | Timing | Goal | Button |
|---|---|---|---|
| Invoice available | At issuance | Send amount, due date and payment method | Pix, boleto or link |
| Reminder | 2 to 3 days before | Remind those who have not paid | Pix or boleto |
| Due date | On the day, in the morning | Last notice within the deadline | Pix or boleto |
| Early overdue | 1 to 3 days after | Report the delay and the new way to pay | New Pix or updated boleto |
| Persistent overdue | About a week after | Offer contact with a person | “Talk to an agent” quick reply |
| Closing | Per company policy | State the next step set out in the contract | None or support |
Three operating rules prevent most problems:
- Stop the sequence on payment. Check with the bank or payment service provider (PSP) right before each send. An overdue notice to someone who already paid is the most common complaint.
- One message per step. Do not resend the same template on the same day, or when the previous message was not read.
- Long delays go to people. After a few attempts with no reply, the automated sequence stops and the case moves to human support or another channel.
Writing utility templates
Utility requires non-promotional, user-specific text. For billing, that means concrete invoice data and no incentive:
| Text | Likely category | Why |
|---|---|---|
| “Your {{1}} invoice of {{2}} is due on {{3}}. Use the button below to copy the Pix code.” | Utility | Account alert with specific data |
| “We have not identified payment for invoice {{1}}, due on {{2}}. If you already paid, please disregard this message.” | Utility | Account update, no persuasion |
| “Settle today with 30% off!” | Marketing | Offer with a financial incentive |
| “Your subscription expires on {{1}}. Renew today at a discount.” | Marketing | Meta cites discounted renewal attempts as marketing |
| “Final notice before legal action!!!” | Rejection or blocks | Threatening tone, triggers reports and conflicts with consumer law |
Since April 2025, a template submitted as UTILITY that Meta considers marketing is approved as MARKETING, and approved templates keep being reassessed. Watch the template_category_update webhook. Our article on marketing, utility or authentication lists the criteria, and rejected templates covers the most common rejection reasons.
A renegotiation offer with a discount tends to be marketing because it carries an incentive. If your sequence has that step, create a separate marketing template and send it only to people who opted in to offers.
Pix and boleto inside the message
In Brazil, Meta lets you add up to three PAYMENT_REQUEST buttons to a utility template, with a dynamic Pix code, a boleto digitable line, a payment link or one-click card payment (payment request CTA templates). The header can be a document, so you can attach the invoice PDF.
Sending an invoice with the PDF in the header and two buttons (boleto and Pix):
{
"messaging_product": "whatsapp",
"to": "5584999999999",
"type": "template",
"template": {
"name": "fatura_disponivel",
"language": { "code": "pt_BR" },
"components": [
{ "type": "header", "parameters": [
{ "type": "document", "document": { "link": "https://example.com/invoices/2026-10-4471.pdf", "filename": "invoice-october.pdf" } } ] },
{ "type": "body", "parameters": [
{ "type": "text", "text": "outubro" },
{ "type": "text", "text": "R$ 249,00" },
{ "type": "text", "text": "10/11/2026" } ] },
{ "type": "button", "sub_type": "payment_request", "index": "0", "parameters": [
{ "type": "action", "action": { "payment_request": { "payment_setting": {
"type": "boleto", "boleto": { "digitable_line": "INVOICE_DIGITABLE_LINE" } } } } } ] },
{ "type": "button", "sub_type": "payment_request", "index": "1", "parameters": [
{ "type": "action", "action": { "payment_request": { "payment_setting": {
"type": "pix_dynamic_code", "pix_dynamic_code": { "code": "INVOICE_PIX_CODE" } } } } } ] }
]
}
}
At creation, each button label must be one of the fixed values in the documentation (Copy Boleto code, Copy Pix code, Open payment link). Meta notes two caveats: WhatsApp does not disable the button when the code expires, and it does not reconcile payments. Generate a fresh Pix code at each overdue step and confirm payment through your PSP.
Frequency and number quality
The sequence runs every month, for many people at once, so it weighs on your number’s quality. Meta calculates quality from blocks, reports and other recent signals and, when quality drops, pauses templates and can limit the account (policy enforcement). Our article on number quality explains the ratings and their effects.
Practices that reduce blocks:
- Recognizable sender. Display name matching the brand on the invoice.
- Business hours. Avoid nights, early mornings and weekends.
- Data the customer recognizes. Billing month, amount and contract number.
- Easy exit. An “I already paid” or “Talk to an agent” button resolves doubts before they become reports.
- Spread the send. Distribute the batch across the morning instead of sending everything in the same minute, within your messaging limit.
What Brazil’s Consumer Protection Code says
Three articles of Law 8,078/1990, the Brazilian Consumer Protection Code (CDC), deal directly with how consumers are charged:
- Art. 42: when collecting debts, the defaulting consumer must not be exposed to ridicule or subjected to embarrassment or threats. The sole paragraph grants a refund of double the amount wrongly charged and paid, except for justifiable error.
- Art. 42-A: every billing document must show the supplier’s name, address and CPF or CNPJ (Brazilian individual or company tax ID).
- Art. 71: using threats, coercion, embarrassment, false statements or any procedure that exposes the consumer to ridicule or interferes with their work, rest or leisure when collecting debts is a crime.
For a reminder sequence, that means no threats, no exposure, reasonable hours, correct data (charging someone who already paid can lead to a double refund) and supplier identification on the PDF invoice or in the footer. The sequence also processes personal data and is subject to the LGPD, Brazil’s data protection law; see LGPD and WhatsApp. This article is informational and is not legal advice.
Example: sequence scheduler in Python
The script runs once a day, works out the step for each open invoice and sends the matching template through Vectalk, which accepts the Cloud API payload.
import datetime as dt
import os
import requests
VECTALK = "https://apis.vectalk.com.br/api/messages"
TOKEN = os.environ["VECTALK_TOKEN"]
STEPS = [ # (days relative to due date, template name)
(-3, "invoice_reminder"),
(0, "invoice_due_today"),
(2, "invoice_overdue"),
(7, "invoice_overdue_agent"),
]
def step_for_today(due: dt.date, today: dt.date):
delta = (today - due).days
for days, template in STEPS:
if delta == days:
return template
return None
def send(invoice, template):
body = {
"messaging_product": "whatsapp",
"to": invoice["wa_id"],
"type": "template",
"template": {
"name": template,
"language": {"code": "pt_BR"},
"components": [{"type": "body", "parameters": [
{"type": "text", "text": invoice["reference"]},
{"type": "text", "text": invoice["amount"]},
{"type": "text", "text": invoice["due"].strftime("%d/%m/%Y")},
]}],
},
}
r = requests.post(VECTALK, json=body, timeout=15,
headers={"Authorization": f"Bearer {TOKEN}"})
r.raise_for_status()
return r.json()["messages"][0]["id"]
def run(db, psp, today=None):
today = today or dt.date.today()
for invoice in db.open_invoices():
template = step_for_today(invoice["due"], today)
if not template or db.already_sent(invoice["id"], template):
continue
if psp.is_paid(invoice["id"]): # check before every send
db.mark_paid(invoice["id"])
continue
if invoice["optout"] or invoice["with_human_agent"]:
continue
db.log_send(invoice["id"], template, send(invoice, template))
Store each wamid and handle failures in the status webhook. Our guide to WhatsApp API errors lists the codes that need action.
How to do it with Vectalk
With Vectalk you use Meta’s official WhatsApp Cloud API with the same payloads and webhooks: only the base URL (https://apis.vectalk.com.br/api) and the token change. Templates are created through the templates endpoint, and documents can go by link or via media upload. Meta’s charges come on your Vectalk invoice, with no card registered at Meta. Sign up at apps.vectalk.com.br/register.
Frequently asked questions
Can I send billing reminders with the official API?
You can remind your own customers of their invoices with utility templates, a use Meta cites as an example. The policy prohibits using WhatsApp for “debt collection” as a service, regardless of licenses.
Is an overdue invoice notice utility or marketing?
It tends to be utility when it carries only account data (reference, amount, date) and no incentive. A discount to settle or renew pushes the template into marketing.
How many messages can the sequence have?
Meta sets no number. The more unanswered messages, the higher the risk of blocks and lower quality. A short sequence that hands the case to a person after a few notices is safer.
The customer asked to stop receiving reminders. What now?
The policy requires honoring requests to stop receiving messages. Record the opt-out, end the WhatsApp sequence and continue through the channels set out in the contract.
Can I use the same sequence for unpaid Pix from sales?
The logic is similar, but that is sales recovery, not a recurring invoice. See recovering Pix, boleto and abandoned carts.
Official sources consulted on October 25, 2026: Template categorization, WhatsApp Business Messaging Policy, Payment request CTA templates (Brazil), Policy enforcement, Get opt-in for WhatsApp, Brazilian Consumer Protection Code (Law 8,078/1990), Vectalk documentation.
