Documentation

Everything you need to install, configure, and use Lynq Studio — for websites, web apps, and mobile apps. All tracking runs on your own domain; these docs show you how.

Quick Start#

Three steps from zero to live data. Most installs are done inside 15 minutes — and we do them together with you.

Your own tracking domain

During onboarding we set up a tracking subdomain on your domain — e.g. data.your-domain.com. The script, the collection endpoint and the cookies all live there, which is what makes the setup first-party. Every snippet below uses that subdomain; your real values are in Dashboard → Settings.
1

Get your workspace

Lynq is sales-led: your workspace, tracking subdomain and event schema are set up during onboarding with our team. Book a call — you'll leave it with a live dashboard and a website ID (lq_…).

2

Install the tracking code

Add this snippet before the closing </head> tag. The script is ~2 KB and loads with defer, so it never blocks rendering:

index.html
<script defer
  src="https://data.your-domain.com/lynq.js"
  data-website-id="lq_xxxxxxxxxxxx"
  data-endpoint="https://data.your-domain.com/api/collect">
</script>
3

Watch the first events arrive

Open Dashboard → Realtime and visit your site in another tab. Page views, session and source data appear within seconds. If nothing shows up after a minute, the FAQ covers the usual suspects.

What happens automatically

With just the snippet installed — no extra code — Lynq already tracks:

SignalHow
page_viewEvery page load, and client-side navigation in SPAs (pushState / replaceState)
session30-minute inactivity window; sessions stitch page views together
source / mediumUTM parameters, or referrer classification when UTMs are absent
device & geoBrowser, OS, screen class and city-level location, parsed server-side
attributionLast external touch, stored first-party for 90 days

Installation Methods#

The same snippet, adapted to your stack. Pick the one that matches how your site is built.

HTML (any site)

Paste before </head>:

index.html
<script defer
  src="https://data.your-domain.com/lynq.js"
  data-website-id="lq_xxxxxxxxxxxx"
  data-endpoint="https://data.your-domain.com/api/collect">
</script>

Google Tag Manager

Create a Custom HTML tag with the trigger All Pages — Page View:

GTM · Custom HTML tag
<script>
  (function(){
    var s = document.createElement('script');
    s.defer = true;
    s.src = 'https://data.your-domain.com/lynq.js';
    s.dataset.websiteId = 'lq_xxxxxxxxxxxx';
    s.dataset.endpoint = 'https://data.your-domain.com/api/collect';
    document.head.appendChild(s);
  })();
</script>

Already have a dataLayer?

If your site pushes GA4-style e-commerce events to the dataLayer, we map them to Lynq events during onboarding — no need to re-instrument your store.

Next.js / React

app/layout.tsx
import Script from 'next/script';

export default function Layout({ children }) {
  return (
    <html>
      <head>
        <Script
          src="https://data.your-domain.com/lynq.js"
          data-website-id="lq_xxxxxxxxxxxx"
          data-endpoint="https://data.your-domain.com/api/collect"
          strategy="afterInteractive"
        />
      </head>
      <body>{children}</body>
    </html>
  );
}

WordPress

Add to your theme's functions.php:

functions.php
function lynq_tracking() {
  echo '<script defer src="https://data.your-domain.com/lynq.js"
    data-website-id="lq_xxxxxxxxxxxx"
    data-endpoint="https://data.your-domain.com/api/collect"></script>';
}
add_action('wp_head', 'lynq_tracking');

Shopify

Go to Online Store → Themes → Edit code → theme.liquid and paste the HTML snippet before </head>. For checkout and purchase events we set up the additional scripts during onboarding, since Shopify's checkout is sandboxed.

Event Tracking#

Page views and sessions are automatic. Everything else your business cares about — sign-ups, downloads, form submits — goes through the global lynq() function.

Basic event

your-site.js
lynq('track', 'button_click', {
  button_name: 'Sign Up',
  page: '/pricing'
});

