Skip to content

A past-due subscription no longer reports itself as a quota problem

Released: August 1, 2026

subscription_inactive on failed messages Added

Section titled “subscription_inactive on failed messages ”

When a Kirimdev subscription is expired, canceled, or past due, every quota on the account resolves to zero and outbound sends are refused before they reach Meta. Until now that refusal was reported as:

{
"status": "failed",
"error": {
"code": "invalid_request",
"message": "Monthly message quota exceeded for this organization.",
"provider_code": null
}
}

Both halves were misleading. invalid_request reads as “your payload is malformed”, and the message pointed at a monthly allowance that was in fact untouched — on the 1st of the month the counter had already reset and sends still failed, because the limit was zero, not the usage.

Failed messages from this cause now carry a code of their own:

{
"status": "failed",
"error": {
"code": "subscription_inactive",
"message": "Subscription is not active (expired or past due). Settle the outstanding invoice to resume sending.",
"provider_code": null
}
}

provider_code is always null — the request never leaves our infrastructure.

This is the same code the synchronous API already returns as HTTP 402 when a lapsed subscription blocks a write, so one branch in your code now covers both the immediate rejection and the asynchronous message failure.

Two different bills, two different fixes:

CodeWho is owedWhere you fix it
subscription_inactiveKirimdevBilling → pay the outstanding invoice
billing_issueMeta (provider_code: 131042)Meta Business Suite → add or repair the WABA payment method

subscription_inactive is terminal until someone pays. Backoff will not clear it, so treat it as an alert rather than a retry: every attempt fails identically while the subscription is lapsed.

Genuine quota exhaustion is unchanged — it still returns invalid_request with the monthly-quota message, and still clears at the start of the next calendar month (UTC).

A message that failed this way used to show the badge “Permintaan tidak valid” with the quota text underneath. It now reads “Langganan belum aktif” and tells the operator to settle the invoice, so the message is no longer mistaken for a malformed request or a limit that will lift on its own.

Broadcast recipients failed by the same gate now record the reason too; previously the code column was left empty, which hid the cause from the admin failed-messages view.

Handling failed sends →