splitforms.com
DENTAL · CONTACT FORM TEMPLATE

Dentist Appointment Request Form

Dental appointment requests need insurance, preferred date, and reason for visit — without those three, the front desk's morning is back-and-forth phone tag.

1,000/mo free·no card·works on any host
form.htmlhtml53 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 dental appointment request">
04
05 <label for="patient_name">Patient name *</label>
06 <input id="patient_name" type="text" name="patient_name" placeholder="Daniel Chen" required>
07 <label for="email">Email *</label>
08 <input id="email" type="email" name="email" placeholder="daniel@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="patient_type">New or existing patient? *</label>
12 <select id="patient_type" name="patient_type" required>
13 <option value="">Choose…</option>
14 <option>New patient</option>
15 <option>Existing patient</option>
16 </select>
17 <label for="reason">Reason for visit *</label>
18 <select id="reason" name="reason" required>
19 <option value="">Choose…</option>
20 <option>Routine cleaning + checkup</option>
21 <option>Toothache / pain</option>
22 <option>Cosmetic (whitening, veneers)</option>
23 <option>Cavity / filling</option>
24 <option>Crown or bridge</option>
25 <option>Implants consultation</option>
26 <option>Emergency</option>
27 <option>Other</option>
28 </select>
29 <label for="preferred_date">Preferred date *</label>
30 <input id="preferred_date" type="date" name="preferred_date" required>
31 <label for="last_visit">Last dental visit</label>
32 <select id="last_visit" name="last_visit">
33 <option value="">Choose…</option>
34 <option>Within 6 months</option>
35 <option>6–12 months</option>
36 <option>1–2 years ago</option>
37 <option>2+ years ago</option>
38 <option>First time</option>
39 </select>
40 <label for="insurance">Insurance provider</label>
41 <input id="insurance" type="text" name="insurance" placeholder="Delta Dental / Cigna / N/A">
42 <label for="notes">Anything we should know?</label>
43 <textarea id="notes" name="notes" placeholder="Anxiety, allergies, ongoing treatment elsewhere."></textarea>
44
45 <!-- honeypot — bots fill every field -->
46 <input type="checkbox" name="botcheck" style="display:none" tabindex="-1" autocomplete="off">
47
48 <button type="submit">Send</button>
49</form>
50
51<p style="margin-top:12px;font-size:11px;color:#888;text-align:right">
52 Powered by <a href="https://splitforms.com" style="color:#888;text-decoration:none" target="_blank" rel="noopener">splitforms</a>
53</p>
1,000
submissions / mo, free
9
fields, ready to ship
5
code outputs
60s
from copy to inbox
Dentist Appointment Request Form — example splitforms template with submissions inbox
§ 01Why it mattersthe qualifying-fields argument

Dental front-desk staff spend a third of their day on phone tag — calling insurance, calling the patient back, scheduling around hygienist availability. A form that captures insurance carrier, preferred date window, and reason for visit removes most of that. Emergency leads (broken tooth, severe pain) get triaged to today; cleaning and exam requests fit into the 6-week-out hygiene book; cosmetic and ortho consults route to the appropriate specialist. Same form, three completely different scheduling paths.

BAA available on Pro · webhooks into Dentrix / Eaglesoft / Open Dental.
✦ at a glance
  • Dental appointment · 9 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 · dentist-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 dental appointment request
Patient name
Maya Iyer
Email
maya@studio71.co
Phone
+1 415 555 0142
New or existing patient?
New patient
Reason for visit
Routine cleaning + checkup
Preferred date
2026-05-15
Last dental visit
Within 6 months
Insurance provider
Anything we should know?
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 reason and insurance

