Core concepts
The objects WhichClick stores and how they relate — organizations, domains, campaigns, tracking links, smart links, apps, clicks, installs, conversions.
Updated 2026-09-02
Object model#
Organization (project) ── ApiKey* ── TrackingDomain* ── TrackingLink* ──┐
│ ├── Click* ── Conversion*
├── Campaign* ─────────────────── SmartLink* ────────────────────┘ └── Install* ── AppEvent*
├── App* (SDK key, attribution windows, deep-link scheme) └── Subscription*
├── PostbackEndpoint*, IpBlock*, Incident*, AlertRule*, Audience*
└── CostEntry*, Impression*, Reengagement*, TvAiring*, Experiment*| Object | Purpose | Key fields |
|---|---|---|
| Organization | Tenant / project. All data and API keys are scoped to it. | slug, currency, timezone, region |
| API key | Bearer credential for the REST API and MCP. Hashed at rest; the prefix is shown in the dashboard. | prefix, lastUsedAt, revokedAt |
| Tracking domain | Hostname visitors hit (go.yourbrand.com). Links only resolve on the hostname they are bound to. | hostname, status (PENDING_DNS → ACTIVE → SUSPENDED), googleCertified |
| Campaign | Container that groups links, clicks, installs, conversions and spend. externalId maps to the ad platform's campaign id ({campaignid}). | platform, status, externalId |
| Tracking link | Google Ads redirect endpoint GET /c/{slug}. | slug, defaultFinalUrl, clickIdParam (default wc_click_id), appendClickId |
| Smart link | Mobile / multi-destination endpoint GET /l/{slug} with routing rules. | iosUrl, androidUrl, webFallbackUrl, deepLinkPath, rules, settings, expiresAt, clickCap |
| App | A mobile / CTV / web app with an SDK key and attribution windows. | platform, bundleId, sdkKey, deepLinkScheme, universalLinkHost, clickLookbackDays, probabilisticHours, reattributionDays |
| Click | One redirect. Holds ValueTrack fields, the next hop, transparency flags, geo / device / IP classification and the fraud verdict. | gclid, campaignExtId, keyword, nextHopUrl, forceTransparent, verdict, riskScore |
| Install | First open of an app on a device, attributed to a click (or not). | attributionMethod, clickId, campaignId, deviceIdHash, ctitSeconds, fraud flags |
| App event | In-app event sent by the SDK (session_start, purchase, ad_revenue, …). | name, value, currency, params |
| Conversion | Web conversion from a postback or the API, matched to a click by click_id or gclid. | eventName, value, orderId, source, clickId |
| Postback endpoint | Outbound URL template called when a conversion is recorded. | urlTemplate, method, enabled |
| IP block | Blocklist entry (auto or manual), synced to Google Ads as negative IP criteria. | ip, prefix, reason, syncedToGoogle, expiresAt |
Identifiers#
| Identifier | Where it comes from | Where it goes |
|---|---|---|
wc_click_id | Generated per click (16 chars, URL-safe). Appended to the landing page and to Android referrer=. | Postbacks, SDK install call, beacon, deep links |
gclid / gbraid / wbraid | Google auto-tagging, captured from the tracking template. | Offline conversion import, gclid replay detection |
device_id | SHA-256 of IDFV / GAID / app-set id computed by the SDK (raw ids are hashed server-side if sent). | Install de-duplication, probabilistic matching |
install_id | Returned by POST /api/sdk/v1/install. | Events, subscriptions, ad revenue |
order_id | Your order / transaction id. | Idempotency of conversions |
Statuses#
Campaign, TrackingLink and SmartLink share ACTIVE | PAUSED | ARCHIVED. Paused and archived links answer 404. Click verdicts are PENDING | VALID | SUSPICIOUS | INVALID.
Time and money#
Timestamps are ISO 8601 in UTC. Reports honour the organization's timezone. Money is stored in the currency you send (ISO 4217, default USD); spend and revenue are not converted.