Partner Integration

Track every QR scan back to your platform

Send traffic to QR Attribution with UTM parameters and get source-level scan analytics — no API key required.

1 Attribution parameters

Append standard UTM parameters to any qrattribution.com URL. These are recorded on every tracked link created through your embed and surface in the source attribution dashboard.

Parameter Purpose Example value
utm_source Required Identifies your platform as the traffic origin. Use a stable, lowercase slug. acme_app
utm_medium Required The channel type. Use partner_embed for in-app embeds, or referral for link placements. partner_embed
utm_campaign Recommended Cohort or campaign name. Useful for A/B tests or seasonal promotions. spring_launch
utm_content Optional Differentiates placements within the same campaign (e.g. button vs. sidebar). header_cta
ref Optional Short-form referral token. Shown in source dashboard alongside UTM data. acme

2 UTM link builder

Fill in your platform details to generate a prefilled attribution link. Drop this link anywhere — email, docs, your app's onboarding flow — and all QR codes created from it will be tagged to your source.

Lowercase, no spaces. Use underscores.

4 "Track with QR Attribution" badge

Add a lightweight badge to your product that lets users create tracked QR codes. No JavaScript dependencies — pure HTML. Replace YOUR_SOURCE with your platform slug.

ℹ️ The badge links directly to the QR Attribution builder. Users who click it will have their QR scans attributed to your platform automatically via the utm_source parameter.

HTML snippet

<a href="https://qrattribution.com/?utm_source=YOUR_SOURCE&utm_medium=partner_embed" target="_blank" rel="noopener noreferrer" style="display:inline-flex;align-items:center;gap:7px;padding:6px 12px 6px 8px; background:#0b1a2b;color:#f6f0e8;border-radius:8px;text-decoration:none; font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif; font-size:12px;font-weight:700;white-space:nowrap;" > <svg width="16" height="16" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> <rect x="2" y="2" width="7" height="7" rx="1.5" stroke="#d9a441" stroke-width="1.8"/> <rect x="11" y="2" width="7" height="7" rx="1.5" stroke="#d9a441" stroke-width="1.8"/> <rect x="2" y="11" width="7" height="7" rx="1.5" stroke="#d9a441" stroke-width="1.8"/> <rect x="4.5" y="4.5" width="2" height="2" fill="#d9a441"/> <rect x="13.5" y="4.5" width="2" height="2" fill="#d9a441"/> <rect x="4.5" y="13.5" width="2" height="2" fill="#d9a441"/> <path d="M11 14h2v2h-2zM13 12h2v2h-2zM15 14h2v2h-2zM13 16h4v2h-4z" fill="#d9a441"/> </svg> <span style="display:flex;flex-direction:column;line-height:1.2"> <span style="font-size:9px;font-weight:400;opacity:.7; text-transform:uppercase;letter-spacing:.06em">Track with</span> <span>QR Attribution</span> </span> </a>

React / JSX snippet

// Replace YOUR_SOURCE with your platform slug const QRAttributionBadge = ({ source, campaign }) => { const params = new URLSearchParams({ utm_source: source, utm_medium: "partner_embed", ...(campaign && { utm_campaign: campaign }), }); return ( <a href={`https://qrattribution.com/?${params}`} target="_blank" rel="noopener noreferrer" style={{ display: "inline-flex", alignItems: "center", gap: 7, padding: "6px 12px 6px 8px", background: "#0b1a2b", color: "#f6f0e8", borderRadius: 8, textDecoration: "none", fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif", fontSize: 12, fontWeight: 700, whiteSpace: "nowrap", }} > {/* QR icon — inline SVG, no dependencies */} <svg width="16" height="16" viewBox="0 0 20 20" fill="none"> <rect x="2" y="2" width="7" height="7" rx="1.5" stroke="#d9a441" strokeWidth="1.8"/> <rect x="11" y="2" width="7" height="7" rx="1.5" stroke="#d9a441" strokeWidth="1.8"/> <rect x="2" y="11" width="7" height="7" rx="1.5" stroke="#d9a441" strokeWidth="1.8"/> <rect x="4.5" y="4.5" width="2" height="2" fill="#d9a441"/> <rect x="13.5" y="4.5" width="2" height="2" fill="#d9a441"/> <rect x="4.5" y="13.5" width="2" height="2" fill="#d9a441"/> <path d="M11 14h2v2h-2zM13 12h2v2h-2zM15 14h2v2h-2zM13 16h4v2h-4z" fill="#d9a441"/> </svg> <span style={{ display: "flex", flexDirection: "column", lineHeight: 1.2 }}> <span style={{ fontSize: 9, fontWeight: 400, opacity: .7, textTransform: "uppercase", letterSpacing: "0.06em" }}> Track with </span> <span>QR Attribution</span> </span> </a> ); }; // Usage <QRAttributionBadge source="acme_app" campaign="spring_launch" />

5 How attribution works end-to-end

Understanding the full flow helps you design integration checkpoints and verify data in your own analytics pipeline.

  1. A user arrives at qrattribution.com via your link with UTM parameters.
  2. The builder records the UTM values in the browser session.
  3. When the user creates a tracked link, those UTM values are stored alongside the link record.
  4. Every scan of the resulting QR code is counted and associated with your utm_source.
  5. Aggregate scan data appears in the source attribution dashboard broken down by source, medium, and campaign.
📊 Want a real-time view of scans from your platform? Email us at hello@qrattribution.com to request partner-level dashboard access with a filtered view for your utm_source.