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.

Scheduling & booking

Put every Calendly booking in the invitee's wallet

A confirmation email gets buried. A wallet pass sits on the home screen — and surfaces near the appointment time — so people actually show up. Issued the moment they book, no code.

Start freeRead the docs →
Apple & Google WalletNo-code via ZapierFree to start
Calendly
Invitee Created (new booking)
via Zapier
Passmint
Create Pass
Booking pass

What you can do

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

Use Calendly's reschedule trigger → Find Pass (by holder email) → Update Pass to write the new start time onto the existing card. The change is pushed to the wallet automatically, so the pass always shows the real time — and the invitee never has to hunt for a fresh confirmation email.
Add a path on Calendly's cancellation trigger that runs Find Pass (by holder email) → Void Pass. The card in their wallet is marked invalid immediately, so a cancelled meeting can't linger on their lock screen as a stale reminder.
For a class, course, or coaching series booked through Calendly, issue one pass per session and key updates on the invitee's email so each booking's pass tracks its own time — or use a single membership-style pass and Update Pass to roll its 'next session' field forward as each one is booked.
Map a template field like prep or bring to a fixed value (or a Calendly question's answer) so the pass carries 'Bring photo ID', 'Have your account number ready', or a parking note — the practical details that otherwise live three paragraphs into an email nobody reopens.

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 template for the appointment pass — an event or generic pass works well. Note its field names (e.g. appointment_time, host, location, join_url): the Field Values keys you map must match them exactly.
  • A Zapier account (the free plan is enough to build and test this).
  • A Calendly account with at least one active event type and a test booking you can make against it.

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 setting things up.

Create a new Zap and choose Calendly as the trigger app. Pick the trigger that fires when a new invitee books — then connect your Calendly account and send a test so Zapier pulls a sample booking and learns its fields (invitee email and name, event type, start time, location/meeting URL).

TODO(verify): Confirm Calendly's exact trigger label for a new booking (it's the 'invitee created' style trigger) and the exact field keys in its sample payload — particularly how it exposes the invitee's email and name, the event start time, and the location/join URL (these differ for in-person vs. Zoom/Google Meet event types).

Add an action step, choose Passmint, and select Create Pass. Pick your appointment template from the dropdown — Zapier loads your templates automatically. Map Holder Email from the invitee's email and Holder Name from the invitee's name so the pass can be delivered and tracked per person.

In Field Values, map the booking onto the pass. The key on the left must exactly match a field name in your Passmint template; the value on the right is the Calendly field. Typical mapping: appointment_time ← event start time, host ← the Calendly host/owner, location ← the location, and join_url ← the meeting link for online events. Fields you don't map are simply left off the pass.

TODO(verify): On a real template, confirm the Field Values keys (appointment_time, host, location, join_url) exist as field names — mismatched keys are silently ignored. Also confirm which Calendly field actually carries the meeting link for your online event types, and that the start time arrives in a format your template displays cleanly (you may want a Zapier Formatter step to localise it to the invitee's timezone).

Add a second Zap (or a path) on Calendly's reschedule trigger. Add a Passmint Find Pass step keyed on the invitee's email to locate their existing pass, then an Update Pass step that writes the new start time (and location, if it changed) into the same Field Values keys. Because Update Pass pushes to installed wallets, the time on the card in their phone changes on its own — no new pass, no second email.

TODO(verify): Confirm Calendly exposes a distinct reschedule trigger (vs. a generic update) and that its payload includes the invitee's email and the new start time. If a reschedule arrives as a cancel-plus-rebook on some plans, you may instead rely on the cancel + create flow below.

Run the Zap against a real test booking and confirm a pass is created in Passmint and opens correctly on a phone, showing the right time and meeting link. Then reschedule the test booking and watch the pass update. Once it looks right, switch your API key to pmk_live…, turn the Zaps on, and book for real.

Questions

The details teams check before switching the Zap on.

Build the reschedule path and the pass updates itself. Calendly's reschedule trigger runs Find Pass (by the invitee's email) → Update Pass, which writes the new time into the card already in their wallet and pushes it to their phone. No new pass is issued and no extra email goes out — the existing pass just shows the new time.
Yes. For online event types, map the Calendly meeting URL (Zoom/Google Meet/etc.) into a Field Values key such as join_url that your template renders as a tappable link or button. The invitee can then join straight from the pass instead of searching their inbox. Confirm which Calendly field carries the link for your specific event type.
An event-style pass with a date and time can surface on the lock screen as the appointment approaches, the way a boarding pass or ticket does — that's the main no-show defence here. Exact lock-screen relevance behaviour is controlled by Apple Wallet and Google Wallet, not Passmint, so set a real start time on the pass and it gets the standard wallet treatment.
If you add the cancellation path: Calendly's cancel trigger → Find Pass → Void Pass marks the pass invalid in the wallet, so it clearly reads as cancelled. It isn't deleted from their phone automatically — Apple and Google control removal — but a voided pass can't mislead them into showing up for a meeting that's off.
Calendly always collects the invitee's email, so map it to Holder Email — it's what powers pass delivery, per-holder analytics, and (crucially) the Find Pass lookup that lets reschedules and cancellations update the right pass later. Without it, the reschedule and cancel flows have nothing to match on.
Zapier is perfect for getting this live today. When you're booking at high volume, want the pass issued the instant Calendly fires its webhook without per-task costs, or need reschedule and cancel logic driven straight from your own backend, call the Passmint API directly — POST /v1/passes plus find/update/void, or the @passmint/node SDK. Same passes, same live wallet updates, full control.

Related integrations

Cal.com

Drop every Cal.com booking into your invitee's wallet as a pass.

Acuity Scheduling

Give every Acuity appointment a wallet pass for the client.

SimplyBook.me

Turn SimplyBook.me bookings into wallet passes for clients.

Mindbody

Give Mindbody class and membership bookings a wallet pass.

Issue your first pass from Calendly today

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

Start freeExplore the API →