Skip to main content

Membership & Direct Debit

When a trial lead reaches Trial 2 status, the instructor can send them a membership offer SMS. The parent follows a secure link, fills in a short form, and is directed to GoCardless to set up a Direct Debit mandate — all without leaving the browser.


How it works

  1. Lead reaches Trial 2 in the pipeline
  2. Instructor taps Send Membership Offer — this sends the SMS and advances the lead to Invited in one action
  3. Parent receives a personalised link: https://yourclub.r4ptor.app/membership?t=TOKEN
  4. Parent fills in their address and accepts three consents (photo, cancellation policy, membership confirmation)
  5. Parent is redirected to GoCardless to set up their Direct Debit mandate
  6. On return, a Tasks notification is created for the instructor: "Set up GoCardless subscriptions for [name]"
  7. The lead is automatically converted to Joined as soon as the mandate is created — no waiting for bank confirmation

The membership form

The form is token-secured — it cannot be accessed without the unique link sent via SMS. It pre-fills all known information from the trial record so parents don't re-enter data.

What the form collects

FieldNotes
Home addressRequired for GoCardless
Photo consentOptional opt-in
Cancellation policy acknowledgementRequired
Membership confirmationRequired

Fee display

The form shows the applicable monthly fee based on the student's class:

Class typeFee setting
Snakes & CranesMEMBERSHIP_FEE_SNAKES_CRANES
JuniorsMEMBERSHIP_FEE_JUNIORS
TeensMEMBERSHIP_FEE_TEENS
Unknown / otherAll tiers shown as fallback

The annual affiliation / insurance fee (AFFILIATION_FEE_JUNIOR) is also shown.


GoCardless integration

Each r4ptor instance connects directly to the club's own GoCardless account — there is no shared payments infrastructure.

Setup

  1. Create a GoCardless account at gocardless.com
  2. In the GoCardless dashboard, go to Developers → API Keys and copy your access token
  3. In r4ptor: Admin → Settings → set GC_ACCESS_TOKEN and GC_ENVIRONMENT (sandbox or live)
  4. In GoCardless: go to Developers → Webhooks → create a new endpoint:
    • URL: https://yourclub.r4ptor.app/api/membership/webhook
    • Events: mandates
    • Copy the webhook secret
  5. In r4ptor: Admin → Settings → set GC_WEBHOOK_SECRET

What r4ptor manages

ActionWhen
Creates GoCardless redirect flowWhen parent submits membership form
Stores mandate ID and customer IDWhen parent completes GoCardless flow
Creates instructor taskImmediately — mandate is ready for subscriptions
Converts lead to JoinedWhen mandates.created webhook fires — immediately on mandate setup
Reverts lead to InvitedIf mandate is later cancelled, fails, or expires — while still an Invited/Joined lead
Raises a task for the studentIf a mandate is cancelled, fails, or expires after the person has already fully joined as a Student — see Mandate cancelled after joining below

Reminder nudges

If a parent doesn't complete the membership form after Send Membership Offer is tapped, r4ptor automatically re-sends the same offer as a reminder:

ReminderSent
1st nudge2 days after the original offer
2nd nudge4 days after the original offer
3rd and final nudge7 days after the original offer

No more than 3 automatic reminders are ever sent for a given lead. The instructor can still tap Send Membership Offer manually at any time — this sends an extra copy immediately but doesn't reset or extend the automatic schedule above.

Mandate cancelled after joining

Occasionally a member's Direct Debit mandate is cancelled, fails, or expires well after they've already joined — not during the initial signup. Since the lead has long since converted, there's no "lead" left to revert. Instead, r4ptor raises a High priority task for that student — "Contact [First Last] — mandate cancelled" (or failed / expired) — so it gets picked up the same way any other GoCardless task does. See Tasks for how these are managed.

r4ptor checks for this roughly once an hour — it isn't instant, but nothing is missed without someone actively watching GoCardless.

What the instructor manages in GoCardless

Once the task appears, log in to GoCardless and manually create:

  • Monthly training subscription against the new mandate
  • Annual Membership/Insurance subscription against the same mandate

This is intentional — it gives the instructor flexibility for custom arrangements (family discounts, payment plans, etc.) and keeps a human in the loop for financial setup.


Recent Payments

Admin → Financial shows the last 20 GoCardless payments, matched back to the student they belong to.

Matching works against a student's mandate or subscription ID, using whichever GoCardless customer record set up the Direct Debit. If a family's bill payer is registered in GoCardless under different contact details than the student's own record (a grandparent, ex-partner, etc.), add those details as the student's secondary phone/email (see People → Editing a student profile) so the match can still be made. Secondary contact details are never used for comms — matching only.

A student's subscription is re-synced automatically each time Import Mandates runs, so a class or fee change (which GoCardless handles as cancel-and-recreate rather than an in-place edit) doesn't leave the match pointing at a stale, cancelled subscription.

Failed payment alerts

r4ptor checks GoCardless roughly once an hour for payments that failed or were later reversed (charged back). When one is found and can be matched to a student, a High priority task is raised automatically — "Payment failed — [First Last]" — with the amount and date, so instructors don't need to check GoCardless manually to catch a bounced payment. See Tasks.


Tasks

When a mandate is successfully created, a High priority task is automatically added to the instructor's Tasks list:

Set up GoCardless subscriptions for [First Last] Mandate MD0… is ready. Log in to GoCardless and create:

  • Monthly training subscription
  • Annual Membership/Insurance subscription

See Tasks for how to manage these.


Webhook configuration

The webhook endpoint is per-instance — each club handles their own GoCardless events. Signature verification is enforced when GC_WEBHOOK_SECRET is set (strongly recommended for live environments).

SettingDescription
GC_ENABLEDtrue / false — enables the GoCardless flow
GC_ENVIRONMENTsandbox or live
GC_ACCESS_TOKENYour GoCardless API key
GC_WEBHOOK_SECRETWebhook signing secret from GoCardless dashboard

AppSettings reference

KeyDescription
GC_ENABLEDEnable the GoCardless mandate flow
GC_ENVIRONMENTsandbox for testing, live for real mandates
GC_ACCESS_TOKENGoCardless API access token
GC_WEBHOOK_SECRETWebhook HMAC secret for signature verification
MEMBERSHIP_FEE_SNAKES_CRANESMonthly fee for Snakes & Cranes class (£)
MEMBERSHIP_FEE_JUNIORSMonthly fee for Juniors class (£)
MEMBERSHIP_FEE_TEENSMonthly fee for Teens class (£)
AFFILIATION_FEE_JUNIORAnnual membership/insurance fee (£)
UNIFORM_STORE_URLOptional link to kit/uniform shop shown on confirmation page