Zoom + Stripe: paid sessions with Sheets tracking
Running paid Zoom sessions sounds simple until you’re chasing payments, copying meeting links, and manually emailing people who “definitely paid.” That’s where Zoom Stripe automation earns its keep.
Coaches feel it when a live workshop is about to start. Marketing managers feel it when support asks, “Who’s actually on the attendee list?” And if you run a small team, you feel it in your calendar. This workflow turns paid signups into a clean, reliable process.
You’ll see how one n8n workflow creates the Zoom session, takes payment in Stripe, logs everything in Google Sheets, and emails the right people automatically (without leaking the password to non-buyers).
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Zoom + Stripe: paid sessions with Sheets tracking
flowchart LR
subgraph sg0["Meeting Intake Form Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/zoom.svg' width='40' height='40' /></div><br/>Generate Zoom Session"]
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Build Stripe Item"]
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Configure Settings", pos: "b", h: 48 }
n3@{ icon: "mdi:message-outline", form: "rounded", label: "Dispatch Instructor Email", pos: "b", h: 48 }
n4@{ icon: "mdi:database", form: "rounded", label: "Generate Attendee Sheet", pos: "b", h: 48 }
n5@{ icon: "mdi:database", form: "rounded", label: "Append Attendee Row", pos: "b", h: 48 }
n6@{ icon: "mdi:message-outline", form: "rounded", label: "Send Participant Confirmation", pos: "b", h: 48 }
n7@{ icon: "mdi:message-outline", form: "rounded", label: "Alert Instructor", pos: "b", h: 48 }
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Create Payment URL"]
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Map Attendee Fields", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Assemble Event Details", pos: "b", h: 48 }
n11@{ icon: "mdi:database", form: "rounded", label: "Log Event Record", pos: "b", h: 48 }
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/form.svg' width='40' height='40' /></div><br/>Meeting Intake Form"]
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/stripe.svg' width='40' height='40' /></div><br/>Payment Completed Trigger"]
n14@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Creation Flow Check", pos: "b", h: 48 }
n15@{ icon: "mdi:cog", form: "rounded", label: "Workflow Finish", pos: "b", h: 48 }
n2 --> n14
n13 --> n2
n10 --> n11
n12 --> n2
n7 --> n15
n9 --> n5
n0 --> n1
n8 --> n4
n8 --> n10
n14 --> n0
n14 --> n9
n1 --> n8
n5 --> n6
n4 --> n3
n6 --> n7
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n12,n13 trigger
class n14 decision
class n4,n5,n11 database
class n1,n8 api
class n13 disabled
classDef customIcon fill:none,stroke:none
class n0,n1,n8,n12,n13 customIcon
The Problem: Paid Zoom sessions get messy fast
The first paid session is exciting. The fifth one is chaos. You’re creating meetings in Zoom, building payment links in Stripe, answering “where’s the link?” emails, and trying to keep a real attendee list somewhere that isn’t buried in Stripe events. Meanwhile, you’re also protecting access, because sending the Zoom password to the wrong person is a quick way to kill trust. It’s not hard work. It’s constant work. And it steals focus right before you have to show up and deliver.
It adds up fast. Here’s where it typically breaks down in real life.
- You end up doing the same copy-paste loop for every session: meeting details, payment link, confirmation email, roster update.
- Someone pays, but the confirmation goes late (or not at all), which means avoidable support messages right before the event.
- Access control turns into guesswork because “paid” lives in Stripe, “attending” lives in your inbox, and “notes” live nowhere.
- Your Google Sheet is always one step behind, so you can’t trust the numbers when you plan follow-ups or capacity.
The Solution: Create the meeting, sell access, and track everyone automatically
This n8n workflow ties the whole paid-session lifecycle together. You start by submitting a new session through a simple intake form, which triggers n8n to generate a Zoom meeting for that event. Next, it creates a Stripe product-style item and a payment URL via HTTP requests, so each session gets its own checkout link. At the same time, it prepares a dedicated attendee sheet in Google Sheets and logs the session details so you’re not hunting for links later. When Stripe confirms a successful payment, the workflow maps the attendee fields, appends a clean row to your sheet, and sends a confirmation email with the Zoom details to the buyer. You also get an instructor alert so you always know when someone joins.
The workflow begins with session creation (form submission) and payment setup (Stripe link). Then it switches into “verified attendee” mode when Stripe triggers a payment-completed event. From there, Google Sheets becomes the source of truth and Gmail handles the communication automatically.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you run two paid Zoom sessions a week with 30 attendees each. Manually, you might spend about 15 minutes creating the meeting, 20 minutes building and testing the payment link, and another 3 minutes per attendee to confirm, send details, and update your sheet. That’s roughly 2 hours of admin per session, or about 4 hours a week. With this workflow: you submit the session once (a few minutes), then each signup is logged and emailed automatically after payment, while you just teach.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Zoom for meeting creation and access details
- Stripe to take payments and trigger confirmations
- Gmail for participant confirmations and instructor alerts
- Google Sheets to log sessions and attendees
- Stripe API credentials (get them from Stripe Developers)
Skill level: Beginner. You’ll connect accounts, paste a Sheet URL, and edit the email text.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A new session is submitted through a form trigger. You enter the session basics (title, time, price, and a few config fields), and n8n routes it through a quick logic check to make sure it’s running the “creation” path.
Session details are assembled and saved. The workflow sets your core settings (sheet URL, notification email, currency), then prepares the event record so Google Sheets stays consistent across sessions.
Zoom and Stripe are generated in one pass. n8n creates the Zoom meeting, then uses HTTP requests to build the Stripe item and produce a payment URL that you can share or embed anywhere.
Payment becomes the gatekeeper. When Stripe fires the “payment completed” trigger, n8n maps buyer data, appends the attendee row in Google Sheets, emails the participant their confirmed access info, and alerts you via Gmail so you’re never guessing.
You can easily modify the email wording to match your brand voice based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Form Trigger
Set up the intake form that initiates event creation when a new meeting is submitted.
- Add and open Meeting Intake Form.
- Set Path to
1c6fe52c-48ab-4688-b5ae-7e24361aa602. - Set Form Title to
Create a new meeting. - Set Response Mode to
lastNode. - Confirm the form fields include title, price, date_start, hour, and minute with required flags matching the JSON.
{{ $('Meeting Intake Form').item.json.title }} resolve correctly.Step 2: Connect Settings and Routing Logic
Define global settings and split the creation flow from the payment flow.
- Open Configure Settings and set currency to
EUR. - Set sheet_url to
https://docs.google.com/spreadsheets/d/[YOUR_ID]/edit. - Set teacher_email to
[YOUR_EMAIL]. - Open Creation Flow Check and ensure the boolean condition uses Left Value
{{ $("Meeting Intake Form").isExecuted }}with operatortrue. - Verify the execution path: Meeting Intake Form → Configure Settings → Creation Flow Check.
Step 3: Set Up Zoom and Stripe Creation Flow
Configure the nodes that create the Zoom session, Stripe product, and payment link.
- Open Generate Zoom Session and set Topic to
{{ $('Meeting Intake Form').item.json.title }}. Credential Required: Connect your zoomOAuth2Api credentials. - In Generate Zoom Session, set Password to
{{ Math.random().toString(36).slice(-4); }}and Start Time to{{ new Date(new Date($('Meeting Intake Form').item.json.date_start).getTime() + ($('Meeting Intake Form').item.json.hour * 3600000) + ($('Meeting Intake Form').item.json.minute * 60000)).toISOString() }}. - Open Build Stripe Item and set URL to
https://api.stripe.com/v1/productswith MethodPOST. Credential Required: Connect your stripeApi credentials. - In Build Stripe Item, set body parameters: name to
{{ $('Meeting Intake Form').item.json.title }}, default_price_data[unit_amount] to{{ $('Meeting Intake Form').item.json.price * 100 }}, and default_price_data[currency] to{{ $('Configure Settings').item.json.currency }}. - Open Create Payment URL, set URL to
https://api.stripe.com/v1/payment_linksand Method toPOST. Credential Required: Connect your stripeApi credentials. - In Create Payment URL, set line_items[0][price] to
{{ $json.default_price }}and add all metadata fields shown in the JSON (event_sheet_id, zoom_link, zoom_password, zoom_id, title, start_time, price, currency).
Step 4: Configure Parallel Outputs and Event Logging
After payment link creation, the workflow creates an attendee sheet and logs the event details in parallel.
- Confirm that Create Payment URL outputs to both Generate Attendee Sheet and Assemble Event Details in parallel.
- Open Generate Attendee Sheet and set Title to
{{ $('Meeting Intake Form').item.json.date_start }} - {{ $('Meeting Intake Form').item.json.title }} - {{ $('Build Stripe Item').item.json.created }}. Credential Required: Connect your googleSheetsOAuth2Api credentials. - In Generate Attendee Sheet, set Document ID to
{{ $('Configure Settings').item.json.sheet_url }}and Sheet ID to{{ $('Build Stripe Item').item.json.created }}. - Open Assemble Event Details and verify the mapped fields like title, start, price, and payment_link use the expressions shown in the JSON.
- Open Log Event Record and set Operation to
append, Sheet Name to0, and Document ID to{{ $('Configure Settings').item.json.sheet_url }}. Credential Required: Connect your googleSheetsOAuth2Api credentials. - Open Dispatch Instructor Email and verify the subject and HTML message body contain the expressions for payment link, sheet link, and Zoom info. Credential Required: Connect your gmailOAuth2 credentials.
Step 5: Configure the Payment Completion Flow
Handle Stripe payment confirmations, append attendee data, and notify participants and instructors.
- Open Payment Completed Trigger and set Events to
checkout.session.completed. Credential Required: Connect your stripeApi credentials. - Enable Payment Completed Trigger (it is disabled by default in the JSON).
- Open Map Attendee Fields and set email to
{{ $('Payment Completed Trigger').item.json.data.object.customer_details.email }}and name to{{ $('Payment Completed Trigger').item.json.data.object.customer_details.name }}. - Open Append Attendee Row and set Document ID to
{{ $('Configure Settings').item.json.sheet_url }}and Sheet Name to{{ $('Payment Completed Trigger').item.json.data.object.metadata.event_sheet_id }}. Credential Required: Connect your googleSheetsOAuth2Api credentials. - Open Send Participant Confirmation and confirm the message uses
{{ $json.title }}and Zoom metadata expressions. Credential Required: Connect your gmailOAuth2 credentials. - Open Alert Instructor and confirm the message uses
{{ $('Assemble Event Details').item.json.title }}and attendee metadata. Credential Required: Connect your gmailOAuth2 credentials. - Ensure Alert Instructor leads to Workflow Finish to end the payment flow cleanly.
Step 6: Test & Activate Your Workflow
Validate the full creation and payment paths before enabling the workflow in production.
- Manually execute Meeting Intake Form and submit a test meeting to verify Generate Zoom Session, Build Stripe Item, and Create Payment URL create valid outputs.
- Confirm that Create Payment URL triggers Generate Attendee Sheet and Assemble Event Details in parallel and that Log Event Record appends a row.
- Use Stripe’s test mode to trigger Payment Completed Trigger and verify Append Attendee Row, Send Participant Confirmation, and Alert Instructor complete successfully.
- Successful execution should result in a Zoom meeting, a Stripe payment link, a new Google Sheet tab, and emails to the instructor and participant.
- Activate the workflow and keep Payment Completed Trigger enabled for production use.
Common Gotchas
- Stripe credentials can expire or need specific permissions. If things break, check your Stripe Developers keys and webhook/event access first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 30 minutes once your accounts are connected.
No. You’ll connect Zoom, Stripe, Gmail, and Google Sheets, then edit a few fields like your Sheet URL and email copy.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Stripe fees (typical card processing) and whatever your email/Zoom plan costs.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, but plan the data model first. You can keep the same “Meeting Intake Form” trigger, then adjust the “Assemble Event Details” and “Log Event Record” steps so multiple dates roll up under one cohort ID. Many people also tweak “Send Participant Confirmation” to include a cohort portal link, not just the Zoom info. If you want different emails for early-bird vs. regular pricing, that logic usually lives in the “Creation Flow Check” branching.
Usually it’s expired Zoom OAuth access or missing scopes on the Zoom app you connected in n8n. Reconnect Zoom in n8n, then confirm the account has permission to create meetings. Also check that the meeting fields you submit in the form are valid (timezone mistakes cause surprisingly weird failures). If it only fails sometimes, you may be hitting Zoom rate limits when you create several meetings back-to-back.
A lot more than you’d want to manage manually.
It depends on how “tight” you need the process to be. Zapier and Make can handle simple payment-to-email flows, but this setup benefits from n8n’s branching (creation vs. payment path), the ability to mix built-in nodes with HTTP requests, and the fact you can self-host when volumes grow. Another practical difference is control: your Google Sheet becomes the source of truth, not a chain of fragile zaps. If you want to add checks like “only email the password after payment confirmed,” n8n is honestly easier to reason about. Talk to an automation expert if you want a recommendation based on your exact signup flow.
Once this is running, paid sessions stop being a spreadsheet-and-inbox juggling act. You get clean payments, clean access, and a roster you can trust.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.