Trackily Documentation

The complete guide to setting up and using Trackily — your self-hosted affiliate tracker.

Introduction

Trackily is a self-hosted multi-campaign affiliate tracking platform, inspired by Keitaro. It lets you track clicks, manage flows, optimize landing pages, and monitor conversions — all from your own server with full data ownership.

Key Capabilities

AreaFeatures
TrackingClick tracking, JS pixel, conversion postback, unique visitors, frequency capping
RoutingSmart flow engine (forced/regular/default), weighted rotation, visitor binding
Integrations10 traffic source templates, Everflow API, Shopify, WooCommerce, Stripe
OptimizationA/B testing, Traffic AI, Automizer rules, Anti-Fraud Kit
AnalyticsAdvanced reports, multi-step funnels, LTV tracking, AOV/ROAS/CAC
E-CommerceProduct catalog, shopping funnel, status scheme, retargeting pixels, multi-touch attribution
AudiencesSegment export (FB/Google), real-time CAPI/Events API passback
NotificationsIn-app, Email, Telegram, Webhook

Installation

Requirements

Quick Install (VPS)

SSH into your server and run:

curl -sSL https://license.trackily.online/install.sh | bash -s -- YOUR_LICENSE_KEY

Docker Install

Create a docker-compose.yml:

version: "3.8"
services:
  trackily:
    image: trackily/tracker:latest
    restart: always
    ports:
      - "3000:3000"
    env_file: .env
    depends_on:
      - postgres
  postgres:
    image: postgres:16-alpine
    restart: always
    environment:
      POSTGRES_DB: trackily
      POSTGRES_USER: trackily
      POSTGRES_PASSWORD: your_secure_password
    volumes:
      - pgdata:/var/lib/postgresql/data
volumes:
  pgdata:

Create a .env file:

LICENSE_KEY=your-license-key-here
LICENSE_SERVER_URL=https://license.trackily.online
DATABASE_URL=postgresql://trackily:your_secure_password@postgres:5432/trackily
ADMIN_PASSWORD=YourAdminPassword123!
PORT=3000

Then run:

docker compose up -d

Coolify / Panel Manager

Add Docker Image

In your panel, create a new service with image: trackily/tracker:latest

Set Environment Variables

Add LICENSE_KEY, DATABASE_URL, ADMIN_PASSWORD, PORT=3000

Deploy

Click deploy — Trackily starts automatically and initializes the database.

Your First Campaign

Follow these steps to create your first tracking campaign:

Add a Traffic Source

Go to Traffic Sources → click Add Source. Select your platform (e.g. Kadam) and enter your API credentials. The form auto-fills with the right macros.

Add an Affiliate Network

Go to Affiliate Networks → click Add Network. Enter your Everflow API URL and key. Click Test Connection to verify.

Import Offers

On your network, click Import Offers. Trackily fetches all active offers with payouts and geo-targeting.

Create a Landing Page

Go to Landing PagesAdd Landing. Choose "Local" to paste HTML or "URL" to use an external page.

Create a Campaign

Go to CampaignsAdd Campaign. Set a name, choose a slug (e.g. mcafee-us), select your offer and source.

Create a Flow

In your campaign, go to FlowsAdd Flow. Set type to "Default", add your landing page and offer with weights.

Get Your Tracking Link

Your tracking link is: https://your-domain.com/c/mcafee-us. Add source macros: ?click_id={click_id}&cost={cost}&sub2={campaign_id}

Configure Postback

In your affiliate network, set the postback URL to: https://your-domain.com/postback?click_id={sub2}&amount={payout_amount}&txid={transaction_id}

💡

The postback system accepts aliases — click_id, subid, sub_id, clickid all work for the click identifier.

Dashboard

The dashboard provides a real-time overview of your campaigns with three data tabs:

Everflow Tab

Shows stats pulled directly from your Everflow affiliate network: clicks, conversions, revenue, payout, and ROI. Uses the Everflow Affiliate API.

Kadam Tab

Shows campaign stats from your Kadam traffic source: impressions, clicks, CTR, cost. Uses the Kadam REST API.

Trackily Tab

Shows native tracking data: clicks, unique visitors, leads, conversions, cost, revenue, profit, ROI, EPC. This is your primary dashboard for campaign performance.

📊

Date Range: Use the presets (Today, Yesterday, 7d, 30d) or select custom dates. Filter by campaign using the dropdown.

Campaigns

A campaign is the central entity that connects a traffic source, landing pages, offers, and routing flows.

Creating a Campaign

FieldDescriptionExample
NameDisplay name for your campaignMcAfee US Push
SlugURL identifier (unique)mcafee-us
OfferDefault offer to promoteMcAfee Antivirus
SourceTraffic source sending clicksKadam
Cost ModelHow you're chargedCPC ($0.05)
DomainCustom tracking domain (optional)track.example.com

Campaign Settings

Bot Filter

Enable to block known bots. Bots are redirected to a URL of your choice (default: google.com). Clicks with fraud score > 50 are blocked.

Frequency Capping

Limit how many times a visitor can see your campaign. Example: max 3 visits per 24 hours per IP.

External Campaign IDs

Link your Kadam/PropellerAds campaign IDs to pull combined stats from both Trackily and the source API.

Tracking Link

Each campaign generates a tracking URL:

https://your-domain.com/c/mcafee-us?click_id={click_id}&cost={cost}&sub2={campaign_id}

Paste this in your traffic source as the destination URL. The macros will be replaced with real values by the traffic source.

Bulk Actions

Every admin table with checkboxes supports multi-select bulk operations. Select one or more rows and a floating action bar slides up at the bottom of the screen.

Where it's available

PageAvailable actions
CampaignsActivate · Pause · Move to group · Delete
OffersActivate · Pause · Delete
Landing PagesActivate · Pause · Delete
AI LandingsPublish · Unpublish · Delete
ProductsActivate · Pause · Delete
Traffic SourcesActivate · Pause · Delete
Affiliate NetworksActivate · Pause · Delete
DomainsDelete

