This demo shows a realistic property insurance quote form. It combines: conditional groups, multistep, calculated fields, repeaters, conditional redirect and Stripe payments.
Form
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 & outdoor (+€3/mo)=>3" "Cyber & 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"