splitforms.com
FITNESS · CONTACT FORM TEMPLATE

Personal Trainer & Gym Inquiry Form

PT leads are goals-led — fat loss, strength, race prep, rehab. The form qualifies on goal first, then schedule, then commitment level. Three fields, complete picture.

1,000/mo free·no card·works on any host
form.htmlhtml60 lines
01<form action="https://splitforms.com/api/submit" method="POST">
02 <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY">
03 <input type="hidden" name="subject" value="New trainer trial request">
04
05 <label for="name">Full name *</label>
06 <input id="name" type="text" name="name" placeholder="Hans Becker" required>
07 <label for="email">Email *</label>
08 <input id="email" type="email" name="email" placeholder="hans@example.com" required>
09 <label for="phone">Phone *</label>
10 <input id="phone" type="tel" name="phone" placeholder="+1 555 0142" required>
11 <label for="goal">Primary goal *</label>
12 <select id="goal" name="goal" required>
13 <option value="">Choose…</option>
14 <option>Lose weight</option>
15 <option>Build muscle</option>
16 <option>Get stronger</option>
17 <option>Improve endurance</option>
18 <option>Sport-specific</option>
19 <option>Rehab / mobility</option>
20 <option>General health</option>
21 </select>
22 <label for="experience">Training experience *</label>
23 <select id="experience" name="experience" required>
24 <option value="">Choose…</option>
25 <option>Total beginner</option>
26 <option>Some experience</option>
27 <option>Trained consistently before</option>
28 <option>Currently active</option>
29 </select>
30 <label for="frequency">Sessions per week you can commit to</label>
31 <select id="frequency" name="frequency">
32 <option value="">Choose…</option>
33 <option>1</option>
34 <option>2</option>
35 <option>3</option>
36 <option>4</option>
37 <option>5+</option>
38 </select>
39 <label for="schedule">Best time to train</label>
40 <select id="schedule" name="schedule">
41 <option value="">Choose…</option>
42 <option>Early morning</option>
43 <option>Morning</option>
44 <option>Midday</option>
45 <option>Afternoon</option>
46 <option>Evening</option>
47 <option>Weekend</option>
48 </select>
49 <label for="injuries">Injuries or conditions</label>
50 <textarea id="injuries" name="injuries" placeholder="Anything we should program around."></textarea>
51
52 <!-- honeypot — bots fill every field -->
53 <input type="checkbox" name="botcheck" style="display:none" tabindex="-1" autocomplete="off">
54
55 <button type="submit">Send</button>
56</form>
57
58<p style="margin-top:12px;font-size:11px;color:#888;text-align:right">
59 Powered by <a href="https://splitforms.com" style="color:#888;text-decoration:none" target="_blank" rel="noopener">splitforms</a>
60</p>
1,000
submissions / mo, free
8
fields, ready to ship
5
code outputs
60s
from copy to inbox
Personal Trainer & Gym Inquiry Form — example splitforms template with submissions inbox
§ 01Why it mattersthe qualifying-fields argument

Trainers don't lose clients on price — they lose them on goal-mismatch. A powerlifting coach who books fat-loss clients ends up with frustrated clients and a bad referral pipeline. The form's goals field qualifies hard so you only book the leads you can actually deliver on. Add experience level (beginner / intermediate / advanced) and schedule (mornings / evenings / weekends only) and the consultation call is 50% closer to a closed sale before it starts.

✦ at a glance
  • Personal trainer free trial · 8 fields
  • HTML, JS, React, PHP, cURL outputs
  • One POST endpoint, no SDK
  • Honeypot + classifier, no CAPTCHA
§ 02Live previewinteractive · sandboxed · no key required

See exactly what your visitors see — and you’ll receive.

Left: the rendered form, fully interactive in a sandboxed iframe. Right: the email and dashboard view that lands the moment a visitor submits.

preview · personal-trainer-contact-formlocalhost:3000
✦ what you’ll see in your inbox

Every submission becomes an email plus a dashboard row. The fields below are the exact payload your form will send. Reply-to is wired to the visitor’s email so hitting reply goes back to them.

