splitforms.com
LEAD CAPTURE · CONTACT FORM TEMPLATE

Therapist Contact Form (Counseling / Mental Health)

Therapy inquiries are vulnerable — the form needs to feel safe. Capture the basics (areas of concern, insurance, modality preference) without forcing trauma details before the first session.

1,000/mo free·no card·works on any host
form.htmlhtml31 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 consultation request">
04
05 <label for="name">Full name *</label>
06 <input id="name" type="text" name="name" placeholder="Tomás López" required>
07 <label for="email">Email *</label>
08 <input id="email" type="email" name="email" placeholder="tomas@example.com" required>
09 <label for="phone">Phone *</label>
10 <input id="phone" type="tel" name="phone" placeholder="+1 555 0184" required>
11 <label for="topic">Topic *</label>
12 <select id="topic" name="topic" required>
13 <option value="">Choose…</option>
14 <option>General inquiry</option>
15 <option>Strategy</option>
16 <option>Financial planning</option>
17 <option>Legal advice</option>
18 <option>Other</option>
19 </select>
20 <label for="details">What do you need help with? *</label>
21 <textarea id="details" name="details" placeholder="Be specific so we can match you with the right advisor." required></textarea>
22
23 <!-- honeypot — bots fill every field -->
24 <input type="checkbox" name="botcheck" style="display:none" tabindex="-1" autocomplete="off">
25
26 <button type="submit">Send</button>
27</form>
28
29<p style="margin-top:12px;font-size:11px;color:#888;text-align:right">
30 Powered by <a href="https://splitforms.com" style="color:#888;text-decoration:none" target="_blank" rel="noopener">splitforms</a>
31</p>
1,000
submissions / mo, free
5
fields, ready to ship
5
code outputs
60s
from copy to inbox
Therapist Contact Form (Counseling / Mental Health) — example splitforms template with submissions inbox
§ 01Why it mattersthe qualifying-fields argument

Therapy practices run 50-min sessions at $100-250 (private pay) or insurance-billed at $80-150. Many therapists offer sliding-scale fees ($50-100) for limited slots. No-show rates run 10-15% — high for a service business — so therapists overbook by ~15% and confirm via SMS the day before. The form captures areas of concern (anxiety / depression / couples / trauma / family / substance use), insurance carrier or sliding-scale interest, in-person vs telehealth preference, and a brief 'what brings you here?' textarea. Speed-to-call matters: therapy seekers research carefully then act on impulse — a 24-48 hour reply is standard, but same-day reaches the prospect when the motivation is fresh.

Webhooks into SimplePractice / TherapyNotes · NOT HIPAA-compliant out of the box.
✦ at a glance
  • Free consultation · 5 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 · therapist-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 consultation request
Full name
Maya Iyer
Email
maya@studio71.co
Phone
+1 415 555 0142
Topic
General inquiry
What do you need help with?
Loved your last open house in Hayes — looking for similar with parking. Pre-approved through Wells Fargo.

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 intake basics

Required: name, phone, areas of concern (multi-select: anxiety / depression / couples / trauma / family / etc.), insurance carrier or 'private pay / sliding scale', telehealth vs in-person preference.

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

Match to specialty and modality

Group practices route by specialty — anxiety to one therapist, couples to another. Solo practices use the field to confirm fit before the consult call. Bad-fit referrals go out same-day with 2-3 colleague names.

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

Schedule the consult

Auto-respond with a 15-min phone consult booking link (Calendly / SimplePractice). Most therapists offer a free 15-min 'fit check' call before the paid intake session. Reduces session-1 mismatches by 60-70%.

inbox · 1 newjust now
FROM contact@yoursite.com
New consultation 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.html31 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 consultation request">

  <label for="name">Full name *</label>
  <input id="name" type="text" name="name" placeholder="Tomás López" required>
  <label for="email">Email *</label>
  <input id="email" type="email" name="email" placeholder="tomas@example.com" required>
  <label for="phone">Phone *</label>
  <input id="phone" type="tel" name="phone" placeholder="+1 555 0184" required>
  <label for="topic">Topic *</label>
  <select id="topic" name="topic" required>
    <option value="">Choose…</option>
    <option>General inquiry</option>
    <option>Strategy</option>
    <option>Financial planning</option>
    <option>Legal advice</option>
    <option>Other</option>
  </select>
  <label for="details">What do you need help with? *</label>
  <textarea id="details" name="details" placeholder="Be specific so we can match you with the right advisor." required></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.js47 lines
