Insurance quote (demo)

This demo shows a realistic property insurance quote form. It combines: conditional groups, multistep, calculated fields, repeaters, conditional redirect and Stripe payments.

Form

    Property

    🏠 Tell us about your property












    ⚠️ Properties in flood-risk zones carry a 25% premium surcharge.

    Coverage

    Coverage




    Valuables to insure separately

    List any single items worth more than €5 000.




    Your details

    Almost there — your details





    Your quote

    Your instant quote

    Based on your answers, here is your estimated monthly premium:

    /month

    Annual: €(5% off paid annually)

    How we calculated this

    Base premium

    Risk adjustments

    ×

    Discounts

    %

    Add-ons


    Pay your first month

    You can secure your policy now with your first monthly premium.

    Test card: 4242 4242 4242 4242 — any future date, any CVC.


    📞 Let's talk

    Quotes above €200/month are tailored personally by one of our advisors. They'll review your file and call you back within one business day.

    Form Code

    [step title "Property"]
    <h3>🏠 Tell us about your property</h3>
    
    <label>Property type</label>
    [calc_radio home_type use_label_element default:1 "House=>1" "Apartment=>0.8" "Condo=>0.9"]
    
    <label>Year built</label>
    [number home_year min:1850 max:2026 "1990"]
    
    <label>Living area (m²)</label>
    [number home_size min:20 max:2000 "100"]
    
    <label>Are you the owner or renter?</label>
    [calc_radio home_owner use_label_element default:1 "Owner=>1" "Renter=>0"]
    
    [group g-mortgage]
    <label>Outstanding mortgage (€)</label>
    [number mortgage min:0 "0"]
    <label>Property market value (€)</label>
    [number home_value min:10000 "300000"]
    [/group]
    
    [group g-renter]
    <label>Landlord name</label>
    [text landlord_name "Acme Property Management"]
    <label>Lease end date</label>
    [date lease_end "2027-12-31"]
    [/group]
    
    <label>Located in a flood-risk zone?</label>
    [calc_radio flood_zone use_label_element default:2 "Yes=>1" "No=>0"]
    
    [group g-flood-warn]
    <div class="info-box info-box-warn">
      ⚠️ Properties in flood-risk zones carry a 25% premium surcharge.
    </div>
    [/group]
    
    [step title "Coverage"]
    <h3>Coverage</h3>
    
    <label>Coverage level</label>
    [calc_radio home_cover_level use_label_element default:2 "Basic — fire & theft=>1" "Standard — + water damage, liability=>1.4" "Premium — all risks, replacement value=>1.9"]
    
    <label>Security features (each unlocks a discount)</label>
    [calc_checkbox home_security use_label_element "Burglar alarm (-5%)=>5" "Smoke detectors (-3%)=>3" "Smart locks (-2%)=>2"]
    
    <label>Optional add-ons</label>
    [calc_checkbox home_addons use_label_element "Legal expenses (+€4/mo)=>4" "Garden &amp; outdoor (+€3/mo)=>3" "Cyber &amp; identity theft (+€5/mo)=>5"]
    
    <h4>Valuables to insure separately</h4>
    <p>List any single items worth more than €5 000.</p>
    [repeater valuables add "+ Add valuable" remove "Remove" remove_button:per_entry]
    <label>Item</label>
    [text valuable_item "Engagement ring"]
    <label>Estimated value (€)</label>
    [number valuable_value min:0 "7500"]
    [/repeater]
    
    [step title "Your details"]
    <h3>Almost there — your details</h3>
    
    <label>Full name</label>
    [text* your-name "Jane Doe"]
    
    <label>Email</label>
    [email* your-email "jane.doe@example.com"]
    
    <label>Phone</label>
    [tel your-phone "+32 470 12 34 56"]
    
    <label>Postcode</label>
    [text postcode "1000"]
    
    [step title "Your quote"]
    <h3>Your instant quote</h3>
    
    <p>Based on your answers, here is your estimated monthly premium:</p>
    
    <div class="quote-card">
      <div class="quote-amount">€[calculated premium func:calcPremium display:span decimals:2]<span class="quote-period">/month</span></div>
      <div class="quote-annual">Annual: €[calculated premium_annual formula:"[premium] * 12 * 0.95" display:span decimals:2] <small>(5% off paid annually)</small></div>
    </div>
    
    <h4>How we calculated this</h4>
    <table class="quote-breakdown">
      <tr><td>Base premium</td><td>€[calculated base_premium func:calcBase display:span decimals:2]</td></tr>
      <tr><td>Risk adjustments</td><td>×[calculated risk_factor func:calcRisk display:span decimals:2]</td></tr>
      <tr><td>Discounts</td><td>[calculated discount_pct func:calcDiscount display:span decimals:0]%</td></tr>
      <tr><td>Add-ons</td><td>€[calculated addons_total func:calcAddons display:span decimals:2]</td></tr>
    </table>
    
    [group g-low-quote]
    <hr />
    <h4>Pay your first month</h4>
    <p>You can secure your policy now with your first monthly premium.</p>
    <p><small>Test card: <code>4242 4242 4242 4242</code> — any future date, any CVC.</small></p>
    [stripe currency:eur amount:5000 "Pay your first month"]
    [/group]
    
    [group g-high-quote]
    <hr />
    <div class="info-box info-box-call">
      <h4>📞 Let's talk</h4>
      <p>Quotes above €200/month are tailored personally by one of our advisors. They'll review your file and call you back within one business day.</p>
    </div>
    [/group]
    
    <script>
    function calcBase(fields) {
      var size = parseFloat(fields.get('home_size')) || 0;
      var type = parseFloat(fields.get('home_type')) || 1;
      return (size * 0.4 + 20) * type;
    }
    function calcRisk(fields) {
      var risk = 1;
      if ((parseFloat(fields.get('flood_zone')) || 0) > 0) risk *= 1.25;
      risk *= parseFloat(fields.get('home_cover_level')) || 1;
      var year = parseFloat(fields.get('home_year')) || 2000;
      if (year < 1950) risk *= 1.2;
      return risk;
    }
    function calcDiscount(fields) {
      var sec = (fields.get('home_security') || '').toString();
      var d = 0;
      if (sec.indexOf('Burglar') > -1) d += 5;
      if (sec.indexOf('Smoke') > -1) d += 3;
      if (sec.indexOf('Smart') > -1) d += 2;
      return d;
    }
    function calcAddons(fields) {
      var sum = 0;
      (fields.get('home_addons') || '').toString().split(',').forEach(function (s) {
        var parts = s.split('€');
        if (parts.length > 1) sum += parseInt(parts[1], 10) || 0;
      });
      return sum;
    }
    function calcPremium(fields) {
      var base = calcBase(fields);
      var risk = calcRisk(fields);
      var disc = calcDiscount(fields);
      var add  = calcAddons(fields);
      var p = base * risk * (1 - disc / 100) + add;
      if (p < 5) p = 5;
      return p;
    }
    </script>

    Email Body

    <h2>New property insurance quote request</h2>
    <p><strong>Name:</strong> [your-name]<br />
    <strong>Email:</strong> [your-email]<br />
    <strong>Phone:</strong> [your-phone]<br />
    <strong>Postcode:</strong> [postcode]</p>
    
    <h3>Quote</h3>
    <p>Monthly premium: €[premium]<br />
    Annual premium: €[premium_annual]</p>
    
    <h3>Property</h3>
    <p>Type: [home_type]<br />
    Year built: [home_year]<br />
    Size: [home_size] m²<br />
    Owner: [home_owner]<br />
    Mortgage: €[mortgage]<br />
    Property value: €[home_value]<br />
    Landlord: [landlord_name]<br />
    Lease end: [lease_end]<br />
    Flood zone: [flood_zone]</p>
    
    <h3>Coverage</h3>
    <p>Level: [home_cover_level]<br />
    Security: [home_security]<br />
    Add-ons: [home_addons]</p>
    
    [valuables]
    <p>Valuable: [valuable_item] - €[valuable_value]</p>
    [/valuables]
    
    <p>Stripe: [_stripe_payment_link]</p>

    Conditional Fields (Text)

    show [g-mortgage] if [home_owner] equals "Owner"
    show [g-renter] if [home_owner] equals "Renter"
    show [g-flood-warn] if [flood_zone] equals "Yes"
    show [g-low-quote] if [premium] less than "200"
    show [g-high-quote] if [premium] greater than or equals "200"

    Edit this form in the form tester