splitforms.com
FINANCE · CONTACT FORM TEMPLATE

Mortgage Broker Pre-Approval Form

Mortgage leads need phone first — every minute of delay drops conversion by a measurable percentage. The form captures loan purpose, credit range, and a phone number that goes straight to your dialler.

1,000/mo free·no card·works on any host
form.htmlhtml71 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 pre-approval request">
04
05 <label for="name">Full name *</label>
06 <input id="name" type="text" name="name" placeholder="Priya Patel" required>
07 <label for="email">Email *</label>
08 <input id="email" type="email" name="email" placeholder="priya@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="purchase_price">Target purchase price *</label>
12 <select id="purchase_price" name="purchase_price" required>
13 <option value="">Choose…</option>
14 <option>Under $300k</option>
15 <option>$300k–$500k</option>
16 <option>$500k–$750k</option>
17 <option>$750k–$1M</option>
18 <option>$1M–$2M</option>
19 <option>$2M+</option>
20 </select>
21 <label for="down_payment">Down payment ready *</label>
22 <select id="down_payment" name="down_payment" required>
23 <option value="">Choose…</option>
24 <option>3–5%</option>
25 <option>10%</option>
26 <option>15%</option>
27 <option>20%</option>
28 <option>25%+</option>
29 </select>
30 <label for="credit_score">Estimated credit score</label>
31 <select id="credit_score" name="credit_score">
32 <option value="">Choose…</option>
33 <option>Below 620</option>
34 <option>620–680</option>
35 <option>680–740</option>
36 <option>740+</option>
37 <option>Not sure</option>
38 </select>
39 <label for="employment">Employment *</label>
40 <select id="employment" name="employment" required>
41 <option value="">Choose…</option>
42 <option>W-2 employee</option>
43 <option>Self-employed</option>
44 <option>1099 contractor</option>
45 <option>Retired</option>
46 <option>Other</option>
47 </select>
48 <label for="timeline">When are you buying? *</label>
49 <select id="timeline" name="timeline" required>
50 <option value="">Choose…</option>
51 <option>This month</option>
52 <option>1–3 months</option>
53 <option>3–6 months</option>
54 <option>6+ months</option>
55 </select>
56 <label for="first_time">First-time buyer?</label>
57 <select id="first_time" name="first_time">
58 <option value="">Choose…</option>
59 <option>Yes</option>
60 <option>No</option>
61 </select>
62
63 <!-- honeypot — bots fill every field -->
64 <input type="checkbox" name="botcheck" style="display:none" tabindex="-1" autocomplete="off">
65
66 <button type="submit">Send</button>
67</form>
68
69<p style="margin-top:12px;font-size:11px;color:#888;text-align:right">
70 Powered by <a href="https://splitforms.com" style="color:#888;text-decoration:none" target="_blank" rel="noopener">splitforms</a>
71</p>
1,000
submissions / mo, free
9
fields, ready to ship
5
code outputs
60s
from copy to inbox
Mortgage Broker Pre-Approval Form — example splitforms template with submissions inbox
§ 01Why it mattersthe qualifying-fields argument

Mortgage is the most time-sensitive lead category in finance. A buyer who fills out a pre-approval form expects a call within 5 minutes — by 30 minutes they've inquired with two other lenders and the deal is gone. The form captures loan purpose (purchase / refi / cash-out), property type, estimated credit range, and target loan amount. Phone is non-negotiable; email-only leads are 10x harder to close. Webhook the submission directly to the LO's mobile so they can return the call before the lead has finished researching the next broker.

Speed-to-lead matters — webhooks into Twilio / Encompass / Floify in 5 minutes.
✦ at a glance
  • Mortgage pre-approval · 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 · mortgage-broker-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 pre-approval request
Full name
Maya Iyer
Email
maya@studio71.co
Phone
+1 415 555 0142
Target purchase price
Under $300k
Down payment ready
3–5%
Estimated credit score
Below 620
Employment
W-2 employee
When are you buying?
30–60 days
First-time buyer?
Yes

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 loan purpose and amount

Required: purpose (purchase / refinance / cash-out / pre-approval), property type, estimated loan amount, estimated credit score range.

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

