Filter modes
Every filter runs in accept mode (pass if matched) or reject mode (cut if matched). A stream passes when all accept filters match and no reject filter does.
Everything below exists in the current build and is documented. Items that are planned are marked as such and are not counted as features.
Every filter runs in accept mode (pass if matched) or reject mode (cut if matched). A stream passes when all accept filters match and no reject filter does.
Bot database, country, region, city, ISP, carrier, device type, OS, OS version, browser, connection type, proxy and VPN, IP lists, referrer, empty referrer, URL parameters, sub_id 1-10, browser language, user agent mask.
Palladium via rbl.palladium.expert with client id and secret, and Adspect via stream UUID. Verdicts are cached in Redis so a repeat visitor does not cost a second lookup.
Traffic that fails the filters goes to a white page, a plain HTML block or a 404. Traffic that passes goes to the landing and offer chain.
Forced streams fire first when their filters match, then regular streams share traffic by weight, then the default stream catches whatever is left.
Landings - visitor goes to a landing page and then to the offer. Action - a direct action with no landing. Redirect - straight to a URL.
HTTP redirect (301, 302, meta, double meta), serve local HTML, return 404, or hand the visitor to another campaign.
One stream can rotate several offers with a weight on each.
Click cap and conversion cap per stream, with the behaviour after the cap defined by you.
Uniqueness by IP, by IP and user agent, or by a parameter. Sticky visitors keep the same landing and offer on return.
CPC, CPA, CPM, CPS, CPUC and RevShare, with multi-currency and a fixed offer payout. Costs update by hand, from the traffic source, or externally from Dolphin{anty} and Fbtool.
Upload a ZIP and it is served by the lander service. HTML, PWA templates and PHP pages all work.
Edit landing files right in the panel: a folder tree with counts, index.html at the root, collapse state remembered between visits. A one-line fix does not need the archive re-uploaded.
PHP 8.3 under FrankenPHP in worker mode. Pages carried over from another tracker keep their macros and need no rewrite.
An offer is an external target URL or a local landing. Offer payout and currency feed the profit and ROI columns.
The landing can preload the offer so the visitor's click lands instantly.
A GET request resolves the click by click id or external id. Parameter names are configurable aliases, so you match the network's format instead of the network matching yours.
Sale, lead, rejected, registration, deposit, trash. Incoming values are normalised through an alias table.
A repeat postback with a different status updates the conversion instead of creating a second one. The last postback wins. A duplicate of the same status is ignored.
Relay the conversion to the traffic source with macros in the URL, queued and retried by the worker.
A conversion can fire a webhook to your own endpoint, not just an S2S postback to the traffic source. Keitaro has no equivalent.
Clicks, uniques, bots, conversions, revenue, cost and ROI for the period, a world map, breakdowns by source, OS and device, top campaigns and the latest conversions.
91 dimensions with up to five levels of grouping and subtotals: campaign, source, stream, offer, landing, country, region, city, ISP, device, OS, browser, and the rest. Sort by clicking a column header, walk the result page by page, export the whole thing server-side.
63 metrics - the full Keitaro set, checked against their live install rather than their documentation, which turned out to be wrong in six places. Clicks, uniques, bots, LP clicks and CTR, conversions by all six statuses, CR, approve rate, EPC, EPUC, CPA, revenue, cost, profit and ROI.
Switch between click date and conversion date. Click a value in the table to drill into it - the path shows as a breadcrumb above the report.
On-demand certificates for campaign domains, issued only for domains that passed verification, which keeps the endpoint from being abused.
The panel shows whether a domain actually points at your server, and can check the whole list at once.
Generated snippets for a direct link, a dynamic JS link, async and sync script tags, iframe, frameset, an email pixel, a PHP redirect, offer code, KClient JS and PHP for sending conversions from a landing, and popunder.
Compose a click URL with sub_id, source, cost and extra parameters, with the result updating as you type.
Admin sees everything. A buyer sees only what ACL grants.
Entities belong to groups, and a buyer only ever sees their own group's campaigns, offers, landings and reports.
A section can be granted for viewing without the right to change anything, and money columns can be hidden from a buyer entirely. The check lives in one place, so a forgotten handler cannot become a hole that looks like a working button.
Flagged accounts cannot be deleted, paused or demoted, enforced by database triggers as well as by the interface.
REST API with per-user keys for automation and external dashboards.
Listed here on purpose. If one of these is a blocker for you, say so before you buy - it moves the roadmap.
The same filter chain the engine runs on every click, with the same order: a reject rule wins the moment it matches. Change the visitor and the route changes with it.
Landing, then offer. This is the visitor you paid for.
A simplified model of five filters out of the fifteen the engine ships with. In the panel each rule is a row on the stream, and you set accept or reject yourself.
Buying takes a couple of minutes: pick a plan, pay, and the key arrives by email. Installation is a single command on your server.