🚀 Quick Start — Go Live in 5 Steps
1Add an Advertiser — Advertisers tab → + New Advertiser → configure their API/S2S endpoint, auth, and payload mapping.
2Create Offers — Offers tab → + New Offer → link to advertiser, set Adv Offer ID (their system's ID), payouts, and GEO.
3Approve Publishers — Publishers tab → approve pending registrations.
4Share Tracking URLs — copy from Offers table and give to publishers.
5Monitor — Dashboard shows live clicks, leads, conversions, and profit.
📊 Dashboard
Real-time network overview for the selected period (7/14/30 days).
| Card | Meaning |
| Clicks | All tracked click events |
| Leads | Form submissions that passed fraud checks |
| Conversions | Advertiser-approved leads |
| Revenue | Total advertiser payouts (gross) |
| Profit | Revenue minus publisher payouts |
| EPC | Earnings Per Click |
| Approval % | Approved ÷ Total Leads |
🏢 Step 1 — Add an Advertiser
An advertiser is the CPA network or direct brand you push leads to. Create one before creating offers.
Advertiser fields
| Field | Description |
| Company Name | Advertiser display name (e.g. WhoCPA, Affise, HasOffers) |
| Integration Type | API Push (POST) — sends lead as HTTP POST. S2S (GET) — sends as GET with query params. |
| POST Encoding | JSON — application/json body. Form-Encoded — x-www-form-urlencoded body. Many CPA networks (WhoCPA, Affise) use form-encoded. |
| Lead Endpoint URL | The URL your system POSTs or GETs leads to (e.g. https://api2.whocpa.asia/lead/add) |
| Auth Key | Their API key or access token |
| Auth Location | Header — sent as HTTP header. Body — included in POST data. Query — appended to URL. |
| Header Name | Custom header name (default: X-API-Key). Only used when Auth Location = Header. |
| Body/Query Field | Field name in body/URL (default: api_key). Only used when Auth Location = Body or Query. |
| Payload Template | Custom field mapping as JSON. Maps their field names to your CRM data. See Integration docs below. |
| Extra Static Params | JSON of static values added to every request (e.g. {"aff_id":"1033667789"}). |
| Postback Token | Auto-generated. Give to advertiser for their postback URL to your CRM. |
🔗 Step 2 — API & S2S Integration
The CRM supports universal integration with any CPA network or advertiser.
Integration types
| Network Type | Integration | Encoding | Auth Location |
| WhoCPA, Affise | API POST | Form-Encoded | Body (api_key) |
| HasOffers, Tune | API POST | JSON | Header (X-API-Key) |
| Cake, HitPath | S2S GET | — | Query (api_key) |
| Custom REST API | API POST | JSON | Header (custom) |
Payload Template — field mapping
Maps the advertiser's expected field names to your CRM data. Use {field} for dynamic values, plain strings for static values.
// WhoCPA example:
{
"api_key": "{auth_key}",
"phone": "{phone}",
"name": "{name}",
"comment": "{comment}",
"offer_id": "{adv_offer_id}",
"aff_id": "1033667789",
"ip": "{ip}",
"click_id": "{click_id}",
"source": "{sub1}",
"subid1": "{sub1}",
"subid2": "{sub2}",
"subid3": "{sub3}"
}
Available template variables
| Variable | Value |
| {name} | Lead full name |
| {phone} | Lead phone number |
| {email} | Lead email |
| {country} | 2-letter country code |
| {ip} | Lead IP address |
| {click_id} | CRM click ID |
| {adv_offer_id} | Advertiser's offer ID (set per-offer in Offers tab) |
| {offer_id} | CRM internal offer ID |
| {offer_name} | Offer name in CRM |
| {auth_key} | Advertiser auth key |
| {sub1}–{sub5} | Publisher SubID values |
| {comment} | Lead comment |
| {address} | Lead address |
| {timestamp} | Lead creation time |
💡
{adv_offer_id} is per-offer, not per-advertiser. Set it in each offer under "Adv Offer ID". One advertiser can have many offers, each with its own advertiser-side ID.
Lead push flow
Publisher click → Your CRM records lead → CRM pushes to advertiser endpoint
API POST (JSON):
POST https://api.advertiser.com/leads
Content-Type: application/json
X-API-Key: their_key
{"name":"John","phone":"+919876543210","offer_id":"6411",...}
API POST (Form-Encoded):
POST https://api2.whocpa.asia/lead/add
Content-Type: application/x-www-form-urlencoded
api_key=KEY&phone=+919876543210&name=John&offer_id=6411
S2S GET:
GET https://tracker.com/lead?api_key=KEY&phone=+919876543210&name=John
Conversion postback — advertiser → CRM
When the advertiser approves/rejects a lead, they fire a GET request to your postback URL:
YOUR_DOMAIN/postback?click_id={click_id}&status=approved&payout=10.00&comment={comment}&token=POSTBACK_TOKEN
| Parameter | Required | Description |
| click_id | Yes | The click ID sent in the original lead push |
| status | No (default: approved) | Values: approved, cancelled (aliases: rejected, declined), wrong_number (aliases: did_not_order, dno), processing (alias: pending), chargedback |
| payout | No | Override payout amount (e.g. 10.00). If omitted, uses the offer's configured payout. |
| comment | No | Optional advertiser note (e.g. rejection reason). Stored on the conversion and lead. Max 1000 chars. |
| token | Recommended | Advertiser's postback token for authentication |
Postback examples
Approved with payout and comment:
/postback?click_id=CLK1A2B3C4D5E6F&status=approved&payout=10.00&comment=valid+lead&token=POSTBACK_TOKEN
Rejected with reason:
/postback?click_id=CLK1A2B3C4D5E6F&status=rejected&comment=invalid+phone+number&token=POSTBACK_TOKEN
Approved without comment (still works):
/postback?click_id=CLK1A2B3C4D5E6F&status=approved&payout=10.00&token=POSTBACK_TOKEN
ℹ️
Comment behavior: If omitted or empty, any existing comment is preserved. Special characters are safely stripped. Comments appear on the lead and conversion records in your dashboard.
🎯 Step 3 — Create Offers
An offer is the campaign publishers promote. Each offer links to one advertiser and has its own payouts, GEO targeting, and Adv Offer ID.
Key fields
| Field | Description |
| Advertiser | Select from your configured advertisers |
| Adv Offer ID | The offer ID in the advertiser's system (e.g. WhoCPA's 6411). Used in payload template as {adv_offer_id}. Each offer has its own — one advertiser can have many offers. |
| Advertiser Payout | What they pay you per approved lead |
| Publisher Payout | What you pay publishers. The gap is your profit margin. |
| GEO Targeting | Comma-separated ISO codes (e.g. IN,PK,BD). Clicks from other countries are rejected. |
| Visibility | Public — all publishers see it. Private — only manually assigned publishers. |
👥 Step 4 — Manage Publishers
Publishers register at the Publisher Portal. Approve them in the Publishers tab, then assign offers.
Assigning private offers
Click 🎯 Offers on a publisher row → select an offer → optionally set a custom payout → click Assign.
📎 Step 5 — URLs to Give Advertisers & Publishers
Give to Advertisers
| What | URL |
| Conversion Postback URL | YOUR_DOMAIN/postback?click_id={click_id}&status={status}&payout={payout}&comment={comment}&token=POSTBACK_TOKEN |
Replace YOUR_DOMAIN with your actual domain and POSTBACK_TOKEN with the token shown in the advertiser's row. The advertiser must store the click_id from the lead push and send it back in the postback.
Give to Publishers
| What | URL |
| Publisher Portal (register/login) | YOUR_DOMAIN/webmaster |
| Tracking Link | YOUR_DOMAIN/click?offer_id=OFFER_ID&pub_id=PUB_ID&sub1=CAMPAIGN |
Publishers can also generate tracking links from their own dashboard after logging in.
Publisher S2S Postback (you → their tracker)
When a publisher uses a third-party tracker (Keitaro, Binom, Voluum), save their postback URL in their account. Available macros:
{click_id} {status} {payout} {offer_id} {publisher_id} {sub1} through {sub5}
Lead Submission API (landing page → CRM)
POST YOUR_DOMAIN/api/lead
Content-Type: application/json
{"click_id":"CLK…","name":"John","phone":"+919876543210","email":"john@example.com"}
📋 Leads
A lead is created when a form submits to /api/lead. Each lead goes through fraud checks, then gets pushed to the advertiser.
Lead features
- Status chip bar — horizontal multi-select chips at the top of the table (Total + one per status) with live counts. Click to filter; multiple chips can be active at once. Counts reflect current search + offer filter.
- Column filters — every column has an inline filter below the header for instant search.
- Timezone selector — the 🕐 dropdown converts all timestamps to any world timezone (client-side, instant).
- CSV Import — upload leads with Full Name (★ required), Phone (★ required), and any optional fields. Custom columns are included automatically.
- Sample CSV — download a template with all columns pre-filled with example data.
Lead statuses
| Status | Meaning |
| processing | Sent to advertiser, awaiting decision |
| approved | Advertiser accepted — publisher balance credited |
| cancelled | Advertiser declined |
| wrong_number | Wrong number / customer did not order — granular cancellation reason |
| spam | Blocked by network fraud rules |
| duplicate | Same phone/email submitted too recently |
| test | Manual test entry — not pushed to advertiser |
✅ Conversions
Recorded when an advertiser sends a postback with status=approved. Each row is confirmed revenue.
| Column | Description |
| Adv Payout | What advertiser pays you (collect from them) |
| Pub Payout | What you owe the publisher (pay to them) |
| Profit | Adv Payout − Pub Payout = your margin |
Conversion Statistics
Aggregated lead and revenue table at the top of the Conversions tab. Each row groups leads by date / offer / publisher / country, with six status column groups — each showing Qty, %, Sum, and Avg.
| Column Group | Source |
| Total | All leads in the period (Qty / Sum / Avg) |
| Processing | leads.status='processing' |
| Cancelled | leads.status='cancelled' |
| Accepted | leads.status='approved' |
| Wrong # / DNO | leads.status='wrong_number' |
| Spam | leads.status='spam' |
| Duplicate | leads.status='duplicate' |
Filters: date range, period preset, group by, granularity, currency, Offer, and Webmaster. Offer and Webmaster are optional and combine with date/group filters; selecting both narrows to that exact offer × publisher combination. All filters are applied before aggregation, so totals always match the filtered set.
The % cells use a heat-map background — darker = higher proportion. Click Export for an Excel-compatible TSV with all 28 columns.
💵 Finance
The Finance tab combines financial overview with payout management in one view.
Summary cards
| Card | Meaning |
| Advertiser Revenue | Total you should collect from all advertisers (sum of approved Adv Payouts) |
| Owe to Publishers | Total approved + pending balances across all publishers (pay to them) |
| Already Paid | Total completed payouts to publishers |
| Net Profit | Your margin after paying publishers |
Collect from Advertisers
Per-advertiser breakdown of conversions and revenue. Use this to invoice each advertiser.
Pay to Publishers
Per-publisher breakdown of approved, pending, and paid balances. Use this to plan payouts.
Payout requests
Publishers request payouts from their dashboard. Only crypto (USDT/BTC/ETH) is supported. No minimum withdrawal amount. Review, then click ✅ Pay (enter TX hash) or ✗ Reject.
📈 Reports
Custom date-range reports filtered by offer and publisher. Use for advertiser invoicing and publisher reconciliation.
🚨 Fraud Detection
Automated checks at every click and lead. Manual IP blocking available. Fraud Detection tab → + Block IP.
| Rule | Trigger |
| bot_ua | Known bot User-Agent |
| ip_blocked | IP in manual blocklist |
| ip_velocity | >10 clicks/hour from same IP |
| duplicate_phone | Same phone for same offer within 1 hour |
⚙️ Automation Rules
Rules run via cron and auto-act when metrics cross thresholds. Automation tab → + New Rule → set trigger, scope, conditions, and actions.
Actions: pause_offer, suspend_publisher, reduce_cap, alert_admin.