Feature Flags#
Overview#
Feature flags are per-project boolean settings stored in the FeatureFlags record type.
They control optional functionality that can be enabled or disabled per project without code changes.
Storage: JSONB column in the project_settings table, within the feature_flags field.
JSON format: All keys use kebab-case (e.g. "atm-module-enabled": true).
Defaults: All flags default to False except three:
combinedLinkedInFeed—True(legacy behaviour)openSubmenuOnHoverEnabled—True(legacy behaviour)stripWww—True
Backend reference: src/FloHam/Cms/Settings/FeatureFlags.hs
Architecture#
project_settings table
└── feature_flags (JSONB column)
└── FeatureFlags record ← FromJSON / ToJSON with kebab-case keys
Backend access:
settings <- ProjectSettings.get
when (settings ^. featureFlags . atmModuleEnabled) handleAtmModule
Elm frontend: The FeatureFlags type is auto-generated via haskell-to-elm.
A decoder FeatureFlags.featureFlagsDecoder is available for JSON decoding.
Caching: ProjectSettings.get caches per-request via the Handler monad.
Quick Reference#
JSON Key |
Lens |
Default |
Category |
|---|---|---|---|
|
|
False |
Vacancy Display |
|
|
False |
CMS |
|
|
False |
Security |
|
|
False |
Analytics |
|
|
False |
UI |
|
|
False |
UI |
|
|
False |
CMS |
|
|
False |
Search |
|
|
False |
Vacancy Display |
|
|
False |
Vacancy Display |
|
|
False |
Vacancy Display |
|
|
False |
Vacancy Display |
|
|
False |
Vacancy Display |
|
|
False |
Vacancy Display |
|
|
False |
CMS |
|
|
False |
ATS |
|
|
True |
ATS |
|
|
False |
ATS |
|
|
False |
ATS |
|
|
False |
Forms |
|
|
False |
ATS |
|
|
False |
|
|
|
False |
Tools |
|
|
False |
ATS |
|
|
False |
ATS |
|
|
False |
ATS |
|
|
False |
CMS |
|
|
False |
UI |
|
|
False |
ATS |
|
|
False |
Forms |
|
|
False |
Forms |
|
|
False |
UI |
|
|
False |
|
|
|
False |
Search |
|
|
False |
Analytics |
|
|
False |
Forms |
|
|
False |
Forms |
|
|
False |
Vacancy Display |
|
|
False |
Vacancy Display |
|
|
False |
Forms |
|
|
False |
Forms |
|
|
True |
UI |
|
|
False |
Tools |
|
|
False |
Tools |
|
|
False |
Tools |
|
|
False |
Vacancy Display |
|
|
True |
Security |
|
|
False |
Analytics |
|
|
False |
CMS |
|
|
False |
CMS |
|
|
False |
Search |
|
|
False |
Ubeeo |
|
|
False |
Ubeeo |
|
|
False |
Ubeeo |
|
|
False |
Ubeeo |
|
|
False |
Ubeeo |
|
|
False |
Search |
|
|
False |
Search |
|
|
False |
Search |
|
|
False |
Search |
|
|
False |
Vacancy Display |
|
|
False |
Vacancy Display |
|
|
False |
Search |
Note
The JSON key enabled-prefilled-email uses “enabled” (past tense) rather than “enable”.
The JSON key ubeeo-delete-vacancies-enabled differs from the lens name ubeeoDeleteEnabled.
Detailed Flag Reference#
Vacancy Display & URLs#
addTimeToEndDate–add-time-to-end-date, default:FalseAppends a time component to vacancy end dates, allowing more precise vacancy expiration.
bannerButtonsEnabled–banner-buttons-enabled, default:FalseEnables action buttons within the vacancy banner component.
bannerClickThroughEnabled–banner-click-through-enabled, default:FalseMakes the entire banner area clickable, linking through to the vacancy detail page.
bannerSearchWithLogosEnabled–banner-search-with-logos-enabled, default:FalseDisplays employer logos alongside search results in the banner search component.
bannerVacancyFormAlternativeEnabled–banner-vacancy-form-alternative-enabled, default:FalseActivates the alternative layout for the vacancy application form within the banner.
bannerVacancyPageAlternativeEnabled–banner-vacancy-page-alternative-enabled, default:FalseActivates the alternative layout for the vacancy detail page banner.
bannerVacancyAppetizerRecruboEnabled–banner-vacancy-appetizer-recrubo-enabled, default:FalseEnables the Recrubo appetizer widget within the vacancy banner.
logoInBannerVacancyEnabled–logo-in-banner-vacancy-enabled, default:FalseShows the employer logo inside the vacancy banner.
logoInMetaDataEnabled–logo-in-meta-data-enabled, default:FalseIncludes the employer logo in the vacancy metadata section.
splitVacanciesOnLocation–split-vacancies-on-location, default:FalseSplits multi-location vacancies into separate entries, one per location.
vacancyUrlsWithDiscipline–vacancy-urls-with-discipline, default:FalseIncludes the discipline/department in generated vacancy URLs for SEO purposes.
vacancyUrlsWithoutCity–vacancy-urls-without-city, default:FalseOmits the city from generated vacancy URLs.
Vacancy Search & Filtering#
availabilityMatrixEnabled–availability-matrix-enabled, default:FalseEnables the availability matrix filter, allowing candidates to specify their available hours.
geoMapEnabled–geo-map-enabled, default:FalseEnables the geographic map view for vacancy search results.
travelTimeEnabled–travel-time-enabled, default:FalseEnables travel time calculation for vacancy search, allowing filtering by commute duration.
vacancyConsolidationEnabled–vacancy-consolidation-enabled, default:FalseEnables job location consolidation, grouping duplicate vacancies across locations into a single listing (CMS-1919).
vacancyFilterOptionSearchEnabled–vacancy-filter-option-search-enabled, default:FalseAdds a search field within filter option dropdowns, helping users find specific filter values in long lists.
vacancySearchLocationEnabled–vacancy-search-location-enabled, default:FalseEnables the location-based search field in the vacancy search interface.
vacancyTagsEnabled–vacancy-tags-enabled, default:FalseEnables vacancy tagging and tag-based filtering in search results.
worldMapEnabled–world-map-enabled, default:FalseEnables the world map view for vacancy search results, suitable for international job sites.
Application Forms#
dynamicFormsEnabled–dynamic-forms-enabled, default:FalseEnables dynamic application forms that can be configured per vacancy or vacancy type.
enablePrefilledEmail–enabled-prefilled-email, default:FalsePre-fills the email field in application forms when the candidate’s email is known. Note: the JSON key uses
enabled-(past tense) rather thanenable-.extraApplicationsEnabled–extra-applications-enabled, default:FalseAllows candidates to submit additional application materials beyond the standard form.
openApplicationMappingEnabled–open-application-mapping-enabled, default:FalseMaps open (unsolicited) applications to specific open application IDs for ATS export.
openJobApplicationFormEnabled–open-job-application-form-enabled, default:FalseEnables the open application form, allowing candidates to apply without a specific vacancy.
hireserveCmsFormEnabled–hireserve-cms-form-enabled, default:FalseEnables the Hireserve CMS application form integration.
hrOfficeFormsEnabled–hr-office-forms-enabled, default:FalseEnables HrOffice open application and event form components.
ATS Integration & Export#
combinedIndeedFeed–combined-indeed-feed, default:FalseGenerates a combined XML feed for Indeed, aggregating vacancies across domains.
combinedLinkedInFeed–combined-linkedin-feed, default: TrueGenerates a combined XML feed for LinkedIn. Defaults to
Trueas this was the pre-existing behaviour before the flag was introduced.connexysThanksPageFH–connexys-thanks-page-fh, default:FalseRedirects to a Floyd & Hamilton-hosted thank-you page after Connexys application submission, instead of the Connexys default.
cvDealFeed–cv-deal-feed, default:FalseEnables the CV-Deal vacancy feed export.
enableApplyTagsExportCarerix–enable-apply-tags-export-carerix, default:FalseIncludes apply-tag metadata when exporting applications to Carerix.
enableEmplyExport–enable-emply-export, default:FalseEnables vacancy and application export to the Emply ATS.
enableGreenhouseExport–enable-greenhouse-export, default:FalseEnables vacancy and application export to Greenhouse.
enableMultipleImportSameAts–enable-multiple-import-same-ats, default:FalseAllows importing vacancies from multiple feeds of the same ATS provider.
enableWorkdayAdditionalData–enable-workday-additional-data, default:FalseIncludes additional metadata fields when exporting to Workday.
CMS & Content Management#
allowCmsOverwriteVacancy–allow-cms-overwrite-vacancy, default:FalseAllows CMS editors to overwrite vacancy data that was imported from an ATS.
atmModuleEnabled–atm-module-enabled, default:FalseEnables the Applicant Tracking Module (ATM). See Applicant Tracking Module (ATM) for detailed documentation.
closeVacanciesAtEndOfDay–close-vacancies-at-end-of-day, default:FalseAutomatically closes vacancies at the end of their end date rather than immediately.
enableOptionsFromDeletedVacancies–enable-options-from-deleted-vacancies, default:FalseRetains filter options (e.g. locations, departments) from deleted vacancies, preventing filter values from disappearing when a vacancy is removed.
textImageEnabled–text-image-enabled, default:FalseEnables the text-with-image content block type in the CMS editor.
textVideoEnabled–text-video-enabled, default:FalseEnables the text-with-video content block type in the CMS editor.
Ubeeo Integration#
ubeeoCmsFormEnabled–ubeeo-cms-form-enabled, default:FalseEnables the Ubeeo v1 application form in the CMS.
ubeeoDeleteEnabled–ubeeo-delete-vacancies-enabled, default:FalseAllows bulk deletion of all Ubeeo-imported vacancies from the CMS vacancy overview. Note: the JSON key
ubeeo-delete-vacancies-enableddiffers from the lens name.ubeeoEventRegistration–ubeeo-event-registration, default:FalseEnables Ubeeo v1 event registration form support.
ubeeoV2CmsFormEnabled–ubeeo-v2-cms-form-enabled, default:FalseEnables the Ubeeo v2 application form in the CMS (replaces v1).
ubeeoV2EventRegistration–ubeeo-v2-event-registration, default:FalseEnables Ubeeo v2 event registration form support (replaces v1).
Analytics & Tracking#
analyticsStorageGrantedAlways–analytics-storage-granted-always, default:FalseTreats analytics storage consent as always granted, bypassing the consent dialog for analytics cookies.
gtmConsentModeV2–gtm-consent-mode-v2, default:FalseEnables Google Tag Manager Consent Mode v2 integration, sending consent signals to GTM for GDPR-compliant tracking.
tagManagerAlways–tag-manager-always, default:FalseLoads Google Tag Manager on every page load, regardless of cookie consent status.
Tools & Modules#
enableCustomSalaryCalculator–enable-custom-salary-calculator, default:FalseEnables a custom salary calculator widget on the career site.
recruitmentChatEnabled–recruitment-chat-enabled, default:FalseEnables the recruitment chat widget. See Recruitment Chat & Chatbot System for detailed documentation.
referralToolEnabled–referral-tool-enabled, default:FalseEnables the employee referral tool, allowing employees to share vacancies and track referrals.
shareToolEnabled–share-tool-enabled, default:FalseEnables social sharing buttons on vacancy pages.
Email & Notifications#
enableCustomJobAlertEmail–enable-custom-job-alert-email, default:FalseEnables customisation of job alert email templates per project.
fullAppetizerInJobAlertMail–full-appetizer-in-jobalert-mail, default:FalseIncludes the full vacancy appetizer (teaser text) in job alert emails instead of a truncated version.
Security & Infrastructure#
allowInsecureDeviceMatch–allow-insecure-device-match, default:FalseRelaxes device fingerprint matching for session validation. Used in
makeSessionBackendand does not require a database lookup.stripWww–strip-www, default: TrueRedirects
www.prefixed URLs to the bare domain. Defaults toTrue.
Render Flags#
Render flags are non-boolean configuration options stored in the RenderFlags record type.
They control visual rendering behaviour using enum values rather than simple on/off toggles.
Storage: JSONB column in the project_settings table, within the render_flags field.
Backend reference: src/FloHam/Cms/Settings/RenderFlags.hs
JSON Key |
Lens |
Type |
Default |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(see below) |
|
|
|
|
|
|
|
|
Render Flag Types#
MetadataPosition— values:BelowBanner,BelowHeadingControls where vacancy metadata is positioned relative to the banner.
MetadataType— values:Column,RowControls whether metadata items are stacked vertically or laid out horizontally.
DomainSwitchType— values:Minimal,Default,TopbarControls the domain/language switcher style.
SubMenuType— values:WithLink,WithPageInfoControls whether submenu items render as simple links or include additional page information.
VacancyItemType— values:Column,RowControls whether vacancy list items use a vertical (card) or horizontal (row) layout.
VacancyItemImageConfig— structured configuration objectdefault-filter-type— Optional vacancy filter type applied to all vacancy images.overwrites— List of label-based overwrites, each with alabel-match(prefix,exact, orcontains) and afilter-type.
Default: no filter type, empty overwrites list.
{ "default-filter-type": "SomeFilterType", "overwrites": [ { "label-match": { "prefix": "IT" }, "filter-type": "TechFilterType" } ] }