← All posts March 2026

Why BSS order fallout is almost never where you think it is

Every operator blames provisioning when order fallout spikes. After 18 years in BSS, it’s almost never provisioning. Here’s where the root cause actually lives.

When order fallout spikes, there’s a reliable sequence of events inside any operator’s IT department. The operations team raises a ticket against provisioning. The provisioning team pulls logs, finds nothing wrong on their end, and escalates back. The CRM team says their handoff was clean. The middleware team says they delivered the message. And the orders sit in an error queue while everyone waits for someone else to own the problem.

I’ve seen this pattern at operators across the GCC and South Asia. The instinct is almost always the same: provisioning must be the issue, because that’s where the order dies. But that’s the wrong question. The right question is: what happened in the 200 milliseconds before provisioning received the message?

The three places fallout actually originates

After working through BSS environments at Mobilink, Zain KSA, and several multi-vendor programmes across the region, the root cause almost always sits in one of three places — none of which is provisioning itself.

1. Race conditions at the CRM-to-middleware boundary

The CRM sends an order event. A separate CRM process updates the same customer record 40 milliseconds later — a contact update, a billing address change, anything routine. The middleware receives the order event but by the time it enriches the payload with customer data, it’s reading a partially-committed record. The enriched message is now internally inconsistent, and provisioning correctly rejects it.

Nobody is wrong. Every system did exactly what it was designed to do. But the interaction between systems under load produced an invalid message. This only surfaces above certain transaction volumes — which is why you can’t reproduce it in your test environment.

2. Silent schema drift in integration contracts

Six months ago, someone added a new product attribute to the CRM. The field was added to the UI and to the database. It was not added to the integration contract between CRM and middleware. For orders that include this product, the middleware silently drops the field. Provisioning receives an incomplete payload and — depending on how strict the validator is — either rejects it or provisions incorrectly.

The integration contract was never a living document. Nobody owned it. Nobody versioned it. It drifted silently every time either system changed.

3. Retry logic that creates duplicate state

The middleware has a retry policy: if provisioning doesn’t acknowledge within 30 seconds, retry. The problem is that provisioning did receive the message, began processing it, and then hit a transient database lock. It never sent the acknowledgement. The middleware retries. Provisioning now has two instances of the same order in flight. The deduplication logic either fails or produces a race condition, and the order ends up in an error state that no automated process can resolve.

The fix requires both a provisioning-side idempotency key and a middleware-side deduplication check. Implementing one without the other makes the problem intermittently worse.

Why teams keep blaming the wrong layer

Each system has its own logging. Each team reads its own logs. The CRM team sees a clean outbound message. The middleware team sees a clean relay. The provisioning team sees an invalid inbound message and a rejection. From provisioning’s perspective, the message was bad — which is true. From everyone else’s perspective, they did their job — which is also true.

The problem is that no single team has visibility across all three boundaries simultaneously. You need a cross-system trace that correlates events by order ID across all three systems, with timestamps precise enough to surface the sequencing issue. Most operators don’t have this. It has to be built temporarily to diagnose the problem.

What the diagnostic actually looks like

In practice, a triage sprint for order fallout starts not with logs but with questions. At what transaction volume does fallout start appearing? Is it correlated with specific product types, customer segments, or time of day? Does it happen more on days when batch jobs run?

The answers almost always narrow the root cause to a specific interaction pattern before I’ve seen a single log line. Then the cross-system trace confirms it.

The diagnosis typically takes less than two weeks. The fix, once the root cause is clear, is usually straightforward — not because the problem is simple, but because once you know exactly what’s happening at the boundary, the remediation becomes obvious. The hard part was finding it.

If your team has been circling the same order fallout problem for more than a few weeks, the issue almost certainly isn’t in the system everyone is looking at. It’s in the space between systems that nobody owns.