Event parameters

ParameterTypeDescription
event_typestringRequired. Name of the event. Use snake_case for consistency.
paramsobjectOptional. Key-value pairs. Max 20 params per event.
valuenumberOptional. Numeric value — revenue, duration, quantity.
currencystringOptional. ISO code (TRY, USD, EUR).

Common patterns

examples.js
// Form submission
lynq('track', 'form_submit', { form_name: 'Newsletter' });

// Video play
lynq('track', 'video_play', { video_title: 'Product Demo', duration: 120 });

// File download
lynq('track', 'file_download', { file_name: 'whitepaper.pdf' });

// Site search
lynq('track', 'search', { search_term: 'analytics', results_count: 12 });

// Login
lynq('track', 'login', { method: 'google' });

Never put personal data in events

Event names and params must not contain emails, names, phone numbers or free-text form input. The pipeline validates payloads, but keeping PII out at the source is your responsibility — and it keeps your GDPR position clean. See Collected Data.

E-Commerce Tracking#

Track the full purchase funnel — product views, cart actions, checkout and purchases — and every report from revenue-per-source to assisted conversions lights up.

Product view

product-page.js
lynq('track', 'view_item', {
  item_id: 'SKU-12345',
  item_name: 'Wireless Headphones',
  item_brand: 'AudioTech',
  item_category: 'Electronics',
  price: 299.99,
  currency: 'TRY'
});

Add to cart

cart.js
lynq('track', 'add_to_cart', {
  item_id: 'SKU-12345',
  item_name: 'Wireless Headphones',
  quantity: 1,
  price: 299.99,
  currency: 'TRY'
});

Purchase

thank-you.js
lynq('track', 'purchase', {
  transaction_id: 'T-98765',
  items: [
    { item_id: 'SKU-12345', item_name: 'Wireless Headphones', quantity: 1, price: 299.99 },
    { item_id: 'SKU-67890', item_name: 'Phone Case', quantity: 2, price: 49.99 }
  ],
  value: 399.97,
  currency: 'TRY',
  shipping: 15.00,
  tax: 72.00
});

transaction_id prevents double counting

Fire purchase on the thank-you page and always include your order reference. If the page is reloaded, the event is deduplicated by transaction_id — revenue is never counted twice.

The full funnel

EventWhen to fire
view_item_listUser views a product category or search results
view_itemUser views a product detail page
add_to_cartUser adds a product to cart
remove_from_cartUser removes a product from cart
begin_checkoutUser starts the checkout flow
add_payment_infoUser submits payment information
purchaseTransaction completes successfully

Fire all seven and the E-Commerce report shows exactly where the funnel leaks — step by step, with drop-off percentages per source.

Attribution Model#

Lynq uses a last external touch model, stored in a first-party cookie. The result: a returning visitor who bought three weeks after clicking your ad is still credited to that ad — not to "direct".

1

A visitor arrives with UTM parameters. They are stored in a first-party cookie (_lynq_attr) with a 90-day lifetime.

2

The visitor returns via a different paid or organic channel — the cookie updates to the new source (last external touch).

3

The visitor returns directly (no referrer) — the previous attribution is preserved. Direct visits never overwrite campaign data.

4

After 30 days with no external touch, campaign attribution expires and the visitor is classified as "direct / returning".

Why your numbers won't match GA4

GA4 samples, models consent gaps, and its cookies get cut short by browsers. Lynq counts every visitor and keeps attribution first-party for 90 days. Expect Lynq to report more attributed conversions and less "direct" traffic — that's the point.

UTM parameters

ParameterExampleUsage
utm_sourcegoogleTraffic source
utm_mediumcpcMarketing medium
utm_campaignsummer_saleCampaign name
utm_termanalytics+toolPaid keyword
utm_contentbanner_v2Ad variation

Referrer classification

Without UTMs, the source is classified from the referrer domain:

