Troubleshooting
Common issues and solutions when working with Openlynk.
Deep Links
Link opens in browser instead of the app
iOS:
| Cause | Fix |
|---|---|
| Associated Domains not configured | Add applinks:YOUR_APP_SLUG.openlynk.to in Xcode → Signing & Capabilities |
| Bundle ID mismatch | Ensure Xcode bundle ID matches the Openlynk dashboard exactly |
| AASA file inaccessible | Visit https://YOUR_APP_SLUG.openlynk.to/.well-known/apple-app-site-association — should return valid JSON |
| Stale AASA cache | Delete and reinstall the app — iOS caches AASA files for up to 24 hours |
| Testing in Simulator | Universal Links don't work in the iOS Simulator — test on a real device |
| Testing from Safari URL bar | Universal Links don't trigger from Safari's address bar — test from Notes or Messages |
Android:
| Cause | Fix |
|---|---|
autoVerify not set | Add android:autoVerify="true" to the intent filter |
| Package name mismatch | Ensure applicationId in build.gradle matches the dashboard |
| Wrong SHA-256 fingerprint | Verify fingerprint matches your signing certificate |
| Asset links file inaccessible | Visit https://YOUR_APP_SLUG.openlynk.to/.well-known/assetlinks.json |
| Release vs debug fingerprint | Release builds use a different certificate — enter the release fingerprint in the dashboard |
| Google Play App Signing | Use the App Signing key fingerprint from Google Play Console, not your upload key |
For step-by-step platform setup, see iOS Universal Links and Android App Links.
Link opens in an in-app browser (Instagram, Facebook, etc.)
This is expected behavior. In-app browsers don't support Universal Links or App Links. Openlynk detects in-app browsers and shows an interstitial page with an "Open in Safari" or "Open in Chrome" button.
App opens but doesn't navigate to the right screen
- Verify
handleIncomingURL(iOS) orhandleIncomingUri(Android) is being called in your SceneDelegate/Activity - Check that your
onDeepLinkcallback handles thedestinationPathcorrectly - Add logging to see what
ParsedDeepLinkcontains - Verify the link exists by checking the link details in the Openlynk dashboard
Deep links work in debug but not release
- iOS: Ensure the release provisioning profile includes the Associated Domains entitlement
- Android: The release certificate SHA-256 is different from debug. Enter the release fingerprint in the dashboard.
- If using Google Play App Signing, the fingerprint in the dashboard must be the App Signing key from Google Play Console, not your upload key.
Deferred Deep Linking
Pending links are not restored after install
- Ensure
autoRestoreOnInitistrue(or callrestorePendingLinksmanually) - Check that
init()/initSDK()is called on app startup - If using email matching, ensure
userEmailProviderreturns the correct email - Pending links expire after 30 days — test with recently created links
- Verify the pending link was stored by checking the dashboard analytics
Wrong link is restored
Deferred matching uses multiple signals (email, fingerprint, IP, user-agent). If testing on a shared network, multiple devices might match the same pending link.
For reliable matching, provide userEmailProvider so matching uses the user's email as the primary signal.
Restored link has no metadata
- Ensure you passed
metadatawhen creating the link - Check both
parametersandmetadatafields on theRestoredLink - The
parametersfield excludes internal keys (destination_path,destination_full,created_via). Usemetadatafor the complete data.
For details on how matching works, see How Deferred Deep Linking Works.
Link Creation
createLink() throws an error
| Error | Cause | Fix |
|---|---|---|
| Network error | Device is offline or API unreachable | Check internet connectivity |
App not found | Invalid appId | Verify your appId from the dashboard settings |
Invalid destination | Destination doesn't start with / | Use paths like /product/123 |
Invalid API key / 401 | Wrong or revoked API key | Generate a new key from the dashboard |
| HTTP 429 | Rate limited | Implement exponential backoff |
| HTTP 500 | Server error | Retry after a moment |
Generated link URL is wrong
- Check that the
baseURLis correct (default:https://openlynk.io) - Verify the app's slug is configured correctly in the dashboard
Push Notifications
Device token not registering
- Ensure Firebase is initialized before calling
registerPushToken - Check that the FCM token is not null or empty
- Verify the
appIdis correct - Check the push notification stats in the dashboard to see if the device was registered
Push notifications not arriving
- Verify Firebase credentials are uploaded in the dashboard (app settings → Firebase Credentials)
- Test the Firebase connection: app settings → Firebase Credentials → Test Connection
- Check that the device token is registered (verify via push stats)
- Ensure the app has notification permissions (especially iOS — call
requestPermission())
Push notification doesn't navigate
- Ensure
handlePushPayloadis called when the push is tapped - Check that the push data contains
destinationPath - Verify your
onDeepLinkcallback handles the parsed destination correctly
For the full push notification setup guide, see Set Up Push Notifications.
Custom Domains
Domain verification fails
- DNS propagation can take up to 48 hours — wait and try again
- Verify your CNAME record: run
dig links.mycompany.comand check it points to the CNAME target shown in your dashboard - Ensure the record type is CNAME (not A, unless using a root domain)
SSL certificate error
SSL is provisioned automatically after domain verification. Wait a few minutes. If the error persists, re-verify the domain in the dashboard.
Links don't resolve on custom domain
- Ensure the domain is verified (check status in the dashboard)
- Update your app's Associated Domains (iOS) and intent filter (Android) to include the custom domain
- Verify
.well-knownfiles are accessible on the custom domain
For the full custom domain setup guide, see Set Up Custom Domains.
SDK Issues
init() hangs or takes too long
The restore API call runs during init. If the network is slow, init will be delayed.
Fix: Set autoRestoreOnInit: false and call restore manually after the app is fully loaded.
Memory leak warnings
- Flutter: Call
dispose()when the widget is disposed — the SDK creates a stream subscription for deep links that must be cancelled - Android: Use
singleTasklaunch mode to prevent multiple Activity instances
Multiple deep link callbacks firing
- Ensure
init()/initSDK()is only called once - Check that you're not creating multiple SDK instances
- In Android, use
android:launchMode="singleTask"to prevent multiple Activity instances
General
How to find your App ID
Dashboard → your app → the App ID is displayed on the app detail page.
How to find your API Key
Dashboard → your app → SDK API Key card → click Generate if you haven't already. The key is shown only once — copy it immediately.
SDK returns 401 Unauthorized
Your apiKey is invalid or revoked. Generate a new key from the dashboard. See SDK Authentication.
How to check your plan limits
Dashboard → Settings → Billing → view current plan and usage. See Pricing and Plan Limits for a detailed comparison.
What's Next?
- iOS Universal Links Setup — step-by-step iOS configuration
- Android App Links Setup — step-by-step Android configuration
- SDK Authentication — API key management
- Pricing and Plan Limits — understand your plan's capabilities