Skip to main content
When a customer says their delivery receipts stopped arriving, the answer is usually already known to the gateway and simply not written down. smsg.diagnostics decides how much of it is.
Set it from the control panel: Configuration → Gateway → Diagnostics. No SQL, and it takes effect on the next configuration poll — no restart.

The three levels

problems is the level to run. It is the one that answers a support question without anybody having to switch something on first — which is the whole problem it exists to solve, because the moment you need the evidence is always after the thing happened.

Setting it changes nothing until you set it

smsg.diagnostics supplies the default for the two settings below. It does not override them. So an upgraded gateway with no level set behaves exactly as it did before, and an operator who had already tuned message.trace.mode keeps what they chose. The panel names any setting that is overriding the level, because a level that reads as in force while a key quietly outranks it is the one confusing state this arrangement can produce.

What it deliberately does not touch

No level here stores message content.smsg.cdr.body keeps customer message text. print.msgs logs phone numbers, message bodies and bind passwords. Both are decisions about retaining customer data, taken by operators in jurisdictions that answer that question differently — not dials for how much detail you want today.Raising a diagnostic level to chase a receipt must never begin retaining message content as a side effect, so neither is part of smsg.diagnostics. Set them on their own, deliberately, and turn them off again.

What problems records

Events land in cdr_event and appear on a message’s page under Customer exchange: Callback addresses are stored with the query string removed. A dlr-url routinely carries an API key, and these rows are widely readable, so the endpoint is kept as scheme, host and path and nothing else. No response body is stored at all.

registered_delivery, and the value that surprises people

A suppressed receipt is almost always this: 0x02 is the one that produces “we get some receipts but not others”. The receipt.suppressed event prints the stored octet so it can be read rather than guessed at.

Turning it up for one message

Then send the message, read the log, and put it back to problems. verbose logs every routing miss, submit response and enqueue — leaving it on is real write volume on a live gateway.