Referrer containsSource / Medium
google.com, google.com.trGoogle / organic
instagram.com, l.instagram.comInstagram / social
facebook.com, l.facebook.comFacebook / social
t.co, twitter.com, x.comTwitter / social
linkedin.comLinkedIn / social
Other external domaindomain.com / referral

Collected Data Reference#

Every event Lynq records is built from the fields below — nothing more. This is the complete list you can hand to your legal and security teams.

Event & page

FieldExampleNotes
event_typepage_view, purchaseWhat happened
url_path/products/watchPath only — query strings are stripped of PII
page_titleSmart Watch XDocument title
referrer_domaingoogle.comDomain only, no full URLs
ts2026-08-06 14:00:00Server-side timestamp (UTC)

Visitor & session

FieldExampleNotes
client_ida3f9…e2Random ID in a first-party cookie — no fingerprinting
session_idb7c1…90Rotates after 30 minutes of inactivity
ip_hash9f2c81d4e7a3b6f0SHA-256 with daily-rotating salt, truncated — raw IP never stored
browser / os / device_typeChrome / iOS / mobileParsed server-side from the user agent
screen390×844Viewport size class
country / cityTR / IstanbulGeoIP at city level — never precise location

E-commerce (when sent)

FieldExampleNotes
value / currency289.00 / TRYOrder or event value
transaction_idORD-22961Your order reference — used for deduplication
items[]id, name, price, qty…Product data only — no buyer details

What is never collected

Names, email addresses, phone numbers, form field contents, passwords, payment details, precise location, or any browser fingerprint. If a URL contains an email or token in its query string, it is stripped before storage. Visitors are anonymous by design — there is no profile to request or delete under a GDPR subject-access request.

API Reference#

Everything in the dashboard is available over HTTPS as JSON or CSV. Authenticate with a JWT Bearer token or an admin API key.

Authentication

terminal
# Option 1: JWT Bearer token
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
  https://data.your-domain.com/api/admin/report/pages

# Option 2: Admin API key
curl -H "X-Admin-Key: YOUR_ADMIN_KEY" \
  https://data.your-domain.com/api/admin/report/pages

Report endpoints

GET/api/admin/report/pages
GET/api/admin/report/sources
GET/api/admin/report/devices
GET/api/admin/report/geography
GET/api/admin/report/ecommerce
GET/api/admin/report/events
GET/api/admin/report/campaigns
GET/api/admin/report/assisted-conversions
GET/api/admin/report/journey
GET/api/admin/live

Query parameters

ParamExampleDescription
hours168Relative time range (last N hours)
from2026-02-01Start date (YYYY-MM-DD)
to2026-02-10End date (YYYY-MM-DD)
websiteIdlq_xxxxFilter by website or app project

Data collection endpoint

The endpoint the tracker posts to. You can also call it server-side — useful for backend conversions like subscription renewals:

POST /api/collect
{
  "website_id": "lq_xxxxxxxxxxxx",
  "event_type": "page_view",
  "url": "https://example.com/products",
  "title": "Products — Example Store",
  "referrer": "https://google.com",
  "screen_resolution": "1920x1080",
  "language": "en-US",
  "params": {}
}

Export endpoint

terminal
# Export pages report as CSV
GET /api/export/pages?hours=168&format=csv

# Export sources report as JSON
GET /api/export/sources?from=2026-02-01&to=2026-02-10&format=json

JavaScript SDK#

For React Native, Electron, or Node.js applications. Shares the exact same event schema as the web tracker — one user, one timeline, across every surface.

Installation

terminal
npm install @lynq/tracker

Usage

app.js
import { LynqTracker } from '@lynq/tracker';

const tracker = new LynqTracker({
  websiteId: 'lq_xxxxxxxxxxxx',
  endpoint: 'https://data.your-domain.com/api/collect'
});

// Track screen view
tracker.screenView('HomeScreen');

