← Blog

·

Billing reminders on WhatsApp: how to build a sequence without getting blocked

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:

ScenarioReading
School, gym, SaaS or internet provider reminding its own customer of a monthly feeAccount reminder, a listed utility use
Store warning about the boleto due date for an orderNotice about the customer’s transaction
Collection agency hired to recover third-party debtsFits “debt collection”, a prohibited service
Company that buys debt portfolios and contacts debtorsFits “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:

StepTimingGoalButton
Invoice availableAt issuanceSend amount, due date and payment methodPix, boleto or link
Reminder2 to 3 days beforeRemind those who have not paidPix or boleto
Due dateOn the day, in the morningLast notice within the deadlinePix or boleto
Early overdue1 to 3 days afterReport the delay and the new way to payNew Pix or updated boleto
Persistent overdueAbout a week afterOffer contact with a person“Talk to an agent” quick reply
ClosingPer company policyState the next step set out in the contractNone or support

Three operating rules prevent most problems:

  1. 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.
  2. One message per step. Do not resend the same template on the same day, or when the previous message was not read.
  3. 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:

TextLikely categoryWhy
“Your {{1}} invoice of {{2}} is due on {{3}}. Use the button below to copy the Pix code.”UtilityAccount alert with specific data
“We have not identified payment for invoice {{1}}, due on {{2}}. If you already paid, please disregard this message.”UtilityAccount update, no persuasion
“Settle today with 30% off!”MarketingOffer with a financial incentive
“Your subscription expires on {{1}}. Renew today at a discount.”MarketingMeta cites discounted renewal attempts as marketing
“Final notice before legal action!!!”Rejection or blocksThreatening 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.

Integre o WhatsApp oficial ao seu sistema

A Vectalk entrega a Cloud API da Meta com os mesmos payloads e webhooks, um token para todas as contas e documentação completa.