A receipt never arrived. Where do I start?
A receipt never arrived. Where do I start?
In this order, because each rules out more than the next:
- Did you ask for one?
dlr: "yes"anddlr_url. Either alone does nothing. - Is your endpoint reachable from the gateway host — not from your laptop?
- Does it return 200–399? A
401behind an authenticating proxy is the commonest silent failure. Since 0.11 a302to a login page is a failure too and is retried; on earlier releases it counted as success and swallowed the receipt. - Is the vendor asked to produce receipts at all? If your provider has
request.dlrsoff for that vendor, nothing ever reports an outcome and every message settles asEXPIRED.
Can I get the same receipt twice?
Can I get the same receipt twice?
Yes. Delivery is at-least-once with 10 retries — if your endpoint is slow, times out, or returns a
5xx after doing the work, you will be called again.Make your handler idempotent on id plus level. Not on id alone: a message can legitimately
produce a level 1 and then a level 2 receipt, and de-duplicating on id would discard the outcome.Are receipts ordered?
Are receipts ordered?
No. A level 1 and a level 2 receipt for the same message can arrive out of order under retry, and
receipts for different messages have no ordering at all.Store the state you receive and let a level 2 win over a level 1 regardless of arrival order.
What does ACCEPTD mean? It sounds final.
What does ACCEPTD mean? It sounds final.
It is not.
ACCEPTD and BUFFRED are level 1 — progress, with another receipt to follow.This one has bitten real integrations: level used to always read 2, so a vendor’s ACCEPTD was
labelled as an outcome and receivers closed their records on it. If your integration predates that
fix, switch on level — or simply ask for dlr_level: 2, the default, which sends outcomes only.Why did I get EXPIRED rather than a failure?
Why did I get EXPIRED rather than a failure?
The message reached its validity deadline without any outcome being reported. Usually a handset that
was off or out of coverage for the whole period.But if every message on a route settles as
EXPIRED, that is not the handsets — it means nothing
is reporting outcomes at all, and your delivery rate is meaningless rather than zero.Why three receipts for one message?
Why three receipts for one message?
You sent three
submit_sm — a long message is split into segments and, by default, each gets its own
receipt quoting the id you were given for it.Your provider can collapse this to one. Every receipt reports the same outcome either way,
because segments are aggregated before any receipt is built.A long message says FAILED but the recipient got most of it
A long message says FAILED but the recipient got most of it
Resolution waits for the last segment and reports the worst outcome, not the first or the
majority. A message the recipient could not read in full is not a delivery.It is deliberate and it makes FireFlo’s delivery rates look lower than gateways that report the first
segment — worth knowing before you compare two providers on that number.
Why is there no error code on a failed receipt?
Why is there no error code on a failed receipt?
Because there is none to give. Jasmin sends an
err field; FireFlo’s resolver is handed only the
delivery state and never an error code, so emitting one would mean inventing it.stat distinguishes UNDELIV, REJECTD and EXPIRED, which is the information that actually
exists.Is a receipt recorded even if it is not sent to me?
Is a receipt recorded even if it is not sent to me?
Yes. Suppressing a receipt is a decision about what to tell you, never about what to record.
Outcomes land in the call record and progress receipts alongside them, and your provider can see both
on the message’s detail page along with what you asked for.So “I never got a receipt” is always answerable, even when no receipt was forwarded.
Can I see receipts without running an endpoint?
Can I see receipts without running an endpoint?
Yes — the customer portal shows your messages with their final state and lets you export them. An
endpoint is how you react in real time; the portal is how you check after the fact.