You built a paid community. Members pay. You get a Stripe notification. Then you manually check who paid, invite them to Discord, assign their role, send a welcome email, and add them to your spreadsheet.

Then someone cancels. You remove access. Manually.

Then three more people sign up at 2am on a Saturday.

This is how most paid community operators run — and it's the fastest way to burn out, miss revenue, and deliver a broken member experience. The fix is a fully automated onboarding system that connects Stripe to Discord in under 15 minutes of actual configuration.

This guide walks through the exact workflow, the tools, and the step-by-step setup.

What You're Building

A complete automated onboarding system that triggers the moment a member pays and handles everything without you touching it:

  • Payment → Discord access — Member gets an invite link to your server with the correct role automatically assigned
  • Welcome email sent — Personalised message with onboarding instructions, community guidelines, and their first action step
  • CRM or spreadsheet updated — Name, email, payment amount, and join date logged instantly
  • Cancellation → access revoked — When a subscription lapses, their Discord role is removed automatically
  • Failed payment → retry sequence — Automated email nudge sent before access is cut

The result: a member pays at 3am and has full access in under 60 seconds. No manual work. No missed joins. No awkward "wait, did your payment go through?" DMs.

The Tools You Need

You need three things working together:

  1. Stripe — for payments and webhooks
  2. Discord — for your community platform
  3. n8n — the automation layer that connects them (self-hosted or n8n cloud)

n8n is the backbone here. It's an open-source workflow automation tool that can listen for Stripe webhooks and take actions on Discord, email, Google Sheets, Notion, or anything else with an API. It's more flexible than Zapier and dramatically cheaper at scale.

You don't need to write code. Everything is configured visually through n8n's node editor.

Step 1: Configure Your Stripe Webhook

Stripe fires webhook events every time something happens — payment succeeded, subscription cancelled, invoice failed. You're going to listen for these and trigger your automation.

