export function cartAbandonmentCostQuiz(form: FormTs) {
form.setTitle(() => '🛒 How Much Revenue Are You Losing to Cart Abandonment?');
const state = form.state<{
monthlyVisitors: number;
addToCartRate: number;
cartAbandonmentRate: number;
averageOrderValue: number;
currentRecoveryRate: number;
}>({
monthlyVisitors: 50000,
addToCartRate: 10,
cartAbandonmentRate: 70,
averageOrderValue: 75,
currentRecoveryRate: 5
});
const calculateMetrics = () => {
const s = state();
const monthlyAddToCarts = s.monthlyVisitors * (s.addToCartRate / 100);
const abandonedCarts = monthlyAddToCarts * (s.cartAbandonmentRate / 100);
const completedOrders = monthlyAddToCarts - abandonedCarts;
const currentRevenue = completedOrders * s.averageOrderValue;
const lostRevenue = abandonedCarts * s.averageOrderValue;
const recoveredRevenue = abandonedCarts * (s.currentRecoveryRate / 100) * s.averageOrderValue;
const actualLostRevenue = lostRevenue - recoveredRevenue;
const industryBenchmarkRecovery = 15;
const potentialRecovery = abandonedCarts * (industryBenchmarkRecovery / 100) * s.averageOrderValue;
const additionalRevenue = potentialRecovery - recoveredRevenue;
return {
monthlyAddToCarts: Math.round(monthlyAddToCarts),
abandonedCarts: Math.round(abandonedCarts),
completedOrders: Math.round(completedOrders),
currentRevenue,
lostRevenue,
recoveredRevenue,
actualLostRevenue,
potentialRecovery,
additionalRevenue,
annualLostRevenue: actualLostRevenue * 12,
annualAdditionalRevenue: additionalRevenue * 12
};
};
form.configureCompletionScreen({
type: 'text',
title: '🛒 Your Cart Recovery Playbook Is Ready!',
message: () => {
const metrics = calculateMetrics();
return `You're losing $${Math.round(metrics.annualLostRevenue).toLocaleString()}/year to cart abandonment. Check your email for recovery strategies that could add $${Math.round(metrics.annualAdditionalRevenue).toLocaleString()} to your revenue!`;
}
});
const pages = form.addPages('quiz-pages', { heightMode: 'current-page' });
// ============ PAGE 1: Traffic & Conversion ============
const page1 = pages.addPage('traffic', { mobileBreakpoint: 500 });
page1.addRow(row => {
row.addTextPanel('header1', {
label: 'Step 1 of 4: Traffic & Conversion',
computedValue: () => 'Enter your store data to calculate the true cost of abandoned carts',
customStyles: { fontSize: '0.9rem', color: '#6b7280', marginBottom: '1rem' }
});
});
page1.addSpacer({ height: '24px' });
page1.addRow(row => {
row.addSlider('monthly_visitors', {
label: '👥 Monthly Website Visitors',
tooltip: 'Your total monthly unique visitors from Google Analytics or similar',
min: 1000,
max: 500000,
step: 1000,
defaultValue: 50000,
onValueChange: (val) => {
state.update(current => ({ ...current, monthlyVisitors: val || 50000 }));
}
});
});
page1.addSpacer({ height: '16px' });
page1.addRow(row => {
row.addSlider('add_to_cart_rate', {
label: '🛒 Add-to-Cart Rate (%)',
tooltip: 'Percentage of visitors who add items to cart. Industry average is 8-12%.',
min: 1,
max: 30,
step: 0.5,
defaultValue: 10,
onValueChange: (val) => {
state.update(current => ({ ...current, addToCartRate: val || 10 }));
}
});
});
page1.addSpacer({ height: '16px' });
page1.addRow(row => {
row.addTextPanel('traffic_preview_label', {
computedValue: () => '📊 Monthly Add-to-Carts:',
customStyles: { fontSize: '0.95rem', color: '#64748b' }
});
row.addTextPanel('traffic_preview_value', {
computedValue: () => calculateMetrics().monthlyAddToCarts.toLocaleString(),
customStyles: { fontSize: '1.1rem', fontWeight: '700', color: '#1e293b', textAlign: 'right' }
});
});
// ============ PAGE 2: Cart Abandonment Data ============
const page2 = pages.addPage('abandonment', { mobileBreakpoint: 500 });
page2.addRow(row => {
row.addTextPanel('header2', {
label: 'Step 2 of 4: Cart Abandonment',
computedValue: () => 'Tell us about your cart abandonment and order values',
customStyles: { fontSize: '0.9rem', color: '#6b7280', marginBottom: '1rem' }
});
});
page2.addSpacer({ height: '24px' });
page2.addRow(row => {
row.addSlider('abandonment_rate', {
label: '🚪 Cart Abandonment Rate (%)',
tooltip: 'Industry average is 70%. Check your analytics for your actual rate.',
min: 40,
max: 90,
step: 1,
defaultValue: 70,
onValueChange: (val) => {
state.update(current => ({ ...current, cartAbandonmentRate: val || 70 }));
}
});
});
page2.addSpacer({ height: '16px' });
page2.addRow(row => {
row.addSlider('average_order_value', {
label: '💰 Average Order Value ($)',
tooltip: 'Your typical order value. Check your e-commerce dashboard.',
min: 10,
max: 500,
step: 5,
defaultValue: 75,
onValueChange: (val) => {
state.update(current => ({ ...current, averageOrderValue: val || 75 }));
}
});
});
page2.addSpacer({ height: '16px' });
page2.addRow(row => {
row.addSlider('current_recovery', {
label: '🔄 Current Cart Recovery Rate (%)',
tooltip: 'What % of abandoned carts do you currently recover? Industry leaders hit 15%+.',
min: 0,
max: 30,
step: 1,
defaultValue: 5,
onValueChange: (val) => {
state.update(current => ({ ...current, currentRecoveryRate: val || 5 }));
}
});
});
page2.addSpacer({ height: '16px' });
page2.addRow(row => {
row.addTextPanel('abandoned_label', {
computedValue: () => '🛒 Abandoned Carts/Month:',
customStyles: { fontSize: '0.95rem', color: '#64748b' }
});
row.addTextPanel('abandoned_value', {
computedValue: () => calculateMetrics().abandonedCarts.toLocaleString(),
customStyles: { fontSize: '1.1rem', fontWeight: '700', color: '#dc2626', textAlign: 'right' }
});
});
page2.addRow(row => {
row.addTextPanel('lost_label', {
computedValue: () => '💸 Monthly Lost Revenue:',
customStyles: { fontSize: '0.95rem', color: '#64748b' }
});
row.addPriceDisplay('lost_value', {
computedValue: () => Math.round(calculateMetrics().lostRevenue),
currency: '$',
alignment: 'right'
});
});
// ============ PAGE 3: Recovery Tactics ============
const page3 = pages.addPage('recovery', { mobileBreakpoint: 500 });
page3.addRow(row => {
row.addTextPanel('header3', {
label: 'Step 3 of 4: Recovery Tactics',
computedValue: () => 'Tell us about your current recovery efforts',
customStyles: { fontSize: '0.9rem', color: '#6b7280', marginBottom: '1rem' }
});
});
page3.addSpacer({ height: '24px' });
page3.addRow(row => {
row.addCheckboxList('current_tactics', {
label: 'Which recovery tactics do you currently use?',
isRequired: true,
orientation: 'vertical',
options: [
{ id: 'email_1', name: '📧 Abandoned cart email (1 email)' },
{ id: 'email_series', name: '📬 Email sequence (2-3 emails)' },
{ id: 'sms', name: '📱 SMS reminders' },
{ id: 'retargeting', name: '🎯 Retargeting ads' },
{ id: 'exit_intent', name: '🚨 Exit-intent popups' },
{ id: 'none', name: '❌ None of the above' }
]
});
});
page3.addSpacer({ height: '16px' });
page3.addRow(row => {
row.addRadioButton('checkout_friction', {
label: 'What\'s your biggest checkout friction point?',
isRequired: true,
orientation: 'vertical',
tooltip: 'Understanding friction helps prioritize fixes that reduce abandonment',
options: [
{ id: 'shipping', name: '🚚 Shipping costs revealed too late' },
{ id: 'account', name: '👤 Account creation required' },
{ id: 'payment', name: '💳 Limited payment options' },
{ id: 'trust', name: '🔒 Trust/security concerns' },
{ id: 'complex', name: '😤 Too many checkout steps' },
{ id: 'unknown', name: '🤷 Not sure' }
]
});
});
// ============ PAGE 4: Results ============
const resultsPage = pages.addPage('results', { mobileBreakpoint: 500 });
resultsPage.addRow(row => {
row.addTextPanel('results_header', {
label: '📊 Your Cart Abandonment Cost',
computedValue: () => '',
customStyles: { fontSize: '1.25rem', fontWeight: 'bold', textAlign: 'center', marginBottom: '1rem' }
});
});
resultsPage.addRow(row => {
row.addTextPanel('annual_lost_label', {
computedValue: () => '🚨 ANNUAL REVENUE LOST',
customStyles: { fontSize: '0.9rem', color: '#dc2626', textAlign: 'center', textTransform: 'uppercase', letterSpacing: '0.05em', fontWeight: '600' }
});
});
resultsPage.addRow(row => {
row.addPriceDisplay('annual_lost_value', {
computedValue: () => Math.round(calculateMetrics().annualLostRevenue),
currency: '$',
variant: 'large',
alignment: 'center'
});
});
resultsPage.addRow(row => {
row.addTextPanel('monthly_lost_label', {
computedValue: () => {
const metrics = calculateMetrics();
return `That's $${Math.round(metrics.actualLostRevenue).toLocaleString()} per month`;
},
customStyles: { fontSize: '1rem', color: '#64748b', textAlign: 'center', marginBottom: '1.5rem' }
});
});
resultsPage.addSpacer({ height: '16px' });
resultsPage.addRow(row => {
row.addTextPanel('stats_label_1', {
computedValue: () => '🛒 Abandoned Carts/Month',
customStyles: { fontSize: '0.875rem', color: '#64748b', textAlign: 'center' }
});
row.addTextPanel('stats_label_2', {
computedValue: () => '📉 Abandonment Rate',
customStyles: { fontSize: '0.875rem', color: '#64748b', textAlign: 'center' }
});
});
resultsPage.addRow(row => {
row.addTextPanel('stats_value_1', {
computedValue: () => calculateMetrics().abandonedCarts.toLocaleString(),
customStyles: { fontSize: '1.75rem', fontWeight: 'bold', color: '#1e293b', textAlign: 'center' }
});
row.addTextPanel('stats_value_2', {
computedValue: () => `${state().cartAbandonmentRate}%`,
customStyles: { fontSize: '1.75rem', fontWeight: 'bold', color: '#1e293b', textAlign: 'center' }
});
});
resultsPage.addSpacer({ height: '24px' });
resultsPage.addRow(row => {
row.addTextPanel('recovery_header', {
label: '💰 Recovery Opportunity',
computedValue: () => '',
customStyles: { fontSize: '1.1rem', fontWeight: '600', color: '#166534', textAlign: 'center' }
});
});
resultsPage.addRow(row => {
row.addTextPanel('current_label', {
computedValue: () => '📈 Currently Recovering',
customStyles: { fontSize: '0.875rem', color: '#64748b', textAlign: 'center' }
});
row.addTextPanel('potential_label', {
computedValue: () => '🚀 With 15% Recovery Rate',
customStyles: { fontSize: '0.875rem', color: '#64748b', textAlign: 'center' }
});
});
resultsPage.addRow(row => {
row.addPriceDisplay('current_recovery_value', {
computedValue: () => Math.round(calculateMetrics().recoveredRevenue * 12),
currency: '$',
alignment: 'center'
});
row.addPriceDisplay('potential_recovery_value', {
computedValue: () => Math.round(calculateMetrics().potentialRecovery * 12),
currency: '$',
variant: 'success',
alignment: 'center'
});
});
resultsPage.addSpacer({ height: '16px' });
resultsPage.addRow(row => {
row.addTextPanel('additional_label', {
computedValue: () => '✨ Additional Annual Revenue Possible',
customStyles: { fontSize: '0.9rem', color: '#166534', textAlign: 'center', fontWeight: '500' }
});
});
resultsPage.addRow(row => {
row.addPriceDisplay('additional_value', {
computedValue: () => Math.round(calculateMetrics().annualAdditionalRevenue),
currency: '+$',
variant: 'success',
alignment: 'center'
});
});
// ============ Lead Capture Page ============
const leadPage = pages.addPage('lead_capture', { mobileBreakpoint: 500 });
leadPage.addRow(row => {
row.addTextPanel('lead_header', {
label: 'Step 5 of 5: Get Your Recovery Playbook',
computedValue: () => 'Enter your details to receive cart abandonment email templates and strategies',
customStyles: { fontSize: '0.9rem', color: '#6b7280', marginBottom: '1rem' }
});
});
leadPage.addSpacer({ height: '24px' });
leadPage.addRow(row => {
row.addTextbox('first_name', {
label: 'First Name',
isRequired: true,
placeholder: 'John'
}, '1fr');
row.addTextbox('last_name', {
label: 'Last Name',
isRequired: true,
placeholder: 'Smith'
}, '1fr');
});
leadPage.addRow(row => {
row.addEmail('email', {
label: 'Email Address',
isRequired: true,
placeholder: 'john@store.com'
});
});
leadPage.addRow(row => {
row.addTextbox('store_url', {
label: 'Store URL',
placeholder: 'https://yourstore.com'
});
});
leadPage.addRow(row => {
row.addDropdown('platform', {
label: 'E-commerce Platform',
isRequired: true,
placeholder: 'Select platform',
options: [
{ id: 'shopify', name: '🛍️ Shopify' },
{ id: 'woocommerce', name: '🔌 WooCommerce' },
{ id: 'magento', name: '🏪 Magento' },
{ id: 'bigcommerce', name: '📦 BigCommerce' },
{ id: 'custom', name: '⚙️ Custom/Other' }
]
});
});
leadPage.addRow(row => {
row.addCheckboxList('consent', {
orientation: 'vertical',
options: [
{ id: 'playbook', name: '📄 Send me the cart recovery playbook', isRequired: true },
{ id: 'templates', name: '📧 Include email templates I can use today' },
{ id: 'audit', name: '🔍 I\'d like a free checkout audit' }
],
defaultValue: ['playbook']
});
});
form.configurePdf('report', (pdf) => {
pdf.configure({
filename: 'cart-abandonment-report.pdf',
pageSize: 'A4',
allowUserDownload: true,
downloadButtonLabel: '📄 Download Report',
header: { title: 'Cart Abandonment Cost Analysis', subtitle: 'Your Personalized Recovery Report' },
footer: { text: 'Generated by FormTs Cart Calculator', showPageNumbers: true }
});
pdf.addSection('Executive Summary', section => {
const metrics = calculateMetrics();
section.addRow(row => {
row.addField('Annual Lost Revenue', `$${Math.round(metrics.annualLostRevenue).toLocaleString()}`);
row.addField('Recovery Opportunity', `$${Math.round(metrics.annualAdditionalRevenue).toLocaleString()}`);
});
section.addRow(row => {
row.addField('Monthly Abandoned Carts', metrics.abandonedCarts.toLocaleString());
row.addField('Abandonment Rate', `${state().cartAbandonmentRate}%`);
});
});
pdf.addSection('Your Store Data', section => {
const s = state();
section.addRow(row => {
row.addField('Monthly Visitors', s.monthlyVisitors.toLocaleString());
row.addField('Add-to-Cart Rate', `${s.addToCartRate}%`);
});
section.addRow(row => {
row.addField('Average Order Value', `$${s.averageOrderValue}`);
row.addField('Current Recovery Rate', `${s.currentRecoveryRate}%`);
});
});
});
form.configureSubmitButton({
label: () => {
const metrics = calculateMetrics();
return `📧 Get Playbook (+$${Math.round(metrics.annualAdditionalRevenue / 1000)}K opportunity)`;
}
});
form.configureSubmitBehavior({
sendToServer: true
});
}