Passmint
TemplatesDocsPricingBlog
Log inGet started
Passmint

Apple and Google Wallet passes from one API. Built for people who ship.

Product
  • Pass Designer
  • Developers
  • Distribution
  • Analytics
  • Templates
  • Pricing
Developers
  • Documentation
  • API reference
  • Node SDK
  • Webhooks
Company
  • Changelog
  • About
  • Contact
  • Support
  • Security
  • Terms
  • Privacy
Social
  • GitHub
  • X

© 2026 Passmint. Built for indie makers.

Apple Wallet & Google Wallet, one API.

E-commerce & payments

Give every Stripe subscriber a wallet membership card that stays current

When someone subscribes in Stripe, they get an Apple Wallet or Google Wallet membership card showing their plan and renewal date — and it updates itself when they renew, downgrade, or cancel. No code, no resend.

Start freeRead the docs →
Apple & Google WalletNo-code via ZapierFree to start
Stripe
New Subscription
via Zapier
Passmint
Create Pass
Loyalty card

What you can do

A few ways teams put Stripe and Passmint to work together.

On the canceled-subscription trigger, run Find Pass (by holder email) → Void Pass. The membership card is marked invalid in the holder's wallet immediately, so a churned customer can't keep showing an active-looking card. Voiding is irreversible — if you'd rather they could resubscribe onto the same card, use Update Pass to set status = expired instead.
Trigger on Stripe's recurring-payment / invoice-paid event, then Find Pass → Update Pass to write the new current_period_end into the card's renews_on field each cycle. The 'renews on' line on the card in their wallet always reflects the latest paid period — no resend, no new card.
Trigger on the payment-failed or past-due event and use Find Pass → Update Pass to flip the card's status field to 'Past due' (and optionally change a color field if your template references one). When the retry succeeds, a second Zap on the recovery event sets it back to 'Active' — a gentle, ambient nudge living right in their wallet.
Trigger on a subscription/plan change and use Find Pass → Update Pass to set the card's plan or tier field to the new Stripe price name. The same card the customer already carries becomes a Scale card when they upgrade, or drops back to Starter on a downgrade — instantly, in place.

Set it up

One Zap links the two — live in a few minutes, no code involved.

  • A Passmint account and an API key (pmk_live… or pmk_test…), from Developers → API Keys.
  • A Passmint membership template for the card you're issuing. Note its field names (e.g. plan, tier, renews_on, status): the values you map from Stripe must use these exact keys, or they're dropped.
  • A Zapier account (the free plan is enough to build and test this).
  • A Stripe account with at least one subscription product/price set up. You'll build and test in Stripe test mode first, then switch to live.

In Zapier, add Passmint as a connected app and paste your API key when prompted. Zapier verifies it against your account immediately, so you'll know the connection works before building the rest of the Zap. Use a pmk_test… key while you're wiring this up against Stripe test mode.

Create a new Zap and choose Stripe as the trigger app. Pick the trigger that fires when a customer starts a subscription, connect your Stripe account, and send a test so Zapier pulls a sample subscription — including the customer's email and name, the plan/price, the subscription status, and the current period end. Those become the fields you'll map onto the card.

TODO(verify): Confirm Stripe's exact trigger for a started subscription (Stripe exposes several subscription-related events) and that the test payload surfaces customer email/name, the plan or price name, the subscription status, and current_period_end. Some setups expose the customer as a nested object or a separate lookup — note whether you need an extra Find Customer step to get the email.

Add an action step, choose Passmint, and select Create Pass. Pick your membership template from the dropdown — Zapier loads your templates automatically. Map Holder Email from the Stripe customer's email and Holder Name from the customer's name; the email is what every later lifecycle step will use to find this exact card again, so it's worth getting right here.

