Documentation
Protocol reference

Conformance suite

How FounderHQ proves every SDK behaves the same way.

Five SDKs capture the same events. If one of them counted sessions differently, your numbers would change when you added a platform. The conformance suite exists to stop that.

What it is

One file, packages/events-core/fixtures/conformance-v2.json, holds 29 golden fixtures. Each fixture lists a sequence of actions and the exact bytes an SDK must produce. The web, React Native, Swift, Kotlin, and Node runners replay those actions and compare their output to the fixture, byte for byte.

Clock, UUID, storage, transport, and device facts are all injected, so the comparison is deterministic. A run either matches or fails.

The fixtures cover the behaviour that breaks quietly when SDKs drift:

  • Session rollover on idle time and on maximum age
  • Identify, reset, and set-once ordering
  • Retry after a partial acknowledgement
  • Identity rotation directives
  • Oversize payloads
  • Persistence across a restart, and offline recovery
  • Remote-config re-arm on web and on mobile
  • Opt-out and opt-in, and the cookieless consent transition
  • Single-page-app and hard-unload page views
  • Mobile screens, pixel dimensions, and app lifecycle
  • Checkout metadata and account lifecycle
  • Mobile purchase claims from the App Store, Google Play, and RevenueCat

What it buys you

Your dashboard reads one number for "sessions" whether the visit came from a browser or an iPhone. You can add Android in month six and trust that it did not move month five's chart. When you report a bug, the fix lands as a fixture, so it cannot come back.

Capability matrix

Some behaviour does not exist on some platforms. A browser has no app lifecycle. A phone has no window. Rather than skip those fixtures quietly, the suite declares which capability each platform has. The mobile gaps each carry a written reason.

CapabilityWebNodeReact NativeiOSAndroid
captureyesyesyesyesyes
identifyyes—yesyesyes
person propertiesyes—yesyesyes
super propertiesyes—yesyesyes
screenyes—yesyesyes
screen ids——yesyesyes
sessionsyes—yesyesyes
persistenceyes—yesyesyes
offline queueyes—yesyesyes
partial ackyes—yesyesyes
identity rotationyes—yesyesyes
remote configyes—yesyesyes
consentyes—yesyesyes
page viewsyes————
pageleave resilienceyes————
window idsyes————
DOM autocaptureyes————
scrollyes————
cookieless consentyes————
checkout metadatayesyes———
accountsyesyesyesyesyes
mobile session restore——yesyesyes
pixel dimensions——yesyesyes
app lifecycle——yesyesyes
mobile purchase claims—yesyesyesyes
secret key—yes———
device contextyes—yesyesyes
browser contextyes————
campaign contextyes—yes——
automatic event propertiesyes—yesyesyes
before sendyes—yesyesyes

A dash means the platform declares the capability out of scope. For example, iOS records named screens instead of browser page views, and taps on native views instead of DOM clicks.

Building your own client?

Run your client against the same fixture file. If it matches, your numbers line up with every official SDK. Start from Wire protocol.

AI agent or LLM? Read this page as markdown

On this page