Conversions
Track and measure conversion events from your short links and campaigns
Overview
GrowQR Conversions lets you go beyond click tracking to measure the actions that actually matter — purchases, sign-ups, form submissions, downloads, and any other event you define as a conversion. By connecting the dots between a short link click and a downstream action on your website, you get a complete picture of how your links drive real business outcomes, not just traffic.
Conversion tracking works across all GrowQR assets: short links, QR codes, landing pages, and campaigns. Once configured, every conversion is attributed back to the specific link and channel that initiated it, giving you ROI data that click counts alone can never provide.
What Problem It Solves
Clicks are a vanity metric. A link can generate thousands of clicks and zero revenue. Without conversion tracking, marketers have no way to connect their URL shortener data with business outcomes. They end up cross-referencing Google Analytics goals, e-commerce platform reports, and link click data in spreadsheets — a brittle, error-prone process that breaks every time a UTM parameter is misspelled.
GrowQR Conversions eliminates this gap by embedding conversion tracking directly into the link management workflow. You define what a conversion looks like, and GrowQR handles attribution, deduplication, and reporting automatically.
How It Works
Conversion tracking in GrowQR uses a lightweight JavaScript pixel or server-side webhook to record events:
- A visitor clicks a GrowQR link. The redirect server logs the click and creates a touchpoint — a record that captures the visitor's identity (via IP+User-Agent hash), UTM parameters, referrer, device, and geolocation. This touchpoint is the anchor for all future attribution.
- The visitor lands on your website. The GrowQR pixel (a small JavaScript snippet) sets two first-party cookies on the visitor's browser:
_us_vid— A persistent visitor ID (1-year expiry) that identifies the visitor across sessions._us_sid— A session ID (30-minute expiry) that groups events within a single browsing session.
- A conversion event fires. This happens through the pixel's
trackConversion()function on your conversion page (thank-you page, post-signup page, etc.) or via a server-side webhook call from your backend. - GrowQR matches the event to the original click touchpoint using the visitor ID. Since the redirect flow hashes the visitor's IP+User-Agent to the same value, and the pixel sends the cookie-based
visitorId, the system ties them together within the configured attribution window. - The conversion appears in the link's analytics, the campaign dashboard, and the Conversions report — with full attribution data.
The attribution window is configurable per goal (default: 30 days), so conversions that happen days or weeks after the initial click are still captured.
Step-by-Step Usage
Creating a Conversion Goal
Conversion goals tell GrowQR which events to track and how to value them.
- Go to Dashboard → Conversions.
- Click New Goal and configure:
| Field | Description |
|---|---|
| Name | Human-readable label (e.g., "Purchase", "Newsletter Sign-up") |
| Type | PAGE_VIEW, FORM_SUBMIT, PURCHASE, SIGNUP, DOWNLOAD, or CUSTOM |
| Attribution Model | FIRST_TOUCH, LAST_TOUCH, LINEAR, TIME_DECAY, or POSITION_BASED |
| Attribution Window | How many hours after a click a conversion can be attributed (default: 720 hours / 30 days) |
| Default Value | Optional monetary value assigned to each conversion (used when no value is passed at tracking time) |
| Currency | Currency code for revenue tracking (e.g., USD, EUR) |
| URL Pattern | Optional URL pattern to auto-match page views as conversions |
| Campaign | Optionally scope the goal to a specific campaign |
- Click Save. GrowQR generates a unique Pixel ID (
px_...) for this goal.
Getting the Tracking Pixel Snippet
- Go to Dashboard → Conversions → Goals.
- Click the goal you want to track.
- Click Get Pixel Snippet.
- GrowQR returns a JavaScript snippet you paste into your website's HTML. The snippet:
<!-- Conversion Tracking Pixel -->
<script>
(function() {
var px = 'px_abc123...';
var endpoint = 'https://your-backend.com/api/track/conversion';
// Cookie helpers for visitor/session persistence
function getCookie(name) { /* ... */ }
function setCookie(name, val, days) { /* ... */ }
function uuid() { /* ... */ }
// Persist visitor ID across sessions (1-year cookie)
var visitorId = getCookie('_us_vid');
if (!visitorId) { visitorId = uuid(); setCookie('_us_vid', visitorId, 365); }
// Persist session ID within a browsing session (30-min cookie)
var sessionId = getCookie('_us_sid');
if (!sessionId) { sessionId = uuid(); setCookie('_us_sid', sessionId, 0.0208); }
// Extract UTM parameters from the current URL
var params = new URLSearchParams(location.search);
// Track a conversion event
window.trackConversion = function(opts) {
opts = opts || {};
var data = {
pixelId: px,
visitorId: visitorId,
sessionId: sessionId,
value: opts.value,
currency: opts.currency,
metadata: opts.metadata,
referrer: document.referrer,
utmSource: params.get('utm_source'),
utmMedium: params.get('utm_medium'),
utmCampaign: params.get('utm_campaign'),
utmTerm: params.get('utm_term'),
utmContent: params.get('utm_content'),
};
fetch(endpoint, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data),
keepalive: true,
}).catch(function() {});
};
// Convenience: track a page view
window.trackPageView = function(opts) {
opts = opts || {};
window.trackConversion({
metadata: Object.assign({
eventType: 'page_view',
url: location.href,
title: document.title
}, opts)
});
};
})();
</script>- Paste this snippet into the
<head>of every page where conversions can occur (or add it site-wide via a tag manager).
Tracking Events
Once the pixel is installed, use the global functions to track activity:
Track a page view (landing page visit):
trackPageView();Track a signup:
trackConversion({
metadata: { eventType: 'signup', plan: 'free-trial' }
});Track a checkout start:
trackConversion({
metadata: { eventType: 'checkout', cartItems: 3 }
});Track a purchase with revenue:
trackConversion({
value: 99.99,
currency: 'USD',
metadata: {
eventType: 'purchase',
orderId: 'ORD-20260305-001',
plan: 'pro-annual'
}
});Using the Webhook / Server-Side Endpoint
If you can't place a JavaScript pixel (e.g., for server-side events, mobile app conversions, or offline transactions), send conversion data directly to the API:
Public tracking endpoint (no authentication required):
curl -X POST https://your-backend.com/api/track/conversion \
-H "Content-Type: application/json" \
-d '{
"pixelId": "px_abc123...",
"visitorId": "visitor-uuid-from-cookie",
"sessionId": "session-uuid-from-cookie",
"value": 49.99,
"currency": "USD",
"metadata": {
"eventType": "purchase",
"orderId": "ORD-20260305-001"
},
"utmSource": "email",
"utmMedium": "newsletter"
}'Webhook ingestion endpoint:
curl -X POST https://your-backend.com/api/conversions/webhook \
-H "Content-Type: application/json" \
-d '{
"pixelId": "px_abc123...",
"visitorId": "visitor-uuid",
"revenue": 49.99,
"currency": "USD",
"eventType": "purchase",
"metadata": { "orderId": "ORD-20260305-001" },
"utmSource": "partner",
"utmMedium": "referral"
}'Image pixel for email/basic tracking:
<img src="https://your-backend.com/api/track/pixel/px_abc123" width="1" height="1" />Viewing Conversion Data
Navigate to Dashboard → Conversions to see an aggregated report:
- Total conversions and conversion rate (conversions / unique clicks)
- Revenue tracked (sum of all revenue-based conversion values)
- Conversions by date — daily conversion volume with revenue overlay
- Conversions by source — which traffic sources (utm_source) drove the most conversions
- Conversions by channel — aggregate by channel (utm_medium)
Click any goal to drill into individual conversion events, each showing the attributed click, timestamp, referrer, visitor ID, session ID, and metadata.
Visitor Identity and Attribution
GrowQR uses two complementary mechanisms to identify visitors across the click-to-conversion journey:
| Mechanism | How It Works | Strengths | Limitations |
|---|---|---|---|
| IP+User-Agent hash | The redirect server hashes the visitor's IP address and User-Agent string into a deterministic visitorId. This same hash is used when the pixel doesn't send an explicit visitorId. | Works without cookies; automatic; no pixel required on the landing page. | Unstable across networks (e.g., office Wi-Fi → home); shared by users behind the same NAT. |
Cookie-based _us_vid | The pixel sets a first-party cookie on the visitor's browser. This visitorId is sent with every trackConversion() call. | Persistent across sessions (1-year expiry); unique per browser; more reliable than IP hashing. | Requires the pixel to be installed; blocked by strict cookie policies or incognito mode. |
For best results, install the pixel on all pages so the cookie-based visitor ID is used. The IP+UA hash serves as a fallback when cookies are unavailable.
Best Practices
- Install the pixel site-wide. Even if conversions only happen on specific pages, the pixel sets the visitor ID cookie on first page load. This ensures the cookie is present when the visitor eventually converts.
- Always pass a monetary value for revenue-based goals. Even estimated values are better than none — they let you calculate ROI at the link and campaign level.
- Use the
orderIdor a deduplication key in metadata to prevent double-counting conversions from page refreshes or retries. - Set an appropriate attribution window. Short windows (24–168 hours) work for impulse purchases; longer windows (720+ hours) suit B2B or high-consideration products.
- Track every step of your funnel. Use
trackPageView()for page visits andtrackConversion()for actions. This feeds data into funnels and attribution reports. - Combine pixel and webhook tracking for maximum coverage. Use the pixel for web conversions and webhooks for server-side, mobile, or offline events.
- Test in a staging environment first. Verify events are reaching the API by checking the goal's recent conversions list before going live.
Example Workflows
E-Commerce: Full Purchase Funnel
Track every step from link click to purchase:
-
Create four conversion goals:
- "Landing Page View" (type:
PAGE_VIEW) - "Signup" (type:
SIGNUP) - "Checkout" (type:
CUSTOM, default value: 0) - "Purchase" (type:
PURCHASE, default value: 49.99, currency: USD)
- "Landing Page View" (type:
-
Install the pixel on your e-commerce site (all pages).
-
Add tracking calls at each step:
// Step 1: Landing page — fires automatically on page load
trackPageView();
// Step 2: After user signs up
trackConversion({
metadata: { eventType: 'signup', email: user.email }
});
// Step 3: When user starts checkout
trackConversion({
metadata: { eventType: 'checkout', cartTotal: 149.97, itemCount: 3 }
});
// Step 4: After purchase completes
trackConversion({
value: 149.97,
currency: 'USD',
metadata: {
eventType: 'purchase',
orderId: 'ORD-20260305-001',
items: ['SKU-001', 'SKU-002', 'SKU-003']
}
});- Create short links for your product pages and share them across email and social campaigns.
- Create a funnel (Dashboard → Funnels) with stages: Link Click → Landing Page View → Signup → Checkout → Purchase.
- Review results in Conversions and Funnels dashboards after a week.
SaaS Trial Sign-Up Funnel
- Create goals: "Trial Signup" (type:
SIGNUP), "First Login" (type:CUSTOM), "Plan Upgrade" (type:PURCHASE). - Install the pixel on your marketing site and app.
- Track events:
// On pricing/landing page
trackPageView();
// After trial signup
trackConversion({ metadata: { eventType: 'trial_signup' } });
// After first login to the app
trackConversion({ metadata: { eventType: 'first_login' } });
// After plan upgrade
trackConversion({
value: 29.00,
currency: 'USD',
metadata: { eventType: 'plan_upgrade', plan: 'pro-monthly' }
});- Create a campaign with short links for each acquisition channel (blog, paid search, partner referrals).
- After two weeks, compare conversion rates by channel in the Attribution report.
Offline-to-Online Conversion
- Print QR codes on in-store signage that point to a product page via GrowQR.
- The pixel on your product page sets the
_us_vidcookie when the visitor scans the QR code. - When the visitor completes an in-store pickup order, your POS system sends a webhook conversion event with the visitor's stored
visitorId. - GrowQR attributes the purchase back to the specific QR code and store location via the touchpoint created during the QR scan.