NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev
Flutter client SDK for the AdSparkle affiliate attribution tracking platform. Deterministic Android install attribution via the Play Install Referrer; pure Dart on every other platform.
Last release 17 days ago
21 Sep 2026
Ships on a steady schedule
a new release about every 3 weeks
Nearly every release is documented
notes for 9 of 9 stable releases
Nothing withdrawn
no release was ever pulled
3 months old
9 releases · first in 2026
One column per month.
The iOS /match debug message now includes the reason when no click is matched: Eslestirme sonucu yok ( ), where the reason is no_match, ambiguous, amb
/match debug message now includes the reason when no click is
matched: Eslestirme sonucu yok (<reason>), where the reason is no_match,
ambiguous, ambiguous_device_profile, network_error, invalid_response
or http_<code>. Previously every outcome was shown as no_match, which hid
the difference between "no matching click", "several possible clicks" and
"server unreachable".MatchClient.resolveMatch now returns a MatchOutcome (click id and reason)
instead of a nullable click id.baseUrl should be the domain your tracking links are served from.
On iOS, deferred attribution can fail when links and SDK requests use
different hosts.On-screen debug diagnostics. With configure(debug: true) the SDK now emits 13 short diagnostic messages for every critical step (ready, link received,
configure(debug: true) the SDK now emits
13 short diagnostic messages for every critical step (ready, link received,
click_id from link, link not recognised, registering click, click_id
received, register-click rejected/retrying, /match resolved/no result,
event deferred/sent/rejected) so an integrator can see where the chain
breaks on a real device without attaching to flutter run / Xcode / logcat.AdSparkleDebugOverlay widget: wrap your app (typically in
MaterialApp.builder) to render the messages at the bottom of the screen —
tap to expand/collapse, long-press to copy the whole buffer to the clipboard,
and buttons to clear or dismiss. The message list is IgnorePointer, so it
never blocks the UI underneath.setDebugHandler((message) { ... }) for apps that prefer their own
toast/snackbar, plus low-level subscribeDebug(...) and the SDK_VERSION
constant. A handler takes priority over the overlay — a message is shown
exactly once, never twice.debug: false (the default) no diagnostic
string is ever built, no listener is called and the overlay renders only its
child. Secrets are never shown — click_id is truncated to its first 8
characters, URLs/keys to 60; companyKey and device_id never appear.feat: onClickId attribution callback (0.1.7)
feat: onClickId attribution callback (0.1.7)
AdSparkle.instance.onClickId = (clickId) { ... }
fires the moment a click_id becomes active, from any source (deep-link
?click_id, register-click, Play Install Referrer, iOS /match) — no
polling needed. If a click_id already exists when the handler is set, it is
invoked immediately (once, asynchronously) with the current value. The same
value never fires twice in a row; a different new value fires again.
Delivery is async (microtask) and never runs inside SDK state updates.
Optional and backwards compatible — reading clickId still works.fix: multi-app link parsing and attribution fixes (0.1.6)
fix: multi-app link parsing and attribution fixes (0.1.6)
unique_key is now the last non-empty path segment, matching
the backend /:appSlug?/:uniqueKey route (multi-app /slug/key links;
single-segment links are unchanged).baseUrl host, plus an
optional configure(extraLinkHosts: [...]) list (equal or .suffix match,
trimmed and lowercased). Existing configure calls are unchanged.click_id.track() retries a pending register-click even when a click_id already
exists.Matches published pub.dev adsparkle_flutter 0.1.5. configure(linkDomainSuffix:) optional (default .go.adsparkle.co, backend LINK_DOMAIN_SUFFIX parity)
Matches published pub.dev adsparkle_flutter 0.1.5. configure(linkDomainSuffix:) optional (default .go.adsparkle.co, backend LINK_DOMAIN_SUFFIX parity); install_referrer/match_client/register_client deferred attribution; Android plugin.
Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
configure() now accepts an optional linkDomainSuffix (default
.go.adsparkle.co) so test/prod deployments can use different link domains,
mirroring the backend LINK_DOMAIN_SUFFIX env. Existing calls are unchanged./match,
and register-click for app-installed universal-link opens.Rebrand: package description, docs and license now reference AdSparkle (formerly "Viralif / AdBird"). No code changes.
Accept company custom-event shortIds (e.g. YE2YFSQ) as eventType — the fixed 7-event allowlist was relaxed to the backend format ^[A-Za-z0-9_]{1,64}$.
YE2YFSQ) as eventType — the
fixed 7-event allowlist was relaxed to the backend format
^[A-Za-z0-9_]{1,64}$. Built-in typed helpers are unchanged.AdSparkleEvent.eventType is now the raw wire string, so queued custom
events survive persistence and offline replay.productIds / customParams support (product-scoped campaigns).Default API base URL is now https://api.adsparkle.co (was api.viralif.co).
https://api.adsparkle.co (was api.viralif.co).Singleton AdSparkle.instance public API.
Initial release.
AdSparkle.instance public API.configure(), setUserId(), setClickId(), handleDeepLink().track() plus typed helpers: trackInstall, trackSignUp, trackLogin,
trackDownload, trackPurchase, trackSubscription, trackRefund.click_id extraction from URI query parameters.POST {baseUrl}/api/tracking/postback with
X-Company-Key auth (publishable co_ key; no secret/HMAC).shared_preferences) flushed on the next
configure() / track().Your coding agent can read these notes before it upgrades. Set up the MCP server →