InsightHireHelp Center

Platform feature flags

How InsightHire platform admins enable capabilities globally and per tenant, with the complete slug catalog.

InsightHire uses a three-layer gating model for premium capabilities. Customer org admins see features only when all relevant layers pass.

Gating layers

flowchart TD
  A[Feature request] --> B{Layer 1: Platform kill switch ON?}
  B -->|No| X[Hidden everywhere — PLATFORM_OFF]
  B -->|Yes| C{Layer 2: Org grant?}
  C -->|No| Y[Hidden for org — NOT_GRANTED]
  C -->|Yes| D{Layer 3: Org admin toggle?}
  D -->|No| Z[Grant OK but org opted out]
  D -->|Yes| OK[Feature active — GRANTED]
LayerStorageWho controlsExample
1. Platform kill switchplatform_integration_settings.enabledInsightHire platform adminGlobal off for beta feature
2. Per-tenant grantorg_feature_grants.grantedPlatform admin per orgPilot customer gets custom_pipelines
3. Org admin toggleOrg-scoped settings tablesCustomer org adminCulture profile enabled flag

Customer-facing gates use isFeatureGrantedForOrg(slug, organizationId) (layers 1 + 2). Layer 3 is feature-specific — e.g. culture fit requires grant and org profile enabled.

Missing grant row = NOT granted (conservative default). Revokes set granted: false instead of deleting rows for audit trail.

Platform admin UI

InsightHire Admin → Integrations & Features (insighthire-admin/app/integrations/page.tsx):

  1. Global toggletrpc.platformAdmin.toggleIntegration({ slug, enabled }) flips layer 1
  2. Tenant Access tab — appears only for feature-flag slugs; lists all customer orgs with grant toggles
  3. Grant toggletrpc.platformAdmin.toggleOrgFeatureGrant({ organizationId, slug, granted })

Supporting procedures:

ProcedurePurpose
listIntegrationSettingsAll slugs with grantedTenantCount
listOrgFeatureGrantsOrg list for one slug (search by name/domain)
toggleOrgFeatureGrantUpsert grant + Redis cache invalidation
seedIntegrationDefaultsBootstrap platform_integration_settings rows

Cache invalidation publishes on Redis channel feature-flags:invalidate so all API replicas drop in-process cache within milliseconds (30s TTL fallback).

FEATURE_FLAG_SLUGS (code constants)

From insighthire-api/src/lib/feature-flags.ts:

ConstantSlugCategory
MEETINGS_MICROSOFT_TEAMSmeetings_microsoft_teamsMeetings
MEETINGS_GOOGLE_MEETmeetings_google_meetMeetings
CULTURE_FIT_SCORINGculture_fit_scoringHiring intelligence
INSIGHTHIRE_LIVE_INTERVIEWSinsighthire_live_interviewsMeetings
TALENT_NETWORKtalent_networkHiring intelligence
CUSTOM_FIELDScustom_fieldsHiring intelligence
JOB_GOVERNANCEjob_governanceHiring intelligence
CUSTOM_PIPELINEScustom_pipelinesHiring intelligence
STRUCTURED_INTERVIEWSstructured_interviewsHiring intelligence
CUSTOM_REPORTScustom_reportsHiring intelligence
DEI_COMPLIANCEdei_complianceHiring intelligence
CANDIDATE_SURVEYScandidate_surveysHiring intelligence

Full slug catalog (platform_integration_settings)

Seeded by platformAdmin.seedIntegrationDefaults in platform-admin.ts:

ATS & HRIS

SlugNameDefault enabled
greenhouseGreenhouseYes
leverLeverNo (coming soon)
workdayWorkdayYes
bambooBambooHRNo (coming soon)

Job boards

SlugNameDefault enabledNotes
indeedIndeedNoPer-position email parsing today
linkedinLinkedInYesOAuth + Apply Connect

Meetings & calendar

SlugNameGrant-gated
meetings_microsoft_teamsMicrosoft Teams schedulingYes
meetings_google_meetGoogle Meet schedulingYes

Background checks

SlugNameDefault enabled
accurateAccurate BackgroundYes

Per-org credentials in Settings → Integrations; not the same grant model as hiring intelligence flags.

Hiring intelligence (per-tenant grant tab)

SlugNameCustomer settings surface
culture_fit_scoringCulture Fit ScoringSettings → Culture
talent_networkTalent NetworkNetwork nav, reject release
custom_fieldsCustom FieldsSettings → Custom Fields
job_governanceJobs GovernanceApprovals, Intake Forms, Requisitions
custom_pipelinesCustom PipelinesSettings → Pipelines, kanban, tasks
structured_interviewsStructured InterviewsSettings → Interview Kits
custom_reportsCustom ReportsReport builder, dashboards
dei_complianceDEI & ComplianceSettings → Compliance
candidate_surveysCandidate SurveysNPS on stage change, analytics

Additional grant slug (admin UI set)

SlugNameNotes
insighthire_live_interviewsInsightHire LiveNative Daily.co live interviews

UI gate reason messages

getFeatureGateForOrg returns:

ReasonMeaning for support
PLATFORM_OFFFeature not launched globally — enable kill switch first
NOT_GRANTEDGlobal on, but org not on pilot list — grant tenant access
GRANTEDLayers 1–2 pass — check layer 3 org toggle if still hidden

Settings tabs hide silently (no disabled stub) when grant missing.

Typical enablement workflow

  1. Platform admin enables global switch (toggleIntegration)
  2. Platform admin grants pilot tenants (toggleOrgFeatureGrant)
  3. Customer org admin configures feature in Settings
  4. Recruiters see new nav/tabs within ~30s (cache TTL worst case)

For soft launches (talent_network, culture_fit_scoring), keep global OFF until ready, then grant select tenants before global enable.

Slugs vs integrations

Not every platform_integration_settings row uses per-tenant grants:

ModelSlugsGate
Feature grantcustom_fields, job_governance, …org_feature_grants
Per-org connectiongreenhouse, linkedin, accurateOrg integration credentials in Settings
Env + platform configmeetings_*Grant + recruiter OAuth

The admin UI Tenant Access tab renders only for FEATURE_FLAG_SLUGS set members.

Customer-facing documentation map

SlugDoc
custom_fieldsCustom fields
job_governanceJob governance
custom_pipelinesPipelines & automations
structured_interviewsInterview kits
culture_fit_scoringSettings → Culture (see Roles & permissions)
dei_compliance / candidate_surveysSettings → Compliance

Requesting flags (customers)

Contact InsightHire support or your CSM with:

  • Organization name and domain
  • Desired slug(s)
  • Target go-live date

Platform team enables layer 1 (if needed) and layer 2 for your tenant.