SMS the LO immediately

Webhook to Twilio — the LO gets a text with the lead's name, phone, and loan purpose within seconds. Speed-to-lead under 5 minutes triples close rate vs 30 minutes.

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

Trigger soft-pull pre-qual

Auto-respond with a soft-pull pre-qualification link (LendingTree, MeridianLink, or your LOS). Pre-qualified leads close 4-6x more often than uncredit-checked leads.

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

  <label for="name">Full name *</label>
  <input id="name" type="text" name="name" placeholder="Priya Patel" required>
  <label for="email">Email *</label>
  <input id="email" type="email" name="email" placeholder="priya@example.com" required>
  <label for="phone">Phone *</label>
  <input id="phone" type="tel" name="phone" placeholder="+1 555 0142" required>
  <label for="purchase_price">Target purchase price *</label>
  <select id="purchase_price" name="purchase_price" required>
    <option value="">Choose…</option>
    <option>Under $300k</option>
    <option>$300k–$500k</option>
    <option>$500k–$750k</option>
    <option>$750k–$1M</option>
    <option>$1M–$2M</option>
    <option>$2M+</option>
  </select>
  <label for="down_payment">Down payment ready *</label>
  <select id="down_payment" name="down_payment" required>
    <option value="">Choose…</option>
    <option>3–5%</option>
    <option>10%</option>
    <option>15%</option>
    <option>20%</option>
    <option>25%+</option>
  </select>
  <label for="credit_score">Estimated credit score</label>
  <select id="credit_score" name="credit_score">
    <option value="">Choose…</option>
    <option>Below 620</option>
    <option>620–680</option>
    <option>680–740</option>
    <option>740+</option>
    <option>Not sure</option>
  </select>
  <label for="employment">Employment *</label>
  <select id="employment" name="employment" required>
    <option value="">Choose…</option>
    <option>W-2 employee</option>
    <option>Self-employed</option>
    <option>1099 contractor</option>
    <option>Retired</option>
    <option>Other</option>
  </select>
  <label for="timeline">When are you buying? *</label>
  <select id="timeline" name="timeline" required>
    <option value="">Choose…</option>
    <option>This month</option>
    <option>1–3 months</option>
    <option>3–6 months</option>
    <option>6+ months</option>
  </select>
  <label for="first_time">First-time buyer?</label>
  <select id="first_time" name="first_time">
    <option value="">Choose…</option>
    <option>Yes</option>
    <option>No</option>
  </select>

  <!-- 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.js87 lines
<form id="lf-form">
  <label for="name">Full name *</label>
  <input id="name" type="text" name="name" placeholder="Priya Patel" required>
  <label for="email">Email *</label>
  <input id="email" type="email" name="email" placeholder="priya@example.com" required>
  <label for="phone">Phone *</label>
  <input id="phone" type="tel" name="phone" placeholder="+1 555 0142" required>
  <label for="purchase_price">Target purchase price *</label>
  <select id="purchase_price" name="purchase_price" required>
    <option value="">Choose…</option>
    <option>Under $300k</option>
    <option>$300k–$500k</option>
    <option>$500k–$750k</option>
    <option>$750k–$1M</option>
    <option>$1M–$2M</option>
    <option>$2M+</option>
  </select>
  <label for="down_payment">Down payment ready *</label>
  <select id="down_payment" name="down_payment" required>
    <option value="">Choose…</option>
    <option>3–5%</option>
    <option>10%</option>
    <option>15%</option>
    <option>20%</option>
    <option>25%+</option>
  </select>
  <label for="credit_score">Estimated credit score</label>
  <select id="credit_score" name="credit_score">
    <option value="">Choose…</option>
    <option>Below 620</option>
    <option>620–680</option>
    <option>680–740</option>
    <option>740+</option>
    <option>Not sure</option>
  </select>
  <label for="employment">Employment *</label>
  <select id="employment" name="employment" required>
    <option value="">Choose…</option>
    <option>W-2 employee</option>
    <option>Self-employed</option>
    <option>1099 contractor</option>
    <option>Retired</option>
    <option>Other</option>
  </select>
  <label for="timeline">When are you buying? *</label>
  <select id="timeline" name="timeline" required>
    <option value="">Choose…</option>
    <option>This month</option>
    <option>1–3 months</option>
    <option>3–6 months</option>
    <option>6+ months</option>
  </select>
  <label for="first_time">First-time buyer?</label>
  <select id="first_time" name="first_time">
    <option value="">Choose…</option>
    <option>Yes</option>
    <option>No</option>
  </select>
  <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 pre-approval 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.tsx102 lines