dashboard · new submission14ms · 200 OK
SUBJECT · New trainer trial request
Full name
Maya Iyer
Email
maya@studio71.co
Phone
+1 415 555 0142
Primary goal
Lose weight
Training experience
Total beginner
Sessions per week you can commit to
1
Best time to train
Early morning
Injuries or conditions

Iframe is sandboxed — submit doesn’t actually fire. Get your access key to wire it up live.

§ 03Three steps3 steps · ~60 seconds

Generate, embed, receive.

Three actions stand between you and your first lead. None of them require a backend, a database, or a CAPTCHA library.

STEP 01GENERATE

Qualify on goals

Required: primary goal (fat loss / muscle / strength / race / rehab), experience level, current activity. The dropdown filters out clients you can't help.

Create your form
key=sk_live_••••••••
STEP 02EMBED

Capture schedule and package

Preferred training days/times and package interest (1x/week, 2x/week, online programming, hybrid). Lets you quote on the consult call without back-and-forth.

snippethtml
<form action="https://splitforms.com/api/submit" method="POST">
  …
</form>
STEP 03RECEIVE

Book the consultation

Webhook into Cal.com / Calendly / Acuity for the free 20-min consult. The consult is the actual sales conversation; the form's job is to qualify in.

inbox · 1 newjust now
FROM contact@yoursite.com
New trainer trial request
Maya Iyer maya@studio71.co
Loved your last open house in Hayes — looking for similar with parking. Pre-approved through Wells Fargo.
§ 04Copy & ship5 languages · same endpoint

Five outputs. One backend.

HTML by default. Click open the language you ship in — every variant POSTs to the same /api/submit endpoint.

01HTMLform.html60 lines
<form action="https://splitforms.com/api/submit" method="POST">
  <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY">
  <input type="hidden" name="subject" value="New trainer trial request">

  <label for="name">Full name *</label>
  <input id="name" type="text" name="name" placeholder="Hans Becker" required>
  <label for="email">Email *</label>
  <input id="email" type="email" name="email" placeholder="hans@example.com" required>
  <label for="phone">Phone *</label>
  <input id="phone" type="tel" name="phone" placeholder="+1 555 0142" required>
  <label for="goal">Primary goal *</label>
  <select id="goal" name="goal" required>
    <option value="">Choose…</option>
    <option>Lose weight</option>
    <option>Build muscle</option>
    <option>Get stronger</option>
    <option>Improve endurance</option>
    <option>Sport-specific</option>
    <option>Rehab / mobility</option>
    <option>General health</option>
  </select>
  <label for="experience">Training experience *</label>
  <select id="experience" name="experience" required>
    <option value="">Choose…</option>
    <option>Total beginner</option>
    <option>Some experience</option>
    <option>Trained consistently before</option>
    <option>Currently active</option>
  </select>
  <label for="frequency">Sessions per week you can commit to</label>
  <select id="frequency" name="frequency">
    <option value="">Choose…</option>
    <option>1</option>
    <option>2</option>
    <option>3</option>
    <option>4</option>
    <option>5+</option>
  </select>
  <label for="schedule">Best time to train</label>
  <select id="schedule" name="schedule">
    <option value="">Choose…</option>
    <option>Early morning</option>
    <option>Morning</option>
    <option>Midday</option>
    <option>Afternoon</option>
    <option>Evening</option>
    <option>Weekend</option>
  </select>
  <label for="injuries">Injuries or conditions</label>
  <textarea id="injuries" name="injuries" placeholder="Anything we should program around."></textarea>

  <!-- honeypot — bots fill every field -->
  <input type="checkbox" name="botcheck" style="display:none" tabindex="-1" autocomplete="off">

  <button type="submit">Send</button>
</form>

<p style="margin-top:12px;font-size:11px;color:#888;text-align:right">
  Powered by <a href="https://splitforms.com" style="color:#888;text-decoration:none" target="_blank" rel="noopener">splitforms</a>
