Get started

Troubleshooting

Start by turning on debug logs: they say exactly what the SDK did and why. See Debug logs. Look for the tag Unolink in Logcat, or [Unolink] in the Xcode console.

Nothing shows up in the dashboard

  • Turn on Include test devices in Funnel or Journeys. Debug builds are test devices and are hidden by default.
  • Check that configure runs. It must be called once, early: Application.onCreate() on Android, the @main App's init() on iOS, the root layout in React Native, main() in Flutter.
  • Send the events now. Events go out every 15 seconds while the app is open, and when it goes to the background. Press Home, or call flush().
  • Check the network. Events wait on the device while offline and are sent once it's back.

"Invalid SDK key (401)"

The key is wrong, from another app, or revoked. Copy it again from your app → Settings → SDK keys. If you didn't save it when you created it, create a new key: the full key is shown only once. Nothing is sent until the next launch after a 401.

The SDK is part of the Pro plan and up. The app's owner needs to upgrade under Billing. Until then the SDK sends nothing and keeps nothing queued.

Some events are missing

  • Invalid name. Event names start with a letter and use only letters, digits, _ and ., at most 64 characters. Invalid ones are rejected and logged.
  • Too many properties. At most 20 per event, strings up to 200 characters, 4 KB in total.
  • Invalid onboarding screen IDs. step and flow follow the same rule as event names: how_heard, not how-heard. In development builds the React Native SDK (0.3.1 or later) warns in the console.
  • Far over the monthly allowance. Nothing is blocked at your allowance. Only past twice the allowance are your own (custom) events rejected, with quota_exceeded; the standard funnel events are always recorded.
  • Called before configure. The native iOS and Android SDKs ignore calls made before configure. React Native (0.3.1 or later) keeps them and sends them right after it.
  • Tracking turned off. setEnabled(false) stops tracking and is remembered across launches.

Purchases or trials count twice, or not at all

  • RevenueCat connected? Then RevenueCat reports trials and purchases, and app calls to purchase and trialStarted are ignored. Remove them if you like; they do no harm.
  • RevenueCat purchases don't join the install? Report RevenueCat's own app user ID. With SDK 0.3.2 or later, connectRevenueCat keeps it current (see RevenueCat). Otherwise call setUserId with it (Purchases.shared.appUserID, Purchases.sharedInstance.appUserID, Purchases.getAppUserID() or Purchases.appUserID) after Purchases.configure, after every Purchases.logIn and Purchases.logOut, and on every launch. A purchase that arrives before the app reports its user waits, and joins as soon as it does. Every user ID an install has reported counts, so a guest who buys and then makes an account keeps the purchase. If the app reports only the account ID, a guest's purchase joins only with RevenueCat's next event for that customer (for example the first renewal). See Guests and accounts.
  • No RevenueCat? Call purchase with the price as a decimal and a three-letter currency code, after the store confirms it.
  • On iPhone, that's expected. Apple has no install referrer, so deferred deep links are Android only.
  • Install from Google Play. Sideloaded and Android Studio installs have no Play referrer. Use internal testing, or debugInstallReferrer in a debug build. See Testing.
  • First launch only. The referrer is read once per install. Uninstall the app, or clear its storage, to test again.
  • Set a deep link on the link. In the dashboard, Links → ⋯ → Edit → Deep link. A link without one still credits the install, but there's nothing to open.
  • Register the listener. It can be added after configure: a link that arrived earlier is still delivered. On React Native that needs 0.3.1 or later; with 0.3.0, subscribe right after configure.
  • The screen sits behind onboarding or sign-in? The listener runs once per install. When onboarding is done, read getPendingDeferredDeepLink(), open the link, then call consumeDeferredDeepLink(). From 0.3.3 the link waits until you consume it, even if the app is closed in between (up to 30 days). See Open it after onboarding.
  • The same link opens on every launch? Call consumeDeferredDeepLink() once you've opened it.

Each click is credited to one install only. After a reinstall, Google Play can hand the same referrer to the app again, and that second install isn't credited to the link a second time. Unolink never guesses.

React Native and Flutter

  • Expo Go doesn't work. The SDK has native code: make a development build (npx expo prebuild or EAS Build).
  • "Native module not found" or MissingPluginException. Rebuild the app after installing. A JavaScript reload or a Flutter hot restart doesn't load new native code.
  • iOS build fails after installing. Run pod install in the ios folder (bare React Native), then build again.

Still stuck?

Email [email protected] with your app's name, the platform, the SDK version and the debug log from one app launch.