Skip to main content

Overview

Stay up to date with Trodo releases, new features, and improvements.
Subscribe to our changelog to get notified of new releases. Email [email protected] to join the mailing list.
Documentation focus (April 2026): Developer docs are repositioned around product behavior analytics for AI and agentic apps. Older changelog entries below may describe historical capabilities from earlier product eras; the current docs emphasize events, identity, groups, and reporting for SaaS and agent workflows.

April 2026

Week of Mar 31 – Apr 6

Documentation — Agentic positioning
  • Intro, data model, SDK references, and analysis guides rewritten for AI / agentic / SaaS audiences (activation, runs, workflows, integrations).
  • Removed standalone guides for on-chain indexing, wallet APIs, and chain lists from the docs navigation; admin Sites replaces Sites & Contracts in the table of contents.
  • Examples and filters updated to use product events (e.g. agent_run_completed) instead of wallet and transaction-centric scenarios.

March 2026

Week of Mar 24–30

Developer documentation
  • New Groups SDK reference: set_group, add_group, remove_group, get_group, event enrichment, and identify() hydration.
  • Auto-Events rewritten to match the current SDK: enable/disable defaults, full event name catalog, JavaScript API, SPA path handling, and notes on page_summary, errors, and performance events.
  • Cross-links and corrections across Installation, Quickstart, Glossary, Data Model, Events & Properties, Default Properties, User Profiles, Identify, People, Implementation Guide, Privacy, and GTM (including real auto-event names such as element_click and copy_action).

Week of Mar 16–22

Auto Events — Major SDK Overhaul
  • 15 auto-captured events (expanded from 8), organized into categories: navigation, interaction, visibility, form, media, error, and performance.
  • New interaction events: rage_click (3+ clicks on same element in 1s), dead_click (click on non-interactive element with no navigation), text_selection (≥3 chars selected), element_view (element ≥50% visible for ≥1s via IntersectionObserver).
  • New form events: form_validation_error (HTML5 invalid event on a field), form_abandoned (page unload with form touched but not submitted; sent via sendBeacon).
  • New media events: media_play and media_pause for <video> and <audio> elements (2s per-element throttle).
  • New error events: js_error (runtime errors and unhandled promise rejections), network_error (XHR status ≥400 or network failure).
  • New performance event: page_performance fires ~1500ms after window load with LCP, CLS, INP, FCP, and TTFB.
  • Renamed events: clickelement_click, scrollpage_scroll with richer payloads.
  • Removed events: input_change and copy replaced by richer, lower-noise alternatives.
  • Standard Element Data Object: shared element_data sub-object across all interaction events with tag, id, class, type, text, category, and viewport position; extended with media/image fields for relevant click types.
  • Per-event throttle/debounce: page_scroll 250ms debounce, text_selection 300ms debounce + 1s cooldown, media_play/media_pause 2s per-element throttle, element_view fires once per element per load.
  • JS Runtime API: Trodo.disableAutoEvent(), Trodo.enableAutoEvent(), Trodo.setAutoEventsDisabledEvents(), Trodo.getAutoEventsConfig().
  • Storage: event payloads written to auto_event_data JSONB column; element fields extracted to dedicated indexed columns; event_category derived server-side.
  • Transport: normal events use fetch with keepalive: true; unload events use navigator.sendBeacon.

February 2026

Week of Feb 1–7

Configurable transaction columns
  • Column set: Smart contract (chain), Function name, Transaction time, Tx hash, Block, From, To, Value.
  • Required columns (contract, function, time) always on; rest toggleable and reorderable.
  • Column config modal: checkboxes and drag-and-drop; selection persisted with table preferences.
  • Categories (e.g. core, blockchain, addresses) for easier grouping in the modal.

Week of Feb 8–14

Transaction row & detail
  • Dedicated transaction row component: consistent formatting, truncation for long hashes/addresses, copy-to-clipboard.
  • Transaction detail view: full hash, block, from/to, value, input data snippet, status, gas (when available).
  • Properties tab: all known fields (contract, function, args, chain, timestamp) in a structured layout.
  • Link to block explorer (chain-specific) when chain and hash are known.

Week of Feb 15–21

Transactions filter module
  • Filter bar for transactions: by contract (multi-select), time range, optional wallet or hash search.
  • Filter state synced with URL or local state so “filtered view” is shareable or restorable.
  • Combined with events and sessions filters so “events in range → sessions → transactions” flows feel consistent.
  • Clear filters and “no results” state with suggestion to widen criteria.

