Skip to main content
A message too long for one SMS becomes several. This page is the whole contract.

There are two segment counts, and confusing them causes most questions

A message can arrive as three and leave as three without those two 3s being related: FireFlo reassembles what the customer sent, then splits the whole body again for the carrier using that carrier’s encoding.

How a customer sends one

Two ways, both accepted and treated identically.
Set the UDHI bit — esm_class bit 6, 0x40 — and prefix each short_message with a concatenation header: 8-bit 050003 RR TT SS or 16-bit 060804 RRRR TT SS.
A single submit_sm cannot carry more than one segment. short_message is capped at one segment’s worth, and a longer body is refused with ESME_RINVMSGLEN rather than truncated.Send several PDUs, or use the HTTP API — which takes a body of any length and splits it for you.message_payload has the same cap, and setting both it and short_message is refused outright with ESME_ROPTPARNOTALLWD.

How many ids the customer gets

One message_id per submit_sm. A three-segment message gives three, seconds apart. All of them resolve. query_sm, the control panel and the customer portal each accept any id the gateway issued and return that one message. Only the first is the id the message is filed under, so the panel says which part you asked about when they differ.

How many receipts

Set by conf.dlr.multipart on the listener: Every receipt reports the same outcome, because the outbound segments are aggregated before any receipt is built. all is what this gateway has always done, so an upgrade changes nothing; the other two exist for aggregators expecting one message in and one receipt out.

The outcome is the worst segment, not the first

If any segment fails, the message is FAILED. Resolution waits for the last segment and reports the worst.That is the honest answer — the recipient did not receive a readable message — and it moves delivery-rate figures down relative to gateways that report the first segment. Worth knowing before comparing this month with last.

What it costs

smsg.restapi.billing.units decides whether a multipart message is charged once or per segment.
Set to message, a customer sending three-segment traffic pays for one and you pay your carrier for three. segment is the default for that reason.A message stays within one segment at 160 characters of plain GSM text, or 70 if it contains any character outside that set — an emoji, or a curly quote pasted from a word processor, halves the limit for the whole message.

Limits

An incomplete set at the timeout is logged as message.parts.incomplete. Content whitelisting still applies on the timeout path, so what does go out is checked.
Reassembly is per JVM. On several instances sharing customers, segments arriving on different instances never reassemble — see Clustering for what that costs.