An account is refusing messages and has money on it
An account is refusing messages and has money on it
smsg.balance.block.min.messages exists to prevent.A top-up did not arrive
A top-up did not arrive
account_balance row. A RECHARGE for such an account credits
nothing, stays pending, and applies itself the moment the row appears — with a WARN naming the
account.Creating a credential does not create a balance row. Use Open for credit on the account page.Reconciliation says an account is out by exactly its consumption
Reconciliation says an account is out by exactly its consumption
credited − consumed = balance + reserved is wrong and fails
this way on every account.Consumption never touches the balance columns — reserved is a lifetime-consumed counter, not a
hold. The correct pair is:Credit is stuck in reserved after a crash
Credit is stuck in reserved after a crash
kill -9 strands it. balance + reserved is still conserved — the money is parked, not lost —
and POST /ops/credit/release returns it. A clean shutdown does this automatically.Traffic is being sent and nothing is charged for it
Traffic is being sent and nothing is charged for it
debug.Set the [*] scope. It prices any account with no rule of its own, including accounts created later,
and it is the single highest-value thing to configure on day one. Without it, this failure is silent
and cumulative.A vendor's margin shows as unknown rather than a number
A vendor's margin shows as unknown rather than a number
[*] default applies to price only, never to cost.If it defaulted on the cost side too, every margin would compute to zero rather than unknown, and
nothing would tell you a vendor had no rates.A postpaid account has stopped sending and is under its limit
A postpaid account has stopped sending and is under its limit
BILL row is the start of the unbilled window — closing is what returns headroom.Nothing is broken; the bill has not been cut.A refund landed after I closed the period. Do I reopen it?
A refund landed after I closed the period. Do I reopen it?
The purge refused to run
The purge refused to run
usage_daily row. That is a refusal of the whole run, by design — deleting an
unsummarised day destroys the consumption record permanently.Run fireflo usage rollup --catch-up, then purge. The two are separate commands deliberately: a
purge that quietly rolled up first would mean a rollup bug is discovered by the command that deletes
the evidence.Daily totals are off by a few hours of traffic
Daily totals are off by a few hours of traffic
FIREFLO_BILLING_ZONE. A billing day is a local day, and on UTC the last five and a half hours of
an Indian customer’s evening land on the next day’s line.Set it before the first rollup. Changing it afterwards means deleting and recomputing every day
already summarised.A message I know was sent appears in no list
A message I know was sent appears in no list
smsg.cdr.sink and the
gateway’s FIREFLO_DB_URL against the panel’s METRICS_DATABASE_URL before looking anywhere else.Revenue looks too high after a burst of vendor refusals
Revenue looks too high after a burst of vendor refusals
price,
cost and margin are null, because credit was returned at the moment of refusal.Every built-in revenue query sums those columns without an outcome filter, precisely so a refunded
message cannot overstate takings. A hand-written query treating NULL as zero breaks that.