splitforms.com
CREATIVE AGENCY · CONTACT FORM TEMPLATE

Marketing Agency Discovery Form

Marketing inquiries pour in — most are tire-kickers. The discovery form qualifies on monthly ad budget, current channels, and KPIs before the strategy call gets booked.

1,000/mo free·no card·works on any host
form.htmlhtml51 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 marketing inquiry">
04
05 <label for="name">Full name *</label>
06 <input id="name" type="text" name="name" placeholder="Hans Becker" required>
07 <label for="email">Work email *</label>
08 <input id="email" type="email" name="email" placeholder="hans@company.com" required>
09 <label for="company">Company *</label>
10 <input id="company" type="text" name="company" placeholder="Kraft GmbH" required>
11 <label for="size">Company size *</label>
12 <select id="size" name="size" required>
13 <option value="">Choose…</option>
14 <option>Solo / freelancer</option>
15 <option>2–10</option>
16 <option>11–50</option>
17 <option>51–250</option>
18 <option>250+</option>
19 </select>
20 <label for="channels">Channels of interest *</label>
21 <select id="channels" name="channels" required>
22 <option value="">Choose…</option>
23 <option>SEO</option>
24 <option>Paid (Google / Meta)</option>
25 <option>Content / blog</option>
26 <option>Email</option>
27 <option>Social / brand</option>
28 <option>PR</option>
29 <option>Multi-channel</option>
30 </select>
31 <label for="budget">Monthly budget *</label>
32 <select id="budget" name="budget" required>
33 <option value="">Choose…</option>
34 <option>&lt; $5k</option>
35 <option>$5k–$15k</option>
36 <option>$15k–$50k</option>
37 <option>$50k+</option>
38 <option>Not sure yet</option>
39 </select>
40 <label for="goals">Goals *</label>
41 <textarea id="goals" name="goals" placeholder="Pipeline, signups, demos, revenue target — be specific." required></textarea>
42
43 <!-- honeypot — bots fill every field -->
44 <input type="checkbox" name="botcheck" style="display:none" tabindex="-1" autocomplete="off">
45
46 <button type="submit">Send</button>
47</form>
48
49<p style="margin-top:12px;font-size:11px;color:#888;text-align:right">
50 Powered by <a href="https://splitforms.com" style="color:#888;text-decoration:none" target="_blank" rel="noopener">splitforms</a>
51</p>
1,000
submissions / mo, free
7
fields, ready to ship
5
code outputs
60s
from copy to inbox
Marketing Agency Discovery Form — example splitforms template with submissions inbox
§ 01Why it mattersthe qualifying-fields argument

Marketing agencies sell retainers — $3-30k/month for SEO, PPC, content, full-service growth. The discovery call decides retainer fit, but unqualified inquiries flood every form on the internet. The multi-step discovery form filters in stages: services interested in, current monthly ad spend, current channels, KPIs that matter, monthly budget for agency fees. Each step drops the obvious mismatches. Agencies that switch from a generic 'contact us' to a multi-step discovery form report 70% drop in discovery calls and 2-3x close rate on the calls that do book — the prospect self-qualified the whole way through.

Multi-step (Typeform-style) · webhooks into HubSpot / Salesforce / Close.
✦ at a glance
  • Marketing agency discovery call · 7 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 · marketing-agency-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 marketing inquiry
Full name
Maya Iyer
Work email
maya@studio71.co
Company
Studio 71
Company size
Solo / freelancer
Channels of interest
SEO
Monthly budget
$650k — $850k
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

Multi-step discovery

Step 1: services (SEO / PPC / content / social / email / full-service). Step 2: current monthly ad spend. Step 3: KPIs and goals. Step 4: monthly retainer budget. Step 5: contact info.

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

Filter on retainer budget

Retainer ranges ($1-3k / $3-7k / $7-15k / $15k+). Most agencies have a floor — leads below it get the courteous mismatch note plus a self-serve resources email instead of a discovery call.

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

Send the strategy call link

Qualified leads get a Calendly link for a 30-min strategy call with a partner or growth lead. Auto-respond includes the agency's recent case-study deck so the prospect arrives prepared.

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

  <label for="name">Full name *</label>
  <input id="name" type="text" name="name" placeholder="Hans Becker" required>
  <label for="email">Work email *</label>
  <input id="email" type="email" name="email" placeholder="hans@company.com" required>
  <label for="company">Company *</label>
  <input id="company" type="text" name="company" placeholder="Kraft GmbH" required>
  <label for="size">Company size *</label>
  <select id="size" name="size" required>
    <option value="">Choose…</option>
    <option>Solo / freelancer</option>
    <option>2–10</option>
    <option>11–50</option>
    <option>51–250</option>
    <option>250+</option>
  </select>
  <label for="channels">Channels of interest *</label>
  <select id="channels" name="channels" required>
    <option value="">Choose…</option>
    <option>SEO</option>
    <option>Paid (Google / Meta)</option>
    <option>Content / blog</option>
    <option>Email</option>
    <option>Social / brand</option>
    <option>PR</option>
    <option>Multi-channel</option>
  </select>
  <label for="budget">Monthly budget *</label>
  <select id="budget" name="budget" required>
    <option value="">Choose…</option>
    <option>&lt; $5k</option>
    <option>$5k–$15k</option>
    <option>$15k–$50k</option>
    <option>$50k+</option>
    <option>Not sure yet</option>
  </select>
  <label for="goals">Goals *</label>
  <textarea id="goals" name="goals" placeholder="Pipeline, signups, demos, revenue target — be specific." 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.js67 lines