</p>
02JavaScriptform.js76 lines
<form id="lf-form">
  <label for="name">Full name *</label>
  <input id="name" type="text" name="name" placeholder="Hans Becker" required>
  <label for="email">Email *</label>
  <input id="email" type="email" name="email" placeholder="hans@example.com" required>
  <label for="phone">Phone *</label>
  <input id="phone" type="tel" name="phone" placeholder="+1 555 0142" required>
  <label for="goal">Primary goal *</label>
  <select id="goal" name="goal" required>
    <option value="">Choose…</option>
    <option>Lose weight</option>
    <option>Build muscle</option>
    <option>Get stronger</option>
    <option>Improve endurance</option>
    <option>Sport-specific</option>
    <option>Rehab / mobility</option>
    <option>General health</option>
  </select>
  <label for="experience">Training experience *</label>
  <select id="experience" name="experience" required>
    <option value="">Choose…</option>
    <option>Total beginner</option>
    <option>Some experience</option>
    <option>Trained consistently before</option>
    <option>Currently active</option>
  </select>
  <label for="frequency">Sessions per week you can commit to</label>
  <select id="frequency" name="frequency">
    <option value="">Choose…</option>
    <option>1</option>
    <option>2</option>
    <option>3</option>
    <option>4</option>
    <option>5+</option>
  </select>
  <label for="schedule">Best time to train</label>
  <select id="schedule" name="schedule">
    <option value="">Choose…</option>
    <option>Early morning</option>
    <option>Morning</option>
    <option>Midday</option>
    <option>Afternoon</option>
    <option>Evening</option>
    <option>Weekend</option>
  </select>
  <label for="injuries">Injuries or conditions</label>
  <textarea id="injuries" name="injuries" placeholder="Anything we should program around."></textarea>
  <button type="submit">Send</button>
</form>

<p style="margin-top:12px;font-size:11px;color:#888;text-align:right">
  Powered by <a href="https://splitforms.com" style="color:#888;text-decoration:none" target="_blank" rel="noopener">splitforms</a>
</p>

<script>
  document.getElementById('lf-form').addEventListener('submit', async (e) => {
    e.preventDefault();
    const data = new FormData(e.target);
    data.set('access_key', 'YOUR_ACCESS_KEY');
    data.set('subject', 'New trainer trial request');

    const res = await fetch('https://splitforms.com/api/submit', {
      method: 'POST',
      body: data,
      headers: { Accept: 'application/json' },
    });

    const json = await res.json();
    if (json.success) {
      e.target.reset();
      alert('Sent!');
    } else {
      alert('Error: ' + (json.message || 'Try again'));
    }
  });
</script>
03React / Next.jsForm.tsx91 lines
'use client';

import { useState, type FormEvent } from 'react';

