dlr_url, and MO messages out to a forward.mo.url —
share one delivery mechanism, so they share these rules.
The two rules that decide everything
A receipt never arrives
1
Was a dlr_url supplied at all?
Over HTTP it must be present and URL-encoded, and
dlr must be yes. Setting one without the
other does nothing.2
Is the endpoint reachable from the gateway host?
Not from your laptop — from the host or container the gateway runs on. Egress policy, split DNS
and private subnets all bite here.
3
Does it return 200–399?
A
401 behind an authenticating proxy is the commonest silent failure. Since 0.11 a 302 to a login
page, which does count as success and swallows the receipt.4
Did the gateway log the failure?
Forwarding failures and retries are logged. Ten quiet attempts mean the endpoint answered.
5
What did their endpoint actually say?
Open the message in the control panel and read Customer exchange. Each callback attempt is a
row carrying the endpoint, the try number, how long it took and the status.To see the answer itself rather than only its status code, set
smsg.cdr.events.response = excerpt and reproduce. The Response cell then expands to the first 500 characters the
endpoint returned, which is where a 401 behind a proxy stops looking like a 401 from the
application.The placeholder trap
Inkannel format, the callback is a bare GET with placeholders substituted — nothing is
appended.
MO forwards never arrive
MO callbacks arePOST, and the same 200–299 and retry rules apply.
forward.mo.urlis set on the SMPP client worker receiving the MO — not on the listener, and not globally.forward.mo.formatisJSONorFORM.- The URL may carry placeholders, URL-encoded before replacement:
Receipts that arrive but say the wrong thing
Not a delivery problem, and worth ruling out before you go looking at the network:request.dlrsis off on the vendor. Every message then settles asEXPIREDat the deadline, because nothing ever reports an outcome. The delivery rate becomes meaningless rather than zero — which is worse, since a zero looks like a problem and a meaningless number looks like data.- A level 1 receipt is not the outcome.
ACCEPTDandBUFFREDboth arrive as level 1 and another receipt follows. A client that treats the first receipt as final will report the wrong thing forever. - Three segments, three receipts.
conf.dlr.multipartdefaults toall, so a customer gets one receipt persubmit_smthey sent.firstorlastcollapses that to one.
Related
Delivery receipts
The payload, the levels and how to correlate.
Receipt quality
Reported rate against delivery rate.