Skip to main content

Creatives: Posts and Delivery

The creative is the promotional post itself. Every 1:1 campaign has two: yours โ€” promoting your channel, running in your partner's channel โ€” and your partner's, running in yours. Each side builds their own and approves the other's.

Once your campaign has a partner, the campaign page at https://onflowads.com/telegram/dashboard/cross-promotion/campaign/YOUR-CODE grows a Posts & delivery section. You can build posts at any point while the campaign is being set up, before or after the schedule is confirmed.

Before you startโ€‹

  • The campaign must have a partner. Before that the composer is not offered: "Wait for a partner to join before building your post."
  • You can only build while the campaign is in setup โ€” Awaiting confirmation, New time proposed or Confirmed. Once it is handed to the delivery queue the campaign is read-only.
  • A photo needs nothing beyond a normal account. Inline buttons need a paid plan, and colouring them needs Plus or above. Non-Telegram links need the $1 External Links add-on. All of it is covered below.

The status chipsโ€‹

At the top of the section, chips show where things stand:

  • Your post: built / not built
  • Partner post: built / not built
  • Ready for go-live โ€” both posts built and both reviews approved
  • Delivery blocked or Not delivered โ€” replaces "Ready for go-live" when something is stopping the hand-off. See If your campaign was never queued.

Writing your postโ€‹

Your post promotes your channel and runs in your partner's channel โ€” the hint under the heading says exactly that.

The post is written in three steps โ€” Write, Photo, Review โ€” with Back and Continue under each (pinned to the bottom of the screen on a phone):

  1. Write. Write your text in the Post text box. The counter above it reads N / 991 โ€” see the character budget for where that number comes from. Formatting markup does not count against it. Format it with the toolbar (see below) and add inline buttons if your plan includes them.
  2. Photo. Attach a photo if you want one โ€” it is optional.
  3. Review. Check the post exactly as your partner's subscribers will see it, then press Save post, or Update post if you are editing. A refusal is shown on this step, with its Appeal button when the automatic screen refused it.

Unsaved words and buttons are kept on this device until you save, so a reload does not lose them. A Blitz post is written the same way in two steps (Write, Review), and so is a partner's post when claiming a Blitz slot, whose last button is Claim slot.

A saved post shows "Saved โ€” you can still edit it until go-live."

The character budgetโ€‹

A cross-promotion post is capped at 1,024 visible characters, and that is the number the server enforces. The composer shows you a lower one: 991.

The missing 33 are held back for the attribution line. advertisement via onflowads.com is 31 characters and sits after one blank line, so it costs 33 characters of the post โ€” and whether it is added is decided by the partner's plan, not yours, so the composer cannot know in advance. It reserves the room either way and prints the reason under the box โ€” 33 characters are held back for the "advertisement via onflowads.com" line, added unless your partner's plan removes it.

Practical version:

  • The counter reads N / 991 and turns red past 991, and the checks panel asks you to "Trim the post to fit the 1024-character limit."
  • Write to 991. It is the ceiling that leaves room for what actually gets published.
  • Formatting is free. Bold, italics, a link's markup โ€” only the words a reader sees are counted, so paste from a document and you may find you have more room than you expected.
  • Which plans remove the line, and why it is the host's plan that decides, is on What gets posted.

Formatting your postโ€‹

The composer is a rich text editor, not a plain box. The toolbar sits above the text area:

ButtonWhat it does
BBold
IItalic
UUnderline
SStrikethrough
โ–ฎSpoiler โ€” Telegram hides the text until a reader taps it
</>Inline code
๐Ÿ”—Link โ€” opens the link dialog
โœ•Clear formatting on the selection

Everything you write is converted to the small subset of HTML Telegram accepts: bold, italic, underline, strikethrough, inline code, preformatted blocks, block quotes, spoilers and links. Anything outside that subset โ€” an image pasted into the text, a heading, a font colour โ€” is stripped on save, and the text survives without it. Tags are always closed for you, so a half-applied format can never break the send.

The character count is visible characters, not markup

Only the words a reader actually sees are counted. Bold, italics and a link's markup all cost nothing against the counter.

Adding a photoโ€‹

Every plan can attach one photo. The tile under the text is headed Photo, with the hint "Optional. PNG, JPEG, WebP or GIF up to 2 MB. It posts above your text."

There are exactly two controls, and which one you see depends on whether a photo is attached:

ControlWhen it appearsWhat it does
Add photo ยท up to 2 MBThe slot is emptyOpens the file picker. While the file uploads the tile says "Uploadingโ€ฆ"
ร— on the thumbnailA photo is attachedRemoves it โ€” "Remove this photo". While it clears, the tile says "Removingโ€ฆ"