// Track custom event
tracker.track('button_click', { button: 'Buy Now' });

// Track purchase
tracker.purchase('TXN-123', 299.99, 'TRY', [
  { item_id: 'SKU-1', item_name: 'Product', quantity: 1, price: 299.99 }
]);

iOS SDK (Swift)#

Native Swift SDK with automatic session handling, offline queueing and batched delivery — events fired without a connection are sent when the device comes back online.

Installation

Add via Swift Package Manager:

Xcode → Package Dependencies
https://github.com/lynq-studio/lynq-ios.git

Usage

AppDelegate.swift
import LynqTracker

// Initialize in AppDelegate
LynqTracker.shared.configure(
    websiteId: "lq_xxxxxxxxxxxx",
    endpoint: "https://data.your-domain.com/api/collect"
)

// Track screen view
LynqTracker.shared.screenView("HomeViewController")

// Track event
LynqTracker.shared.track("add_to_cart", params: [
    "item_id": "SKU-123",
    "price": 299.99
])

// Track purchase
LynqTracker.shared.purchase(
    transactionId: "TXN-456",
    revenue: 299.99,
    currency: "TRY",
    items: [["item_id": "SKU-123", "item_name": "Product"]]
)

Android SDK (Kotlin)#

Kotlin-first SDK with lifecycle-aware sessions. Screen views, events and purchases land in the same dashboard as your web traffic.

Installation

build.gradle
implementation 'studio.lynq:tracker:1.0.0'

Usage

App.kt
import studio.lynq.LynqTracker

// Initialize in Application.onCreate()
LynqTracker.init(
    context = this,
    websiteId = "lq_xxxxxxxxxxxx",
    endpoint = "https://data.your-domain.com/api/collect"
)

// Track screen view
LynqTracker.screenView("HomeActivity")

// Track event
LynqTracker.track("add_to_cart", mapOf(
    "item_id" to "SKU-123",
    "price" to 299.99
))

// Track purchase
LynqTracker.purchase(
    transactionId = "TXN-789",
    revenue = 299.99,
    currency = "TRY",
    items = listOf(mapOf("item_id" to "SKU-123"))
)

Flutter SDK (Dart)#

One package for iOS and Android builds. Same schema, same dashboard — no separate 'app analytics' silo.

Installation

pubspec.yaml
dependencies:
  lynq_tracker: ^1.0.0

Usage

main.dart
import 'package:lynq_tracker/lynq_tracker.dart';

// Initialize
final tracker = LynqTracker(
  websiteId: 'lq_xxxxxxxxxxxx',
  endpoint: 'https://data.your-domain.com/api/collect',
);
await tracker.init();

// Track screen view
await tracker.screenView('HomeScreen');

// Track event
await tracker.track('add_to_cart', params: {
  'item_id': 'SKU-123',
  'price': 299.99,
});

// Track purchase
await tracker.purchase(
  transactionId: 'TXN-012',
  revenue: 299.99,
  currency: 'TRY',
  items: [{'item_id': 'SKU-123', 'item_name': 'Product'}],
);

Dashboard Guide#

Thirteen focused report pages — each answers one question well, instead of one page trying to answer everything.

Overview

KPIs, traffic trend, top pages, top sources at a glance.

Pages

All pages, entry pages, exit pages with views, visitors, and sessions.

Sources

Traffic sources with medium, sessions, purchases, revenue, and conversion rate.

Campaigns

UTM campaign performance with sortable metrics and medium filter.

Assisted Conversions

Multi-touch view: which channels assisted a sale, not just which closed it.

Devices

Browser, OS, screen size, and language breakdowns with visual bars.

Geography

Country and city distribution with flag indicators and drill-down.

E-Commerce

Revenue KPIs, conversion funnel, product performance table.

Events

All event types with counts, users, and values. Filterable by type.

User Journey

Select any user and view their complete event timeline across sessions.

