What Tokenization Actually Is (and Isn't)
Let's clear something up first. Tokenization is not encryption. Encryption transforms data using a key — if you have the key, you can reverse it. Tokenization replaces sensitive data with a reference that has no mathematical relationship to the original. There's no key to steal, no algorithm to crack. The mapping lives in a secure vault, and the token itself is worthless outside that context.
In the payments world, the "sensitive data" is the PAN — the 16-digit number on the front of a card. A token takes its place everywhere in your system: your database, your logs, your API calls. The actual PAN only exists in the token vault and at the network level during authorization.
I've seen teams confuse tokenization with simply storing an encrypted PAN in their database and calling it a day. That's not tokenization — that's encryption with extra steps, and it doesn't reduce your PCI scope the way real tokenization does.
Key distinction: Tokenization eliminates the need to store PANs. Encryption still means you're holding sensitive data — just in a different form. If your goal is PCI scope reduction, tokenization is the path. Encryption alone won't get you there.
How Tokenization Works — The Actual Flow
When a customer saves their card for future use, here's what happens under the hood:
4242 **** 4242
Service
tok_a1b2c3d4
PAN stored here
Your system only ever sees the token. The vault — whether it's managed by your PSP, the card network, or a dedicated token service provider — holds the actual PAN. When you need to charge the card, you send the token, and the vault resolves it back to the PAN at authorization time.
PSP Tokens vs Network Tokens vs Acquirer Tokens
This is where most teams get confused. Not all tokens are created equal, and the differences matter more than you'd think.
| Feature | PSP Tokens | Network Tokens | Acquirer Tokens |
|---|---|---|---|
| Portability | Locked to PSP | Fully portable | Locked to acquirer |
| Auth Rate Lift | Baseline | +2-6% | Minimal |
| Card Update Support | Via account updater | Automatic (real-time) | Via account updater |
| Issued By | Stripe, Adyen, etc. | Visa (VTS) / MC (MDES) | Worldpay, Fiserv, etc. |
| Cryptogram Support | No | Yes (per-txn) | No |
PSP tokens are what most developers encounter first. Stripe gives you a pm_ or tok_ prefixed string, Adyen gives you a storedPaymentMethodId. These are proprietary — they only work with that specific PSP. If you switch from Stripe to Adyen, those tokens are useless. You'd need to re-collect card details from every customer.
Network tokens are issued by the card networks themselves — Visa Token Service (VTS) for Visa, Mastercard Digital Enablement Service (MDES) for Mastercard. These tokens are portable across PSPs and acquirers. They also come with a per-transaction cryptogram that acts like a dynamic CVV, which is why issuers trust them more and approve them at higher rates.
Acquirer tokens are less common but worth knowing about. Your acquiring bank generates them, and they're locked to that acquirer relationship. Useful in some legacy setups, but network tokens are the clear direction the industry is heading.
VTS and MDES in Practice
Visa Token Service and Mastercard MDES work on the same principle but differ in implementation details. Both replace the PAN with a network-level token and generate a transaction-unique cryptogram for each authorization.
In practice, you rarely integrate with VTS or MDES directly. Your PSP handles the network token provisioning on your behalf. Stripe, for example, automatically provisions network tokens for saved cards when you enable the feature. Adyen does the same through their TokenConnect product.
What you need to understand is the provisioning flow for card-on-file scenarios:
- Customer enters their card details on your checkout page
- Your PSP collects the PAN and sends a token provisioning request to VTS/MDES
- The network validates the card with the issuer and generates a token + token reference ID
- Your PSP stores the mapping and returns their own PSP token to you
- On subsequent charges, the PSP resolves your token → network token → PAN at authorization time
The key insight: even when you're using PSP tokens on the surface, your PSP might be using network tokens underneath. Stripe started doing this automatically in 2022 for eligible cards. The auth rate improvement happens transparently.
Tip: Check your PSP dashboard for network token eligibility rates. Not all cards support network tokens — prepaid cards, some regional issuers, and older BIN ranges may not be eligible. In my experience, eligibility sits around 70-85% for US-issued Visa and Mastercard.
How Network Tokens Improve Authorization Rates
The 2-6% auth rate lift from network tokens isn't magic. It comes from three concrete mechanisms:
- Cryptogram trust signal. Each transaction includes a unique cryptogram generated by the token service. Issuers treat this as a strong authentication signal — similar to how 3DS shifts liability. Fewer soft declines.
- Automatic card lifecycle updates. When a card is reissued (new expiry, new number after fraud), the network token stays valid. The network updates the underlying PAN in the vault automatically. No more "card expired" declines on recurring charges.
- Domain restriction. Network tokens are scoped to a specific merchant and channel. An issuer knows the token can only be used by you, for card-on-file transactions. This reduces fraud risk scoring, which means fewer false declines.
I tracked this on a subscription platform processing about 200K recurring charges per month. After enabling network tokens through our PSP, we saw auth rates go from 91.3% to 94.8% over three months. The biggest gains were on retry transactions — cards that previously declined due to expired credentials started going through automatically.
Card Lifecycle Management
This is the sleeper benefit of network tokens that doesn't get enough attention. With traditional PSP tokens, when a customer's card expires or gets replaced after fraud, you have two options:
- Run an account updater batch (Visa Account Updater / Mastercard ABU) — typically monthly, costs per lookup, and doesn't catch all updates
- Email the customer and ask them to update their card — terrible conversion rates
With network tokens, the card network handles this in real time. The issuer notifies VTS/MDES when a card is reissued, and the token-to-PAN mapping updates automatically. Your token stays the same. The customer never knows anything changed.
Watch out: Automatic card updates don't cover every scenario. If a card is closed entirely (not reissued), the token gets suspended. If the customer opts out of token provisioning with their issuer, updates won't propagate. Always keep your dunning flow as a fallback.
Migration Strategy: PSP Tokens to Network Tokens
If you already have a vault full of PSP tokens and want to move to network tokens, here's the approach that worked for us:
Phase 1: Enable for new cards
Turn on network token provisioning for all new card-on-file saves. This is usually a configuration flag in your PSP dashboard — no code changes needed. Every new card saved will get a network token provisioned behind the scenes.
Phase 2: Backfill existing cards
Most PSPs offer a batch provisioning API or an automatic backfill process. Stripe, for instance, will attempt to provision network tokens for existing saved cards when you enable the feature. Adyen provides a migration tool through their Customer Area.
Run the backfill in batches. We did 10K cards per day to avoid rate limits and to monitor for any issues. Track the provisioning success rate — expect 70-85% of cards to be eligible.
Phase 3: Monitor and optimize
Compare auth rates for network-tokenized transactions vs non-tokenized ones. Build a dashboard that tracks:
- Network token eligibility rate (what percentage of your cards have network tokens)
- Auth rate delta (tokenized vs non-tokenized)
- Token lifecycle events (suspensions, updates, deletions)
- Cryptogram generation failures
// Pseudo-code: tracking token metrics
const metrics = {
totalCards: await db.cards.count(),
networkTokenized: await db.cards.count({ hasNetworkToken: true }),
eligibilityRate: (networkTokenized / totalCards * 100).toFixed(1),
// Auth rates by token type (last 30 days)
authRateWithNT: await getAuthRate({ tokenType: 'network', days: 30 }),
authRateWithoutNT: await getAuthRate({ tokenType: 'psp_only', days: 30 }),
authRateDelta: authRateWithNT - authRateWithoutNT
};
PCI Scope Reduction Through Tokenization
This is the compliance win that justifies the engineering investment. When you tokenize properly, your systems never see or store PANs. That means:
- Your application servers are out of PCI scope for cardholder data storage
- Your database doesn't contain PANs — no encryption key management headaches
- Your logs can't accidentally leak card numbers (because they were never there)
- You qualify for SAQ A or SAQ A-EP instead of the dreaded SAQ D
The practical difference: SAQ A has about 20 requirements. SAQ D has over 300. That's the difference between a self-assessment you can do in an afternoon and a multi-month audit that requires dedicated security staff.
Common mistake: Tokenizing at the PSP level but then logging the full PAN in your server-side request logs before it reaches the PSP. I've seen this happen with custom middleware that logs HTTP request bodies. Audit your logging pipeline — one stray log statement can put your entire infrastructure back in PCI scope.
Real Gotchas and Lessons Learned
- Network token provisioning isn't instant. VTS and MDES provisioning can take seconds to minutes. Don't block your checkout flow on it. Provision asynchronously after the first successful transaction.
- Cryptogram expiry is tight. Network token cryptograms are time-limited — typically valid for a few minutes. If your authorization request is delayed (queued, retried after timeout), the cryptogram may expire and the transaction will decline. Generate cryptograms as close to authorization time as possible.
- Not all acquirers support network tokens equally. Some acquirers strip the cryptogram or don't pass the token correctly to the network. If your auth rate doesn't improve after enabling network tokens, check with your PSP whether the acquirer is actually processing them correctly.
- Token suspension is silent. When an issuer suspends a network token (fraud, account closure), you might not get a webhook immediately. Build a reconciliation job that checks token status periodically, especially for high-value recurring billing.
- Multi-PSP setups get complicated. If you use Stripe for US transactions and Adyen for EU, each PSP provisions their own network tokens for the same card. The tokens are different, but they map to the same PAN. Coordinate your token lifecycle management across PSPs to avoid duplicate provisioning and conflicting status updates.
Bottom line: Network tokenization is the single highest-ROI improvement you can make to a card-on-file payment system. Better auth rates, automatic card updates, reduced PCI scope, and future-proofing against PSP lock-in. The migration isn't trivial, but the payoff compounds every month.
References
- Visa Developer Center — Visa Token Service (VTS) Documentation
- Mastercard Developers — MDES Digital Enablement Documentation
- EMVCo — Payment Tokenisation Specification
- PCI Security Standards Council — Document Library
- Stripe Documentation — Network Tokens
- Adyen Documentation — Network Tokens
Disclaimer: This article reflects the author's personal experience and opinions. Product names, logos, and brands are property of their respective owners. Token eligibility rates, auth rate improvements, and feature availability vary by region, issuer, and PSP — always verify with official documentation and your specific provider.