client.track(). The SDK accepts a strongly typed TrackEvent shape and maps it to the canonical Events API V2 envelope before sending.
The TrackInput shape
The event name. Must be one of the built-in
EventType values listed below.Event payload. For built-in events, the type is narrowed (for example,
quote.succeeded expects { amount?: number; currency?: string }).MCP request metadata, typically
extra._meta inside a tool handler. This is where the SDK reads the session id from. See Sessions.Explicit session id override. Prefer passing
meta instead.External user identifier. Equivalent to calling
identify() inline. See Identify.Client-generated id. If you omit it, the SDK generates
evt_<uuid>. Supplying your own enables idempotent resends.track() returns { eventId } as soon as the envelope is enqueued, before the network request completes.
Built-in event types
EventType is a closed union exported from @waniwani/sdk. Only these names are accepted by track().
| Event name | Typed properties | Notes |
|---|---|---|
session.started | none | Emitted by the WaniWani backend when it sees a new session id. Do not send it yourself. |
tool.called | ToolCalledProperties | Emitted automatically by withWaniwani(server). Do not send it yourself. |
quote.requested | none | Top of a pricing funnel. |
quote.succeeded | QuoteSucceededProperties | A quote was produced. |
quote.failed | none | A quote could not be produced. |
link.clicked | LinkClickedProperties | An outbound link was followed. |
purchase.completed | PurchaseCompletedProperties | A purchase finished. |
user.identified | none | Prefer client.identify() over sending this directly. |
The SDK also defines
widget_render, widget_click, widget_link_click, widget_error, widget_scroll, widget_form_field, and widget_form_submit event types. These are emitted automatically by the widget runtime (useWaniwani() in a browser widget) and are not intended to be sent from server code.Recipes
quote.requested / quote.succeeded / quote.failed
link.clicked
purchase.completed
Return value
eventId is stable and safe to log. It is assigned before the envelope leaves the process, so logging it tells you an event was accepted into the buffer, not that it reached the backend.
Flushing
The transport flushes on a timer and on batch size. In long-running processes, you typically do not need to callflush() yourself. In serverless functions, call it before the function returns:
The SDK also accepts a legacy shape with
eventType, toolName, toolType, quoteAmount, quoteCurrency, linkUrl, purchaseAmount, and purchaseCurrency fields. It is kept for backward compatibility with pre-V2 integrations. New code should use the modern { event, properties, meta } shape shown above.