TEASEDocs
На русском

Атрибуция

Читайте лидерборд «Источники» — выручка по источнику, стране, ссылке и фанату, сверенная с чистым итогом вашего аккаунта.

Атрибуция отвечает на один вопрос: откуда пришёл каждый платящий фанат и сколько он заплатил? TEASE берёт каждую транзакцию на вашем аккаунте OnlyFans, разрешает каждого платящего фаната к единственному источнику привлечения и сворачивает деньги в лидерборд, который всегда сверяется с чистым итогом вашего аккаунта — без двойного учёта, без денег, которые тихо исчезают.

Результат — это ранжирование выручки по источникам, которое вы можете углублять источник → страна → ссылка → фанат, с разбивкой по типу денег (подписки, ребиллы, PPV, чаевые), помеченное новый-vs-возвращающийся, с конверсией пробный→платный и рассчитанными за вас коэффициентами фан-экономики (ARPPU, APC, APV, ARPNU).

Атрибуция читается из /api/admin/stats

Отдельного endpoint-а /attribution нет. Весь лидерборд, его углубления и фан-экономика возвращаются внутри /api/admin/stats под объектом revenuerevenue.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-параметры

ПолеТипОбязательноОписание
rangestringнетВременное окно для итогов «since»: 24h, 7d, 30d, 90d. По умолчанию 7d. Неизвестное значение откатывается к 7d. Вид «за всё время» включается только явным lifetime=true.
lifetimebooleanнетКогда true и полная пара собственных границ не передана, итоги и сгруппированные агрегаты используют допустимые данные за всё время и игнорируют range. Оси дневных трендов ограничены последними 730 днями и укрупняются для длинных периодов. Полная пара from_ts/to_ts имеет приоритет. По умолчанию false.
from_ts / to_tsintegerнетНеобязательные явные границы в unix-секундах. Они заменяют range только парой; одиночная граница игнорируется.
domainstringнетФильтрует блоки воронки. Атрибуция по дизайну распространяется на весь аккаунт (это свойство фаната), поэтому лидерборд, фан-экономика и сверка не сужаются этим фильтром.
sourcestringнетОграничивает трафиковые и привязанные к кликам агрегаты одной точной меткой источника трафика. Как и domain, он не сужает account-wide лидерборд revenue.sources и его счётчики funnel.
scopestringнетУровень агрегации: page, creator или tenant. Передавайте вместе с id; без обоих параметров считается текущая страница вызывающего. Набор страниц всегда ограничен разрешённым вызывающему скоупом данных.
idstringнетИдентификатор страницы, креатора или арендатора, выбранного параметром scope. Без scope игнорируется.
tzstringнетИмя часового пояса 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"
}

Поля лидерборда

ПолеТипОписание
sourcesarrayОдна строка на каждый разрешённый источник, отсортированы по revenue_net_cents по убыванию. Форма строки ниже.
organicobjectКорзина organic, та же форма строки. Всегда присутствует, даже когда пуста.
pendingobjectКорзина pending/неопределённое, та же форма строки. Всегда присутствует и никогда не сливается с organic.
total_net_centsintegerЧистый итог аккаунта за окно. Равен sources + organic + pending.
total_gross_centsintegerВаловый итог аккаунта (до комиссий/НДС) за окно.
by_kindarrayГлобальная разбивка денег по типу. Σ net_cents равна total_net_cents.
coverageobjectПодперепись фанатов по корзинам — см. Покрытие.
trial_subsintegerУникальные фанаты бесплатного пробного периода по всему аккаунту в окне.
trial_to_paidintegerИз этих пробных фанатов, сколько позже заплатили (чистое больше 0).
reconciliationobjectПроверка баланса — см. Сверку.
sincestringЯкорная дата «since» (YYYY-MM-DD), или "lifetime" когда lifetime=true.

Поля строки источника

Каждая запись в sources (и строки organic / pending) имеет такую форму:

ПолеТипОписание
domain_sourcestringКлюч источника. Метки-сентинелы __organic__ и __pending__ помечают неатрибутированные строки.
source_labelstringДружелюбная персона-метка источника (например, Main IG). Сентинелы не несут метки.
channelstringТег канала источника (например, instagram, tiktok); пусто для сентинелов.
subsintegerУникальные фанаты, атрибутированные этому источнику в окне.
spendersintegerИз них, сколько заплатили (чистое больше 0).
revenue_net_centsintegerЧистая выручка для этого источника.
revenue_gross_centsintegerВаловая выручка для этого источника.
pctfloatДоля от total_net_cents (0..1; 0, когда итог равен 0).
new_fansintegerLifecycle-разбиение: все фаны строки, не классифицированные как вернувшиеся; new_fans + returning_fans = subs. Это не оконная ступень funnel.new.
returning_fansintegerФаны с транзакцией до фиксированного якоря аккаунта плюс попавшие в окно live-переподписки с текущим действием return.
trial_subsintegerУникальные фанаты бесплатного пробного периода в этом источнике.
trial_to_paidintegerИз них, сколько конвертировались в платных.
funnelobjectОбязательная семиступенчатая воронка Full Attribution для строки; описание ниже.
by_kindarrayРазбивка денег по типу для источника. Σ net_cents равна revenue_net_cents строки.
countriesarrayУглубление по странам для этого источника — см. ниже.
linksarrayУглубление по ссылкам для этого источника — см. ниже.

