Skip to main content
Back to blog

How SMS pricing really turns from a destination MCC/MNC code

International messaging rate cards are indexed by the pair of codes that identify the destination operator — MCC for the country, MNC for the network. How Devotel Orbit prices cross-border sends per-operator from its wholesale rate sheet, why a markup you didn't set changes that number, and how to publish exact per-carrier pricing to your own end customers when resellers need customer rates for the same carrier rate.

Orbit Editorial Team

Cross-border SMS pricing on a platform that routes by operator is never "a flat international price." The destination's identity — its Mobile Country Code (MCC) and Mobile Network Code (MNC), the two codes that together form the MCC/MNC pair that identifies every carrier on the planet — also sets what the carrier charges to terminate there. Devotel Orbit terminates outbound SMS on its own wholesale softswitch, and the rate the carrier publishes for that route lives in Devotel's own rate sheet, one row per operator. This guide explains the pricing resolution pipeline for international messaging — the order the system checks overrides before it gets to a price — and the operator's checklist for managing the three layers (carrier rate sheet, markup, per-carrier override) without leaking margin.

What MCC and MNC actually identify

Every mobile network worldwide carries a three-digit MCC identifying the country and a two-digit (sometimes three-digit) MNC identifying the network within it. The destination number's prefix resolves down to one of these pairs, and the pair decides the carrier that has to terminate the message — and therefore the price of termination.

  • MCC — Mobile Country Code. A three-digit number assigned by the ITU. France is 208, Turkiye is 286, the US (which has multiple country codes reserved) usually takes 310-316. The MCC decides which national numbering plan the destination belongs to.
  • MNC — Mobile Network Code. Two or three digits, assigned by each national regulator. Within the United States, 310/270 (T-Mobile) and 311/480 (Verizon) are different networks with different terminal economics.
  • The MCC/MNC pair. Usually written as one five- or six-character string — 28601 for Turkcell, 23415 for Vodafone UK, 310270 for T-Mobile US. The destination prefix lookup collapses to exactly one pair, and that pair is the pricing and routing key the pipeline works on.

Step 1 — the Devotel rate sheet: one price row per operator

Devotel operates its own wholesale softswitch, and the wholesale rates it buys termination at land in a rate sheet with explicit rows per operator. Each row carries: the MCC/MNC pair it prices, the per-unit cost of message termination on that route, the currency, the network provider on the route, and the message channel (sms or voice). Rows are keyed on pair + provider + channel, so the same operator on different upstream legs (with different economics) stays two entries instead of one mashed average.

The rate resolution pipeline starts from the delivery pair and returns the cost on that exact route. When a destination resolves to no pricing row at all, an under-billing alert fires immediately — that's what keeps "so we under-billed all day and only noticed at month close" from happening. This rate sheet underpins every international pricing quote that customers see.

Step 2 — the markup layer, the 20% default that surprises nobody

The shipped price is cost times the tenant's markup layer: for any organization without a custom markup, the platform applies a global default (paired with the admin pricing screen where that percentage reads back explicitly) — currently 20%, set by the pricing team. When an organization overrides its channel markup to, for example, 30% globally, every MCC/MNC in that channel moves up or down by that exact preference shift; the base cost stays from the carrier row, never re-bundled.

The surprise happens when a tenant assumed their numbers were post-paid-for-billing-platform pricing rather than markup-on-cost pricing. The admin pricing screen publishes the global default markup alongside any org-specific override, so which value applies to a given account is a two-second lookup, not a month-end reconciliation exercise.

Step 3 — per-carrier overrides, when resellers need customer rates

Resellers publishing pricing to their own end customers often can't expose markup-on-cost as their commercial model — their contract promises a fixed customer rate per operator. For that case the pipeline reads a third layer: an organization-scoped override for a specific MCC/MNC pair, stored as an exact per-unit customer price that survives rounding.

The lookup precedence is strict:

  1. If a (organization, MCC/MNC) override row exists, use it verbatim — the rate was fixed commercially and reads back as exact end-customer pricing.
  2. Otherwise, cost from the rate row times the organization's markup (or the platform default) — cost × (1 + markup).
  3. Only when the rate row is empty does the pipeline look at a flat price from the channel card — and that fallback raises the under-bill alert so an empty route never lasts a day.

Now ACME's customers see "0.045 USD per SMS to Turkcell (28601)" — a commercial promise — while ACME's reselling economy stays transparent to the platform.

Practical checklist: managing changes without leaking margin

  1. Coverage before you sell a price. The pricing surface will never let an override sit on a destination with no wholesale row; publish target-country rate coverage first, then sales commitments.
  2. Directional overrides, scoped. An override for ACME-28601 is exact and never leaks into another organization's pricing — the override key is org-scoped, not global.
  3. The fallback is never silent. An unpriced routing pair triggers the under-bill alert at detection time — treat that alert as hard-no-go, fix coverage, and review the alert dashboard it renders from the billing channel.
  4. Voice pairs, same pipeline. The rate sheet prices sms and voice channels with separate billing increments (per-minute, per-six-second) per row; the voice resolution consumes the same precedence, markups, and per-carrier override semantics as the SMS route.

Frequently asked questions

How does the pipeline arrive at a destination MCC/MNC pair?

The destination number's prefix lookup collapses to one (MCC, MNC) pair before pricing begins; the pair then feeds the rate-resolution pipeline and drives both the carrier assignment and the price. Route-quality and pricing stay operator-specific — the same MCC/MNC pair is both the routing key and the cost key.

What do resellers override: markup or per-carrier rates?

Both, depending on scale. Small resellers generally adjust their global markup, then patch the specific operators where they promised fixed pricing to end customers via a per-carrier override. Global markup and per-carrier override cache independently — a change in one never invalidates the other.

Why the 20% default, and why is the route-quality checker central?

The default ships so an account without configured pricing still prices correctly; the pricing console publishes it explicitly so no tenant is surprised. The route-quality page (Messages → Settings → Route quality) continuously judges each operator by delivery rate, latency percentiles, and grey-route suspicion — and the same route-evaluation pipeline is where under-bill alerts light up.

Does a route override replace choice-of-provider routing?

Overrides are pricing; routing still runs through the normal provider hierarchy. A per-carrier override row never re-wires a route — it pins the exact end-customer price while the route-selection logic decides who terminates that pair, usually on the carrier that published the MCC/MNC row.

How SMS pricing really turns from a destination MCC/MNC code — Orbit by Devotel