To swap one picture for another, press ร— and then Add photo; there is no separate Replace control, and no way to download the attached image back out of the composer.

Two behaviours worth knowing:

  • Uploading alone changes nothing. The photo is only attached to the post when you press Save post. Leave the page without saving and the post keeps whatever it had.
  • Remove is undoable by not saving. Pressing ร— marks the photo cleared for the next save; reload the page without saving and the photo is still there.
  • Editing text only never drops the photo. Saving a text change carries the attached image forward untouched.

Video is not supported on either side of a cross-promotion post.

Creative photos are served from a public URL

Telegram's servers have to be able to fetch your image to render it in the channel, so an attached photo is served from an unauthenticated address. The address contains a long, unguessable token โ€” nobody can find it by guessing โ€” but anyone you send the link to can view the image without signing in. Treat an attached photo as public from the moment you upload it.

An image no campaign points at any more is deleted after a 48-hour grace window, and every creative image belonging to an account is deleted when that account is deleted.

Buttons render underneath the post in Telegram. They are a paid feature, and the number you get depends on your plan.

PlanButtons per post
FreeNone
Referral PremiumNone
Lite1
Plus2
Elite3
Master4
Ultimate4

On Free, the button area shows a single locked Inline buttons row with a Locked button; pressing it says, in a notice, that buttons come with Lite. On a paid plan you get your allowance as editable rows, and each row above your cap shows a Locked button that names, in a notice, the plan that opens it.

Each button needs a label and a link. The label box takes up to 48 characters โ€” it stops accepting input at that point rather than showing an error, so plan your call to action around 48, not around the 64 the server would technically allow. A half-filled row is not silently dropped: leave a label without a link and saving is refused with "Give every button both a label and a link โ€” or clear the half-filled row."

Colouring a buttonโ€‹

From Plus upward, each button row grows a Colour control โ€” four swatches, one of which is always selected:

SwatchWhat Telegram draws
DefaultTelegram's normal button
BlueA blue button
GreenA green button
RedA red button
  • One colour per button, and every button you are allowed may carry its own โ€” a green Join the channel next to a default Read the thread is fine.
  • Free, Referral Premium and Lite do not see the control. The swatches simply are not rendered.
  • Downgrading never breaks a saved post. If your plan drops below Plus, the colour is discarded on the next save and the button goes out in Telegram's normal style. The button itself is never removed.
  • Older Telegram apps draw a plain button. Colours are a recent Telegram feature; a reader on an app that predates it sees an ordinary, fully working button. There is nothing to check and no one to warn.

The same rules apply to links inside your text and to button targets โ€” they are checked once, when you save.

LinkWho can use itThe refusal if you cannot
A public Telegram link โ€” t.me/yourchannel, t.me/s/โ€ฆ, a share link, a telegram.org pageEveryone, on every planโ€”
A private Telegram link โ€” t.me/+invite, t.me/joinchat/โ€ฆ, t.me/c/โ€ฆLite and above"Private Telegram links are not available on this account."
Any link outside TelegramAnyone who has bought the External Links add-on"External links need the External Links add-on ($1)."

Anything that is not a full http:// or https:// URL is refused with "That link doesn't look valid. Use a full https:// URL." A tg:// link, a bare hostname, and a URL with a username embedded in it (https://[email protected]) are all rejected rather than guessed at.

The External Links add-on is bought inside the link dialog

When you paste a non-Telegram URL into the ๐Ÿ”— dialog, the dialog itself offers Enable external links โ€” $1 and charges your Onflow Ads wallet. It is a one-off purchase, not a subscription, and it unlocks external links across the whole site's post editors. It is scoped to the plan you were on when you bought it, so it is worth buying on the plan you intend to stay on. Once enabled, the dialog shows the purchase's own OFXA- reference next to the accepted link.

Writing with AIโ€‹

Under Write it with AI โ€” "Describe the ad and let Onflow draft it. You can edit anything it writes." โ€” the Write with AI button opens a popup titled Draft your cross-promotion post, with three tabs.

TabWhat it doesWho has it
GenerateWrites a first draft from your channel's profile, tuned to your partner's audience. A What should the post say? field takes an optional brief.Any plan with AI text allowance left
RefineRewrites your current text to an instruction โ€” Copy to improve and How should it change?Any plan with AI text allowance left
ImageGenerates a promotional photo from a Describe the image prompt, and attaches it as the post's photoMaster and Ultimate only

Nothing lands in your post until you say so. A finished result appears as a preview inside the popup under the note "Have a look. Nothing changes until you apply it.", and only Apply to my post puts it in the editor โ€” which closes the popup and leaves the text there for you to edit. Regenerate tries again if you do not like it. Even after applying, nothing is stored until you press Save post, so a draft you dislike costs you only the AI action.

The AI drafting popup is a 1:1 feature