How it works

  1. Tick the checkboxes on the rows you want to affect (or the header checkbox to select all visible rows).
  2. A floating toolbar appears at the bottom of the screen: ✓ N selected followed by action buttons.
  3. The header checkbox shows a tri-state indicator: fully checked when everything is selected, indeterminate when only some rows are, empty otherwise.
  4. Destructive actions (Delete) show a confirmation dialog with the exact count. Activate/Pause/Publish confirm once; Move to group doesn't — it's reversible.
  5. After success, you get a toast ("Paused 12 campaigns"), the selection clears, and the table reloads.

Under the hood: Bulk actions use a single server endpoint POST /admin/api/bulk/:entity with an entity whitelist and efficient SQL batch updates (UPDATE… WHERE id = ANY($1::int[])). Delete falls back to per-row so cascade/archive hooks are preserved.

Offers

An offer is the product or service you're promoting. Offers can be created manually or imported from Everflow.

Import from Everflow

Connect Network

Go to Affiliate Networks → your Everflow network → click Test Connection.

Import

Click Import Offers. Trackily fetches all active offers with payouts and geo data.

Offer Caps

Set daily and total caps to limit conversions. When a cap is reached, Trackily automatically routes traffic to the next available offer in the flow.

Geo-specific Payouts

Configure different payouts per country. Example: McAfee US = $40 CPA, McAfee FR = $25 CPA.

Landing Pages

Landing pages are shown to visitors before they see the offer. Three types:

TypeHow it worksBest for
LocalHTML stored in Trackily database, served directlyPrelanders, breach checkers, scan pages
URLRedirects visitor to an external URLHosted landing pages, WordPress sites
🎯 Redirect TrackerCaptures click IDs (fbclid, gclid, …) then redirectsFirst-hop prelanders, pixel firing, attribution preservation

Import Landing Pages

Two import methods:

Redirect Tracker NEW

A lightweight prelander that captures click-ID parameters sent by ad platforms (Facebook's fbclid, Google's gclid, Bing's msclkid, TikTok's ttclid, etc.) and stores them server-side before redirecting the visitor to your offer. Intended as the very first hop in an ad funnel so attribution parameters survive before the browser drops them on cross-domain navigation.

Why you want this

Click IDs detected automatically

Every hit is inspected for 13 known parameter names — the first match is promoted to click_id_type / click_id_value for fast filtering:

PlatformParamPlatformParam
FacebookfbclidTikTokttclid
Google AdsgclidTwitter/Xtwclid
Google (app)gbraidLinkedInli_fat_id
Google (iOS 14+)wbraidPinterestepik
Microsoft (Bing)msclkidRedditrdt_cid
YandexyclidSnapchatscid
Generic fallbacks: click_id, clickid, cid

Creating a Redirect Tracker

  1. Go to Landing PagesCreate.
  2. Set Type to 🎯 Redirect Tracker (capture click IDs).
  3. Fill in the fields below.
FieldPurpose
Target URLWhere the visitor lands after capture (your offer LP or Trackily campaign).
Forward all query paramsAppends every incoming param (fbclid, utm_*, gclid, …) to the target. Strongly recommended.
Delay before redirectMilliseconds. 0 = instant. Use 500-1000ms if you need to fire tracking pixels before navigating.
Extra paramsStatic key=value pairs appended to the target URL, e.g. source=prelander&v=2026q2.

Public URLs

What's captured

Each visit writes a row to the tracked_redirects table:

Reporting

Edit any redirect tracker — a stats box appears inline:

📊 Captures (last 500): 823     passed: 781
fbclid: 680  gclid: 101  none: 42
🛡 42 bots blocked (CAPTCHA: 30 · Honeypot: 8 · Time: 4)

Full CSV export (up to 5000 rows) available at GET /admin/api/landings/:id/redirect-captures.csv.

Technical safeguards

AI Landing Page Builder PRO

Generate high-converting landing pages in seconds using AI. Choose your LLM provider, pick a copywriting framework, and let the system generate a complete, multi-section landing page tailored to your vertical and traffic source.

Quick Start

  1. Configure your API key: Go to Settings → AI Landing Builder and enter an API key for at least one LLM provider (Claude, OpenAI, Gemini, DeepSeek, MiniMax, or GLM).
  2. Generate: Go to AI Landings and click ✨ Generate with AI. Describe your offer, pick a vertical, language, audience, framework, and traffic temperature.
  3. Edit: Click ✎️ to open the GrapesJS visual editor — drag-and-drop, change images, tweak copy inline.
  4. Publish: Click 📤 to make it live at /l/your-slug.
  5. Link to campaign: Click 🔌 to connect it to a campaign flow for full click tracking, cloaking, and offer rotation.

Supported LLM Providers

ProviderModelsKey required
Claude (Anthropic)Sonnet 4.5, Opus 4.5, Haiku 4.5Anthropic API key
OpenAI (GPT)GPT-4o, GPT-4o-mini, GPT-4-turboOpenAI API key
Google GeminiGemini 2.0 Flash, 1.5 Pro, 1.5 FlashGoogle AI Studio key
DeepSeekDeepSeek Chat, ReasonerDeepSeek API key
MiniMaxabab6.5s-chat, abab6.5-chatMiniMax API key
GLM (Zhipu)GLM-4-plus, GLM-4-air, GLM-4-flashZhipu API key

Image AI Providers

ProviderKey requiredNotes
PollinationsNo (free)Default fallback, no API key needed
Nano Banana (Gemini 2.5 Flash Image)Gemini keyReuses your Gemini API key
DALL-E 3 (OpenAI)OpenAI keyReuses your OpenAI API key
FLUX (fal.ai)fal.ai keyDedicated key
ReplicateReplicate keyFLUX/SDXL models
IdeogramIdeogram keyBest for text-in-image

24 Affiliate Verticals

Each vertical has a dedicated conversion psychology profile that tailors the LLM’s output (emotional triggers, trust mechanisms, objection crushers, hero image direction, tone of voice, and compliance rules):