In your Stripe Dashboard:

  1. Go to Developers → Webhooks → Add endpoint
  2. Set the endpoint URL to your n8n webhook URL (you'll get this in Step 3)
  3. Select these events to listen for:
    • checkout.session.completed — New member paid
    • customer.subscription.deleted — Subscription cancelled
    • invoice.payment_failed — Payment attempt failed
    • customer.subscription.updated — Plan change or renewal
  4. Save and copy your Webhook Signing Secret — you'll need this to verify events in n8n

The signing secret is critical. It proves that incoming webhook requests genuinely came from Stripe and haven't been tampered with. Always verify it.

Step 2: Set Up Your Discord Bot

You need a Discord application with a bot token that has permission to manage roles and create invite links in your server.

In the Discord Developer Portal:

  1. Click New Application → name it (e.g. "ShipWorkflow Bot")
  2. Go to the Bot tab → click Reset Token → copy the token securely
  3. Under Privileged Gateway Intents, enable Server Members Intent
  4. Go to OAuth2 → URL Generator:
    • Scopes: bot
    • Bot Permissions: Manage Roles, Create Instant Invite, Manage Members
  5. Copy the generated URL and open it in your browser to invite the bot to your server

In your Discord server settings, make sure your bot's role is positioned above the member roles it needs to assign. Discord uses a hierarchy — bots can only manage roles below their own rank.

Also get your Server ID and the Role ID for your paid member role: right-click the server icon → Copy Server ID, and right-click the role in Settings → Roles → Copy Role ID.

Step 3: Build the n8n Workflow

This is where everything connects. Open n8n (cloud or self-hosted) and create a new workflow.

Trigger Node: Stripe Webhook

Add a Webhook node as your trigger:

  • HTTP Method: POST
  • Path: /stripe-community (or any unique path)
  • Authentication: Header Auth using your Stripe signing secret

Copy the generated webhook URL — this goes into your Stripe webhook endpoint from Step 1.

Router Node: Branch by Event Type

Add a Switch node that reads {{ $json.body.type }} and branches:

  • Value 1: checkout.session.completed → Route to onboarding branch
  • Value 2: customer.subscription.deleted → Route to offboarding branch
  • Value 3: invoice.payment_failed → Route to recovery branch

Onboarding Branch (New Members)

When a checkout completes, you need to:

  1. HTTP Request node → Call Discord API to create an invite link:
    • URL: https://discord.com/api/v10/channels/{channel_id}/invites
    • Method: POST
    • Headers: Authorization: Bot {your_bot_token}
    • Body: {"max_uses": 1, "unique": true} — single-use invite
  2. HTTP Request node → Add member role after they join (via Discord guild member endpoint)
  3. Email node (Gmail/SMTP/SendGrid) → Send welcome email with the invite link and onboarding steps
  4. Google Sheets node → Append a row with member name, email, Stripe customer ID, join date

For the email, pull the member's email directly from the Stripe webhook payload: {{ $json.body.data.object.customer_details.email }}. Their name is at {{ $json.body.data.object.customer_details.name }}.

Offboarding Branch (Cancellations)

When a subscription is deleted:

  1. Look up their Discord user ID — store this in your Google Sheet when they join
  2. HTTP Request node → Remove their role via Discord's Guild Member Role endpoint
  3. Email node → Send a farewell email with a re-subscribe link
  4. Google Sheets node → Update their row with an end date

Recovery Branch (Failed Payments)

  1. Email node → Send a "your payment failed" email with a direct link to update card details
  2. Optionally: send a DM via Discord bot
  3. After 3 failed attempts, Stripe will fire the subscription.deleted event, triggering your offboarding branch automatically

Step 4: Test Everything Before Going Live

Stripe has a built-in test mode — use it. Run a test checkout with card number 4242 4242 4242 4242 and verify each step fires correctly in n8n's execution log.

Check that:

  • The webhook fires and n8n receives it
  • The invite link is generated and included in the email
  • The Google Sheet row is created
  • The cancellation flow removes the role (test with Stripe's "Cancel Subscription" button in test mode)

n8n shows every execution with the full data at each node. If something fails, the error is usually a wrong field path or a missing bot permission — both easy fixes.

Step 5: Handle Edge Cases

A production system needs to handle the messiness of real users:

Member joins Discord before you assign their role

Single-use invite links mean they're already in the server. Your workflow needs to fetch their Discord member ID and assign the role separately. Use Discord's GET /guilds/{guild_id}/members endpoint, filtering by recent join time, to find the right member.

Member doesn't join Discord after paying

Add a follow-up email node with a 24-hour delay that re-sends the invite link if they haven't joined yet. n8n's Wait node makes this trivial.

Subscription upgrades (tier changes)

Listen for customer.subscription.updated and compare previous_attributes.items vs current items. If the plan changed, remove the old role and assign the new one.

Refunds

Listen for charge.refunded — treat it the same as a cancellation for access purposes.

The Results You Can Expect

Here's what a typical community operator sees after implementing this system:

  • Onboarding time per member: from 15 minutes to 0 — every join is handled automatically
  • Revenue leakage drops to near-zero — no more missed cancellations or people keeping access after stopping payment
  • Member experience improves measurably — access in under 60 seconds vs hours (or days)
  • Churn decreases — failed payment recovery emails catch 15–30% of members who would have lapsed silently

One community operator we worked with was manually processing 40+ joins per week. After automation: zero manual work, zero missed access grants, and a 22% improvement in 30-day retention because new members got instant access instead of waiting.

Going Further: What Else You Can Automate

Once the core flow is live, the same infrastructure handles more:

  • Weekly engagement emails — sent automatically based on member tenure (Day 7, Day 30, Day 90)
  • Win-back sequences — triggered when a member cancels, with personalised offers after 7, 14, and 30 days
  • Upsell triggers — if a member has been active for 60+ days, automatically offer them an annual plan
  • Community health alerts — alert you via Slack or Discord if signups drop below a threshold
  • Affiliate tracking — log referral source from Stripe metadata and attribute revenue automatically

The same n8n workflow can be extended node by node. Each addition takes minutes, not days.

Common Mistakes to Avoid

Using shared invite links instead of single-use links. Shared links can be forwarded. Always generate a unique, max-uses-1 invite per member so there's no way for unpaid members to sneak in.

Not storing the Discord user ID. You need it to remove roles on cancellation. Log it to your database or Google Sheet the moment a member joins your server.

Skipping Stripe webhook signature verification. An unverified webhook endpoint accepts requests from anyone. Always validate the Stripe-Signature header using your signing secret.

Building the offboarding branch last. Access removal is just as important as access granting. Build it on day one, before you have paying members who might cancel.

Using Zapier for high-volume communities. Zapier's task limits become expensive fast. At 500+ members, n8n (self-hosted on a $5 VPS) costs less than $10/month versus hundreds on Zapier.

How Long Does This Take to Build?

For someone comfortable with APIs and no-code tools: 3–4 hours to have a working system in test mode, another hour to go live and monitor the first real transactions.

If you've never touched webhooks or Discord bots before: expect 1–2 days including troubleshooting Discord permissions (they're the most common sticking point).

If you'd rather have it done right the first time — without the learning curve — we can have your community running on full automation within 48 hours of a scoping call.