splitforms.com
EDUCATION · CONTACT FORM TEMPLATE

Music Lessons Inquiry Form (Studio / Private Teacher)

A 7-year-old starting piano and an adult learning guitar are completely different lessons — different teacher, different curriculum, different pricing. The form sorts both before the trial lesson is booked.

1,000/mo free·no card·works on any host
form.htmlhtml57 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 music lesson inquiry">
04
05 <label for="name">Student name *</label>
06 <input id="name" type="text" name="name" placeholder="Sasha Vorona" required>
07 <label for="email">Email *</label>
08 <input id="email" type="email" name="email" placeholder="parent@example.com" required>
09 <label for="phone">Phone</label>
10 <input id="phone" type="tel" name="phone" placeholder="+1 555 0142">
11 <label for="age">Student age</label>
12 <select id="age" name="age">
13 <option value="">Choose…</option>
14 <option>Under 8</option>
15 <option>8–12</option>
16 <option>13–17</option>
17 <option>Adult</option>
18 </select>
19 <label for="instrument">Instrument *</label>
20 <select id="instrument" name="instrument" required>
21 <option value="">Choose…</option>
22 <option>Piano</option>
23 <option>Guitar</option>
24 <option>Voice / singing</option>
25 <option>Drums</option>
26 <option>Violin</option>
27 <option>Cello</option>
28 <option>Saxophone</option>
29 <option>Other</option>
30 </select>
31 <label for="level">Experience *</label>
32 <select id="level" name="level" required>
33 <option value="">Choose…</option>
34 <option>Brand new</option>
35 <option>Beginner (&lt;1 yr)</option>
36 <option>Intermediate</option>
37 <option>Advanced</option>
38 </select>
39 <label for="format">Lesson format</label>
40 <select id="format" name="format">
41 <option value="">Choose…</option>
42 <option>In-person at studio</option>
43 <option>In-home</option>
44 <option>Online</option>
45 </select>
46 <label for="goals">Goals</label>
47 <textarea id="goals" name="goals" placeholder="Just for fun, exam prep, audition, performance…"></textarea>
48
49 <!-- honeypot — bots fill every field -->
50 <input type="checkbox" name="botcheck" style="display:none" tabindex="-1" autocomplete="off">
51
52 <button type="submit">Send</button>
53</form>
54
55<p style="margin-top:12px;font-size:11px;color:#888;text-align:right">
56 Powered by <a href="https://splitforms.com" style="color:#888;text-decoration:none" target="_blank" rel="noopener">splitforms</a>
57</p>
1,000
submissions / mo, free
8
fields, ready to ship
5
code outputs
60s
from copy to inbox
Music Lessons Inquiry Form (Studio / Private Teacher) — example splitforms template with submissions inbox
§ 01Why it mattersthe qualifying-fields argument

Music studios juggle 6-8 instruments and 3-5 teachers — the inquiry form has to route by instrument and student age before anyone calls back. Children's lessons are 30-min weekly slots at $30-50; adult lessons are 45-60 min at $50-90. Trial lessons are the conversion event — most studios charge half-price for the first session and offer a refund if not a fit. The form captures instrument, age, prior experience, goals (recital prep / fun / college audition), and weekly schedule preference. Online lessons (Zoom / face-to-face) opened a wider geographic market post-2020 — capture format preference upfront.

Webhooks into My Music Staff / Fons · trial-lesson conversion 60-75%.
✦ at a glance
  • Music lesson inquiry · 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 · music-lessons-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 music lesson inquiry
Student name
Maya Iyer
Email
maya@studio71.co
Phone
+1 415 555 0142
Student age
Under 8
Instrument
Piano
Experience
Brand new
Lesson format
In-person at studio
Goals

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

Capture instrument and student age

Required: instrument, student age, prior experience (none / less than 1 yr / 1-3 yrs / advanced), goals. Studios with multiple teachers need this to assign the right one.

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

Capture schedule and format

Days/times available, in-person vs online preference. Some teachers only take Tuesday/Thursday after-school; routing by availability prevents the 'we have no slots' email.

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

Book the trial lesson

Auto-respond with a Calendly link for a 30-min trial at half-price (or free, depending on studio policy). Trial lesson conversion to ongoing student typically runs 60-75%.

inbox · 1 newjust now
FROM contact@yoursite.com
New music lesson inquiry
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.html57 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 music lesson inquiry">

  <label for="name">Student name *</label>
  <input id="name" type="text" name="name" placeholder="Sasha Vorona" required>
  <label for="email">Email *</label>
  <input id="email" type="email" name="email" placeholder="parent@example.com" required>
  <label for="phone">Phone</label>
  <input id="phone" type="tel" name="phone" placeholder="+1 555 0142">
  <label for="age">Student age</label>
  <select id="age" name="age">
    <option value="">Choose…</option>
    <option>Under 8</option>
    <option>8–12</option>
    <option>13–17</option>
    <option>Adult</option>
  </select>
  <label for="instrument">Instrument *</label>
  <select id="instrument" name="instrument" required>
    <option value="">Choose…</option>
    <option>Piano</option>
    <option>Guitar</option>
    <option>Voice / singing</option>
    <option>Drums</option>
    <option>Violin</option>
    <option>Cello</option>
    <option>Saxophone</option>
    <option>Other</option>
  </select>
  <label for="level">Experience *</label>
  <select id="level" name="level" required>
    <option value="">Choose…</option>
    <option>Brand new</option>
    <option>Beginner (&lt;1 yr)</option>
    <option>Intermediate</option>
    <option>Advanced</option>
  </select>
  <label for="format">Lesson format</label>
  <select id="format" name="format">
    <option value="">Choose…</option>
    <option>In-person at studio</option>
    <option>In-home</option>
    <option>Online</option>
  </select>
  <label for="goals">Goals</label>
  <textarea id="goals" name="goals" placeholder="Just for fun, exam prep, audition, performance…"></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.js73 lines