Cohort

Weekly cohort matrix showing user retention over time.

Retention

Daily and weekly retention curves with period-over-period comparison.

Real-time

Live visitors, active pages, and geographic distribution.

Filtering

Every report supports the same filter bar. Each filter has three parts:

PartExampleOptions
FieldCountryURL, source, medium, campaign, country, city, device, browser, OS, event type…
Operatorequalscontains, equals, starts with, ends with, not equals, greater / less than
ValueTürkiyeFree text or picked from suggestions

Filters combine, apply across every widget on the page, and show as removable chips. The same filters carry into CSV exports.

Date ranges

The date picker in the header offers presets — Today, Yesterday, Last 7 / 14 / 28 / 90 days — plus a calendar for custom start and end dates. Your selection persists as you move between reports.

Export

Every report has an export button that downloads the current view — filters and date range included — as CSV. For automated pulls, use the API instead.

Privacy & GDPR#

Privacy is the architecture, not a setting. The pipeline is built so there is no personal data to leak, sell, or subpoena.

No personal data

Names, emails and form contents are never collected from visitors.

Hashed IPs

SHA-256 with a daily-rotating salt. Raw IPs are never written to disk.

First-party only

Cookies live on your domain. No cross-site tracking, no fingerprinting.

EU hosting

Data processed and stored in the EU. GDPR, KVKK and CCPA compatible.

Cookies used

CookiePurposeDuration
_lynq_idAnonymous visitor identifier2 years
_lynq_attrCampaign attribution90 days

For full details, see our Privacy Policy, Terms of Service, and GDPR Compliance pages.

FAQ#

The questions we actually get asked — from marketing teams, developers, DPOs and finance. Grouped so you can jump to yours.

First-party & accuracy

Why are my numbers higher than GA4?+

Three reasons, all structural. Roughly 1 in 3 visitors run an ad blocker that stops the GA script but not a script served from your own domain. In the EU, a large share of visitors decline analytics cookies — GA either drops or statistically models those visits, while a consent-aware first-party setup keeps counting what it's allowed to. And GA4 applies sampling to complex reports above 10 million events; Lynq never samples.

A 10–20% gap is normal and expected. If unique visitors differ wildly beyond that, something is misconfigured — that's worth a debugging session, and we do those.

Does Lynq ever sample my data?+

No, at any traffic level. Every report is computed from every event. The backend is ClickHouse, a columnar database built for exactly this — billions of rows aggregate in milliseconds without shortcuts. GA4, by comparison, samples explorations past 10 million events, and the margin of error on sampled reports can reach 30% for narrow date ranges.

Are ad blockers really not a problem?+

Mostly, and honestly: mostly. Blocklists like EasyPrivacy target known tracker domains — googletagmanager.com, connect.facebook.net, and so on. A script named neutrally and served from data.your-domain.com isn't on those lists, so standard ad blockers let it through. The most aggressive setups (blocking all third-party requests won't catch it, but blocking all JavaScript will) can still stop it. In practice the difference against GA is large; a claim of literally 100% would be dishonest.

Do you filter bots and crawlers?+

Yes. Known bots, crawlers and monitoring services are filtered server-side by user agent and behavioral patterns before events reach your reports. This is another reason your numbers won't match GA4 exactly — GA4 lets some spam and bot traffic through that we drop.

Why doesn't Lynq's revenue match my backend exactly?+

Analytics revenue and financial revenue answer different questions. Lynq records a purchase when the browser fires the event — usually the thank-you page. Your backend records it when payment settles. Refunds, cancelled orders, failed captures and customers who close the tab before the thank-you page all create small gaps.

Treat your backend as financial truth and Lynq as marketing truth: which channel, which campaign, which page produced the order. The gap should be small and stable — if it suddenly grows, an event broke, and that's exactly the kind of thing we catch in the verify step.

Consent & legal

