Elido
Everything Elido does
Pro & Business

Conversion tracking. Attribute every dollar to the click that earned it.

Stripe and Shopify webhook receivers verify signatures and tie revenue back to the originating short link. Campaign attribution is derived automatically.

  • Server-side Stripe & Shopify attribution
  • click_id passthrough — no client JS needed
  • Revenue by link, campaign, day, platform
  • Automatic HMAC signature verification
elido.app — conversion attribution
elido.me/saleClickclick_id set?elido_cid=a3f9…cookie: cid=a3f9…Stripe Checkoutclient_ref = a3f9…€ 99.00 paidcheckout.session.completed webhook+€99 attributed
Server-side, no pixel gapsHMAC verified
Server-side
Attribution method (no pixel gaps)
<5s
Conversion event ingest lag
100%
Attribution accuracy (no sampling)
3
Forwarding destinations (GA4, Meta, Mixpanel)

How it works

The click_id travels the entire funnel

A UUID is stamped at click time and passed through every step — URL parameter, session cookie, Stripe session, Shopify order — until the webhook fires and closes the attribution loop server-side. No client JavaScript is required for the attribution itself.

  1. Step 01

    Click short link

    elido.me/sale

    Edge stamps UUID v4

    cid: a3f9c1…
  2. Step 02

    click_id attached

    ?elido_cid=a3f9c1…

    URL param + first-party cookie

    cid: a3f9c1…
  3. Step 03

    User converts

    client_reference_id=a3f9c1…

    Stripe session carries click_id

    cid: a3f9c1…
  4. Step 04

    Webhook fires

    checkout.session.completed

    Revenue attributed to originating link

    cid: a3f9c1…

Integrations

Drop-in webhook receivers for Stripe and Shopify

Register the endpoint in your dashboard, paste the signing secret, and attribution starts flowing. HMAC signature verification happens before any payload is processed — spoofed webhooks are rejected before they touch your data.

Stripe
checkout.session.completed · payment_intent.succeeded
HMAC verified
Webhook endpoint
POSThttps://api.elido.app/webhooks/stripe
1. Verify Stripe-Signature header
2. Extract client_reference_id → match click_id
3. Record revenue against originating link
Server-side, no client JavaScript required
Shopify
orders/paid — order deduplication included
HMAC verified
Webhook endpoint
POSThttps://api.elido.app/webhooks/shopify
1. Verify X-Shopify-Hmac-Sha256 header
2. Read click_id from order note_attributes
3. Deduplicate by order ID, attribute revenue
Server-side, no client JavaScript required

Revenue dashboard

Revenue per link, per campaign, per day

Every short link gets a live revenue total — sum of all attributable conversion values through that link. Filter by campaign tag, date range, or platform. Export as CSV or stream to BigQuery via scheduled exports.

  • Revenue per link
    Summed conversion values, any currency, in the original denomination
  • CVR over time
    Conversion rate time-series alongside click volume
  • Forwarding to GA4 / Meta CAPI
    Fanned out asynchronously after conversion is recorded
  • Deduplication
    Idempotent on click_id + event_name — double webhooks don't double-count
Revenue attribution — last 30 days
Live
Revenue trend168k total
LinkClicksConv.RevenueCVR
elido.me/bfcm18,420847
76,280
4.6%
elido.me/sale11,034512
41,430
4.6%
elido.me/nl/shop8,901398
29,104
4.5%
elido.me/email-q26,201201
14,872
3.2%
elido.me/ig-bio5,03288
6,104
1.7%
Total revenue
167,790
Total conversions
2,046
Avg CVR
4.1%

What you can do

  • Stripe checkout.session.completed
  • Stripe payment_intent.succeeded
  • Shopify orders/paid
  • Campaign attribution derived from link
  • Revenue summary in dashboard

How server-side conversion attribution works end to end

Client-side pixels drop 20–40% of conversions due to adblockers, iOS privacy restrictions, and checkout redirect chains. Server-side attribution closes the gap.

Click ID passthrough
01

Every click gets a UUID passed to the destination — the attribution anchor for conversion matching

When a user clicks an Elido short link, the edge generates a click_id (UUID v4) and appends it as a query parameter (elido_cid) to the destination URL. Your checkout flow should preserve this parameter through every page in the funnel — most SPA routers and server-rendered checkout stacks forward unknown query params by default, but multi-step checkouts with redirect chains may strip them. The click_id is also stored in a session cookie on the destination domain if you embed Elido's 2KB attribution snippet (optional). Test the full checkout flow before going live: click a short link, complete a test purchase, verify the elido_cid appears in the conversion POST. If it doesn't, add query-param forwarding in your checkout middleware. This is the most common attribution setup failure — not the webhook, but query-param loss in checkout.

