System Documentation

Membership Checkout System

Complete reference for the membership checkout flow — from user signup to active member provisioning. Covers the SetupIntent payment flow, OfficerRnD integration, auto-promo system, and MailerSend email confirmations.

Stack Webflow · Cloudflare · Stripe · OfficerRnD · MailerSend
Replaces OfficerRnD GrowthHub (12% fee)
Site labourtemple.com

How it all connects

The checkout system avoids the OfficerRnD GrowthHub fee by owning the payment flow directly via Stripe. The Cloudflare Worker orchestrates member provisioning and email confirmations.

Webflow Membership pages + checkout form
Cloudflare Worker Payment + provisioning orchestration
Stripe Payment processing
O OfficerRnD Member database
MailerSend Email confirmations
Key benefit: By owning the payment flow via Stripe directly, Labour Temple avoids OfficerRnD's 12% GrowthHub transaction fee. The Worker handles member provisioning directly — no Zapier needed.

From page visit to active member

Eleven steps take a visitor from landing on a membership page to being fully provisioned as a member.

1
User lands on a membership page

Visitor browses to a membership page on labourtemple.com (e.g. /memberships/all-access). Each page is a Webflow CMS collection item with a unique plan-slug field.

Webflow CMS
2
Order summary renders

The checkout JS fetches plan data from the Worker and renders pricing with pro-rated amounts. If the plan has an auto-promo code (e.g. AUTO-ALL-ACCESS), it's validated against Stripe and applied automatically.

Checkout JS
3
User fills out the checkout form

Native Webflow fields collect: first name, last name, email, phone, company name, referral source, and optional notes. The Stripe Payment Element collects card or bank account details.

Webflow + Stripe
4
User clicks "Join Now"

The site script calls window._validate() to check all required fields. If validation fails, fields are highlighted and submission is stopped.

Site Script
5
Card details are tokenized

The script calls elements.submit() to securely tokenize the payment method with Stripe — without charging it yet.

Stripe.js
6
Worker creates member + SetupIntent

Form data and plan slug are sent to POST /create-payment. The Worker creates or finds an OfficerRnD member, creates or finds a Stripe Customer, and creates a SetupIntent. Returns clientSecret, setupIntent ID, and memberId.

Cloudflare Worker
7
Payment method is confirmed

The site script calls stripe.confirmSetup() with the client secret. Stripe confirms the card or bank account via the Payment Element.

Stripe
8
Checkout is completed

The site script calls window._complete(), which sends memberId, setupIntent, plan, and promo to POST /complete-checkout.

Checkout JS
9
Worker provisions everything

The Worker retrieves the confirmed SetupIntent, sets the default payment method, adds the initiation fee as a one-time invoice item, creates the Stripe subscription (with promo code if provided), and creates the OfficerRnD membership.

Cloudflare Worker
10
Confirmation emails sent

The Worker sends a branded confirmation email to the customer and a plain-text notification to the team (admin@labourtemple.com, membership@labourtemple.com, chris@hundredacre.design) via MailerSend.

MailerSend
11
User redirected

On success, the user is redirected to /join-confirmation.

Webflow

What each service does

Five services work together to power the checkout system.

Webflow
Frontend — membership pages & form

Hosts membership pages (CMS collection) and embeds the checkout form. Native form fields handle user input while an embed block contains the Stripe Payment Element and checkout logic.

  • Sitelabourtemple.com
  • Site ID639b202ca505e87cee446ad0
  • CollectionMemberships (68d71235d108eda6fe6cf610)
  • TemplateMemberships page (68d71235d108eda6fe6cf617)
  • Embedcheckout-embed.html (~4.2K chars)
  • External JScheckout.js (served from Worker, ~11.7K)
  • Site Scriptstripe_checkout_v20 (1,810 chars)
Cloudflare Worker
Backend API — checkout orchestration

