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>
- root — a registered
ReferralLink.slugowned by the buyer (e.g.,ad). Tells the bot who to attribute the click to.зарегистрированныйReferralLink.slug, принадлежащий покупателю рекламы (напримерad). Сообщает боту, кому атрибутировать клик. - utm1 — source channel code (e.g.,
fe= @fuckingenglish,tgl= @tglive)код канала-источника (напримерfe= @fuckingenglish,tgl= @tglive) - utm2 — creative / post identifier (e.g.,
tagged,replyguy,boinking_v2)идентификатор креатива / поста (напримерtagged,replyguy,boinking_v2) - utm3 — placement (
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
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+AdClicktables, click-bridge from off-Telegram tap to /start, role grants for buyer team - Phase 2 —
/promocabinet UI for buyers (admins / ad_buyers role)кабинет для покупателей (admin / ad_buyers роль) - Phase 3 —
/publishercabinet for channel admins selling slots, escrow flow, marketplaceкабинет для админов каналов, продающих слоты, escrow-флоу, marketplace - Phase 4 — public 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