Week of Feb 22–28

Cohorts in Analytics
  • Filter by cohorts in Analytics using global filters; events are limited to users in the selected cohorts (multiple cohorts use “or” — user in any of them).
  • Break down charts by Cohort, same as by Country or Device; choosing “Cohort” segments data by all your cohorts without picking them one by one.
  • Cohort filters appear as a single chip with the cohort name and can be edited or removed from the filter bar.
User & cohort filters
  • List-type user properties (e.g. roles, tags) support “Any in list” and “All in list” with the right operators and value pickers.
  • Object-type properties (e.g. profile) let you pick a nested field (e.g. role, plan) in the same screen, with data type shown and no extra popup.
  • Custom user property filters can use suggested values from your data where available.
  • List and object handling in Cohorts and Users filters now matches Activity → Events.
Sessions page & tables
  • Sessions page: list of sessions with duration, page views, first/last event, device, country.
  • Session row: expand or click-through to session detail (timeline of pages and events).
  • Alignment with events and transactions: same table styling, loading states, and empty states.
  • Optional session-level filters (e.g. min duration, has event key) for funnel analysis.
On-chain table integration
  • On-chain transactions table uses the same column config and filter module as the main Activity view.
  • Transaction detail modal available from both Activity and any embedded transaction list.
  • Team and contract scoping: only transactions for the team’s registered contracts appear; no cross-team leakage.
Polish & performance
  • Shared data table styles: borders, density, hover, and focus for accessibility.
  • Skeleton loaders and incremental load for large event/session/transaction lists.
  • Error boundaries and inline error messages so one failed section doesn’t break the whole page.
  • Backend: transaction list API supports filter params and returns contract name and chain; response shape stable for the new UI.

January 2026

Week of Jan 1–7

User journey filter semantics
  • Filters (date, device, country, Web3 status, wallet net worth, etc.) apply only to the user list and to aggregate metrics.
  • User detail, timeline, dapps, and tokens APIs ignore filters and return full history for the selected user.
  • Documented contract: “filter to find users; then inspect anyone in full.”
  • Metrics (unique users, geography, devices, activity charts) respect current filter set.

Week of Jan 8–14

Soneium wallet net worth
  • Dedicated pipeline: Blockscout API for Soneium balance and token list; DexScreener for USD prices.
  • Native SONE + ERC-20 token balances; aggregated USD per wallet and stored in wallet_networth.soneium.
  • Rate limiting and retries (exponential backoff + jitter); timeouts to avoid hanging.
  • On failure: return 0 or last-known value; never fail the whole aggregation.
Chain config expansion
  • Central chain config: chain ID, name, API provider (Etherscan-compatible, Blockscout, etc.), transaction caps, block chunk size, and API offset limits.
  • Dozens of networks supported (Ethereum, Base, Arbitrum, Polygon, Optimism, BNB, Avalanche, Soneium, Berachain, etc.).
  • Per-chain transaction fetcher tuning so we stay within provider limits and avoid bans.

Week of Jan 15–21

Conversion events experience
  • Dedicated Events view: list of events with key, count, last seen; filters by key, time, property.
  • Sessions view: session list with duration, page views, device, location; link to event list for that session.
  • Activity view: on-chain transactions for the team’s contracts; table with hash, block, from/to, value, time, function.
  • Shared filter bar and filter modules (dropdowns, date range, multi-select) across events/sessions/activity.
  • Event detail: payload, related sessions/users; session detail: pages, events, and linked identity.

Week of Jan 22–31

Preferences & persistence
  • User preferences API and client state for table column visibility and order.
  • Preferences keyed by team and optional user; defaults for new users.
  • Conversion events tables (events, sessions, transactions) respect saved column sets.
  • Last-used time range and filters considered for “restore previous session” (where implemented).
Transaction table behavior
  • Transaction list: sort by time, filter by contract, time range, wallet (future).
  • Display of contract name + chain; function name from decoded input where ABI is present.
  • Value formatting (wei → human-readable; optional USD if price pipeline exists).
  • Pagination and “load more” with stable ordering (transaction_time, id).

December 2025

Week of Dec 1–7