Antivirus & Software • Auto Warranty • Car Insurance • Debt Settlement • E-commerce • Education • Email Submit • Gaming • Health / Wellness • Health Insurance • Home Improvement • Home Insurance • Home Security • Investing & Financial • Legal • Life Insurance • Listicle / Advertorial • Medicare • Nutra (Supplements) • Real Estate • Survey • Travel • Utility / Software • Other (custom)

8 Copywriting Frameworks

Each framework structures the persuasion flow differently. The system auto-recommends the best one per vertical, but you can override:

FrameworkStructureBest for
AIDAAttention → Interest → Desire → ActionDefault, proven classic
PASProblem → Agitate → SolvePain-heavy: security, health, debt
BABBefore → After → BridgeTransformations: health, education
4PsPromise → Picture → Proof → PushBold claims, high-ticket
PASTORProblem → Amplify → Story → Transform → Offer → ResponseStorytelling, long-form
StoryBrandHero → Problem → Guide → Plan → Action → StakesReader-as-hero narratives
QUESTQualify → Understand → Educate → Stimulate → TransitionEducation-first, warm audiences
Star-Story-SolutionStar → Story → SolutionEmotional: dating, nutra, finance

Traffic Temperature

Controls how much education and proof the page includes based on how “ready to buy” the reader is:

TemperatureSourceEffect on page
ColdPush, display, native adsLonger page, don’t mention product in first 3 sections, 30% problem agitation, 5+ testimonials, guarantee above-fold
WarmSearch, social, referralMedium page, lead with differentiator, comparison table critical, “Start Free” CTA style
HotRetargeting, email, returningShort page, headline = the offer, skip problem section, 80% focus on price + guarantee + urgency

Visual Editor (GrapesJS)

Click ✎️ on any AI landing to open the full visual editor:

A/B Testing (Variants)

Click 🧪 on any landing to generate 2–8 variants with different angles. Each variant uses a different copywriting hook:

Curiosity • Social proof • Urgency • Fear-of-loss • Aspirational • Authority • Contrarian • Story

Variants share a variant_group_id and are displayed with a 🧪 A/B ×N badge in the table. Click 📊 to see aggregated stats per variant (visitors, leads, conversions, CVR, revenue, EPC) with a z-test winner detection at 95% confidence. Click 🚀 Promote to set the winner to 100% traffic in every linked flow.

Campaign Bridge

Click 🔌 to link an AI landing (and all its variants) into an existing campaign flow. This enables:

Lead Capture

Inline forms in AI landings are automatically intercepted. The injected tracking script:

  1. Detects all <form> elements at page load
  2. On submit, extracts email / name / phone via field-name heuristics (supports EN + FR + ES names)
  3. POSTs to /api/lead with click_id + ai_landing_id + form data
  4. Redirects to the offer URL after 250ms

View leads via 👥 — the modal shows summary chips (total, unique emails, with phone), a search bar, and CSV export (up to 10K rows). Leads are scoped to the full variant group by default.

Opt-out: Add data-trackily="off" to any form you don’t want intercepted.

Compliance Checker

Click 🛡 to run a two-tier compliance scan:

Auto-Translation

Click 🌍 to translate a landing into other languages. 12 pre-set languages (FR, ES, DE, IT, PT, NL, PL, AR, EN, JA, TR, RU) plus a custom language field. The LLM performs culturally-adapted localization (not literal translation), and testimonial names are localized to the target market. Each translation is saved as a new draft with translated_from metadata.

Heatmap / Conversion Audit

Click 🔥 to get an AI-powered conversion audit. The LLM analyzes the page structure and copy to predict:

White Page Cloaking

Click ⚪ to auto-generate a compliant “white page” (page jumelle) — a clean, corporate-style version of your landing served to ad-network reviewers and crawlers. Features:

Cloning & Import

Three ways to create a landing from existing content:

