New Starter Pipeline
The New Starter Pipeline replaces a standalone CRM (such as GoHighLevel) with a fully integrated lead funnel — built into r4ptor at no extra cost.
How it works
- A prospective student finds your club (via a Meta ad, a Google search, a link on your website, etc.)
- They click through to your public trial booking form at
https://yourclub.r4ptor.app/join - They choose a class, pick a trial date, and enter their details — no account, no login
- The booking lands in your Trial Starters pipeline dashboard instantly
- Automated comms fire in the background (confirmation, 24-hour reminder, nurture emails)
- You track the lead through the funnel until they convert to a full member
The /join booking form
The booking form is a public page — no login required, accessible from any device.
What the form collects
| Field | Required |
|---|---|
| Child's first and last name | Yes |
| Child's date of birth | Yes |
| Parent / carer name | Yes |
| Parent / carer phone | Yes |
| Parent / carer email | Yes |
| Class selection | Yes |
| Trial date selection | Yes |
| How did you hear about us? | Yes |
| Medical conditions / allergies | Optional |
| SMS marketing consent | Optional opt-in |
Attire acknowledgements
Three configurable checkboxes appear before submission (all required). The default items are:
- I understand my child should wear comfortable, loose-fitting clothing to their first trial
- I understand training takes place in bare feet
- I understand punctuality is important — please arrive 5 minutes before the start time
To customise these for your club, set TRIAL_FORM_ATTIRE_ITEMS in Settings → App Settings as a JSON array of strings.
Earliest bookable trial date
By default the form offers any upcoming date for a class. If a class type shouldn't be bookable until a certain date — for example, holding a class back until a new term starts while another stays open now — set an earliest trial date on that student type in Curriculum Library. The form (and the reschedule page) will only offer dates on or after it for classes of that type; other types are unaffected. Raising the floor never retroactively touches an existing booking, only new date selections.
Rate limiting
The form is rate limited to 5 submissions per IP address per hour to prevent spam.
Disabling the form
To temporarily close online bookings (e.g. over a holiday period), set TRIAL_FORM_ENABLED to false in App Settings. The /join URL will display a "bookings currently closed" message.
Trial Starters pipeline
Access the pipeline from the New Opportunities tile on the home screen.
Lead statuses
Leads move through a defined funnel:
| Status | Meaning |
|---|---|
| New | Lead received — not yet contacted |
| Contacted | You've reached out but no trial booked yet |
| Booked | Trial date confirmed |
| Trial 1 | First session attended |
| Trial 2 | Second session attended — ready for membership offer |
| Invited | Membership offer SMS sent |
| Joined | Signed up as a full member — Direct Debit mandate created |
| Lost | Not proceeding (can be re-opened to New) |
Filtering
Use the filter tabs at the top of the pipeline list to show leads by status, or view all active leads (any non-terminal status) at once.
Lead detail sheet
Tap any lead to open the detail sheet. From here you can:
- View all contact details, with one-tap Call, WhatsApp, SMS, and Email buttons — same as on a student profile, so you can reach out without copying the number or address out to another app
- Move the lead to the next status
- Edit the lead's name, contact details, date of birth, and class — including assigning a class to a lead that arrived without one (every Meta-sourced lead lands with no class picked)
- Add or edit internal notes
- View the full comms history for this lead
- Delete the lead (admin only)
Adding leads manually
Use the + button to add a lead without them going through the public form — useful for walk-ins, phone enquiries, or referrals.
Automated comms
The following comms fire automatically:
| Template | Trigger | Channel |
|---|---|---|
TRIAL_CONFIRMATION | Immediately on form submit | SMS |
TRIAL_REMINDER_24H | 24 hours before trial date | SMS |
All templates are configurable via Comms → Templates in the admin panel.
Rescheduling or cancelling a trial
Every trial booking gets a unique, token-gated link that the lead can use to reschedule or cancel without calling or emailing you. When the TRIAL_CONFIRMATION template includes {{RESCHEDULE_LINK}} and {{CANCEL_LINK}} in its body, these links are sent automatically with the confirmation message.
The self-service page
The link points to /trial/manage?t=TOKEN — a public page (no login required). The page shows the lead's current booking and offers two actions:
- Reschedule — picks a new date from the same class's upcoming slots (reuses the same date picker as the
/joinform) and sends a freshTRIAL_CONFIRMATIONcomms after confirming - Cancel — marks the lead as
LOSTand deactivates the link
Page states
| State | When it appears |
|---|---|
| Form | Normal state — shows booking summary + action buttons |
| Rescheduled | After successful reschedule — shows new date |
| Cancelled | After cancellation — suggests contacting the club to re-book |
| Already a member | Lead has status CONVERTED — link is inactive |
| Invalid | Token not found or already cancelled — "link expired" message |
Comms tokens
| Token | Value |
|---|---|
{{RESCHEDULE_LINK}} | Full URL to /trial/manage?t=TOKEN |
{{CANCEL_LINK}} | Same URL with ?action=cancel appended — pre-selects the cancel flow |
The base URL is set from the CORS_ORIGIN environment variable on each instance, so links always resolve to the correct subdomain.
The TRIAL_CONFIRMATION template ships inactive in seed data. After activating it via Comms → Templates, ensure the body includes {{RESCHEDULE_LINK}} and {{CANCEL_LINK}} so leads receive the self-service links.
Ad campaign attribution (UTM tracking)
r4ptor automatically captures UTM parameters from the /join URL and stores them against each lead. This tells you exactly which ad or campaign generated each trial booking, without any manual tracking.
How it works
When someone clicks your ad and lands on /join?utm_source=meta&utm_medium=paid&utm_campaign=june-adults, r4ptor reads those parameters silently in the background. The lead is created in the pipeline with the source tagged.
In the pipeline you'll see a coloured attribution chip on each tagged lead card:
| UTM source | Chip colour |
|---|---|
meta / facebook / fb | Blue — Meta |
google | Green — Google |
instagram | Pink — Instagram |
tiktok | Dark — TikTok |
| Any other value | Grey — value capitalised |
Opening a lead's detail sheet shows the full attribution: source chip, medium, and campaign name.
Leads added manually or via the public form without UTM parameters fall back to showing the free-text "How did you hear about us?" answer instead.
Naming conventions
UTM parameters follow a widely-used standard (originally from Google Analytics) that all major ad platforms recognise. Stick to these conventions and your data will be consistent across tools.
Rules:
- Always lowercase
- No spaces — use hyphens (
adults-june, notAdults June) - Be consistent —
metaeverywhere, notmetasometimes andfacebookother times
| Parameter | What it tracks | Standard values |
|---|---|---|
utm_source | Which platform | meta, google, instagram, tiktok, website, email |
utm_medium | The channel type | paid-social (FB/IG ads), cpc (Google paid search), email, organic-social (free posts) |
utm_campaign | Your campaign name | adults-june, snakes-cranes-summer, brand |
The pipeline chip is based on utm_source. Use meta for all Facebook and Instagram ads (even if they run on Instagram — they're managed through Meta Ads Manager). Use instagram only if you're tracking organic Instagram posts separately.
Building your URL
Take your base /join URL and append the parameters with ? then & between each one:
https://yourclub.r4ptor.app/join?utm_source=meta&utm_medium=paid-social&utm_campaign=adults-june
You can also use Google's Campaign URL Builder (free, no account needed) to build URLs without typing manually — search "Google Campaign URL Builder" and paste your /join URL as the website URL.
Ready-to-use examples
Meta (Facebook/Instagram) paid ad:
https://yourclub.r4ptor.app/join?utm_source=meta&utm_medium=paid-social&utm_campaign=adults-june
Google paid search ad:
https://yourclub.r4ptor.app/join?utm_source=google&utm_medium=cpc&utm_campaign=kung-fu-london
Link on your own website:
https://yourclub.r4ptor.app/join?utm_source=website&utm_medium=organic&utm_campaign=homepage-cta
Organic social post (Instagram/Facebook):
https://yourclub.r4ptor.app/join?utm_source=instagram&utm_medium=organic-social&utm_campaign=june-post
Adding the URL in Meta Ads Manager
Meta has a built-in URL parameter builder so you don't have to construct the string manually:
- In Meta Ads Manager go to the Ad level (not campaign or ad set)
- Under Destination → Website URL, paste your base URL:
https://yourclub.r4ptor.app/join - Click Build a URL Parameter (appears below the URL field)
- Fill in the fields — Meta will append them automatically
- Alternatively, just paste the full UTM-tagged URL directly into the Website URL field
Use the same utm_campaign value for all ads within one campaign. Only change it when you start a genuinely new campaign push — this lets you count total bookings per campaign across all creatives.
What you can and can't track
| Traffic source | UTM chip in r4ptor? | Notes |
|---|---|---|
| Meta / Facebook paid ad | ✅ Yes | You set the URL in Ads Manager |
| Instagram paid ad | ✅ Yes | Same — managed through Meta Ads Manager |
| Google paid search | ✅ Yes | Set destination URL in Google Ads |
| Organic Google search | ❌ No | Google doesn't pass UTMs on organic results |
| Link on your website | ✅ Yes | Add ?utm_source=website to your CTA |
| Organic social post | ✅ Yes | Add UTMs to the link in your post caption |
| Word of mouth / walk-in | ❌ No | Use the manual add + free-text source field |
Meta Pixel integration
If you run Meta (Facebook/Instagram) ads, connect your Pixel so that every trial booking fires a CompleteRegistration conversion event. This combines with UTM tracking: Meta can optimise for bookings and r4ptor tells you which leads actually came from Meta.
- Go to Settings → App Settings
- Add your Pixel ID as
META_PIXEL_ID - Save — the Pixel fires automatically on the
/join/confirmedpage after every successful submission
Switch your campaign objective to Conversions
Once your Pixel is firing, go to Meta Ads Manager and change your campaign objective from Traffic or Reach to Conversions, setting CompleteRegistration as the conversion event.
This makes your ad spend work significantly harder: Meta's algorithm shifts from finding people who click to finding people who are most likely to actually book. You'll typically see fewer clicks but a much higher proportion that convert.
This also unlocks:
- Lookalike audiences — built from people who completed the booking form
- Retargeting — people who visited
/joinbut didn't submit - Cost-per-result reporting — actual cost per trial booking, not per click
WordPress / website integration
There are two ways to put trial booking on your own website — link out to the full page, or embed the form directly on your own page.
Option 1 — Link to the full page
The simplest integration. /join is a standalone full-page experience — just link to it from your existing website:
<a href="https://yourclub.r4ptor.app/join">Book Your Free Trial</a>
r4ptor sets X-Frame-Options: SAMEORIGIN on the /join page (and everywhere else in the app), which prevents it being embedded in a third-party iframe. Use a direct link, or the embeddable widget below.
Option 2 — Embed the form on your own page
A slimmed-down version of the booking form, /embed/join, is designed to be pasted directly into your own WordPress site (or any site) inside an <iframe> — visitors book without ever leaving your page.
To get your embed code:
- Go to Marketing & Ads from the home screen
- Scroll to Embed on Your Website
- Click Copy embed code
- Paste it into a Custom HTML block on your WordPress page (or the equivalent on your site builder)
The snippet includes a small script that automatically resizes the iframe to fit the form's current step, so it never shows a scrollbar or cuts content off. It reuses the exact same booking flow as /join — same classes, same dates, same comms — the only difference is where it's displayed.
Only /embed/join allows third-party framing. Every other page — including the full /join form, the admin app, and everything else — keeps the standard X-Frame-Options: SAMEORIGIN protection. This is a deliberate, narrow exception for the one page designed to be embedded.
AppSettings keys
| Key | Purpose | Default |
|---|---|---|
TRIAL_FORM_ENABLED | true / false — enables or disables the form | true |
TRIAL_FORM_ATTIRE_ITEMS | JSON array of attire checkbox labels | Three default items |
META_PIXEL_ID | Your Meta Pixel ID for conversion tracking | None |
VENUE_ADDRESS | Address shown in confirmation comms | None |
Membership conversion
When a lead reaches Trial 2, the instructor taps Send Membership Offer from the lead detail sheet. This sends the personalised SMS and automatically moves the lead to Invited. The parent follows the secure link to complete the Direct Debit mandate, at which point the lead becomes Joined automatically.
See Membership & Direct Debit for the full flow.