Identify & distinct ID
  • Identify API: attach email, name, phone, and custom traits to user_id; stored on user_identities.
  • distinct_id: optional stable cross-device ID; added to user_identities, sessions, events, and UTM event logs.
  • Merge logic: same user_id with different distinct_id can be linked for analytics.
  • Downstream: event ingestion can accept distinct_id; resolution to user_id where configured.

Week of Dec 8–14

Multi-website identity
  • website_ids array on user_identities for users touching multiple properties.
  • Queries can scope by single website or “any of these websites”.
  • Cross-website user view (optional) for teams that need cross-property journey.
Custom properties
  • Custom key-value on user_identities with validation (key format, value type).
  • Property discovery: indexes and metadata for “which custom properties exist” per team/website.
  • Filters in user list and dashboards can use custom properties (e.g. plan_type, signup_source).

Week of Dec 15–21

UTM event log schema
  • Datetime columns converted to arrays where one UTM row represents multiple hits over time.
  • Queries updated for array semantics; no loss of granularity.
  • Migration script with validation and rollback path.
Table preferences
  • Team-level table preferences: which columns to show, order, default sort for main tables.
  • Stored per team and optional per user; UI reads preference and applies on load.
  • Applied to user list, events list, sessions list (where applicable).

Week of Dec 22–31

Subscription enforcement
  • Subscription-protected routes check team plan and status before serving.
  • Grace period for expired subscriptions (e.g. 7 days) with warning in UI.
  • Stripe Customer Portal link for self-service plan change and billing history.
  • Client-side subscription context so UI can show upgrade prompts or feature gates.
Stability & observability
  • Structured logging with request ID and team_id for tracing.
  • Error classification (4xx vs 5xx) and safe error messages (no internal paths).
  • Health endpoint extended with DB and optional cache checks.

October 2025

Week of Oct 1–7

Smart contract registry
  • Contract entity: address, optional ABI, chain ID, and display name per team.
  • Only contracts registered for a team are used for transaction matching.
  • Support for multiple chains per team; contract list API with pagination and filters.
Transaction ingestion
  • Transaction fetcher worker: block-range polling with configurable chunk size (e.g. 100k blocks).
  • Per-chain API limits and backoff (e.g. Etherscan 10k results per request); rate limiting and jitter.
  • Stored fields: tx hash, block number, from/to, value, timestamp, contract_id, team_id.
  • Incremental append; duplicate hashes ignored for idempotency.

Week of Oct 8–14

User identity model
  • Unified identity: one row per (user_id, team_id, website_id) with composite unique constraint.
  • First/last visit, total page views, total time spent; first/last country and city.
  • Device type, browser, OS from user-agent parsing (mobile/tablet/desktop).
  • Optional Web3 fields: primary_wallet_address, other_wallets, wallet_type, chain.
Session–identity sync
  • Every session create/update triggers identity upsert: new identity or merge into existing.
  • Session IDs array on identity for “all sessions for this user”; no duplicate sessions.
  • Migration of legacy session data into user_identities with preserved timestamps.

Week of Oct 15–21

Transaction–identity linkage
  • Rule: link transaction to identity only if wallet matches identity’s primary or other_wallets (canonical lowercase).
  • Contract must belong to the same team; team_id enforced on both transactions and identities.
  • contract_transaction_ids array on identity; aligned to_value and from_value arrays (same length).
  • Direction: to_address match → append to to_value; from_address match → append to from_value.
  • Internal transfers (same user to self): two entries appended (in and out) for correct totals.
Value aggregation
  • to_value/from_value as JSONB arrays; GIN indexes for “has transaction in range” queries.
  • Full recompute: by team contracts → identities with wallets → transactions → match and overwrite arrays.
  • Incremental: on transaction batch insert, fetch new txs, resolve contract and identities, append only.
  • Array length invariant: len(contract_transaction_ids) == len(to_value) == len(from_value) enforced on write.

Week of Oct 22–31

Wallet net worth format
  • wallet_networth schema: per-chain or per-asset breakdown; migration from legacy single-value format.
  • Backward-compatible reads during migration; old clients still receive a valid structure.
Custom dashboards
  • Dashboard entity: name, layout (grid), saved query references, and visibility (private/team).
  • Row-level security so users only see dashboards they own or are shared with.
  • Query execution with parameter binding and timeout; results cached for repeat views.
Device extraction
  • User-agent → device_type (mobile/tablet/desktop) with fallback to “unknown”.
  • Stored on session and rolled up to user identity for segment filters.

