Skip to main content

MCCMNC overrides

An MCCMNC override is a fixed per-carrier SMS rate for one mobile network (the MCC/MNC pair that identifies an operator, such as 26201 for Deutsche Telekom). When an override exists, the pricing resolver applies it verbatim — no markup is layered on top, and it beats every markup-based rule on the pricing-rate-resolution precedence. That makes it the right tool for negotiated pricing: a specific carrier pricing exception, a corrected price for a remote-region network, or an enterprise contract rate that must hold per message, per carrier. The dashboard surface is Billing → MCCMNC Overrides at /billing/mccmnc-overrides (the older /settings/billing/mccmnc path redirects there). The page lists every override you have published, supports search and country filters, and offers CSV import/export for bulk edits. It is role-gated to owner and admin.

1. What an override is — and when you need one

Each override binds one mobile network to one fixed customer-facing price: a (network, rate per unit, currency) triple, optionally with an effective window. The base SMS rates card is computed from operator cost plus markup — either your organization’s markup or the platform default. An override short-circuits that math for the networks you name: the resolver looks the override up first, and only when no override row exists for that network does it fall back to the markup-based price. Reach for an override when:
  • A carrier agreement gives you a negotiated per-message price for a specific network, and the markup-computed price would misstate it.
  • A network in a remote region prices wrong under the default card and you need to correct it per operator.
  • An enterprise customer needs a fixed rate quote that stays stable while the underlying cost moves.
Do not use an override to set a free rate — the form rejects rates at or below zero, because a zero-priced override would emit zero-cost sends and obscure the spend miss.

2. Add or edit an override

Open Billing → MCCMNC Overrides and choose Create override, or pick the edit (pencil) action on an existing row. The form runs in two steps so a rate change is never committed from the edit fields alone:
  1. Edit fields — in create mode, pick the country, then the network from the filtered list (or type the 5–6 digit MCCMNC code directly), and set the rate and currency. In edit mode the network is locked and only the rate, currency, and effective window can change. Review change advances to the review step without writing anything.
  2. Review and apply — the review step shows the exact change (the current → new rate for edits, the new rate for creates), requires a reason for the change, and requires you to confirm you have reviewed the billing impact. Apply rate change stays disabled until both hold. The reason is recorded to the audit trail alongside the old and new rate, so every change carries a who/why record.
On create, the network code is normalized to the canonical zero-padded form (MCC + MNC padded to three digits each), so the resolver’s lookup key always matches what you entered. Deleting or applying a change invalidates the cached override immediately — the next send priced after the write resolves on the new value, not after a cache TTL. For bulk work, the page header’s Import CSV button upserts a sheet of (network, rate, currency) rows through the same review-and-apply gate, and Export CSV downloads the currently visible (filtered) rows in the same column shape, so an export → tweak → re-import round-trip is clean.

3. Remove an override

Choose the delete (trash) action on a row and confirm in the dialog. Deletion reverts the network to its markup-computed price from this point on — pricing resumes resolving under your organization’s markup or the platform default. Because the delete is a pricing change, it is recorded and the confirmation dialog states the revert explicitly. A failed delete (a permission rejection or a network error) surfaces an error toast rather than closing silently, so the row you still see is a row that still exists. Only owner and admin roles can create, edit, export, import, or delete overrides — the page and the API both gate on those roles.

4. Read the effect on delivered pricing

Before you commit an override, check what the customer-facing price becomes:
  • The SMS rates card under Billing (GET /api/v1/pricing/mccmnc-rates) lists one row per operator with a pricing_source label: absolute_override when a verbatim override supplies the price, org_markup or default_markup when a markup rule does, and null when no published rate exists. A row labeled absolute_override shows exactly the override rate — no markup on top.
  • The review step of the create/edit dialog shows the from → to diff before you apply, and the resolver treats the cached value as invalidated the moment the write lands, so the next send prices on the new number.
  • For a what-if check across your whole card, the what-if pricing simulator replays your recorded usage through a candidate card and returns the per-lane delta — run it when a carrier exception touches a high-traffic destination.
Delete an override and the row falls back to org_markup or default_markup; there is no forced cache wait between the write and the next priced send.

5. Troubleshooting

These are the failures you can actually hit:
  • “No MCC/MNC networks are loaded yet” — the form offers no networks to pick, so it cannot accept a submit. Retry; if the list never loads, contact support before attempting the change.
  • “Pick a network or enter a 5–6 digit MCCMNC” — free-typed codes must be 5–6 digits; the canonical form zero-pads the MNC, so a two-digit MNC is fine as long as the full code is 5–6 digits.
  • “Enter a reason / confirm the billing impact” — the apply button is gated on both. A change with no stated reason is rejected, by design.
  • Role rejection on write — if you are not an owner or admin, create/edit/import/delete calls fail the role gate. Reads still work for any member, so a colleague with a lower role can view the list but not touch it.
  • A delete that “did nothing” — because of the explicit error surface, a rejected delete (for example a permission error) shows a toast and keeps the row; if the row is still there after a delete attempt, treat the delete as failed, retry, and check the toast message.

6. Example: a BYON travel scenario

Bring-your-own-number setups often price a travel SIM’s home network wrong when the markup default under- or over-charges a small carrier. Suppose a customer’s travel service runs on a specific carrier in a remote country, and their contract quotes 0.012 USD per message on that network — below what the markup-computed default would say.
  1. Open Billing → MCCMNC Overrides, choose Create override.
  2. Pick the country, select the carrier’s network from the filtered list (the MCCMNC code is shown beside the name), set rate 0.012, currency USD, and submit.
  3. On the review step, state the reason — “BYON travel contract — fixed carrier rate” — confirm the billing impact, and apply.
  4. Check Billing → SMS rates: the row for that network now shows pricing_source: absolute_override with your_rate: 0.012 — the verbatim rate, not the markup price.
From that point, every message to that network prices on the override until you edit or delete it.