Do I need a cookie consent banner?+

The honest answer: it depends on where your visitors are, and anyone who gives you a flat "no" is oversimplifying. "First-party" is not a consent exemption by itself — the ePrivacy rules cover any non-essential storage on the visitor's device, whoever sets it.

What it looks like in practice: several EU countries (France, Italy, Spain, the Netherlands) exempt tightly-scoped, aggregate-only audience measurement. The UK added a statistical-purposes exception in February 2026 that works on an opt-out basis. The US works on notice and opt-out, not opt-in. In stricter EU markets, analytics cookies still need consent.

This is why consent design is part of onboarding, not an afterthought: we wire the tracker to your banner, agree with your legal team on what fires before and after consent per market, and document the decision so you can defend it.

What legal basis applies to the data Lynq collects?+

Lynq collects no names, emails, or precise locations, and IP addresses are hashed with a daily-rotating salt before anything touches disk. Most customers process this under legitimate interest (GDPR Art. 6(1)(f)) for aggregate measurement, with the cookie question handled separately per market — see the consent answer above. We provide the data inventory (see Collected Data) your DPO needs for the assessment.

Do you sign DPAs, and who is the data controller?+

Yes. You are the controller, Lynq Studio is the processor, and we sign a standard DPA that covers processing scope, sub-processors, retention and deletion. Since analytics data lives on EU infrastructure and never leaves it, there are no third-country transfer acrobatics to explain to your DPO.

How do you handle GDPR subject access requests?+

There is usually nothing to hand over, and that's by design. Visitors are anonymous: no name, no email, no raw IP is ever stored, and the visitor ID is a random first-party cookie value that can't be tied back to a person by us or by you. If a visitor sends you their cookie ID, we can locate and delete those rows — but there is no profile behind it.

What about US visitors — CCPA and Global Privacy Control?+

US state laws (California and the growing list of others) work on notice and opt-out rather than opt-in. Lynq doesn't sell or share visitor data with anyone — there's no third party in the chain — which keeps you out of the "sale/share" machinery entirely. Honoring GPC signals can be wired into the setup if your policy requires it.

What's the data retention period?+

Default is 2 years for analytics events, configurable per workspace if your policy requires shorter. Account data lives as long as your contract. On termination, your data is exported to you on request and then deleted — it isn't retained as leverage.

How do I delete all my data?+

Email privacy@lynq.studio. Everything is deleted within 30 days, confirmed in writing.

Setup & technical

No data is showing up — what should I check?+

Three usual suspects: the snippet isn't in <head> on the page you're testing; the data-website-id doesn't match your project; or a Content-Security-Policy blocks your tracking subdomain. Realtime shows events within seconds when everything is wired correctly — and we're one message away during setup.

Will the script slow my site down?+

No. It's ~2 KB (gtag.js is around 50 KB), loads with defer so it never blocks rendering, and is served from your own domain — often over an already-open connection. Core Web Vitals impact is effectively zero.

I have a strict Content-Security-Policy. What do I allow?+

Add your tracking subdomain to script-src (for the script) and connect-src (for the collect endpoint). Because it's your own subdomain, you aren't whitelisting anyone else's infrastructure in your CSP — a detail security teams tend to appreciate.

Does Lynq work with single-page applications?+

Yes. The tracker detects client-side navigation (pushState / replaceState) and records page views accordingly. Next.js, Nuxt, SvelteKit, plain React routers — no extra code needed.

Can I track across subdomains — www, shop, app?+

Yes. The first-party cookie is set on the root domain, so a visitor moving from www to shop to app stays one visitor with one journey. Whether that's one project or several in the dashboard is a schema-design decision we make together.

Can I run Lynq alongside GA4?+

Yes, indefinitely — the scripts don't interfere. The standard migration pattern: run both for 2–4 weeks, compare unique visitors (not page views — counting methods differ), and once you trust the numbers, drop the GA tag. Many customers keep GA4 during a transition quarter for continuity.

