yuno / wallets / subscription migration
Merchant Migration Guide

Move Apple Pay & Google Pay plans without breaking a single renewal.

Wallet-paid subscriptions look like the unmovable part of a migration: there's no card number to export — or so it seems. This guide explains what a wallet plan actually is under the hood, what moves into Yuno, and how to cut over so the payment lifecycle continues untouched: same credential, same schedule, same customer experience.

This cycle
current processor bills the plan
Between cycles
credential + schedule move
Next cycle
Yuno bills the same plan
The mental model

A wallet plan is a card plan wearing a wallet badge

The wallet is only involved once in a subscription's life: at the very first checkout, when your customer confirmed the payment in the Apple Pay or Google Pay sheet. At that moment the wallet handed your processor a tokenized card credential plus a one-time cryptogram, and that cryptogram was consumed by the first, customer-present charge.

Every renewal since has been something much more ordinary: a merchant-initiated charge (MIT) against that stored credential, running on regular card rails and flagged as part of a subscription series. No wallet sheet, no Face ID, no Google prompt. Apple and Google are not in the renewal loop at all.

WalletWhat your processor actually storesWhat that means for migration
Apple Pay Always a DPAN — a device account number. A real, network-issued card number that stands in for the customer's card. Exports and vaults like a card, because on the network it is a card.
Google Pay Either a DPAN (tokenized, like Apple Pay) or an FPAN — the actual card number. DPAN behaves like Apple Pay. FPAN is simply a normal card on file — nothing wallet-specific applies.
The key insight

The credential your renewals run on is issued by the card networks, not by your current processor. It is not proprietary to them, and it does not die when you leave. What must survive the move is (1) the credential itself and (2) the context that marks each renewal as the continuation of an existing series — the stored-credential flags and, ideally, the network transaction ID of the original authorization. Both are covered below.

Scope

What moves, and what you re-create

✓ moves into Yuno's vault
  • Card numbers (PANs) with expiry and cardholder data
  • Apple Pay / Google Pay device tokens (DPANs) with expiry
  • Network tokens (Visa / Mastercard / Amex), if your account provisions them
  • The processor's payment-method IDs — your mapping key
  • Customer references to match methods to people
