Changelog

We ship new features, fixes, and improvements to Formo every week

Idempotency for Custom Events and Mobile SDK Improvements

Here are this week's highlights:

  • Idempotency for Custom Events

  • Mobile SDK Improvements

  • Improvements and Fixes

Idempotency for Custom Events

The Web SDK (1.41.0) and the Mobile SDK (1.3.0) now accept an optional idempotency_key property for custom events. It expects a stable identifier for the action, such as an order ID.

formo.track("Order Placed", {
  idempotency_key: order.id, // optional idempotency key for deduplication
  token_pair: 'ETH/USD',
  volume: 1250,
});

This ensures you don't sent duplicate events by accident due to minor changes in prices and slippage parameters. The key is hashed into the message ID and is never sent as a property.

See deduplicating events and the idempotency docs to learn more.

Mobile SDK Improvements

The Mobile SDK now gets the same identity, consent, and deduplication rules as the Web SDK. Four behaviours were ported across:

  • The reset() contract. reset() is a logout, not a new visit. It clears the user ID, the wallet identity, and the identify markers, and starts a new session. The device ID, the wallets the device has seen, and the attribution that brought the user in all stay, because they describe the device and the visit rather than the person. (Consent withdrawal remains the one case that clears everything.)

  • The tracking policy gates. detect() and identify() now evaluate the full tracking policy before they write any state, so a wallet seen while the current chain is excluded is no longer silenced for the rest of the session.

  • Wallet marker lifetimes. Mobile storage is persistent, so a marker written once could suppress detect for the life of the app. Markers now expire a day after their last write, matching the lifetime of the web marker cookie, and are capped at 20 per device.

  • The duplicate suppression window and idempotency_key. Both arrived on mobile with 1.3.0, with the same 60 second window and the same reserved property described above.

Improvements and Fixes

  • Added idempotency_key support and the rolling duplicate suppression window to the Mobile SDK.

  • Fixed duplicate suppression being tied to delivery in the Web SDK (1.41.0). The first event of a page load is sent the moment it arrives. Fingerprints now expire on their own 60 second window.

  • Fixed property order splitting one event into two when events were compared for duplicates (1.41.4).

  • Fixed formofy() building a second SDK instance next to the first (1.41.1), which sent every autocaptured event once per instance under tag managers, React strict mode, and hot reloads. A repeat call with the same write key now reuses the live instance.

  • Fixed buffered events being lost when the SDK is torn down (1.41.5). They are now delivered before the instance goes inert, so an unmount is no longer silent data loss.

  • Fixed events dropped on consent withdrawal or teardown failing silently. Each one now reports a coded error to your callback and error handler (1.41.2 and 1.41.4).

  • Fixed Solana wallet state going out of sync when reset() ran, when connect capture was off, or when an excluded chain gated the event, which left later events carrying a stale chain (1.41.2).

  • Fixed a Solana wallet authorized before the SDK loads being reported under a stale snapshot, and the cluster you set being dropped once a framework-kit store attached (1.41.3).

  • Fixed the Live view globe raising map tiling errors.

  • Fixed scheduled emails being lost when the mail gateway returned a transient error. They are now retried.

  • Updated the demo project with behavioural wallet labels and corrected acquisition breakdowns, so the sample data matches what your own workspace shows.

  • Platform security and performance improvements.

Share this on

Crypto analytics that drive growth

Formo helps you define, measure, and drive impact onchain in less time.