Neither Blitz composer offers it โ€” not the creator's one-post editor and not the partner's claim form. Write a Blitz post yourself, or draft it in a 1:1 campaign and paste it across.

The popup shows your remaining allowance at the bottom. Every AI feature in cross-promotion spends from the same two counters โ€” a daily one that resets at 00:00 UTC and a monthly one that resets on the 1st:

  • Best day to go live on the create wizard;
  • Generate and Refine here;
  • Find my best matches in the directory;
  • Redraft my blurb with AI on the quiet-listing banner.

Image generation is metered separately, on its own daily and monthly image counters.

A failed AI action is refunded

If the model returns nothing usable, the action is given back โ€” the page says so explicitly ("no action was used", "no image was used"). You are never charged an allowance unit for an empty result. An image that comes back damaged is refused and refunded before it can ever reach a channel.

Editing resets approvalโ€‹

You can edit your post right up until the hand-off โ€” but every save clears your partner's approval of it, and they must approve the new version before delivery can proceed. Edit late and you may push the campaign past its go-live window.

Reviewing your partner's postโ€‹

Under Your partner's post you see a preview of the post that will run in your channel โ€” "This runs in YOUR channel. Approve it, or send it back for a change." The preview is Telegram-accurate: the formatted text as it will render, the photo, the buttons, and a list of every destination any link or button leads to, so you can see where your subscribers would be sent before you agree to it.

  • Approve โ€” you are happy for it to run. The page then shows "You approved this."
  • Send back โ€” clears their post entirely so they rebuild it, and DMs them asking for a revision.

If they have not built anything yet: "Waiting for your partner to build their post."

Reviews auto-approve after 6 hours

Once both posts are built, a review clock starts and the page prints the exact deadline: "Unanswered reviews auto-approve after โ€ฆ". Any review still unanswered when the clock runs out is approved automatically and marked (auto), so a silent partner cannot strand a fully built campaign. If you care what runs in your channel, review promptly โ€” an auto-approval is as binding as one you pressed yourself.

You get Telegram DMs when a post is ready for your review and when your own post is sent back.

The hand-off: automatic deliveryโ€‹

When four things are true โ€” the campaign is Confirmed, both posts are built, both reviews are approved (by hand or automatically), and the go-live has not passed by more than six hours โ€” the campaign moves to Scheduled and both of you get a DM saying everything is locked in and there is nothing more to do.

From then on the delivery bot runs it:

  • At go-live it publishes each side's post into the other's channel. This is why the bot must be an admin of both. Just before it sends, it asks the website what every link in each post becomes โ€” its own counted onflowads.com/rr/โ€ฆ short link, which sends the reader on to a campaign invite link, a Telegram address exactly as written, or a web page โ€” and publishes what it is handed. See What gets posted.
  • If it cannot publish both, it publishes neither. A side that did go out is taken down again and the run is marked failed. Nobody gets a free ride and nobody is penalised.
  • During the run the page badges โ— Live now, results update, and the monitor checks every 30 minutes that both posts are still up. See The delivery monitor.
  • At the end of the run the bot removes both posts and the campaign completes.
  • The run is timed from the moment the posts actually go out. A campaign that only became ready after its agreed start (usually through the six-hour review auto-approve) posts within a minute of the hand-off and still runs for its full duration, so it ends later than first agreed โ€” once it is live the campaign page shows the real start and end, and those are the times to go by.
  • Each step reaches both of you twice over: the bot DMs you on Telegram, and the website puts the same event โ€” posts live, run finished, run called off, a rule break recorded โ€” in your notifications and your email. If you never linked Telegram, those are how you hear.

While the campaign is Scheduled, either side can still cancel. Once it starts going live it cannot be cancelled.

Campaign insurance

Insurance is cover each side declares for the campaign โ€” the figure you would pay your partner if you broke the rules, up to $500, frozen when the campaign is confirmed. Elite, Master and Ultimate bundle the benefit, and the plan strip marks such a campaign ๐Ÿ›ก๏ธ Insured. If the delivery monitor confirms one side took its post down early, the website moves that side's declared figure from their wallet to the other's โ€” withdrawable money, paid once, with no claim to file. The bot only records the claim; there is no fixed payout any more. See Campaign insurance.

If your campaign was never queuedโ€‹

A campaign can be fully built and approved and still never post. When that happens the page replaces "Ready for go-live" with a warning banner and the status stays Confirmed โ€” the campaign remains yours to reschedule.