MethodButtonDescription
Duplicate📋1-click exact copy as a new draft (new slug, same HTML/CSS/assets). Assets are cloned too so deleting the original won’t break the copy.
Raw Import🕵️ → RawFetch any URL, resolve relative paths to absolute, download images/CSS/fonts/videos into Postgres, save as editable landing.
Import + AI Rewrite🕵️ → RewriteSame as raw, plus the LLM rewrites all visible text for a new brand/language/angle while keeping the layout, classes, and images identical.
Template from URL🕵️ → TemplateFetch a page and LLM extracts its layout as a reusable Mustache-lite template with {{headline}}, {{#benefits}}, etc. Shows up in the Generate modal’s template picker.

Offline Asset Hosting

Imported images, CSS, fonts, and videos are stored in Postgres (BYTEA) and served via /assets/:id with immutable cache headers. Your landing survives the original host going down. Limits: 40 images (10 MB each), 5 videos (50 MB each), 10 stylesheets (2 MB each, with recursive font/image sub-asset download).

Use 🗑 Asset GC in the toolbar to find and purge orphaned assets no longer referenced in any landing or version history snapshot.

Version History

Click ⏱ to view up to 20 auto-saved snapshots per landing. Every edit in the visual builder creates a snapshot before overwriting. Features:

Scheduled Publish / Unpublish

Click 📅 to set a future date/time for automatic status changes. Useful for coordinated launches, time-limited promos, and A/B test windows. The scheduler runs every 60 seconds and clears the field once it fires (one-shot). Quick presets: +1h, Tomorrow 9am, +1 week.

5 Built-in Templates

All templates render the full 28-field rich schema (12 sections: urgency bar, hero, problem, solution, benefits grid, testimonials, comparison, objections, pricing/guarantee, urgency, FAQ, final CTA):

TemplateVisual styleAuto-selected for
Classic HeroLight, indigo/violet, modernDefault for most verticals
AV SecurityDark, red accents, shield pulse, scan barAntivirus, home security
Health WellnessWarm cream, Georgia serif, greenHealth, nutra, wellness
Crypto FinanceBlack + glow, blue-green gradientsInvesting, crypto, finance
SweepstakesBright gradient, confetti, bouncing iconSweepstakes, gaming, email submit

You can also import custom templates from any URL using the 🕵️ Import → Template mode.

Flows & Routing

Flows determine how traffic is routed within a campaign. Each campaign can have multiple flows with different rules.

Flow Types

TypePriorityDescription
Forced#1 (Highest)Always matches if filters are met. Overrides all other flows.
Regular#2Matches if filters are met. Weighted random selection among matching regular flows.
Default#3 (Fallback)Catches all traffic that doesn't match any other flow. Only one per campaign.

Flow Filters

Add conditions to target specific traffic. Available filters:

FilterOperatorsExample
Countryequals, not_equals, in, not_inCountry in US,CA,UK
Deviceequals, not_equalsDevice equals Mobile
OSequals, contains, inOS equals Windows
Browserequals, containsBrowser equals Chrome
Languageequals, inLanguage in en,fr

Weighted Rotation

Assign weights to landing pages and offers for A/B testing:

Landing A: weight 100 (67% traffic)
Landing B: weight 50  (33% traffic)

Higher weight = more traffic. Use the Balance button to equalize weights.

Visitor Binding

Ensure returning visitors see the same landing page/offer:

BindingEffect
NoneNew random selection each visit
LandingSame landing page on return (24h)
OfferSame offer on return (24h)
Landing + OfferSame combo on return (24h)

Conflict Detection

Trackily warns you about potential flow conflicts:

Traffic Sources

Trackily comes with 10 pre-configured traffic source templates with smart forms:

SourceTypeClick ID Macro
KadamPush/Native/Pop{click_id}
PropellerAdsPush/Pop/Interstitial${SUBID}
Meta AdsFeed/Stories/Reelsfbclid
TikTok AdsIn-feed/Top-view__CLICKID__
Google AdsSearch/Display/YouTube{gclid}
TaboolaNative{click_id}
MGIDNative/Content{click_id}
ExoClickPop/Push/Native{conversions_tracking}
RichAdsPush/Pop/Direct${CLICK_ID}
CustomAnyYou define
💡

Each template auto-fills the postback URL, click ID parameter, and available macros. Just add your API key!

Affiliate Networks

Connect your affiliate networks to import offers and sync conversions. Everflow has full API integration.

Everflow Setup

Add Network

Go to Networks → Add → Enter your Everflow API URL and key (X-Eflow-API-Key header).

Test Connection

Click Test → you should see "Connection successful".

Import Offers

Click Import Offers → all active offers are fetched with payouts and geo.

Sync Conversions

Click Sync → pulls approved conversions and matches them to your clicks.

Domains

Add custom domains for cleaner tracking links. Each domain can be linked to a campaign.

Features: DNS verification, SSL status check, DNS provider detection (Cloudflare, etc.), domain grouping.

Reports

The Reports page provides detailed analytics with multiple grouping options:

Group By Options

CategoryOptions
CampaignCampaign, Landing Page, Offer
DimensionsCountry, OS, Browser, Device, Language
TimeHour of Day, Day of Week, Date
TrafficISP, Referrer Domain
Sub IDsSub1, Sub2, Sub3, Sub4, Sub5

Metrics Available

Clicks, Unique, Leads, Conversions, Cost, Revenue, Profit, ROI%, CR%, EPC, CPA, CPL

Period Comparison

Check "vs Previous" to compare current period with the previous one (e.g. today vs yesterday, this week vs last week).

Column Templates

Customize which columns are visible in your reports and save presets for quick switching.

Click "Columns" Button

In the Reports toolbar, click the columns icon to open the dropdown.

Toggle Columns

Check/uncheck: Clicks, Unique, Leads, Cost, Revenue, Profit, ROI%, CR%, EPC.

Save Preset

Enter a name and click Save. Your preset is stored locally for quick access.

Export / Import

Export

Export your data in CSV or JSON format. Go to Settings → Export section. Available types: Campaigns, Offers, Flows, Sources, Networks, Landing Pages, or All.

Import

Import data from JSON. Go to Settings → Import section. Upload a JSON file with an array of objects matching the entity schema.

Postback System

Trackily uses a Keitaro-style universal postback with parameter aliases. Any affiliate network can fire conversions regardless of their naming convention.

Postback URL

https://your-domain.com/postback?click_id={sub2}&amount={payout_amount}&txid={transaction_id}

Parameter Aliases

ParameterAccepted Names
Click IDsubid, sub_id, click_id, clickid, trackID, aff_sub, aff_click_id, sub1, sub2
Payoutpayout, amount, revenue, price, pay, money, summ_approved, payment, order_sum, affiliateCommission, value
Statusstatus, type, state, conversion_status
Transaction IDtid, transaction_id, txid, trans_id, receipt
🔗

No matter what your network calls the parameter, Trackily will find it. Just include the click ID and payout — everything else is optional.

Dynamic Call-Outs

Personalize your landing pages by injecting visitor data. Use double-brace placeholders in your HTML:

VariableOutput Example
{{country}}United States
{{city}}New York
{{os}}Windows
{{browser}}Chrome
{{device}}Desktop
{{ip}}203.0.113.42
{{language}}en
{{country_code}}US
{{region}}California
{{isp}}Comcast Cable

Example

<h1>Attention {{city}} residents!</h1>
<p>Your {{os}} device may be at risk.</p>

Becomes:

<h1>Attention New York residents!</h1>
<p>Your Windows device may be at risk.</p>

Multi-Step Funnels

Track visitor progress through multiple landing page steps. Each step is reported automatically.

How to Use

In your local landing page, call the step tracking function:

// Step 1 is auto-tracked on page load
// Track custom steps:
window.__trackily.reportStep(2, 'Email Submitted');
window.__trackily.reportStep(3, 'Scan Started');
window.__trackily.reportStep(4, 'Offer Shown');

View funnel stats in Reports → Funnel tab to see dropoff at each step.

Custom Conversions

Define multiple conversion types beyond just "sale":

TypeUse Case
SalePrimary purchase completed
LeadForm submission, email capture
UpsellAdditional product sold
RebillRecurring subscription charge

Pass the type in your postback: &conversion_type=upsell. Rebills automatically link to the parent conversion for LTV tracking.

GeoIP Databases

Trackily uses local MaxMind GeoLite2 databases for instant geo-detection (~1ms per lookup, no external API calls).

Get MaxMind License Key

Create a free account at maxmind.com → My License Keys → Generate.

Download Databases

Go to Settings → GeoIP → paste your key → click Download All.

Verify

Status should show "OK" for City and ASN databases. Test with an IP address.

Manual Cost Update

Correct cost data after the fact when your traffic source reports different costs than bid.

Single Click

In the Clicks report, click the $$ button next to any click to edit its cost.

Bulk Update

Select a campaign and date range, then set a new cost-per-click value. All clicks in that range are updated.

Anti-Fraud Kit PRO

Detect and block fraudulent clicks in real-time with a multi-factor scoring system.

Fraud Score (0-100)

FactorScoreTrigger
Known Bot UA+40Googlebot, curl, wget, python-requests, etc.
Click Flood (30s)+25>5 clicks from same IP in 30 seconds
Click Flood (5m)+30>20 clicks from same IP in 5 minutes
Datacenter IP+15ISP contains: hosting, cloud, aws, hetzner
Blacklisted IP+50IP in manual or auto blacklist
Suspicious UA+10Empty or very short user agent

Clicks with score ≥ 50 are blocked (with bot filter enabled). IPs with score ≥ 80 are auto-blacklisted.

IP Blacklist

Manually add IPs or ranges. Auto-blacklist adds IPs automatically when fraud score exceeds the threshold.

Bot Protection (CAPTCHA) NEW

Stack three layers of bot filtering in front of your Redirect Tracker prelanders: Cloudflare Turnstile CAPTCHA, an invisible honeypot field, and a minimum dwell-time gate. Humans get through in <1s; bots get blocked at the door and never reach your offer.

The three layers

LayerCostFrictionCatches
Honeypot0 ms, 0 KBNoneForm-scraping bots
Time gate0 msNoneFast-acting bots (< minimum dwell)
Turnstile50-200 ms~0 (invisible 95%)Nearly all bots, incl. browser-automation

Setup (one-time, global)

Get Turnstile keys

Sign in at Cloudflare Dashboard → Turnstile. Click Add site. Choose Managed widget mode. Add your domain (wildcard *.yourdomain.com works). Copy the Site Key (public) and Secret Key (server-only). Turnstile is free and unlimited.

Save keys in Trackily

Go to Settings → Security, scroll to the 🛡 Turnstile CAPTCHA card, paste both keys, and click Save CAPTCHA Keys. The same keys are reused by the Cloudflare integration below, so you only paste them once.

Enable on a redirect tracker

Edit any redirect tracker. Tick Require CAPTCHA — leave the per-landing key fields empty to reuse the global keys. Tick Honeypot + time gate for the invisible layers. Save.

Per-landing config

FieldPurpose
Require CAPTCHAOn/off toggle. When off, honeypot + time gate still run independently.
Site Key / Secret KeyPer-landing overrides — leave empty to inherit from global settings.
On failed CAPTCHABlock returns a 403 error page to the visitor. Log only lets them through but flags the row in the DB — useful for silent measurement / shadow mode.
Honeypot + time gateInvisible field injected only by bots; combined with a minimum dwell time. Zero friction.
Min dwell time (ms)How long the visitor must stay on the challenge page before the submit is accepted. Default 1500. Bots usually fire in < 500 ms.

The challenge page

When protection is enabled, /r/:slug serves a minimal dark-themed verification page (spinner + "Verifying your connection..." message + optional Turnstile widget). The page runs the three checks client-side, then POSTs to /r/:slug/verify with:

{
  "cf_token": "0.xxx...",           // Turnstile token, null if CAPTCHA off
  "honeypot_value": "",              // empty for humans, filled by bots
  "started_at": 1713128400000,       // ms since page load
  "elapsed_ms": 1620,                // ms elapsed at submit
  "query": { "fbclid": "IwAR...", "utm_source": "fb" }
}

The server runs the three checks in order (honeypot → time gate → Turnstile). First failure short-circuits: a row is written to tracked_redirects with verification_status = failed_*, then either a 403 is returned or the visitor proceeds (in log mode).

Reporting

The stats box on every redirect tracker shows a per-method breakdown:

📊 Captures (last 500): 823     passed: 781
🛡 42 bots blocked (CAPTCHA: 30 · Honeypot: 8 · Time: 4)
💡

Scope: Bot Protection currently applies to Redirect Tracker landings only. Local HTML landings continue to use the existing Cloaking Workflow engine for bot filtering. To gate a local landing with CAPTCHA, chain a protected redirect tracker as the first hop of your flow.

Cloaking Workflow PRO

Trackily's cloaking system is built around a drag-and-drop Visual Workflow Builder. Legacy inline cloaking config has been retired — all cloaking now lives in reusable workflows you can attach to any campaign.

What a workflow can do

Built-in templates

The Visual Workflow Builder ships with several pre-built templates you can load with one click and customize:

Built-in "VPN Blocker" workflow

On first launch, Trackily idempotently seeds a ready-to-use workflow named "VPN Blocker (Built-in)". Select it straight from the Cloaking Workflow dropdown in the Edit Campaign modal — no builder interaction required. If you rename or delete it, Trackily will not recreate it (the seeder checks by exact name before inserting).

Attaching a workflow to a campaign

  1. Open or create a campaign.
  2. Pick a workflow from the CLOAKING WORKFLOW dropdown at the top of the modal.
  3. Save. Every click on /c/:slug runs through the workflow before reaching the flow engine.
ℹ️

The legacy inline "Enable Cloaking" checkbox inside the campaign modal has been removed to eliminate the ambiguity of having two cloaking controls. Existing campaigns with legacy config are preserved automatically on save — their settings are retained even though the UI no longer displays them. Migrate them to workflows at your own pace.

Automizer PRO

Create automation rules that monitor your campaigns and take action based on performance metrics.

Rule Structure

IF [metric] [operator] [value] WITHIN [time_window]
THEN [action]

Example Rules

RuleConditionAction
Stop losing campaignROI < -30% (24h)Pause campaign
Cap alertConversions ≥ 50 (24h)Send notification
Boost winnerCR > 5% (24h)Change landing weight to 150
Cost controlCost > $500 (24h)Pause campaign + notify

Available Metrics

clicks, conversions, revenue, cost, roi, cpa, cr, epc

Available Actions

pause_campaign, pause_offer, send_notification, change_weight, change_bid

Traffic Distribution AI PRO

Automatically optimize landing page and offer weights based on real-time conversion data.

The AI analyzes conversion rate and EPC per landing/offer, then suggests weight adjustments. Enable it per flow in the flow editor.

🧠

The AI needs at least 100 clicks per variant before making suggestions. It evaluates performance every hour.

Notifications PRO

Get alerted on important events via 4 channels:

ChannelSetup
In-AppEnabled by default. Bell icon in the dashboard.
EmailSettings → SMTP host, port, username, password, from address.
TelegramSettings → Bot Token + Chat ID. Create a bot via @BotFather.
WebhookSettings → URL endpoint. Receives JSON POST on events.

Notification Rules

Create rules to trigger on specific events: conversion, fraud_alert, rule_triggered, link_down, campaign_paused, offer_capped. Set conditions, choose channels, and add a cooldown to prevent spam.

A/B Testing PRO

Compare landing pages and offers using flow weights and statistical significance testing.

Set Up Variants

In a flow, add 2+ landing pages with equal weights (50/50 or any split).

Run Traffic

Send traffic to the campaign and wait for enough data (100+ clicks per variant).

Check Results

Reports → A/B Test tab shows statistical significance, confidence level, and winner recommendation.

Lander Protection PRO

Protect your landing pages from spy tools and competitors.

When enabled, Trackily detects:

Detected spies see "Access Denied" instead of your landing page. Enable per landing page in the editor.

Conversion Pixel (JS)

The JavaScript pixel allows e-commerce merchants to track conversions client-side, directly from their thank-you page — no S2S postback needed.

Installation

Add this script to your website's <head> or thank-you page:

<script src="https://your-tracker.com/pixel.js"></script>

Tracking Events

// Track a purchase
trackily.track('purchase', {
  order_id: 'ORD-12345',
  revenue: 89.99,
  currency: 'USD',
  products: [
    { name: 'Running Shoes', price: 59.99, qty: 1 },
    { name: 'Sports Socks', price: 14.99, qty: 2 }
  ]
});

// Track add-to-cart
trackily.track('add_to_cart', {
  product: 'Running Shoes',
  price: 59.99
});

// Track checkout initiation
trackily.track('checkout', {
  cart_total: 89.97,
  item_count: 3
});

// Track a lead
trackily.track('lead', {
  email: 'customer@example.com'
});
🔗

The pixel automatically reads the _tly_click cookie (set when the visitor clicked your tracking link) to attribute the conversion to the right click and campaign.

Product Catalog

Import and manage your product catalog. Products can be imported from Shopify, WooCommerce, or added manually.

Manual Product

FieldDescriptionExample
NameProduct display nameRunning Shoes Pro
SKUUnique product identifierSHOE-PRO-001
PriceProduct price59.99
CurrencyPrice currencyUSD
CategoryProduct categoryFootwear
Image URLProduct imagehttps://...
External IDShopify/WC product ID7890123456
SourceWhere it was imported fromshopify, woocommerce, manual

Import from Shopify

Go to Integrations → configure your Shopify store URL and API token → click Import Products. All products with title, price, SKU, images, and variants are imported automatically.

Import from WooCommerce

Go to Integrations → configure your WooCommerce store URL, consumer key, and consumer secret → click Import Products.

Shopify Integration

Trackily integrates with Shopify via API for products, orders, and auto-sync conversions.

Setup

Create a Custom App in Shopify

Go to your Shopify Admin → Settings → Apps and sales channels → Develop apps → Create an app. Grant scopes: read_products, read_orders, read_customers.

Get the API Access Token

After creating the app, install it and copy the Admin API access token (starts with shpat_).

Configure in Trackily

Go to Integrations → Shopify section → enter your store URL (e.g. mystore.myshopify.com) and paste the token.

Import & Sync

Click Import Products to pull your catalog. Enable Auto-sync Orders to automatically match Shopify orders with Trackily clicks every 15 minutes.

Shopify Webhook (Alternative)

For real-time conversion tracking, configure a webhook in Shopify:

URL: https://your-tracker.com/webhook/shopify?key=YOUR_WEBHOOK_SECRET
Event: Order creation

Each new order fires a webhook → Trackily matches the customer email/IP to a click → creates a conversion automatically.

Auto-Sync Orders

When enabled, Trackily polls Shopify's GET /admin/api/2024-01/orders.json every 15 minutes and matches orders to clicks using:

WooCommerce Integration

Connect your WordPress/WooCommerce store for product import and conversion tracking.

Setup

Generate API Keys

In WordPress Admin → WooCommerce → Settings → Advanced → REST API → Add Key. Set permissions to Read.

Configure in Trackily

Go to Integrations → WooCommerce section → enter your store URL, Consumer Key, and Consumer Secret.

Import Products

Click Import Products → all WooCommerce products are fetched with prices, SKUs, and categories.

WooCommerce Webhook

For real-time tracking, add a webhook in WooCommerce:

URL: https://your-tracker.com/webhook/woocommerce
Topic: Order completed
Secret: YOUR_WEBHOOK_SECRET

E-Commerce Metrics: AOV / ROAS / CAC

Trackily calculates key e-commerce KPIs automatically from your conversion data. These metrics are shown on the Dashboard and Reports pages.

MetricFormulaDescription
AOVTotal Revenue ÷ Number of OrdersAverage Order Value — how much each customer spends per order
ROASRevenue ÷ Ad SpendReturn On Ad Spend — $3 ROAS means $3 revenue per $1 spent
CACTotal Ad Spend ÷ Number of CustomersCustomer Acquisition Cost — cost to acquire one paying customer
LTVTotal Revenue per Customer (incl. rebills)Lifetime Value — total revenue from one customer over time
RPCRevenue ÷ ClicksRevenue Per Click — like EPC but includes all revenue
Repeat RateRepeat Customers ÷ Total CustomersPercentage of customers who buy more than once
💡

Example: You spent $500 on Kadam, got 10,000 clicks, 150 conversions, $4,500 revenue. Your ROAS = $9, AOV = $30, CAC = $3.33, EPC = $0.45.

E-Commerce Funnel

Visualize your shopping funnel to identify where customers drop off.

Funnel Steps

StepEventExample
1. Page ViewpageviewAuto-tracked by pixel.js
2. Add to Cartadd_to_carttrackily.track('add_to_cart', {...})
3. Checkoutcheckouttrackily.track('checkout', {...})
4. Purchasepurchasetrackily.track('purchase', {...})

The funnel page shows visual bars with conversion rates between each step:

Page Views:    10,000  (100%)
Add to Cart:    3,500  (35.0%)  ← 35% clicked Add to Cart
Checkout:       1,800  (18.0%)  ← 51% of carts started checkout
Purchase:       1,200  (12.0%)  ← 67% of checkouts completed
📊

Filter funnel data by campaign, date range, country, or device to identify which traffic segments convert best.

E-Commerce Status Scheme PRO

Track the lifecycle of each conversion through e-commerce statuses, similar to Binom's status scheme.

Available Statuses

StatusIconDescriptionAuto-action
Cart🛒Customer added item to cart
Checkout💳Customer started checkout
PendingPayment being processed
SalePayment confirmedConversion → Approved
On Hold⏸️Under review (fraud check, etc.)
Refunded↩️Customer refundedConversion → Rejected
Chargeback🚫Payment disputedConversion → Rejected
Cancelled✖️Order cancelled before fulfillment

Status History

Every status change is logged with who made the change, when, and from/to statuses. View the history in the conversion detail modal.

Automatic Transitions

When status changes to Sale, the conversion is automatically marked as "approved". When it changes to Refund or Chargeback, the conversion is marked as "rejected" and revenue is excluded from reports.

Retargeting Pixels PRO

Inject retargeting pixels (Facebook, Google, TikTok) on ANY tracking link — even links to external sites you don't own. This is a feature unique to Trackily and ClickMagick.

How It Works

When a visitor clicks your tracking link /c/:slug, Trackily shows a brief intermediate page (1.5 seconds) that:

  1. Fires your Facebook Pixel (PageView event)
  2. Fires your Google Tag (page_view event)
  3. Fires your TikTok Pixel (page event)
  4. Runs any custom scripts you defined
  5. Redirects the visitor to the destination (landing page or offer)

Configuration

In the campaign editor, go to the Retargeting Pixels section:

FieldExampleDescription
Facebook Pixel ID123456789012345Your FB Pixel ID from Events Manager
Google Tag IDAW-123456789 or G-XXXXXXXXXGoogle Ads or GA4 measurement ID
TikTok Pixel IDABCDEF123456Your TikTok pixel code from Ads Manager
Custom Scripts<script>...</script>Any additional tracking scripts
💡

For local landing pages: The pixels are injected directly into the HTML (no intermediate page, no delay). The intermediate page is only used for external URL redirects.

Use Case

You promote a Shopify store you don't own. By adding your FB Pixel to the Trackily campaign, every visitor who clicks your link is added to your Facebook retargeting audience — even though the Shopify store doesn't have your pixel installed.

Multi-Touch Attribution ENTERPRISE

Go beyond last-click attribution with 4 models that distribute conversion credit across multiple touchpoints.

Attribution Models

ModelHow it worksBest for
Last Click100% credit to the last click before conversionDirect response campaigns
First Click100% credit to the first click that introduced the customerAwareness campaigns
LinearEqual credit to all touchpointsUnderstanding the full journey
Time DecayMore credit to touchpoints closer to conversionLong sales cycles, e-commerce

Example

Customer journey: Facebook Ad → Google Search → TikTok Ad → Purchase ($100)

Last Click:   Facebook $0, Google $0, TikTok $100
First Click:  Facebook $100, Google $0, TikTok $0
Linear:       Facebook $33, Google $33, TikTok $33
Time Decay:   Facebook $16, Google $28, TikTok $56

Access attribution reports at Attribution page. Select a model, date range, and campaign to see how revenue is distributed across traffic sources.

Audience Export PRO

Build audience segments from your traffic data and export them for retargeting on ad platforms.

Creating a Segment

Define Conditions

Filter visitors by: campaign, country, device, conversion status, date range, visit count, etc.

Preview Size

See how many visitors match your criteria before exporting.

Export

Download as CSV with email/phone hashes (SHA256) ready for upload to Facebook Custom Audiences or Google Customer Match.

Export Formats

PlatformFormatFields
FacebookCSV (Custom Audiences)Email (SHA256), Phone (SHA256), Country, City
GoogleCSV (Customer Match)Email (SHA256), Phone (SHA256), First Name, Last Name

Segment Examples

Audience Optimization ENTERPRISE

Automatically send conversion data in real-time to ad platforms (Facebook, Google, TikTok) for better ad optimization and higher match rates.

Supported Platforms

PlatformAPI UsedEvents Sent
FacebookConversions API (CAPI)Purchase, Lead
TikTokEvents APICompletePayment, SubmitForm
GoogleOffline ConversionsConversion with value

Setup

In the campaign editor, go to Audience Passback section:

FieldDescription
FB Pixel IDYour Facebook Pixel ID
FB Access TokenSystem User token with ads_management permission
TikTok Pixel IDYour TikTok pixel code
TikTok Access TokenFrom TikTok Ads Manager → Developer
Google Conversion IDGoogle Ads conversion action ID
Google Conversion LabelConversion label from Google Ads
🧠

Why use this? Ad platforms optimize better when they receive server-side conversion data. Facebook CAPI catches ~30% more conversions than the browser pixel alone (due to ad blockers and iOS privacy).

How It Works

Every time a conversion is recorded (via postback, webhook, or pixel), Trackily automatically fires the conversion data to all configured platforms with:

Users & Permissions

Manage team access with role-based permissions.

Roles

RoleAccess
AdminFull access to everything
ManagerRead+Write on campaigns, offers, LPs, flows, sources. Read on reports.
ViewerRead-only access to campaigns, offers, LPs, reports.
CustomGranular per-section read/write permissions.

Sections

10 sections with independent read/write toggles: Campaigns, Offers, Landings, Flows, Sources, Networks, Domains, Reports, Settings, Users.

My Profile NEW

Every logged-in user gets a dedicated profile page, reachable from the avatar dropdown in the top-right header. Self-service account management — no admin needed to rename yourself or change your password.

What's on the page

SectionContents
Profile headerAvatar with user initials, full name, email, plan badge, role badge, inline Upgrade button.
Account InformationEdit your display name. Email is read-only (contact an admin to change it).
SecurityChange password — requires current password, new must be ≥ 8 chars.
License & SubscriptionCurrent plan, status, expiry date, shortcut to the License Modal and public pricing page.
PreferencesUI language selector (EN / FR / ES / PT / AR) + theme toggle.

Self-service endpoints

Any authenticated user can call these without admin permission:

Header & Sidebar UI NEW

The admin chrome was reorganised along modern SaaS patterns. Key changes:

Top-right header

The top bar now carries five quick-access utilities, left to right:

IconPurpose
HelpOpens /docs in a new tab
🌙 Dark Mode toggleSun/moon icon flips between light and dark themes
⚙️ SettingsJumps to the Settings page
🔔 NotificationsExisting bell with unread badge
👤 Avatar dropdownCircular initials avatar — opens the account menu (see below)

Avatar dropdown menu

Click your avatar and you get a SaaS-style dropdown with the following items:

Sidebar accordion

Navigation is organised under two collapsible accordion sections so the sidebar stays compact even with 18+ pages:

SectionItems
Dashboard(always pinned at top, not inside an accordion)
AffiliateCampaigns, Offers, Landing Pages, AI Landings, Flows, Traffic Sources, Affiliate Networks, Domains, Reports, Logs, Automizer, Archive
E-CommerceProducts, Stores, Funnel, Attribution, Audiences, Integrations
Settings(always pinned at bottom)
Logout(always pinned at the very bottom of the sidebar)
💾

Collapse state is persisted per-user in localStorage. Whichever section contains your currently-active page auto-expands on load — you never have to open an accordion just to find where you are.

Settings

AI Assistant

Configure Claude, Gemini, or DeepSeek API keys for the built-in AI chat. The AI can create campaigns, suggest optimizations, and generate landing page copy.

IP Anonymization

Enable to mask visitor IPs for GDPR compliance (last octet zeroed).

License Management

Activate your license in the sidebar → Upgrade button. Paste your license key (UUID) and click Activate.

Plans

FeatureStarterProEnterprise
Users15Unlimited
Flows & Routing
Bot DetectionBasicFull Anti-FraudFull Anti-Fraud
Automizer
Traffic AI
NotificationsIn-AppAll ChannelsAll Channels
A/B Testing
White Label

Get your license at license.trackily.online/portal.

Tracking Flow

The complete journey of a click through Trackily:

Traffic Source (Kadam, PropellerAds, etc.)
  │
  ▼
GET /c/:campaign-slug
  ├─ Parse visitor: IP, UA, sub1-5, referrer
  ├─ GeoIP lookup: country, city, ISP
  ├─ Parse UA: OS, browser, device type
  ├─ Fraud scoring: bot check, flood, datacenter
  ├─ Bot filter: redirect if score >= 50
  ├─ Frequency cap: block if limit exceeded
  ├─ Unique click detection (IP+UA hash)
  ├─ Flow evaluation: forced → regular → default
  ├─ Weighted landing selection
  ├─ Offer cap check: skip capped offers
  ├─ Create click record (UUID)
  └─ Serve landing (HTML) or redirect (URL)
       │
       ▼
  Landing Page
  ├─ Dynamic call-outs injected
  ├─ Lander protection active (if enabled)
  ├─ Step tracking (multi-step funnels)
  └─ Visitor clicks CTA
       │
       ▼
  GET /offer/:clickId/:offerId
  ├─ Append sub params (sub2=trackily_uuid)
  └─ Redirect to affiliate offer URL
       │
       ▼
  Conversion (on affiliate network)
  ├─ Network fires postback
       │
       ▼
  GET /postback?click_id={sub2}&amount={payout}
  ├─ Resolve click by ID
  ├─ Create conversion record
  ├─ Fire source postback (Kadam, etc.)
  └─ Dispatch notifications

API Reference

All admin endpoints require Authorization: Bearer {token} header.

Authentication

POST /admin/api/login
Body: { "email": "admin@example.com", "password": "..." }
Response: { "token": "...", "user": {...} }

Core Endpoints

MethodEndpointDescription
GET/admin/api/campaignsList campaigns
POST/admin/api/campaignsCreate campaign
GET/admin/api/offersList offers
GET/admin/api/statsGet tracking stats
GET/admin/api/stats/groupedGrouped analytics
GET/admin/api/clicksClick log (paginated)
GET/admin/api/conversionsConversion log
GET/admin/api/export/:typeExport data (CSV/JSON)
POST/admin/api/import/:typeImport data

Public Endpoints (No Auth)

MethodEndpointDescription
GET/c/:slugCampaign click tracking
GET/postbackConversion postback
GET/offer/:clickId/:offerIdOffer redirect
POST/api/check-emailHIBP breach check
POST/api/leadLead registration

Environment Variables

VariableRequiredDescription
DATABASE_URLYesPostgreSQL connection string
ADMIN_PASSWORDYesInitial admin password
PORTNoServer port (default: 3000)
LICENSE_KEYNoLicense key for Pro/Enterprise features
LICENSE_SERVER_URLNoLicense server URL (default: https://license.trackily.online)
HIBP_API_KEYNoHaveIBeenPwned API key for breach check

Need help? Contact support@trackily.online