Required: reason for visit (cleaning / exam / emergency / cosmetic / ortho / kids), insurance carrier (or 'I'll pay out of pocket'), preferred date window.

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

Triage emergencies

Emergency-flagged submissions trigger an SMS to the on-call dentist or front desk via Twilio. 'Severe pain' or 'broken tooth' gets called back within the hour, not the next morning.

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

Verify insurance ahead of visit

Insurance carrier and member ID (optional) lets the front desk verify benefits before the appointment. New patients arrive with paperwork pre-done; chair time is for dentistry, not admin.

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

  <label for="patient_name">Patient name *</label>
  <input id="patient_name" type="text" name="patient_name" placeholder="Daniel Chen" required>
  <label for="email">Email *</label>
  <input id="email" type="email" name="email" placeholder="daniel@example.com" required>
  <label for="phone">Phone *</label>
  <input id="phone" type="tel" name="phone" placeholder="+1 555 0142" required>
  <label for="patient_type">New or existing patient? *</label>
  <select id="patient_type" name="patient_type" required>
    <option value="">Choose…</option>
    <option>New patient</option>
    <option>Existing patient</option>
  </select>
  <label for="reason">Reason for visit *</label>
  <select id="reason" name="reason" required>
    <option value="">Choose…</option>
    <option>Routine cleaning + checkup</option>
    <option>Toothache / pain</option>
    <option>Cosmetic (whitening, veneers)</option>
    <option>Cavity / filling</option>
    <option>Crown or bridge</option>
    <option>Implants consultation</option>
    <option>Emergency</option>
    <option>Other</option>
  </select>
  <label for="preferred_date">Preferred date *</label>
  <input id="preferred_date" type="date" name="preferred_date" required>
  <label for="last_visit">Last dental visit</label>
  <select id="last_visit" name="last_visit">
    <option value="">Choose…</option>
    <option>Within 6 months</option>
    <option>6–12 months</option>
    <option>1–2 years ago</option>
    <option>2+ years ago</option>
    <option>First time</option>
  </select>
  <label for="insurance">Insurance provider</label>
  <input id="insurance" type="text" name="insurance" placeholder="Delta Dental / Cigna / N/A">
  <label for="notes">Anything we should know?</label>
  <textarea id="notes" name="notes" placeholder="Anxiety, allergies, ongoing treatment elsewhere."></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.js69 lines
<form id="lf-form">
  <label for="patient_name">Patient name *</label>
  <input id="patient_name" type="text" name="patient_name" placeholder="Daniel Chen" required>
  <label for="email">Email *</label>
  <input id="email" type="email" name="email" placeholder="daniel@example.com" required>
  <label for="phone">Phone *</label>
  <input id="phone" type="tel" name="phone" placeholder="+1 555 0142" required>
  <label for="patient_type">New or existing patient? *</label>
  <select id="patient_type" name="patient_type" required>
    <option value="">Choose…</option>
    <option>New patient</option>
    <option>Existing patient</option>
  </select>
  <label for="reason">Reason for visit *</label>
  <select id="reason" name="reason" required>
    <option value="">Choose…</option>
    <option>Routine cleaning + checkup</option>
    <option>Toothache / pain</option>
    <option>Cosmetic (whitening, veneers)</option>
    <option>Cavity / filling</option>
    <option>Crown or bridge</option>
    <option>Implants consultation</option>
    <option>Emergency</option>
    <option>Other</option>
  </select>
  <label for="preferred_date">Preferred date *</label>
  <input id="preferred_date" type="date" name="preferred_date" required>
  <label for="last_visit">Last dental visit</label>
  <select id="last_visit" name="last_visit">
    <option value="">Choose…</option>
    <option>Within 6 months</option>
    <option>6–12 months</option>
    <option>1–2 years ago</option>
    <option>2+ years ago</option>
    <option>First time</option>
  </select>
  <label for="insurance">Insurance provider</label>
  <input id="insurance" type="text" name="insurance" placeholder="Delta Dental / Cigna / N/A">
  <label for="notes">Anything we should know?</label>
  <textarea id="notes" name="notes" placeholder="Anxiety, allergies, ongoing treatment elsewhere."></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 dental appointment 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.tsx84 lines
'use client';

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

export default function DentistAppointmentForm() {
  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 dental appointment 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="patient_name">Patient name *</label>
      <input id="patient_name" type="text" name="patient_name" placeholder="Daniel Chen" required />
      <label htmlFor="email">Email *</label>
      <input id="email" type="email" name="email" placeholder="daniel@example.com" required />
      <label htmlFor="phone">Phone *</label>
      <input id="phone" type="tel" name="phone" placeholder="+1 555 0142" required />
      <label htmlFor="patient_type">New or existing patient? *</label>
      <select id="patient_type" name="patient_type" required>
        <option value="">Choose…</option>
        <option>New patient</option>
        <option>Existing patient</option>
      </select>
      <label htmlFor="reason">Reason for visit *</label>
      <select id="reason" name="reason" required>
        <option value="">Choose…</option>
        <option>Routine cleaning + checkup</option>
        <option>Toothache / pain</option>
        <option>Cosmetic (whitening, veneers)</option>
        <option>Cavity / filling</option>
        <option>Crown or bridge</option>
        <option>Implants consultation</option>
        <option>Emergency</option>
        <option>Other</option>
      </select>
      <label htmlFor="preferred_date">Preferred date *</label>
      <input id="preferred_date" type="date" name="preferred_date" required />
      <label htmlFor="last_visit">Last dental visit</label>
      <select id="last_visit" name="last_visit">
        <option value="">Choose…</option>
        <option>Within 6 months</option>
        <option>6–12 months</option>
        <option>1–2 years ago</option>
        <option>2+ years ago</option>
        <option>First time</option>
      </select>
      <label htmlFor="insurance">Insurance provider</label>
      <input id="insurance" type="text" name="insurance" placeholder="Delta Dental / Cigna / N/A" />
      <label htmlFor="notes">Anything we should know?</label>
      <textarea id="notes" name="notes" placeholder="Anxiety, allergies, ongoing treatment elsewhere." />

      <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 = ['patient_name', 'email', 'phone', 'patient_type', 'reason', 'preferred_date', 'last_visit', 'insurance', 'notes'];
    $payload = ['access_key' => 'YOUR_ACCESS_KEY'];
    $payload['subject'] = 'New dental appointment 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.sh13 lines
curl -X POST https://splitforms.com/api/submit \
  -H "Accept: application/json" \
  -d "access_key=YOUR_ACCESS_KEY" \
  -d "subject=New dental appointment request" \
  -d "patient_name=Jane Builder" \
  -d "email=jane@example.com" \
  -d "phone=+15555555555" \
  -d "patient_type=New patient" \
  -d "reason=Routine cleaning + checkup" \
  -d "preferred_date=2026-05-15" \
  -d "last_visit=Within 6 months" \
  -d "insurance=Jane Builder" \
  -d "notes=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 this HIPAA compliant?
splitforms encrypts submissions at rest and in transit. For full HIPAA coverage you also need a BAA — available on the Pro plan with a separate request. Don't put diagnosis details on the form; capture intent and book the call. Real PHI lives in your dental software, not in form storage.
02Can I integrate with Dentrix / Eaglesoft / Open Dental?
Yes — webhook the JSON. Most practice management software accepts inbound webhooks via Zapier or Open Dental's HL7 module. Lead lands in your scheduling app pre-filled.
03What about new-patient paperwork?
Auto-respond to new-patient submissions with a link to your full intake forms (medical history, consent). Patient fills them out before the visit; chair time is for the dentist, not admin. Most practices see 30+ minutes saved per new patient.
04How do emergencies actually reach the dentist after hours?
Webhook to Twilio with a routing rule — 'emergency' submissions trigger a call to the on-call number. After-hours emergency calls are usually 1-2 a week and the patient is grateful to reach a human.
✻ ✻ ✻

Ship your dentist appointment request 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