Quote-Page Components
A Quote-Page in Strapi defines the pricing and plan-selection screen of a questionnaire. In V2, all components live in a single content array (there is no separate quoteOptions zone). The footer is a standalone top-level field.
Every content component supports an optional ruleGroups field for conditional visibility — see Quote-Page Rules.
Top-Level Fields
Section titled “Top-Level Fields”| Field | Type | Required | Description |
|---|---|---|---|
name |
string | Yes | Unique slug identifier for this quote page |
mergeQuoteOptionsToQuestionnaire |
boolean | No | When true, selected quote option values are merged into the main questionnaire answers |
prefillQuoteOptionsFromParams |
boolean | No | When true, quote options are pre-filled from URL query parameters |
content |
component array | Yes | Ordered list of V2 components (see below) |
footer |
object | Yes | CTA footer (see footer) |
Layout Components
Section titled “Layout Components”header
Section titled “header”Page-level header displayed at the top of the quote page.
| Field | Type | Required | Description |
|---|---|---|---|
title |
string | Yes | Heading text (e.g., "Your quote") |
description |
string | No | Subtitle or explanatory text |
showPrice |
boolean | Yes | When true, the current price is displayed alongside the header |
ruleGroups |
array | No | Visibility rules |
Section heading used to visually separate groups of components.
| Field | Type | Required | Description |
|---|---|---|---|
title |
string | Yes | Heading text |
hint |
string | No | Subtext displayed next to the title (e.g., "With monthly cancellation policy") |
documentLabel |
string | No | Label for a linked document (e.g., "Policy statement") |
document |
object | No | Document link with url or src field |
ruleGroups |
array | No | Visibility rules |
Customization Components
Section titled “Customization Components”These components let users customize their coverage. Each sends its value to the pricing engine via its optionKey.
choice
Section titled “choice”Multi-option selector rendered as checkboxes or switches.
| Field | Type | Required | Description |
|---|---|---|---|
title |
string | Yes | Display title |
description |
string | No | Explanatory text |
type |
enum | Yes | "checkbox" or "switch" |
optionKey |
string | Yes | Answer key sent to the pricing engine |
options |
array | Yes | Available choices (see below) |
defaultValue |
string | No | Pre-selected value |
hiddenValue |
string | No | Value used when the component is hidden by rules |
availablePlans |
string[] | No | Restrict visibility to these plan IDs. Empty array = all plans. |
label |
object | No | Badge label (see label) |
ruleGroups |
array | No | Visibility rules |
Each option in options:
| Field | Type | Description |
|---|---|---|
label |
string | Display text |
value |
string | Value sent to the pricing engine when selected |
Example (from liability):
{ "__component": "quote-page-v2.choice", "title": "Add household members", "type": "checkbox", "optionKey": "inclusiveMembers", "description": "Peace of mind for your loved ones, for a little extra", "options": [ { "label": "Partner", "value": "PARTNER" }, { "label": "Kids(s)", "value": "KIDS" }, { "label": "Parent(s)", "value": "PARENTS" } ]}boolean
Section titled “boolean”A simple on/off toggle for boolean options.
| Field | Type | Required | Description |
|---|---|---|---|
title |
string | Yes | Display title |
description |
string | No | Explanatory text |
optionKey |
string | Yes | Answer key sent to the pricing engine |
defaultValue |
boolean | No | Initial state |
hiddenValue |
boolean | No | Value used when the component is hidden by rules |
availablePlans |
string[] | No | Restrict visibility to these plan IDs |
label |
object | No | Badge label (see label) |
ruleGroups |
array | No | Visibility rules |
range-input
Section titled “range-input”A slider for numeric customization (e.g., coverage amount, deductible).
| Field | Type | Required | Description |
|---|---|---|---|
title |
string | Yes | Display title |
description |
string | No | Explanatory text (supports markdown) |
type |
enum | Yes | Always "slider" |
optionKey |
string | Yes | Answer key sent to the pricing engine |
minimumValue |
number | Yes | Minimum slider value |
maximumValue |
number | Yes | Maximum slider value |
step |
number | No | Increment between values. When null, a continuous range is used. |
defaultValue |
number | No | Initial slider position |
sliderLabel |
string | No | Label displayed on the slider track |
sliderSubLabel |
string | No | Secondary label (e.g., "Recommended") |
hiddenValue |
string | No | Value used when the component is hidden by rules |
availablePlans |
string[] | No | Restrict visibility to these plan IDs |
label |
object | No | Badge label (see label) |
ruleGroups |
array | No | Visibility rules |
Example (from household):
{ "__component": "quote-page-v2.range-input", "title": "Insured sum", "type": "slider", "optionKey": "insuredSum", "minimumValue": 0, "maximumValue": 250000, "defaultValue": 39000, "sliderSubLabel": "Recommended", "description": "The insured sum is the maximum amount covered if all your belongings are destroyed."}Content Components
Section titled “Content Components”plan-cards
Section titled “plan-cards”Plan selection cards displayed in a grid. Users pick their plan tier here.
| Field | Type | Required | Description |
|---|---|---|---|
cards |
array | Yes | Array of plan card definitions (see below) |
ruleGroups |
array | No | Visibility rules |
Each card in cards:
| Field | Type | Required | Description |
|---|---|---|---|
planId |
string | Yes | Plan identifier (must match the Vertical’s plan mapping) |
name |
string | Yes | Display name (e.g., "Basic", "Extended") |
features |
array | Yes | Array of feature items (see below) |
Each feature in features:
| Field | Type | Required | Description |
|---|---|---|---|
label |
string | Yes | Feature name |
description |
string | No | Additional detail |
included |
boolean | Yes | Whether this feature is included in the plan |
Example (from household):
{ "__component": "quote-page-v2.plan-cards", "cards": [ { "planId": "BASIC", "name": "Basic", "features": [ { "label": "Robberies, burglary and theft", "included": true }, { "label": "Theft from car and boat", "included": false } ] }, { "planId": "EXTENDED", "name": "Extended", "features": [ { "label": "Robberies, burglary and theft", "included": true }, { "label": "Theft from car and boat", "included": true } ] } ]}addons
Section titled “addons”Selectable add-on items for optional extras (e.g., glass coverage, bicycle protection).
| Field | Type | Required | Description |
|---|---|---|---|
addonItems |
array | Yes | Array of addon definitions (see below) |
ruleGroups |
array | No | Visibility rules |
Each item in addonItems:
| Field | Type | Required | Description |
|---|---|---|---|
addonKey |
string | Yes | Unique key sent to the pricing engine (e.g., "BROKEN_GLASS_COVERAGE") |
title |
string | Yes | Display title |
description |
string | No | Short explanation |
icon |
object | No | Icon with src (URL) and alt (alt text) |
label |
object | No | Badge label (see label) |
availablePlans |
string[] | No | Restrict this addon to specific plan IDs |
range |
object | No | Optional slider for numeric addon customization (see below) |
The range sub-component (when present) turns the addon into a slider addon:
| Field | Type | Required | Description |
|---|---|---|---|
optionKey |
string | Yes | Answer key for the slider value |
minimumValue |
number | Yes | Minimum value |
maximumValue |
number | Yes | Maximum value |
step |
number | No | Increment step size |
defaultValue |
number | No | Initial value |
sliderLabel |
string | No | Label on the slider track |
Example (from household — addon with range slider):
{ "addonKey": "ADDITIONAL_BIKE_COVERAGE", "title": "Premium bike coverage", "description": "Increase your bike theft cover up to €3,000", "label": { "text": "Extended plan only", "variant": "warning" }, "availablePlans": ["EXTENDED"], "range": { "optionKey": "bikeInsuredSum", "minimumValue": 1000, "maximumValue": 3000 }}covered
Section titled “covered”Card section showing what a plan covers. Each card has an icon, title, and description.
| Field | Type | Required | Description |
|---|---|---|---|
iconSize |
enum | No | "large" (default) or "small" |
card |
array | Yes | Array of coverage cards (see below) |
ruleGroups |
array | No | Visibility rules |
Each card:
| Field | Type | Required | Description |
|---|---|---|---|
title |
string | Yes | Card title |
description |
string | Yes | Card description |
icon |
object | Yes | Icon with src (URL) and alt (alt text) |
Coverage comparison table for side-by-side plan comparison. References a Table content type from Strapi.
| Field | Type | Required | Description |
|---|---|---|---|
table |
object | Yes | Table data structure (see Configure Coverage Table) |
ruleGroups |
array | No | Visibility rules |
The table data includes tableData (array of sections, each with rows), collapsibleSections, and hideDetails flags. At runtime, the app filters table columns by available plans and replaces price cells with live quote data.
faq-collection
Section titled “faq-collection”FAQ accordion section with expandable question/answer pairs.
| Field | Type | Required | Description |
|---|---|---|---|
faq |
array | Yes | Array of FAQ items (see below) |
ruleGroups |
array | No | Visibility rules |
Each FAQ item:
| Field | Type | Description |
|---|---|---|
question |
string | The question text |
answer |
string | The answer (supports rich text) |
Footer
Section titled “Footer”The footer is a top-level field on the Quote-Page (not part of the content array). It provides the primary call-to-action.
| Field | Type | Required | Description |
|---|---|---|---|
bookACallUrl |
string | Yes | URL for the “Book a call” CTA link |
secondaryAction |
string | No | Label for a secondary link (e.g., "Visit FAQ") |
secondaryActionLink |
string | No | URL for the secondary link |
footer-override
Section titled “footer-override”A conditional footer that replaces the default footer when its ruleGroups match. Added as a component in the content array, but filtered out during rendering and resolved separately.
| Field | Type | Required | Description |
|---|---|---|---|
bookACallUrl |
string | Yes | Override URL for “Book a call” |
secondaryAction |
string | No | Override secondary link label |
secondaryActionLink |
string | No | Override secondary link URL |
ruleGroups |
array | No | Conditions that trigger this override |
When a footer-override’s rules match, it replaces the default footer’s fields. If no override matches, the default footer is used.
Supporting Sub-Components
Section titled “Supporting Sub-Components”Badge label that can be attached to customization components, addon items, or plan cards.
| Field | Type | Description |
|---|---|---|
text |
string | Label text |
variant |
enum | Visual style (see variants below) |
Variants: primary, secondary, success, warning, error, info, neutral, primaryOutline, secondaryOutline, successOutline, warningOutline
Component Summary
Section titled “Component Summary”| Component | __component value |
Purpose |
|---|---|---|
| header | quote-page-v2.header |
Page title and optional price display |
| title | quote-page-v2.title |
Section heading with optional document link |
| choice | quote-page-v2.choice |
Multi-option selector (checkbox/switch) |
| boolean | quote-page-v2.boolean |
On/off toggle |
| range-input | quote-page-v2.range-input |
Numeric slider |
| plan-cards | quote-page-v2.plan-cards |
Plan selection grid |
| addons | quote-page-v2.addons |
Add-on items with optional slider |
| covered | quote-page-v2.covered |
Coverage cards |
| table | quote-page-v2.table |
Plan comparison table |
| faq-collection | quote-page-v2.faq-collection |
FAQ accordion |
| footer-override | quote-page-v2.footer-override |
Conditional footer replacement |
See also
Section titled “See also”- Create a Quote Page — how to build a quote page using these components
- Configure Customizations — setting up choice, boolean, and range-input components
- Quote-Page Rules — the
ruleGroupssystem for conditional visibility - Quote-Page Architecture — how components fit into the pricing experience