Open a wallet pass and you see fields: a points balance, a tier name, maybe an expiry date. To you, those are obviously a balance, a tier, and a date. To the phone, without help, they are just strings of text sitting on a colored rectangle.
Semantic tags are that help. On Apple Wallet, a pass can carry a semantics dictionary alongside its visible fields, a structured layer that tells iOS what each piece of data actually means: this number is a balance, this string is a membership tier, this timestamp is when the event starts. The customer never sees the semantics layer directly. The operating system does, and that changes what the pass can do.
From display to meaning
A pass without semantic data is a picture the phone renders faithfully. A pass with semantic data is something the phone understands.
Take a loyalty pass showing "1,240 points". As plain text, that value can only ever be displayed. Tagged semantically as a balance, it becomes data the system can reason about: iOS knows it is a quantity, knows its unit, and can surface it in system contexts beyond the pass face. The same goes for a tier name tagged as a membership level, or a date tagged as an expiry.
The pattern repeats across pass types. Event tickets carry semantics for venue, seat, and start time. Boarding passes carry departure gates and times. Loyalty and membership passes carry balances, tiers, and program names. In every case the visible field and the semantic tag describe the same fact, once for the human and once for the machine.
What the machine does with meaning
Meaning is what lets the system be helpful on its own initiative. Semantic data feeds the intelligence features Apple builds into iOS: suggestions that surface the right pass at the right moment, richer previews when a pass appears in search or on the lock screen, and system experiences that read details straight from the pass instead of asking the customer to open it.
This matters because the wallet's whole promise is being there at the moment of use. A pass the system understands gets surfaced when its moment arrives. A pass the system cannot read is just another item in a stack, waiting for the customer to remember it exists.
Each iOS release tends to lean on this layer a little harder. The features change year to year; the prerequisite does not. Passes that carry rich semantic data inherit new system behaviors as they ship. Passes that carry only display text are left out, and nothing about them looks wrong, which is exactly why the gap goes unnoticed.
Why most passes ship without them
Semantic tags are optional. A pass renders perfectly well without a single one, and nothing in the wallet flags their absence. So under deadline, they are the first thing an integration skips, and because the pass looks finished, nobody goes back.
There is a second reason the gap persists: tags are only useful if they stay correct. A balance tagged semantically is a promise that the tagged value is the real balance, which means the semantic layer has to be updated every time the visible field is. For a team hand-building passes, that doubles the maintenance surface of every field. Skipping the layer starts to look less like an oversight and more like a rational response to owning the plumbing yourself.
The result is a quiet quality divide: passes that look identical on the surface but differ completely in what the platform can do with them. It is the kind of gap you only notice when a competitor's pass shows up on a customer's lock screen at the right moment and yours does not.
Google Wallet approaches the same idea through its own model, with structured class and object fields rather than a semantics dictionary, and the two platforms reward the same discipline: describe your data properly, once, and let each wallet make the most of it.
What this means if you run a pass program
Semantic tagging is not a feature you should have to think about. It is plumbing, and the right place for plumbing is inside the platform. On Stell, passes carry the semantic data appropriate to their type as a matter of course: balances tagged as balances, tiers as tiers, dates as dates, on every pass, for both wallets. Because Stell manages the pass lifecycle, the semantic layer moves with the visible one. When a balance updates, both the number on the pass face and the tagged value behind it update in the same pass update, so the promise the tags make stays true for the life of the pass.
That is the practical difference between a pass generator and a pass lifecycle platform. A generator can add tags at creation time. A lifecycle platform keeps them correct through every update afterwards, which is the only version of semantic tagging the operating system can actually rely on. When the wallets learn new tricks that read from this layer, your passes are already speaking the language, with no integration work on your side.
The short version
- Semantic tags are machine-readable annotations on a pass that tell the operating system what each field means, separate from what it displays.
- They power system intelligence: surfacing the right pass at the right moment, richer previews, and integrations that read pass details directly.
- They are optional, invisible, and commonly skipped, partly because keeping them correct doubles the maintenance of every field you tag.
- A pass lifecycle platform applies them automatically and keeps them in sync through every update, so your program inherits new system behaviors as wallets evolve.
If you want passes that the operating system works for, not just displays, this layer is where it starts. Stell handles it on every pass by default.