<form id="lf-form">
  <label for="name">Full name *</label>
  <input id="name" type="text" name="name" placeholder="Hans Becker" required>
  <label for="email">Work email *</label>
  <input id="email" type="email" name="email" placeholder="hans@company.com" required>
  <label for="company">Company *</label>
  <input id="company" type="text" name="company" placeholder="Kraft GmbH" required>
  <label for="size">Company size *</label>
  <select id="size" name="size" required>
    <option value="">Choose…</option>
    <option>Solo / freelancer</option>
    <option>2–10</option>
    <option>11–50</option>
    <option>51–250</option>
    <option>250+</option>
  </select>
  <label for="channels">Channels of interest *</label>
  <select id="channels" name="channels" required>
    <option value="">Choose…</option>
    <option>SEO</option>
    <option>Paid (Google / Meta)</option>
    <option>Content / blog</option>
    <option>Email</option>
    <option>Social / brand</option>
    <option>PR</option>
    <option>Multi-channel</option>
  </select>
  <label for="budget">Monthly budget *</label>
  <select id="budget" name="budget" required>
    <option value="">Choose…</option>
    <option>&lt; $5k</option>
    <option>$5k–$15k</option>
    <option>$15k–$50k</option>
    <option>$50k+</option>
    <option>Not sure yet</option>
  </select>
  <label for="goals">Goals *</label>
  <textarea id="goals" name="goals" placeholder="Pipeline, signups, demos, revenue target — be specific." 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 marketing 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.tsx82 lines
'use client';

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

export default function MarketingDiscoveryForm() {
  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 marketing 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">Full name *</label>
      <input id="name" type="text" name="name" placeholder="Hans Becker" required />
      <label htmlFor="email">Work email *</label>
      <input id="email" type="email" name="email" placeholder="hans@company.com" required />
      <label htmlFor="company">Company *</label>
      <input id="company" type="text" name="company" placeholder="Kraft GmbH" required />
      <label htmlFor="size">Company size *</label>
      <select id="size" name="size" required>
        <option value="">Choose…</option>
        <option>Solo / freelancer</option>
        <option>2–10</option>
        <option>11–50</option>
        <option>51–250</option>
        <option>250+</option>
      </select>
      <label htmlFor="channels">Channels of interest *</label>
      <select id="channels" name="channels" required>
        <option value="">Choose…</option>
        <option>SEO</option>
        <option>Paid (Google / Meta)</option>
        <option>Content / blog</option>
        <option>Email</option>
        <option>Social / brand</option>
        <option>PR</option>
        <option>Multi-channel</option>
      </select>
      <label htmlFor="budget">Monthly budget *</label>
      <select id="budget" name="budget" required>
        <option value="">Choose…</option>
        <option>&lt; $5k</option>
        <option>$5k–$15k</option>
        <option>$15k–$50k</option>
        <option>$50k+</option>
        <option>Not sure yet</option>
      </select>
      <label htmlFor="goals">Goals *</label>
      <textarea id="goals" name="goals" placeholder="Pipeline, signups, demos, revenue target — be specific." 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', 'company', 'size', 'channels', 'budget', 'goals'];
    $payload = ['access_key' => 'YOUR_ACCESS_KEY'];
    $payload['subject'] = 'New marketing 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.sh11 lines
curl -X POST https://splitforms.com/api/submit \
  -H "Accept: application/json" \
  -d "access_key=YOUR_ACCESS_KEY" \
  -d "subject=New marketing inquiry" \
  -d "name=Jane Builder" \
  -d "email=jane@example.com" \
  -d "company=Jane Builder" \
  -d "size=Solo / freelancer" \
  -d "channels=SEO" \
  -d "budget=< $5k" \
  -d "goals=Hello from cURL" 

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

§ 04bUse this template with…17 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.

§ 06FAQ4 answered

Things people ask before they ship.

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

01Why multi-step instead of one long form?
Long forms drop conversion 30-50%. Multi-step shows one question per screen — the prospect has commitment momentum from filling step 3, so step 7 (the budget question that scares them off) gets answered. Multi-step doubles or triples completion vs the equivalent long form.
02Can I integrate with HubSpot / Salesforce / Close?
Yes — webhook the JSON. All three accept inbound leads via native APIs or Zapier. The lead lands as a deal in the pipeline with services, budget, and KPIs pre-filled, ready for the discovery call.
03Should I show retainer pricing on the site?
Show 'starting at $X/month' for each service line. Full transparency on retainer minimums removes the awkward 'we're outside your budget' moment on the call. The marketing-fluent buyers expect it.
04How do I handle one-off project inquiries vs retainers?
Add a 'one-off / retainer / not sure' radio. One-off projects (audits, $5-15k website redesigns) route to a project quote flow; retainers route to the strategy call. Two completely different sales motions.
✻ ✻ ✻

Ship your marketing agency discovery 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