In Field Values, map the Stripe plan/price name to your template's plan (or tier) field, the subscription status to a status field, and the current period end to a renews_on field. The key on the left must match a field name in your Passmint template character for character; the value on the right is the Stripe field. Format the period-end date here if you want it human-readable on the card — Stripe gives it to you as a timestamp.

TODO(verify): On a real template, confirm the Field Values keys you reference (plan/tier/status/renews_on or your own names) exist as field names in that template — mismatched keys are silently ignored. Confirm whether current_period_end arrives as a Unix timestamp that needs a Zapier Formatter step to display as a date.

Build a second Zap triggered by a subscription change — a renewal, a plan change, or entering past-due. Add Passmint → Find Pass and map Holder Email from the Stripe customer (this returns that customer's most recent card, no IDs to track). Then add Update Pass, map its Pass ID from the Find Pass output, and in Field Values push only what changed: the new renews_on after a renewal, the new tier after a plan change, or status = past_due during a failed payment. Passmint pushes the edit to the card already in the holder's wallet automatically.

Add a third Zap on the canceled-subscription trigger: Find Pass by Holder Email → Void Pass with the Pass ID from Find Pass. The card is marked invalid in the holder's wallet the instant their subscription ends — so a lapsed member can't flash a still-valid-looking card. Test all three Zaps end to end in Stripe test mode (create a test subscription, change it, cancel it), confirm the card is created, updated, then voided, then switch your Passmint key to pmk_live…, point the Zaps at live Stripe events, and turn them on.

Questions

The details teams check before switching the Zap on.

Build a Zap on Stripe's canceled-subscription event that runs Find Pass (by the customer's holder email) → Void Pass with the returned Pass ID. Void Pass marks the pass invalid in every installed wallet — so the card visibly stops being valid the moment the subscription ends. Voiding is irreversible; if you want a softer state you can resubscribe onto, use Update Pass to set a status field to 'expired' instead.
Use the Find Pass action with Holder Email mapped from the Stripe customer's email. It returns that customer's most recent pass, and you map its Pass ID into the following Update Pass or Void Pass step. That's why mapping the customer's email onto Holder Email at Create Pass time matters — it's the handle every later lifecycle step uses. (If you stash the Pass ID from Create Pass into your own system, you can look up by exact Pass ID instead, which takes precedence over email.)
Yes. Update Pass changes only the field values you provide and pushes the change to every installed copy of that pass automatically — so when Stripe renews a subscription or the customer changes plan, the card already in their Apple or Google Wallet updates in place. There's no re-issue and nothing for the holder to reinstall.
Stripe sends current_period_end as a Unix timestamp. Drop a Zapier Formatter (Date / Time) step between the Stripe trigger and the Passmint action to convert it into a readable date before mapping it to your renews_on field. Otherwise the raw timestamp lands on the card.
Yes, and you should. Connect Stripe in test mode and use a pmk_test… Passmint key while you build, so you can create, renew, change, and cancel test subscriptions and watch the card get created, updated, and voided without touching real customers or real passes. When it all behaves, switch the Passmint key to pmk_live…, point the Zaps at your live Stripe events, and turn them on.
Zapier is the fastest way to get subscriber cards live today. Once you're issuing passes at volume, want them created and synced the instant a Stripe webhook fires without per-task costs, or want to react to events Zapier doesn't expose, handle Stripe's webhooks yourself and call the Passmint API directly — POST /v1/passes to issue, PATCH to update, and the void endpoint to invalidate, or the @passmint/node SDK. Same passes, same live wallet updates, full control over the lifecycle.

Related integrations

Shopify

Drop a branded wallet loyalty card into every new customer's phone right after they buy.

Square

Drop a wallet loyalty card into a customer's phone after every Square sale.

PayPal

Issue a wallet pass on every completed PayPal payment.

WooCommerce

Issue a loyalty pass on every new WooCommerce order.

Issue your first pass from Stripe today

Free for your first passes. No Apple or Google certificates to manage, no code to write.

Start freeExplore the API →