Custos e consumo
Preço por mensagem entregue, franquia de serviço, consumo do mês e como aplicar o preço.
A Meta cobra por mensagem entregue do negócio para o contato; mensagem que não chega a delivered não é cobrada. O hub não calcula valor: repassa o que a Meta informa e conta o nível gratuito.
Campos de preço. O pricing do whatsapp.message.status (source: "meta") vem no sent e em um de delivered/read:
| Campo | Valores |
|---|---|
category |
service, group_service, utility, marketing, marketing_lite, authentication, authentication-international, referral_conversion, group_marketing, group_utility (como a Meta manda; trate valor novo como desconhecido) |
type |
regular (cobrada), free_customer_service (serviço 1:1 dentro do nível gratuito), free_group_customer_service (serviço de grupo dentro do nível gratuito) ou free_entry_point (grátis por estar numa janela de ponto de entrada gratuito); trate outro valor como desconhecido |
subtype |
paid_exempt para conta de governo ou sem fins lucrativos isenta |
billable |
Obsoleto na Meta; decida por type |
model |
Modelo de preço, como a Meta manda |
Observado em testes com o app real: reação enviada pelo hub recebeu só o status sent, sem pricing; texto, interativo e imagem vieram com category: "service" e type: "free_customer_service".
Nível gratuito de serviço. Desde 01/10/2026 a mensagem de serviço (resposta livre, sem template) volta a ser cobrada, com 1.000 mensagens de serviço entregues grátis por número por mês. Não acumula e vira à meia-noite no fuso da conta de mensagens na Meta. Template de utilidade dentro da janela de atendimento também passou a ser cobrado (type: "regular").
GET /v1/connections/:connectionId/usage → { "usage": { ... } }:
{
"month": "2026-10",
"timezone": "America/Sao_Paulo",
"limit": 1000,
"delivered": 812,
"free": 812,
"charged": 0,
"remaining": 188,
"exhausted": false
}
delivered: mensagens de serviço entregues no mês, cada uma contada uma vez (pelo primeirodeliveredoureadcomcategory: "service").freesão as detype: "free_customer_service",chargedas detype: "regular"; uma de serviço com outrotype(comofree_entry_point) conta emdeliverede em nenhum dos dois, entãodeliveredpode passar defree + charged.exhaustedficatruecom a primeira cobrada ou comfreeem 1.000;remainingé0quandoexhausted, senãolimit - free.- Mês. Vira à meia-noite no fuso da conta de mensagens, lido da Meta (
timezone, nome IANA); conta cujo fuso a Meta não informou usa o padrão do hub (America/Sao_Paulo). - Aproximação. Os status ficam 30 dias no hub: no dia 31 o primeiro dia do mês já pode ter saído e a conta fica menor que a real. A conta é por conexão, e a Meta conta por número: se o número veio de outro workspace no meio do mês, a contagem recomeça do zero aqui e o aviso de 800 pode não sair. Mensagem de serviço de grupo (
group_service) desconta da mesma franquia na Meta, mas não entra nesta conta. A fonte da verdade é a fatura da Meta.
O evento whatsapp.usage.free_tier avisa sem consulta:
{
"phoneNumberId": "109876543210987",
"month": "2026-10",
"timezone": "America/Sao_Paulo",
"level": "warning",
"limit": 1000,
"free": 800,
"charged": 0
}
level é warning ao chegar a 800 gratuitas e exhausted na primeira mensagem de serviço cobrada. Cada nível sai uma vez por número e mês.
Método de pagamento. Passadas as 1.000 gratuitas, sem método de pagamento válido a Meta não entrega mensagens de serviço. O envio recusado na hora sai failed com errorCode: "payment_method_required" (Meta 131042); recusado depois do aceite, o whatsapp.message.status failed traz 131042 em errors.
Janela de ponto de entrada gratuito (FEP). Quando o contato escreve por um anúncio Click-to-WhatsApp (Android/iOS) e o negócio responde dentro da janela de atendimento, a resposta é grátis e abre uma janela de até 7 dias em que marketing, utilidade, autenticação e serviço saem grátis (mensagem do Meta Business Agent continua cobrada). O hub lê o fim dela de conversation.expiration_timestamp (só vem no sent) e devolve em freeEntryPoint.expiresAt no GET …/windows. Ela só muda o preço: mensagem livre continua exigindo a janela de 24 h, e fora dela só template.
Consumo do mês. GET /v1/connections/:connectionId/consumption?month=YYYY-MM (sem month, o mês corrente; aceita o corrente e os 12 anteriores, no fuso da conta; fora disso, 400 CONSUMPTION_MONTH_OUT_OF_RANGE) → { "consumption": { ... } }:
{
"month": "2026-10",
"timezone": "America/Sao_Paulo",
"currency": "BRL",
"hub": [
{ "category": "marketing", "type": "regular", "delivered": 1 },
{ "category": "service", "type": "free_customer_service", "delivered": 1 },
{ "category": "utility", "type": "regular", "delivered": 1 }
],
"meta": {
"fetchedAt": "2026-10-23T18:06:32.265Z",
"items": [
{ "category": "MARKETING", "type": "REGULAR", "country": "BR", "tier": "0:MAX", "volume": 1 },
{ "category": "SERVICE", "type": "FREE_CUSTOMER_SERVICE", "country": "BR", "tier": null, "volume": 1 },
{ "category": "UTILITY", "type": "REGULAR", "country": "BR", "tier": "0:250000", "volume": 1 }
]
}
}
hub: contado dos status de entrega desta conexão, cada mensagem uma vez (pelo primeirodeliveredoureadcompricing), porcategoryetypecomo o webhook manda (minúsculas). Só o que passou pela conexão, e só 30 dias (retenção dos status).meta: opricing_analyticsda Meta para o número da conexão, lido todo dia às 6:00 (mês corrente e anterior), por categoria, tipo, país e faixa de volume, como a Meta manda (maiúsculas;AUTHENTICATION_INTERNATIONALcorresponde aauthentication-internationaldo webhook). Inclui o que o hub não vê (mensagens mandadas pelo app no Coexistence). A Meta avisa que o dado é aproximado e pode diferir da fatura. Número que veio de outro workspace do hub mostra só a partir do dia seguinte ao da troca.nullantes da primeira leitura.tier(<inferior>:<superior>, ounullem mensagem grátis) é a faixa de volume do par país e categoria: existe só para utilidade e autenticação; marketing vem0:MAX. A faixa não chega pelo webhook.currencyé a moeda de cobrança da conta na Meta (nullenquanto a Meta não informa).- O preço é do app. O hub não lê o custo em dinheiro: o token da conexão lê o volume, mas a Meta recusa o custo (permissão). Para estimar, multiplique cada linha de
meta.itemscomtype: "REGULAR"pelo preço da tabela da Meta para o país, a categoria e a faixa, na moeda da conta; os tipos grátis valem zero. A tabela muda só no início de cada trimestre (1º de janeiro, abril, julho e outubro), com aviso de 1 mês.
Como gastar menos.
- Uma mensagem em vez de várias: cada balão entregue conta. Junte o texto que sairia em sequência.
- Mídia com
captionem vez de mídia seguida de texto. - Resposta de agente de IA num balão só, sem quebrar em frases.