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
| Area | Features |
|---|---|
| Tracking | Click tracking, JS pixel, conversion postback, unique visitors, frequency capping |
| Routing | Smart flow engine (forced/regular/default), weighted rotation, visitor binding |
| Integrations | 10 traffic source templates, Everflow API, Shopify, WooCommerce, Stripe |
| Optimization | A/B testing, Traffic AI, Automizer rules, Anti-Fraud Kit |
| Analytics | Advanced reports, multi-step funnels, LTV tracking, AOV/ROAS/CAC |
| E-Commerce | Product catalog, shopping funnel, status scheme, retargeting pixels, multi-touch attribution |
| Audiences | Segment export (FB/Google), real-time CAPI/Events API passback |
| Notifications | In-app, Email, Telegram, Webhook |
Installation
Requirements
- VPS with Ubuntu 20+ or Debian 11+ (minimum 1GB RAM)
- PostgreSQL database
- A domain name pointed to your server
- Ports 80 and 443 open
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 Pages → Add Landing. Choose "Local" to paste HTML or "URL" to use an external page.
Create a Campaign
Go to Campaigns → Add Campaign. Set a name, choose a slug (e.g. mcafee-us), select your offer and source.
Create a Flow
In your campaign, go to Flows → Add 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
| Field | Description | Example |
|---|---|---|
| Name | Display name for your campaign | McAfee US Push |
| Slug | URL identifier (unique) | mcafee-us |
| Offer | Default offer to promote | McAfee Antivirus |
| Source | Traffic source sending clicks | Kadam |
| Cost Model | How you're charged | CPC ($0.05) |
| Domain | Custom 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
| Page | Available actions |
|---|---|
| Campaigns | Activate · Pause · Move to group · Delete |
| Offers | Activate · Pause · Delete |
| Landing Pages | Activate · Pause · Delete |
| AI Landings | Publish · Unpublish · Delete |
| Products | Activate · Pause · Delete |
| Traffic Sources | Activate · Pause · Delete |
| Affiliate Networks | Activate · Pause · Delete |
| Domains | Delete |
How it works
- Tick the checkboxes on the rows you want to affect (or the header checkbox to select all visible rows).
- A floating toolbar appears at the bottom of the screen:
✓ N selectedfollowed by action buttons. - The header checkbox shows a tri-state indicator: fully checked when everything is selected, indeterminate when only some rows are, empty otherwise.
- Destructive actions (Delete) show a confirmation dialog with the exact count. Activate/Pause/Publish confirm once; Move to group doesn't — it's reversible.
- 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:
| Type | How it works | Best for |
|---|---|---|
| Local | HTML stored in Trackily database, served directly | Prelanders, breach checkers, scan pages |
| URL | Redirects visitor to an external URL | Hosted landing pages, WordPress sites |
| 🎯 Redirect Tracker | Captures click IDs (fbclid, gclid, …) then redirects | First-hop prelanders, pixel firing, attribution preservation |
Import Landing Pages
Two import methods:
- From URL: Paste a URL and Trackily downloads the HTML
- From HTML: Upload or paste raw HTML code
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
- Facebook Conversions API: reliable
fbclidcapture for server-side matching (eCPM improvement). - Google Ads enhanced conversions: clean
gclid/gbraid/wbraidfor offline imports. - Audit traffic quality: compare what your ad platform reports vs. what actually landed.
- CPM deal verification: your own source of truth against partner invoices.
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:
| Platform | Param | Platform | Param |
|---|---|---|---|
fbclid | TikTok | ttclid | |
| Google Ads | gclid | Twitter/X | twclid |
| Google (app) | gbraid | li_fat_id | |
| Google (iOS 14+) | wbraid | epik | |
| Microsoft (Bing) | msclkid | rdt_cid | |
| Yandex | yclid | Snapchat | scid |
Generic fallbacks: click_id, clickid, cid | |||
Creating a Redirect Tracker
- Go to Landing Pages → Create.
- Set Type to 🎯 Redirect Tracker (capture click IDs).
- Fill in the fields below.
| Field | Purpose |
|---|---|
| Target URL | Where the visitor lands after capture (your offer LP or Trackily campaign). |
| Forward all query params | Appends every incoming param (fbclid, utm_*, gclid, …) to the target. Strongly recommended. |
| Delay before redirect | Milliseconds. 0 = instant. Use 500-1000ms if you need to fire tracking pixels before navigating. |
| Extra params | Static key=value pairs appended to the target URL, e.g. source=prelander&v=2026q2. |
Public URLs
- Standalone:
https://your-domain.com/r/<slug>— paste in your ad creative directly. - In a campaign flow: select the redirect tracker as a landing inside any flow;
/c/:slugwill dispatch to it automatically and pass thecampaign_idto the capture row.
What's captured
Each visit writes a row to the tracked_redirects table:
- Primary click-ID type and value
- Full query-string as JSON (
all_params) - Final target URL
- IP address + country code (via ip-api geolocation)
- User-Agent, referrer, is_bot flag (on known bot UA patterns)
- Timestamp + optional verification status (see Bot Protection)
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
- Server-side capture: the insert happens before the HTML renders — works even if JavaScript is disabled.
- Triple-fallback redirect:
window.location.replace()→<meta refresh>→ visible fallback link. - No-index:
meta robotsandX-Robots-Tag: noindex, nofollowprevent search-engine crawlers from indexing the prelander. - No cache:
Cache-Control: no-storeso every visit is recorded. - No loop: internal
_tly_*params are stripped before forwarding.
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
- 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).
- Generate: Go to AI Landings and click ✨ Generate with AI. Describe your offer, pick a vertical, language, audience, framework, and traffic temperature.
- Edit: Click ✎️ to open the GrapesJS visual editor — drag-and-drop, change images, tweak copy inline.
- Publish: Click 📤 to make it live at
/l/your-slug. - Link to campaign: Click 🔌 to connect it to a campaign flow for full click tracking, cloaking, and offer rotation.
Supported LLM Providers
| Provider | Models | Key required |
|---|---|---|
| Claude (Anthropic) | Sonnet 4.5, Opus 4.5, Haiku 4.5 | Anthropic API key |
| OpenAI (GPT) | GPT-4o, GPT-4o-mini, GPT-4-turbo | OpenAI API key |
| Google Gemini | Gemini 2.0 Flash, 1.5 Pro, 1.5 Flash | Google AI Studio key |
| DeepSeek | DeepSeek Chat, Reasoner | DeepSeek API key |
| MiniMax | abab6.5s-chat, abab6.5-chat | MiniMax API key |
| GLM (Zhipu) | GLM-4-plus, GLM-4-air, GLM-4-flash | Zhipu API key |
Image AI Providers
| Provider | Key required | Notes |
|---|---|---|
| Pollinations | No (free) | Default fallback, no API key needed |
| Nano Banana (Gemini 2.5 Flash Image) | Gemini key | Reuses your Gemini API key |
| DALL-E 3 (OpenAI) | OpenAI key | Reuses your OpenAI API key |
| FLUX (fal.ai) | fal.ai key | Dedicated key |
| Replicate | Replicate key | FLUX/SDXL models |
| Ideogram | Ideogram key | Best 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:
| Framework | Structure | Best for |
|---|---|---|
| AIDA | Attention → Interest → Desire → Action | Default, proven classic |
| PAS | Problem → Agitate → Solve | Pain-heavy: security, health, debt |
| BAB | Before → After → Bridge | Transformations: health, education |
| 4Ps | Promise → Picture → Proof → Push | Bold claims, high-ticket |
| PASTOR | Problem → Amplify → Story → Transform → Offer → Response | Storytelling, long-form |
| StoryBrand | Hero → Problem → Guide → Plan → Action → Stakes | Reader-as-hero narratives |
| QUEST | Qualify → Understand → Educate → Stimulate → Transition | Education-first, warm audiences |
| Star-Story-Solution | Star → Story → Solution | Emotional: dating, nutra, finance |
Traffic Temperature
Controls how much education and proof the page includes based on how “ready to buy” the reader is:
| Temperature | Source | Effect on page |
|---|---|---|
| Cold | Push, display, native ads | Longer page, don’t mention product in first 3 sections, 30% problem agitation, 5+ testimonials, guarantee above-fold |
| Warm | Search, social, referral | Medium page, lead with differentiator, comparison table critical, “Start Free” CTA style |
| Hot | Retargeting, email, returning | Short 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:
- Drag & drop: Add, move, or resize any element
- Inline editing: Click any text to edit it directly
- Device preview: Desktop, Tablet, and Mobile views
- Asset manager: Upload custom images (stored in Postgres, served via
/assets/:id) - Regen Image: Click 🖼 to regenerate the hero image with a new AI prompt
- Domain assignment: Pick a custom domain from the editor topbar
- Save & Publish: One-click save or save + publish
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:
- Click tracking: Every visitor via
/c/campaign-sluggets a click record with full geo, UA, fraud score - Cloaking: The campaign’s 3-layer cloaking workflow (Drawflow) applies on top of the landing’s built-in UA-based white page cloaking
- Offer rotation: The flow engine picks a weighted offer, and the CTA button on the landing automatically redirects to that offer URL
- Postback: Lead/conversion postbacks fire back to your traffic source (Kadam, PropellerAds, etc.)
Lead Capture
Inline forms in AI landings are automatically intercepted. The injected tracking script:
- Detects all
<form>elements at page load - On submit, extracts email / name / phone via field-name heuristics (supports EN + FR + ES names)
- POSTs to
/api/leadwith click_id + ai_landing_id + form data - 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:
- Rule-based scan (instant, free): Checks for banned terms and missing required disclaimers per vertical (antivirus, health, crypto, sweepstakes, finance). Returns a score 0–100 with severity-coded issues (ERROR / WARN / INFO) and fix hints.
- AI Deep Review (LLM-powered): Sends the page copy to your configured LLM for a deeper analysis with categorized issues and a verdict (safe / needs revisions / high risk).
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:
- Conversion score (0–100) with verdict (strong / average / weak)
- Attention distribution per section (headline, hero, CTA, bullets, testimonials, FAQ, footer)
- CTA click predictions with position and estimated CTR%
- Heat zones (hot / warm / cool / cold) with explanations
- Friction points and top fixes ordered by priority with expected CVR lift
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:
- LLM generates a professional business page with About Us, Services, Contact sections
- Toggle cloaking on/off from the modal
- Bot detection via User-Agent (Googlebot, facebookexternalhit, AdsBot, etc.)
- Manual test: append
?safe=1to any/l/slugURL - Views counter skips bots — only real visitors are counted
Cloning & Import
Three ways to create a landing from existing content:
| Method | Button | Description |
|---|---|---|
| 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 | 🕵️ → Raw | Fetch any URL, resolve relative paths to absolute, download images/CSS/fonts/videos into Postgres, save as editable landing. |
| Import + AI Rewrite | 🕵️ → Rewrite | Same 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 | 🕵️ → Template | Fetch 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:
- Preview any version in a new tab
- Restore a version (the current state is snapshotted first, so restores are always reversible)
- Delete individual versions
- Automatic GC: only the last 20 versions per landing are kept
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):
| Template | Visual style | Auto-selected for |
|---|---|---|
| Classic Hero | Light, indigo/violet, modern | Default for most verticals |
| AV Security | Dark, red accents, shield pulse, scan bar | Antivirus, home security |
| Health Wellness | Warm cream, Georgia serif, green | Health, nutra, wellness |
| Crypto Finance | Black + glow, blue-green gradients | Investing, crypto, finance |
| Sweepstakes | Bright gradient, confetti, bouncing icon | Sweepstakes, 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
| Type | Priority | Description |
|---|---|---|
| Forced | #1 (Highest) | Always matches if filters are met. Overrides all other flows. |
| Regular | #2 | Matches 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:
| Filter | Operators | Example |
|---|---|---|
| Country | equals, not_equals, in, not_in | Country in US,CA,UK |
| Device | equals, not_equals | Device equals Mobile |
| OS | equals, contains, in | OS equals Windows |
| Browser | equals, contains | Browser equals Chrome |
| Language | equals, in | Language 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:
| Binding | Effect |
|---|---|
| None | New random selection each visit |
| Landing | Same landing page on return (24h) |
| Offer | Same offer on return (24h) |
| Landing + Offer | Same combo on return (24h) |
Conflict Detection
Trackily warns you about potential flow conflicts:
- Error: Multiple default flows (only the first one runs)
- Warning: Forced flow without filters shadows everything
- Info: Regular flows with identical filters (unintentional A/B test)
Traffic Sources
Trackily comes with 10 pre-configured traffic source templates with smart forms:
| Source | Type | Click ID Macro |
|---|---|---|
| Kadam | Push/Native/Pop | {click_id} |
| PropellerAds | Push/Pop/Interstitial | ${SUBID} |
| Meta Ads | Feed/Stories/Reels | fbclid |
| TikTok Ads | In-feed/Top-view | __CLICKID__ |
| Google Ads | Search/Display/YouTube | {gclid} |
| Taboola | Native | {click_id} |
| MGID | Native/Content | {click_id} |
| ExoClick | Pop/Push/Native | {conversions_tracking} |
| RichAds | Push/Pop/Direct | ${CLICK_ID} |
| Custom | Any | You 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
| Category | Options |
|---|---|
| Campaign | Campaign, Landing Page, Offer |
| Dimensions | Country, OS, Browser, Device, Language |
| Time | Hour of Day, Day of Week, Date |
| Traffic | ISP, Referrer Domain |
| Sub IDs | Sub1, 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
| Parameter | Accepted Names |
|---|---|
| Click ID | subid, sub_id, click_id, clickid, trackID, aff_sub, aff_click_id, sub1, sub2 |
| Payout | payout, amount, revenue, price, pay, money, summ_approved, payment, order_sum, affiliateCommission, value |
| Status | status, type, state, conversion_status |
| Transaction ID | tid, 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:
| Variable | Output 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":
| Type | Use Case |
|---|---|
| Sale | Primary purchase completed |
| Lead | Form submission, email capture |
| Upsell | Additional product sold |
| Rebill | Recurring 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)
| Factor | Score | Trigger |
|---|---|---|
| Known Bot UA | +40 | Googlebot, 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 | +15 | ISP contains: hosting, cloud, aws, hetzner |
| Blacklisted IP | +50 | IP in manual or auto blacklist |
| Suspicious UA | +10 | Empty 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
| Layer | Cost | Friction | Catches |
|---|---|---|---|
| Honeypot | 0 ms, 0 KB | None | Form-scraping bots |
| Time gate | 0 ms | None | Fast-acting bots (< minimum dwell) |
| Turnstile | 50-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
| Field | Purpose |
|---|---|
| Require CAPTCHA | On/off toggle. When off, honeypot + time gate still run independently. |
| Site Key / Secret Key | Per-landing overrides — leave empty to inherit from global settings. |
| On failed CAPTCHA | Block 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 gate | Invisible 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
- Detect VPN / Proxy / Tor / datacenter IPs
- Identify reviewer IPs (Meta, Google, TikTok, Bing review teams)
- Reverse-DNS match against ad-platform crawlers
- Screen bot user-agents and behavioral fingerprint
- Route traffic by country, device, OS, browser, language
- A/B/C split-test at the traffic layer
- Rate-limit, delay-and-recheck, run custom JS rules
Built-in templates
The Visual Workflow Builder ships with several pre-built templates you can load with one click and customize:
- VPN Blocker — blocks VPN/Proxy/Tor and datacenter IPs, allows residential traffic.
- Facebook Shield — reviewer IP + reverse DNS + bot UA, safe page for ops.
- Google Ads Safe, TikTok Cloak, Push Traffic Pro, A/B Split, Stealth Max…
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
- Open or create a campaign.
- Pick a workflow from the CLOAKING WORKFLOW dropdown at the top of the modal.
- Save. Every click on
/c/:slugruns 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
| Rule | Condition | Action |
|---|---|---|
| Stop losing campaign | ROI < -30% (24h) | Pause campaign |
| Cap alert | Conversions ≥ 50 (24h) | Send notification |
| Boost winner | CR > 5% (24h) | Change landing weight to 150 |
| Cost control | Cost > $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:
| Channel | Setup |
|---|---|
| In-App | Enabled by default. Bell icon in the dashboard. |
| Settings → SMTP host, port, username, password, from address. | |
| Telegram | Settings → Bot Token + Chat ID. Create a bot via @BotFather. |
| Webhook | Settings → 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:
- Headless browsers (Selenium, Puppeteer)
- Known spy tool referrers (AdPlexity, Anstrex, SpyPush, etc.)
- Missing browser plugins (bot indicator)
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
| Field | Description | Example |
|---|---|---|
| Name | Product display name | Running Shoes Pro |
| SKU | Unique product identifier | SHOE-PRO-001 |
| Price | Product price | 59.99 |
| Currency | Price currency | USD |
| Category | Product category | Footwear |
| Image URL | Product image | https://... |
| External ID | Shopify/WC product ID | 7890123456 |
| Source | Where it was imported from | shopify, 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:
note_attributes._tly_click— click ID passed from landing page- Customer email matching
- IP address matching (last resort)
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.
| Metric | Formula | Description |
|---|---|---|
| AOV | Total Revenue ÷ Number of Orders | Average Order Value — how much each customer spends per order |
| ROAS | Revenue ÷ Ad Spend | Return On Ad Spend — $3 ROAS means $3 revenue per $1 spent |
| CAC | Total Ad Spend ÷ Number of Customers | Customer Acquisition Cost — cost to acquire one paying customer |
| LTV | Total Revenue per Customer (incl. rebills) | Lifetime Value — total revenue from one customer over time |
| RPC | Revenue ÷ Clicks | Revenue Per Click — like EPC but includes all revenue |
| Repeat Rate | Repeat Customers ÷ Total Customers | Percentage 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
| Step | Event | Example |
|---|---|---|
| 1. Page View | pageview | Auto-tracked by pixel.js |
| 2. Add to Cart | add_to_cart | trackily.track('add_to_cart', {...}) |
| 3. Checkout | checkout | trackily.track('checkout', {...}) |
| 4. Purchase | purchase | trackily.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
| Status | Icon | Description | Auto-action |
|---|---|---|---|
| Cart | 🛒 | Customer added item to cart | — |
| Checkout | 💳 | Customer started checkout | — |
| Pending | ⏳ | Payment being processed | — |
| Sale | ✅ | Payment confirmed | Conversion → Approved |
| On Hold | ⏸️ | Under review (fraud check, etc.) | — |
| Refunded | ↩️ | Customer refunded | Conversion → Rejected |
| Chargeback | 🚫 | Payment disputed | Conversion → 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:
- Fires your Facebook Pixel (PageView event)
- Fires your Google Tag (page_view event)
- Fires your TikTok Pixel (page event)
- Runs any custom scripts you defined
- Redirects the visitor to the destination (landing page or offer)
Configuration
In the campaign editor, go to the Retargeting Pixels section:
| Field | Example | Description |
|---|---|---|
| Facebook Pixel ID | 123456789012345 | Your FB Pixel ID from Events Manager |
| Google Tag ID | AW-123456789 or G-XXXXXXXXX | Google Ads or GA4 measurement ID |
| TikTok Pixel ID | ABCDEF123456 | Your 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
| Model | How it works | Best for |
|---|---|---|
| Last Click | 100% credit to the last click before conversion | Direct response campaigns |
| First Click | 100% credit to the first click that introduced the customer | Awareness campaigns |
| Linear | Equal credit to all touchpoints | Understanding the full journey |
| Time Decay | More credit to touchpoints closer to conversion | Long 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
| Platform | Format | Fields |
|---|---|---|
| CSV (Custom Audiences) | Email (SHA256), Phone (SHA256), Country, City | |
| CSV (Customer Match) | Email (SHA256), Phone (SHA256), First Name, Last Name |
Segment Examples
- Converters: Visitors who completed a purchase (for lookalike audiences)
- Cart Abandoners: Added to cart but didn't purchase (for retargeting)
- High Value: Customers with AOV > $100 (for upsell campaigns)
- By Country: US-only visitors for geo-specific campaigns
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
| Platform | API Used | Events Sent |
|---|---|---|
| Conversions API (CAPI) | Purchase, Lead | |
| TikTok | Events API | CompletePayment, SubmitForm |
| Offline Conversions | Conversion with value |
Setup
In the campaign editor, go to Audience Passback section:
| Field | Description |
|---|---|
| FB Pixel ID | Your Facebook Pixel ID |
| FB Access Token | System User token with ads_management permission |
| TikTok Pixel ID | Your TikTok pixel code |
| TikTok Access Token | From TikTok Ads Manager → Developer |
| Google Conversion ID | Google Ads conversion action ID |
| Google Conversion Label | Conversion 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:
- Client IP and User Agent (for matching)
- Click ID (fbclid, ttclid, gclid)
- Revenue and currency
- Event type (Purchase or Lead)
- Country code
Users & Permissions
Manage team access with role-based permissions.
Roles
| Role | Access |
|---|---|
| Admin | Full access to everything |
| Manager | Read+Write on campaigns, offers, LPs, flows, sources. Read on reports. |
| Viewer | Read-only access to campaigns, offers, LPs, reports. |
| Custom | Granular 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
| Section | Contents |
|---|---|
| Profile header | Avatar with user initials, full name, email, plan badge, role badge, inline Upgrade button. |
| Account Information | Edit your display name. Email is read-only (contact an admin to change it). |
| Security | Change password — requires current password, new must be ≥ 8 chars. |
| License & Subscription | Current plan, status, expiry date, shortcut to the License Modal and public pricing page. |
| Preferences | UI language selector (EN / FR / ES / PT / AR) + theme toggle. |
Self-service endpoints
Any authenticated user can call these without admin permission:
PUT /admin/api/users/me— update own namePOST /admin/api/users/me/password— change password (current_password + new_password, bcrypt-verified server-side)
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:
| Icon | Purpose |
|---|---|
| ❓ Help | Opens /docs in a new tab |
| 🌙 Dark Mode toggle | Sun/moon icon flips between light and dark themes |
| ⚙️ Settings | Jumps to the Settings page |
| 🔔 Notifications | Existing bell with unread badge |
| 👤 Avatar dropdown | Circular 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:
- Profile header — avatar, name, email, plan badge, inline Upgrade link
- My Profile — opens the profile page
- Settings
- Documentation — opens
/docs - What's new — opens the changelog modal and shows the current version (e.g.
v3.2.0) - Install App — appears only when the browser offers PWA install
- Separator
- Logout (red)
Sidebar accordion
Navigation is organised under two collapsible accordion sections so the sidebar stays compact even with 18+ pages:
| Section | Items |
|---|---|
| Dashboard | (always pinned at top, not inside an accordion) |
| Affiliate | Campaigns, Offers, Landing Pages, AI Landings, Flows, Traffic Sources, Affiliate Networks, Domains, Reports, Logs, Automizer, Archive |
| E-Commerce | Products, 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
| Feature | Starter | Pro | Enterprise |
|---|---|---|---|
| Users | 1 | 5 | Unlimited |
| Flows & Routing | ✓ | ✓ | ✓ |
| Bot Detection | Basic | Full Anti-Fraud | Full Anti-Fraud |
| Automizer | — | ✓ | ✓ |
| Traffic AI | — | ✓ | ✓ |
| Notifications | In-App | All Channels | All 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
| Method | Endpoint | Description |
|---|---|---|
| GET | /admin/api/campaigns | List campaigns |
| POST | /admin/api/campaigns | Create campaign |
| GET | /admin/api/offers | List offers |
| GET | /admin/api/stats | Get tracking stats |
| GET | /admin/api/stats/grouped | Grouped analytics |
| GET | /admin/api/clicks | Click log (paginated) |
| GET | /admin/api/conversions | Conversion log |
| GET | /admin/api/export/:type | Export data (CSV/JSON) |
| POST | /admin/api/import/:type | Import data |
Public Endpoints (No Auth)
| Method | Endpoint | Description |
|---|---|---|
| GET | /c/:slug | Campaign click tracking |
| GET | /postback | Conversion postback |
| GET | /offer/:clickId/:offerId | Offer redirect |
| POST | /api/check-email | HIBP breach check |
| POST | /api/lead | Lead registration |
Environment Variables
| Variable | Required | Description |
|---|---|---|
DATABASE_URL | Yes | PostgreSQL connection string |
ADMIN_PASSWORD | Yes | Initial admin password |
PORT | No | Server port (default: 3000) |
LICENSE_KEY | No | License key for Pro/Enterprise features |
LICENSE_SERVER_URL | No | License server URL (default: https://license.trackily.online) |
HIBP_API_KEY | No | HaveIBeenPwned API key for breach check |
Need help? Contact support@trackily.online