splitforms.com
HOSPITALITY · CONTACT FORM TEMPLATE

Catering Quote Request Form

Catering quotes are date-driven and headcount-driven — same menu costs differently for 30 vs 300 vs corporate vs wedding. The form captures both upfront so the quote arrives same-day, not in three rounds.

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 catering quote">
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 0142" required>
11 <label for="event_date">Event date *</label>
12 <input id="event_date" type="date" name="event_date" required>
13 <label for="event_type">Event type *</label>
14 <select id="event_type" name="event_type" required>
15 <option value="">Choose…</option>
16 <option>Wedding</option>
17 <option>Corporate lunch</option>
18 <option>Holiday party</option>
19 <option>Birthday</option>
20 <option>Funeral</option>
21 <option>Drop-off catering</option>
22 <option>Other</option>
23 </select>
24 <label for="guests">Guest count *</label>
25 <select id="guests" name="guests" required>
26 <option value="">Choose…</option>
27 <option>Under 25</option>
28 <option>25–50</option>
29 <option>50–100</option>
30 <option>100–200</option>
31 <option>200+</option>
32 </select>
33 <label for="service">Service style</label>
34 <select id="service" name="service">
35 <option value="">Choose…</option>
36 <option>Buffet</option>
37 <option>Plated / sit-down</option>
38 <option>Family-style</option>
39 <option>Cocktail / passed apps</option>
40 <option>Drop-off only</option>
41 </select>
42 <label for="menu">Menu preferences</label>
43 <textarea id="menu" name="menu" placeholder="Cuisine, dietary needs (vegan, gluten-free, kosher), favorite dishes…"></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
8
fields, ready to ship
5
code outputs
60s
from copy to inbox
Catering Quote Request Form — example splitforms template with submissions inbox
§ 01Why it mattersthe qualifying-fields argument

Catering quotes have three big inputs: headcount, service style (drop-off / buffet / plated / family-style), and event date (peak Saturdays in summer book 6-12 months out). Per-guest pricing runs $20-35 drop-off, $45-85 buffet, $85-200 plated. Add bar service, rentals, and staff and a wedding catering quote crosses $20k easily. The form captures all of this so the coordinator can quote within 24 hours instead of trading three emails on basics. Dietary restrictions matter too — vegan and gluten-free are now expected on every event, but allergies (peanut, shellfish) need kitchen accommodation. Capture on the form, not at the tasting.

Webhooks into Total Party Planner / Tripleseat / Caterease.
✦ at a glance
  • Catering quote request · 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 · catering-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 catering quote
Full name
Maya Iyer
Email
maya@studio71.co
Phone
+1 415 555 0142
Event date
2026-05-15
Event type
Wedding
Guest count
Under 25
Service style
Buffet
Menu preferences

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 date and headcount

Required: event date, headcount range (final headcount lands later), service style (drop-off / buffet / plated / family-style / passed apps), event type (wedding / corporate / private / fundraiser).

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

Note dietary needs

Field for vegan / vegetarian / gluten-free counts plus allergies. Most events have 5-15% special-diet guests — capturing on the form lets the kitchen plan portions, not improvise during service.

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

Send the proposal

