Skip to content

Feature flags

BigBash does not use a dedicated feature-flag SaaS (LaunchDarkly, Unleash, etc.). Instead:

  • Environment variables set in GitOps Helm values (custom-values.yaml) setting the flags directly inside the container.
  • For Frontends (B2B/B2C), We use PostHog remote flags (the env var usually only holds the flag key; on/off is in PostHog), Frontends also have plain env flags (NEXT_PUBLIC_ENABLE_, NEXT_PUBLIC_DISPLAY_, etc.) — those are on/off from env alone, not PostHog.

How they work

MechanismWhereHow to flip
GitOps envMost servicesothers/rfetech-gitops/helm-charts/helm-overrides/fantasy7-{develop,perf,prod}/…/custom-values.yamlenvs:
PostHogFrontend-B2B / B2CEnv holds the flag key; on/off (+ payload) is in the PostHog UI
Code defaultService Settings / os.GetenvUsually OFF until GitOps sets "true"

Local compose uses each service’s .env / env.local. Prod values in gitops are the SSOT for what is actually on.

Update this page when you create or deprecate a product flag (why + what it does).


FrontMarket ownership (FRONTMARKET_OWNS_*)

What is this?

Many read APIs used to live only on BettingEngine (PnL, bets list, odds, etc.). FrontMarket can now answer those same reads itself (usually from Redis/cache).

Each FRONTMARKET_OWNS_<THING> flag is a simple on/off switch:

  • "true" → FrontMarket handles that read
  • anything else / unset → treat as off (FrontMarket code checks case-insensitive "true" only)

Why so many flags? So we can move one endpoint at a time from BettingEngine → FrontMarket, and roll back one endpoint without turning everything off.

Where do you flip them?

EnvFile in rfetech-gitops
develophelm-charts/helm-overrides/fantasy7-develop/frontmarket/custom-values.yaml
perfhelm-charts/helm-overrides/fantasy7-perf/frontmarket/custom-values.yaml
prodhelm-charts/helm-overrides/fantasy7-prod/frontmarket/custom-values.yaml

Look under deployment.envs in that YAML. Today on develop, the ownership flags below are set to "true".

Code that reads them lives mainly in FrontMarket: pkg/domain/betfair, fancy, bookmaker (plus related packages for the non-OWNS flags below).

Ownership flags (one flag = one capability)

FlagFrontMarket owns…
FRONTMARKET_OWNS_PNL_USERUser PnL
FRONTMARKET_OWNS_PNL_MARKETSEvent markets PnL
FRONTMARKET_OWNS_PNL_USER_ACCOUNTSPnL user-accounts
FRONTMARKET_OWNS_PROMOTED_EVENTSPromoted events
FRONTMARKET_OWNS_FAVOURITE_EVENTSFavourite events
FRONTMARKET_OWNS_USER_BETSUser bets (/betting/bets)
FRONTMARKET_OWNS_MARKET_RUNNERS_PNLMarket runners PnL
FRONTMARKET_OWNS_STACK_BUTTONSStack buttons
FRONTMARKET_OWNS_EVENT_LIVE_PNLLive PnL
FRONTMARKET_OWNS_BETTICKERBetticker
FRONTMARKET_OWNS_BETFAIR_ODDSBetfair odds
FRONTMARKET_OWNS_EVENT_SERVICESEvent services
FRONTMARKET_OWNS_MARKET_CASHOUT_CONFIGMarket cashout config
FRONTMARKET_OWNS_EVENTS_BY_SPORTEvents by sport
FRONTMARKET_OWNS_BOOKMAKER_CASHOUTBookmaker cashout admin path
FRONTMARKET_OWNS_EVENTS_BY_IDSEvents by ids
FRONTMARKET_OWNS_BETS_COUNTBets count
FRONTMARKET_OWNS_BOOKMAKER_RUNNER_ODDSBookmaker runner odds
FRONTMARKET_OWNS_BOOKMAKER_EVENT_MARKETS_ODDSBookmaker event markets odds
FRONTMARKET_OWNS_FANCY_EVENTS_ODDSFancy events/odds
FRONTMARKET_OWNS_FANCY_EVENT_MARKETSFancy event markets

These are also set on the FrontMarket custom-values.yaml, but they are not ownership migrations — they turn features/caches on or off.

FlagWhat it doesNotes
COMPETITION_WINNER_MARKET_ENABLEDExposes GET /aggregator/competition/marketsOff in code until env is "true"
SSE_ODDS_ENABLEDExposes GET /stream/odds (live odds stream)Soak carefully before promoting
DASHBOARD_BLOB_L1_CACHE_ENABLEDIn-process cache for dashboard blob
FRONTMARKET_ODDS_CACHE_ENABLEDPer-market odds cacheOn by default in code; prod YAML may set "false" to kill it
BETTOR_CHILD_ACCOUNTS_USE_GOUSERLoad bettor downline via GoUserAlso exists on BettingEngine; develop FrontMarket sets "true"

ManualDataManagement is separate

MDM can call FrontMarket instead of BettingEngine for a few reads. That is a different switch, in a different YAML:

helm-charts/helm-overrides/fantasy7-{env}/manualdatamanagement/custom-values.yaml

FlagMeaning
READ_MARKET_RUNNERS_PNL_VIA_FRONTMARKETMDM calls FrontMarket for that read
READ_EVENT_DETAILS_VIA_FRONTMARKETsame
READ_BETS_COUNT_VIA_FRONTMARKETsame
FRONTMARKET_SERVICE_URLBase URL MDM uses when those reads are on