Orchestrates the entire checkout: creates OfficerRnD members, Stripe customers, SetupIntents, subscriptions, memberships, and sends confirmation emails. Also serves the external checkout JS and validates promo codes.

  • Namelabour-temple-checkout
  • URLlabour-temple-checkout.labourtemple.workers.dev
  • EndpointsGET /checkout.js, GET /plans, POST /create-payment, POST /complete-checkout, POST /validate-promo
  • SecretsSTRIPE_SECRET_KEY, OFFICERND_CLIENT_ID, OFFICERND_CLIENT_SECRET, MAILERSEND_API_KEY
  • Deploycd cloudflare-worker && npx wrangler deploy
Stripe
Payment processing & subscriptions

Processes card and ACH payments, manages subscriptions, stores customer metadata. Uses SetupIntent flow — payment method is confirmed before subscription is created.

  • ModeLive
  • MethodsCard + US Bank Account (ACH)
  • FlowSetupIntent → Subscription
  • Pro-rateBilling anchored to 1st of next month
  • Initiation FeeOne-time invoice item on first invoice
O
OfficerRnD
Member database & space management

Stores member records and membership assignments. The Worker handles this directly via the v1 API — no Zapier needed.

  • Orglabour-temple
  • Authidentity.officernd.com/oauth/token
  • APIapp.officernd.com/api/v1/organizations/labour-temple
  • Scopesmembers.read/create, memberships.read/create
MailerSend
Email confirmations

Sends branded confirmation emails to new members and plain-text notifications to the team after each successful checkout.

  • APIapi.mailersend.com/v1/email
  • Templatez3m5jgr0y5xgdpyo (customer confirmation)
  • Teamadmin@labourtemple.com, membership@labourtemple.com, chris@hundredacre.design
  • Non-blockingEmail failures don't break checkout

Current plan configuration

Six plans are currently live in the checkout system. Each plan slug must match exactly between Webflow CMS and the Worker's PLAN_CONFIG.

Plan Name Slug Monthly Initiation Pro-rate Terms
Passport – Monthly passport $100/mo $100 Yes /legal/membership-terms
Labour Temple Startup startup $30/mo $100 Yes /legal/membership-terms
Labour Temple All Access all-access $300/mo $200 Yes /legal/membership-terms
Founder Membership founder $500/mo $200 Yes /legal/membership-terms
Sonic Studio: Creator Pass creator-pass $500/mo $200 No /legal/sonic-terms
Meeting Spaces: Innovator Pass innovator-pass $500/mo $200 No /legal/membership-terms
Pro-rating: Pro-rated plans (Passport, Startup, All Access, Founder) anchor billing to the 1st of the next month. Members pay a pro-rated amount for the remainder of the current month. Non-pro-rated plans (Creator Pass, Innovator Pass) start billing immediately on the signup date.
Adding a new plan: Requires four steps: (1) create the Stripe Product + Price, (2) add the entry to the Worker's PLAN_CONFIG and redeploy, (3) add a CMS item in Webflow with a matching plan-slug, (4) publish the Webflow site.

Convention-based promotional pricing

Certain plans can automatically apply a promo code on page load — no code changes needed.

How it works

The auto-promo convention follows the pattern AUTO-{PLAN-SLUG} in uppercase. For example, AUTO-ALL-ACCESS for the all-access plan.

Activation steps

  1. On page load, checkout.js constructs the auto-promo code from the plan slug
  2. Validates against Stripe via POST /validate-promo
  3. On success, re-renders order summary with discount applied
  4. On form submit, passes the promo code to /complete-checkout which reduces the initiation fee

How to add an auto-promo

  1. Create coupon in Stripe
  2. Create promotion code named AUTO-{SLUG}
  3. Done

How to remove an auto-promo

  1. Deactivate the promotion code in Stripe
  2. Done
Behavior notes: Auto-promos apply to the initiation fee; manual promos apply to the subscription. Both can be active simultaneously. Failure is silent — no error, form works without discount.

Common tasks

  1. Create Stripe Product + Price
  2. Add to PLAN_CONFIG in worker.js
  3. Deploy worker: npx wrangler deploy
  4. Add Webflow CMS item with matching plan-slug
  5. Publish site

