Skip to content

SDK behavior

All Ferry SDKs implement the same integration contract even when the platform APIs use different language conventions.

Core surface

JobiOSAndroidFlutterReact Native
ConfigureFerry.configureFerry.configureFerry.configureFerry.configure
Receive linksFerry.onLinkFerry.onLinkFerry.onLink streamFerry.onLink
Receive installation resultFerry.onInstallationFerry.onInstallationInstallation streamFerry.onInstallation
Handle a URLFerry.handleFerry.handleFerry.handleFerry.handle
Track eventsFerry.trackFerry.trackFerry.trackFerry.track
Force a batch flushFerry.flushFerry.flushFerry.flushFerry.flush
Create a client linkFerry.createLinkFerry.createLinkFerry.createLinkFerry.createLink

Every SDK delivers one logical link model:

FieldMeaning
dataCustomer-defined string-to-string payload
urlOptional trusted fallback or context URL
clickIdFerry attribution metadata managed by the SDK
methodOpen-ended attribution method value
confidenceDeterministic or probabilistic confidence
isDeferredtrue for a first-install match, false for a direct open
installationOptional attributed or organic first-open result

Register the link listener once and early. The first registration starts deferred matching. A result that arrives before the listener is ready is buffered rather than dropped.

Installation identity

The SDK creates one cryptographically random UUID in app-scoped storage. It is:

  • Generated automatically.
  • Scoped to one installed app.
  • Reused for match, link resolution, event, and client-link operations.
  • Removed when the app is uninstalled.
  • An attribution identity, not proof that a device is genuine.

Your app never needs to read, set, or transmit it.

First-open behavior

  • Matching runs for a genuine first launch.
  • A definitive attributed or organic result resolves the installation.
  • A repeated call returns the original attribution and does not reassign it.
  • A transport failure can retry later within a bounded attempt policy.
  • A match miss is a normal result, not an SDK error.
  • Reinstalling creates a new first-launch opportunity.

Idempotency

The SDK generates stable identities for:

  • A first-open match attempt.
  • One warm link invocation.
  • A client-created link request.
  • Every queued event.

Transport retries reuse the original identity. Ferry can safely receive the same delivery more than once without creating duplicate analytics or purchases.

Event delivery

Supported events are limited to login, signup, and purchase. The SDK batches them and preserves accepted and rejected results separately.

The optional customer ID and product ID are opaque application identifiers. Production diagnostics redact these values along with keys, click IDs, installation IDs, transaction IDs, URLs, and complete payloads.

Failure behavior

Normal background SDK work degrades safely:

  • Link or match failure produces no link.
  • A broken or unavailable native bridge does not crash a Flutter or React Native app.
  • Authentication decisions are not retried indefinitely.
  • Temporary transport and server failures use bounded retry and backoff.

Client link creation is the deliberate exception. It reports a typed failure because the caller is waiting for a shareable result.

Debug logging

Native SDKs provide opt-in debug logging for integration work. Logs describe lifecycle decisions and safe request metadata while redacting credentials, identifiers, full URLs, bodies, and payloads.

Disable debug logging in production unless Ferry support asks for a short, controlled diagnostic capture.