'use client';

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

export default function MortgagePreapprovalForm() {
  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 pre-approval 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="Priya Patel" required />
      <label htmlFor="email">Email *</label>
      <input id="email" type="email" name="email" placeholder="priya@example.com" required />
      <label htmlFor="phone">Phone *</label>
      <input id="phone" type="tel" name="phone" placeholder="+1 555 0142" required />
      <label htmlFor="purchase_price">Target purchase price *</label>
      <select id="purchase_price" name="purchase_price" required>
        <option value="">Choose…</option>
        <option>Under $300k</option>
        <option>$300k–$500k</option>
        <option>$500k–$750k</option>
        <option>$750k–$1M</option>
        <option>$1M–$2M</option>
        <option>$2M+</option>
      </select>
      <label htmlFor="down_payment">Down payment ready *</label>
      <select id="down_payment" name="down_payment" required>
        <option value="">Choose…</option>
        <option>3–5%</option>
        <option>10%</option>
        <option>15%</option>
        <option>20%</option>
        <option>25%+</option>
      </select>
      <label htmlFor="credit_score">Estimated credit score</label>
      <select id="credit_score" name="credit_score">
        <option value="">Choose…</option>
        <option>Below 620</option>
        <option>620–680</option>
        <option>680–740</option>
        <option>740+</option>
        <option>Not sure</option>
      </select>
      <label htmlFor="employment">Employment *</label>
      <select id="employment" name="employment" required>
        <option value="">Choose…</option>
        <option>W-2 employee</option>
        <option>Self-employed</option>
        <option>1099 contractor</option>
        <option>Retired</option>
        <option>Other</option>
      </select>
      <label htmlFor="timeline">When are you buying? *</label>
      <select id="timeline" name="timeline" required>
        <option value="">Choose…</option>
        <option>This month</option>
        <option>1–3 months</option>
        <option>3–6 months</option>
        <option>6+ months</option>
      </select>
      <label htmlFor="first_time">First-time buyer?</label>
      <select id="first_time" name="first_time">
        <option value="">Choose…</option>
        <option>Yes</option>
        <option>No</option>
      </select>

      <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', 'purchase_price', 'down_payment', 'credit_score', 'employment', 'timeline', 'first_time'];
    $payload = ['access_key' => 'YOUR_ACCESS_KEY'];
    $payload['subject'] = 'New pre-approval 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 pre-approval request" \
  -d "name=Jane Builder" \
  -d "email=jane@example.com" \
  -d "phone=+15555555555" \
  -d "purchase_price=Under $300k" \
  -d "down_payment=3–5%" \
  -d "credit_score=Below 620" \
  -d "employment=W-2 employee" \
  -d "timeline=This month" \
  -d "first_time=Yes" 

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 TRID / RESPA compliant?
The form captures intent only — no TRID-triggering loan disclosures happen until the LO does the formal application. As long as the form doesn't promise a specific rate or term, you're outside TRID's 6-element trigger. Standard practice; consult your compliance officer.
02Can I integrate with Encompass / Floify / Loan Sifter?
Yes — webhook the JSON. Encompass and Floify both accept inbound webhooks via Zapier. Lead lands in your LOS as a prospect with contact and loan-purpose pre-filled.
03How critical is the phone field?
Non-negotiable — make it required. Email-only mortgage leads close at 1-2%; phone leads close at 8-12%. The masked-phone variant ensures you get clean, dialable numbers.
04What about lead-generation services like LendingTree?
LT-style leads cost $30-100 each, are sold to multiple lenders, and the borrower is shopping. Your own form on your own site is free, exclusive, and the borrower came to you specifically. Both channels matter; your own form is the higher-quality stream.
✻ ✻ ✻

Ship your mortgage broker pre-approval 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