<form id="lf-form">
  <label for="name">Student name *</label>
  <input id="name" type="text" name="name" placeholder="Sasha Vorona" required>
  <label for="email">Email *</label>
  <input id="email" type="email" name="email" placeholder="parent@example.com" required>
  <label for="phone">Phone</label>
  <input id="phone" type="tel" name="phone" placeholder="+1 555 0142">
  <label for="age">Student age</label>
  <select id="age" name="age">
    <option value="">Choose…</option>
    <option>Under 8</option>
    <option>8–12</option>
    <option>13–17</option>
    <option>Adult</option>
  </select>
  <label for="instrument">Instrument *</label>
  <select id="instrument" name="instrument" required>
    <option value="">Choose…</option>
    <option>Piano</option>
    <option>Guitar</option>
    <option>Voice / singing</option>
    <option>Drums</option>
    <option>Violin</option>
    <option>Cello</option>
    <option>Saxophone</option>
    <option>Other</option>
  </select>
  <label for="level">Experience *</label>
  <select id="level" name="level" required>
    <option value="">Choose…</option>
    <option>Brand new</option>
    <option>Beginner (&lt;1 yr)</option>
    <option>Intermediate</option>
    <option>Advanced</option>
  </select>
  <label for="format">Lesson format</label>
  <select id="format" name="format">
    <option value="">Choose…</option>
    <option>In-person at studio</option>
    <option>In-home</option>
    <option>Online</option>
  </select>
  <label for="goals">Goals</label>
  <textarea id="goals" name="goals" placeholder="Just for fun, exam prep, audition, performance…"></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 music lesson inquiry');

    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.tsx88 lines
'use client';

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

export default function MusicLessonsForm() {
  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 music lesson inquiry');

    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">Student name *</label>
      <input id="name" type="text" name="name" placeholder="Sasha Vorona" required />
      <label htmlFor="email">Email *</label>
      <input id="email" type="email" name="email" placeholder="parent@example.com" required />
      <label htmlFor="phone">Phone</label>
      <input id="phone" type="tel" name="phone" placeholder="+1 555 0142" />
      <label htmlFor="age">Student age</label>
      <select id="age" name="age">
        <option value="">Choose…</option>
        <option>Under 8</option>
        <option>8–12</option>
        <option>13–17</option>
        <option>Adult</option>
      </select>
      <label htmlFor="instrument">Instrument *</label>
      <select id="instrument" name="instrument" required>
        <option value="">Choose…</option>
        <option>Piano</option>
        <option>Guitar</option>
        <option>Voice / singing</option>
        <option>Drums</option>
        <option>Violin</option>
        <option>Cello</option>
        <option>Saxophone</option>
        <option>Other</option>
      </select>
      <label htmlFor="level">Experience *</label>
      <select id="level" name="level" required>
        <option value="">Choose…</option>
        <option>Brand new</option>
        <option>Beginner (&lt;1 yr)</option>
        <option>Intermediate</option>
        <option>Advanced</option>
      </select>
      <label htmlFor="format">Lesson format</label>
      <select id="format" name="format">
        <option value="">Choose…</option>
        <option>In-person at studio</option>
        <option>In-home</option>
        <option>Online</option>
      </select>
      <label htmlFor="goals">Goals</label>
      <textarea id="goals" name="goals" placeholder="Just for fun, exam prep, audition, performance…" />

      <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', 'age', 'instrument', 'level', 'format', 'goals'];
    $payload = ['access_key' => 'YOUR_ACCESS_KEY'];
    $payload['subject'] = 'New music lesson inquiry';

    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 music lesson inquiry" \
  -d "name=Jane Builder" \
  -d "email=jane@example.com" \
  -d "phone=+15555555555" \
  -d "age=Under 8" \
  -d "instrument=Piano" \
  -d "level=Brand new" \
  -d "format=In-person at studio" \
  -d "goals=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 charge for the trial lesson?
Most studios charge half-price for the trial — filters out the 'curious but not committed' inquiries while staying low-friction. Free trial lessons get more inquiries but lower conversion to paid student. Half-price is the middle path most studios converge on.
02Can I integrate with My Music Staff / Fons / Acuity?
Yes — webhook the JSON. My Music Staff and Fons both accept inbound leads via Zapier. Acuity Scheduling has direct webhooks. The lead lands as a prospect ready for the trial booking and intake form.
03How do I handle group classes vs private lessons?
Add a 'private / group / either' radio. Group classes are different sales (cohort-based, fixed start dates) — route to a different auto-responder with the group calendar. Private routes to the trial-lesson Calendly link.
04What about instrument rentals for beginners?
Add a 'do you already have an instrument?' field. If no, auto-respond with rental partner info (most studios partner with a local rental shop for $25-50/mo rentals). Removes a common 'I'd love to start but...' barrier.
✻ ✻ ✻

Ship your music lessons inquiry form (studio / private teacher) 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