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
- Lead reaches Trial 2 in the pipeline
- Instructor taps Send Membership Offer — this sends the SMS and advances the lead to Invited in one action
- Parent receives a personalised link:
https://yourclub.r4ptor.app/membership?t=TOKEN - Parent fills in their address and accepts three consents (photo, cancellation policy, membership confirmation)
- Parent is redirected to GoCardless to set up their Direct Debit mandate
- On return, a Tasks notification is created for the instructor: "Set up GoCardless subscriptions for [name]"
- 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
| Field | Notes |
|---|---|
| Home address | Required for GoCardless |
| Photo consent | Optional opt-in |
| Cancellation policy acknowledgement | Required |
| Membership confirmation | Required |
Fee display
The form shows the applicable monthly fee based on the student's class:
| Class type | Fee setting |
|---|---|
| Snakes & Cranes | MEMBERSHIP_FEE_SNAKES_CRANES |
| Juniors | MEMBERSHIP_FEE_JUNIORS |
| Teens | MEMBERSHIP_FEE_TEENS |
| Unknown / other | All 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
- Create a GoCardless account at gocardless.com
- In the GoCardless dashboard, go to Developers → API Keys and copy your access token
- In r4ptor: Admin → Settings → set
GC_ACCESS_TOKENandGC_ENVIRONMENT(sandboxorlive) - In GoCardless: go to Developers → Webhooks → create a new endpoint:
- URL:
https://yourclub.r4ptor.app/api/membership/webhook - Events:
mandates - Copy the webhook secret
- URL:
- In r4ptor: Admin → Settings → set
GC_WEBHOOK_SECRET
What r4ptor manages
| Action | When |
|---|---|
| Creates GoCardless redirect flow | When parent submits membership form |
| Stores mandate ID and customer ID | When parent completes GoCardless flow |
| Creates instructor task | Immediately — mandate is ready for subscriptions |
| Converts lead to Joined | When mandates.created webhook fires — immediately on mandate setup |
| Reverts lead to Invited | If mandate is later cancelled, fails, or expires — while still an Invited/Joined lead |
| Raises a task for the student | If 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:
| Reminder | Sent |
|---|---|
| 1st nudge | 2 days after the original offer |
| 2nd nudge | 4 days after the original offer |
| 3rd and final nudge | 7 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).
| Setting | Description |
|---|---|
GC_ENABLED | true / false — enables the GoCardless flow |
GC_ENVIRONMENT | sandbox or live |
GC_ACCESS_TOKEN | Your GoCardless API key |
GC_WEBHOOK_SECRET | Webhook signing secret from GoCardless dashboard |
AppSettings reference
| Key | Description |
|---|---|
GC_ENABLED | Enable the GoCardless mandate flow |
GC_ENVIRONMENT | sandbox for testing, live for real mandates |
GC_ACCESS_TOKEN | GoCardless API access token |
GC_WEBHOOK_SECRET | Webhook HMAC secret for signature verification |
MEMBERSHIP_FEE_SNAKES_CRANES | Monthly fee for Snakes & Cranes class (£) |
MEMBERSHIP_FEE_JUNIORS | Monthly fee for Juniors class (£) |
MEMBERSHIP_FEE_TEENS | Monthly fee for Teens class (£) |
AFFILIATION_FEE_JUNIOR | Annual membership/insurance fee (£) |
UNIFORM_STORE_URL | Optional link to kit/uniform shop shown on confirmation page |