Even if FrontMarket already “owns” the path (FRONTMARKET_OWNS_*=true), MDM still talks to BettingEngine until these READ_* flags are "true". On develop they are still "false".


Frontend — env (B2B)

next-runtime-env. Most require exact "true" (settlement also accepts "1").

FlagWhat it does
NEXT_PUBLIC_ENABLE_MARKET_SETTLEMENTMarket settlement UI
NEXT_PUBLIC_DISPLAY_MANUAL_MARKETSManual Markets nav / routes
NEXT_PUBLIC_DISPLAY_BETFAIR_SUSPEND_ICONBetfair suspend icon (Sports Hierarchy)
NEXT_PUBLIC_ENABLE_INCIDENT_REPORTINGManager incident reporting
NEXT_PUBLIC_DISPLAY_THIRD_PARTY_LIVE_SCOREThird-party live score / Live TV on live markets
NEXT_PUBLIC_FANCY_PER_ROW_SPREADSPer-row spreads in fancy override panel
NEXT_PUBLIC_CASINO_LIVE_BETS_DISABLED"true" → legacy casino bets tabs

Frontend — PostHog

Env keyServiceWhat the remote flag does
NEXT_PUBLIC_BET_PLACEMENT_FEATURE_FLAG_KEYB2CWhen PostHog flag is on → place-bet via Bets; else legacy BettingEngine
NEXT_PUBLIC_DATA_AGGREGATION_POSTHOG_KEYB2BPayload: which B2B APIs use data-aggregation (per-key booleans)
NEXT_PUBLIC_POSTHOG_DISABLED / NEXT_PUBLIC_ENABLE_POSTHOGB2B + B2CMaster kill for PostHog (and thus remote FFs)

Backend rollouts

Defaults below are code defaults (usually off). Env/GitOps overrides per environment.

Placement & profit

FlagService(s)What it does
ENFORCE_MARKET_MAX_PROFITBettingEngineEnforce market max-profit on place (default on)
ENFORCE_MAX_PROFIT_SINGLE_ODDBettingEngine, FancyData, BookmakerData, MDMSingle-odd max profit
ENFORCE_PLACE_BET_SIDE_RULESBettingEngineSide / market_type validation on place (default on)
ENABLE_FANCY_BETS_MARKET_LOOKUPBettingEngineFancy selection string via FancyData lookup

SSE / notices (FrontMarket consumers)

FlagService(s)What it does
ODDS_CHANGE_NOTICES_ENABLEDFancyData, BookmakerData, BetfairStreaming, MDMRedis odds-change notices for FM SSE
ACCOUNT_CHANGE_NOTICES_ENABLEDBettingEngineRedis account notices for FM account SSE
FANCY_MARKET_CLOSURE_SYNC_ENABLEDFancyDataForce Redis closure sync on market close

Reads, routing, access

FlagService(s)What it does
MARKET_SETTLEMENT_APPROVAL_ENABLEDMDMSettlement approval workflow
READ_*_VIA_FRONTMARKETMDMPoint that read at FrontMarket base URL
INTERNAL_UNAUTH_ROUTES_ENABLEDBE, FancyData, BookmakerData, MDMPrefer /internal/ unauth S2S (default on)
UPLINE_ACCOUNTS_USE_BACKOFFICEBettingEngineUpline accounts via BackOffice
BETTOR_CHILD_ACCOUNTS_USE_GOUSERBettingEngineBettor children via GoUser
EVENT_MARKETS_PNL_READ_REPLICA_ENABLEDBettingEngineEvent markets PnL on read replica
DA_ROOT_ID_READ_ENABLEDBackOffice (+ DA)root_id-scoped market reads
DA_ROOT_ID_PARTITION_ENABLEDDataAggregatorHASH(root_id, market_id) partitions
KAFKA_SA_MARKET_PARTITION_ENABLEDBettingEngine, DataAggregatorSA:market Kafka keys / dedupe
DOWNLINE_ACCOUNTS_ACCESS_CHECK_ENABLEDBE, BackOfficeDownline-accounts access guard
ACCOUNT_STATEMENTS_DOWNLINE_ACCESS_CHECK_ENABLEDBettingEngineStatements downline guard
USER_ACTIVITY_LOG_ACCESS_CHECK_ENABLEDUserActivity-log hierarchy checks
CLIENT_ROLE_DIRECT_PARENT_EDIT_CHECK_ENABLEDUserClient-admin edits only direct children
ENABLE_USER_SYNC_UPLINE_TRIMUserTrim company roles from upline_users

Other product toggles

FlagService(s)What it does
ADD_EVENT_USE_ACTIVE_FANCYFancyDataAdd-event validates via active-fancy
BOOKMAKER_FEED_GAP_SKIP_OVERRIDDEN_ENABLEDBookmakerDataSkip feed-gap suspend under MDM override (default on)
STALE_OVERRIDE_RECONCILE_ENABLEDMDMStale BM/Fancy override reconcile (default on)
DATA_INTEGRITY_AUTO_CORRECTION_ENABLEDBE, BackOfficeAsync data-integrity auto-correct
BANKING_PARITY_ENABLEDBettingEngineBanking parity checks
LIVE_MARKETS_BETTORS_COUNT_ENABLEDBE, BackOfficeOpen-bettor counts on live markets
GATEWAY_TRUST_ENABLEDBackOfficeGateway trust ("0" = off in develop)

Not listed here

Infra / ops toggles (KAFKA_ENABLED, SENTRY_*, LEADER_ELECTION_*, PYROSCOPE_*, AWS_MSK_*, pool sizes) are not product feature flags — leave them in service config / gitops only.

BigBash architecture SSOT — hosted for the team; edit via pull requests.