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
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.
- Step 01
Click short link
elido.me/saleEdge stamps UUID v4
cid: a3f9c1… - Step 02
click_id attached
?elido_cid=a3f9c1…URL param + first-party cookie
cid: a3f9c1… - Step 03
User converts
client_reference_id=a3f9c1…Stripe session carries click_id
cid: a3f9c1… - Step 04
Webhook fires
checkout.session.completedRevenue 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.
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 linkSummed conversion values, any currency, in the original denomination
- CVR over timeConversion rate time-series alongside click volume
- Forwarding to GA4 / Meta CAPIFanned out asynchronously after conversion is recorded
- DeduplicationIdempotent on click_id + event_name — double webhooks don't double-count
| Link | Clicks | Conv. | Revenue | CVR |
|---|---|---|---|---|
| elido.me/bfcm | 18,420 | 847 | €76,280 | 4.6% |
| elido.me/sale | 11,034 | 512 | €41,430 | 4.6% |
| elido.me/nl/shop | 8,901 | 398 | €29,104 | 4.5% |
| elido.me/email-q2 | 6,201 | 201 | €14,872 | 3.2% |
| elido.me/ig-bio | 5,032 | 88 | €6,104 | 1.7% |
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.
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 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 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.
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.
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.”
“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.”
“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.”
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.
| Feature | Elido | Bitly | Short.io |
|---|---|---|---|
| Server-side conversion attribution | Yes — webhook-based, signature-verified | Not available | Not available |
| Stripe webhook integration | checkout.session.completed + payment_intent.succeeded | Not available | Not available |
| Shopify webhook integration | orders/paid — signature-verified, order deduplication | Not available | Not available |
| Custom conversion endpoint | POST /v1/conversions — any backend, any event | Not available | Not available |
| GA4 / Meta CAPI forwarding | Yes — fanned out after conversion is recorded | Not available | Partial — client-side pixel only |
| Revenue in analytics | Per-link and per-campaign revenue summary with currency | Not available | Conversion count only, no revenue |
| Conversion deduplication | Yes — idempotency on click_id + event_name | Not applicable | Not 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.
Keep reading
ClickHouse click analytics — where conversion revenue appears alongside click counts.
Fire Meta CAPI and Google Ads pixels on the redirect — the acquisition side of the conversion loop.
Campaign-level revenue attribution — see which campaign variant drove the most revenue.
HMAC-signed outbound webhooks from Elido — receive conversion-attributed click events in your own systems.