When moving makes sense
The move pays off if you mostly use Keitaro to distribute traffic: streams by country and device, a bot filter in front of the offer, many domains. In TDS.SO the routing, the bot filter, the click log and statistics run in the cloud, and your VPS only runs a web server that passes traffic on. There is nothing to update on that server.
Stay on Keitaro, or move later, if you depend on things TDS.SO does not have: PHP landers, click limits per stream, keyword or mobile operator filters, CURL and FormSubmit redirects, or deep reports built over years. The TDS.SO tracker (offers, conversions, revenue, ROI) is in beta, so compare it with your current reports on one campaign before you move the rest.
What maps to what
| Keitaro | TDS.SO |
|---|---|
| Campaign | Link: domain/slug or the whole domain |
| (no direct equivalent) | Template: shared settings for many links |
| Stream | Stream: checked top to bottom, the first match wins; a stream without conditions never fires |
| Final stream | Main URL, the Everything else row |
| Bot filter stream | The template's Filter Level and Bot Action, checked before streams |
| Stream weight | URL shares inside a stream or the main URL |
| User binding | How to choose → Keep the same |
| Groups | Tags |
| Offers, traffic sources | Tracker → Offers and Traffic Sources (beta) |
A template is the part Keitaro does not have. You describe streams, the redirect type and the bot filter once, then create links from it. The redirect type, the bot filter and parameter forwarding apply to existing links as soon as you change the template. The URL, the bot URL and streams are copied into a link when you create it.
Stream filters and conditions
Most Keitaro filters have a condition with the same name: country, region, city, ISP, IP, proxy, device, browser, OS, language and referrer. Sub ID filters become the URL Parameter condition. Two differences catch people out:
- The only operators are is and is not. There are no regular expressions.
- Time and day of week conditions use UTC. Statistics use the time zone from your profile settings.
There is no equivalent for click limits, keywords, search engines, mobile operators or connection type. Write those streams down before you start and decide what replaces them. Often a country plus device condition covers what the old filter did. The full list is in the conditions reference.
Macros
| Keitaro | TDS.SO |
|---|---|
{subid} | {click_id} |
{country} | {country} or {country_code}, the country code |
{region} | {region}, a name rather than a code |
{user_agent}, {language}, {referrer} | {ua}, {lang}, {referer} |
{device_type:lang} | {device}: pc, mobile, tablet |
{sub_id_1}…{sub_id_30} | {name} of any GET parameter, for example {sub1} for ?sub1=abc |
In TDS.SO {sub_id} is an ordinary query parameter, not the click ID, so replace {subid} with {click_id} everywhere. There are no campaign or stream macros such as {campaign_name} or {stream_id}. The full list is in the macros reference.
Redirect types
| Keitaro | TDS.SO |
|---|---|
| HTTP | 302 Temporary |
| Meta, double meta, JS | Meta Refresh, Double Meta Refresh, JavaScript |
| With empty referrer | Any type with a page, for example Meta Refresh |
| Iframe | iFrame or Simple Iframe |
There are no CURL, FormSubmit or Remote redirects. If a campaign relies on one of them, keep it on Keitaro for now. The other methods are listed on the redirects page.
Conversions and postbacks
If you only use Keitaro for routing, nothing changes on the network side: the click ID still reaches the offer in the parameter your network expects, and the network counts conversions through its own link.
If you want TDS.SO to count conversions, turn the tracker on in Settings → General → Tracker. Create the offer with {click_id} in its URL, attach the offer and a traffic source to the link, and paste the postback address from Tracker → Conversions into the network. The tracker accepts common parameter names, so a network that sends subid or clickid works without renaming. Revenue counts approved conversions, cost counts all clicks. Details are in the postbacks docs.
Run both trackers side by side on the pilot campaign for a week and compare conversions one by one, not only the totals. The article on why tracker and network numbers differ lists the usual causes.
Plan: one domain at a time
- Inventory. For each campaign write down the domain, alias, streams, bot settings, redirect type and macros. Mark streams that use filters TDS.SO does not have.
- Server. Install the TDS.SO server on a separate VPS with one command. The installer stops nginx and Apache, so the server that runs Keitaro will not do: its campaigns would stop opening.
- Templates. Build templates from the tables above. Repeated streams can be saved as a set with Save all streams as a set.
- Pilot domain. Add the domain in the dashboard and create links with the same alias (Slug after / → Custom), or Just / for the whole domain. Only then point the A record to the new server. Until a link exists, the domain answers
404. - Test. Send clicks from different countries and devices, check that streams and the bot filter fire, and compare a week of numbers with Keitaro.
- The rest. Move the remaining domains the same way. Export your Keitaro reports and turn it off once clicks on it stop.
Until you switch off Keitaro, going back is one DNS change: point the A record back to the Keitaro server. Domains you have not moved keep working on Keitaro the whole time.
Help with the move
There is no import tool. Send a screenshot of your campaign settings in Telegram or fill in the request on the switching page, and we will tell you what moves and what does not before you start. Help is free. You pay only for the plan, from $9.99 a week, with unlimited clicks and domains: see pricing. The full reference is in the docs.
Questions
Can I import campaigns from Keitaro?
No. There is no import: you recreate templates and links by hand using the mapping tables. For many similar campaigns, build one template and create links from it, or use bulk creation or the API.
Can I keep the same URLs?
Yes, if the old path is one segment. Create the link with a custom slug equal to the Keitaro alias, or use the whole domain. A path with a slash inside it cannot be reproduced, because a link is looked up by the first path segment.
Can TDS.SO run on the same server as Keitaro?
No. The installer stops nginx and Apache, so Keitaro campaigns on that server would stop opening. Use a separate VPS for TDS.SO.
What happens to my Keitaro statistics?
They stay in Keitaro. Export the reports you need before you turn it off. TDS.SO starts counting from the first click on the new links.
Do PHP landers work?
No. TDS.SO serves static landing pages uploaded as HTML or ZIP and pages built with the AI generator. Keep PHP landers on your own hosting and link to them as destinations.