Lead-Capture Quiz
Quiz that captures email before revealing results. Replaces Octane AI lead flows.
Live preview
See it in action.
Fully interactive, drag, click, scroll inside the frame, toggle to mobile.
About this section
Variant of the Quiz / Product Finder that adds an email-gate step between the last question and the result reveal. Captures the lead even if they don't convert immediately. Submits answers as a structured customer tag (quiz:{tag1}-{tag2}) so your Klaviyo / Mailchimp segments can target leads by their quiz outcome. Buyers can skip the gate and still see results, but most don't.
Install in 90 seconds
- 01
Create /sections/modblo-lead-capture-quiz.liquid.
- 02
Paste the section code and save.
- 03
Add the section to a /pages/quiz page (or your homepage).
- 04
Pick a recommendation collection and tag your products with the same labels you use on quiz options.
- 05
In Klaviyo / Mailchimp, build a flow triggered by customer tags matching 'quiz:*' so you can email each quiz-taker their personalized picks plus a discount code.
The Liquid
{%- comment -%}
modblo. Lead-Capture Quiz
Variant of the Quiz / Product Finder with an email-gate step inserted
between the last question and the result reveal. Captures the lead
even if the buyer doesn't convert immediately. Submits answers as a
customer tag (quiz:{tag1}-{tag2}) so Klaviyo / Mailchimp segments and
flows can target the lead by their quiz outcome.
{%- endcomment -%}
{%- assign rec_collection = collections[section.settings.rec_collection] -%}
<section class="modblo-lq" data-modblo-lq
data-section-id="{{ section.id }}"
style="--modblo-lq-bg: {{ section.settings.bg }};
--modblo-lq-fg: {{ section.settings.fg }};
--modblo-lq-accent: {{ section.settings.accent }};">
<div class="modblo-lq__inner">
{%- comment -%} Intro slide {%- endcomment -%}
<div class="modblo-lq__slide is-active" data-modblo-lq-slide="intro">
{%- if section.settings.eyebrow != blank -%}
<p class="modblo-lq__eyebrow">{{ section.settings.eyebrow }}</p>
{%- endif -%}
<h2 class="modblo-lq__h">{{ section.settings.heading | default: 'Find your match in 60 seconds.' }}</h2>
<p class="modblo-lq__sub">{{ section.settings.subheading | default: 'Answer a few quick questions and we will email your personalized recommendations.' }}</p>
<button type="button" class="modblo-lq__btn modblo-lq__btn--primary" data-modblo-lq-start>
{{ section.settings.start_label | default: 'Start the quiz' }}
<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M5 12h14M12 5l7 7-7 7"/>
</svg>
</button>
</div>
{%- comment -%} Question slides {%- endcomment -%}
{%- assign q_index = 0 -%}
{%- for block in section.blocks -%}
{%- if block.type == 'question' -%}
{%- assign q_index = q_index | plus: 1 -%}
<div class="modblo-lq__slide modblo-lq__question"
data-modblo-lq-slide="q-{{ forloop.index }}"
data-q-index="{{ q_index }}"
{{ block.shopify_attributes }}>
<div class="modblo-lq__progress">
<div class="modblo-lq__progress-bar"><div data-modblo-lq-bar></div></div>
<p class="modblo-lq__progress-text">
Question <strong>{{ q_index }}</strong> of <span data-modblo-lq-total></span>
</p>
</div>
<h3 class="modblo-lq__qh">{{ block.settings.text }}</h3>
{%- if block.settings.helper != blank -%}
<p class="modblo-lq__qhelp">{{ block.settings.helper }}</p>
{%- endif -%}
<div class="modblo-lq__opts">
{%- assign opts = '1|2|3|4' | split: '|' -%}
{%- for n in opts -%}
{%- assign label_key = 'option' | append: n | append: '_label' -%}
{%- assign tags_key = 'option' | append: n | append: '_tags' -%}
{%- assign label = block.settings[label_key] -%}
{%- assign tags = block.settings[tags_key] -%}
{%- if label != blank -%}
<button type="button" class="modblo-lq__opt"
data-modblo-lq-opt
data-tags="{{ tags }}">
<span class="modblo-lq__opt-letter" aria-hidden="true">{{ n }}</span>
<span class="modblo-lq__opt-label">{{ label }}</span>
<span class="modblo-lq__opt-check" aria-hidden="true">
<svg viewBox="0 0 12 12" width="12" height="12" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M2 6l3 3 5-6"/></svg>
</span>
</button>
{%- endif -%}
{%- endfor -%}
</div>
<div class="modblo-lq__nav">
<button type="button" class="modblo-lq__back" data-modblo-lq-back>← Back</button>
<button type="button" class="modblo-lq__btn modblo-lq__btn--primary" data-modblo-lq-next disabled>
{%- if forloop.last -%}See your results →{%- else -%}Continue →{%- endif -%}
</button>
</div>
</div>
{%- endif -%}
{%- endfor -%}
{%- comment -%} Email gate slide — appears after the last question {%- endcomment -%}
<div class="modblo-lq__slide modblo-lq__gate" data-modblo-lq-slide="gate">
<div class="modblo-lq__gate-icon" aria-hidden="true">
<svg viewBox="0 0 24 24" width="32" height="32" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round">
<path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/>
<polyline points="22,6 12,13 2,6"/>
</svg>
</div>
<h3 class="modblo-lq__h">{{ section.settings.gate_heading | default: 'Where should we send your matches?' }}</h3>
<p class="modblo-lq__sub">{{ section.settings.gate_sub | default: 'We will email your personalized picks plus a one-time discount code.' }}</p>
<form class="modblo-lq__form" data-modblo-lq-form>
<input type="hidden" name="form_type" value="customer">
<input type="hidden" name="utf8" value="✓">
<input type="hidden" name="contact[tags]" value="" data-modblo-lq-tag>
<input type="hidden" name="contact[accepts_marketing]" value="true">
<div class="modblo-lq__field">
<input type="email" name="contact[email]"
placeholder="{{ section.settings.gate_placeholder | default: 'Email address' }}"
required aria-label="Email address">
<button type="submit" class="modblo-lq__btn modblo-lq__btn--primary">
{{ section.settings.gate_cta | default: 'Email my results' }}
</button>
</div>
{%- if section.settings.gate_consent != blank -%}
<p class="modblo-lq__consent">{{ section.settings.gate_consent }}</p>
{%- endif -%}
</form>
<button type="button" class="modblo-lq__skip" data-modblo-lq-skip>
{{ section.settings.skip_label | default: 'Skip and just show me' }}
</button>
</div>
{%- comment -%} Result slide {%- endcomment -%}
<div class="modblo-lq__slide modblo-lq__result" data-modblo-lq-slide="result">
<p class="modblo-lq__eyebrow">{{ section.settings.result_eyebrow | default: 'Your match' }}</p>
<h3 class="modblo-lq__h">{{ section.settings.result_heading | default: 'Picked just for you.' }}</h3>
<p class="modblo-lq__sub">Based on your answers, we think these are right for you. Check your inbox for the full list.</p>
{%- if rec_collection.products.size > 0 -%}
<div class="modblo-lq__results-grid" data-modblo-lq-results>
{%- for product in rec_collection.products limit: 12 -%}
{%- assign first_var = product.selected_or_first_available_variant -%}
<article class="modblo-lq__rec" data-modblo-lq-rec data-tags="{{ product.tags | join: ',' | downcase }}">
<a href="{{ product.url }}">
{%- if product.featured_image -%}
{{ product.featured_image | image_url: width: 480 | image_tag:
loading: 'lazy', widths: '240,480',
sizes: '(max-width:768px) 50vw, 240px',
class: 'modblo-lq__rec-img' }}
{%- endif -%}
</a>
<p class="modblo-lq__rec-vendor">{{ product.vendor }}</p>
<p class="modblo-lq__rec-title">{{ product.title }}</p>
<p class="modblo-lq__rec-price">{{ first_var.price | money }}</p>
<form action="/cart/add" method="post" class="modblo-lq__rec-form">
<input type="hidden" name="id" value="{{ first_var.id }}">
<button type="submit" class="modblo-lq__rec-add">+ Add to cart</button>
</form>
</article>
{%- endfor -%}
</div>
{%- endif -%}
<button type="button" class="modblo-lq__skip" data-modblo-lq-restart>↻ Retake the quiz</button>
</div>
</div>
</section>
<style>
.modblo-lq { background: var(--modblo-lq-bg, #fff); color: var(--modblo-lq-fg, #0b0b0c); padding: clamp(48px, 6vw, 96px) 0; }
.modblo-lq__inner { max-width: 720px; margin: 0 auto; padding: 0 24px; min-height: 480px; }
.modblo-lq__slide { display: none; }
.modblo-lq__slide.is-active { display: block; }
.modblo-lq__slide:not(.modblo-lq__question) { text-align: center; }
.modblo-lq__eyebrow {
text-transform: uppercase; letter-spacing: .18em;
font-size: 12px; font-weight: 700;
color: var(--modblo-lq-accent, #6366f1); margin: 0 0 14px;
}
.modblo-lq__h { font-size: clamp(26px, 3.5vw, 36px); letter-spacing: -.02em; line-height: 1.15; margin: 0 0 14px; }
.modblo-lq__sub { font-size: 15px; opacity: .7; margin: 0 auto 28px; max-width: 480px; line-height: 1.5; }
.modblo-lq__btn {
display: inline-flex; align-items: center; gap: 8px;
border: 0; cursor: pointer;
padding: 13px 22px; border-radius: 11px;
font-size: 14px; font-weight: 600;
transition: opacity .2s, transform .15s;
}
.modblo-lq__btn--primary {
background: var(--modblo-lq-accent, #6366f1); color: #fff;
}
.modblo-lq__btn--primary:hover:not([disabled]) { opacity: .92; }
.modblo-lq__btn--primary[disabled] { opacity: .4; cursor: not-allowed; }
.modblo-lq__progress { margin-bottom: 28px; }
.modblo-lq__progress-bar {
height: 6px; border-radius: 999px; overflow: hidden;
background: color-mix(in oklab, var(--modblo-lq-fg) 8%, transparent);
margin-bottom: 10px;
}
.modblo-lq__progress-bar > div {
height: 100%; width: 0%;
background: var(--modblo-lq-accent, #6366f1);
transition: width .35s cubic-bezier(.16,1,.3,1);
}
.modblo-lq__progress-text {
font-size: 12px; opacity: .6; margin: 0;
text-transform: uppercase; letter-spacing: .12em; font-weight: 600;
}
.modblo-lq__qh { font-size: clamp(22px, 3vw, 28px); letter-spacing: -.02em; margin: 0 0 6px; line-height: 1.2; }
.modblo-lq__qhelp { font-size: 14px; opacity: .65; margin: 0 0 22px; }
.modblo-lq__opts { display: grid; gap: 10px; margin-bottom: 28px; }
.modblo-lq__opt {
display: flex; align-items: center; gap: 12px;
background: color-mix(in oklab, var(--modblo-lq-fg) 3%, transparent);
color: inherit;
border: 1.5px solid color-mix(in oklab, var(--modblo-lq-fg) 8%, transparent);
border-radius: 14px;
padding: 16px 18px; cursor: pointer;
font-size: 15px; text-align: left;
transition: border-color .2s, background .2s;
}
.modblo-lq__opt:hover { border-color: color-mix(in oklab, var(--modblo-lq-accent, #6366f1) 50%, transparent); }
.modblo-lq__opt.is-selected {
border-color: var(--modblo-lq-accent, #6366f1);
background: color-mix(in oklab, var(--modblo-lq-accent, #6366f1) 6%, transparent);
}
.modblo-lq__opt-letter {
flex-shrink: 0; width: 28px; height: 28px; border-radius: 8px;
background: color-mix(in oklab, var(--modblo-lq-fg) 8%, transparent);
display: grid; place-items: center;
font-size: 12px; font-weight: 700;
}
.modblo-lq__opt.is-selected .modblo-lq__opt-letter {
background: var(--modblo-lq-accent, #6366f1); color: #fff;
}
.modblo-lq__opt-label { flex: 1; }
.modblo-lq__opt-check {
flex-shrink: 0; opacity: 0; color: var(--modblo-lq-accent, #6366f1);
transition: opacity .2s;
}
.modblo-lq__opt.is-selected .modblo-lq__opt-check { opacity: 1; }
.modblo-lq__nav { display: flex; align-items: center; justify-content: space-between; }
.modblo-lq__back {
background: transparent; border: 0; color: inherit;
cursor: pointer; opacity: .55; font-size: 13px;
padding: 10px 12px;
}
.modblo-lq__back:hover { opacity: 1; }
/* Gate slide */
.modblo-lq__gate-icon {
width: 64px; height: 64px; border-radius: 50%;
background: color-mix(in oklab, var(--modblo-lq-accent, #6366f1) 12%, transparent);
color: var(--modblo-lq-accent, #6366f1);
display: grid; place-items: center; margin: 0 auto 20px;
}
.modblo-lq__form { max-width: 420px; margin: 0 auto; }
.modblo-lq__field {
display: flex; gap: 8px; flex-wrap: wrap;
}
.modblo-lq__field input {
flex: 1; min-width: 200px;
padding: 13px 14px; font-size: 14px;
background: color-mix(in oklab, var(--modblo-lq-fg) 4%, transparent);
color: inherit;
border: 1px solid color-mix(in oklab, var(--modblo-lq-fg) 14%, transparent);
border-radius: 11px;
}
.modblo-lq__field input:focus { outline: none; border-color: var(--modblo-lq-accent, #6366f1); }
.modblo-lq__consent { font-size: 11px; opacity: .55; margin: 10px 0 0; line-height: 1.5; }
.modblo-lq__skip {
background: transparent; border: 0; color: inherit;
cursor: pointer; opacity: .55; font-size: 13px;
padding: 10px; margin-top: 16px;
text-decoration: underline; text-underline-offset: 3px;
}
.modblo-lq__skip:hover { opacity: 1; }
/* Result */
.modblo-lq__results-grid {
display: grid; gap: 16px; margin: 24px 0;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
}
.modblo-lq__rec { text-align: left; }
.modblo-lq__rec[hidden] { display: none; }
.modblo-lq__rec-img {
width: 100%; aspect-ratio: 1; object-fit: cover;
border-radius: 12px; margin-bottom: 8px;
background: color-mix(in oklab, var(--modblo-lq-fg) 4%, transparent);
}
.modblo-lq__rec-vendor { font-size: 11px; opacity: .6; text-transform: uppercase; letter-spacing: .08em; margin: 0 0 4px; }
.modblo-lq__rec-title { font-size: 14px; font-weight: 600; margin: 0 0 4px; line-height: 1.3; }
.modblo-lq__rec-price { font-size: 13px; margin: 0 0 8px; opacity: .7; }
.modblo-lq__rec-form { margin: 0; }
.modblo-lq__rec-add {
width: 100%; padding: 9px 12px; font-size: 12px;
background: color-mix(in oklab, var(--modblo-lq-fg) 6%, transparent);
color: inherit; border: 0; border-radius: 8px;
font-weight: 600; cursor: pointer;
transition: background .2s;
}
.modblo-lq__rec-add:hover { background: var(--modblo-lq-accent, #6366f1); color: #fff; }
</style>
<script>
(function () {
var root = document.querySelector('[data-modblo-lq][data-section-id="{{ section.id }}"]');
if (!root) return;
var slides = Array.from(root.querySelectorAll('[data-modblo-lq-slide]'));
var questions = slides.filter(function (s) { return s.dataset.cbLqSlide.indexOf('q-') === 0; });
root.querySelectorAll('[data-modblo-lq-total]').forEach(function (el) { el.textContent = questions.length; });
var answers = {};
var pickedTags = [];
function show(target) {
slides.forEach(function (s) {
s.classList.toggle('is-active', s.dataset.cbLqSlide === target);
});
window.scrollTo({ top: root.offsetTop - 24, behavior: 'smooth' });
if (target.indexOf('q-') === 0) {
var idx = parseInt(target.split('-')[1], 10);
var pct = (idx / questions.length) * 100;
questions[idx - 1].querySelectorAll('[data-modblo-lq-bar]').forEach(function (f) {
f.style.width = pct + '%';
});
}
}
root.querySelector('[data-modblo-lq-start]').addEventListener('click', function () {
if (questions.length === 0) { show('gate'); return; }
show('q-1');
});
questions.forEach(function (q, i) {
var opts = Array.from(q.querySelectorAll('[data-modblo-lq-opt]'));
var nextBtn = q.querySelector('[data-modblo-lq-next]');
var backBtn = q.querySelector('[data-modblo-lq-back]');
opts.forEach(function (opt) {
opt.addEventListener('click', function () {
opts.forEach(function (o) { o.classList.remove('is-selected'); });
opt.classList.add('is-selected');
answers[i + 1] = opt.dataset.tags || '';
nextBtn.disabled = false;
});
});
nextBtn.addEventListener('click', function () {
if (i + 1 < questions.length) {
show('q-' + (i + 2));
} else {
show('gate');
}
});
backBtn.addEventListener('click', function () {
if (i === 0) { show('intro'); }
else { show('q-' + i); }
});
});
function aggregateTags() {
var picked = new Set();
Object.keys(answers).forEach(function (k) {
answers[k].split(',').forEach(function (t) {
var clean = t.trim().toLowerCase();
if (clean) picked.add(clean);
});
});
pickedTags = Array.from(picked);
}
function rankResults() {
aggregateTags();
var picked = new Set(pickedTags);
var recs = Array.from(root.querySelectorAll('[data-modblo-lq-rec]'));
recs.forEach(function (rec) {
var tags = (rec.dataset.tags || '').split(',').map(function (t) { return t.trim().toLowerCase(); });
var score = tags.reduce(function (s, t) { return picked.has(t) ? s + 1 : s; }, 0);
rec.dataset.score = score;
});
recs.sort(function (a, b) { return parseInt(b.dataset.score) - parseInt(a.dataset.score); });
var maxShow = recs.length > 6 ? 6 : recs.length;
recs.forEach(function (rec, i) {
rec.parentNode.appendChild(rec);
rec.hidden = i >= maxShow;
});
// Wire add-to-cart
root.querySelectorAll('.modblo-lq__rec-form').forEach(function (form) {
if (form.dataset.cbLqWired) return;
form.dataset.cbLqWired = '1';
form.addEventListener('submit', function (e) {
e.preventDefault();
var btn = form.querySelector('button');
var orig = btn.textContent;
btn.disabled = true; btn.textContent = 'Adding...';
fetch('/cart/add.js', {
method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id: form.querySelector('[name="id"]').value, quantity: 1 }),
}).then(function () {
btn.textContent = '✓ Added';
document.dispatchEvent(new CustomEvent('cart:updated'));
setTimeout(function () { btn.disabled = false; btn.textContent = orig; }, 1600);
});
});
});
}
// Email gate
var form = root.querySelector('[data-modblo-lq-form]');
var tagInput = root.querySelector('[data-modblo-lq-tag]');
form.addEventListener('submit', function (e) {
e.preventDefault();
aggregateTags();
tagInput.value = ('quiz:' + pickedTags.join('-')).slice(0, 250);
var btn = form.querySelector('button[type="submit"]');
var orig = btn.textContent;
btn.disabled = true; btn.textContent = 'Sending...';
var fd = new FormData(form);
var body = new URLSearchParams();
fd.forEach(function (v, k) { body.append(k, v); });
fetch('/contact', { method: 'POST', body: body, headers: { 'Accept': 'application/json' } })
.then(function () { rankResults(); show('result'); })
.catch(function () {
btn.disabled = false; btn.textContent = orig;
});
});
// Skip the gate (still show results, no email captured)
root.querySelector('[data-modblo-lq-skip]').addEventListener('click', function () {
rankResults();
show('result');
});
// Restart
root.querySelector('[data-modblo-lq-restart]').addEventListener('click', function () {
answers = {}; pickedTags = [];
questions.forEach(function (q) {
q.querySelectorAll('[data-modblo-lq-opt]').forEach(function (o) { o.classList.remove('is-selected'); });
var n = q.querySelector('[data-modblo-lq-next]');
if (n) n.disabled = true;
});
show('intro');
});
})();
</script>
{% schema %}
{
"name": "Lead-Capture Quiz",
"tag": "section",
"settings": [
{ "type": "header", "content": "Source" },
{ "type": "collection", "id": "rec_collection", "label": "Recommendation collection",
"info": "Products are ranked by how many tags they match against the buyer's answers." },
{ "type": "header", "content": "Intro" },
{ "type": "text", "id": "eyebrow", "label": "Eyebrow", "default": "Take the quiz" },
{ "type": "text", "id": "heading", "label": "Heading", "default": "Find your match in 60 seconds." },
{ "type": "textarea", "id": "subheading", "label": "Subheading",
"default": "Answer a few quick questions and we will email your personalized recommendations." },
{ "type": "text", "id": "start_label", "label": "Start label", "default": "Start the quiz" },
{ "type": "header", "content": "Email gate" },
{ "type": "text", "id": "gate_heading", "label": "Gate heading", "default": "Where should we send your matches?" },
{ "type": "textarea", "id": "gate_sub", "label": "Gate subheading",
"default": "We will email your personalized picks plus a one-time discount code." },
{ "type": "text", "id": "gate_placeholder", "label": "Email placeholder", "default": "Email address" },
{ "type": "text", "id": "gate_cta", "label": "Email submit label", "default": "Email my results" },
{ "type": "text", "id": "skip_label", "label": "Skip label", "default": "Skip and just show me" },
{ "type": "text", "id": "gate_consent", "label": "Consent line",
"default": "By submitting you agree to receive marketing emails. Unsubscribe anytime." },
{ "type": "header", "content": "Result" },
{ "type": "text", "id": "result_eyebrow", "label": "Result eyebrow", "default": "Your match" },
{ "type": "text", "id": "result_heading", "label": "Result heading", "default": "Picked just for you." },
{ "type": "header", "content": "Colors" },
{ "type": "color", "id": "bg", "label": "Background", "default": "#ffffff" },
{ "type": "color", "id": "fg", "label": "Foreground", "default": "#0b0b0c" },
{ "type": "color", "id": "accent", "label": "Accent", "default": "#6366f1" }
],
"blocks": [
{
"type": "question",
"name": "Question",
"settings": [
{ "type": "text", "id": "text", "label": "Question text", "default": "What's your style?" },
{ "type": "text", "id": "helper", "label": "Helper text" },
{ "type": "header", "content": "Option 1" },
{ "type": "text", "id": "option1_label", "label": "Label", "default": "Minimalist" },
{ "type": "text", "id": "option1_tags", "label": "Tags", "default": "minimal, neutral" },
{ "type": "header", "content": "Option 2" },
{ "type": "text", "id": "option2_label", "label": "Label", "default": "Editorial" },
{ "type": "text", "id": "option2_tags", "label": "Tags", "default": "editorial, bold" },
{ "type": "header", "content": "Option 3" },
{ "type": "text", "id": "option3_label", "label": "Label", "default": "Classic" },
{ "type": "text", "id": "option3_tags", "label": "Tags", "default": "classic, heritage" },
{ "type": "header", "content": "Option 4 (optional)" },
{ "type": "text", "id": "option4_label", "label": "Label" },
{ "type": "text", "id": "option4_tags", "label": "Tags" }
]
}
],
"max_blocks": 6,
"presets": [{
"name": "Lead-Capture Quiz",
"blocks": [
{ "type": "question", "settings": { "text": "What's your style?", "option1_label": "Minimalist", "option1_tags": "minimal, neutral", "option2_label": "Editorial", "option2_tags": "editorial, bold", "option3_label": "Classic", "option3_tags": "classic, heritage" } },
{ "type": "question", "settings": { "text": "Which fit do you reach for?", "option1_label": "Slim", "option1_tags": "slim, fitted", "option2_label": "Regular", "option2_tags": "regular", "option3_label": "Relaxed", "option3_tags": "relaxed, oversized" } },
{ "type": "question", "settings": { "text": "What's the occasion?", "option1_label": "Everyday", "option1_tags": "everyday, casual", "option2_label": "Workwear", "option2_tags": "workwear, polished", "option3_label": "Going out", "option3_tags": "evening, statement" } }
]
}]
}
{% endschema %}Unlock the section code
Lead-Capture Quiz is a premium section. Get the full Liquid + scoped CSS paste-ready.
One-time purchase · Lifetime updates · You own the code
Theme editor settings
| Setting | Type | Default |
|---|---|---|
Recommendation collection rec_collection | collection | , |
Intro eyebrow eyebrow | text | Take the quiz |
Intro heading heading | text | Find your match in 60 seconds. |
Intro subheading subheading | textarea | , |
Start button label start_label | text | Start the quiz |
Gate heading gate_heading | text | Where should we send your matches? |
Gate subheading gate_sub | textarea | , |
Gate CTA gate_cta | text | Email my results |
Skip label skip_label | text | Skip and just show me |
Consent line gate_consent | text | , |
Result eyebrow result_eyebrow | text | Your match |
Result heading result_heading | text | Picked just for you. |
Background bg | color | #ffffff |
Foreground fg | color | #0b0b0c |
Accent accent | color | #6366f1 |
Questions (theme blocks) blocks Up to 6 questions, 4 options each, comma-separated tags per option. | blocks | , |
SEO & accessibility notes
- Email gate posts to Shopify's native /contact endpoint, no third-party SDK.
- Quiz answers structured into a customer tag so flows can target by outcome.
- Skip-the-gate path still shows results, no dark pattern, gate captures the willing without forcing.
- Result products pre-rendered server-side, fully crawlable for SEO.
Related
