Hey everyone! Wanted to share something I shipped recently that I couldn’t find a clean guide for anywhere.
I was working on a membership anywhere platform and the client wanted users to be able to add their digital membership card to Apple Wallet directly from the website no app download, no friction. Turns out it’s very doable, just a little tricky the first time.
Apple Wallet uses a format called .pkpass think of it as a signed ZIP file containing a pass.json with your card data (member name, ID, barcode), a manifest.json with file hashes, and a cryptographic signature from your Apple Pass Type Certificate. Once you understand that structure, the rest falls into place.
On the backend I used Node.js with the passkit-generator npm package. You define the membership card layout in pass.json, wire up your Apple certs, and the library generates a .pkpass buffer ready to serve.
const { PKPass } = require(‘passkit-generator’);
app.get(‘/api/wallet-pass’, async (req, res) => {
const pass = await PKPass.from(
{ model: ‘./pass-template/’, certificates: { wwdr, signerCert, signerKey } },
{ serialNumber: ‘member-001’ }
);
res.set(‘Content-Type’, ‘application/vnd.apple.pkpass’);
res.send(pass.getAsBuffer());
});
The frontend is just a plain anchor tag pointing to that endpoint. When the user taps it on iPhone Safari, iOS automatically detects the .pkpass file and shows a native “Add to Wallet” sheet one tap and their membership card is saved right there in Apple Wallet, always accessible offline.
Honestly the trickiest part was the certificate setup converting .p12 to .pem and getting the WWDR cert lined up. Once that clicked, everything else was smooth. For Android users, Google Wallet needs a separate JSON-based API flow.
Has anyone else tried to add a membership card to Apple Wallet from a web app? Would love to hear how others handled the cert setup or dynamic pass updates via APN.