FeatureSignals

Migrate from Flagsmith

Follow this step-by-step guide to migrate your feature flags from Flagsmith to FeatureSignals. The process mirrors the standard migration workflow — export, transform, import, validate, and cut over.

Before you start

Make sure you have an active FeatureSignals account, a project and environment set up, and a Flagsmith API key with read access. See Quickstart if you haven't created your first project yet.

  1. 1. Export flags from Flagsmith

    Use the FeatureSignals migration CLI to export all flags, segments, and environments from Flagsmith. The CLI uses the Flagsmith REST API to pull a complete snapshot.

    bash
    # Install the FeatureSignals migration CLI
    npm install -g @featuresignals/migration-cli
    
    # Export all flags from Flagsmith
    fs-migrate export flagsmith \
      --api-key "$FLAGSMITH_API_KEY" \
      --base-url "https://api.flagsmith.com" \
      --output ./flagsmith-export.json

    The export includes standard flags, multivariate flags, segments, identities, and environment-specific overrides. Traits and identity overrides are preserved for mapping during the transform step.

  2. 2. Transform flags to FeatureSignals format

    Transform the Flagsmith export to the FeatureSignals flag model. The migration engine handles:

    • Standard flags → boolean flag type
    • Multivariate flags → ab flag type with variants
    • Segments → FeatureSignals segments with rule conditions
    • Identity overrides → Individual targeting rules
    • Environment-specific values → Per-environment flag state
    • Feature-specific values → string, number, or json flags
    bash
    # Transform the Flagsmith export to FeatureSignals format
    fs-migrate transform flagsmith \
      --input ./flagsmith-export.json \
      --output ./fs-import.json \
      --project-id "$FS_PROJECT_ID" \
      --environment-mapping "production:prod,development:dev"

    Review the preview report. Pay special attention to flags that map to non-boolean types — Flagsmith's feature-specific values become separate configuration flags in FeatureSignals.

  3. 3. Import flags to FeatureSignals

    Import the transformed flags into your FeatureSignals project. Import to a staging or development environment first to validate without affecting production traffic.

    bash
    # Import to FeatureSignals (staging environment first)
    fs-migrate import \
      --input ./fs-import.json \
      --api-key "$FS_API_KEY" \
      --base-url "https://api.featuresignals.com" \
      --target-environment "staging"

    Tip: Flagsmith remote config values (non-boolean flags) are imported as string, number, or JSON flag types. Verify the type mapping in the preview report before importing.

  4. 4. Validate parity between platforms

    Run parity checks to ensure flag evaluations produce consistent results. The validator evaluates each flag in both Flagsmith and FeatureSignals across a sample of user contexts.

    bash
    # Validate evaluation parity
    fs-migrate validate \
      --source flagsmith \
      --source-api-key "$FLAGSMITH_API_KEY" \
      --target featuresignals \
      --target-api-key "$FS_API_KEY" \
      --sample-size 100

    Any discrepancies are reported with the specific flag, user context, and expected vs. actual value. Resolve mismatches before proceeding to cutover.

  5. 5. Cut over your SDKs

    Switch your SDK initialization from Flagsmith to FeatureSignals. If your application uses the Flagsmith JavaScript or React SDK directly:

    typescript
    // Before: Flagsmith client
    import flagsmith from 'flagsmith';
    
    await flagsmith.init({
      environmentID: 'env_flagsmith_key',
    });
    
    const isEnabled = flagsmith.hasFeature('my-feature');
    
    // After: FeatureSignals OpenFeature provider
    import { FeatureSignalsProvider } from '@featuresignals/openfeature-web';
    
    await OpenFeature.setProviderAndWait(new FeatureSignalsProvider({
      environmentKey: 'env_your_key_here',
    }));
    
    const client = OpenFeature.getClient();
    const isEnabled = await client.getBooleanValue('my-feature', false, {
      targetKey: user.id,
    });

    For server-side Flagsmith SDKs (Python, Node.js, Java, Go, etc.), see the SDK documentation for language-specific migration examples. Keep Flagsmith as read-only for a week after cutover, then decommission.

Next Steps