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:

  • combinedLinkedInFeedTrue (legacy behaviour)

  • openSubmenuOnHoverEnabledTrue (legacy behaviour)

  • stripWwwTrue

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

add-time-to-end-date

addTimeToEndDate

False

Vacancy Display

allow-cms-overwrite-vacancy

allowCmsOverwriteVacancy

False

CMS

allow-insecure-device-match

allowInsecureDeviceMatch

False

Security

analytics-storage-granted-always

analyticsStorageGrantedAlways

False

Analytics

applicant-journey-with-hover-enabled

applicantJourneyWithHoverEnabled

False

UI

associated-options-component-enabled

associatedOptionsComponentEnabled

False

UI

atm-module-enabled

atmModuleEnabled

False

CMS

availability-matrix-enabled

availabilityMatrixEnabled

False

Search

banner-buttons-enabled

bannerButtonsEnabled

False

Vacancy Display

banner-click-through-enabled

bannerClickThroughEnabled

False

Vacancy Display

banner-search-with-logos-enabled

bannerSearchWithLogosEnabled

False

Vacancy Display

banner-vacancy-appetizer-recrubo-enabled

bannerVacancyAppetizerRecruboEnabled

False

Vacancy Display

banner-vacancy-form-alternative-enabled

bannerVacancyFormAlternativeEnabled

False

Vacancy Display

banner-vacancy-page-alternative-enabled

bannerVacancyPageAlternativeEnabled

False

Vacancy Display

close-vacancies-at-end-of-day

closeVacanciesAtEndOfDay

False

CMS

combined-indeed-feed

combinedIndeedFeed

False

ATS

combined-linkedin-feed

combinedLinkedInFeed

True

ATS

connexys-thanks-page-fh

connexysThanksPageFH

False

ATS

cv-deal-feed

cvDealFeed

False

ATS

dynamic-forms-enabled

dynamicFormsEnabled

False

Forms

enable-apply-tags-export-carerix

enableApplyTagsExportCarerix

False

ATS

enable-custom-job-alert-email

enableCustomJobAlertEmail

False

Email

enable-custom-salary-calculator

enableCustomSalaryCalculator

False

Tools

enable-emply-export

enableEmplyExport

False

ATS

enable-greenhouse-export

enableGreenhouseExport

False

ATS

enable-multiple-import-same-ats

enableMultipleImportSameAts

False

ATS

enable-options-from-deleted-vacancies

enableOptionsFromDeletedVacancies

False

CMS

enable-print-page-button

enablePrintPageButton

False

UI

enable-workday-additional-data

enableWorkdayAdditionalData

False

ATS

enabled-prefilled-email

enablePrefilledEmail

False

Forms

extra-applications-enabled

extraApplicationsEnabled

False

Forms

extra-large-favicon

extraLargeFavicon

False

UI

full-appetizer-in-jobalert-mail

fullAppetizerInJobAlertMail

False

Email

geo-map-enabled

geoMapEnabled

False

Search

gtm-consent-mode-v2

gtmConsentModeV2

False

Analytics

hireserve-cms-form-enabled

hireserveCmsFormEnabled

False

Forms

hr-office-forms-enabled

hrOfficeFormsEnabled

False

Forms

logo-in-banner-vacancy-enabled

logoInBannerVacancyEnabled

False

Vacancy Display

logo-in-meta-data-enabled

logoInMetaDataEnabled

False

Vacancy Display

open-application-mapping-enabled

openApplicationMappingEnabled

False

Forms

open-job-application-form-enabled

openJobApplicationFormEnabled

False

Forms

open-submenu-on-hover-enabled

openSubmenuOnHoverEnabled

True

UI

recruitment-chat-enabled

recruitmentChatEnabled

False

Tools

referral-tool-enabled

referralToolEnabled

False

Tools

share-tool-enabled

shareToolEnabled

False

Tools

split-vacancies-on-location

splitVacanciesOnLocation

False

Vacancy Display

strip-www

stripWww

True

Security

tag-manager-always

tagManagerAlways

False

Analytics

text-image-enabled

textImageEnabled

False

CMS

text-video-enabled

textVideoEnabled

False

CMS

travel-time-enabled

travelTimeEnabled

