splitforms.com
HOME SERVICES · CONTACT FORM TEMPLATE

Towing & Roadside Assistance Request Form

Nobody fills out a towing form for fun — they're on a shoulder with hazards blinking. The form's only job is to grab location, vehicle, and callback number fast, and ping your driver before the competitor's dispatcher picks up.

500/mo free·no card·works on any host
form.htmlhtml41 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 locksmith request">
04
05 <label for="name">Full name *</label>
06 <input id="name" type="text" name="name" placeholder="Anna Lopez" required>
07 <label for="phone">Phone *</label>
08 <input id="phone" type="tel" name="phone" placeholder="+1 555 0142" required>
09 <label for="address">Address *</label>
10 <input id="address" type="text" name="address" placeholder="1247 Valencia St" required>
11 <label for="service">Service needed *</label>
12 <select id="service" name="service" required>
13 <option value="">Choose…</option>
14 <option>Locked out — house</option>
15 <option>Locked out — car</option>
16 <option>Locked out — office</option>
17 <option>Rekey existing locks</option>
18 <option>New lock install</option>
19 <option>Smart-lock install</option>
20 <option>Safe opening</option>
21 </select>
22 <label for="urgency">How urgent? *</label>
23 <select id="urgency" name="urgency" required>
24 <option value="">Choose…</option>
25 <option>Emergency — locked out now</option>
26 <option>Within an hour</option>
27 <option>Today</option>
28 <option>This week</option>
29 </select>
30 <label for="details">Notes</label>
31 <textarea id="details" name="details" placeholder="Type of lock, vehicle make/model, anything we should bring."></textarea>
32
33 <!-- honeypot — bots fill every field -->
34 <input type="checkbox" name="botcheck" style="display:none" tabindex="-1" autocomplete="off">
35
36 <button type="submit">Send</button>
37</form>
38
39<p style="margin-top:12px;font-size:11px;color:#888;text-align:right">
40 Powered by <a href="https://splitforms.com" style="color:#888;text-decoration:none" target="_blank" rel="noopener">splitforms</a>
41</p>
500
submissions / mo, free
6
fields, ready to ship
5
code outputs
60s
from copy to inbox
§ 01Why it mattersthe qualifying-fields argument

Towing is the most time-critical lead in home-and-auto services — the customer calls the first company that answers, and the form is your after-hours and on-hold backup. It must be brutally short: location, vehicle year/make/model, what happened, callback number. Vehicle details aren't trivia — a lowered sedan, an AWD crossover, and a box truck need different trucks, and rolling the wrong one wastes the run. Location accuracy decides whether your driver finds them in five minutes or thirty.

Webhook to Twilio SMS — breakdown location on your driver's phone in seconds.
✦ at a glance
  • Locksmith callout · 6 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 · towing-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 locksmith request
Full name
Maya Iyer
Phone
+1 415 555 0142
Address
Service needed
Locked out — house
How urgent?
Emergency — locked out now
Notes
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

Keep it to five fields

Location (address, exit number, or cross street), vehicle year/make/model, what's wrong (breakdown / accident / flat / lockout / won't start), phone, name. Anything more and they call someone else.

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

Ping the driver, not the inbox

Webhook straight to a Twilio SMS or a dispatch Slack channel that the on-duty driver actually watches. Email is the backup log, not the alert channel — minutes decide who gets the job.

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

Quote non-urgent jobs by reply

Scheduled tows (car to a shop, equipment moves, abandoned-vehicle removal) come through the same form with urgency 'this week'. Those you quote by email with distance-based pricing — no 2am callout required.

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

  <label for="name">Full name *</label>
  <input id="name" type="text" name="name" placeholder="Anna Lopez" required>
  <label for="phone">Phone *</label>
  <input id="phone" type="tel" name="phone" placeholder="+1 555 0142" required>
  <label for="address">Address *</label>
  <input id="address" type="text" name="address" placeholder="1247 Valencia St" required>
  <label for="service">Service needed *</label>
  <select id="service" name="service" required>
    <option value="">Choose…</option>
    <option>Locked out — house</option>
    <option>Locked out — car</option>
    <option>Locked out — office</option>
    <option>Rekey existing locks</option>
    <option>New lock install</option>
    <option>Smart-lock install</option>
    <option>Safe opening</option>
  </select>
  <label for="urgency">How urgent? *</label>
  <select id="urgency" name="urgency" required>
    <option value="">Choose…</option>
    <option>Emergency — locked out now</option>
    <option>Within an hour</option>
    <option>Today</option>
    <option>This week</option>
  </select>
  <label for="details">Notes</label>
  <textarea id="details" name="details" placeholder="Type of lock, vehicle make/model, anything we should bring."></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.js57 lines