export default function PersonalTrainerForm() {
  const [status, setStatus] = useState<'idle' | 'sending' | 'sent' | 'error'>('idle');

  async function onSubmit(e: FormEvent<HTMLFormElement>) {
    e.preventDefault();
    setStatus('sending');

    const data = new FormData(e.currentTarget);
    data.set('access_key', 'YOUR_ACCESS_KEY');
    data.set('subject', 'New trainer trial request');

    const res = await fetch('https://splitforms.com/api/submit', {
      method: 'POST',
      body: data,
      headers: { Accept: 'application/json' },
    });

    const json = await res.json();
    setStatus(json.success ? 'sent' : 'error');
    if (json.success) e.currentTarget.reset();
  }

  if (status === 'sent') return <p>Thanks — we&rsquo;ll be in touch.</p>;

  return (
    <>
    <form onSubmit={onSubmit}>
      <label htmlFor="name">Full name *</label>
      <input id="name" type="text" name="name" placeholder="Hans Becker" required />
      <label htmlFor="email">Email *</label>
      <input id="email" type="email" name="email" placeholder="hans@example.com" required />
      <label htmlFor="phone">Phone *</label>
      <input id="phone" type="tel" name="phone" placeholder="+1 555 0142" required />
      <label htmlFor="goal">Primary goal *</label>
      <select id="goal" name="goal" required>
        <option value="">Choose…</option>
        <option>Lose weight</option>
        <option>Build muscle</option>
        <option>Get stronger</option>
        <option>Improve endurance</option>
        <option>Sport-specific</option>
        <option>Rehab / mobility</option>
        <option>General health</option>
      </select>
      <label htmlFor="experience">Training experience *</label>
      <select id="experience" name="experience" required>
        <option value="">Choose…</option>
        <option>Total beginner</option>
        <option>Some experience</option>
        <option>Trained consistently before</option>
        <option>Currently active</option>
      </select>
      <label htmlFor="frequency">Sessions per week you can commit to</label>
      <select id="frequency" name="frequency">
        <option value="">Choose…</option>
        <option>1</option>
        <option>2</option>
        <option>3</option>
        <option>4</option>
        <option>5+</option>
      </select>
      <label htmlFor="schedule">Best time to train</label>
      <select id="schedule" name="schedule">
        <option value="">Choose…</option>
        <option>Early morning</option>
        <option>Morning</option>
        <option>Midday</option>
        <option>Afternoon</option>
        <option>Evening</option>
        <option>Weekend</option>
      </select>
      <label htmlFor="injuries">Injuries or conditions</label>
      <textarea id="injuries" name="injuries" placeholder="Anything we should program around." />

      <button type="submit" disabled={status === 'sending'}>
        {status === 'sending' ? 'Sending…' : 'Send'}
      </button>

      {status === 'error' && <p>Something went wrong. Try again.</p>}
    </form>

      <p style={{ marginTop: 12, fontSize: 11, color: '#888', textAlign: 'right' }}>
        Powered by <a href="https://splitforms.com" target="_blank" rel="noopener" style={{ color: '#888', textDecoration: 'none' }}>splitforms</a>
      </p>
    </>
  );
}
04PHPsubmit.php28 lines
<?php
// Drop into a PHP page. Receives a form POST and proxies it to splitforms.com.
// Useful when you want to add server-side validation or rate limiting.

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $allowed = ['name', 'email', 'phone', 'goal', 'experience', 'frequency', 'schedule', 'injuries'];
    $payload = ['access_key' => 'YOUR_ACCESS_KEY'];
    $payload['subject'] = 'New trainer trial request';

    foreach ($allowed as $f) {
        if (isset($_POST[$f])) $payload[$f] = $_POST[$f];
    }

    $ch = curl_init('https://splitforms.com/api/submit');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($payload));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Accept: application/json']);
    $response = curl_exec($ch);
    $status   = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    header('Content-Type: application/json');
    http_response_code($status);
    echo $response;
    exit;
}
?>
05cURLtest.sh12 lines
curl -X POST https://splitforms.com/api/submit \
  -H "Accept: application/json" \
  -d "access_key=YOUR_ACCESS_KEY" \
  -d "subject=New trainer trial request" \
  -d "name=Jane Builder" \
  -d "email=jane@example.com" \
  -d "phone=+15555555555" \
  -d "goal=Lose weight" \
  -d "experience=Total beginner" \
  -d "frequency=1" \
  -d "schedule=Early morning" \
  -d "injuries=Hello from cURL" 

Replace YOUR_ACCESS_KEY with the key from your dashboard. That’s the only edit.

§ 06FAQ4 answered

Things people ask before they ship.

Direct answers, no marketing fluff. Missing one? Email hello@splitforms.com.

01Should I take payment on the form?
No. Personal training is a relationship sale — the consult call closes the deal, then the trainer sends a payment link. Payment-on-form drops conversion massively for high-touch services.
02How do I handle online vs in-person?
Radio for in-person / online / hybrid. Online clients have a different sales cycle (more about programming and check-ins than gym access). Webhook routes online leads to a different intake than in-person.
03Can I integrate with Trainerize / TrueCoach / PTDistinction?
Yes — webhook to Zapier, then into your coaching platform. New leads get a programming-app account auto-provisioned after the consult.
04What about lead magnets like a free workout plan?
Pair the form with a lead magnet (free macro calculator, 4-week home program). Capture email, deliver the magnet, then nurture toward the consult call. Trainers who don't have a magnet leave conversion on the table.
✻ ✻ ✻

Ship your personal trainer & gym inquiry form in 60 seconds.

1,000 free submissions per month. No credit card. Copy the snippet, paste your access key, watch leads land in your inbox.

Get free access key →Browse all 60 templates →
v0.1 · founders pricing locked in · early access open