Caption Variation per Account: Letting AI Rewrite Without Losing the Brand
How an AI agent can write a different caption for every account in a campaign while claims, offer and voice stay fixed, using per_channel in one create_post.
7 min read

Caption variation per account means each account in a campaign gets its own wording while the claim, the offer and the brand voice stay identical. The workable method is to split every caption into fixed parts and variable parts, give the agent explicit rules for each, and send all the variants in one call using per_channel. Done this way, forty Pages sound like forty local branches of the same business rather than forty copies of one post.
The difficulty is not getting an AI to write variants. Any model will happily produce forty versions of a paragraph. The difficulty is getting variants that are different where difference helps and identical where it matters.
Why vary captions at all?
There are two reasons, and they point in the same direction.
The first is the audience. A follower of a Page for a gym in Leeds responds to a post that mentions Leeds, the opening hours of that studio and the trainer they know. A generic caption reads as head-office broadcast.
The second is the networks. Meta's spam policy names repetitive content as one of the signals it acts on, and YouTube's spam policies cover repetitive and untargeted posting. A large set of accounts publishing the same text at the same time is easy to read as exactly that. Variation is not a trick to avoid detection; it is what genuinely local publishing looks like.
What should stay fixed and what should vary?
Before giving the agent any instructions, write this table for the client. It is the contract between the brand and the agent.
| Element | Fixed or variable | Notes |
|---|---|---|
| Core claim or message | Fixed | One sentence, quoted verbatim from the brief if legal sensitivity is high |
| Offer, price, dates | Fixed | The agent must never paraphrase numbers |
| Legal disclaimers | Fixed | Copied exactly |
| Brand voice rules | Fixed | Tone, person, words to avoid |
| Opening line or hook | Variable | Different angle per account |
| Local detail | Variable | Neighborhood, branch name, local landmark, staff name if provided |
| Call to action phrasing | Variable | Same action, different wording |
| Length | Variable within a range | For example 40 to 90 words |
| Hashtags | Variable from an approved set | The agent picks, never invents |
| First comment | Variable | Same link, different lead-in sentence |
Our earlier piece on brand consistency across many accounts covers the brand side of this in more depth. The table is the bridge between that guidance and what the agent actually does.

Where does the agent get local detail from?
This is where most variation goes wrong. If the agent has no real information about each account, it invents some, and invented local detail is worse than none. A caption that mentions the wrong street will be noticed by exactly the people you want to reach.
Give the agent a source of truth. Account names from list_channels are a start, since many agencies name Pages by location. For richer detail, keep a small table per client: account, location name, area, opening hours, one or two local facts the client has confirmed. Paste it into the skill or attach it to the run. Then add a rule: "Use only local details from the account table. If an account has no details, use its location name and nothing else."
How does the call look?
Shager's create_post accepts a shared caption and a per_channel array where each entry can override the caption, the first comment and the format for one account. A trimmed example for three accounts:
{
"caption": "Free intro session this Saturday. Book through the link in the comments.",
"group_ids": ["<group_id_north>"],
"media_ids": ["<media_id>"],
"format": "REEL",
"cta_url": "https://example-gym.com/intro",
"campaign": "intro-saturday-oct",
"label": "w42-agent",
"stagger_seconds": [60, 150],
"per_channel": [
{
"channel_id": "<channel_id_headingley>",
"caption": "Headingley, your first session is on us this Saturday. Sam and the morning crew run intro classes from 9 to 12. Free, no commitment.",
"first_comment": "Grab a Headingley slot here:"
},
{
"channel_id": "<channel_id_chapel_allerton>",
"caption": "New to training? Chapel Allerton is opening its doors this Saturday for free intro sessions. Come see the space, meet the coaches, try a class.",
"first_comment": "Book your Chapel Allerton intro:"
},
{
"channel_id": "<channel_id_kirkstall>",
"caption": "Saturday at Kirkstall: free intro sessions for anyone thinking about starting. No contract, no pressure, just a proper first workout.",
"first_comment": "Kirkstall intro booking:"
}
]
}
Notice what stayed fixed: free, this Saturday, intro session, booking link. What changed: the hook, the local name, who runs it where the client provided it, and the closing. Shager attaches each account's own short link and UTM tag, so the three variants are also measured separately.
What prompt produces good variants?
Here is the instruction block we suggest placing in the agent's skill for any multi-account post:
CAPTION VARIATION
1. Read the fixed elements from the brief: core message, offer, dates,
disclaimer. Copy them exactly. Never paraphrase numbers or dates.
2. For each account, write a caption between 40 and 90 words.
3. Each caption must open differently. Do not start two captions with the
same three words.
4. Use local details only from the account table. If none, use only the
location name.
5. Rotate the call to action phrasing. Same action, different words.
6. Hashtags: choose up to 3 from the approved list. Never invent hashtags.
7. Write a distinct first_comment lead-in per account, ending with the link.
8. Put all variants in per_channel in a single create_post call.
9. Before creating the post, list every variant's opening line so a human
can check variety at a glance.
Rule 9 is a cheap quality check. A reviewer can scan forty opening lines in a minute and spot repetition far faster than by reading forty full captions.
How do you review variants efficiently?
Read the fixed parts once, then check that they appear unchanged everywhere. A simple search across the variants for the price or date catches paraphrasing. Then read a sample of five full variants for voice. Finally, look at the opening lines together. If they cluster around two or three patterns, ask the agent to rework the cluster rather than the whole set.
For multilingual clients the same structure holds, with one extra fixed element: the language per account. Our guide to multilingual content agents covers how to handle that without translations that read as translations.
FAQ
Is a single caption with the location name swapped enough variation?
Usually not. A template where only the place name changes still reads as the same post. Vary the opening and the call to action at minimum, and use real local details when you have them.
Can the agent vary the format per account too?
Yes. Each per_channel entry can set its own format, so one account can get a Reel while another gets a feed post from the same media, where the network and media allow it.
Will varied captions hurt brand consistency?
Not if the fixed elements are truly fixed. Consistency lives in the claim, the offer and the voice. Wording that changes around a stable core is how good local marketing has always worked.
To get started, write the fixed and variable table for one client and add the instruction block to your agent. Our collection of prompts for a content agent has more instructions you can combine with it.