November 2025

Week of Nov 1–7

Public dashboards
  • Shareable read-only link with optional expiry; no login required.
  • Dedicated read-only DB role for public dashboard queries; no write or schema access.
  • Token or slug in URL; rate limiting per link to prevent abuse.
Billing & Stripe
  • Billing record per team for active Stripe subscription; plan ID, status, current period.
  • Webhook handler for subscription created/updated/canceled/deleted; idempotent and verified with signing secret.
  • No billing rows for free teams; Stripe as source of truth for paid state.
  • Usage tracked separately (events, API calls) for future metering.

Week of Nov 8–14

Events table & primary keys
  • New events schema with integer primary keys; raw_event_logs stores integer session_ids and user_ids.
  • Ingestion: client sends external UUIDs; backend resolves to internal PKs and stores PKs only.
  • Resolution strict: missing session or user → 4xx and event not stored.
  • Event definition details API: joins back to sessions/user_identities to return external UUIDs in responses so client contract unchanged.

Week of Nov 15–21

User journey & events
  • User timeline API: events filtered by external user_id via join on user_identities (internal PK in raw_event_logs).
  • Stats/aggregates: distinct user counts use INTEGER casting on JSONB array elements and null-safe logic.
  • Composite index on (team_id, website_id, event_key, time) for event drill-downs.
  • Deprecation of old custom-events tables; one events pipeline and one schema.
Credits & ledger
  • Team usage ledger: debits for events, API calls, etc.; credits for plan allowances or top-ups.
  • Credit operations table for audit trail (grant, consume, expire).
  • Billing logic migrated to ledger + operations; subscription downgrade applies to future periods only.

Week of Nov 22–30

Data architecture
  • PostgreSQL 16 + TimescaleDB: hypertables for time-series (sessions, events); standard tables for relational data.
  • JSONB for flexible event payloads and wallet_networth; GIN where needed.
  • Documented scalability path: single DB → read replicas → optional event streaming.
  • Backup and retention policy documented; point-in-time recovery options.
API operations & limits
  • API operations table for per-team, per-endpoint call counts.
  • Preparation for rate limits and plan-based caps (not yet enforced in product).

September 2025

Week of Sep 2–8

Authentication & tenants
  • Email/password signup and login with secure token refresh.
  • JWT-based sessions with configurable expiry; refresh flow without re-login.
  • Team-scoped multi-tenancy: all data isolated by team; team members and roles supported.
  • Website entity: multiple trackable properties per team with separate config and keys.
Session pipeline
  • First-party session creation and updates via tracking API.
  • Persisted fields: first/last visit, page view count, referrer, and geo (country/city).
  • Server-side idempotency for duplicate requests; session continuity across tabs.

Week of Sep 9–15

Campaign & UTM model
  • Campaign definitions with UTM parameter sets (source, medium, campaign, term, content).
  • UTM event log: one row per UTM combination with aggregated counts and timestamps.
  • Cascade rules: campaign changes propagate to UTM aggregates; no orphaned UTM rows.
  • Indexes on (team_id, website_id, utm_) for fast campaign drill-downs.
Custom events (v1)
  • Event ingestion accepting event key, optional payload, and session/user references.
  • Event keys validated and normalized; invalid keys rejected with clear errors.
  • Batch endpoint for up to 500 events per request; non-blocking processing.

Week of Sep 16–22

Event storage & keys
  • Raw event log with JSONB payload; schema-on-read for arbitrary properties.
  • Event key uniqueness and case handling; migration to fix legacy missing keys.
  • Permissions aligned with team/website; RLS-style checks for event read/write.
UTM restructure
  • UTM event log restructured to one row per UTM identity for accurate attribution.
  • No more double-counting when the same UTM appears in multiple sessions.
  • Backfill script for existing data; zero-downtime migration window.

Week of Sep 23–30

Campaign triggers
  • Campaign definition updates trigger UTM log invalidation/rebuild where needed.
  • UTM removal from a campaign correctly prunes or marks affected UTM rows.
  • Documentation of campaign → UTM dependency graph for support and ops.
Stability
  • Connection pooling and query timeouts to avoid long-running requests.
  • Retry policy for transient DB errors on event and session writes.
  • Health check endpoint for load balancers and monitoring.

Feedback

Have feature requests or found a bug? Let us know:

Get Started

Start using Trodo

SDK Reference

View all methods