How to Manage Paid Creator Memberships with Stripe Subscriptions and Welcome Emails

When a fan subscribes to one of your membership tiers in Stripe, this Spojit workflow reads the subscription, records the new member on a Monday CRM board, and sends a branded welcome email through Resend, all within seconds of the payment going through.

What This Integration Does

As a creator, your paid community is a real business: members join across multiple tiers, each tier carries different perks, and every new sign-up deserves a fast, on-brand welcome. Doing this by hand means watching your Stripe dashboard, copying names into a spreadsheet or CRM, and pasting a welcome message that always reads a little late and a little generic. This Spojit workflow removes all of that. The moment Stripe confirms a new subscription, your member lands on a Monday board with their tier and email captured, and they receive a welcome email from your own sending domain through Resend, so the first thing they see after paying is a polished message and not silence.

The workflow is event-driven. A Stripe customer.subscription.created webhook starts each run, so there is one run per new subscription with no polling or schedule to manage. Spojit reads the customer and the subscription detail, reshapes the data into a clean member record, writes that record to your Monday CRM board, and sends the welcome email. The result it leaves behind is a new Monday item plus a delivered email; nothing is mutated in Stripe. Because Stripe can replay webhooks and may send the same event more than once, you guard against duplicate members with a tier lookup and a deduplication option on the trigger, so re-runs of the same event do not create a second board item or a second welcome.

Prerequisites

  • A Stripe connection in Spojit (API key) with read access to customers and subscriptions. See the Stripe connector reference.
  • A Monday.com connection in Spojit, plus the boardId of your members CRM board and the column IDs you want to populate (name, email, tier, status). See the Monday.com connector reference.
  • A Resend connection with a verified sending domain so the welcome email comes from your own address. See the Resend connector reference.
  • A Webhook signing connection using the Custom scheme to verify Stripe's signature header. See setting up a webhook connection.
  • Membership tiers configured as Stripe products or prices, so each subscription carries a price or product you can map to a tier name.

Step 1: Start with a Webhook Trigger for new subscriptions

Add a Trigger node and set its type to Webhook. Spojit gives the trigger a unique URL; paste that URL into Stripe under Developers - Webhooks and subscribe it to the customer.subscription.created event. Attach your Custom signing connection so Spojit verifies Stripe's Stripe-Signature header on every call and rejects anything unsigned. Turn on event-id deduplication and point it at Stripe's event id header so a replayed event does not start a second run. The trigger output is the parsed JSON event body, available as {{ input }}. The two identifiers you need downstream are the customer id and subscription id, which live at:

{{ input.data.object.customer }}
{{ input.data.object.id }}

Step 2: Read the customer with the Stripe connector

Add a Connector node on the stripe connector in Direct mode and choose the get-customer tool. Direct mode is right here because this is a single, predictable lookup with no AI cost. Map its one input, id, to the customer id from the trigger:

id: {{ input.data.object.customer }}

The result includes the member's email and name as held in Stripe, which you will use for both the Monday record and the Resend greeting. Store the output in a variable such as customer so later steps read it as {{ customer.email }} and {{ customer.name }}.

Step 3: Confirm the tier with list-subscriptions

Add a second Connector node on the stripe connector in Direct mode and choose list-subscriptions. The webhook payload already names the subscription, but listing by customer and active status gives you a clean, current view of what the member actually holds and lets you ignore stale events. Map the inputs:

customer: {{ input.data.object.customer }}
status: active
limit: 1

From the returned subscription you can read the price or product id on the subscription item, which is the value you map to a human tier name in the next step. Save this output as subscription.

Step 4: Shape the member record with a Transform node

Add a Transform node to assemble one clean object from the pieces you have gathered and to turn the Stripe price or product id into a readable tier label. Build a structured object that maps each of your tiers and falls back to a default, for example:

{
  "name": {{ customer.name }},
  "email": {{ customer.email }},
  "tier": "Gold Tier",
  "subscriptionId": {{ input.data.object.id }},
  "joinedAt": {{ input.data.object.created }}
}

