A Vertical represents an insurance product type in Feather’s system. It ties together questionnaires, pricing, branding, Stripe products, and policy modals into a single content entity.
| Field |
Type |
Required |
Format |
Description |
name |
string |
Yes |
^[a-z0-9]+(-[a-z0-9]+)*$ |
Unique slug identifier. Lowercase alphanumeric with hyphens. |
humanReadableName |
string |
No |
Free text |
Display name shown in admin interfaces |
insuranceType |
string |
Yes |
^[A-Z0-9]+(_[A-Z0-9]+)*$ |
SCREAMING_SNAKE_CASE identifier used in code |
insuranceType examples: HOUSEHOLD, PUBLIC_HEALTH, INCOMING, PET_HEALTH, DENTAL, LIABILITY, LEGAL, LIFE, CAR, DISABILITY, TRAVEL
There are 32 insurance types currently defined in the system.
| Field |
Type |
Description |
regions |
multi-select |
Countries/regions where this vertical is available. Includes EU countries and a worldwide option. |
| Field |
Type |
Description |
providerId |
string |
Insurance provider identifier |
stripeProductionId |
string |
Stripe product ID for production environment |
stripeStagingId |
string |
Stripe product ID for staging environment |
Both Stripe IDs are required for verticals that involve payment. They link the vertical to a Stripe product for billing.
| Field |
Type |
Required |
Description |
image |
media |
Yes |
Vertical icon or logo image. Used throughout the app in cards, headers, and navigation. |
colorCode |
string |
Yes |
Hex color code in format #RRGGBB (6 digits) or #RGB (3 digits shorthand). Used as the accent color for this vertical in the UI. |
colorCode examples: #4A90D9, #2ECC71, #E74C3C
| Field |
Type |
Default |
Description |
hasAutomatedCancelProcess |
boolean |
false |
Whether this vertical supports automated policy cancellation through the cancel-policy questionnaire |
policyInfoKind |
string |
— |
Determines the policy info display variant |
translationKey |
string |
— |
i18n prefix for translations related to this vertical |
legacyVerticalIdForMapping |
string |
— |
Maps to the old vertical system for backwards compatibility during migration |
| Field |
Type |
Description |
content |
component |
Marketing/display content for this vertical |
Content fields:
| Field |
Type |
Required |
Description |
title |
string |
Yes |
Vertical title used in product listings and headers |
excerpt |
string |
No |
Short description (1-2 sentences) for cards and previews |
description |
richtext |
No |
Full description with formatting (used in product detail pages) |
label |
string |
No |
Badge label (e.g., “New”, “Popular”, “Coming Soon”) |
| Field |
Type |
Description |
planMapping |
repeatable |
Maps internal plan names to display names |
Each entry:
| Field |
Type |
Description |
planName |
string |
Internal plan identifier (as used in pricing and backend) |
mappedName |
string |
Human-readable display name shown to users |
Example:
| planName |
mappedName |
BASIC |
Basic |
ADVANCED |
Advanced |
PREMIUM |
Premium Plus |
| Field |
Type |
Description |
addonMapping |
repeatable |
Maps internal addon keys to display labels |
Each entry:
| Field |
Type |
Description |
key |
string |
Internal addon identifier |
label |
string |
Human-readable display label |
| Field |
Type |
Description |
subTitleMetadata |
repeatable |
Fields used to build the policy card subtitle |
Each entry:
| Field |
Type |
Description |
field |
string |
Data field name to include in the subtitle |
| Field |
Type |
Description |
financeAdsLookup |
component |
Finance advertising identifiers per locale |
| Field |
Type |
Description |
de |
string |
German locale identifier |
en |
string |
English locale identifier |
es |
string |
Spanish locale identifier |
fr |
string |
French locale identifier |
The policy modal is the expandable detail view shown when a user clicks on a policy card.
| Field |
Type |
Description |
policyModalSections |
dynamic zone |
Content sections inside the policy modal |
Available components:
Rich text body content.
| Field |
Type |
Description |
body |
richtext |
Formatted text content |
List of items.
| Field |
Type |
Description |
title |
string |
List heading |
items |
repeatable |
List items with title and description |
| Field |
Type |
Description |
policyModalButtons |
repeatable |
Action buttons at the bottom of the modal |
Each button:
| Field |
Type |
Description |
text |
string |
Button label |
href |
string |
Link URL |
variant |
string |
Button style variant |
| Field |
Type |
Required |
Description |
name |
string |
Yes |
Slug identifier |
humanReadableName |
string |
No |
Display name |
insuranceType |
string |
Yes |
SCREAMING_SNAKE type code |
regions |
multi-select |
No |
Available regions |
providerId |
string |
No |
Provider identifier |
stripeProductionId |
string |
No |
Stripe prod product ID |
stripeStagingId |
string |
No |
Stripe staging product ID |
image |
media |
Yes |
Icon/logo |
colorCode |
string |
Yes |
Hex color (#RRGGBB) |
hasAutomatedCancelProcess |
boolean |
No |
Default: false |
policyInfoKind |
string |
No |
Policy info display variant |
translationKey |
string |
No |
i18n prefix |
legacyVerticalIdForMapping |
string |
No |
Legacy system mapping |
content |
component |
No |
Title, excerpt, description, label |
planMapping |
repeatable |
No |
Plan name display mapping |
addonMapping |
repeatable |
No |
Addon key display mapping |
subTitleMetadata |
repeatable |
No |
Subtitle fields |
financeAdsLookup |
component |
No |
Finance ad IDs per locale |
policyModalSections |
dynamic zone |
No |
Modal content sections |
policyModalButtons |
repeatable |
No |
Modal action buttons |