FeatureSignals

Migration Troubleshooting

Last updated: April 2026

Migration from another feature flag platform is designed to be smooth, but every platform has its quirks. This guide covers the most common issues you might encounter during export, transform, import, and validation — with specific fixes for LaunchDarkly, Flagsmith, and Unleash migrations.

Need Help?

If you're stuck on a migration issue not covered here, reach out to support@featuresignals.com with your migration log and we'll help you get unblocked. Include the output of fs-migrate diagnose for faster resolution.

Export Issues

“Authentication failed” during export

Cause

Invalid or expired API token, insufficient permissions, or network connectivity issues.

Fix

  • Verify your API token is still valid and hasn't expired
  • Ensure the token has admin-level read access (required for full export)
  • Check that your source platform's API URL is correct and reachable
  • LaunchDarkly: use a server-side SDK key or a read-only API token with all projects access
  • Flagsmith: use an admin API key (not a regular API key)
  • Unleash: use an admin token with ‘Client API’ and ‘Admin API’ access

Export times out for large flag counts

Cause

Exporting hundreds or thousands of flags can exceed default timeouts.

Fix

  • Increase the timeout: <InlineCode>--timeout 300</InlineCode> (5 minutes)
  • Export flags per project instead of all at once: <InlineCode>--project my-project</InlineCode>
  • Use the <InlineCode>--concurrency</InlineCode> flag to parallelize: <InlineCode>--concurrency 5</InlineCode>
  • For LaunchDarkly: projects with 500+ flags may need pagination tuning — add <InlineCode>--page-size 100</InlineCode>

Export produces empty or incomplete output

Cause

The source platform may have flags in a state that the exporter doesn't handle by default.

Fix

  • Check that flags are in active projects/environments (archived/deleted flags are excluded by default)
  • Use <InlineCode>--include-archived</InlineCode> to export archived flags
  • Verify the export file isn&apos;t empty: <InlineCode>cat export.json | jq &apos;.flags | length&apos;</InlineCode>
  • Run <InlineCode>fs-migrate diagnose</InlineCode> to check connectivity and permissions

Transform Issues

“Unsupported rule type” warnings

Cause

The source platform uses targeting rules or operators that don't have a direct FeatureSignals equivalent.

Fix

  • Review the preview report to see exactly which rules couldn&apos;t be auto-mapped
  • LaunchDarkly: custom rule operators (semver, date comparison) need manual conversion to context attributes with value comparison
  • Flagsmith: multivariate flags with 3+ variations may need AB flag type or a custom strategy
  • Unleash: custom activation strategies need to be reimplemented as FeatureSignals targeting rules
  • Use <InlineCode>--skip-unsupported</InlineCode> to skip problematic flags and handle them separately
  • Use <InlineCode>--warn-only</InlineCode> to generate a detailed report without aborting the transform

Segment/prerequisite mapping is incorrect

Cause

Cross-flag dependencies and segment references are platform-specific and may not map cleanly.

Fix

  • LaunchDarkly: prerequisite flags are imported as separate flags — you&apos;ll need to recreate the prerequisite relationship manually in FeatureSignals
  • Flagsmith: segments are imported as FeatureSignals segments with the same name. Verify the segment conditions match.
  • Unleash: segments with complex constraint logic may need manual adjustment. Review each segment in the preview.
  • After import, validate segment-based targeting by testing with users that should and shouldn&apos;t match

Boolean flag becomes a percentage rollout

Cause

A simple on/off flag in the source platform has an implicit or default rule that the exporter interprets as a targeting rule.

Fix

  • This is usually correct behavior — the flag had targeting in the source platform
  • If you want a pure boolean flag with no rules, edit the transformed JSON before importing: set the rule array to empty
  • After import, you can remove rules via the Flag Engine dashboard or via IaC

Import Issues

Import fails with “transaction rolled back”

Cause

One or more flags in the batch failed validation, causing the entire transaction to roll back.

Fix

  • Check the error log for the specific flag and validation error that caused the failure
  • Common causes: flag key too long, invalid characters in flag key, duplicate flag key, missing required fields
  • Fix the problematic flag in the transformed JSON and retry
  • Use <InlineCode>--continue-on-error</InlineCode> to import valid flags and skip failures (not recommended for production)
  • Validate the transformed JSON before import: <InlineCode>fs-migrate validate --input transformed.json</InlineCode>

“Rate limit exceeded” during import

Cause

Too many API calls in a short period.

Fix

  • Reduce import concurrency: <InlineCode>--concurrency 1</InlineCode>
  • Add a delay between requests: <InlineCode>--delay 200</InlineCode> (milliseconds)
  • Split the import into smaller batches by project or environment
  • Management API rate limit is 100 requests/minute — adjust your import speed accordingly

Validation & Parity Issues

Flag evaluates differently in FeatureSignals

Cause

Subtle differences in how targeting rules, rollout percentages, or default values are applied between platforms.

Fix

  • Check the specific flag and context in the parity report
  • Verify the default value matches — FeatureSignals returns the default when no rules match
  • Check rollout stickiness: both platforms should use the same attribute (e.g., user_id) for consistent bucketing
  • Verify user context attributes: FeatureSignals uses flat key-value context; nested objects may need flattening
  • Re-run validation with a larger sample: <InlineCode>--sample-size 5000</InlineCode>
  • For percentage rollouts, run validation multiple times to distinguish between random variance and real discrepancies

Flag works in staging but not production

Cause

Different environment configurations between the two platforms.

Fix

  • Check that the environment key mapping is correct in your migration config
  • Verify that you imported to the correct target environment
  • Ensure production-specific targeting rules were preserved during export
  • Compare environment configurations: <InlineCode>fs-migrate diff-env --source-config source.json --target-config target.json</InlineCode>

SDK returns stale values after migration

Cause

Cached flag values from the old platform are still being served.

Fix

  • Clear the FeatureSignals SDK cache: restart your application or call the cache invalidation method
  • Verify your SDK is connecting to FeatureSignals (not the old platform): check the base URL configuration
  • Wait for the old platform&apos;s DNS/TTL to expire if using the same hostname
  • Use the OpenFeature provider&apos;s <InlineCode>onContextChange</InlineCode> to force a refresh
  • Monitor evaluation traffic to confirm SDKs are hitting FeatureSignals endpoints

Diagnostic Command

When troubleshooting any migration issue, start with the diagnostic command. It checks connectivity, permissions, and configuration for both source and target platforms:

fs-migrate diagnose \ --source unleash \ --source-config ./unleash-config.json \ --target featuresignals \ --target-config ./fs-config.json

The diagnostic report includes:

  • Source and target connectivity status
  • Authentication/permission verification
  • Flag and segment count on each platform
  • API rate limit status
  • Configuration validation

Common Fixes Quick Reference

SymptomLikely Fix
401 UnauthorizedVerify API token permissions, check token hasn't expired
403 ForbiddenToken needs admin scope, not read-only; check project access
429 Too Many RequestsReduce concurrency, add delay between calls
Connection timeoutCheck network connectivity, increase timeout, verify URL
Validation errorsCheck flag key format (alphanumeric + hyphens), fix in transformed JSON
Missing flags post-importArchived flags excluded by default — use --include-archived
Parity check failsVerify default values, context attributes, and stickiness configuration

Next Steps