Three locations contain checkout logic:

  • Embed HTML: CSS/styling (rarely edited)
  • External JS (checkout.txt): Logic, deploy worker via npx wrangler deploy
  • Site script (stripe_checkout_v20): Stripe initialization (2K char limit)
  • Customer template: MailerSend dashboard (template z3m5jgr0y5xgdpyo)
  • Team recipients: TEAM_EMAILS array in worker.js
  • Embed: Copy to Webflow, restore data-plan binding, publish
  • External JS: Edit checkout.txt, wrangler deploy (5 min cache)
  • Worker: wrangler deploy
  • Site script: Register via Scripts API, apply to page, publish
  • Cloudflare: wrangler tail or Dashboard
  • Stripe: Dashboard > Developers > Logs
  • MailerSend: Dashboard > Activity

Architecture decisions & patterns

Two-step pattern:

  • Step 1 (POST /create-payment): Creates member + customer + SetupIntent
  • Step 2 (POST /complete-checkout): After confirmSetup, creates subscription + membership + sends emails

Pro-rated plans use billing_cycle_anchor to the 1st of next month.

Webflow has two hard limits: 10K embed, 2K site script. Checkout logic is ~11.7K. Solution: host JS on Worker at /checkout.js, loaded via script tag. Source file uses .txt extension for Wrangler text import.

  • window._S — Stripe appearance config
  • window._validate — Field validation function
  • window._complete — Checkout completion handler
  • window._promo — Active promo code
  • window._autoPromo — Auto-promo code

Embed must run before site script.

Emails via MailerSend are sent with Promise.allSettled and failures are logged but don't break checkout.

  • Custom Checkout ui_mode:custom returns 403. Do not attempt.
  • One-time plans: Not in checkout
  • Stripe styling: Limited to Appearance API
  • ACH bank names: Truncated display
  • Scripts API add_inline_site_script: Overwrites all site scripts
  • checkout.js cache: 5 minutes

Common issues & fixes

Payment Element not showing

Check CMS plan-slug matches PLAN_CONFIG key, data-plan attribute set on #checkout, window._S defined, site script applied and published.

"Invalid plan" from Worker

Plan slug mismatch between CMS and PLAN_CONFIG.

CORS error in console

Origin not in ALLOWED_ORIGINS, add to worker.js and redeploy.

window._S or _validate undefined

checkout.js hasn't loaded, check Network tab.

Emails not sending

Check MAILERSEND_API_KEY secret, check MailerSend dashboard Activity log. Checkout still succeeds.

OfficerRnD member not created

Check OFFICERND secrets, check Worker logs in Cloudflare dashboard.

Auto-promo not applying

Verify promotion code exists and is active in Stripe, check code matches AUTO-{SLUG} format.

Debugging tools

Browser Console for JS errors · Network tab for POST requests · Cloudflare Logs for Worker errors · Stripe Dashboard > Developers > Logs · MailerSend Dashboard > Activity

Membership plans at a glance

Complete feature matrix for all six membership plans — benefits, discounts, amenities, and content status. Use this to quickly compare plans, verify CMS data, and identify missing content.

Data flags — needs attention

  • Innovator Pass: Price is $500/mo in Worker PLAN_CONFIG but CMS price/price-in-cents fields may be blank. Needs primary descriptor, feature image, and short description.
  • Founder Membership: Active in Worker PLAN_CONFIG ($500/mo) but does not appear as a dedicated CMS Memberships item. No page, no copy, no image.
  • "4 Hour Session" and "HOURLY SESSIONS": Both live in the Memberships CMS collection but are Sonic Studio booking options — should be moved to Spaces or a dedicated collection.
  • Passport plan-slug: Worker key is passport (was previously passport-monthly). CMS plan-slug field must match.
  • Benefit icons: All 14 Benefit-type Features are missing icons. Amenity-type items have icons.
  • Testimonials collection exists but contains no items yet.
