[{"data":1,"prerenderedAt":404},["ShallowReactive",2],{"blog-post-telegram-ads-results":3},{"id":4,"title":5,"author":6,"body":8,"date":391,"description":392,"extension":393,"image":394,"meta":395,"navigation":396,"path":397,"seo":398,"sitemap":399,"stem":402,"__hash__":403},"blog_en_posts\u002Fblog\u002Ftelegram-ads-results.md","Telegram Ads results: how to tell if the ads paid off",{"name":7},"Victor Tuneev",{"type":9,"value":10,"toc":377},"minimark",[11,15,20,29,32,55,63,67,75,78,81,85,98,101,105,108,111,114,118,121,241,244,248,251,311,314,317,322,328,331,336,339,344,347,352,355,359],[12,13,14],"p",{},"For ads run through an agency or reseller account, ours included, the report gives spend and actions. Those figures do not show whether the actions became confirmed sales or whether the ads paid off. You work out sales and payback yourself, from your own data: orders, margin and the full cost of acquisition.",[16,17,19],"h2",{"id":18},"from-a-telegram-ads-conversion-to-a-confirmed-sale","From a Telegram Ads conversion to a confirmed sale",[12,21,22,23,28],{},"In the report, a conversion is an action: a join, a bot start or an event on the website. A join or a start is counted when it follows a view of the ad. Website events are counted by the pixel, which is available to advertisers in certain countries and records nothing inside Telegram. Where website conversion tracking is available, website events are counted only after an event is linked to the ad and ",[24,25,27],"a",{"href":26},"\u002Fblog\u002Ftelegram-pixel-tag-setup-guide","the pixel is set up correctly on the site",".",[12,30,31],{},"A sale is confirmed when the order is paid and not refunded. For ads that support a tagged destination link, keep three records for each person the ads bring:",[33,34,35,49,52],"ul",{},[36,37,38,39,43,44,48],"li",{},"which ad brought them: ",[24,40,42],{"href":41},"\u002Fblog\u002Ftelegram-analytics-guide-tools-integration","a separate invite link for a channel ad",", ",[24,45,47],{"href":46},"\u002Fblog\u002Fpromoting-a-telegram-bot","a start parameter for a bot ad",", UTM tags for a website ad;",[36,50,51],{},"when the action happened, in the report's time zone (UTC);",[36,53,54],{},"whether they paid later, and how much.",[12,56,57,58,62],{},"Configure the bot to save the start parameter in the user's record. The channel admin sees ",[24,59,61],{"href":60},"\u002Fblog\u002Ftelegram-channel-statistics","who joined through each link",", and the shop or CRM holds the orders. Match the two lists by something both contain, such as the Telegram username, which some buyers may not have.",[16,64,66],{"id":65},"cost-per-action-cpa-and-the-full-cost-of-a-customer","Cost per action (CPA) and the full cost of a customer",[12,68,69,70,74],{},"Telegram bills impressions, and the cost per action is the spend divided by the number of actions. When an agency or reseller, us included, ",[24,71,73],{"href":72},"\u002Fblog\u002Ftelegram-ads-cost-how-to-plan-your-campaign-budget","charges its service fee on top of the deposit",", the fee does not enter the report's spend.",[12,76,77],{},"So the full cost of a campaign is media spend plus the fee and any other acquisition costs. The cost of a customer is that full cost divided by the number of confirmed customers; the report has no such column.",[12,79,80],{},"A low cost per join or per start proves nothing about payback on its own. For that you also need the number of customers among those people, the gross profit each one brings and how long after acquisition you count it.",[16,82,84],{"id":83},"what-adstat-gives-you-for-the-calculation","What Adstat gives you for the calculation",[12,86,87,88,97],{},"In ",[24,89,96],{"href":90,"rel":91,"target":95},"https:\u002F\u002Fadstat.pro\u002F",[92,93,94],"nofollow","noopener","noreferrer","_blank","Adstat",", the statistics table shows spend, actions, the type of action and the cost per action for each ad (in the interface it is called the cost of reaching the goal, CTA). The figures come by day, always in UTC, and can be exported to Excel or CSV.",[12,99,100],{},"For a channel ad, an invite link created in Adstat counts subscriptions and unsubscribes per ad. The channel's subscriber list exports as CSV for periods of up to 3 months, for matching with buyers. Revenue, margin and ROI are counted from your own data.",[16,102,104],{"id":103},"telegram-ads-roi-roas-and-payback-what-each-one-answers","Telegram Ads ROI, ROAS and payback: what each one answers",[12,106,107],{},"ROAS is revenue from the customers the ads brought, divided by media spend. It ignores both the margin and the fee. ROI is gross profit from those customers minus the full cost, divided by the full cost; gross profit is revenue multiplied by the gross margin. ROI below zero means the campaign lost money.",[12,109,110],{},"The lower the margin, the higher the ROAS needed to break even.",[12,112,113],{},"Payback is the time it takes the gross profit from a customer to return what that customer cost: cost per customer divided by gross profit per customer per month. When the first order does not cover the cost, the answer depends on repeat orders, which come later. So judge ads by cohorts: the customers brought in one month, followed for a tracking window you fix in advance and keep the same for every ad.",[16,115,117],{"id":116},"a-worked-example-with-round-numbers","A worked example with round numbers",[12,119,120],{},"The figures are made up. A bot ad ran for a month; sales happen inside the bot, which is set up to save each user's start parameter.",[122,123,124,140],"table",{},[125,126,127],"thead",{},[128,129,130,134,137],"tr",{},[131,132,133],"th",{},"Line",[131,135,136],{},"Figure",[131,138,139],{},"Where it comes from",[141,142,143,155,165,175,186,197,208,219,230],"tbody",{},[128,144,145,149,152],{},[146,147,148],"td",{},"Media spend for the month",[146,150,151],{},"1,000 euros",[146,153,154],{},"The ad report",[128,156,157,160,163],{},[146,158,159],{},"Bot starts",[146,161,162],{},"500",[146,164,154],{},[128,166,167,170,173],{},[146,168,169],{},"Cost per start",[146,171,172],{},"2 euros",[146,174,154],{},[128,176,177,180,183],{},[146,178,179],{},"Confirmed customers",[146,181,182],{},"40",[146,184,185],{},"The bot and the shop",[128,187,188,191,194],{},[146,189,190],{},"Cost per customer, media spend only",[146,192,193],{},"25 euros",[146,195,196],{},"1,000 \u002F 40",[128,198,199,202,205],{},[146,200,201],{},"Revenue, one 50-euro order per customer",[146,203,204],{},"2,000 euros",[146,206,207],{},"The shop",[128,209,210,213,216],{},[146,211,212],{},"ROAS",[146,214,215],{},"2",[146,217,218],{},"2,000 \u002F 1,000",[128,220,221,224,227],{},[146,222,223],{},"Gross profit at a 40% margin",[146,225,226],{},"800 euros",[146,228,229],{},"2,000 × 40%",[128,231,232,235,238],{},[146,233,234],{},"ROI on media spend",[146,236,237],{},"−20%",[146,239,240],{},"(800 − 1,000) \u002F 1,000",[12,242,243],{},"The cost per start is 2 euros and the ROAS is 2, yet the month closed 200 euros down. At a 40% margin, break-even requires 2,500 euros in revenue: 50 customers spending 50 euros each. With 40 such customers, the margin must reach 50%. If a customer then brings 20 euros of gross profit a month, the 25 euros that customer cost come back during the second month. The example includes media spend only; for your own campaign, add the fee under your contract and any other acquisition costs.",[16,245,247],{"id":246},"why-the-report-the-bot-site-analytics-and-the-shop-show-different-numbers","Why the report, the bot, site analytics and the shop show different numbers",[12,249,250],{},"The same month looks different in each system:",[122,252,253,266],{},[125,254,255],{},[128,256,257,260,263],{},[131,258,259],{},"System",[131,261,262],{},"What it counts",[131,264,265],{},"Date and time zone",[141,267,268,278,289,300],{},[128,269,270,272,275],{},[146,271,154],{},[146,273,274],{},"Joins or starts after a view of the ad; website conversions of the linked event",[146,276,277],{},"UTC",[128,279,280,283,286],{},[146,281,282],{},"The bot",[146,284,285],{},"Starts that carried the ad's parameter, and what the user did next",[146,287,288],{},"The time zone configured in the bot's logs",[128,290,291,294,297],{},[146,292,293],{},"Site analytics",[146,295,296],{},"Visits with the ad's UTM tags and the goals set in the analytics",[146,298,299],{},"Usually local time, by its own goal rules",[128,301,302,305,308],{},[146,303,304],{},"The shop or CRM",[146,306,307],{},"Paid orders, minus refunds and cancellations",[146,309,310],{},"Order date, possibly later than the action",[12,312,313],{},"Where local time is ahead of UTC, an action taken early in the morning lands on the previous day in the report. Clicks in the report are counted only for users on the latest Telegram app version, so site visits can exceed clicks.",[12,315,316],{},"Reconcile like with like: bot starts with starts in the report, site conversions with website conversions in the report. Write down the reason for each gap, so you notice when tracking breaks.",[318,319,321],"h3",{"id":320},"questions-and-answers","Questions and answers",[12,323,324],{},[325,326,327],"strong",{},"Can ROI be counted for each ad, or only for the whole campaign?",[12,329,330],{},"For each ad, if its sales are linked to it through a saved label; spend and actions are already per ad in the report. Count sales without a confirmed source separately: without that confirmation they belong neither to an ad nor to the campaign.",[12,332,333],{},[325,334,335],{},"The cost per start is low, but there are no sales. Is the ad bad?",[12,337,338],{},"The cost per start cannot tell you. Check the chain first: whether the starts carry the parameter, whether users get through the bot's first steps and whether the offer in the bot matches the ad. Then compare ads by cost per customer and ROI over the same period.",[12,340,341],{},[325,342,343],{},"Does a refunded or cancelled order count as a sale?",[12,345,346],{},"No. A customer is someone who paid and did not get a refund. Decide how long after the order a refund still cancels the sale, and apply the rule to every ad alike.",[12,348,349],{},[325,350,351],{},"Sales happen in direct messages after people join the channel. How do I link them to an ad?",[12,353,354],{},"Through the join list: the admin sees who joined through each ad's invite link, and the chats show who paid. Match the two by the Telegram username.",[16,356,358],{"id":357},"what-to-do-first","What to do first",[360,361,362,365,368,371,374],"ol",{},[36,363,364],{},"For ads that support a tagged destination link, set the label before the ads start: a separate invite link for a channel, a start parameter for a bot, UTM tags for a website.",[36,366,367],{},"Write down next to the report the period, the UTC time zone, what counts as a customer, the refund rule and the tracking window: how long after the action a purchase still belongs to the ad.",[36,369,370],{},"After the period, export spend and actions per ad, add the fee and the other acquisition costs, and list confirmed sales by the ad's label, grouped by the month of the acquisition action.",[36,372,373],{},"Count the cost per customer, ROAS on revenue and ROI on gross profit for each ad, and shift budget towards ads with better ROI and shorter payback.",[36,375,376],{},"Repeat the calculation for each month's cohort and keep tracking earlier cohorts until their tracking window ends.",{"title":378,"searchDepth":379,"depth":379,"links":380},"",2,[381,382,383,384,385,386,390],{"id":18,"depth":379,"text":19},{"id":65,"depth":379,"text":66},{"id":83,"depth":379,"text":84},{"id":103,"depth":379,"text":104},{"id":116,"depth":379,"text":117},{"id":246,"depth":379,"text":247,"children":387},[388],{"id":320,"depth":389,"text":321},3,{"id":357,"depth":379,"text":358},"2026-11-09","How to connect the actions in a Telegram Ads report with confirmed sales, margin and the full cost of a customer, and why ROAS and ROI give different answers.","md","\u002Fimg\u002Fblog\u002Ftelegram-ads-results.jpg",{},{"title":5,"description":392},"\u002Fblog\u002Ftelegram-ads-results",{"title":5,"description":392},{"loc":397,"videos":400,"images":401},[],[],"blog\u002Ftelegram-ads-results","fBZB7RHyVZDI72CLMtUkfBOFd-3LiKW6ckHA73ESTt8",1794217342975]