An operator's account of the eSIM faults that never raise an error: every status code success, every dashboard green, and the device still offline.
Profile delivery and profile enablement are two separate axes, and most provisioning tooling collapses them into one. That gap is behind most "my eSIM is not working" reports on the consumer side, and the same state-model trap sits inside an SGP.32 fleet health check. Instrument enablement and consumed data, not installation.
This is a contributed article by Marc González Sáez, who runs PuraSIM, a travel eSIM retailer. It contains no product claims and no comparisons with other providers. It is a write-up of failure modes observed while operating a consumer eSIM provisioning pipeline.
The eSIM architecture is now well documented. What is far less documented is the set of eSIM provisioning failures that appear once the system is live: not protocol errors, which are the easy ones, but the cases where every component returns success, every dashboard is green, and the device has no connectivity. IoT Portal's own guide to SGP.22 vs SGP.32 lays out the components clearly: SM-DP+ stores and delivers profiles, IPA installs and controls them on the device, and eIM decides what should happen across the fleet. This is about what happens when that clean model meets a real customer and a real handset.
This article looks at that gap from the consumer side of the fence. PuraSIM sells travel eSIMs to end users: an order is paid, a profile is requested from a wholesale platform over its API, and a QR code is emailed out. It is SGP.22, retail volume, ordinary handsets, and no control over the device once it leaves. That last constraint is what makes the failure modes visible. An IoT integrator can open a shell on a router; we can only ask someone standing in an airport what their phone says. The patterns below have direct equivalents in SGP.32 fleets, and the last section covers why.
The mistake behind most eSIM provisioning failures: treating provisioning as one state
The single most useful thing to understand is that profile delivery and profile enablement are two independent axes, and most tooling collapses them into one.
The GSMA specifications are perfectly clear about this. A profile on an eUICC is Enabled, Disabled or Deleted. Downloading and installing a profile does not enable it. These are separate operations with separate results.
The problem is that commercial provisioning APIs sit on top of that, and their vocabulary is not the specification's vocabulary. The platform we buy from returns an order lifecycle with statuses along these lines:
| Platform status | What it actually means |
|---|---|
GOT_RESOURCE | A profile has been allocated to your order. Nothing has reached a device. |
RELEASED | The profile is ready to be downloaded. The QR code is valid. |
IN_USE | The profile has been downloaded and installed on a device. |
ENABLED / DISABLED | Whether the line is switched on. Reported separately. |
The two axes a provisioning API reports separately, and the combination that generates the support volume.
Read that table again with an operational eye. IN_USE is not a health indicator. It tells you an installation happened at some point. It says nothing about right now.
The combination that generates the most support volume is IN_USE plus DISABLED: the profile is installed on the handset, the customer can see the plan sitting in their settings, and the line is switched off. Consumption is at or near zero. From the operator's side everything looks like a completed, successful order. From the user's side there is no internet.
GOT_RESOURCE, by contrast, looks alarming and almost never is. It is the normal resting state of an order that has not been installed yet. We spent time treating it as a fault before working out that it is simply the beginning of the lifecycle.
The lesson generalises: any status field that describes an event that happened once should never be wired to an alert that implies a current condition.
Failure mode 1: installed and switched off
Installing an eSIM and activating a line are two actions, separated in the handset UI by several screens and, on some devices, by a plan-labelling step that users abandon halfway through. A profile that is downloaded but left disabled is not an error state anywhere in the stack. It is a valid, specified condition.
For a retail operation, this is the number one cause of "I have no internet". It is also the hardest to diagnose remotely, because the customer's honest description, "I installed it, it's right there on my screen", is true and points away from the actual problem.
What made it tractable was reading both axes on every enquiry, in this order:
- Is the profile installed at all? (
IN_USEor not) - Is the line enabled?
- Has any data been consumed?
Zero consumption with an installed profile is close to diagnostic on its own. If a profile has been installed for hours and moved no bytes, the line is off, roaming is off, or data is off, rather than a network fault in most cases.
A second-order failure came from our own code. We cached the last known profile state on the order record and read the cached value when a customer wrote in. When the cache was stale, support was reading a state that had been true yesterday and telling people to reinstall a profile that was working. A cached lifecycle state presented as current is worse than no state at all, because it is confidently wrong, and the advice it produces destroys a working installation.
Failure mode 2: the profile is fine and the phone says nothing
The second recurring pattern is a data-only profile behaving exactly as designed and the user reading the handset as broken.
A data-only profile has no voice or SMS registration. Depending on the handset, the OS version and which line is set as primary, the status bar can show no operator name and no bars while the data connection is working normally. A traveller who has spent twenty years reading signal bars as "connected" will report this as a dead SIM, and no amount of backend telemetry contradicts them, because the backend is right: the profile is enabled and passing traffic.
APN behaviour compounds it. The correct APN varies by destination and by the underlying operator the profile roams on, and a handset carrying over a manual APN from a previous SIM will attach and then fail to pass traffic, which looks identical to a coverage problem.
Neither of these is a bug. Both are cases where the user-visible signal and the system-visible signal disagree, and the operational answer is not better backend monitoring. It is telling the user in advance what the phone is going to look like.
Failure mode 3: the profile is perfect and the delivery is empty
Worth including because it is the easiest to miss and the most embarrassing.
For roughly two weeks our transactional emails went out with empty bodies. The QR code never reached anyone. Provisioning was flawless: profiles allocated, RELEASED, ready to install. The send API returned success on every call.
The cause was a line in the function that assembled the MIME message. It filtered out empty strings, which removed the mandatory blank line between headers and body required by RFC 5322 section 2.1. The base64 body was then parsed as a continuation of the header block and discarded. No component in the chain raised an error, because at every individual step nothing had gone wrong.
The generalisable point for anyone running automated provisioning: your success metric has to be end to end, and it has to be measured on the far side of every hand-off. "The API returned 200" is not delivery. In our case the only honest test was to send a real order to a real mailbox and read it back over IMAP, which is now what happens on a schedule.
What engineers actually search for
One way to check whether a topic is under-served is to look at what people type into a search box. The table below is UK search volume from Google's keyword planner data, pulled on 2 September 2026.
| Query | UK searches / month |
|---|---|
| esim not working | 320 |
| euicc | 140 |
| sgp.32 | 90 |
| iot esim | 90 |
| remote sim provisioning | 70 |
| sgp.22 | 40 |
| sm-dp+ | 30 |
| esim no service | 30 |
| esim data not working | 20 |
| esim qr code not working | 20 |
| esim provisioning | 10 |
| esim activated but no service | 10 |
| esim activation failed | 10 |
| esim apn settings | 10 |
| esim troubleshooting | 10 |
UK search volume, September 2026. Source: Google keyword planner data via DataForSEO.
The architecture terms are the ones the industry writes about. Added together, euicc, sgp.32, iot esim, remote sim provisioning, sgp.22, sm-dp+ and esim provisioning come to 470 searches a month in the UK.
The diagnostic phrases come to 430, and a single one of them, esim not working, accounts for 320 of that. The failure side of the subject is level with the entire architecture vocabulary combined, and almost all of it sits behind one plain-English query.
The trend is worth noting too. UK interest in sgp.32 has grown from around 40 searches a month in August 2025 to between 110 and 170 through mid-2026, so the architectural story is landing. Meanwhile esim not working has stayed flat and seasonal, peaking in the late-summer travel months at around 390.
Two conclusions follow. The industry is documenting the specification well and the field diagnosis badly. And the people hitting these failure modes are not searching for sm-dp+ when it happens; they are searching in plain language, which means the diagnostic content that would help them is not written in the vocabulary the specification uses.
Why this matters for SGP.32 fleets
The obvious objection is that a consumer retail operation and a managed IoT estate are different problems. They are. But the state-model failure is architectural rather than sectoral, and SGP.32 makes it more likely rather than less.
In SGP.32 the eIM is the orchestration layer: it assigns profiles, coordinates fleet-wide operator changes and applies policy. It is the component that answers "is the estate healthy?". That answer is only as good as the field it reads.
- If a fleet health check tests whether the operational profile was downloaded, it will report as healthy devices that are sitting on a bootstrap profile or on nothing at all. Download and enable are separate operations under SGP.32 exactly as they are under SGP.22.
- A profile switch event is not a connectivity confirmation. It may trigger a modem reset and network re-registration, and re-registration can fail for reasons that have nothing to do with the profile. The switch succeeding and the device being online are two different facts.
- On multi-profile devices, "which profile is enabled" is a question with a real answer that has to be read, not assumed. Only one profile can be active. The one you assigned is not necessarily the one that is running.
A fleet device does not ring support when its profile is installed and disabled. It leaves a gap in a time series that somebody notices later. The consumer case simply surfaces this faster: a retail operation gets an unhappy human within minutes of a state mismatch, while a fleet of environmental sensors in roadside cabinets gets a gap in a time series that somebody notices next quarter, and by then the useful diagnostic window has closed.
Instrument the axis you can act on, not the axis that is easy to read.
Installation is easy to read. Enablement and actual traffic are the ones that tell you whether anything works.
A short checklist
For anyone building on top of a provisioning API, consumer or IoT:
- Store the vendor's lifecycle status and the enablement status as separate fields. Never derive one from the other.
- Timestamp every state you cache, and refuse to display it as current beyond a defined age. Stale state produces confidently wrong advice.
- Treat consumed data as the primary health signal. It is the only field that cannot have registered unless everything else worked at that point in time.
- Alert on transitions, not on resting states.
GOT_RESOURCEis not an incident. - Test the full chain end to end, including the delivery mechanism, against a real endpoint you can read back.
- Document the failure vocabulary in the words your users will use, not the words the specification uses.
None of this is novel engineering. All of it was learned the expensive way, which is the only reason it is worth writing down.
FAQ
Are GOT_RESOURCE, RELEASED and IN_USE part of the GSMA specification?
No. They are order lifecycle statuses used by a commercial provisioning platform, sitting above the specification. The GSMA-defined profile states on the eUICC are Enabled, Disabled and Deleted. Confusing the two vocabularies is itself a common source of error.
Can a profile be installed and disabled at the same time?
Yes, and it is a perfectly valid state. It is also the single most common cause of a user reporting no connectivity while the provisioning system reports a completed order.
Why would a working eSIM show no signal bars?
A data-only profile carries no voice or SMS registration. Depending on handset and OS version, the status bar may show nothing while data is passing normally.
Does SGP.32 fix any of this?
It changes the architecture, not the underlying fact that downloading a profile and enabling it are separate operations. If anything, fleet-scale orchestration makes it easier to build a health check that reads the wrong field.
What is the single most useful field to monitor?
Data consumed. Everything else can be true while the device is offline.
Thanks to Marc González for sending this over. Most guest pieces that land in the inbox are specification summaries with a link bolted on the end. This is the opposite: an account of what eSIM provisioning looks like from the retail side, where you cannot open a shell on the device and have to work the fault out from what a customer standing in an airport can see on screen.
The point at the centre of it, that an installed profile tells you nothing about whether the line is enabled or moving traffic, is something plenty of IoT teams have learned the expensive way. The part worth carrying across is the translation into SGP.32: a consumer complains within minutes of a state mismatch, but a roadside sensor just goes quiet, and nobody looks until the useful diagnostic window has shut.
If you operate this kind of system and have field notes worth writing down, we would like to read them. Our submit page is open.
Peter Green, IoTPortal