Auto-respond confirming date availability and an ETA on the proposal (24-48 hours). For wedding inquiries, include a tasting-booking link. Tastings are the conversion event for higher-end catering.

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

  <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 0142" required>
  <label for="event_date">Event date *</label>
  <input id="event_date" type="date" name="event_date" required>
  <label for="event_type">Event type *</label>
  <select id="event_type" name="event_type" required>
    <option value="">Choose…</option>
    <option>Wedding</option>
    <option>Corporate lunch</option>
    <option>Holiday party</option>
    <option>Birthday</option>
    <option>Funeral</option>
    <option>Drop-off catering</option>
    <option>Other</option>
  </select>
  <label for="guests">Guest count *</label>
  <select id="guests" name="guests" required>
    <option value="">Choose…</option>
    <option>Under 25</option>
    <option>25–50</option>
    <option>50–100</option>
    <option>100–200</option>
    <option>200+</option>
  </select>
  <label for="service">Service style</label>
  <select id="service" name="service">
    <option value="">Choose…</option>
    <option>Buffet</option>
    <option>Plated / sit-down</option>
    <option>Family-style</option>
    <option>Cocktail / passed apps</option>
    <option>Drop-off only</option>
  </select>
  <label for="menu">Menu preferences</label>
  <textarea id="menu" name="menu" placeholder="Cuisine, dietary needs (vegan, gluten-free, kosher), favorite dishes…"></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="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 0142" required>
  <label for="event_date">Event date *</label>
  <input id="event_date" type="date" name="event_date" required>
  <label for="event_type">Event type *</label>
  <select id="event_type" name="event_type" required>
    <option value="">Choose…</option>
    <option>Wedding</option>
    <option>Corporate lunch</option>
    <option>Holiday party</option>
    <option>Birthday</option>
    <option>Funeral</option>
    <option>Drop-off catering</option>
    <option>Other</option>
  </select>
  <label for="guests">Guest count *</label>
  <select id="guests" name="guests" required>
    <option value="">Choose…</option>
    <option>Under 25</option>
    <option>25–50</option>
    <option>50–100</option>
    <option>100–200</option>
    <option>200+</option>
  </select>
  <label for="service">Service style</label>
  <select id="service" name="service">
    <option value="">Choose…</option>
    <option>Buffet</option>
    <option>Plated / sit-down</option>
    <option>Family-style</option>
    <option>Cocktail / passed apps</option>
    <option>Drop-off only</option>
  </select>
  <label for="menu">Menu preferences</label>
  <textarea id="menu" name="menu" placeholder="Cuisine, dietary needs (vegan, gluten-free, kosher), favorite dishes…"></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 catering quote');

    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 CateringQuoteForm() {
  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 catering quote');

    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 0142" required />
      <label htmlFor="event_date">Event date *</label>
      <input id="event_date" type="date" name="event_date" required />
      <label htmlFor="event_type">Event type *</label>
      <select id="event_type" name="event_type" required>
        <option value="">Choose…</option>
        <option>Wedding</option>
        <option>Corporate lunch</option>
        <option>Holiday party</option>
        <option>Birthday</option>
        <option>Funeral</option>
        <option>Drop-off catering</option>
        <option>Other</option>
      </select>
      <label htmlFor="guests">Guest count *</label>
      <select id="guests" name="guests" required>
        <option value="">Choose…</option>
        <option>Under 25</option>
        <option>25–50</option>
        <option>50–100</option>
        <option>100–200</option>
        <option>200+</option>
      </select>
      <label htmlFor="service">Service style</label>
      <select id="service" name="service">
        <option value="">Choose…</option>
        <option>Buffet</option>
        <option>Plated / sit-down</option>
        <option>Family-style</option>
        <option>Cocktail / passed apps</option>
        <option>Drop-off only</option>
      </select>
      <label htmlFor="menu">Menu preferences</label>
      <textarea id="menu" name="menu" placeholder="Cuisine, dietary needs (vegan, gluten-free, kosher), favorite dishes…" />

      <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', 'event_date', 'event_type', 'guests', 'service', 'menu'];
    $payload = ['access_key' => 'YOUR_ACCESS_KEY'];
    $payload['subject'] = 'New catering quote';

    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 catering quote" \
  -d "name=Jane Builder" \
  -d "email=jane@example.com" \
  -d "phone=+15555555555" \
  -d "event_date=2026-05-15" \
  -d "event_type=Wedding" \
  -d "guests=Under 25" \
  -d "service=Buffet" \
  -d "menu=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 show per-guest pricing on the site?
Show 'starting at $X/guest' for each service style. Catering is shopped on price more than most event services; transparency filters out the budget mismatches early. Custom quotes still happen for wedding and corporate, but the floor is public.
02Can I integrate with Total Party Planner / Caterease / CaterZen / Tripleseat?
Yes — webhook the JSON. All four catering CRMs accept inbound leads via Zapier or native APIs. Lead lands as an event with date, headcount, and service style pre-filled, ready for the proposal.
03How do I handle bar service and rentals?
Add 'bar service / rentals / both / neither' checkboxes. Bar adds $15-30/guest plus liquor liability insurance considerations. Rentals (linens, china, glassware) are commonly a 15-20% markup on the rental house's invoice. Capture interest on the form; quote on the call.
04What about food-truck / drop-off-only catering?
Add a service-style option for food-truck or drop-off-only. Different pricing model (often per-guest minimum), different staffing (zero or minimal), different equipment (the truck or stack of disposables). Same form, different proposal template.
✻ ✻ ✻

Ship your catering quote 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