Can I import my Google Analytics history?+

Lynq starts counting from install day; there's no automated GA4 importer today. What we do instead during onboarding: help you export the GA4 reports that matter before Google's retention window deletes them (event-level data is kept only 2 months by default, 14 on paid settings), and archive them next to your Lynq data so year-over-year comparisons stay possible.

Can I track multiple websites or apps?+

Yes. Each website or app gets its own project ID, and you switch between them in the dashboard header. Web, iOS, Android, and Flutter are all supported and share one event schema.

For e-commerce

Does Lynq track Shopify checkout?+

Storefront and product pages work with the standard snippet. Shopify's checkout is sandboxed, so purchase events need Shopify's own hooks — we set that up during onboarding so orders land with full attribution. The same applies to other hosted checkouts (iyzico, Stripe Checkout): the pattern is a thank-you page event or a server-side call from your order webhook.

How do refunds and cancelled orders show up?+

They don't, automatically — the browser fired purchase when the order was placed, and analytics keeps that as marketing truth. If refund-adjusted reporting matters to you, the collect API accepts server-side events from your order system, and we design that into the schema.

We sell in multiple currencies. How is revenue reported?+

Send the ISO currency code with every purchase event — reports use the values you send. Most multi-currency stores pick one reporting currency and convert at event time on their side, which keeps the dashboard consistent with how finance already reports.

Which channel gets credit for a sale?+

Two views, side by side. Sources uses last external touch: the last paid or organic channel before the purchase, with direct visits never overwriting campaign data. Assisted Conversions shows the multi-touch picture — which channels appeared anywhere in the path. Google Ads introduced, Instagram reminded, direct closed: you see all three, not just the last one.

For lead generation & B2B

How do I track form submissions?+

Fire form_submit with a form name on successful submit — never with the form's contents. If your form redirects to a thank-you page, that page view works as a conversion signal too. The Sources report then shows which channels produce leads, not just visits.

A lead converts weeks later. Do I still see which campaign brought them?+

Yes — this is the case first-party attribution exists for. The campaign touch is stored in a first-party cookie for 90 days, and direct returns don't overwrite it. A visitor who clicked a LinkedIn ad in March and filled the form in April is credited to that LinkedIn campaign, where a third-party tool would have long lost the thread to "direct".

Can I connect closed deals from my CRM back to campaigns?+

Yes, via the collect API. The common pattern: when a lead submits, store their Lynq visitor ID in the CRM record. When the deal closes, your CRM posts a server-side deal_won event with the value. Pipeline revenue then appears attributed to the campaign that started it — offline outcome, online source.

For mobile apps & SaaS

Does iOS App Tracking Transparency (ATT) apply?+

ATT governs tracking across other companies' apps and websites — the IDFA. Lynq's SDKs never touch the IDFA, don't fingerprint, and only record behavior inside your own app, so first-party analytics of this kind generally doesn't trigger the ATT prompt requirement. Declare your data collection honestly in the App Store privacy labels; we provide the exact field list for that.

Are web and app users connected into one journey?+

Web and app events share one schema and one dashboard, so reports compare cleanly. By default a web visitor and an app user are separate anonymous IDs — anonymity cuts both ways. Where your product has its own account system, connecting the two is a schema-design conversation during onboarding.

Do events sent while offline get lost?+

No. The mobile SDKs queue events locally when there's no connection and deliver them in batches when the device comes back online, with original timestamps preserved.

Can a SaaS product track logged-in usage without violating privacy promises?+

Yes, with discipline. Track feature usage as events (report_exported, integration_connected) without putting names or emails in the params. You get adoption funnels, retention curves and cohort analysis while the dataset itself stays anonymous — which is also what keeps your own privacy policy short.

Need help?

Setup, event schema, a number that doesn't look right — send it over. A person answers, usually the same day.