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.
Not the same as billing_issue
Section titled “Not the same as billing_issue”Two different bills, two different fixes:
| Code | Who is owed | Where you fix it |
|---|---|---|
subscription_inactive | Kirimdev | Billing → pay the outstanding invoice |
billing_issue | Meta (provider_code: 131042) | Meta Business Suite → add or repair the WABA payment method |
Retry behavior
Section titled “Retry behavior”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).
Dashboard Changed
Section titled “Dashboard ”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 →