Wall Ad Network Wall Ad Network — рекламная сеть

A UTM-tagged referral and click-tracking system for paid ad campaigns inside and outside Telegram. Per-channel, per-creative, per-placement attribution with orphan-safe logging. UTM-метированная система реферальной атрибуции и click-tracking'а для платных рекламных кампаний внутри и за пределами Telegram. Per-channel, per-creative, per-placement атрибуция с orphan-safe логированием.

Why a dedicated ad-network layerЗачем отдельный слой ad-network

Wall already has a referral program for individual users — friend invites, Ambassador badge, tier-dependent bonus (10–30%) on referred-user Stars donations / Premium signups / Chain seals (paid by Wall from its share). The Ad Network sits on top of that primitive and adds what paid marketing needs: explicit channel/creative/placement breakdown, orphan-click logging for misattribution recovery, dual URL formats for in-Telegram vs off-Telegram surfaces, and (future) campaign-level aggregation through an /promo cabinet. У Wall уже есть реферальная программа для частных юзеров — приглашение друзей, значок Ambassador, tier-зависимый бонус (10–30%) на Stars-донаты / Premium-сигнапы / Chain seal'ы приглашённых (Wall платит из своей доли). Ad Network построен поверх этого примитива и добавляет то, что нужно платному маркетингу: явный per-channel/creative/placement разбор, orphan-логирование для восстановления misattribution, два формата URL для in-Telegram vs off-Telegram, и (в перспективе) агрегацию по кампаниям в кабинете /promo.

URL anatomyАнатомия URL

Every Wall ad URL follows this structure: Каждая рекламная URL Wall следует этой структуре:

https://t.me/wall/app?startapp=ref_<root>-<utm1>-<utm2>-<utm3>
  • roota registered ReferralLink.slug owned by the buyer (e.g., ad). Tells the bot who to attribute the click to.зарегистрированный ReferralLink.slug, принадлежащий покупателю рекламы (например ad). Сообщает боту, кому атрибутировать клик.
  • utm1source channel code (e.g., fe = @fuckingenglish, tgl = @tglive)код канала-источника (например fe = @fuckingenglish, tgl = @tglive)
  • utm2creative / post identifier (e.g., tagged, replyguy, boinking_v2)идентификатор креатива / поста (например tagged, replyguy, boinking_v2)
  • utm3placement (btn = inline button, body = in-text hyperlink, qr = QR code, dm = direct-message share, preview = link-preview tap)placement (btn = inline-кнопка, body = гиперссылка в тексте, qr = QR-код, dm = шеринг в личке, preview = тап на preview)

All sub-tags are free-form lowercase strings — buyers define their own conventions. The parser stores all four pieces in ReferralEvent.metadata for SQL filtering. Все sub-метки — свободные lowercase-строки, покупатели сами определяют конвенции. Парсер сохраняет все 4 куска в ReferralEvent.metadata для SQL-фильтрации.

Two URL formatsДва формата URL

📱 In-Telegram deeplink
t.me/wall/app?startapp=ref_<token>
Telegram opens Wall in 1 tap, no browser flash. Use for inline buttons in channel posts, in-text hyperlinks, DM shares, forwarded messages.Telegram открывает Wall за 1 тап, без браузера. Для inline-кнопок в постах каналов, гиперссылок в тексте, шеринга в DM, пересланных сообщений.
🌐 Universal redirector
wall.tg/r/<token>?c=&s=
Logs the click event before 302-redirecting to Telegram. Use for Twitter/X, blog articles, QR codes on physical media, email campaigns. Filters Telegram preview-bot user agents so they don't pollute the click log.Логирует клик до 302-редиректа в Telegram. Для Twitter/X, блог-постов, QR-кодов на физ. носителях, email-кампаний. Фильтрует preview-боты Telegram, чтобы они не засоряли click-лог.

Orphan-safe attributionOrphan-safe атрибуция

Typos happen. A campaign URL might be hand-edited by a channel admin and a hyphen accidentally turned into an underscore. Without orphan logging, those clicks would silently disappear. Опечатки случаются. URL кампании может быть вручную отредактирована админом канала, и дефис превращён в подчёркивание. Без orphan-логирования эти клики бы тихо терялись.

Wall logs every unrecognised referral token as a ReferralEvent { type: 'unknown_ref' } with the raw URL preserved in metadata.rawParam. Buyers can periodically scan the orphan log via SQL: Wall логирует каждый нераспознанный токен как ReferralEvent { type: 'unknown_ref' } с сохранением исходной URL в metadata.rawParam. Покупатели могут периодически сканировать orphan-лог через SQL:

SELECT metadata->>'rawParam' AS bad_url, COUNT(*) AS hits
FROM referral_events
WHERE type = 'unknown_ref'
  AND created_at > NOW() - INTERVAL '7 days'
GROUP BY bad_url ORDER BY hits DESC;

After spotting common typos (e.g., fe_tagged_bttn instead of fe-tagged-btn), admins can manually re-bind those events to the correct slug — preserving attribution that would otherwise be lost ROI on a paid campaign. Увидев частые опечатки (например fe_tagged_bttn вместо fe-tagged-btn), админы могут вручную переписать эти события на правильный slug — сохранив атрибуцию, которая иначе была бы потерянным ROI платной кампании.

Worked example — first @fuckingenglish campaignРеальный пример — первая кампания @fuckingenglish

Wall's first ad-network buy launched in May 2026 — a two-post arc on @fuckingenglish (322k Russian-speaking English learners) covering the slang words "tagged" and "reply guy". URLs used: Первая закупка Wall Ad Network запущена в мае 2026 — дуэт постов на @fuckingenglish (322k русскоязычных, изучающих английский) про slang-слова «tagged» и «reply guy». Использованные URL:

ref_ad-fe-tagged-btn      ← POST 1 inline button
ref_ad-fe-tagged-body     ← POST 1 in-text hyperlink
ref_ad-fe-replyguy-btn    ← POST 2 inline button
ref_ad-fe-replyguy-body   ← POST 2 in-text hyperlink

All four URLs share the same root (ad) — one ReferralLink row owns the entire campaign. Per-creative + per-placement breakdown via SQL on metadata.utm2 and metadata.utm3. The button vs. in-text A/B is visible from the first hour after publication; per-user attribution (which subscriber became Premium) drives the re-buy decision for the next campaign in the same channel. Все 4 URL имеют один root (ad) — одна строка ReferralLink владеет всей кампанией. Per-creative + per-placement разбор через SQL на metadata.utm2 и metadata.utm3. A/B btn vs in-text видно с первого часа после публикации; per-user атрибуция (какой подписчик стал Premium) определяет re-buy решение для следующей кампании в том же канале.

RoadmapRoadmap

  • Phase 0 (liveв проде) — parser, redirector, orphan logging, SQL analytics on existing ReferralEvent.metadataпарсер, redirector, orphan-логирование, SQL-аналитика на существующем ReferralEvent.metadata
  • Phase 1 (in developmentв разработке) — AdCampaign + AdClick tables, click-bridge from off-Telegram tap to /start, role grants for buyer team
  • Phase 2/promo cabinet UI for buyers (admins / ad_buyers role)кабинет для покупателей (admin / ad_buyers роль)
  • Phase 3/publisher cabinet for channel admins selling slots, escrow flow, marketplaceкабинет для админов каналов, продающих слоты, escrow-флоу, marketplace
  • Phase 4public REST API for third-party advertisers, automated bid managementпубличный REST API для third-party рекламодателей, автоматический bid management

FAQFAQ

Can anyone use the Ad Network or is it limited to Wall team?Любой может использовать Ad Network или это только для команды Wall?

Phase 0 is open to anyone — the parser and redirector treat ad-rooted tokens (ad-*, wad-*, wallad-*) the same as any registered ReferralLink. Phase 1+ adds buyer-side cabinet access gated by Profile.role IN ('admin', 'ad_buyer'). Third-party advertiser onboarding opens in Phase 4.Phase 0 открыт всем — парсер и redirector обрабатывают ad-rooted токены (ad-*, wad-*, wallad-*) как любой зарегистрированный ReferralLink. Phase 1+ добавляет buyer-side кабинет, gated по Profile.role IN ('admin', 'ad_buyer'). Onboarding third-party рекламодателей открывается в Phase 4.

How does Wall avoid double-counting clicks from Telegram link previews?Как Wall избегает double-count'а кликов от Telegram link-preview?

The wall.tg/r/ redirector regex-matches the User-Agent against known preview-bot signatures (TelegramBot, TwitterBot, facebookexternalhit, LinkedInBot, Slackbot, WhatsApp, Discordbot, Googlebot, bingbot, YandexBot, Pinterest, redditbot, Applebot, DuckDuckBot, Mastodon). Preview hits are logged separately as [r] PREVIEW_BOT in pm2 stream — they don't count toward the click metric.Redirector wall.tg/r/ regex-сопоставляет User-Agent с известными preview-бот сигнатурами (TelegramBot, TwitterBot, facebookexternalhit, LinkedInBot, Slackbot, WhatsApp, Discordbot, Googlebot, bingbot, YandexBot, Pinterest, redditbot, Applebot, DuckDuckBot, Mastodon). Preview-обращения логируются отдельно как [r] PREVIEW_BOT в pm2 stream — они не считаются как клики.

Can I track which Premium users came from which channel?Можно ли отследить какие Premium-юзеры пришли с какого канала?

Yes. Join referral_events on refereeId with profiles on userId. Filter metadata->>'utm1' = '<channel_code>' and select profiles.is_premium + premium tier. This gives per-channel cohort LTV — the data point that drives re-buy decisions.Да. JOIN referral_events по refereeId с profiles по userId. Фильтруй metadata->>'utm1' = '<channel_code>' и SELECT profiles.is_premium + premium tier. Это даёт per-channel cohort LTV — ключевая метрика для re-buy решений.

What happens to attribution when a user clicks an ad URL but never opens Wall?Что происходит с атрибуцией, если юзер кликнул ad-URL, но не открыл Wall?

For Universal-link clicks (wall.tg/r/): Phase 1 adds an AdClick row even when /start never fires, with resultedInStart = false. For In-Telegram deeplinks (t.me/wall/app?startapp=…): we don't see clicks that never trigger /start because Telegram's deeplink handling is opaque to us. The trade-off is intentional — In-Telegram URLs sacrifice click-before-/start visibility for a seamless 1-tap UX, which converts better in practice.Для Universal-кликов (wall.tg/r/): Phase 1 добавляет AdClick row даже если /start не сработал, с resultedInStart = false. Для In-Telegram deeplink'ов (t.me/wall/app?startapp=…): клики без /start мы не видим, т.к. handling deeplink'а в Telegram непрозрачен. Trade-off намеренный — In-Telegram URL жертвует click-before-/start visibility ради бесшовного 1-tap UX, который конвертит лучше на практике.

Open Wall to start a campaign Открой Wall чтобы запустить кампанию

Register a root referral slug from the Referrals screen, then encode UTM-tags in your campaign URLs. Phase 1 cabinet UI ships in Q2 2026. Зарегистрируй root реферальный slug на экране Рефералы, затем кодируй UTM-метки в URL'ах кампании. Phase 1 кабинет UI выходит в Q2 2026.

Open Wall in Telegram Открыть Wall в Telegram