What Gets Posted
Your post does not reach the channel byte-for-byte as you typed it. A line is usually added at the bottom, link previews are switched off, and every link is rewritten. None of it is a surprise once you know it is coming, and all of it is worth knowing before you approve a post that will run in your own channel.
This page describes the delivered ad. To build one, see Creatives: posts and delivery.
What a reader sees
A delivered cross-promotion ad is, in order:
- The photo, if the author attached one, above the text.
- The text, with the formatting you applied — bold, italic, underline, strikethrough, spoiler, inline code, quotes and links.
- The attribution line, after one blank line at the bottom: advertisement via onflowads.com, linking to the site.
- The inline buttons, if the author's plan carries any, underneath the message — drawn in Telegram's normal style, or in the colour the author picked if their plan includes coloured buttons.
Attach two or more photos and they post as one album, laid out by Telegram from the photos' shapes — two wide photos stack one above the other, two tall ones sit side by side. The composer's slots are an upload order, not a layout; the live preview measures your real photos and shows the arrangement Telegram will use. The full table of arrangements is in Booking a promotion.
That is all. In particular, what is not there:
- No link previews. Telegram's usual preview card is switched off, so a link in the text does not drag an image and a summary into the post. The ad occupies exactly the space the author wrote.
- No platform button. There is no "Track ad opens" button, no Mini App launcher, nothing pointing back at Onflow Ads beyond the one attribution line. A channel post is read by the host's subscribers, who are not party to the campaign; a control panel aimed at the two partners has no business sitting in front of them.
- No second attribution. Whichever engine placed the ad — cross-promotion, Paid Promotions or the Subscriber Exchange — the wording is the same single line, defined in one place for the whole platform.
It reads advertisement via onflowads.com and points at the site, not at the bot. A reader who taps it lands on the product rather than in a chat with a bot that will not talk to them. It is Onflow Ads labelling its own placements honestly; it is not a plug for your partner.
When the attribution line is not shown
One thing decides it: the plan of the channel that carries the ad. From Plus upward, ads delivered into that channel run with no attribution line at all — whoever wrote them.
| Plan of the channel carrying the ad | Ads delivered into it |
|---|---|
| Free, Referral Premium, Lite | Carry advertisement via onflowads.com |
| Plus, Elite, Master, Ultimate | Carry no attribution line |
Read that against the shape of a swap. Your post runs in your partner's channel, so their plan decides whether your post is labelled. Their post runs in yours, so your plan decides whether theirs is. Your own plan never affects your own post — it affects everything your channel carries.
Nothing you can do at submission removes the line from your own post, on any plan. There is no toggle in the composer, no field on the creative, and no plan that grants one. If you want your promo to run unlabelled, that is a decision your partner makes by being on Plus or above — not one you can make for yourself. The only lever you hold is over your own channel: upgrade to Plus and every ad your channel carries runs clean.
The line is advertisement via onflowads.com — 31 characters — after one blank line, so it occupies 33 characters of a Telegram post. The composer holds those 33 back from the 1,024 ceiling on every cross-promotion post, which is why the counter reads N / 991. A Blitz reserves them too, because a Blitz post lands in many channels on many different plans and there is no single answer in advance. See the character budget.
What happens to the links
Before the bot publishes a post it asks the website what each link becomes — every inline button, every link inside the text, and every address or @handle typed into it. Each one is published as its own short link of the form onflowads.com/rr/NNNN-NNNN (for example onflowads.com/rr/4821-7305), which counts the tap as an ad open — one per reader per link per day, link previews and crawlers excluded — and sends the reader straight on. The rule is the same on every engine, and where the short link sends the reader depends only on where the link points:
| The link points at | Where its short link sends the reader | What is counted |
|---|---|---|
| A channel or group you have connected to Onflow Ads | A campaign invite link into that channel — the reader lands in your channel | Ad opens, plus joins, attributed by Telegram, recorded by the bot — with your channel's own subscriber growth beside them |
| Any other Telegram address — somebody else's channel, an invite hash, a bot, a bot's start link, a post link | That address, exactly as written — a bot's start payload arrives byte for byte, and Telegram's in-app browser opens it straight back in Telegram | Ad opens |
| A website | The page, carrying the campaign tags | Ad opens |
Each occurrence gets its own short link, so the same address written twice gets two, each counted on its own. A text link keeps its words, and an @handle keeps its words and becomes a text link; a typed address is replaced by its short link — unless that would take the post past Telegram's length limit, in which case the longest typed addresses keep their words and are linked in place. Left exactly as written: something that is not a web address (an email address, say), a malformed or spoofed address, a link that is already an onflowads.com short link, and anything in code formatting. See Links and results for the full rule.
The review step shows a destination list — every button and every text link, with the real address it leads to — under the preview of your partner's post. Read that list before you press Approve; once the ad is live in your channel, its links are the ones you agreed to. An invite link into your partner's own channel is listed as exactly that.
This is what makes the numbers on Campaign results possible, and it covers text links, typed addresses and @handles as well as buttons — so an ad whose call to action is a link in the sentence is measured exactly like one on a button.
The bot publishes only what the website hands back. If that call fails — the site unreachable, the request refused — the creative is published exactly as written, with its plain links, and simply not counted. An uncounted ad that works is preferred to a broken link in someone else's channel.
Cross-promotion posts published before this design carried a signed onflowads.com/c/… hop on every link, and some placements sent a tap through the bot's chat first. Posts published before every link became a short link carry onflowads.com/go/… hops and direct t.me/+… invite links instead. Those posts keep working and keep counting exactly as they did until they come down; no new link of those kinds is created.
Where the ad comes from, and where it goes
Each side's creative runs in the other side's channel. The initiator's post is published into the joiner's channel; the joiner's post into the initiator's. Both go out at the same moment, and both come down at the end of the run.
In a Blitz, the creator's one post is published into every partner's channel, and each partner's post is published into the creator's.
Where possible the delivery bot hands Telegram a file it already holds, or uploads the bytes itself. Your creative image is never left to Telegram to fetch from a URL if that can be avoided — which is why an image that would fail to load is refused at upload time rather than at go-live, when the campaign would already be running with the ad missing.
If something looks wrong in the channel
| What you see | What it means | What to do |
|---|---|---|
| The ad carries advertisement via onflowads.com and you expected it not to | Your channel is on Free, Referral Premium or Lite. The author's plan has nothing to do with it. | Plus and above removes the line from every ad your channel carries. See the table above. |
| Your post carried the line, though you are on Plus or above | Expected. Your post ran in your partner's channel, so their plan decided. | Nothing to fix. Your plan governs the ads you carry, not the ones you write. |
A link or button looks like onflowads.com/rr/… | Expected — every link takes one first-party hop so each tap can be counted, a Telegram link included. | The reader is sent straight on. The destinations are listed under the post preview at review time. |
A button link in an older post looks like t.me/+… | It is the campaign invite link into your partner's own connected channel, published directly before every link became a short link; Telegram counts the joins. | Nothing to do — readers land in that channel. |
| The ad has no image, though the author attached one | On a Blitz, posts carry no photo on either side by design. On a 1:1, the image failed to attach — the author must save the post after uploading. | For a 1:1, ask the author to re-attach and press Save post. |
| Nothing was posted in either channel at go-live | The engine could not publish both ads, so it published neither and took down anything that had gone out. | Check the bot is still an admin of both channels, then run a fresh campaign. See Campaign results. |
| The ad was posted but your partner's was not | This should not happen — a half-run is aborted deliberately. | Open the campaign page: a Not fully published pill and a banner will say what the engine hit. |
Related
- Creatives: posts and delivery — building the post that becomes this.
- Campaign results — what the rewritten links actually record.
- Rules and fairness — the check that the ad stays up for the full run.
- Blitz campaigns — how the same delivery works when one post runs in many channels.
Next: Campaign lifecycle — every status a campaign can show, and how campaigns end.