Migration
How to switch from Keitaro to Tracked
A Keitaro migration plan for self-hosted buyers: archive the server, move one campaign to a new domain, keep old postbacks alive, reconcile, then shut down.
To switch from Keitaro, keep your Keitaro server running and move one campaign at a time. Back up the server and export reports first. Rebuild one campaign in Tracked on a new tracking subdomain, replace Keitaro's {subid} with Tracked's {{click.id}} at the affiliate network, and test a callback. Move one ad segment. Keep the old server, domain, and postback live until Keitaro-issued clicks stop converting. Then reconcile and shut it down.
Keitaro is self-hosted software. You rent the server, own the database, point your own DNS at it, and decide when it stops. That control makes a Keitaro migration different from leaving a cloud tracker. Nobody will turn the old system off for you, and nobody will keep it running if a server bill lapses mid-overlap. Plan the shutdown date as a deliberate step, not something that happens to you.
Where Tracked is today
Tracked is a managed service. It supports campaign routes, custom domains, hosted HTML/ZIP landing pages with visual editing, proxied or redirected page destinations, page click slots such as /click/1, weighted offer routing, conditional rules, macros, and generic postback conversions with reports and journeys.
This guide does not assume a Keitaro importer. A Keitaro backup restores into Keitaro, not into Tracked, and no automatic transfer of Keitaro clicks, conversions, or campaign settings is verified. Spend sync depends on the traffic source and connection. Tracked has no verified equivalent of Keitaro's manual "Update costs" tool. Universal CAPI and automatic winner selection are in development, not shipped. Rebuild each campaign intentionally and keep Keitaro's data as the record for its own traffic.
What changes when you leave a self-hosted tracker?
Three responsibilities move. You stop maintaining the tracker server, so updates, sizing, and recovery become Tracked's job. Your tracking domain moves too: Keitaro domains resolve to your server's IP, while a Tracked campaign runs on a domain you connect to Tracked. And your history stays behind. It lives in Keitaro's MySQL and ClickHouse data on your server unless you export or archive it.
Keitaro's installation guide asks for a dedicated VPS or VDS running CentOS 9 Stream or 10 Stream, sized by daily clicks. That server is the thing you are retiring. If you only want to stop maintaining it but like Keitaro's workflow, a different host may be enough. The Tracked vs. Binom comparison walks through the same self-hosted versus managed decision for another self-hosted tracker.
Archive the Keitaro server before you change anything
Make two kinds of copy: a full backup you can restore, and readable exports you can reconcile against.
The full backup. Keitaro's server transfer guide uses kctl backups create on version 11 and later. The dump contains MySQL and ClickHouse data, system settings, local landing pages and offers, the salt, the postback key, SSL certificates, and filters. Copy it off the server to storage you control. It is useful if you ever need Keitaro running again on another machine. It is not an import file for Tracked.
Readable exports. Keitaro reports, the click log, and the conversion log can export to CSV or HTML, with finished files under Reports → Exported Reports. Large exports can time out. Narrow the date range or drop columns, and export in slices by campaign and month.
Page source files. Keitaro stores landing pages of type Local on the tracker server after a ZIP upload. Its local-page documentation covers upload, not download. If you no longer have the original ZIPs, get the files off the server while you still have access. Pages edited in Keitaro's editor may differ from the original ZIP, so compare them.
Inventory one campaign: postbacks, click macros, costs, and domains
Work campaign by campaign. Do not try to recreate the whole tracker in one pass.
| Keitaro item | What to record | Tracked rebuild |
|---|---|---|
| Tracking domain and campaign URL | Domain, A record target, campaign alias, and the full ad URL each traffic source uses | A new subdomain connected as a Tracked custom domain; the old domain stays on the Keitaro server |
| Traffic source parameters | Source, campaign, placement, creative, and source click-ID tokens in the ad URL | The same values carried into the Tracked campaign URL and checked in reports |
| Flows and filters | Flow order, filter conditions, landing and offer weights, fallback flow | Conditional rules and weighted routes; weights you set yourself |
| Local landing pages | Source files, JS adapter, /?_lp=1 or {offer} CTA links, any offer_id targeting | Hosted HTML/ZIP page with CTAs pointed at /click/1, /click/2 |
| Offer URLs | Network parameter carrying {subid}, such as sub1={subid} | The same network field carrying {{click.id}} |
| Network postback | subid, status, payout, tid, currency mappings and any parameter aliases | click_id, optional payout, currency, timestamp, conversion_id |
| Costs | Whether cost comes from the source's cost parameter or from manual "Update costs" | Provider spend sync where Tracked supports that source; otherwise compare spend outside Tracked |
| Outbound S2S postbacks | Any Keitaro postbacks fired back to traffic sources | Verify the matching Tracked provider path before relying on it |
Map Keitaro postbacks to Tracked postbacks
Keitaro's postback reference requires subid (its click ID) and status. Statuses include Lead, Sale, and Rejected. payout, currency, and tid are optional, and tid records repeat conversions on one click. The affiliate network guide shows the offer side, for example &sub1={subid}, with the network's own macro returned in the postback's subid.
Tracked's callback is GET /postback?click_id=.... Only click_id is required. Send payout for a primary conversion and leave type off. A typed callback records a secondary event with zero payout. Pass a unique conversion_id when the network has one, so retries do not create duplicates. The postback setup guide shows the full pattern.
Status logic does not carry over. Tracked's generic callback has no verified equivalent of Keitaro's Rejected status cancelling a payout. If your network sends Lead first and Sale later, decide which one is the primary conversion. Make the other a typed secondary event.
Note how costs arrive today
Keitaro takes cost either from a cost parameter set in the traffic source or from its manual cost update, which spreads a total across clicks. Record which method each campaign uses. In Tracked, spend comes from provider sync where a connection exists for that source. For other sources, keep comparing spend in the ad platform or a spreadsheet until you have confirmed a supported path.
Rebuild the campaign and landing page in Tracked
Create the Tracked campaign while Keitaro keeps serving live traffic.
- Connect a new tracking subdomain. Use something like
go2.example.com, not the hostname your Keitaro ads use. Changing the existing A record would move every old ad URL and postback at once. - Move the page. If you have the source files, upload the HTML or ZIP as a hosted page. Then you can edit it beside its reports. Remove Keitaro's JS adapter and replace
/?_lp=1or{offer}links with Tracked click slots. If the page has to stay on its current host, test proxy or redirect mode. The hosted, proxy, and redirect guide covers the tradeoffs. - Map CTAs by intent. A Keitaro link with
&offer_id=10targets one offer, while plain{offer}picks from the flow. In Tracked, give each distinct choice its own click slot and offer pool. The weighted offer rotation guide has a worked button-to-pool example. - Rebuild flows as routes. Translate filters into conditional rules and set weights yourself. Leave out filters you no longer need rather than copying every legacy branch.
- Swap the offer token. Replace
sub1={subid}withsub1={{click.id}}, using whatever field the network actually stores. - Add a separate callback. Build the Tracked postback with the network's macro in
click_id. Do not edit the existing Keitaro postback.
Test with a fresh visit. Confirm the page loads, the source parameters survive, and each CTA reaches the right offer. Check that the network receives a real Tracked ID, not literal macro text. Then fire a permitted test conversion and confirm it lands once on the right click. If it does not, the postback troubleshooting guide lists the usual causes.
Cut over by campaign, not by server
Pick one campaign or one clearly identifiable ad segment. Set a rollback trigger before changing anything. Good triggers are a missing click ID, a page error, a wrong offer, or a conversion attached to the wrong click. Then point only that segment's ads at the Tracked URL.
Leave everything else on Keitaro. A gradual cutover means the server keeps running for weeks. Budget for that. Keep Keitaro updated and its SSL renewing, and don't downsize it until its traffic is gone.
Avoid double counting during the overlap
Two trackers will hold pending clicks at once. Each conversion must return only to the tracker that issued its click ID.
- Use separate callbacks. Keep Keitaro's postback for Keitaro-issued
subidvalues and add Tracked's for Tracked IDs. Use separate network offers or campaigns if the network allows only one postback per scope. - Don't fan out. Sending every conversion to both trackers creates failed callbacks at best and misattributed rows at worst. A Tracked callback with an ID Tracked never issued returns "Click not found" and records nothing.
- Count each segment once. When summing results, take Keitaro's numbers for ads still on Keitaro and Tracked's for ads you moved. Never add both trackers' totals for the same ad and date range.
Reconcile, then retire the Keitaro server
Before expanding, compare the moved segment for the same dates: visits, offer clicks, conversions, and payout in Tracked against the network's own report. Wait for the offer's approval or rejection lag to pass. Once that segment checks out, move the next campaign.
Shut the server down only when all of these are true:
| Check before shutdown | Why |
|---|---|
| No active ad, link, or placement points at a Keitaro domain | A dead server turns any forgotten URL into wasted spend |
| The longest conversion window for Keitaro clicks has passed | Late postbacks to a dead server are lost |
| Network postbacks for Keitaro offers are removed or re-scoped | Stops callbacks failing against a missing host |
Final kctl backups create dump copied off the server | Lets you restore Keitaro elsewhere if a dispute comes up |
| CSV exports saved for every campaign and month you report on | Readable history without a running server |
| Local landing-page files saved | The server is where they live |
| License unbound or cancelled per your Keitaro account terms | Avoid paying for an unused license |
| DNS records for retired domains removed or re-pointed deliberately | Prevents a stale A record pointing at a reassigned IP |
Then cancel the server.
Frequently asked questions
Can I import a Keitaro backup into Tracked?
No verified path exists. A kctl dump is a Keitaro-format backup of MySQL, ClickHouse, settings, and local pages, and it restores into Keitaro. Keep it as an archive. Rebuild live campaigns in Tracked and use CSV exports for reconciliation.
Does Keitaro's {subid} work in a Tracked offer URL?
No. {subid} resolves only on the Keitaro server. For new Tracked traffic, put {{click.id}} in the network's sub field. Return that stored value to Tracked's postback as click_id.
Should I point my existing Keitaro domain at Tracked?
Not during the migration. Old ad URLs and every Keitaro postback use that hostname. Use a new subdomain for Tracked so both systems run side by side. Re-point or remove the old domain only after its traffic and conversion window are finished.
How long should I keep the Keitaro server running?
At least until no ads point at it and the longest conversion and rejection window for Keitaro clicks has passed. Take a final backup and exports before cancelling. The exact period depends on each offer's lag, so check it with the network.
Will my Keitaro flows and filters convert automatically?
No. Translate each flow into Tracked conditional rules and weighted routes, then test them. Weights in Tracked are set by you. Automatic winner selection is in development, not available today.
Sources
- Keitaro: Installation and server requirements, checked October 22, 2026.
- Keitaro: Transfer tracker to another server, checked October 22, 2026.
- Keitaro: Export reports, checked October 22, 2026.
- Keitaro: Landing page: Local, checked October 22, 2026.
- Keitaro: Postback, checked October 22, 2026.
- Keitaro: Affiliate networks in Keitaro, checked October 22, 2026.
- Keitaro: Updating costs manually, checked October 22, 2026.