Кейс

Open Tracker — открытый трекер CPA-трафика для арбитража и аффилейт-маркетинга

Открытый CPA-трекер на Python/FastAPI: потоки трафика, 25+ фильтров, S2S-постбэки, идемпотентные конверсии, аналитика CR/EPC/CPC/ROI, Click API v3, Admin REST API. Без SPA — серверный рендеринг с Alpine.js, HTMX и Chart.js.

Архитектура, full-stack разработка, Python, FastAPI, SQLAlchemy Core, проектирование предметной области 2026
Opensource Python
Open Tracker — открытый трекер CPA-трафика для арбитража и аффилейт-маркетинга

Какую задачу решал проект.

Рынок CPA-трекеров представлен закрытыми платными решениями (Keitaro, Binom, BeMob). Командам, которые работают с платным трафиком, нужен инструмент, где клик принимается за миллисекунды, маршрутизируется по правилам, конверсия атрибутируется и возвращается в источник — и всё это на собственном сервере.

Архитектурно нужно было решить: спроектировать pipeline обработки клика с GeoIP и device detection; реализовать систему фильтров из 25+ критериев с AND/OR логикой; обеспечить идемпотентность постбэков; построить аналитику CR/EPC/CPC/ROI поверх миллионов кликов без OLAP; поддержать интеграции с источниками трафика (Facebook, ExoClick, PropellerAds) через шаблоны и outgoing S2S.

Ограничения и требования
  • Pipeline обработки клика: GeoIP, device, bot detection → фильтры → поток → 302 redirect.
  • Три типа потоков: forced (перехват), regular (weight/A/B), default (catch-all).
  • 25+ критериев фильтрации: гео, устройство, OS, браузер, VPN, sub_id_1..30 с AND/OR.
  • Идемпотентные S2S-постбэки: защита от дубликатов по (click_id, transaction_id).
  • Аналитика в реальном времени: CR, EPC, CPC, ROI, RPC с drill-down.
  • Click API v3, LP API, Admin REST API, outgoing S2S postback, traffic log.

Результат

Open Tracker — это открытый self-hosted CPA-трекер, который я спроектировал и разработал с нуля. Серверный рендеринг на FastAPI + Jinja2, интерактив через HTMX, Alpine.js и Chart.js.
Проект построен вокруг конвейера обработки клика: GeoIP и device detection, система фильтров из 25+ критериев, маршрутизация по потокам (forced / regular / default), идемпотентные постбэки и аналитика с CR, EPC, CPC и ROI.
Система написана на Python (FastAPI + SQLAlchemy 2.0 Core + Jinja2), работает на SQLite для быстрого старта и поддерживает PostgreSQL. 200+ тестов, ruff clean.
Проект с открытым исходным кодом под AGPL-3.0. Исходники доступны на GitHub.

Решение

Как устроена архитектура.

Монолит с фабрикой FastAPI: бизнес-логика в core/, веб-слой в web/. SQLAlchemy 2.0 Core без ORM — 24+ таблиц через _table(conn, name). ClickIngestor Protocol как точка расширения для очередей и ClickHouse.

Pipeline обработки клика

GET /click/{slug} → build_click_context() (GeoIP, device, bot) → resolve_stream() (фильтры + лимиты + привязка) → record_click() → placeholders.substitute() → 302 redirect. Каждый шаг логируется в traffic_log.

Три типа потоков маршрутизации

Forced — перехватывают весь трафик по приоритету. Regular — маршрутизация по весу или A/B-сплит с user binding. Default — catch-all fallback. Лимиты (caps) на клики/день/месяц и бан-листы.

Идемпотентные постбэки и конверсии

GET|POST /postback принимает конверсии (sale/lead/reject/rebill). Связка (click_id, transaction_id) защищает от дубликатов. Outgoing S2S postback возвращает конверсию в источник трафика. Image-pixel fallback для нетипичных сценариев.

25+ критериев фильтрации с AND/OR

Гео (country, region, city, ISP, ASN), устройство (тип, OS, браузер), VPN/прокси, параметры кампании (source, keyword, creative, sub_id_1..30), время (hour, day of week), уникальность. Filter logic: and/or. Поддержка @empty.

Аналитика и drill-down

build_chart_payload(): sparse SQL GROUP BY + Python zero-fill для временных рядов. KPI: CR, EPC, CPC, ROI, RPC. Drill-down: campaign → stream → offer. Режим даты: по клику или по конверсии. Экспорт CSV/XLSX.

Click API v3, LP API и Admin REST

Click API v3 — server-side ingest для PHP/WordPress без 302. LP API — интеграция лендингов. Admin REST API (/api/v1/*) с Bearer-токеном: кампании, потоки, офферы, клики, конверсии, отчёты.

Экраны

Интерфейс системы.

Дашборд Open Tracker — сводка и быстрая навигация

Дашборд Open Tracker — сводка и быстрая навигация

Список кампаний с потоками трафика

Список кампаний с потоками трафика

Детальная страница кампании со потоками и метриками

Детальная страница кампании со потоками и метриками

Редактирование потока: тип, приоритет, фильтры, лимиты, привязка посетителя

Редактирование потока: тип, приоритет, фильтры, лимиты, привязка посетителя

Справочник офферов с выплатами и валютами

Справочник офферов с выплатами и валютами

Статистика: CR, EPC, CPC, ROI с графиками Chart.js

Статистика: CR, EPC, CPC, ROI с графиками Chart.js

Журнал кликов с фильтрами и экспортом

Журнал кликов с фильтрами и экспортом

Журнал конверсий и постбэков

Журнал конверсий и постбэков

Итог

Что получает команда.

Полноценный CPA-трекер с открытым кодом: от приёма клика до аналитики ROI.

Python + FastAPI

технологический стек

SQLAlchemy 2.0 Core, Jinja2, Alpine.js, HTMX, Chart.js, Tailwind CDN. SQLite для старта, PostgreSQL для продакшена.

24+ таблиц

схема данных

Кампании, потоки, офферы, источники, клики, посетители, конверсии, daily-агрегаты, интеграции, хелс-чеки — всё через SQLAlchemy Core.

25+ фильтров

критериев маршрутизации

Гео, устройство, OS, браузер, VPN, sub_id_1..30, время, уникальность — с AND/OR логикой и @empty.

200+ тестов

покрытие

pytest: ingest, постбэки, фильтры, потоки, binding, conversion cap, drill-down, traffic log, hardening. ruff clean.