Feature / Attribute
All Access
$300
/mo · +$200 init
AUTO-ALL-ACCESS
Passport
$100
/mo · +$100 init
AUTO-PASSPORT
Startup
$30
/mo · +$100 init
AUTO-STARTUP
Innovator
$500
/mo · +$200 init
AUTO-INNOVATOR-PASS
Creator
$500
/mo · +$200 init
AUTO-CREATOR-PASS
Founder
$500
/mo · +$200 init
AUTO-FOUNDER
Plan Slug all-access passport startup innovator-pass creator-pass founder
Billing Pro-rated to 1st Pro-rated to 1st Pro-rated to 1st Not pro-rated Not pro-rated Pro-rated to 1st
Terms Page /legal/membership-terms /legal/membership-terms /legal/membership-terms /legal/membership-terms /legal/sonic-terms /legal/membership-terms
Unlimited Daily Cowork Access
5 Cowork Day Passes/Month
Monthly Meeting Room Credits
8 Hours Monthly Sonic Studio
Business Mail Address
Letter Scanning & Package Holds
20% Off Meeting Room Bookings
20% Off Sonic Studio Bookings
20% Off Event Spaces
20% Off Private Team Offices
Shared Cowork Environment 5 days
Private Phone Booths w/ passes
Courtyard · Fitness · Bike Lockers w/ passes
Coffee + Tea Service w/ passes
High Speed Wi-Fi w/ passes
Virtual Mail Service
core
Ideal For (persona line)
Short Description
Feature Image

Plan copy (from CMS)

All Access · $300/mo

Short description

"Unlimited workspace access with all amenities included. For professionals who make Labour Temple their home base."

Ideal for

"Freelancers, remote workers, and entrepreneurs who want a consistent daily workspace and full community access."

Passport · $100/mo

Short description

"Flexible day access for remote workers who need occasional workspace. Drop in, connect, and work from Seattle's most inspiring building."

Ideal for

"Hybrid workers and visitors who occasionally want a professional workspace for a low monthly cost."

Startup · $30/mo

Short description

"Your business starts here with a premier mailing address at 2800 1st Avenue. Virtual mail service with letter scanning and package holds."

Ideal for

"Early-stage founders and solo operators who need a professional business address without a physical desk."

Innovator Pass · $500/mo

Short description

"Meeting room credits for professionals who need flexible workspace solutions. Access professional meeting spaces as needed."

FLAG:CMS price may be missing · No feature image · Credits amount not specified

Creator Pass · $500/mo

Short description

"Monthly podcast studio access for content creators. Eight hours of Sonic studio time plus all Labour Temple coworking benefits."

Ideal for

"Podcasters and video creators who want consistent studio access with the benefits of a coworking community."

Founder · $500/mo

This plan exists in Worker PLAN_CONFIG but has no CMS Memberships item. No page, no copy, no image.

Stripe Price ID

price_1TDukWB8vTeSXsVFcG9uiaeY

Open questions & next steps

Copy Work Needed

  • Define Innovator Pass pricing details in CMS (credit amounts)
  • Decide whether Founder Membership needs a public CMS page
  • Add testimonial content to Testimonials collection
  • Add "Ideal For" copy to Founder plan (if given a page)

Image Work Needed

  • Add feature image for Innovator Pass and Founder
  • Review all membership feature images (marked ⚠)
  • Add icons to all 14 Benefit-type Features
  • Add photos to Testimonial items when content is added

CMS / Data Cleanup

  • Move "4 Hour Session" and "HOURLY SESSIONS" out of Memberships collection
  • Set Innovator Pass price, CTA text, primary descriptor in CMS
  • Rename "Amenities" collection to "Features"

Strategic Questions

  • Is Founder Membership public or invite-only?
  • Should Passport pricing be restructured (per-pass vs. monthly)?
  • What are the specific meeting room credit amounts for Innovator Pass?
  • Should Sonic Studio items become a separate collection?