Keep the mapping logic here so the downstream Monday and Resend steps stay simple. If your tier-to-name mapping is more involved than a short lookup, a Connector node on the code connector with execute-javascript can resolve it; see using Code Runner to extend workflows with custom logic. Store the result as member.

Step 5: Add the member to your Monday CRM board

Add a Connector node on the monday connector in Direct mode and choose create-item. Map boardId to your members board, set name to the member's name, and pass columnValues as an object keyed by your board's column IDs:

boardId: 1234567890
name: {{ member.name }}
columnValues: {
  "email_col": { "email": "{{ member.email }}", "text": "{{ member.email }}" },
  "tier_col": "{{ member.tier }}",
  "status_col": { "label": "Active" }
}

The exact column IDs come from your own board; open a column's settings in Monday to find its ID. Optionally add a follow-up Connector node with create-update to post a timeline note on the new item recording the Stripe subscription id for audit. For a fuller walkthrough of writing items to a board, see building a tracking board in Monday.com.

Step 6: Send a branded welcome with Resend

Add a Connector node on the resend connector in Direct mode and choose send-email so the message comes from your own verified domain rather than Spojit's shared mail service. Map the fields, leaving from to the connection default or setting it explicitly:

from: Your Studio <hello@yourdomain.com>
to: {{ member.email }}
subject: Welcome to the {{ member.tier }}, {{ member.name }}!
html: <p>Hi {{ member.name }}, thanks for joining the {{ member.tier }}. Here is how to get started...</p>
reply_to: hello@yourdomain.com

If you would rather draft tier-specific welcome copy in your own brand voice instead of a fixed template, generate the body with an Agent-mode Connector node first and pass its output into the html field; the agent is the runtime AI that writes the copy. For a simpler internal notice that does not need your domain, the built-in Send Email node works too, but for a member-facing welcome the Resend send-email tool keeps deliverability and branding on your side. See building email notifications with Resend.

Tips

  • Scaffold the whole flow fast by describing it to Miraxa, the intelligent layer across your automation, then fine-tune each node in the properties panel. A prompt like "add a Stripe Direct-mode node that calls get-customer with the customer from the webhook" wires the node for you.
  • Keep tier names in one place. Maintaining the price-to-tier map only inside the Transform node means adding a new tier later is a one-node change.
  • Set limit: 1 and status: active on list-subscriptions to avoid paging through a member's history when you only care about what they just bought.
  • Use the reply_to field on the Resend send-email call so replies from excited new members land in an inbox you actually watch.

Common Pitfalls

  • Webhook replays. Stripe retries deliveries and may send the same customer.subscription.created event more than once. Enable event-id deduplication on the trigger so a retry does not create a duplicate Monday item or a second welcome email.
  • Missing customer email. A Stripe customer created via Checkout usually has an email, but customers created through other paths may not. Add a Condition node after get-customer to skip the email step when {{ customer.email }} is empty.
  • Unverified Resend domain. The send-email call fails if your sending domain is not verified, or if from is omitted and no default from address is set on the connection. Verify the domain first and confirm the connection has a default sender.
  • Wrong Monday column IDs. create-item silently ignores column keys that do not match real column IDs, so a typo leaves fields blank with no error. Copy each column ID from the board rather than guessing from the column title.

Testing

Before pointing live traffic at the workflow, create a test subscription in Stripe test mode and let Stripe deliver the real customer.subscription.created event to your webhook URL, or use Stripe's "Send test webhook" button for that event. Watch the run in your execution history and confirm each step: the get-customer output shows the right email, list-subscriptions returns the expected tier, the Transform node produces a clean member object, a new item appears on your Monday board with the columns populated, and a welcome email arrives. Send the test email to an address you own first, then widen to real members once the tier mapping and copy look right.

Learn More

Did this answer your question? Thanks for the feedback There was a problem submitting your feedback. Please try again later.