<form id="lf-form">
  <label for="name">Full name *</label>
  <input id="name" type="text" name="name" placeholder="Anna Lopez" required>
  <label for="phone">Phone *</label>
  <input id="phone" type="tel" name="phone" placeholder="+1 555 0142" required>
  <label for="address">Address *</label>
  <input id="address" type="text" name="address" placeholder="1247 Valencia St" required>
  <label for="service">Service needed *</label>
  <select id="service" name="service" required>
    <option value="">Choose…</option>
    <option>Locked out — house</option>
    <option>Locked out — car</option>
    <option>Locked out — office</option>
    <option>Rekey existing locks</option>
    <option>New lock install</option>
    <option>Smart-lock install</option>
    <option>Safe opening</option>
  </select>
  <label for="urgency">How urgent? *</label>
  <select id="urgency" name="urgency" required>
    <option value="">Choose…</option>
    <option>Emergency — locked out now</option>
    <option>Within an hour</option>
    <option>Today</option>
    <option>This week</option>
  </select>
  <label for="details">Notes</label>
  <textarea id="details" name="details" placeholder="Type of lock, vehicle make/model, anything we should bring."></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 locksmith 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.tsx72 lines
'use client';

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

export default function LocksmithCalloutForm() {
  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 locksmith 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="Anna Lopez" required />
      <label htmlFor="phone">Phone *</label>
      <input id="phone" type="tel" name="phone" placeholder="+1 555 0142" required />
      <label htmlFor="address">Address *</label>
      <input id="address" type="text" name="address" placeholder="1247 Valencia St" required />
      <label htmlFor="service">Service needed *</label>
      <select id="service" name="service" required>
        <option value="">Choose…</option>
        <option>Locked out — house</option>
        <option>Locked out — car</option>
        <option>Locked out — office</option>
        <option>Rekey existing locks</option>
        <option>New lock install</option>
        <option>Smart-lock install</option>
        <option>Safe opening</option>
      </select>
      <label htmlFor="urgency">How urgent? *</label>
      <select id="urgency" name="urgency" required>
        <option value="">Choose…</option>
        <option>Emergency — locked out now</option>
        <option>Within an hour</option>
        <option>Today</option>
        <option>This week</option>
      </select>
      <label htmlFor="details">Notes</label>
      <textarea id="details" name="details" placeholder="Type of lock, vehicle make/model, anything we should bring." />

      <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', 'phone', 'address', 'service', 'urgency', 'details'];
    $payload = ['access_key' => 'YOUR_ACCESS_KEY'];
    $payload['subject'] = 'New locksmith 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.sh10 lines
curl -X POST https://splitforms.com/api/submit \
  -H "Accept: application/json" \
  -d "access_key=YOUR_ACCESS_KEY" \
  -d "subject=New locksmith request" \
  -d "name=Jane Builder" \
  -d "phone=+15555555555" \
  -d "address=Jane Builder" \
  -d "service=Locked out — house" \
  -d "urgency=Emergency — locked out now" \
  -d "details=Hello from cURL" 

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

§ 04bUse this template with…25 frameworks · same backend

One template. Every framework.

The same field set works on every framework splitforms supports. HTML, React, Next.js, Vue, Astro, Hugo, WordPress — same POST, same backend.

§ 06FAQ5 answered

Things people ask before they ship.

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

01Do stranded drivers really use forms instead of calling?
Phone is and should be primary — make your number the biggest button on the page. The form catches the rest: callers who hit voicemail, people in dead zones who have data but no bars for a call, and the substantial after-hours scheduled-tow traffic that doesn't need a 2am conversation.
02Can the form capture the driver's GPS location?
Yes — a small client-side script can request the browser's geolocation and drop the coordinates into a hidden field, with the text address field as fallback. The POST to splitforms is unchanged. We have a recipe in the docs.
03How fast can a submission reach my driver?
Webhooks fire within seconds of submission. Wired to Twilio SMS or a dispatch app, the on-duty driver has the location and vehicle on their phone before the customer has put their phone back in their pocket.
04Why does vehicle type matter on the form?
Because it determines the truck. AWD vehicles need a flatbed; a standard sedan can take a wheel-lift; a box truck needs heavy-duty. Capturing year/make/model up front means the right truck rolls the first time — wrong-truck runs are pure loss.
05What about spam on an emergency form?
Every form ships with a hidden honeypot plus a server-side spam classifier, so junk doesn't wake your driver at 3am. Add the per-form time-trap option to drop bot-speed submissions automatically.
✻ ✻ ✻

Ship your towing & roadside assistance request form in 60 seconds.

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

Get free access key →Browse all 75 templates →
founders pricing locked in · early access open