False

Search

ubeeo-cms-form-enabled

ubeeoCmsFormEnabled

False

Ubeeo

ubeeo-delete-vacancies-enabled

ubeeoDeleteEnabled

False

Ubeeo

ubeeo-event-registration

ubeeoEventRegistration

False

Ubeeo

ubeeo-v2-cms-form-enabled

ubeeoV2CmsFormEnabled

False

Ubeeo

ubeeo-v2-event-registration

ubeeoV2EventRegistration

False

Ubeeo

vacancy-consolidation-enabled

vacancyConsolidationEnabled

False

Search

vacancy-filter-option-search-enabled

vacancyFilterOptionSearchEnabled

False

Search

vacancy-search-location-enabled

vacancySearchLocationEnabled

False

Search

vacancy-tags-enabled

vacancyTagsEnabled

False

Search

vacancy-urls-with-discipline

vacancyUrlsWithDiscipline

False

Vacancy Display

vacancy-urls-without-city

vacancyUrlsWithoutCity

False

Vacancy Display

world-map-enabled

worldMapEnabled

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#

  • addTimeToEndDateadd-time-to-end-date, default: False

    Appends a time component to vacancy end dates, allowing more precise vacancy expiration.

  • bannerButtonsEnabledbanner-buttons-enabled, default: False

    Enables action buttons within the vacancy banner component.

  • bannerClickThroughEnabledbanner-click-through-enabled, default: False

    Makes the entire banner area clickable, linking through to the vacancy detail page.

  • bannerSearchWithLogosEnabledbanner-search-with-logos-enabled, default: False

    Displays employer logos alongside search results in the banner search component.

  • bannerVacancyFormAlternativeEnabledbanner-vacancy-form-alternative-enabled, default: False

    Activates the alternative layout for the vacancy application form within the banner.

  • bannerVacancyPageAlternativeEnabledbanner-vacancy-page-alternative-enabled, default: False

    Activates the alternative layout for the vacancy detail page banner.

  • bannerVacancyAppetizerRecruboEnabledbanner-vacancy-appetizer-recrubo-enabled, default: False

    Enables the Recrubo appetizer widget within the vacancy banner.

  • logoInBannerVacancyEnabledlogo-in-banner-vacancy-enabled, default: False

    Shows the employer logo inside the vacancy banner.

  • logoInMetaDataEnabledlogo-in-meta-data-enabled, default: False

    Includes the employer logo in the vacancy metadata section.

  • splitVacanciesOnLocationsplit-vacancies-on-location, default: False

    Splits multi-location vacancies into separate entries, one per location.

  • vacancyUrlsWithDisciplinevacancy-urls-with-discipline, default: False

    Includes the discipline/department in generated vacancy URLs for SEO purposes.

  • vacancyUrlsWithoutCityvacancy-urls-without-city, default: False

    Omits the city from generated vacancy URLs.

Vacancy Search & Filtering#

  • availabilityMatrixEnabledavailability-matrix-enabled, default: False

    Enables the availability matrix filter, allowing candidates to specify their available hours.

  • geoMapEnabledgeo-map-enabled, default: False

    Enables the geographic map view for vacancy search results.

  • travelTimeEnabledtravel-time-enabled, default: False

    Enables travel time calculation for vacancy search, allowing filtering by commute duration.

  • vacancyConsolidationEnabledvacancy-consolidation-enabled, default: False

    Enables job location consolidation, grouping duplicate vacancies across locations into a single listing (CMS-1919).

  • vacancyFilterOptionSearchEnabledvacancy-filter-option-search-enabled, default: False

    Adds a search field within filter option dropdowns, helping users find specific filter values in long lists.

  • vacancySearchLocationEnabledvacancy-search-location-enabled, default: False

    Enables the location-based search field in the vacancy search interface.

  • vacancyTagsEnabledvacancy-tags-enabled, default: False

    Enables vacancy tagging and tag-based filtering in search results.

  • worldMapEnabledworld-map-enabled, default: False

    Enables the world map view for vacancy search results, suitable for international job sites.

