Атрибуция
Читайте лидерборд «Источники» — выручка по источнику, стране, ссылке и фанату, сверенная с чистым итогом вашего аккаунта.
Атрибуция отвечает на один вопрос: откуда пришёл каждый платящий фанат и сколько он заплатил? TEASE берёт каждую транзакцию на вашем аккаунте OnlyFans, разрешает каждого платящего фаната к единственному источнику привлечения и сворачивает деньги в лидерборд, который всегда сверяется с чистым итогом вашего аккаунта — без двойного учёта, без денег, которые тихо исчезают.
Результат — это ранжирование выручки по источникам, которое вы можете углублять источник → страна → ссылка → фанат, с разбивкой по типу денег (подписки, ребиллы, PPV, чаевые), помеченное новый-vs-возвращающийся, с конверсией пробный→платный и рассчитанными за вас коэффициентами фан-экономики (ARPPU, APC, APV, ARPNU).
Атрибуция читается из /api/admin/stats
Отдельного endpoint-а /attribution нет. Весь лидерборд, его углубления и фан-экономика
возвращаются внутри /api/admin/stats под объектом revenue — revenue.sources
(лидерборд), revenue.fans и revenue.fans_account (экономика). Гео/источниковая разбивка по
ссылкам — это отдельное чтение,
/api/admin/domain_links/smartlinks/breakdown. Все денежные значения — это целые центы.
Ментальная модель
Каждый платящий фанат попадает ровно в одну из трёх корзин. Корзины непересекающиеся, и их выручка суммируется в итог вашего аккаунта.
| Корзина | Значение |
|---|---|
| Attributed | Фанат разрешился к реальному источнику (домен/ссылка, которой вы владеете). Их деньги появляются в строке sources. |
| Organic | Фанат заплатил, но не нёс сигнала источника — прямой трафик OnlyFans, репосты, сарафанное радио. |
| Pending | Фанат известен, но пока не разрешается к источнику (например, подписчик бесплатного пробного периода, который ещё не произвёл сигнал источника). Pending никогда не сворачивается тихо в organic — это своя строка, чтобы вы честно видели неопределённую выручку. |
Почему корзины всегда сходятся
Каждая строка sources плюс строка organic плюс строка pending суммируются в чистый итог аккаунта за
выбранное окно. Флаг reconciliation.balanced в ответе это подтверждает. Если вы когда-нибудь
видите balanced: false, считайте цифры предварительными — это значит, что окно данных ещё
устаканивалось.
Обогащение «органики» из переписки
Многие organic-фаны на самом деле оставляют в переписке подсказки о том, откуда пришли — и
куда больше. Вкладка «Фаны» (в Раскладке) читает историю диалога локально и одним
LLM-проходом (на вашем ключе) на каждого фана достаёт:
- портрет — досье на 13 полей (кто он, что покупает, как заходить);
- страну — по тому, что фан привязывает к себе (место, язык, часовой пояс);
- источник — когда фан на него ссылается (платформа, которую он упоминает, или намёк по формату контента: «your reel» → Instagram).
Нажмите «Запустить разбор» — один раз. Дальше панель ведёт весь прогон сама: движок медленно и безопасно вытягивает историю переписки каждого фана из OnlyFans (начиная с крупнейших плательщиков, по одному небольшому батчу за цикл), а мы строим портрет по мере поступления диалога. Скан рассказывает о себе вживую: строка прогресса и честные шаги — «читаю переписку», «определяю страну и источник», «составляю портрет», — а карточки прибавляются сами, без обновления страницы. Повторно нажимать не нужно. Рядом с кнопкой — значок «?»: там и объяснение, как это работает, и ползунок «сколько разобрать». Вторая кнопка, «Пересканировать всех», заново прогоняет уже собранных фанов улучшенным разбором (без единого обращения к OnlyFans). «Остановить» прекращает дальнейший сбор (уже запущенные батчи завершатся сами). Уверенный источник из переписки (≥ 0.6) заменяет «органику» этого фана в лидерборде; более слабые сигналы всё равно видны на карточке, но не трогают денежный сплит. Страна — самый богатый сигнал из переписки: органик редко прямо называет источник, поэтому источник-из-переписки — это бонус поверх портрета и страны.
Прогон бан-безопасен по устройству: сам сбор — это пассивный, серийный, человечный захват движком (одновременно один поток, само-остановка на любой троттлинг); панель лишь ставит в очередь следующий батч и никогда не гонит OnlyFans напрямую, а портрет — это один локальный LLM-проход по уже собранному тексту. Каждое чтение ограничено вашим аккаунтом.
Честно о точности
Это наш стандарт, и у него есть честный потолок. По живому замеру от 2026-08-01: источник находится у 51,5% разобранных фанов (1 020 из 1 979), страна — у 67,4% (1 333 из 1 979). Почему не у всех: если фан пришёл «органикой» и сам не назвал площадку — источник взять неоткуда (так делает лишь ~1 из 10), таким мы честно оставляем «Органика», а не выдумываем. Фаны, пришедшие по вашей короткой ссылке, имеют точный источник всегда — это факт перехода, а не догадка ИИ. Слишком короткие переписки не дают страну. Точность постоянно растёт: движок собирает больше переписки, а мы дорабатываем сам разбор. Инфографика «Что мы знаем о фанах» над списком показывает текущий охват, а кнопка ⓘ рядом объясняет цифры простым языком.
Фильтры по странам и источникам
Кнопка «Фильтр» над списком раскрывает чипы: страны и тиры (T1/T2) и источники (у каждого своя иконка). Чипы — мультивыбор: отметьте несколько стран и/или источников, и в сетке останутся только эти фаны. Иконка источника видна и на карточке фаната. Рядом — кнопка сортировки (по потраченному или по дате подписки), а узкая строка «Поиск» ищет по нику или логину.
Экспорт всех фанов
Кнопка «Экспорт» (в шапке вкладки «Фаны», справа) открывает окно с описанием архива и кнопкой «Скачать» — ZIP по всем разобранным фанам, для оффлайн-анализа или для вашего ИИ-агента:
fans.csv— сводка по строке на фана (имя, страна, источник, заработано, теги, портрет);fans/<fan_id>.json— по каждому фану{info, portrait, conversation}с полной перепиской;methodology.txt— как мы определяем источник/страну/портрет и честно о точности;ai-prompt.txt— дословный запрос, который мы отправляем ИИ (полная прозрачность — что просим, то и получаем).
Выборка изолирована по аккаунту — только ваши фаны. Тот же объект по одному фану можно прочитать и по
API: GET /api/admin/fans/{fan_id}/full.
Чтение лидерборда
Лидерборд оконно ограничен range, который вы передаёте, и переключателем lifetime (см.
Оконность). Читайте его из /api/admin/stats и берите
revenue.sources.
curl "https://app.tease.link/api/admin/stats?range=30d" \
-H "Authorization: Bearer $TEASE_API_KEY"const res = await fetch(
'https://app.tease.link/api/admin/stats?range=30d',
{ headers: { Authorization: `Bearer ${process.env.TEASE_API_KEY}` } },
);
const stats = await res.json();
const leaderboard = stats.revenue.sources;import os, requests
res = requests.get(
"https://app.tease.link/api/admin/stats",
headers={"Authorization": f"Bearer {os.environ['TEASE_API_KEY']}"},
params={"range": "30d"},
)
leaderboard = res.json()["revenue"]["sources"]Query-параметры
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
range | string | нет | Временное окно для итогов «since»: 24h, 7d, 30d, 90d. По умолчанию 7d. Неизвестное значение откатывается к 7d. Вид «за всё время» включается только явным lifetime=true. |
lifetime | boolean | нет | Когда true и полная пара собственных границ не передана, итоги и сгруппированные агрегаты используют допустимые данные за всё время и игнорируют range. Оси дневных трендов ограничены последними 730 днями и укрупняются для длинных периодов. Полная пара from_ts/to_ts имеет приоритет. По умолчанию false. |
from_ts / to_ts | integer | нет | Необязательные явные границы в unix-секундах. Они заменяют range только парой; одиночная граница игнорируется. |
domain | string | нет | Фильтрует блоки воронки. Атрибуция по дизайну распространяется на весь аккаунт (это свойство фаната), поэтому лидерборд, фан-экономика и сверка не сужаются этим фильтром. |
source | string | нет | Ограничивает трафиковые и привязанные к кликам агрегаты одной точной меткой источника трафика. Как и domain, он не сужает account-wide лидерборд revenue.sources и его счётчики funnel. |
scope | string | нет | Уровень агрегации: page, creator или tenant. Передавайте вместе с id; без обоих параметров считается текущая страница вызывающего. Набор страниц всегда ограничен разрешённым вызывающему скоупом данных. |
id | string | нет | Идентификатор страницы, креатора или арендатора, выбранного параметром scope. Без scope игнорируется. |
tz | string | нет | Имя часового пояса IANA для календарных дневных бакетов и осей, например Europe/Berlin. Пустое или неверное значение заменяется на UTC. |
Обновление совместимости — 2026-08-11
Устаревшие поля revenue.ltv_* теперь используют тот же канонический семиступенчатый
резолвер источника фана, что и revenue.sources. Фаны с реальным источником переходят на
атрибутированную сторону; канонические organic и pending оба остаются на старой стороне
ltv_organic, потому что у этого совместимого разбиения нет третьей корзины. На измеренном
аккаунте так переклассифицируются 285 фанов / $44,609.89, а не 305 / $45,097.97:
прежняя цифра ошибочно включала 20 канонических pending-фанов. Форма ответа, ltv_total и
сверка не меняются. Это сохраняющая сверку поправка классификации, а не пересчёт выручки.
Ответ — revenue.sources
{
"sources": [
{
"domain_source": "ig-main",
"source_label": "Main IG",
"channel": "instagram",
"subs": 312,
"spenders": 188,
"revenue_net_cents": 421550,
"revenue_gross_cents": 502430,
"pct": 0.41,
"new_fans": 240,
"returning_fans": 72,
"trial_subs": 96,
"trial_to_paid": 51,
"funnel": { "new": 205, "old": 37, "ftl": 96, "paid": 112, "paid_after": 74, "ftl_paid": 38, "entered": 250 },
"by_kind": [
{ "kind": "subscription", "net_cents": 184200, "count": 240 },
{ "kind": "rebill", "net_cents": 96100, "count": 130 },
{ "kind": "ppv", "net_cents": 121050, "count": 410 },
{ "kind": "tips", "net_cents": 20200, "count": 88 }
],
"countries": [
{ "country": "US", "subs": 140, "spenders": 92, "revenue_net_cents": 210400, "revenue_gross_cents": 248900 },
{ "country": "GB", "subs": 51, "spenders": 33, "revenue_net_cents": 74100, "revenue_gross_cents": 88200 }
],
"links": [
{ "link_ref": "lnk_8fq2", "subs": 201, "spenders": 130, "revenue_net_cents": 290300, "revenue_gross_cents": 345100 }
]
}
],
"organic": {
"domain_source": "__organic__", "channel": "", "subs": 410, "spenders": 260,
"revenue_net_cents": 318900, "revenue_gross_cents": 379400, "pct": 0.31,
"new_fans": 410, "returning_fans": 0, "trial_subs": 0, "trial_to_paid": 0,
"funnel": { "new": 0, "old": 0, "ftl": 0, "paid": 0, "paid_after": 0, "ftl_paid": 0, "entered": 0 },
"by_kind": [], "countries": [], "links": []
},
"pending": {
"domain_source": "__pending__", "channel": "", "subs": 88, "spenders": 0,
"revenue_net_cents": 0, "revenue_gross_cents": 0, "pct": 0.0,
"new_fans": 88, "returning_fans": 0, "trial_subs": 88, "trial_to_paid": 0,
"funnel": { "new": 0, "old": 0, "ftl": 0, "paid": 0, "paid_after": 0, "ftl_paid": 0, "entered": 0 },
"by_kind": [], "countries": [], "links": []
},
"total_net_cents": 1025840,
"total_gross_cents": 1221230,
"by_kind": [
{ "kind": "subscription", "net_cents": 402100, "count": 590 },
{ "kind": "rebill", "net_cents": 221400, "count": 318 },
{ "kind": "ppv", "net_cents": 351900, "count": 1204 },
{ "kind": "tips", "net_cents": 50440, "count": 210 },
{ "kind": "other", "net_cents": 0, "count": 0 }
],
"coverage": { "attributed_subs": 740, "organic_subs": 410, "pending_subs": 88, "trial_unknown_subs": 88 },
"trial_subs": 184,
"trial_to_paid": 97,
"reconciliation": {
"balanced": true,
"sources_net_cents": 706940,
"organic_net_cents": 318900,
"pending_net_cents": 0,
"total_net_cents": 1025840
},
"since": "2026-06-01"
}Поля лидерборда
| Поле | Тип | Описание |
|---|---|---|
sources | array | Одна строка на каждый разрешённый источник, отсортированы по revenue_net_cents по убыванию. Форма строки ниже. |
organic | object | Корзина organic, та же форма строки. Всегда присутствует, даже когда пуста. |
pending | object | Корзина pending/неопределённое, та же форма строки. Всегда присутствует и никогда не сливается с organic. |
total_net_cents | integer | Чистый итог аккаунта за окно. Равен sources + organic + pending. |
total_gross_cents | integer | Валовый итог аккаунта (до комиссий/НДС) за окно. |
by_kind | array | Глобальная разбивка денег по типу. Σ net_cents равна total_net_cents. |
coverage | object | Подперепись фанатов по корзинам — см. Покрытие. |
trial_subs | integer | Уникальные фанаты бесплатного пробного периода по всему аккаунту в окне. |
trial_to_paid | integer | Из этих пробных фанатов, сколько позже заплатили (чистое больше 0). |
reconciliation | object | Проверка баланса — см. Сверку. |
since | string | Якорная дата «since» (YYYY-MM-DD), или "lifetime" когда lifetime=true. |
Поля строки источника
Каждая запись в sources (и строки organic / pending) имеет такую форму:
| Поле | Тип | Описание |
|---|---|---|
domain_source | string | Ключ источника. Метки-сентинелы __organic__ и __pending__ помечают неатрибутированные строки. |
source_label | string | Дружелюбная персона-метка источника (например, Main IG). Сентинелы не несут метки. |
channel | string | Тег канала источника (например, instagram, tiktok); пусто для сентинелов. |
subs | integer | Уникальные фанаты, атрибутированные этому источнику в окне. |
spenders | integer | Из них, сколько заплатили (чистое больше 0). |
revenue_net_cents | integer | Чистая выручка для этого источника. |
revenue_gross_cents | integer | Валовая выручка для этого источника. |
pct | float | Доля от total_net_cents (0..1; 0, когда итог равен 0). |
new_fans | integer | Lifecycle-разбиение: все фаны строки, не классифицированные как вернувшиеся; new_fans + returning_fans = subs. Это не оконная ступень funnel.new. |
returning_fans | integer | Фаны с транзакцией до фиксированного якоря аккаунта плюс попавшие в окно live-переподписки с текущим действием return. |
trial_subs | integer | Уникальные фанаты бесплатного пробного периода в этом источнике. |
trial_to_paid | integer | Из них, сколько конвертировались в платных. |
funnel | object | Обязательная семиступенчатая воронка Full Attribution для строки; описание ниже. |
by_kind | array | Разбивка денег по типу для источника. Σ net_cents равна revenue_net_cents строки. |
countries | array | Углубление по странам для этого источника — см. ниже. |
links | array | Углубление по ссылкам для этого источника — см. ниже. |
subs считает уникальных фанатов; spenders считает подмножество тех, кто фактически заплатил. Источник с
большим числом бесплатных пробников может иметь много subs, но мало spenders — trial_to_paid — это число, которое важно для
оценки качества пробных периодов.
Воронка Full Attribution
Каждая строка реального источника, organic и pending всегда несёт один и тот же обязательный
объект funnel. Он считает события журнала входов вместе с live-переподписками в запрошенном
окне; его расчёт не меняет деньги строки, lifecycle-поля или сверку. Для preset либо custom-границы,
равной времени запроса или зажатой до него, верхний край этой воронки открыт: расчёт берёт свой
текущий момент и принимает время входа/возврата строго раньше этого момента плюс один час. Это
допуск погрешности часов поставщика, а не точная граница to_ts + 3600. Историческая
custom-граница раньше времени запроса остаётся точной.
| Поле | Тип | Описание |
|---|---|---|
new | integer | Первые входы в окне без транзакций раньше чем за час до from_ts; последний час считается погрешностью часов на границе. |
old | integer | Live-переподписки в окне, чей первый вход не попал в это окно. |
ftl | integer | Входы, классифицированные как бесплатная пробная ссылка (trial). |
paid | integer | Входы, классифицированные как платная ссылка (paid). |
paid_after | integer | Входы или возвраты с положительными чистыми деньгами не раньше чем за час до входа. Для платного входа, входа неизвестного типа или возврата одна подписочная транзакция в пределах ±1 часа считается оплатой самого входа и исключается. |
ftl_paid | integer | Пробные входы, попавшие в paid_after, с тем же часовым допуском; всегда <= ftl. |
entered | integer | Все входы, включая входы неизвестного типа, плюс возвраты old. |
new_fans и funnel.new отвечают на разные вопросы и могут различаться. new_fans — это
lifecycle-дополнение returning_fans среди всех назначенных строке subs. funnel.new —
оконная ступень: вход обязан попасть в эффективное окно входов этого запроса, а раньше часового
допуска перед нижней границей у фана не должно быть транзакций. Lifecycle-поле использует фиксированный tracking anchor аккаунта, поэтому ни одно
из двух полей не является подмножеством другого; если окно пересекает anchor, больше может быть
любое из них.
Доступ команды с ограничением по источникам
Для участника команды, ограниченного конкретными источниками, каждая строка по-прежнему
содержит все семь ключей funnel, но все семь счётчиков равны 0. Склейка display/persona
может объединить сырые корзины источников, поэтому обнуление новых счётчиков людей не даёт
раскрыть данные вне разрешения участника.
Деньги по типу
by_kind появляется на двух уровнях — глобально (revenue.sources.by_kind) и для источника
(row.by_kind) — и каждый раз использует те же упорядоченные ключи:
kind | Покрывает |
|---|---|
subscription | Новые платные подписки. |
rebill | Повторные продления подписок. |
ppv | Pay-per-view: платные посты, платные сообщения, заблокированный контент. |
tips | Чаевые. |
other | Всё, что не вошло в перечисленное. |
Каждая запись — это { "kind", "net_cents", "count" }. Внутри любой корзины Σ net_cents сверяется с
revenue_net_cents этой корзины, так что график «подписки vs PPV» никогда не расходится с
заголовком.
Углубление по странам
Каждая строка источника несёт массив countries. Каждая запись разбивает выручку этого источника по
стране фаната:
{ "country": "US", "subs": 140, "spenders": 92, "revenue_net_cents": 210400, "revenue_gross_cents": 248900 }| Поле | Тип | Описание |
|---|---|---|
country | string | Код ISO-3166 alpha-2. |
subs | integer | Уникальные фанаты из этой страны в этом источнике. |
spenders | integer | Из них, сколько заплатили. |
revenue_net_cents | integer | Чистая выручка из этой страны/источника. |
revenue_gross_cents | integer | Валовая выручка из этой страны/источника. |
Углубление по ссылкам
Массив links в каждой строке источника атрибутирует выручку вплоть до индивидуальной
смарт-ссылки, через которую пришёл фанат:
{ "link_ref": "lnk_8fq2", "subs": 201, "spenders": 130, "revenue_net_cents": 290300, "revenue_gross_cents": 345100 }Для гео-по-ссылкам матрицы по ссылкам домена читайте выделенную разбивку:
curl "https://app.tease.link/api/admin/domain_links/smartlinks/breakdown?domain=yourbrand.link" \
-H "Authorization: Bearer $TEASE_API_KEY"const res = await fetch(
'https://app.tease.link/api/admin/domain_links/smartlinks/breakdown?domain=yourbrand.link',
{ headers: { Authorization: `Bearer ${process.env.TEASE_API_KEY}` } },
);
const breakdown = await res.json();res = requests.get(
"https://app.tease.link/api/admin/domain_links/smartlinks/breakdown",
headers={"Authorization": f"Bearer {os.environ['TEASE_API_KEY']}"},
params={"domain": "yourbrand.link"},
)
breakdown = res.json()Это возвращает каждую ссылку с её разбивкой по странам и источникам, так что вы можете сравнить, какая ссылка на
домене тянет какие географии. Деньги сверяются с теми же поссылочными итогами, которые вы видите в
массиве links лидерборда.
Углубление по фанатам
Три чтения уводят вас от строки источника вниз к индивидуальным фанатам за ней.
Spenders для одного источника
Перечислите платящих фанатов, атрибутированных конкретному домену/источнику:
curl "https://app.tease.link/api/admin/sources/yourbrand.link/spenders" \
-H "Authorization: Bearer $TEASE_API_KEY"Возвращает { domain, spenders: [...], totals: { revenue_cents, spenders, conversions } }. Каждая
строка spender несёт fan_id, fan_username, total_net_cents, purchases, country,
is_returning, pre_anchor_cents, first_at и last_at.
Spenders по всему аккаунту
Оконный список плательщиков по всем источникам, свежие деньги первыми:
curl "https://app.tease.link/api/admin/spenders?range=30d" \
-H "Authorization: Bearer $TEASE_API_KEY"Карточка одного фаната
Откройте одного фаната для его пожизненных итогов, графика по дням и списка транзакций:
curl "https://app.tease.link/api/admin/fan/FAN_ID" \
-H "Authorization: Bearer $TEASE_API_KEY"Карточка возвращает идентичность, total_net_cents, klass со значением ours или organic, флаг
is_returning, чистый ряд by_day и список транзакций (новые первыми).
Новый vs возвращающийся, и пробный → платный
Два продуктовых вопроса отвечаются прямо в каждой строке, так что вам не нужно их вычислять.
- Новый vs возвращающийся — ветка денежной истории использует фиксированный якорь аккаунта
funnel_tracking_since, а не выбранное денежное окно. Вreturning_fansвходят фаны с более ранней транзакцией и попавшие в окно live-переподписки, у которых текущее действиеof_fansравноreturn; остальные входят вnew_fans. Авторитетна агрегированная строка: legacy-флаги в пофановом drill отражают только ветку денежной истории. - Пробный → платный —
trial_subs— это число фанатов бесплатного пробного периода в корзине;trial_to_paid— сколько из них позже произвели платную выручку. Прочитанные вместе они дают конверсию вашей пробной воронки для этого источника.
Бесплатные пробники считаются как фанаты, а не как выручка
Подписка на бесплатный пробный период за $0 — это реальный фанат (он считается в subs и trial_subs), но не приносит
денег, пока фанат не заплатит. Вот почему источник может показывать сильные subs, в то время как его
revenue_net_cents отстаёт — следите за trial_to_paid, чтобы увидеть, созревают ли пробники.
Перепись покрытия
coverage — это честная подуровневая перепись — сколько фанатов попало в каждую корзину — чтобы вы могли видеть
полноту атрибуции с первого взгляда. Она не двигает деньги, поэтому никогда не влияет на сверку.
| Поле | Описание |
|---|---|
attributed_subs | Фанаты, разрешённые к реальной строке источника. |
organic_subs | Фанаты в корзине organic. |
pending_subs | Фанаты в корзине pending. |
trial_unknown_subs | Живые free-trial фаны из of_fans, дошедшие до fallback без источника и сохранённого pending-мэппинга, считаемые внутри pending (они читаются как «неопределённые», а не «organic»). Последующие траты не исключают фана из счётчика; stored-pending и ledger-only записи о триал-входе тоже могут лежать в pending, но сюда не входят. |
Фан-экономика
Коэффициенты экономики возвращаются как выходные данные в двух областях рядом с лидербордом:
revenue.fans (область attributed) и revenue.fans_account (область всего аккаунта). Вы их читаете;
TEASE их вычисляет.
{
"scope": "account",
"arppu_cents": 2240,
"apc": 3.1,
"apv_cents": 720,
"arpnu_cents": 1180,
"paying_fans": 458,
"payments": 1420,
"new_fans": 240,
"new_paying_fans": 132,
"new_to_paying_pct": 55.0,
"cohort_reliable": true,
"cohort_revenue_cents": 283200,
"maturing": false
}| Поле | Тип | Описание |
|---|---|---|
arppu_cents | integer | null | ARPPU — средняя выручка на платящего пользователя (чистое ÷ уникальные платящие фанаты). null, когда платящих нет. |
apc | float | null | APC — среднее число платежей на платящего клиента (2 знака после запятой). |
apv_cents | integer | null | APV — средняя стоимость платежа (чистое ÷ платежи). |
arpnu_cents | integer | null | ARPNU — средняя выручка на нового пользователя, по пожизненным деньгам когорты. |
paying_fans | integer | Уникальные фанаты, заплатившие в окне. |
payments | integer | Число платящих транзакций в окне. |
new_fans | integer | Фанаты, чья самая первая подписка попадает в окно (бесплатные пробники включены). |
new_paying_fans | integer | Из когорты, сколько заплатили (в любое время). |
new_to_paying_pct | float | null | Конверсия новый→платящий, %, удерживается (null) на когортах, слишком малых, чтобы быть статистически значимыми. |
cohort_reliable | boolean | false, когда когорта слишком мала, чтобы публиковать коэффициент. |
cohort_revenue_cents | integer | Пожизненное чистое когортных фанатов (созревает неделями). |
maturing | boolean | true, когда окно достаточно недавнее, чтобы поздние ребиллы/PPV ещё не полностью приземлились — считайте цифры когорты ещё устаканивающимися. |
Малые когорты удерживают процент
В коротком окне когорта может быть горсткой фанатов, и поскольку исходные данные смещены к плательщикам,
коэффициент новый→платящий может ложно показать 100%. Когда когорта ниже порога надёжности,
TEASE возвращает сырые счётчики, но устанавливает new_to_paying_pct: null и
cohort_reliable: false, чтобы ваш UI мог показать «недостаточно данных» вместо вводящего в заблуждение числа.
Оконность: lifetime vs выбранный период
Атрибуция поддерживает два режима оконности, выбираемых параметром lifetime:
- Выбранный период (по умолчанию,
lifetime=false) — вид «новый трафик». Итоги используют точныйrangeили явныеfrom_ts/to_ts; якорь аккаунта не обрезает денежное окно. Полеsince— legacy-ярлык якоря, а не фактическая нижняя граница. - Lifetime (
lifetime=true) — вид «за всё время (LTV)». Если полная собственная параfrom_ts/to_tsне передана, итоги и сгруппированные агрегаты используют все доходные транзакции допустимых статусов за всё время и игнорируютrange;sinceчитается как"lifetime". Оси дневных трендов намеренно ограничены последними 730 днями и укрупняются для длинных периодов. Полная собственная пара имеет приоритет надlifetime.
Оба режима сохраняют инвариант сверки — корзины всегда суммируются в итог для любого окна, которое вы запросили.
Сверка
Объект reconciliation — это ваша проверка целостности лидерборда:
{
"balanced": true,
"sources_net_cents": 706940,
"organic_net_cents": 318900,
"pending_net_cents": 0,
"total_net_cents": 1025840
}| Поле | Тип | Описание |
|---|---|---|
balanced | boolean | true, когда sources + organic + pending в точности равно total_net_cents. |
sources_net_cents | integer | Сумма всех атрибутированных строк источников. |
organic_net_cents | integer | Чистое корзины organic. |
pending_net_cents | integer | Чистое корзины pending. |
total_net_cents | integer | Чистый итог аккаунта за окно. |
Доверяйте флагу balanced
balanced: true — это контракт, что каждый цент в чистом итоге вашего аккаунта учтён ровно в
одной корзине. Стройте дашборды на нём — если вы когда-нибудь увидите «balanced: false», пометьте
окно как ещё устаканивающееся, вместо того чтобы публиковать разбивку как финальную.
FAQ
Дальнейшие шаги
- Смарт-ссылки — создайте отслеживаемые ссылки, к которым разрешаются эти источники.
- TG-атрибуция продаж — тот же вопрос для выручки Telegram-бота.
- Webhooks & CAPI — пересылайте атрибутированные конверсии в Meta и TikTok.
- Справочник API — полная схема
/api/admin/stats.
Смарт-ссылки
Одна ссылка /r/<slug>, которая держит и платную подписку, и бесплатный триал и сама решает, что показать посетителю — взвешенный сплит с правилами по странам. Плюс чтение эффективности по кликам, подписчикам и выручке.
TG-атрибуция продаж
Откуда пришёл каждый платящий Telegram-фанат — точный матч по deep-link, расчётный матч по стране и времени и честный бейдж точности на каждой строке.