Post buttons and links
Every ad you compose on Onflow Ads goes through the same editor, whichever product you are in: the Subscriber Exchange, Paid Promotions and Cross-Promotion all use it. Three of its capabilities sit on the plan ladder, a fourth is sold separately for $1, and one line is added under the post by the platform itself.
This page is the whole rulebook for what you may put under and inside a post — and for what we put there.
Before you start
- Know your tier. The composer reads it live; the numbers below are what it will enforce.
- Have wallet balance if you want the add-on. The External Links add-on is $1, charged from your Onflow Ads wallet.
- Compose on the website. The button and link rules are applied when the post is created, here; the Telegram bot does not re-check them when it sends. The one thing decided at send is the attribution line, and it does not read your plan at all.
The ladder
| Free | Lite | Plus | Elite | Master | Ultimate | |
|---|---|---|---|---|---|---|
| Inline buttons per post | — | 1 | 2 | 3 | 4 | 4 |
| Coloured inline buttons | — | — | ✓ | ✓ | ✓ | ✓ |
| Public Telegram links | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| Private Telegram links | — | ✓ | ✓ | ✓ | ✓ | ✓ |
| Non-Telegram links | $1 add-on | $1 add-on | $1 add-on | $1 add-on | $1 add-on | $1 add-on |
| Ads in your channels carry the attribution line | Yes | Yes | — | — | — | — |
Four buttons is the ceiling — no rung goes above it, and Ultimate matches Master here. The last row is the odd one out and the one people misread: it is not about the ads you write, it is about the ads other people's campaigns put into your channels. The attribution line explains it.
A small number of accounts carry an earned Referral Premium status (🌟) from the retired referral tier. It grants premium styling on the Telegram bot's messages and nothing that costs money, so for everything on this page it behaves exactly like Free: no buttons, no colours, no private Telegram links. Today's Referral Programme pays boost credit and never grants a status at all.
Inline buttons
A button is a tappable row under the post, carrying a label and a URL. You add them in the composer's button rows.
What each rung unlocks. The rows unlock one at a time, and each locked row names the rung that would open it: button one on Lite, button two on Plus, button three on Elite, button four on Master.
What you see on Free. A single locked Inline buttons row with a Locked button; pressing it says, in a notice, that buttons come with Lite, with a See plans action. Buttons are not reduced on Free — they are off.
The rules on a button.
| Rule | Value |
|---|---|
| Maximum buttons per post | Your tier's cap, never more than 4 |
| Button label | 1–48 characters |
| Line breaks in a label | Not allowed |
| Button URL | Must pass the link rules below |
| Button colour | One per button — Default, Blue, Green or Red — from Plus up |
| Buttons on an album | Not possible. A marketplace creative with more than one photo cannot carry buttons |
In Paid Promotions, where the platform publishes the ad for you, buttons go out one per row — stacked vertically under the post rather than sitting side by side.
Telegram cannot attach buttons to an album — its own send for two or more photos has nowhere to put an inline keyboard. A Paid Promotions creative that carries more than one photo and a button is marked as a hard failure in the composer, kept out of the cart, and refused again at checkout: "Telegram cannot show buttons under an album. Keep the buttons with a single photo, a video or a text-only post — or drop to one photo." One photo (with a caption of up to 1,024 characters), a video, or a text-only post of up to 4,096 characters — any of those carries buttons.
What you see if you break one.
| What you see | What it means |
|---|---|
| "Inline buttons are not available on this account." | You are on Free, where the feature is off |
| "Your plan allows up to N button(s) per post." | You sent more buttons than your cap |
| "Button text must be 1–48 characters." | An empty or over-long label |
| "Button text cannot contain line breaks." | A newline inside a label |
| "Each button needs a text and a url." | A row was submitted with one half missing |
If you drop to a lower tier, or reopen an old draft, a button beyond your current cap does not vanish. The composer keeps the row visible, marked locked, with an ✕ to clear it — and the server refuses to save the post until you do. That is deliberate: silently deleting a button you wrote is worse than making you delete it yourself.
Button colours
From Plus up, each button can carry a colour. The composer shows a small labelled swatch row — Colour, then four swatches — beside every unlocked button row.
| Swatch | What Telegram draws |
|---|---|
| Default | The app's ordinary button. This is what you get if you pick nothing |
| Blue | A blue button |
| Green | A green button |
| Red | A red button |
The rules are short:
- One colour per button, and every button you are allowed may carry its own. Four buttons can be four different colours.
- Plus and above only. Off on Free and Lite; on at Plus, Elite, Master and Ultimate — no rung above Plus buys anything more here.
- Colour is decoration, never a gate. Nothing about a colour changes where a button goes, how it is tracked, or whether the post sends.
This is the one composer rule with no error message. An over-cap button blocks the save and tells you so; an un-entitled colour is simply discarded and the button saves as an ordinary one. On Free and Lite the swatch row is not drawn at all — there is no locked control naming Plus, so nothing on screen tells you what you are missing.
The practical consequence is on the way down: if you drop to Lite, or your membership lapses, re-saving a coloured creative silently strips its colours. The buttons survive; the colours do not, and nothing warns you.
Button colours use a Telegram feature added in February 2026. An app older than that ignores the colour and draws an ordinary working button. Nothing degrades except the colour, which is why the composer offers it without any version warning.
Which links are allowed
Every URL is judged once, at creation time, and sorted into one of four classes.
| Class | Examples | Who may use it |
|---|---|---|
| Public Telegram | https://t.me/yourchannel, https://t.me/yourchannel/42 | Every tier, including Free |
| Private Telegram | https://t.me/+AbCdEf, https://t.me/joinchat/AbCdEf, https://t.me/c/1234567890/5 | Lite and above |
| Non-Telegram | Anything else — your website, a shop, a landing page | Anyone who has bought the $1 External Links add-on for their current tier |
| Invalid | Malformed URLs, or anything over 512 characters | Nobody |
A host counts as Telegram if it is t.me, telegram.me, telegram.dog, t.dog or telegram.org, or a subdomain of one. A look-alike such as t.me.example.com does not count and is treated as an external link.
What you see if a link is refused.
| What you see | What it means | What to do |
|---|---|---|
| "Private Telegram links are not available on this account." | You pasted an invite link, a joinchat link or a t.me/c/ link on Free | Use the channel's public t.me handle, or move to Lite |
| "External links need the External Links add-on ($1)." | The URL is not a Telegram host and you have not bought the add-on for this tier | Buy the add-on from the same dialog, or use a Telegram link |
| "That link doesn't look valid. Use a full https:// URL." | The URL is malformed, has no scheme, or is longer than 512 characters | Paste the full https://… address |
The same rules apply to links inside the post body and to button URLs. There is no rung where one is stricter than the other.
The $1 External Links add-on
Non-Telegram URLs are deliberately not a rung. They are a one-off unlock that any tier can buy — including Free.
How to buy it
- Open the link dialog in any composer and paste the non-Telegram URL you want to use.
- Read the refusal. The dialog says "External links need the External Links add-on ($1)." and reveals a button reading Enable external links — $1.
- Press it. The $1 is charged from your wallet and the unlock applies immediately — the dialog re-checks your URL and turns green without you retyping it.
- Note the reference. The confirmation reads "External links enabled." and shows the purchase's own
OFXA-reference. That is the receipt for the charge; it also appears on your wallet transaction, described as "External Links add-on".
Pressing the button when you already hold the add-on for your tier answers "Already enabled for your tier." and charges nothing.
What it costs and how it is charged
| Price | $1.00, one-off |
| Charged from | Your Onflow Ads wallet balance |
| Boost credit accepted | No — Boost credit is a separate pot |
| Recurring | No. There is nothing to renew and nothing to cancel |
| Refundable | No |
The purchase is recorded against the tier you were on when you bought it. Change rung and it stops applying: buy it on Lite, upgrade to Plus, and non-Telegram links are refused again until you buy it a second time for Plus. Letting a membership lapse has the same effect, because your effective tier becomes Free.
Nothing is refunded when this happens, and the earlier purchase is not lost — it reactivates by itself if you return to that same tier.
If you are already planning to move up a rung, wait. A dollar is small, but so is the effort of doing it in the right order — buy the add-on once, on the tier you intend to stay on.
If something goes wrong
| What you see | What it means | What to do |
|---|---|---|
| "Not enough wallet balance. Top up your wallet and try again." | The $1 debit would overdraw. The unlock rolled back with it — you were not charged and nothing was granted | Top up on the wallet page and press the button again |
| "Already enabled for your tier." | You already hold it for this rung | Nothing to do. The reference shown is the original purchase's |
| The add-on stopped working after a tier change | It is scoped to the tier it was bought on | Buy it again for your current tier, or return to the tier you bought it on |
| "Sign in to continue." | Your session expired | Sign in and retry |
| "Cross-origin request blocked." | The request did not come from the Onflow Ads site | Buy it from the composer's own link dialog |
| Repeated attempts stop being accepted | The purchase endpoint is rate-limited to a modest number of attempts an hour | Wait, then try once more. If it keeps failing, use the contact page |
The attribution line
Under every ad the platform delivers into somebody's channel, one blank line below the advertiser's own copy, sits a single clickable line:
advertisement via onflowads.com
It links back to onflowads.com. It is the same wording in all three products — Paid Promotions, Cross-Promotion and the Subscriber Exchange — and it replaced the #ad hashtag the product used to ask advertisers to type, which was a disclosure that depended on the advertiser remembering it.
Whose plan decides — the host's, not the advertiser's
This is the part that surprises people. The line is a mark on somebody's feed, so the person who earns its removal is the person whose feed carries it: the owner of the channel the ad is posted into.
From Plus up, ads carried by your channels run without the line. On Free and Lite they carry it. Your own plan has no effect on the ads you place in other people's channels.
| The advertiser is on | The host channel's owner is on | The line appears |
|---|---|---|
| Free | Free or Lite | Yes |
| Free | Plus, Elite, Master or Ultimate | No |
| Ultimate | Free or Lite | Yes |
| Ultimate | Plus, Elite, Master or Ultimate | No |
There is no toggle, no setting and no add-on — at any rung, on either side. If you have seen "watermark control" described as a feature you can switch, that copy is out of date.
When the decision is made
| Product | When your plan is read |
|---|---|
| Paid Promotions | At the moment the ad is published. A host whose membership lapses between the booking and the publication gets the line back on that post |
| Cross-Promotion | When the campaign is handed over for scheduling. Both sides' plans are frozen in at that point |
| Subscriber Exchange | At delivery. The matcher chooses the host after the ad is written, so it cannot be known while you compose |
The 33 characters your counter holds back
Telegram counts the visible characters in a caption, and a caption that fits before the line is appended would overflow after it. So every composer reserves the line's space in advance: 33 characters — the 31-character line plus the blank line above it. That is why the character counter stops short of Telegram's own ceiling.
- In the Subscriber Exchange and Cross-Promotion, the 33 characters are always held back, because the host is not known while you write.
- In Paid Promotions the reserve follows the listing you are booking: on a channel whose owner is Plus or above there is nothing to reserve, and the counter gives the characters back.
If an older creative — written before the reserve existed — would overflow with the line attached, the line is dropped rather than the send failed. Your ad is what was paid for and approved; losing a placement to make room for our own label would be the wrong trade.
Where the line cannot be added
A Paid Promotions owner may publish an ad by hand instead of letting our bot post it, then paste the link to their own post as proof. Nothing on our side can append the line to a post we did not send, and nothing re-checks it afterwards. On manually delivered placements the line is therefore not guaranteed, whatever plan either side is on.
Where the rules are enforced
The link and button policy is applied once, when the post is created, on the website. That has two consequences worth knowing:
- A post that was already approved keeps working. If you drop to a lower tier after scheduling a post, its links and buttons are not re-checked and the post goes out as composed. A downgrade cannot silently break something already in flight.
- A new post is judged on your tier right now. The composer reads your live entitlements each time it loads, so the moment an upgrade completes the extra button rows unlock without a reload of anything but the page.
The Telegram bot mirrors the structural half of these rules — it will still refuse a malformed URL — but it never re-applies the tier policy at send time. The website is where the decision is made.
It is not part of the creative and is not judged at creation time. In Paid Promotions it is decided from the host's live plan at the moment of publishing, so a post composed while the host was on Plus can still go out carrying the line if that membership lapsed in between. Nothing about your tier changes it either way.
Frequently asked
Can I use a link shortener to get around the add-on?
A shortener's domain is not a Telegram host, so it is classified as an external link and refused exactly like the destination would be.
Do links inside the post body count differently from button URLs?
No. Both are judged by the same rules at the same moment.
Does a button count against any other limit?
No. Buttons are not metered per month or per campaign — the only limit is how many one post may carry.
Can I have four buttons on Ultimate?
Four is the ceiling for both Master and Ultimate. No rung offers more.
Why is Free allowed no buttons at all?
Buttons are one of the small number of things the ladder switches off rather than reduces. Public Telegram links in the post body still work on Free, so a Free ad can still point at your channel.
I picked a colour and the button came out plain.
Two possibilities. Either you are below Plus, in which case the colour was dropped when the post saved and no error was shown; or the person looking at the post has a Telegram app older than February 2026, which ignores colours and draws every button normally.
Why does my ad have "advertisement via onflowads.com" under it?
Because the channel it landed in belongs to an owner on Free or Lite. Your own plan does not decide this — see The attribution line.
I am on Plus. Why does my ad still carry the line?
Same reason: it is the host's plan that removes it, not yours. A Plus advertiser's ad in a Free owner's channel carries the line; a Free advertiser's ad in a Plus owner's channel does not.
I am on Plus and ads in my channel still carry it.
Check that the membership is actually active — an expired paid tier reads as Free everywhere, immediately. In Paid Promotions the host's plan is read at the moment of publishing, so a lapse between booking and publication brings the line back on that placement. If your membership is live and the ad was delivered by our bot, that is worth reporting through the contact page.
Can I pay to remove the attribution line from one ad?
No. It is not sold separately at any tier, on either side of a booking, and there is no control to switch it off.
Related
- Comparing the tiers — the composer ladder next to every other dimension.
- Where tier limits appear — the other one-off purchases that get you past a cap.
- Downgrading and letting a plan lapse — what a lapse does to the add-on.
- Buying a plan — if the answer really is the next rung.