← Blog

·

WhatsApp for accounting firms: documents, tax slips and deadlines

Updated on October 25, 2026

With the official WhatsApp Business API, an accounting firm can send tax payment slips as PDFs straight from its system, with the PDF in the header of a utility template, send automatic reminders for due dates and document deadlines, and receive invoices, bank statements and receipts that arrive by webhook and are saved to the client’s folder. The difference from the app is that everything is logged, comes out of the firm’s system and does not depend on an employee’s phone.

This guide covers the three main flows (tax slips, reminders and document collection), the Cloud API payloads, the right category for each template and care with tax data. (Context: in Brazil, firms send monthly tax slips such as the DAS, the single tax slip for small businesses under the Simples Nacional regime.)

Why move off the office phone

In many firms, tax slips come out of the accounting system, are downloaded one by one and sent from an employee’s WhatsApp. The problems are familiar: a slip sent to the wrong client, documents lost in chats, no one knows if the client received it, and when the employee leaves, the history goes too.

With the API, the flow becomes:

TodayWith the API
Download the PDF and attach it manuallyThe system sends the PDF from the client folder
Check by eye whether the client read itThe status webhook logs delivered and read
Documents scattered across chatsReceived files go to the client folder
Reminders depend on someone rememberingReminders scheduled by due date
One phone per personSeveral agents on the same number

With coexistence, the firm’s number can stay on the WhatsApp Business app while the system uses the API.

Flow 1: sending tax slips as PDFs

The monthly slip is a business-initiated message, usually outside the 24-hour customer service window, so it needs a template. What works is a utility template with a document header.

Template creation:

{
  "name": "guia_disponivel",
  "language": "pt_BR",
  "category": "UTILITY",
  "components": [
    { "type": "HEADER", "format": "DOCUMENT",
      "example": { "header_handle": ["SAMPLE_PDF_HANDLE"] } },
    { "type": "BODY",
      "text": "Olá, {{1}}. A guia de {{2}} da empresa {{3}}, competência {{4}}, está em anexo. Valor: {{5}}. Vencimento: {{6}}.",
      "example": { "body_text": [["Marina", "DAS", "Padaria Exemplo LTDA", "09/2026", "R$ 1.284,55", "20/10/2026"]] } },
    { "type": "FOOTER", "text": "Contabilidade Exemplo" },
    { "type": "BUTTONS", "buttons": [
      { "type": "QUICK_REPLY", "text": "Recebi" },
      { "type": "QUICK_REPLY", "text": "Tenho uma dúvida" } ] }
  ]
}

Sending each client’s actual PDF:

{
  "messaging_product": "whatsapp",
  "to": "5584999999999",
  "type": "template",
  "template": {
    "name": "guia_disponivel",
    "language": { "code": "pt_BR" },
    "components": [
      { "type": "header", "parameters": [
        { "type": "document", "document": { "id": "PDF_MEDIA_ID", "filename": "DAS-09-2026-Padaria-Exemplo.pdf" } } ] },
      { "type": "body", "parameters": [
        { "type": "text", "text": "Marina" },
        { "type": "text", "text": "DAS" },
        { "type": "text", "text": "Padaria Exemplo LTDA" },
        { "type": "text", "text": "09/2026" },
        { "type": "text", "text": "R$ 1.284,55" },
        { "type": "text", "text": "20/10/2026" } ] }
    ]
  }
}

Why this text tends to be utility: it carries specific data about a service the client pays for (company, period, amount, due date) and no offer. Meta classifies alerts and updates about purchased or subscribed services as utility, as long as they do not promote, recommend or try to renew anything (categorization guidelines). If the same template offers “tax planning consulting at a discount”, it becomes marketing. See how Meta categorizes your template.

Practical details:

  • File name. Use filename with slip type, period and company. That is what the client sees in the chat and on the phone.
  • Upload or link. The PDF can go by public HTTPS link or by media id after upload. For tax slips, prefer upload: a public link exposes a tax document on the internet. Media IDs returned by the API last 30 days (media documentation).
  • Size. Documents can be up to 100 MB, plenty for tax slips.
  • Opt-in. Meta requires that the client has agreed to receive messages from the firm, with the business name made clear (Get opt-in for WhatsApp). Include that consent in the contract or client onboarding and keep the record.
  • Several slips. Send one message per slip. Bundling several taxes into one message confuses the client and your delivery tracking.

Our article on sending images, PDFs, audio and video via the API covers upload and file types.

Want to try it while you read? Create a Vectalk account and send your first message through the official API. Create free account →

Flow 2: due-date and deadline reminders

There are two kinds of reminders in a firm, and both can be utility:

ReminderExampleWhy it is utility
Slip due date“The {{1}} slip for {{2}} is due tomorrow, {{3}}. If you already paid, please disregard.”Alert about a subscribed service, no offer
Document deadline“To close period {{1}} for {{2}}, we need the invoices and statements by {{3}}. Send them here.”Request for action to complete a service
Missing records“We still need the updated articles of incorporation for {{1}} to complete the change. Send them here.”Account-specific update

Meta uses a similar case as a utility example: a notice that, to finish setting up a profile, the user needs to upload a photo. Asking for a document to complete a service follows the same logic.