BannerWhat it meansWho fixes it
This campaign missed its go-live windowThe campaign was not ready within six hours of its start, so it was deliberately abandoned rather than posted a day late. The banner names what was outstanding โ€” for example "the joiner never built their post". Nothing was posted in either channel.Either side: press Propose new time and run it. Both posts are still saved.
Delivery is blocked โ€” a channel has no @usernameThe bot addresses a channel by its @username, and the banner names which side is missing one.The owner of the named channel: set a public username in Telegram, keep the bot an admin, and the campaign queues on the next sweep.
Delivery is blocked โ€” no go-live timeThe campaign has no scheduled start.Either side: propose a time.

The queue is re-checked every 10 minutes, so a fix takes effect without anyone pressing anything.

Blitz creativesโ€‹

In a Blitz campaign the shape changes: the creator builds one post that runs in every partner's channel, and each partner writes theirs while claiming a slot on the join page.

Three differences from a 1:1 post matter:

  • A Blitz post carries no photo, on either side. There is no photo slot in either Blitz composer, and text plus buttons is all that goes out.
  • There is no mutual review step. The creator sees every partner's post before launching; every partner sees the creator's post before claiming.
  • There is no AI drafting popup in either Blitz composer.

Character budget, formatting, button caps, button colours and link rules are identical to a 1:1 post โ€” including the 33 characters held back for the attribution line, so both Blitz composers count to 991 as well. Only the reason printed under the box changes: a partner claiming a slot is told the line is "added unless the creator's channel is on a plan that removes it", while the creator โ€” whose one post lands in many channels on many different plans โ€” is told it is "added in each partner channel whose plan does not remove it". A Blitz creator genuinely cannot know in advance which of their partners will carry the line, which is exactly why the room is always reserved.

Timeline at a glanceโ€‹

  1. Partner joins and the schedule is confirmed.
  2. Both sides build posts โ€” any time while the campaign is in setup.
  3. Both sides review, with a 6-hour auto-approve backstop.
  4. The campaign flips to Scheduled and both parties are notified.
  5. The bot posts at go-live โ†’ Live now โ†’ posts removed at the end โ†’ Completed.
  6. Campaign results become available, then rate your partner.

If something goes wrongโ€‹

What you seeWhat it meansWhat to do
"Write your post text first."The editor is empty, or contains only formatting.Type something before saving. The server says the same thing as "Write your post text."
The counter turns red, and the checks panel says "Trim the post to fit the 1024-character limit."You are past 991 visible characters โ€” the composer's ceiling, which leaves room for the attribution line.Trim to 991. Markup is not the problem; words are. See the character budget.
"Post is too long โ€” N/1024 characters."The server's own hard ceiling, 1,024.Trim it. You should have hit the composer's check first.
"Give every button both a label and a link โ€” or clear the half-filled row."A button row has one of the two filled in.Finish the row or clear it with its ร—.
"๐Ÿ”’ Inline buttons are not available on this account."Your plan includes no buttons.Put your link in the post text instead โ€” a public Telegram link is free on every plan.
"Your plan allows up to N buttons per post."You added more rows than your plan carries.Clear the extra rows, or upgrade.
"Private Telegram links are not available on this account."You used a t.me/+โ€ฆ, /joinchat/ or /c/ link on Free.Use your channel's public link, or upgrade to Lite.
"External links need the External Links add-on ($1)."The link is not a Telegram link.Buy the add-on from inside the ๐Ÿ”— dialog, or link to your Telegram channel instead.
"That photo is N MB โ€” the limit is 2 MB."The file is too big. The composer checks the size before it uploads anything; the server says "That image is over the 2 MB limit." if one gets that far.Re-export it smaller.
"That file doesn't look like a supported image (PNG, JPEG, WebP or GIF)."The file is not one of the four accepted types, whatever its extension says.Convert it.
"We couldn't use that image โ€” โ€ฆ Please choose another one."The file is truncated or malformed. It is refused here so it cannot fail at go-live with the campaign already live.Re-export and upload again.
"You can only build a post while the campaign is being set up."The campaign has already been handed to the delivery queue.Cancel before go-live if the post is wrong, then start fresh.
"Your partner hasn't built their post yet."You pressed Approve before there was anything to approve.Wait for the DM saying a post is ready.
"You've used today's AI actions."The shared AI text allowance is spent.The daily counter resets at 00:00 UTC, the monthly one on the 1st.
"AI image generation isnโ€™t included on this account."Image generation is Master and Ultimate only.Upload your own photo โ€” every plan can.
"Ready for go-live" has become Delivery blockedSomething is stopping the hand-off.See If your campaign was never queued.
  • What gets posted โ€” exactly what a reader sees in the channel, including the attribution line and the link rewriting.
  • Campaign results โ€” the numbers your post produces once it runs.
  • Campaign lifecycle โ€” every status from Scheduled onward.
  • Add-ons and extras โ€” the External Links add-on, and every other paid extra around a swap.

Next: What gets posted โ€” the shape of a delivered ad in a real channel.