Skip to main content
Read this one first. Every other page assumes these words, and two of them are a deliberate departure from the configuration file’s own vocabulary.

Vendor and server

Vendor

A connection out to whoever carries your traffic. FireFlo dials it. Configuration calls it smppclient.

Server

A listener your customers bind in to. FireFlo accepts. Configuration calls it smppserver.
The configuration values stay smppclient and smppserver, and always will — they are what the gateway reads. They never reach the interface, and they are not used in prose on this site outside code blocks and key names.
This is where a Kannel or Jasmin background misleads. “Client” and “server” describe which end of a socket FireFlo is, which is an implementation fact. Vendor and server describe who is on the other end and who is paying whom — which is what you actually reason about when a message will not go out.The data layer agreed all along: cdr_submit.vendor and the delivery-receipt payload have always said vendor.
Both are workers, and share a set of base settings.

Account, login, product

One account, many logins. This is why the rate ceiling is keyed on the account rather than the credential — a per-login limit would let a customer raise their own by creating another login.
A product resolves, in order: the system_type on an SMPP bind, then the credential’s product field. HTTP callers have no bind, so the credential value is the only source.
An unset product is a supported state that can send messages for free. A message with no product is shown only the rate rules that themselves have no product, so on a deployment whose rules all carry one, it matches nothing and is charged nothing. See Limits for the two switches that close it.

Routing table, rule, chain, group

A routing table is a named list of rules, evaluated top to bottom; the first match wins. A rule’s target may be a worker, another table — which is a chain, and how [default] sends text messages into [MESSAGE] — or a group. A group is a set of vendors with a policy: round-robin, weighted or failover. It skips members that are suspended or not accepting, which is the failover a single-target rule cannot do. An LCR table is marked ->function(LCR) and inverts the usual rule: every matching rule is a candidate, and the cheapest vendor wins. Rule order is irrelevant there.

Filter

A named, reusable set of conditions, shared by routing and rating so the same predicate is not written twice.
A missing or disabled filter skips every rule that references it. It does not load the rule with fewer conditions — dropping a condition makes a rule match more, so failing that way would silently route or price the wrong things.

Scope and tariff

A scope is the left-hand side of a rate rule, and which side of the trade it is depends entirely on what it names: Nothing in the schema distinguishes them. The gateway tells them apart by which lookup asks, which is why the panel groups them as What we pay and What we charge rather than one list. A tariff is the set of price rules for one account.

Message, segment, part

A message is what a customer submits. Longer than one SMS, it goes out as several segments, and smsg.restapi.billing.units decides whether that is charged once or per segment.
Whatever the billing unit, a message leaves exactly one part_no = 1 row in cdr_submit. Retries do not add rows. That invariant is what makes counting messages and summing money the same question.

Prepaid and postpaid

Both refuse identically — 0x402 over SMPP, 402 with insufficientCredit over HTTP — so a customer’s integration never needs to know which it is on.
On a postpaid account, credit_limit = 0 means no credit, not unlimited. There is no representation of unlimited anywhere in the system, deliberately: a typo must fail closed.

Refusal

FireFlo refuses rather than guesses in more places than most gateways: an unmapped inbound message, a rule whose filter is missing, an import that would leave no usable credential, a purge over a day with no rollup. Where a page here says something is refused, that is the documented behaviour and usually exists because the alternative silently lost a message or some money. It is not a limitation waiting to be lifted.