Guides
Usage and billing
Who pays for what, how to read your usage, and what changes between sandbox and production.
Updated November 12, 2026View as Markdown
Bref Point Inbox always keeps two kinds of costs separate, on distinct lines.
| Who bills | What for | |
|---|---|---|
| Meta costs | Meta, directly to the owner of the WhatsApp account | Conversations: based on the message category and the recipient's country |
| Bref Point Inbox fees | Bref Point Inbox | Infrastructure: a subscription, and a fee per message beyond your plan's quota |
Bref Point Inbox does not rebill conversations. If you want your customer to pay through you, that is a commercial decision on your side: the owner of the WhatsApp account remains liable to Meta.
Read your usage#
curl "$INBOX_API/usage" \
-H "Authorization: Bearer $INBOX_KEY"const res = await fetch(`${process.env.INBOX_API}/usage`, {
headers: {
Authorization: `Bearer ${process.env.INBOX_KEY}`,
},
});
const data = await res.json();import os
import requests
res = requests.get(
f"{os.environ['INBOX_API']}/usage",
headers={
"Authorization": f"Bearer {os.environ['INBOX_KEY']}",
},
)
print(res.json())<?php
$ch = curl_init(getenv('INBOX_API') . '/usage');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('INBOX_KEY'),
],
]);
$data = json_decode(curl_exec($ch), true);{
"from": "2026-11-01T00:00:00.000Z",
"to": "2026-12-01T00:00:00.000Z",
"groupBy": "day",
"totals": {
"messages": 0,
"billableMessages": 0,
"notBillableMessages": 0,
"unpricedMessages": 0,
"metaCostEstimate": {},
"platformFee": {}
},
"buckets": [],
"metaCostIsEstimate": true
}Group results with groupBy: day (default), category, country or phone_number. The default period is the current month (UTC); from and to bound it.
{
"from": "2026-11-01T00:00:00.000Z",
"to": "2026-12-01T00:00:00.000Z",
"groupBy": "category",
"totals": {
"messages": 120,
"billableMessages": 100,
"notBillableMessages": 20,
"unpricedMessages": 0,
"metaCostEstimate": { "USD": 1.2 },
"platformFee": {}
},
"buckets": [ { "key": "utility", "messages": 100, "billableMessages": 100, "metaCostEstimate": { "USD": 1.2 } } ],
"metaCostIsEstimate": true
}| Field | Meaning |
|---|---|
billableMessages / notBillableMessages | Based on what Meta reports for each message (some messages, such as a reply within the service window, are not billed). |
metaCostEstimate | An estimate, per currency, computed with the rate card configured on the platform. Never the amount of your Meta invoice. |
unpricedMessages | Billable messages for which no rate is configured. They are never priced by guesswork. |
platformFee | Bref Point Inbox fees (overage beyond the included quota). Separate from the Meta cost, never added to it. |
metaCostIsEstimate | Always true: a reminder that the Meta cost is estimated. |
The country is inferred from the recipient's number; it can be inconnu.
Free trial#
Every new account gets a 7-day free trial, no credit card required, starting from its creation. During the trial, the Starter plan limits apply in production (2 numbers included, up to 5 numbers, 1,000 messages per number per month), and nothing is billed. The message quota is a cap during the trial: beyond it, sending is rejected (402 quota_exceeded) rather than billed. GET /billing/overview then returns trial (endsAt, daysLeft) and no monthlyAmount.
When the trial ends, the account reverts to the default plan, which is very limited, until the team activates a paid plan. The sandbox stays unlimited and free before, during and after the trial.
Your plan#
curl "$INBOX_API/billing/overview" \
-H "Authorization: Bearer $INBOX_SESSION"const res = await fetch(`${process.env.INBOX_API}/billing/overview`, {
headers: {
Authorization: `Bearer ${process.env.INBOX_SESSION}`,
},
});
const data = await res.json();import os
import requests
res = requests.get(
f"{os.environ['INBOX_API']}/billing/overview",
headers={
"Authorization": f"Bearer {os.environ['INBOX_SESSION']}",
},
)
print(res.json())<?php
$ch = curl_init(getenv('INBOX_API') . '/billing/overview');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . getenv('INBOX_SESSION'),
],
]);
$data = json_decode(curl_exec($ch), true);{
"plan": {
"id": "654e934f-a17e-4c05-8964-b1febb33b2b5",
"code": "free",
"name": "Gratuit",
"monthlyPriceAmount": null,
"currency": null,
"includedMessages": 100,
"hardMessageLimit": 100,
"maxConnectedBusinesses": 1,
"maxNumbersPerBusiness": 1,
"overageFeePerMessage": 0,
"logRetentionDays": 3
},
"period": {
"start": "2026-11-01T00:00:00.000Z",
"end": "2026-12-01T00:00:00.000Z"
},
"messages": {
"used": 0,
"included": 100,
"hardLimit": 100
},
"connectedBusinesses": {
"used": 0,
"max": 1
}
}The response contains the plan, the usage for the period, your numbers (connected, billed, included, cap) and the plan's monthly amount: the base price plus any additional numbers.
| Starter | Pro | Business | |
|---|---|---|---|
| Price per month | 5,000 FCFA | 10,000 FCFA | 30,000 FCFA |
| Numbers included in the price | 2 | 3 | 5 |
| Each additional number, beyond those included | 2,000 FCFA | 1,500 FCFA | 1,200 FCFA |
| Number cap, in production | 5 | 15 | 100 |
| Messages included per month and per number | 1,000 | 10,000 | 35,000 |
| Platform fee beyond the included quota (excluding Meta's rate) | 1 FCFA per message | 0.5 FCFA per message | 0.25 FCFA per message |
| Log retention | 7 days | 30 days | 90 days |
An Enterprise plan (unlimited numbers, negotiated volumes, service commitment) is available on request. Details and current prices are on the pricing page; until online payment is available, paid plans are activated by the team. An account without a subscription stays on a default plan that is very limited.
Example: on Starter with 3 numbers connected in production, the monthly amount is 5,000 + 1 × 2,000 = 7,000 FCFA (2 numbers are included), and the message quota is 3 × 1,000 = 3,000 per month. This amount is an estimate based on your connected numbers: it does not include Meta's fees.
- The billing period is the UTC calendar month.
- The sandbox is neither limited nor billed, whatever the plan, and does not count toward your numbers.
- Reaching a cap returns
402 plan_limit_reached(a new number beyond the tier's cap) or402 quota_exceeded(sending, for a plan with a hard cap), with a message stating the limit and your usage. - Messages beyond the included quota are billed at your plan's per-message fee, on the
platformFeeline, separate from the Meta cost.
About payments#
Online payment for subscriptions is not yet available in the console: plans are assigned by the Bref Point Inbox team.