↻ you re-create (never in the vault)
  • Customers in Yuno — created first, before any method is enrolled
  • The billing schedule — plan, amount, currency, interval, and each plan's next renewal date. Export this from your current processor's API (it's not sensitive data); the migration file moves credentials only
The mapping is the migration

Every migrated method comes back as old payment-method ID → Yuno vaulted_token. That table is what lets each of your subscription records point at its new credential. Store it durably before you re-arm a single plan.

The process

Six steps, one renewal boundary at a time

1

Create your customers in Yuno

Methods can only be enrolled against existing customers. Create them with your own merchant_customer_id so your records, the old processor's references, and Yuno's customer_id all line up.

2

Request the export from your current processor

This is a written request to the processor you're leaving (for example, Stripe). Be explicit about scope — the default export is often cards only. Ask for: wallet-tokenized methods (Apple Pay / Google Pay DPANs), network tokens if provisioned, payment-method IDs, and — if they can provide them — the network transaction IDs of each method's first charge.

The transfer runs directly between the processor and Yuno over SFTP with PGP encryption. You own the communication with your processor; Yuno coordinates the technical hand-off with them directly.

3

Yuno vaults the credentials

DPANs vault exactly like cards — on the network they are card numbers. Each imported method is returned mapped to its old payment-method ID as a vaulted_token, the reference you'll charge from now on.

Prefer an API-driven move, or need to cover methods that arrive after the file export? The same per-method enrollment call works for wallet-origin methods too — the wallet type is detected automatically from the provider's metadata. See Enroll Stripe tokens in Yuno for the exact request.

4

Rebuild the schedule

Option A — your scheduler. Keep billing logic in your own system and fire one merchant-initiated payment per renewal (payload in the next section). Full control over retries, proration, and plan changes.

Option B — Yuno subscriptions. Create a subscription per plan with the vaulted_token, and set the schedule so the engine's first charge lands on the plan's next natural renewal date. The current period was already collected on the old stack — the engine must start at the boundary, not today, or you double-charge.

5

Cut over at the renewal boundary

Per plan (or per cohort): the current period was paid on the old processor, the next one is charged by Yuno. Disable the old subscription's auto-renewal the moment its Yuno replacement is armed — never leave both live, and never leave a gap.

6

Watch the first full cycle

Start with a pilot cohort. Track renewal outcomes via webhooks, keep retries on, and compare approval rates against your pre-migration baseline before moving the rest of the portfolio.

The payload

The first renewal Yuno charges

One request per renewal, server to server. No checkout session, no customer present. This is the same shape for a migrated Apple Pay plan, a Google Pay plan, or a plain card plan — by renewal time they are all stored credentials on card rails.

endpoint
POST https://api.y.uno/v1/payments
# headers: public-api-key, private-secret-key, X-Idempotency-Key (unique per renewal attempt)
request body — renewal of a migrated wallet plan
{
  "account_id": "your-account-id",
  "merchant_order_id": "renewal-2026-08-0042",
  "country": "US",
  "amount": { "currency": "USD", "value": 1999 },
  "customer_payer": { "id": "<yuno-customer-id>" },
  "workflow": "DIRECT",
  "payment_method": {
    "type": "CARD",
    "vaulted_token": "<from-the-migration-mapping>",
    "detail": {
      "card": {
        "stored_credentials": {
          "reason": "SUBSCRIPTION",
          "usage": "USED",
          "network_transaction_id": "<from-the-export, if provided>"
        }
      }
    }
  }
}
usage: "USED"
This renewal continues an existing series. The "FIRST" happened months ago, in the wallet sheet, on your old stack — you never repeat it.
reason: "SUBSCRIPTION"
Send it on every renewal, and keep it consistent — some providers require the same reason across the whole transaction lifecycle.
network_transaction_id
The issuer-visible thread back to the original authorization. Pass the exported value if your processor provided it; if not, the stored-credential flags above still mark the charge as a subscription continuation.
type: "CARD"
Migrated wallet methods are vaulted as cards (the vault holds the underlying device credential). Methods vaulted later through a Yuno wallet checkout keep their wallet type (APPLE_PAY / GOOGLE_PAY) — the renewal shape is otherwise identical.
X-Idempotency-Key
Unique UUID per renewal attempt, so a network retry can never double-charge a customer.
The one way to actually break the lifecycle

Sending a renewal without stored_credentials. An unflagged, out-of-session charge looks to the issuer like a brand-new customer-initiated payment with no cardholder present — exactly the pattern issuers decline. The flags are not decoration; they are what keeps your approval rates where they were before the move.

Using Yuno's subscription engine instead of your own scheduler? Create the subscription with payment_method.type: "CARD", the vaulted_token, and card.store_credentials.usage: "USED" — note the field is spelled store_credentials on the Subscriptions API. Because a customer-initiated authorization already happened before the subscription existed, this flag is mandatory there too.

Reassurance, itemized

Why the lifecycle doesn't break

During the transition

New wallet subscriptions keep flowing

While migrated plans cut over, new signups already run natively on Yuno — and both cohorts converge on the same renewal shape.

1 · first payment
Customer approves in the wallet sheet; charge it as a customer-initiated payment with vault_on_success: true and stored_credentials { reason: "SUBSCRIPTION", usage: "FIRST" }.
2 · what Yuno captures
The credential is vaulted and the network transaction ID is recorded automatically — the same context you're importing for migrated plans, created fresh.
3 · renewals
Charge the vaulted_token with usage: "USED" — or hand the plan to the subscription engine with the first cycle offset, since you already charged period one.

Full wallet checkout flows (session setup, recurring context on the sheet, free-trial verification) are covered in the Apple Pay and Google Pay guides, and in Apple Pay direct integration if you own the sheet yourself.

In practice

One migration, start to finish

A subscription merchant we recently worked with — web checkout, most volume in North America, cards in their own payment form plus Apple Pay and Google Pay buttons — was leaving a single-processor setup for a two-provider split, precisely to stop depending on one company for every renewal. A meaningful share of their active plans was wallet-paid, which is what made the migration feel blocked. It wasn't:

May · day 0

A customer starts a monthly plan through the Apple Pay sheet. First charge is customer-initiated on the old processor; the DPAN is stored there. Renewals tick along monthly.

July · migration window

Customers are created in Yuno. The merchant requests the export — cards plus wallet DPANs plus network tokens plus method IDs — and the file lands in Yuno's vault over SFTP. The mapping table (old method ID → vaulted_token) comes back. Meanwhile, the billing schedule is exported separately from the old processor's API. Nothing customer-facing has changed; the old processor still bills the current period.

August 1 · arming

Each plan's schedule is re-created against its vaulted_token, first charge set to the plan's next renewal date. Old auto-renew is switched off the same moment. No gap, no overlap.

August 3 · the boundary

The May customer's renewal fires from Yuno: usage: USED, reason: SUBSCRIPTION, original network transaction ID attached, routed to the provider that held the original agreement. Approved. The customer sees the same charge, on the same date, on the same statement.

September · opening up

Approval rates confirmed against baseline, routing opens to the second provider. Wallet plans now fail over like everything else in the portfolio — the single point of failure is gone, and no customer ever noticed a migration happened.

Why it held

Nothing the customer ever touched changed: not the card in their wallet, not the renewal date, not the amount. The only thing that moved was who executes the charge — and the credential, flags, and transaction lineage moved with it.

Before you start

Checklist