subs считает уникальных фанатов; spenders считает подмножество тех, кто фактически заплатил. Источник с большим числом бесплатных пробников может иметь много subs, но мало spenderstrial_to_paid — это число, которое важно для оценки качества пробных периодов.

Воронка Full Attribution

Каждая строка реального источника, organic и pending всегда несёт один и тот же обязательный объект funnel. Он считает события журнала входов вместе с live-переподписками в запрошенном окне; его расчёт не меняет деньги строки, lifecycle-поля или сверку. Для preset либо custom-границы, равной времени запроса или зажатой до него, верхний край этой воронки открыт: расчёт берёт свой текущий момент и принимает время входа/возврата строго раньше этого момента плюс один час. Это допуск погрешности часов поставщика, а не точная граница to_ts + 3600. Историческая custom-граница раньше времени запроса остаётся точной.

ПолеТипОписание
newintegerПервые входы в окне без транзакций раньше чем за час до from_ts; последний час считается погрешностью часов на границе.
oldintegerLive-переподписки в окне, чей первый вход не попал в это окно.
ftlintegerВходы, классифицированные как бесплатная пробная ссылка (trial).
paidintegerВходы, классифицированные как платная ссылка (paid).
paid_afterintegerВходы или возвраты с положительными чистыми деньгами не раньше чем за час до входа. Для платного входа, входа неизвестного типа или возврата одна подписочная транзакция в пределах ±1 часа считается оплатой самого входа и исключается.
ftl_paidintegerПробные входы, попавшие в paid_after, с тем же часовым допуском; всегда <= ftl.
enteredintegerВсе входы, включая входы неизвестного типа, плюс возвраты 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Повторные продления подписок.
ppvPay-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 }
ПолеТипОписание
countrystringКод ISO-3166 alpha-2.
subsintegerУникальные фанаты из этой страны в этом источнике.
spendersintegerИз них, сколько заплатили.
revenue_net_centsintegerЧистая выручка из этой страны/источника.
revenue_gross_centsintegerВаловая выручка из этой страны/источника.

Углубление по ссылкам

Массив 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_centsinteger | nullARPPU — средняя выручка на платящего пользователя (чистое ÷ уникальные платящие фанаты). null, когда платящих нет.
apcfloat | nullAPC — среднее число платежей на платящего клиента (2 знака после запятой).
apv_centsinteger | nullAPV — средняя стоимость платежа (чистое ÷ платежи).
arpnu_centsinteger | nullARPNU — средняя выручка на нового пользователя, по пожизненным деньгам когорты.
paying_fansintegerУникальные фанаты, заплатившие в окне.
paymentsintegerЧисло платящих транзакций в окне.
new_fansintegerФанаты, чья самая первая подписка попадает в окно (бесплатные пробники включены).
new_paying_fansintegerИз когорты, сколько заплатили (в любое время).
new_to_paying_pctfloat | nullКонверсия новый→платящий, %, удерживается (null) на когортах, слишком малых, чтобы быть статистически значимыми.
cohort_reliablebooleanfalse, когда когорта слишком мала, чтобы публиковать коэффициент.
cohort_revenue_centsintegerПожизненное чистое когортных фанатов (созревает неделями).
maturingbooleantrue, когда окно достаточно недавнее, чтобы поздние ребиллы/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
}
ПолеТипОписание
balancedbooleantrue, когда sources + organic + pending в точности равно total_net_cents.
sources_net_centsintegerСумма всех атрибутированных строк источников.
organic_net_centsintegerЧистое корзины organic.
pending_net_centsintegerЧистое корзины pending.
total_net_centsintegerЧистый итог аккаунта за окно.

Доверяйте флагу balanced

balanced: true — это контракт, что каждый цент в чистом итоге вашего аккаунта учтён ровно в одной корзине. Стройте дашборды на нём — если вы когда-нибудь увидите «balanced: false», пометьте окно как ещё устаканивающееся, вместо того чтобы публиковать разбивку как финальную.

FAQ

Дальнейшие шаги

On this page