<form id="lf-form">
  <label for="name">Full name *</label>
  <input id="name" type="text" name="name" placeholder="Tomás López" required>
  <label for="email">Email *</label>
  <input id="email" type="email" name="email" placeholder="tomas@example.com" required>
  <label for="phone">Phone *</label>
  <input id="phone" type="tel" name="phone" placeholder="+1 555 0184" required>
  <label for="topic">Topic *</label>
  <select id="topic" name="topic" required>
    <option value="">Choose…</option>
    <option>General inquiry</option>
    <option>Strategy</option>
    <option>Financial planning</option>
    <option>Legal advice</option>
    <option>Other</option>
  </select>
  <label for="details">What do you need help with? *</label>
  <textarea id="details" name="details" placeholder="Be specific so we can match you with the right advisor." required></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 consultation 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.tsx62 lines
'use client';

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

export default function ConsultationForm() {
  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 consultation 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="Tomás López" required />
      <label htmlFor="email">Email *</label>
      <input id="email" type="email" name="email" placeholder="tomas@example.com" required />
      <label htmlFor="phone">Phone *</label>
      <input id="phone" type="tel" name="phone" placeholder="+1 555 0184" required />
      <label htmlFor="topic">Topic *</label>
      <select id="topic" name="topic" required>
        <option value="">Choose…</option>
        <option>General inquiry</option>
        <option>Strategy</option>
        <option>Financial planning</option>
        <option>Legal advice</option>
        <option>Other</option>
      </select>
      <label htmlFor="details">What do you need help with? *</label>
      <textarea id="details" name="details" placeholder="Be specific so we can match you with the right advisor." required />

      <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', 'topic', 'details'];
    $payload = ['access_key' => 'YOUR_ACCESS_KEY'];
    $payload['subject'] = 'New consultation 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.sh9 lines
curl -X POST https://splitforms.com/api/submit \
  -H "Accept: application/json" \
  -d "access_key=YOUR_ACCESS_KEY" \
  -d "subject=New consultation request" \
  -d "name=Jane Builder" \
  -d "email=jane@example.com" \
  -d "phone=+15555555555" \
  -d "topic=General inquiry" \
  -d "details=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.

01Is splitforms HIPAA-compliant for therapy intake?
Not out of the box — no BAA on the standard plan. For HIPAA-compliant intake collecting protected health information (PHI), use SimplePractice, TherapyNotes, or JotForm's HIPAA tier. The splitforms form is fine for the public-facing 'request a consult' step (name, phone, general areas of concern) — keep the detailed intake on the HIPAA platform once they book. Consult your HIPAA officer.
02Can I integrate with SimplePractice / TherapyNotes / TheraNest?
All three EHR-grade therapy CRMs accept inbound leads via Zapier or webhook. The lead lands as a prospective client; the formal intake (PHI) happens inside the platform's secure portal, not on the splitforms form. Two-stage funnel keeps you on the right side of HIPAA.
03How do I handle sliding-scale slot allocation?
Add a 'how do you plan to pay?' radio: insurance / private pay / sliding-scale request. Sliding-scale requests get a 'we have limited slots and will reach out if available' auto-response. Most therapists hold 10-20% of caseload for sliding-scale; the field manages expectations honestly.
04What about emergency / crisis cases?
The form should explicitly state: 'this form is not for emergencies. If you're in crisis, call 988 (Suicide & Crisis Lifeline) or 911.' Liability requires that disclaimer prominently above the form. Most therapists also add 'I am not currently in crisis' as a required confirmation checkbox.
✻ ✻ ✻

Ship your therapist contact form (counseling / mental health) 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