Stripe integration
02

Stripe webhook receiver verifies signatures and attributes checkout.session.completed and payment_intent.succeeded events

Register Elido's Stripe webhook endpoint in your Stripe dashboard (Settings → Webhooks → Add endpoint). Elido listens for checkout.session.completed and payment_intent.succeeded events. On each event, Elido verifies the Stripe-Signature header using your webhook signing secret, extracts the payment amount and currency, looks up the click_id stored against the Checkout Session's client_reference_id (which your checkout must populate — see the guide), and records the conversion against that click. The revenue and click_id are then available in the link's analytics view and in the campaign revenue summary. The Checkout Session's client_reference_id field is the recommended pass-through; alternatively, use Stripe's metadata field with key elido_cid if you're using PaymentIntents directly. Full setup takes about 30 minutes if your Stripe integration already handles webhooks.

Shopify integration
03

Shopify orders/paid webhook ties order revenue to the originating short-link click

Register Elido's Shopify webhook endpoint in your Shopify admin (Settings → Notifications → Webhooks → Create webhook → Topic: orders/paid). Elido verifies the X-Shopify-Hmac-Sha256 header, extracts the order total and currency, and looks up the elido_cid from the order's note_attributes (you populate this from the cart using Shopify's cart note_attributes API, passing the click_id from the session cookie or URL parameter). For Shopify stores using Online Store 2.0 themes, Elido's attribution snippet injects the click_id into the cart automatically on click. Orders attributed are deduplicated by order ID so refunded-and-replaced orders don't double-count. Shopify Plus stores with custom checkout extensions can pass the click_id through a more reliable channel — the setup guide covers the Plus-specific flow.

Custom conversion events
04

POST to Elido's conversion endpoint from any backend — not just Stripe and Shopify

POST /v1/conversions with a JSON body: { click_id: "...", event_name: "purchase", value: 99.00, currency: "EUR", metadata: {} }. The click_id is the elido_cid from the click. Elido authenticates the request with your workspace API key (HMAC-SHA256 over the payload body recommended for added security). This endpoint covers any conversion not handled by the native Stripe or Shopify integrations: WooCommerce, custom SaaS trial activations, lead-form submissions, phone call conversions tracked by your telephony platform. The event_name field is free-text; use any naming convention your team prefers — it's displayed as-is in the analytics view. Idempotency: POST the same click_id + event_name combination twice and only the first is recorded. Event value and metadata are mutable on the first write only.

Downstream forwarding
05

Fan conversions out to GA4 Measurement Protocol, Meta CAPI, and Mixpanel server-track simultaneously

After Elido records a conversion against a click, it fans the event to whichever server-side forwarding destinations you've enabled: GA4 Measurement Protocol (the event appears in GA4 as a server-side purchase event with the original UTM parameters from the click), Meta Conversions API (the event deduplicates against the client-side pixel if both are firing, using the event_id from the click_id), and Mixpanel server-track (the event is sent with the distinct_id from Mixpanel's $identify call if you've configured cross-identity). Forwarding happens asynchronously after the conversion is recorded — it doesn't block the webhook response to Stripe or Shopify. Failed forwarding events are retried with exponential backoff for 24 hours, then dropped with a log entry. You can see forwarding status per conversion in the dashboard.

Revenue teams using Elido conversion tracking

Names are placeholders — real customer case studies land here as they are published.

iOS 14.5 killed our Meta Pixel attribution on 30% of mobile purchases. Server-side Stripe webhook through Elido recovered most of it — the click_id passthrough into Stripe's client_reference_id was the key. Setup was one afternoon.

E
E-commerce team, D2C brand, Warsaw
Head of E-commerce

We POST trial activations to Elido's custom conversion endpoint. The click → trial → paid conversion chain is now traceable end to end without a full CDP. The GA4 Measurement Protocol forwarding means our paid channel dashboards are accurate again.

M
Marketing data, B2B SaaS, Lisbon
Marketing Data Engineer

Shopify orders/paid webhook plus the attribution snippet in the theme was a one-day integration. Revenue-per-campaign is now a live number in our morning standup, not a spreadsheet formula someone has to update.

G
Growth engineering, fintech, Riga
Growth Engineer

Elido conversion tracking vs Bitly vs Short.io

Bitly has no server-side conversion tracking. Short.io has basic conversion pixels. Elido's conversion tracking is server-side and forwards to multiple ad platforms.

FeatureElidoBitlyShort.io
Server-side conversion attributionYes — webhook-based, signature-verifiedNot availableNot available
Stripe webhook integrationcheckout.session.completed + payment_intent.succeededNot availableNot available
Shopify webhook integrationorders/paid — signature-verified, order deduplicationNot availableNot available
Custom conversion endpointPOST /v1/conversions — any backend, any eventNot availableNot available
GA4 / Meta CAPI forwardingYes — fanned out after conversion is recordedNot availablePartial — client-side pixel only
Revenue in analyticsPer-link and per-campaign revenue summary with currencyNot availableConversion count only, no revenue
Conversion deduplicationYes — idempotency on click_id + event_nameNot applicableNot available

Conversion tracking questions

What if the click_id is stripped before conversion?

If the elido_cid query parameter is lost before the conversion event fires — due to a redirect chain, SPA router not forwarding query params, or third-party checkout stripping unknown parameters — the conversion cannot be attributed. Test the full funnel: click a short link, trace the elido_cid through every page to the checkout confirmation, verify it appears in the conversion POST. The Elido attribution snippet (a small JavaScript block) also sets the click_id in a first-party cookie as a fallback — if the URL parameter is lost but the user is still in the same browser session, attribution can recover from the cookie.

How are refunds handled in conversion attribution?

Elido does not automatically process refund events. If a Stripe charge.refunded or Shopify refunds/create event fires, Elido does not debit the attributed revenue. You can POST a negative-value conversion event to the custom endpoint to reverse attribution manually. A refund webhook listener is on the roadmap. Until then, if you need accurate net revenue in Elido, subtract refund totals using the export data and your order management system.

Does conversion tracking work if the user completes checkout on a different device?

No — if the user clicks the short link on mobile but completes checkout on desktop, the click_id is not transferred between devices. The conversion will be unattributed unless the user's session preserved the elido_cid across the device switch (e.g., via a logged-in account that stored it). Cross-device attribution requires a server-side identity graph, which Elido does not provide. For cross-device attribution accuracy, use your MMP or CDP alongside Elido's server-side conversions.

What currencies are supported for revenue attribution?

All ISO 4217 currency codes are accepted in the value field of a conversion event. Revenue is stored in the original currency; the analytics dashboard shows revenue in the currency of each conversion event. If you need a rolled-up view in a single currency, export the conversion events and convert in your warehouse — Elido does not apply FX conversion rates.

How do I set up the Stripe client_reference_id passthrough?

When creating a Stripe Checkout Session, set client_reference_id to the value of the elido_cid URL parameter from the referring click. In JavaScript: const session = await stripe.checkout.sessions.create({ ..., client_reference_id: searchParams.get('elido_cid') }). Elido's webhook handler reads this field from checkout.session.completed. If you're using PaymentIntents directly, use the metadata field with key elido_cid instead. The setup guide at /docs/guides/conversion-tracking has copy-paste code for Node, Python, and Go.

Is conversion data included in ClickHouse exports?

Yes. Conversion events are stored in a separate ClickHouse table (conversions) alongside the click events table (clicks). Scheduled exports to S3, BigQuery, or Snowflake include both tables. The JOIN key is click_id. A reference SQL query that joins clicks to conversions and computes revenue per campaign UTM source is in the export guide.

Can I track non-revenue conversions like form fills or trial activations?

Yes — the custom conversion endpoint accepts any event_name and an optional value (set to 0 for non-revenue events). Use event names like 'trial_started', 'demo_booked', 'form_submitted'. These appear in the link's analytics view under 'Conversions' with the event name as the label. If you also forward to GA4, these map to custom GA4 events. Conversion counts (not just revenue) are visible per-link and per-campaign regardless of event value.

What's the latency from conversion event receipt to analytics visibility?

Webhook receipt to ClickHouse: typically under 5 seconds via the same Redpanda pipeline as click events. Attribution (matching the conversion to the originating click) happens synchronously at webhook receipt — if the click_id resolves, attribution is immediate. Downstream forwarding to GA4 / Meta CAPI / Mixpanel is asynchronous and adds 2–10 seconds. The revenue number in the dashboard analytics view updates within 30 seconds of the conversion event being received.

Ready to try it?

Start on the free plan, upgrade when you need a custom domain.

Conversion tracking — Attribute Stripe and Shopify orders to clicks. · Elido