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, andidentify()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_clickandcopy_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(HTML5invalidevent on a field),form_abandoned(page unload with form touched but not submitted; sent viasendBeacon). - New media events:
media_playandmedia_pausefor<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_performancefires ~1500ms afterwindow loadwith LCP, CLS, INP, FCP, and TTFB. - Renamed events:
click→element_click,scroll→page_scrollwith richer payloads. - Removed events:
input_changeandcopyreplaced by richer, lower-noise alternatives. - Standard Element Data Object: shared
element_datasub-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_scroll250ms debounce,text_selection300ms debounce + 1s cooldown,media_play/media_pause2s per-element throttle,element_viewfires once per element per load. - JS Runtime API:
Trodo.disableAutoEvent(),Trodo.enableAutoEvent(),Trodo.setAutoEventsDisabledEvents(),Trodo.getAutoEventsConfig(). - Storage: event payloads written to
auto_event_dataJSONB column; element fields extracted to dedicated indexed columns;event_categoryderived server-side. - Transport: normal events use
fetchwithkeepalive: true; unload events usenavigator.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:- Email: [email protected]
- Support: Live Chat
Get Started
Start using Trodo
SDK Reference
View all methods