Rules for deadline reminders:

  • One reminder per deadline, with at most one follow-up near the date. An accountant who sends three notices a day gets blocked.
  • Stop when it is resolved. If the documents arrived or the slip was paid, cancel reminders for that period.
  • The client’s calendar, not the firm’s. Each company has its own tax regime and obligations calendar. Generate reminders from each client’s registered obligations.

For the firm’s own fees, the logic is that of an invoice reminder sequence; see billing reminders on WhatsApp.

Flow 3: collecting documents

When the client replies with photos of invoices, PDF statements or spreadsheets, the webhook delivers the message type and a media ID, not the file. The system downloads the file and saves it to the right folder.

Two deadlines matter, per Meta’s media documentation: the download URL expires after 5 minutes, and a media ID received by webhook can only be downloaded for 7 days. Download right away and store it yourself.

A Node.js example that receives a document, downloads it through Vectalk and saves it to the client folder:

import fs from 'node:fs/promises';
import path from 'node:path';

const TOKEN = process.env.VECTALK_TOKEN;

async function downloadMedia(mediaId) {
  const r = await fetch(`https://apis.vectalk.com.br/api/media/${mediaId}/download`, {
    headers: { Authorization: `Bearer ${TOKEN}` },
  });
  if (!r.ok) throw new Error(`Download failed: ${r.status}`);
  return Buffer.from(await r.arrayBuffer());
}

export async function handleMessage(msg, db) {
  const media = msg.document || msg.image;
  if (!media) return;

  const client = await db.clientByPhone(msg.from);
  if (!client) return db.routeToAgent(msg); // unknown number

  const period = await db.openPeriod(client.id);
  const name = media.filename || `${msg.type}-${msg.id.slice(-8)}.${msg.type === 'image' ? 'jpg' : 'bin'}`;
  const target = path.join('/data/clients', client.folder, period, 'received', name);

  await fs.mkdir(path.dirname(target), { recursive: true });
  await fs.writeFile(target, await downloadMedia(media.id));
  await db.logDocument(client.id, period, target, msg.id);
}

After saving, reply inside the window confirming receipt (“We received 3 files for period 09/2026”). That reply is a service message, and each number gets 1,000 free service messages per month (pricing page).

Two improvements that cut rework:

  • Identify the company. The same partner may own three companies. If the phone is linked to more than one, ask with an interactive list which one the files belong to.
  • Check the file. A blurry invoice photo is useless. An agent, or a document-reading routine, validates and asks for a resend when needed.

Sensitive data, LGPD and WhatsApp policy

Accounting documents carry personal and financial data. Three precautions:

  • WhatsApp policy. The WhatsApp Business Messaging Policy asks businesses not to share or ask people to share full payment card numbers, financial account numbers, national identification numbers or other sensitive information. For passwords, digital certificates and bank details, use a secure portal and send only the link.
  • Right person. Confirm the phone belongs to someone allowed to receive that company’s slips. A change of partner or finance contact must update the record.
  • LGPD. Processing this data is subject to Brazil’s data protection law (Law 13,709/2018), with a defined legal basis, purpose and retention period. See LGPD and WhatsApp; this article is not legal advice.

Also turn on two-step verification for the number and control who has access to the Meta business portfolio. Our article on business account security lists the key points.

Organizing support

Firms serve dozens or hundreds of companies with a small team. With the API, everyone works on the same number through a support tool, with queues per client portfolio. See multiple agents on one number. The “Recebi” (received) and “Tenho uma dúvida” (I have a question) buttons help the queue: the first only logs the confirmation, the second opens a ticket for the responsible accountant.

How to do it with Vectalk

Vectalk is a proxy for Meta’s official WhatsApp Cloud API: document templates, sending via POST https://apis.vectalk.com.br/api/messages and webhooks follow Meta’s payloads. The documentation covers sending documents, media upload and media download. Meta’s charges come on your Vectalk invoice, with no card registered at Meta, and coexistence keeps the number on the WhatsApp Business app. Sign up at apps.vectalk.com.br/register.

Frequently asked questions

Is sending a tax slip a utility template?

It tends to be, when the text carries only slip data (company, period, amount, due date) and does not offer services. Meta may recategorize it if there is promotional content.

Can I send the slip as a link instead of an attachment?

You can, but the attachment is better: the client opens it without leaving the chat, and you do not leave a tax document on a public link. If you use a link, prefer a portal with login.

How long can I download a document the client sent?

A media ID received by webhook can be downloaded for 7 days, and each download URL lasts 5 minutes. Download as soon as the webhook arrives.

Do I need one template per type of slip?

Not necessarily. One template with variables for slip type, company, period, amount and due date covers most taxes. Create separate templates only when the text really changes.

Can the accountant reply from their phone?

Yes. With coexistence, the number stays on the WhatsApp Business app while the system uses the API.


Official sources consulted on October 25, 2026: Template categorization, Utility templates, Cloud API media, Pricing, WhatsApp Business Messaging Policy, Get opt-in for WhatsApp, Vectalk documentation.

Put your business on the official WhatsApp

Create your account, connect your number to the official API (you can keep the app with coexistence) and start serving customers and sending messages.