Zoom + Stripe: paid event signups in Google Sheets
Running a paid Zoom event sounds simple until you’re chasing payments, manually sending links, and fixing your attendee list five minutes before you go live.
This Zoom Stripe automation hits marketing managers launching webinars hardest, but coaches running group sessions and small ops teams selling classes feel the same chaos. You get paid access delivered automatically, plus a registration sheet that stays clean without babysitting.
Below is the exact n8n workflow setup: how it creates the event, takes payment, logs the attendee in Google Sheets, then emails everyone the right thing at the right time.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Zoom + Stripe: paid event signups in Google Sheets
flowchart LR
subgraph sg0["Creation 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/>Create Zoom meeting"]
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/>Create Stripe Product"]
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Config", pos: "b", h: 48 }
n3@{ icon: "mdi:message-outline", form: "rounded", label: "Send email to teacher", pos: "b", h: 48 }
n4@{ icon: "mdi:database", form: "rounded", label: "Create participant list", pos: "b", h: 48 }
n5@{ icon: "mdi:database", form: "rounded", label: "Add participant to list", pos: "b", h: 48 }
n6@{ icon: "mdi:message-outline", form: "rounded", label: "Send confirmation to partici..", pos: "b", h: 48 }
n7@{ icon: "mdi:message-outline", form: "rounded", label: "Notify teacher", 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 link"]
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Format participant", pos: "b", h: 48 }
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Format event", pos: "b", h: 48 }
n11@{ icon: "mdi:database", form: "rounded", label: "Store event", 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/>Creation 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/>On payment"]
n14@{ icon: "mdi:swap-horizontal", form: "rounded", label: "if is creation flow", pos: "b", h: 48 }
n15@{ icon: "mdi:cog", form: "rounded", label: "the end", 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 events break in the handoff
Paid events usually fail in the messy middle. You create a Zoom meeting, then you build a payment link, then you try to “keep a list” somewhere, then you manually email access details to everyone who paid. It works for the first few signups. Then someone pays with a different email than the one they want the invite sent to. Or your sheet is out of date. Or a legitimate buyer emails you two minutes after paying asking “Where’s the link?” Now you’re doing support instead of hosting.
It adds up fast. Here’s where it breaks down.
- Confirmation emails become a manual copy-paste job, which means slow delivery and a lot of “did you get it?” messages.
- Your registration list lives in three places at once, so you never fully trust the count.
- Stripe tells you someone paid, but it doesn’t automatically tell Zoom (or your inbox) what to do next.
- Creating a new event is repetitive admin work, and the repetition is exactly what causes mistakes.
The Solution: Create the event once, then let payments unlock access
This workflow gives you two clean lanes: one for setting up a paid Zoom event, and another for handling each signup after payment. An admin submits event details through a simple intake form (title, date/time, and price). n8n creates the Zoom meeting with a password, then creates a Stripe Product and a Stripe Payment Link tied to that exact event. Next, it spins up a dedicated tab inside your Google Sheet for the attendee list and emails the organizer everything they need in one place. When someone pays, Stripe fires a webhook, n8n extracts the customer info, adds them to the correct sheet tab, emails the attendee the Zoom link and password, and notifies the organizer that a new person is in.
The workflow starts with an event creation form or a Stripe “payment completed” signal. In the middle, it passes the right event metadata from Stripe into Google Sheets and Gmail. Finally, both attendee and host get emails that match what actually happened.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you run one paid Zoom workshop each week and get about 30 attendees. Manually, you’ll spend roughly 20 minutes creating the meeting, another 20 minutes setting up Stripe, then maybe 5 minutes per attendee across email replies, spreadsheet updates, and double-checking access. That’s around 3 hours a week. With this workflow, setup is one form submission (about 5 minutes), then each signup gets logged and emailed automatically while you do something else.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Zoom for creating meetings automatically
- Stripe to create products and collect payments
- Google Sheets + Gmail to track signups and email access
- Stripe API key (get it from Stripe Developers dashboard)
Skill level: Intermediate. You’ll connect accounts, paste a sheet URL, and test a Stripe webhook once.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
An admin submits the event details. The Meeting Intake Form feeds title, price, and start time into a single “setup parameters” step so everything downstream stays consistent.
The workflow decides which branch to run. An If check routes the data into event creation (new meeting, new payment link, new sheet tab) or participant registration (new row, confirmation email).
Event creation generates the assets. Zoom creates the meeting, HTTP calls create a Stripe Product and a Payment Link, then Google Sheets creates a dedicated tab and Gmail sends the organizer a neat “here’s everything” email.
Payment completion unlocks access. When Stripe fires checkout.session.completed, the workflow formats attendee details, appends them to the correct Google Sheet tab, emails the attendee the Zoom link + password, and notifies the organizer.
You can easily modify the email copy to match your brand tone based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Form Trigger
This workflow starts from a form intake and a Stripe payment webhook. Configure both triggers so events can be created and purchases can be captured.
- Open Meeting Intake Form and set Form Title to
Create a new meeting. - Confirm Form Description is
This automates the creation of a Zoom Meeting and a Stripe Payment page, streamlining your event setup process.. - In Meeting Intake Form, keep Path as
1c6fe52c-48ab-4688-b5ae-7e24361aa602and Response Mode aslastNode. - Verify form fields include title, price, date_start, hour, and minute with the required flags matching the node.
- Open Stripe Payment Trigger and set Events to
checkout.session.completed. - Credential Required: Connect your stripeApi credentials in Stripe Payment Trigger.
Step 2: Connect Stripe, Zoom, and Google Sheets
These nodes create the Zoom meeting, build Stripe products, and write to Google Sheets.
- Credential Required: Connect your zoomOAuth2Api credentials in Generate Zoom Session.
- In Generate Zoom Session, set Topic to
={{ $('Meeting Intake Form').item.json.title }}, 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() }}. - Credential Required: Connect your stripeApi credentials in Stripe Product Builder and Stripe Payment Link.
- In Stripe Product Builder, set URL to
https://api.stripe.com/v1/productsand keep Content Type asform-urlencoded. - In Stripe Product Builder body parameters, set 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={{ $('Setup Parameters').item.json.currency }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Participant Sheet Setup, Append Participant Row, and Log Event Record.
Step 3: Set Up Processing and Routing
These nodes define defaults, route between creation and payment flows, and map data for later steps.
- In Setup Parameters, set currency to
EUR, sheet_url tohttps://docs.google.com/spreadsheets/d/[YOUR_ID], and teacher_email to[YOUR_EMAIL]. - In Branch Creation Check, set the boolean condition leftValue to
={{ $("Meeting Intake Form").isExecuted }}to route creation vs. payment flows. - In Participant Data Prep, map email to
={{ $('Stripe Payment Trigger').item.json.data.object.customer_details.email }}and name to={{ $('Stripe Payment Trigger').item.json.data.object.customer_details.name }}. - In Event Data Mapping, map fields like title to
={{ $('Meeting Intake Form').item.json.title }}and payment_link to={{ $json.url }}to prepare the event record for logging and emails.
[YOUR_ID] and [YOUR_EMAIL] in Setup Parameters or the sheet and emails will fail.Step 4: Configure Output and Notification Nodes
These nodes create payment links, sheets, log records, and send emails. Note the parallel branch after the payment link is created.
- In Stripe Payment Link, set URL to
https://api.stripe.com/v1/payment_linksand add body parameters like line_items[0][price] as={{ $json.default_price }}, plus metadata fields for zoom_link, zoom_password, and event_sheet_id. - Stripe Payment Link outputs to both Participant Sheet Setup and Event Data Mapping in parallel.
- In Participant Sheet Setup, set Operation to
createand Title to={{ $('Meeting Intake Form').item.json.date_start }} - {{ $('Meeting Intake Form').item.json.title }} - {{ $('Stripe Product Builder').item.json.created }}. - In Log Event Record, set Operation to
appendand Document ID to={{ $('Setup Parameters').item.json.sheet_url }}. - In Append Participant Row, set Operation to
append, Sheet Name to={{ $('Stripe Payment Trigger').item.json.data.object.metadata.event_sheet_id }}, and Document ID to={{ $('Setup Parameters').item.json.sheet_url }}. - Credential Required: Connect your gmailOAuth2 credentials in Instructor Email Notice, Attendee Confirmation Email, and Instructor New Signup.
- Review the email templates in Instructor Email Notice, Attendee Confirmation Email, and Instructor New Signup to ensure the dynamic values (e.g.,
={{ $('Stripe Payment Link').item.json.url }}) are correct for your use case.
Step 5: Test and Activate Your Workflow
Validate both the meeting creation flow and the payment confirmation flow before going live.
- Click Execute Workflow and submit the Meeting Intake Form with test values to trigger Generate Zoom Session, Stripe Product Builder, and Stripe Payment Link.
- Verify a new sheet was created by Participant Sheet Setup and a row was appended by Log Event Record.
- Confirm Instructor Email Notice contains the Zoom details and payment link generated in the run.
- Use Stripe’s test mode to trigger Stripe Payment Trigger, then confirm Append Participant Row adds the attendee and Attendee Confirmation Email sends correctly.
- When tests succeed, toggle the workflow to Active so it runs automatically for real form submissions and payments.
Common Gotchas
- Stripe webhooks need the right endpoint and event type. If registrations don’t trigger, check your Stripe Developers webhooks page and confirm checkout.session.completed is enabled.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Gmail and Google Sheets permissions can be stricter than people expect. If rows aren’t writing, check the Google credential in n8n and confirm the sheet is shared with the right Google account.
Frequently Asked Questions
About 45 minutes if your Zoom, Stripe, and Google accounts are ready.
No. You’ll mostly connect credentials and paste in your Google Sheet URL. The only “technical” bit is testing the Stripe webhook once.
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 for payments and your email sending limits in Gmail.
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 it out first. The simplest approach is to route by form input (in the “Setup Parameters” or mapping steps) and send the organizer emails to different addresses. You can also create different sheet tabs per instructor, or keep one tab and add an “Instructor” column. Common tweaks include changing the email wording, switching currencies in the Config node, and adjusting how the Zoom password is generated.
Most of the time it’s the webhook setup or an API key mismatch between test mode and live mode. Regenerate the Stripe key, update it in n8n, then confirm the webhook endpoint is pointing to the right workflow URL. Also check the Stripe event payload you’re receiving; if the workflow expects checkout.session.completed but you’re testing a different event, nothing will append to Sheets.
A lot. On n8n Cloud Starter you’re typically fine for small events, and higher plans handle heavier volume. If you self-host, there’s no execution cap; it mostly depends on your server and how fast Google Sheets and Gmail accept requests.
Often, yes, because this workflow has two branches (event creation and payment registration) and benefits from conditional logic. n8n also gives you a practical self-hosting option, which matters when you run a lot of signups and don’t want the bill to spike. Another advantage is the way it mixes native app nodes (Zoom, Sheets, Gmail, Stripe trigger) with HTTP calls for Stripe resources, which is flexible when your Stripe setup evolves. Zapier or Make can still be fine if you want a quick two-step “Stripe payment → email” flow and you never change anything. If you’re unsure, Talk to an automation expert and get a recommendation based on volume and complexity.
You set up the event once, then every paid signup turns into an email sent and a row logged. Honestly, that calm feeling right before you go live is the point.
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.