Tool-pair integration pattern
Cal.com + Stripe integration
Cal.com + Stripe is the indie SaaS pattern for paid scheduling (coaching calls, consultations, paid meetings). Cal.com handles the calendar logic; Stripe handles the payment. The integration sits at the booking-creation moment.
Verified · editorial policy
Cal.com owns (teardown →)
Availability rules, time-zone handling, video-call generation, booking confirmation emails, reminder emails, calendar sync.
Stripe owns (teardown →)
Payment collection, payment method on file, receipts, refunds (if booking is canceled), tax handling.
Integration shape
Cal.com app + Stripe app combined. Cal.com's Stripe app charges at booking time using Stripe Payment Intents. On cancellation, Cal.com refunds via Stripe. The integration is Cal.com-native; minimal custom code.
Implementation steps
Step 1
Install Cal.com Stripe app
Cal.com Dashboard → Apps → Stripe → Install. Connect your Stripe account via OAuth.
Gotcha: Cal.com Stripe app requires Stripe live mode keys for live bookings. Test mode is supported separately.
Step 2
Configure paid event types
For each event type that should be paid, edit settings → Payment → enable Stripe → set price + currency. Different event types can have different prices.
Gotcha: Changing the price after bookings exist does not update existing bookings. Future bookings only.
Step 3
Decide on deposit-vs-full-payment
Cal.com supports full upfront or deposit. Deposit pattern reduces no-show rate; full payment maximizes commitment. For services above $100, deposit is usually right.
Gotcha: Deposit pattern requires capture-on-booking + capture-on-completion semantics. Test the flow end-to-end before going live.
Step 4
Set up cancellation + refund policy
Cal.com cancellation triggers Stripe refund. Decide your policy: full refund vs partial vs no-refund-after-24h. Publish the policy clearly on the booking page.
Gotcha: Stripe refunds take 5-10 business days to appear on customer card. Communicate this in the cancellation confirmation email so customers do not refund-rage.
Step 5
Test the booking-payment-refund cycle end-to-end
Book a test event with a real card. Confirm Stripe charge. Cancel the booking. Confirm Stripe refund. Confirm Cal.com freed the slot.
Gotcha: Skipping this test produces production bugs — bookings without payment, payments without bookings, slots that do not free after cancel.
Common gotchas across the whole integration
- Cal.com Stripe app uses its own Stripe Connect setup, not your direct Stripe account integration. Confirm your platform fee structure.
- Bookings made before payment completes can leave Cal.com in an inconsistent state. Cal.com handles this; verify in your test.
- Multi-currency: Cal.com supports it, but tax handling becomes complex. Consider single-currency for indie SaaS simplicity.
- Cal.com webhooks fire on booking events; use them to update your CRM/customer data alongside the Cal.com-native flow.
When NOT to build this integration
If you do not need calendar integration (just a payment for a service), Stripe Payment Links + manual scheduling is simpler. The Cal.com pattern is for products where scheduling is core, not occasional.
Frequently asked
- Can I use a discount code with Cal.com Stripe?
- Yes — Cal.com supports discount codes that apply at the Stripe payment step. Configure them in Cal.com Dashboard → Apps → Stripe → Discount codes.
Other tool-pair integrations
See the stack this integration belongs to
Integration patterns assume the right stack underneath. Use the stack recommendations to pick the right tools first, then the integration to wire them together.