Orbitra is a modern traffic management and conversion tracking system. A simpler and faster alternative to Keitaro Tracker, while keeping full API and feature compatibility.
To install automatically on a clean Linux server, run:
wget -qO- https://raw.githubusercontent.com/fenjo26/Orbitra.link/main/install.sh | bashThe installer automatically:
- Downloads the source code from GitHub
- Installs Nginx, PHP 8.0+ (FPM), SQLite3 and Node.js 20
- Builds and deploys the React/Vite frontend
- Configures a Let's Encrypt SSL certificate for your domain
Orbitra is deliberately lightweight — it runs on plain PHP + SQLite behind Nginx, with no heavy frameworks and no separate database server (no ClickHouse, Redis or MySQL). Because of that it needs far less RAM than ClickHouse-based trackers and comfortably fits on the smallest VPS plans.
- CPU: 1 vCPU (x86_64)
- RAM: 1 GB (2 GB recommended)
- Disk: 20 GB SSD
- OS: Ubuntu 20.04 / 22.04 / 24.04 or Debian 11 / 12
- Clean server, no control panel; root/sudo access
| Clicks per day | RAM | CPU | Disk |
|---|---|---|---|
| up to ~100,000 | 1–2 GB | 1–2 vCPU | 20 GB SSD |
| ~100,000 – 500,000 | 2–4 GB | 2 vCPU | 40 GB SSD |
| ~500,000 – 1,000,000 | 4–8 GB | 4 vCPU | 80 GB SSD |
✅ Field-tested: Orbitra runs well on a 2 vCPU / 2 GB RAM / 20 GB SSD VPS (Ubuntu 24.04) for low traffic — a comfortable, inexpensive starting point. The higher rows above are headroom for heavier traffic, not a hard requirement.
Software (installed automatically by install.sh): Nginx, PHP 8.0+ with FPM (php-sqlite3, php-curl, php-mbstring, php-xml, php-zip), SQLite 3, Node.js 20 (build only), Certbot for SSL.
💡 Why lower than Keitaro? Keitaro stores clicks in ClickHouse + Redis + MySQL, so its RAM requirements scale steeply (up to 64 GB for millions of clicks/day). Orbitra keeps everything in a single SQLite file, so RAM is not the bottleneck — disk I/O and SQLite's single-writer model are. SQLite (in WAL mode) handles low-to-mid volume comfortably; for sustained millions of clicks per day with heavy analytics, a columnar-DB tracker like Keitaro is architecturally a better fit.
💡 Note on the 1 GB plan: running the tracker needs very little memory, but the installer builds the frontend on the server with Vite, which is the most memory-hungry step. On a 1 GB box add ~1–2 GB of swap before installing (or build the frontend elsewhere) so the build doesn't run out of memory. Disk usage stays small — it grows mainly with the SQLite click/conversion logs over time.
- Click API with tokens — full compatibility with existing integration scripts
- Import from Keitaro — migrate campaigns, offers, domains and streams while preserving tokens
- API compatibility — works with existing postbacks and webhooks
- Backend: PHP 8.3+ without heavy frameworks (clean code)
- Database: SQLite 3 (single file, automatic schema creation)
- Frontend: React 19 + Vite 7 + Tailwind CSS 4
- UI/UX: Modern design with multiple built-in themes (Light, Dark, Green, Neon) and a custom palette
- 6 payout models: CPC, CPuC, CPM, CPA, CPS, RevShare
- 30+ parameters: keyword, sub_id_1...30, cost, creative_id and more
- Advanced stream logic: Intercept → Regular → Fallback with weights and positions
- Advanced filtering: GEO, Device, OS, Browser, ISP, IP, Language, Referer
- A/B testing: built-in split-test support with weighted rotation
- S2S Postbacks — Server-to-Server postbacks from affiliate networks
- Affiliate network templates: platform-level (Everflow, CAKE, HitPath, Affise, TUNE/HasOffers) plus networks Leadbit, M4Leads, Dr.Cash, AdCombo and others
- Source templates: Facebook, Google, TikTok, Yandex, Taboola, Outbrain, Email and others
- Click API — tokens for working with integration scripts
- Telegram Bot — real-time monitoring and notifications
- Dashboard — aggregated statistics for clicks, conversions and revenue
- Trends — detailed analytics with charts across 8 metrics
- Campaign Reports — campaign reports grouped by any parameter
- Conversion Log — detailed conversion log with filters
- Traffic Simulation — click simulation for testing streams
- 7 languages: 🇬🇧 English, 🇷🇺 Russian, 🇺🇦 Ukrainian, 🇪🇸 Spanish, 🇨🇳 Chinese (Simplified), 🇫🇷 French, 🇩🇪 German
- Full i18n coverage — every UI element is localized, with 100% key parity across all locales
- Language switching — in profile settings, without a page reload
- 10+ commands:
/stats,/campaigns,/top,/conversionsand others - Notifications: instant conversion notifications
- Daily summary: automatic campaign report
- Multilingual: the bot speaks all 7 interface languages (EN, RU, UK, ES, ZH, FR, DE) via
/lang
- DNS check — automatic A-record verification
- HTTPS-only — forced redirect to HTTPS
- Bot protection — intercepts
/robots.txtandX-Robots-Tag - Parking mode — domain parking with protection
- Full data migration: campaigns, offers, domains, streams, affiliate networks, sources, landings
- Token preservation — Click API tokens are carried over for compatibility
- In-UI guide — step-by-step instructions for creating a Keitaro backup
- Preview mode — preview before the real import
- Per-campaign human verification — stop corporate email security crawlers and clickbots from polluting your statistics
- reCAPTCHA v2 — classic "I'm not a robot" checkbox
- reCAPTCHA v3 — invisible, score-based with a configurable threshold
- Custom code — paste any HTML/JS verification widget
- Clean stats — clicks are logged only after a successful challenge, so bots never appear in reports; challenge state is signed (HMAC-SHA256) and expires in 15 minutes to prevent replay
Orbitra/
├── api.php # REST API (60+ endpoints)
├── index.php # Main tracker (click handling)
├── admin.php # Admin panel entry point
├── postback.php # Postback handler
├── click.php # Click API
├── telegram_bot.php # Telegram bot webhook handler
├── config.php # DB configuration and migrations
├── database.sql # DB schema documentation
├── version.php # System version
├── router.php # PHP built-in server router
├── install.sh # Auto-installer
├── *_cron.php # Cron jobs (aggregator, backorder, source checks)
├── .htaccess # Apache rewrite rules
│
├── core/ # System modules
│ ├── keitaro_import.php # Import from Keitaro
│ ├── click_api.php # Click API implementation
│ ├── backorder.php # Domain monitoring
│ └── SxGeo.php # Geo IP database
│
├── frontend/ # React + Vite frontend
│ ├── src/
│ │ ├── App.jsx # Main component with routing
│ │ ├── main.jsx # Entry point
│ │ ├── components/ # 53 React components
│ │ │ ├── CampaignEditor.jsx # Campaign editor (~130KB)
│ │ │ ├── IntegrationsPage.jsx # Integrations
│ │ │ ├── MigrationsPage.jsx # Migrations and import
│ │ │ ├── ConversionsLog.jsx # Conversion log
│ │ │ ├── CampaignReports.jsx # Campaign reports
│ │ │ └── ... # Other components
│ │ ├── contexts/
│ │ │ └── LanguageContext.jsx # i18n context
│ │ └── locales/ # 7 languages, 100% key parity
│ │ ├── en.js # English
│ │ ├── ru.js # Russian
│ │ ├── uk.js # Ukrainian
│ │ ├── es.js # Spanish
│ │ ├── zh.js # Chinese
│ │ ├── fr.js # French
│ │ └── de.js # German
│ ├── package.json
│ ├── vite.config.js
│ └── index.html
│
├── docs/ # Documentation
│ ├── index.md # Documentation overview
│ ├── architecture.md # Architecture and technologies
│ ├── features.md # Feature descriptions
│ ├── api.md # REST API documentation
│ ├── deployment.md # Deployment instructions
│ └── keitaro-migration.md # Keitaro migration guide
│
├── aggregator_engines/ # Stats aggregation engines
├── cli/ # CLI utilities
├── landings/ # Uploaded landings
└── vendor/ # Composer dependencies
# Clone the repository
git clone https://github.com/fenjo26/Orbitra.link.git
cd Orbitra
# Install PHP dependencies
composer install --no-dev
# Install frontend dependencies
cd frontend
npm install
npm run dev # Start the dev server (http://localhost:5173)# In the project root
php -S localhost:8080 router.phpcd frontend
npm run buildOrbitra has no default account (admin/admin) — you set the administrator credentials yourself on first run.
The first time you open the admin panel (/admin.php), the system detects that no users exist yet and launches the initial setup wizard. In it you create your own administrator:
- Username — at least 3 characters
- Password — at least 6 characters (with confirmation)
- Timezone and interface language (one of 7 languages)
After the administrator is created the wizard no longer appears, and you log in with the username and password you set.
Full documentation is available in the docs/ folder:
- Overview — documentation navigation
- Architecture — technology stack and DB structure
- Features — detailed feature descriptions
- API — REST API documentation
- Deployment — installation and configuration instructions
POST ?action=keitaro_import_sql— import a Keitaro dump
GET ?action=campaigns— list campaignsGET ?action=get_campaign&id=X— campaign dataPOST ?action=save_campaign— save a campaignPOST ?action=delete_campaign— delete a campaignGET ?action=campaign_report— campaign report
GET ?action=metrics— aggregated statisticsGET ?action=chart— chart dataGET ?action=trends— detailed analyticsGET ?action=conversions— conversion log
GET ?action=affiliate_networks— affiliate networksGET ?action=traffic_sources— traffic sourcesGET ?action=telegram_settings— Telegram bot settings
📖 Full API list: see docs/api.md
A full-screen campaign editor with tabs:
- General: name, alias, domain, source
- Finance: 6 payout models (CPC, CPuC, CPM, CPA, CPS, RevShare)
- Parameters: 30+ parameters (sub_id_1...30, keyword, cost and more)
- Integrations: ready-made scripts for Facebook, Google, TikTok, VK, Yandex
- S2S Postbacks: configure postbacks from affiliate networks
- Notes: text notes for the campaign
- Actions: reports, conversion log, traffic simulation
10 monitoring commands:
/stats [period]— statistics (today, 1d, 7d, 30d, yesterday)/campaigns— list campaigns with metrics/campaign ID— detailed statistics/top— TOP-5 campaigns by revenue/conversions— last 10 conversions/notify on|off— conversion notifications/daily on|off— daily summary/lang en|ru|uk|es|zh|fr|de— bot language
Testing streams and filters:
- IP — set the click's IP address
- User Agent — set the User-Agent
- Country — choose a country (US, RU, DE, GB, FR and more)
- Device — desktop, mobile, tablet
- Language — browser language (en, ru, de, fr, es, pt, zh)
| Model | Description |
|---|---|
| CPC | Pay per click |
| CPuC | Pay per unique click |
| CPM | Pay per 1000 impressions |
| CPA | Pay per action (lead) |
| CPS | Pay per sale |
| RevShare | Percentage of revenue |
On the Keitaro server, run:
# Connect to the Keitaro server
ssh root@YOUR_KEITARO_SERVER_IP
# Create the dump
bash -lc '
source /etc/keitaro/env/inventory.env
# Config for connecting to the DB
cat > /root/keitaro-mariadb.cnf <<EOF
[client]
user=$MARIADB_KEITARO_USER
password=$MARIADB_KEITARO_PASSWORD
host=127.0.0.1
port=3306
protocol=tcp
EOF
chmod 600 /root/keitaro-mariadb.cnf
# Dump the tables
TABLES="keitaro_affiliate_networks keitaro_groups keitaro_offers keitaro_domains keitaro_campaigns keitaro_campaign_postbacks keitaro_landings keitaro_streams keitaro_stream_filters keitaro_stream_offer_associations keitaro_stream_landing_associations keitaro_traffic_sources keitaro_ref_sources"
mysqldump --defaults-extra-file=/root/keitaro-mariadb.cnf \
--single-transaction --quick --skip-lock-tables \
"$MARIADB_KEITARO_DATABASE" $TABLES \
| gzip > /root/keitaro_orbitra_full.sql.gz
ls -lah /root/keitaro_orbitra_full.sql.gz
'
# Download the file
scp root@YOUR_KEITARO_SERVER_IP:/root/keitaro_orbitra_full.sql.gz .- Open Migrations in the admin menu
- Follow the instructions in the "How to create a Keitaro backup" block
- Upload the
keitaro_orbitra_full.sql.gzfile - Choose what to import (campaigns, offers, domains, etc.)
- Click "Show preview" to verify
- Click "Import Into Orbitra" for the real import
Orbitra ships with several built-in theme presets — Light, Dark, Green and Neon — plus a fully Custom theme where you set your own color palette (primary, backgrounds, text). Pick a theme in Settings → Branding.
Configure the logo, colors and name in Settings → Branding.
Switch the language in Profile → Settings. Seven languages are available: English, Russian, Ukrainian, Spanish, Chinese, French and German.
| Category | Technology |
|---|---|
| Backend | PHP 8.3+ |
| Database | SQLite 3 |
| Frontend | React 19.2.0 |
| Build Tool | Vite 7.3.1 |
| UI Framework | Tailwind CSS 4.2.0 |
| Icons | Lucide React 0.575.0 |
| HTTP Client | Axios 1.13.5 |
| Charts | Chart.js 4.5.1 |
| Date Utils | date-fns 3.6.0 |
| PHP Deps | Composer |
- 🎨 Navbar alignment — top menu items no longer wrap to a second line (
whitespace-nowrap), and the two-word labels were made more compact across all 7 languages, so the bar stays neatly aligned. Full page titles are unchanged.
- 🤖 Multilingual Telegram bot — the bot now speaks all 7 interface languages (🇬🇧 English, 🇷🇺 Russian, 🇺🇦 Ukrainian, 🇪🇸 Spanish, 🇨🇳 Chinese, 🇫🇷 French, 🇩🇪 German). Switch with
/lang en|ru|uk|es|zh|fr|de.
- 🖥 Added a System Requirements section to the README (runs comfortably on 1 vCPU / 1 GB RAM / 20 GB SSD).
- 📚 Refreshed the project documentation to the current version and feature set (7 languages, Bot Challenge, platform templates).
- ✉️ Updated the support contact to info@orbitra.link.
- 🌍 Full Multi-Language support — expanded translations beyond 🇷🇺 Russian and 🇬🇧 English. The tracker is now fully localized with 100% key parity in 🇺🇦 Ukrainian, 🇪🇸 Spanish, 🇨🇳 Chinese (Simplified), 🇫🇷 French, and 🇩🇪 German.
- 🤖 Bot Challenge system — per-campaign human verification to stop corporate email security bots and clickbots from polluting your stats. Enable in the campaign editor and choose from:
- reCAPTCHA v2 — classic "I'm not a robot" checkbox
- reCAPTCHA v3 — invisible, score-based (configurable threshold)
- Custom code — paste any HTML/JS verification widget (fully flexible)
- ✉️ Email source editor improvements — collapsible ESP merge-tag reference table for Mailchimp, Klaviyo, ActiveCampaign, GetResponse, Brevo, and SendGrid in the source editor.
- ⚙️ reCAPTCHA settings — Site Key + Secret Key for v2 and v3 configurable from Integrations → reCAPTCHA.
- Clicks are logged only after a successful challenge — bots never appear in statistics at all.
- Challenge state is signed with HMAC-SHA256 (using the existing postback key) and expires in 15 minutes, preventing replay attacks.
- All new UI strings are fully i18n-covered across all 7 locales with 100% key parity.
- 🤖 Bot Challenge system — per-campaign human verification to stop corporate email security bots and clickbots from polluting your stats. Enable in the campaign editor and choose from:
- reCAPTCHA v2 — classic "I'm not a robot" checkbox
- reCAPTCHA v3 — invisible, score-based (configurable threshold)
- Custom code — paste any HTML/JS verification widget (fully flexible)
- ✉️ Email source editor improvements — when editing a traffic source based on the Email template, a collapsible ESP merge-tag reference table shows example macros for Mailchimp, Klaviyo, ActiveCampaign, GetResponse, Brevo, and SendGrid so you know exactly what to paste into the macro field.
- ⚙️ reCAPTCHA settings — Site Key + Secret Key for v2 and v3 configurable from Integrations → reCAPTCHA. Score threshold for v3 is also configurable.
- Clicks are logged only after a successful challenge — bots never appear in statistics at all.
- Challenge state is signed with HMAC-SHA256 (using the existing postback key) and expires in 15 minutes, preventing replay attacks.
- All new UI strings are fully i18n-covered in both 🇷🇺 Russian and 🇬🇧 English locales.
- 🌍 i18n cleanup: hardcoded Russian UI strings moved into the translation system (
en.js/ru.js) across the bulk-import dialog, traffic sources, source editor, domains and migrations pages, so the interface follows the selected language everywhere. Traffic-source and affiliate-network template names (including the new Email and platform templates) are now localized instead of being hardcoded on the backend. English and Russian locales are now at full key parity. - 📖 The README has been fully translated to English for the international audience.
- ✉️ Email traffic source template — for email marketers. Comes with pre-configured sub-parameters
subscriber_id,campaign_id,list_id,broadcast_id,esp, which you map to your ESP's merge tags. - 🌐 Platform-level affiliate network templates: Everflow, CAKE, HitPath, Affise, TUNE/HasOffers. Any smaller network running on these platforms can now be connected by selecting the platform template — without a separate entry per company. The click-id parameter appended to the offer is filled in with each platform's standard field (Everflow
sub1, CAKEs1, HitPathc1, Affisesub1, TUNEaff_sub).
- 🐛 HTTP 500 error on landing-only streams (a stream with a landing and no offer). The click log required an offer (
offer_id NOT NULL+ foreign key), so a no-offer click failed with a DB error before the landing could load. Theclicks.offer_idcolumn is now nullable (automatic DB migration), no-offer clicks are logged with NULL, and a logging failure can no longer break the page. Landing statistics keep working; only the offer is left unattributed — as expected.
- 🐛 More reliable auto-update: when locally modified code files blocked
git pull(the "Your local changes would be overwritten" error), the updater now resets those changes itself and retries the update. Data is not affected — the database, uploaded landings and geo databases live outside git, andconfig.phpis preserved.
- ✨ Transition from a local landing to an offer via the
/?_lp=1link (Keitaro-compatible). On the landing page, set the offer button as<a href="/?_lp=1">Offer</a>— on click the tracker finds the offer linked to the click and redirects with macro substitution ({clickid},{sub_id_1}, etc.). Selecting a specific offer is supported:/?_lp=1&offer_id=10.
- 🐛 The "Landing + Offer" stream scheme now also works with a single landing and no offer. Previously, removing the offer could prevent the landing from opening — now the selected landing is always used as the destination, and the offer is optional.
- 🐛 Stream filters are now actually applied. Previously only
Country,Device,BotandLanguagefilters were processed, whileBrowser,OS,IP,Referer,Keyword,WeekdayandTimesilently passed all traffic (for example, a "Browser = TikTok" filter in include mode still opened in every browser). All of these filters are now checked. - 🐛 Browser detection recognizes in-app browsers (TikTok, Facebook, Instagram, etc.) by user-agent signatures — TikTok filtering works correctly.
- 🐛 The
IPfilter supports masks (10.0.0.*);Country/Device/OSmatching is now case-insensitive. - 🐛 If the IP is not resolved by the free geo database (country
Unknown), the country filter passes such a visitor instead of blocking — so you don't lose real traffic.
- ✨
ISPfilter (by provider/network) via the free MaxMind GeoLite2-ASN database. UploadGeoLite2-ASN.mmdbinto the/geo/folder (using the same MaxMind key as City) — and the filter works, matching the network organization and AS number. Instructions and a link have been added to the "Geo Databases" page.
ℹ️ Without the GeoLite2-ASN database, the
ISPfilter simply passes traffic (nothing breaks). TheConnectionfilter (wifi/mobile/cable) is still unsupported — there is no free data source for it.
- 🐛 Local landings (ZIP) are now served correctly on click. Previously the click handler looked for files in
/api/landings/{id}, while uploads saved them to/landings/{id}— which caused a "Local landing files not found" error and prevented the transition to the landing. The paths have been unified.
- ✨ Keitaro Migration UI with step-by-step instructions
- ✨ Click API tokens for campaigns (Keitaro compatibility)
- ✨ Backup command copy button
- ✨ Campaign Reports with grouping by parameters
- ✨ Traffic Simulation with click parameter configuration
- ✨ Token preservation on import from Keitaro
- ✨ Fixed terminology (affiliate networks)
- ✨ Full localization of modal dialogs
- 🐛 Fixed
loadConversionLogs is not defined - 🐛 Fixed modal positioning (the navbar no longer overlaps)
- 🐛 Fixed CampaignReports styles for a consistent design
Contributions are welcome! Please:
- Fork the repository
- Create a branch for your feature (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is licensed under the MIT License — see the LICENSE file for details.
- GitHub Issues: https://github.com/fenjo26/Orbitra.link/issues
- Documentation: docs/
- Email: info@orbitra.link
Orbitra — a modern tracker for affiliate marketers and webmasters.
Tags: tracker, affiliate-marketing, keitaro-alternative, php-tracker, react-admin, cpa-network, traffic-management, split-testing, conversion-tracking