Application Forms#

  • dynamicFormsEnableddynamic-forms-enabled, default: False

    Enables dynamic application forms that can be configured per vacancy or vacancy type.

  • enablePrefilledEmailenabled-prefilled-email, default: False

    Pre-fills the email field in application forms when the candidate’s email is known. Note: the JSON key uses enabled- (past tense) rather than enable-.

  • extraApplicationsEnabledextra-applications-enabled, default: False

    Allows candidates to submit additional application materials beyond the standard form.

  • openApplicationMappingEnabledopen-application-mapping-enabled, default: False

    Maps open (unsolicited) applications to specific open application IDs for ATS export.

  • openJobApplicationFormEnabledopen-job-application-form-enabled, default: False

    Enables the open application form, allowing candidates to apply without a specific vacancy.

  • hireserveCmsFormEnabledhireserve-cms-form-enabled, default: False

    Enables the Hireserve CMS application form integration.

  • hrOfficeFormsEnabledhr-office-forms-enabled, default: False

    Enables HrOffice open application and event form components.

ATS Integration & Export#

  • combinedIndeedFeedcombined-indeed-feed, default: False

    Generates a combined XML feed for Indeed, aggregating vacancies across domains.

  • combinedLinkedInFeedcombined-linkedin-feed, default: True

    Generates a combined XML feed for LinkedIn. Defaults to True as this was the pre-existing behaviour before the flag was introduced.

  • connexysThanksPageFHconnexys-thanks-page-fh, default: False

    Redirects to a Floyd & Hamilton-hosted thank-you page after Connexys application submission, instead of the Connexys default.

  • cvDealFeedcv-deal-feed, default: False

    Enables the CV-Deal vacancy feed export.

  • enableApplyTagsExportCarerixenable-apply-tags-export-carerix, default: False

    Includes apply-tag metadata when exporting applications to Carerix.

  • enableEmplyExportenable-emply-export, default: False

    Enables vacancy and application export to the Emply ATS.

  • enableGreenhouseExportenable-greenhouse-export, default: False

    Enables vacancy and application export to Greenhouse.

  • enableMultipleImportSameAtsenable-multiple-import-same-ats, default: False

    Allows importing vacancies from multiple feeds of the same ATS provider.

  • enableWorkdayAdditionalDataenable-workday-additional-data, default: False

    Includes additional metadata fields when exporting to Workday.

CMS & Content Management#

  • allowCmsOverwriteVacancyallow-cms-overwrite-vacancy, default: False

    Allows CMS editors to overwrite vacancy data that was imported from an ATS.

  • atmModuleEnabledatm-module-enabled, default: False

    Enables the Applicant Tracking Module (ATM). See Applicant Tracking Module (ATM) for detailed documentation.

  • closeVacanciesAtEndOfDayclose-vacancies-at-end-of-day, default: False

    Automatically closes vacancies at the end of their end date rather than immediately.

  • enableOptionsFromDeletedVacanciesenable-options-from-deleted-vacancies, default: False

    Retains filter options (e.g. locations, departments) from deleted vacancies, preventing filter values from disappearing when a vacancy is removed.

  • textImageEnabledtext-image-enabled, default: False

    Enables the text-with-image content block type in the CMS editor.

  • textVideoEnabledtext-video-enabled, default: False

    Enables the text-with-video content block type in the CMS editor.

Ubeeo Integration#

  • ubeeoCmsFormEnabledubeeo-cms-form-enabled, default: False

    Enables the Ubeeo v1 application form in the CMS.

  • ubeeoDeleteEnabledubeeo-delete-vacancies-enabled, default: False

    Allows bulk deletion of all Ubeeo-imported vacancies from the CMS vacancy overview. Note: the JSON key ubeeo-delete-vacancies-enabled differs from the lens name.

  • ubeeoEventRegistrationubeeo-event-registration, default: False

    Enables Ubeeo v1 event registration form support.

  • ubeeoV2CmsFormEnabledubeeo-v2-cms-form-enabled, default: False

    Enables the Ubeeo v2 application form in the CMS (replaces v1).

  • ubeeoV2EventRegistrationubeeo-v2-event-registration, default: False

    Enables Ubeeo v2 event registration form support (replaces v1).

