Analytics. Every click, mapped in real time.
Real-time click stream into a columnar analytics store. Geo, device, referrer, UTM. Funnel and cohort views on Business. Scheduled exports to S3, BigQuery, or Snowflake.
- Columnar analytics store for sub-second queries
- GDPR-compliant by default - no cookies needed
- Geo, device, referrer, UTM - in one view
- Export via API or scheduled CSV
How it works
From impression to revenue - every step measured
Click events fire into our event stream the instant a redirect happens, with zero impact on redirect latency. Our ingestion service writes them to the analytics store asynchronously - typically under 5 seconds. You see funnel drop-off, geo spread, and conversion attribution in the same view.
Geo analytics
Country → region → city, where the IP resolves
Geo resolution uses an offline geo-IP dataset (no PII shared). IP is used for lookup only and is not stored in click events - GDPR-compliant by default. For workspaces that need country-only resolution, that’s a single workspace setting on Business.
- Country breakdownISO 3166-1 alpha-2 with click share %
- City-level precisionWhere IP resolution goes below region
- Device + OS splitMobile, tablet, desktop; iOS, Android, Windows
- UTM attributionsource, medium, campaign, term, content
- Hour × day heatmapIdentify peak windows and bot patterns
- Germany3,241
- Poland2,108
- France1,879
- United States1,432
- United Kingdom1,219
- Netherlands887
- Czech Republic641
- Sweden512
- Click from Berlin, DEnewsletter.acme.comMobile2s ago
- QR scan from Tokyo, JPdirectMobile5s ago
- Click from Warsaw, PLtwitter.comDesktop11s ago
- Click from Paris, FRlinkedin.comDesktop18s ago
- Click from New York, USgoogle.comMobile27s ago
- Click from Amsterdam, NLdirectDesktop41s ago
Live stream
Watch clicks arrive as they happen
The real-time view polls the analytics API every 30 seconds. Events are typically in the analytics store within 5 seconds of the click. During traffic spikes, the event stream buffers events for up to 7 days - no events are lost, the ingester just catches up.
- Sub-5s click-to-dashboard lag on average
- Event stream buffers 7 days of events
- Consumer lag monitored; alert fires at 60s
- Real-time Kafka-compatible firehose on Business
- 30s dashboard poll; configurable via API
What you can do
- Real-time click events
- Country / device / referrer breakdowns
- Funnel + cohort retention (Business)
- Hour-of-day × day-of-week heatmap
- Scheduled exports to S3 / BQ / Snowflake
- Conversion attribution from Stripe / Shopify
What the analytics stack actually does
Click counts and geo breakdowns are in every shortener. The capabilities below are where the columnar analytics store makes a real difference.
Raw click events in your analytics store - every event, no aggregation at ingest
Click events are ingested via our event stream and written to the analytics store by our ingestion service. There is no sampling layer - a link with 10 clicks and a link with 10 million clicks use the same pipeline. Retention is 90 days on Free, 12 months on Pro, 24 months on Business. Event schema fields include: click_id, link_id, workspace_id, occurred_at (UTC), country_iso2, region, city, device_type, os, browser, referrer_domain, utm_source, utm_medium, utm_campaign, utm_term, utm_content, and referer (full URL, nullable). The schema is public and versioned; changes get a migration guide. Event ingest lag is typically under 5 seconds from click to analytics availability. If you've been using Bitly or Rebrandly and rely on 'total click count' as a KPI, you'll get the same numbers from Elido - plus the ability to query the raw events instead of just the counter.
Geo, device, referrer, and UTM breakdowns at the link level
Every link in the dashboard has its own analytics view: time-series click graph (hourly, daily, weekly), geo breakdown (country → region → city, where IP resolution goes down to city level), device type (mobile, tablet, desktop), OS, browser, referrer domain, and UTM parameter distribution. The hour-of-day × day-of-week heatmap shows when a link's traffic peaks - useful for scheduling campaigns, confirming that a live event drove traffic at the expected time, and catching bot patterns (bots often hit links at consistent off-hours with no geographic spread). For links with smart-link rules, per-variant analytics are visible in the same view - click counts and time-series by variant.
Server-side conversion attribution from Stripe, Shopify, and custom webhooks
Server-side conversion attribution closes the gap that client-side pixels create. On each click, Elido records a click_id and passes it as a query parameter to the destination URL. When a conversion event fires on your backend (Stripe checkout.session.completed, Shopify orders/paid, or your own POST to Elido's conversion endpoint), Elido matches it to the originating click, attributes the revenue value, and fans the conversion out to GA4 Measurement Protocol, Meta Conversions API, or Mixpanel - depending on what you've configured. The conversion appears in the link's analytics view attributed to the click (and its UTM context). This works across browser sessions and adblocker boundaries because it's server-to-server. Edge case: if your checkout flow strips the click_id query parameter before conversion (e.g., multi-step checkout that doesn't preserve query params), attribution breaks. Test the full checkout flow with the click_id before going live.
S3, BigQuery, and Snowflake scheduled exports plus real-time Kafka firehose
Scheduled export sends click events to S3 (Parquet or JSON), BigQuery, or Snowflake on a configurable cadence (hourly or daily). Incremental exports append only new events since the last run, keyed on occurred_at. The first run backfills to your retention window. For teams who need sub-minute data in their warehouse: the Kafka-compatible firehose (Business) gives a direct consumer group with sub-5-second end-to-end lag. Both paths use the same event schema - switching from scheduled export to firehose is a consumer change, not a schema change. For teams who prefer direct SQL over export ETL: the read-only analytics DSN (Business) lets you connect Metabase, Hex, Grafana, or any compatible SQL/BI client directly to your workspace's event table.
Retention heatmap and cohort views for click-level engagement analysis
Business workspaces get cohort and retention views in the analytics dashboard. Pick a link or campaign, pick a cohort dimension (country, device type, UTM source), and get a day-by-day or week-by-week retention heatmap. This answers questions like 'do users who click from organic search come back to this link more than users from paid?' - not at the session level (Elido doesn't track sessions), but at the click-cohort level. It's a different instrument than a product analytics tool like Mixpanel or PostHog: it measures re-engagement with the link, not in-product behavior. For teams that use short links in email campaigns, retention cohorts surface whether a link is being revisited (forwarded newsletters, bookmarked pages) or is one-and-done.
Teams relying on Elido analytics
Names are placeholders for now - real customer names land here as case studies are published.
“We moved server-side Meta CAPI through Elido after iOS 14.5 killed our pixel attribution. Setup was two sprints; we recovered attribution on roughly 25% of conversions that the pixel was dropping. The UTM context passing through to CAPI is what made the attribution actually useful.”
“The read-only analytics DSN on Business means our Metabase dashboards query click event data directly. No export job to babysit, no sync delay. We answer 'which article drove the most clicks on monetized links today?' without a ticket to engineering.”
“We export to BigQuery and join click events with our Shopify order table. The click_id passthrough is the key - we can trace a short link click through to the purchase with a simple JOIN. That closed our last-click attribution gap.”
Elido analytics vs Bitly Analytics vs Heap
Two shortener-side options compared against a product analytics platform. Honest about which tool is right for which question.
| Feature | Elido | Bitly Analytics | Heap |
|---|---|---|---|
| Raw click event access | Full event schema, export, DSN | Aggregated counters; raw not accessible | Full event access - product analytics |
| Sampling | 0% - every event stored | No sampling info published | Plan-dependent on the free tier |
| Retention horizon | Up to 24 months (Business) | 90 days (paid) | Depends on plan |
| Server-side conversion | GA4 MP, Meta CAPI, Mixpanel | Not available | Server-side ingestion (product events) |
| Warehouse export | S3, BigQuery, Snowflake scheduled | CSV download only | Heap Data Lake (BigQuery) |
| Real-time Kafka firehose | Yes - Business | Not available | Not available |
| User-level tracking | No - click-level only | No | Yes - core feature |
| Direct SQL access | Read-only analytics DSN (Business) | No | Heap Data Lake (BigQuery) |
Analytics questions
What fields are in the click event?
click_id (UUID), link_id, workspace_id, occurred_at (UTC timestamp), country_iso2, region, city, device_type (mobile/tablet/desktop), os, browser, referrer_domain, utm_source, utm_medium, utm_campaign, utm_term, utm_content, referer (full URL, nullable). Schema is at /docs/api-reference under 'Click events'. It's stable; additions are backwards-compatible; removals get a 90-day deprecation notice.
Why is city-level geo sometimes missing?
City-level geo resolution depends on the IP range. Carrier-grade NAT, VPN, and some corporate proxies resolve to region or country level only - we can't resolve a city from a shared NAT IP. We use an offline geo-IP dataset (no PII shared); accuracy is high for residential IPs but lower for mobile carrier and enterprise IP ranges. We report what we can resolve; we don't guess.
How does conversion attribution break if the click_id is lost?
If the click_id query parameter is stripped before conversion (multi-step checkout, SPA router, redirects that don't forward query params), the conversion POST to Elido's endpoint has no click to match against and attribution fails silently. Test your checkout flow: click a short link, check that the click_id appears in the final conversion POST. If it doesn't, add query-parameter forwarding in your checkout flow. This is the most common attribution gap - not the pixel, but query-param loss in the checkout session.
What's the ingest lag between a click and analytics availability?
Typically under 5 seconds. The path is: click hits edge → fire-and-forget event to our event stream → our ingestion service reads from the stream and writes to the analytics store. The consumer runs continuously with auto-commit. If the pipeline falls behind (high-traffic spike, infrastructure issue), the event stream retains events for 7 days. We monitor consumer lag; alerting fires at 60-second lag. Real-time dashboard updates poll the analytics API every 30 seconds.
Can I filter the analytics DSN to only see one domain's clicks?
The DSN connects to a per-workspace view that shows all clicks for all links in your workspace. You filter by domain, link_id, or tag in your SQL. If you want per-domain views, create them in your own BI tool using a WHERE clause. We don't currently provision per-domain sub-users.
Are analytics GDPR-compliant?
Click events are collected without cookies. Device type, OS, and browser are inferred from User-Agent. IP is used for geo resolution and then discarded - we don't store raw IPs in click events. City-level geo is stored; if that counts as personal data under your interpretation of GDPR (IP-derived location), configure your workspace to geo-resolve to country only. Country-only resolution is a workspace setting on Business.
What's the difference between analytics on Free, Pro, and Business?
Free: 90-day retention, country + device breakdown, per-link click count. Pro: 12-month retention, full geo/device/referrer/UTM breakdown, hour-of-day heatmap, conversion attribution. Business: 24-month retention, cohort + retention views, read-only analytics DSN, Kafka-compatible firehose, BigQuery/Snowflake/S3 scheduled export.
Can I see analytics for a specific campaign or folder, not just per link?
Yes - campaign-level analytics aggregate across all links tagged to a campaign. Folder-level rollups are available via the API (sum clicks across links in a folder by date range). The dashboard campaign view shows total clicks, conversion rate, UTM distribution, and per-link breakdown for the campaign. There's no 'folder analytics dashboard' in the UI yet - that's on the roadmap.
Keep reading
How analytics-first teams use Elido - read-only analytics DSN, Kafka-compatible firehose, and server-side attribution.
Server-side conversion forwarding setup guides for each platform.
A/B split analytics - per-variant click data and z-test confidence in the same analytics pipeline.
Event schema, event fields, and the analytics endpoint reference.