Skip to main content

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​

  1. A prospective student finds your club (via a Meta ad, a Google search, a link on your website, etc.)
  2. They click through to your public trial booking form at https://yourclub.r4ptor.app/join
  3. They choose a class, pick a trial date, and enter their details — no account, no login
  4. The booking lands in your Trial Starters pipeline dashboard instantly
  5. Automated comms fire in the background (confirmation, 24-hour reminder, nurture emails)
  6. 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​

FieldRequired
Child's first and last nameYes
Child's date of birthYes
Parent / carer nameYes
Parent / carer phoneYes
Parent / carer emailYes
Class selectionYes
Trial date selectionYes
How did you hear about us?Yes
Medical conditions / allergiesOptional
SMS marketing consentOptional 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.

Children's and adult classes​

If your club runs both children's and adult classes, the form's first step asks "Who is the class for?" — Children's classes or Adult classes — and then shows only the matching classes. A Change link above the list switches to the other group. A club with only one kind of class skips this step and goes straight to its list.

A class counts as an adult class when its student type is named Adults; every other class (Snakes & Cranes, Juniors, Teens and so on) is a children's class. The picker appears automatically once you have at least one bookable class of each kind — there is nothing to switch on.

Sending people straight to one list. Add for=adult or for=child to the link and the picker is skipped:

https://yourclub.r4ptor.app/join?for=adult
https://yourclub.r4ptor.app/join?for=child&utm_source=meta&utm_medium=paid-social&utm_campaign=juniors-june

This is ideal for ads aimed at one audience — an adults campaign can land directly on the adult classes. It combines with the UTM parameters as normal. If a club only has one kind of class the parameter is simply ignored, and an unrecognised value just shows the picker.

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:

StatusMeaning
NewLead received — not yet contacted
ContactedYou've reached out but no trial booked yet
BookedTrial date confirmed
Trial 1First session attended
Trial 2Second session attended — ready for membership offer
InvitedMembership offer SMS sent
JoinedSigned up as a full member — Direct Debit mandate created
LostNot 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, each by email and SMS (whichever the template has content for):

StageTriggerStandard templateAdults template
New EnquiryLead arrives (Meta lead ads)NEW_META_LEADsame message for everyone
Trial BookedImmediately on bookingTRIAL_CONFIRMATIONTRIAL_BOOKING_CONFIRMATION_ADULTS
Trial Booked24 hours before trial 1TRIAL_REMINDER_24HTRIAL_24HR_REMINDER_ADULTS
Trial AttendedWhen trial 1 is marked attendedTRIAL_ATTENDED1ST_TRIAL_SUCCESS_ADULTS
Trial Attended24 hours before trial 2TRIAL_REMINDER_2ND2ND_TRIAL_REMINDER_ADULTS
JoinedWhen the lead joinsMANDATE_CONFIRMED (off by default)MANDATE_CONFIRMED_WELCOME_ADULTS (off by default)

A lead booked onto an Adults class gets the Adults template at each stage; every other lead gets the standard one — never both. The type comes from the class the lead booked, which is why New Enquiry uses one shared message: at that point no class has been chosen yet. See Different messages for different student types for how this works and how to tailor it.

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 /join form) and sends a fresh TRIAL_CONFIRMATION comms after confirming
  • Cancel — marks the lead as LOST and deactivates the link

Page states​

StateWhen it appears
FormNormal state — shows booking summary + action buttons
RescheduledAfter successful reschedule — shows new date
CancelledAfter cancellation — suggests contacting the club to re-book
Already a memberLead has status CONVERTED — link is inactive
InvalidToken not found or already cancelled — "link expired" message

Comms tokens​

TokenValue
{{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.

Template activation

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 sourceChip colour
meta / facebook / fbBlue — Meta
googleGreen — Google
instagramPink — Instagram
tiktokDark — TikTok
Any other valueGrey — 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, not Adults June)
  • Be consistent — meta everywhere, not meta sometimes and facebook other times
ParameterWhat it tracksStandard values
utm_sourceWhich platformmeta, google, instagram, tiktok, website, email
utm_mediumThe channel typepaid-social (FB/IG ads), cpc (Google paid search), email, organic-social (free posts)
utm_campaignYour campaign nameadults-june, snakes-cranes-summer, brand
utm_source drives the chip colour in r4ptor

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​

Adults campaign landing straight on the adult classes (see Children's and adult classes):

https://yourclub.r4ptor.app/join?for=adult&utm_source=meta&utm_medium=paid-social&utm_campaign=adults-june

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:

  1. In Meta Ads Manager go to the Ad level (not campaign or ad set)
  2. Under Destination → Website URL, paste your base URL: https://yourclub.r4ptor.app/join
  3. Click Build a URL Parameter (appears below the URL field)
  4. Fill in the fields — Meta will append them automatically
  5. 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 sourceUTM chip in r4ptor?Notes
Meta / Facebook paid ad✅ YesYou set the URL in Ads Manager
Instagram paid ad✅ YesSame — managed through Meta Ads Manager
Google paid search✅ YesSet destination URL in Google Ads
Organic Google search❌ NoGoogle doesn't pass UTMs on organic results
Link on your website✅ YesAdd ?utm_source=website to your CTA
Organic social post✅ YesAdd UTMs to the link in your post caption
Word of mouth / walk-in❌ NoUse 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.

  1. Go to Settings → App Settings
  2. Add your Pixel ID as META_PIXEL_ID
  3. Save — the Pixel fires automatically on the /join/confirmed page 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 /join but 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.

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>
Iframe embedding

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:

  1. Go to Marketing & Ads from the home screen
  2. Scroll to Embed on Your Website
  3. Click Copy embed code
  4. 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.

The embed has the same Children's / Adult picker as /join. To put an audience-specific form on its own page — for example an adults-only page — edit the src in your embed code to add the parameter: …/embed/join?for=adult (or ?for=child).

One page is embeddable, the rest of your site isn't

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​

KeyPurposeDefault
TRIAL_FORM_ENABLEDtrue / false — enables or disables the formtrue
TRIAL_FORM_ATTIRE_ITEMSJSON array of attire checkbox labelsThree default items
META_PIXEL_IDYour Meta Pixel ID for conversion trackingNone
VENUE_ADDRESSAddress shown in confirmation commsNone

Membership conversion​

When a lead reaches Trial 2, the instructor taps Send Membership Offer from the lead detail sheet. This sends the personalised invite (the Adults version, TRIAL_CONVERSION_OFFER_ADULTS, for a lead booked onto an Adults class) and automatically moves the lead to Invited. The automatic follow-up reminders that follow it use the same version. 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.