UI & Navigation#

  • applicantJourneyWithHoverEnabledapplicant-journey-with-hover-enabled, default: False

    Enables hover interactions on applicant journey components.

  • associatedOptionsComponentEnabledassociated-options-component-enabled, default: False

    Enables the associated options UI component for displaying related filter options.

  • enablePrintPageButtonenable-print-page-button, default: False

    Shows a “Print page” button on content pages.

  • extraLargeFaviconextra-large-favicon, default: False

    Generates extra-large favicon sizes (e.g. 180x180 for Apple Touch Icon).

  • openSubmenuOnHoverEnabledopen-submenu-on-hover-enabled, default: True

    Opens navigation submenus on mouse hover. Defaults to True as this was the pre-existing behaviour. Set to False for click-to-open submenus.

Analytics & Tracking#

  • analyticsStorageGrantedAlwaysanalytics-storage-granted-always, default: False

    Treats analytics storage consent as always granted, bypassing the consent dialog for analytics cookies.

  • gtmConsentModeV2gtm-consent-mode-v2, default: False

    Enables Google Tag Manager Consent Mode v2 integration, sending consent signals to GTM for GDPR-compliant tracking.

  • tagManagerAlwaystag-manager-always, default: False

    Loads Google Tag Manager on every page load, regardless of cookie consent status.

Tools & Modules#

  • enableCustomSalaryCalculatorenable-custom-salary-calculator, default: False

    Enables a custom salary calculator widget on the career site.

  • recruitmentChatEnabledrecruitment-chat-enabled, default: False

    Enables the recruitment chat widget. See Recruitment Chat & Chatbot System for detailed documentation.

  • referralToolEnabledreferral-tool-enabled, default: False

    Enables the employee referral tool, allowing employees to share vacancies and track referrals.

  • shareToolEnabledshare-tool-enabled, default: False

    Enables social sharing buttons on vacancy pages.

Email & Notifications#

  • enableCustomJobAlertEmailenable-custom-job-alert-email, default: False

    Enables customisation of job alert email templates per project.

  • fullAppetizerInJobAlertMailfull-appetizer-in-jobalert-mail, default: False

    Includes the full vacancy appetizer (teaser text) in job alert emails instead of a truncated version.

Security & Infrastructure#

  • allowInsecureDeviceMatchallow-insecure-device-match, default: False

    Relaxes device fingerprint matching for session validation. Used in makeSessionBackend and does not require a database lookup.

  • stripWwwstrip-www, default: True

    Redirects www. prefixed URLs to the bare domain. Defaults to True.

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

add-pay-period

addPayPeriod

Bool

True

banner-metadata-position

bannerMetadataPosition

MetadataPosition

BelowBanner

banner-metadata-type

bannerMetadataType

MetadataType

Column

domain-switch-type

domainSwitchType

DomainSwitchType

Default

multi-column-dropdown-classes-enabled

multiColumnDropdownClassesEnabled

Bool

True

sub-menu-type

subMenuType

SubMenuType

WithLink

vacancy-item-image-config

vacancyItemImageConfig

VacancyItemImageConfig

(see below)

vacancy-item-metadata-type

vacancyItemMetadataType

MetadataType

Column

vacancy-item-type

vacancyItemType

VacancyItemType

Column

Render Flag Types#

  • MetadataPosition — values: BelowBanner, BelowHeading

    Controls where vacancy metadata is positioned relative to the banner.

  • MetadataType — values: Column, Row

    Controls whether metadata items are stacked vertically or laid out horizontally.

  • DomainSwitchType — values: Minimal, Default, Topbar

    Controls the domain/language switcher style.

  • SubMenuType — values: WithLink, WithPageInfo

    Controls whether submenu items render as simple links or include additional page information.

  • VacancyItemType — values: Column, Row

    Controls whether vacancy list items use a vertical (card) or horizontal (row) layout.

  • VacancyItemImageConfig — structured configuration object

    • default-filter-type — Optional vacancy filter type applied to all vacancy images.

    • overwrites — List of label-based overwrites, each with a label-match (prefix, exact, or contains) and a filter-type.

    Default: no filter type, empty overwrites list.

    {
      "default-filter-type": "SomeFilterType",
      "overwrites": [
        {
          "label-match": { "prefix": "IT" },
          "filter-type": "TechFilterType"
        }
      ]
    }