Skip to main content

[Admin] Digital membership cards (Apple Wallet + Google Pay)

Every active member can add their membership to Apple Wallet (iOS) or Google Pay (Android). The wallet pass shows their status, tier, expiry, and a QR code for check-in — members can flash their phone at the front desk without unlocking it.

Member experience:

  • Member sees "Add to Wallet" buttons on their dashboard (club page / studio member portal)
  • One tap → pass downloads + installs in the native wallet app
  • Pass updates dynamically when their tier, status, or expiry changes (via Apple's web service — push notifications)

QR payload schema:

`whosin://checkin/{productType}/{orgId}/{memberCode}` — deterministic, HMAC-derived 6-digit code per member. Our admin QR scanner recognises this format.

Operational setup (Apple Wallet):

Production Apple Wallet passes require a signed certificate from Apple's Developer Program:

  1. Register for an Apple Developer account ($99/year)
  2. Create a Pass Type ID identifier (e.g. `pass.app.whosin.membership`)
  3. Generate a signing certificate + download the .p12 file
  4. Upload to our platform via `firebase functions:secrets:set PASSKIT_P12` and `PASSKIT_P12_PASSWORD`

Until the cert is uploaded, the generator falls back to a demo mode — members see a friendly "Coming soon" message instead of a broken pass.

Operational setup (Google Pay):

Google Wallet uses a service account. Same `firebase functions:secrets:set GOOGLE_WALLET_ISSUER_ID` + `GOOGLE_WALLET_SERVICE_ACCOUNT_KEY`.

Security:

  • Passes are member-scoped — a member can only generate passes for their own memberships
  • QR codes are HMAC-signed so they can't be forged; even a copied screenshot requires the active backend check
  • Lost phone: member regenerates the pass from their dashboard; old pass is invalidated on next scan attempt

Troubleshooting:

  • "Pass won't install" → check that the Pass Type ID matches your cert
  • "Pass shows 'Expired'" → our backend updates via Apple's push service every few minutes; wait or re-download
  • "QR won't scan" → brightness up, damaged QR fallback: tap "Manual entry" in the scanner

Still have questions?