Paid Media

How I Write Meta Ad Copy: The System Behind the 125 Characters

By Thomas Robinson · Oct 28, 2026 · 18 min read

A Meta ad mock-up with the 125-character fold marked and headline character counts in green, amber and red

Every guide to Meta ad copy says the same three things. Primary text cuts off around 125 characters on mobile. Headlines show about 27 to 40. Load several variations and let Meta pick.

All true. All table stakes. None of it tells you what to write, how to keep an ad live for months without touching it, or how to know which line is doing the work.

The premise I run on is simple. Ad copy is a set of templates keyed to the creative dimensions that matter, the product type and the customer archetype, so that every new ad launches with headlines, primary texts and descriptions that are relevant to that ad and to the landing page behind it. Meta then chooses which of those lines to surface for each person. And because you never go back and change a live ad, the feedback loop improves the templates for the next launch cycle, not the ads already running.

So the work is less a writing exercise than a loop: source the words from customers, write them into one matrix of templates, ship each new ad through one build that points at a testing link, name every ad so the copy decision shows up in the data, and read the numbers every week to rewrite the templates. The character limits are the bumpers on the bowling lane. Useful. Not the game.

What follows is that loop as I run it in one account, a home water-filter brand selling shower filters, faucet filters and bundles, with a couple of hundred live ads. A brand running twenty ads needs a smaller version of the same thing, not a different one.

1Customer datasurvey, reviews,headline exports2Matrixarchetype × product× angle3Templateone build forevery ad4Testing linkthe page carriesthe offer5Ad nameevery decision isa column6Weekly readnew rows fornext weeknew rows go back into the matrix every weekTHE LOOP BEHIND THE WORDS
The loop feeds forward: the weekly read changes the templates for the next launch, never the ads already live.

Meta ad copy best practices: the table stakes

Quickly, because every other guide covers this part well. These are display guidelines rather than input limits.

SlotWhat tends to showHow I treat it
Primary textAbout 125 characters in the mobile feed before “See more”. Meta accepts far more, and the cut-off varies by placement and deviceThe hook, the offer or the objection answer lands before the fold. Under about 100 often does better for us. Everything after it is a bonus for the few who tap
HeadlineAbout 27 characters in Facebook Feed on a small phone, around 40 in most other placementsMy sheet flags green under 28, amber from 28 to 40, red over 40
Description25 to 30 characters, and only reliably shown in a handful of placementsA bonus proof line. It never carries anything the ad needs
EmojisOne to two characters each, sometimes moreOne or two at most, usually none
Text optionsUp to five per field, and Meta can add AI-generated variations on topTwo or three primary texts, two or three headlines, two descriptions. Why not five is below

One caveat before moving on. The best-performing retargeting headline we have run in that account is an authority claim, a “#1 dermatologist recommended” line, and it is 42 characters long. The guideline says 40. The data won, and it was not close. Treat the limits as defaults: a headline that clips on a small phone and still converts is a headline that works. You only find that out if the data is set up to tell you, which is the rest of this post.

Where the copy comes from: three places, none of them a blank page

The most common mistake I see in ad copy is writing from the brand’s point of view. The customer has usually told you what to say already. You have to go and get it.

The post-purchase survey

For example, two questions have mattered more than the rest for us: what made you buy, and what almost stopped you. Answers to the first become top-of-funnel hooks. Answers to the second become retargeting copy. In this account the top motivators are skin-related, so skin-led hooks get the most rows. The objections are mostly about cost, price first and refill cost second, then proof, then whether it will fit the shower. So most of the objection copy is about money rather than features, which is not what we would have written from instinct.

Five-star reviews

Read a few hundred, pull the recurring themes and paraphrase them. I don’t quote a named reviewer word for word in ad copy. The themes become proof lines: softer skin and hair, results in a week or two, an install the non-handy can manage, water pressure that holds, renter friendly. A proof line written in the customer’s cadence tends to beat one written in ours.

Headline exports

For example, pull ad-level reports with the headline column, trailing 30 days and year to date. Which headlines carry spend and purchases, and what pattern repeats: authority, question, benefit, offer. That is where the dermatologist headline showed up on top. An authority claim, not a benefit claim. We would not have guessed that either.

The rule that ties it together: the data decides which angles get more rows. Instinct gets a row or two to prove itself. Your survey will say something different from ours, which is the point of running it.

The copy matrix

The matrix is the template library. One workbook; every copy set is one row with three dimensions: the archetype (who the ad is for), the product, and the angle (the motivator it leads with, the offer it carries or the objection it answers). Two or three variations per cell, written so that a new ad for a given product and archetype can be loaded with lines that fit both the creative and the page it lands on, and so Meta has only relevant options to choose between. Every row has primary text, headline and description with a live character count beside each, and conditional formatting polices the specs: red over 40 on headlines and over 30 on descriptions, amber from 28 to 40. Nobody has to remember the specs. The sheet remembers.

The archetypes we write for in that account, and the proof each one needs:

ArchetypeCares aboutThe proof that lands
SkinTight, dry, breakout-prone skin after showersA dermatologist’s voice, clinical testing language
HairShedding, frizz, dull colour, scalpA credible hair expert, before and after over time
SkepticWhether any of this is realIndependent certification, what gets removed, how much it filters
HealthWhat is in the water and what it does to the householdContaminant specifics, “up to” numbers, plain language
Home and familyAn upgrade for the house, protecting the kidsInstall ease, renter friendly, all-metal build, one order for the whole house

Yours should come out of your own survey and reviews, not this table. Retargeting gets its own angle set. For example, if you use offers at the bottom of the funnel to convert warm leads who interacted with top-of-funnel ads and visited product pages but never bought, you might have an “offers” block with different templates for each type (a buy-one-get-one led by each hero product, and a bundle) and an objection-buster block (price, refill cost, proof, fit, install, guarantee). A fit-explainer ad with generic beauty copy answers nothing. The copy has to answer the question the creative is asking.

A read-me tab holds every rule in this post, so the media buyer can load an ad without a call: filter to the ad’s archetype, product and angle, and load. An ad that spans two angles, say an acne before-and-after that is also proof, pulls from both blocks.

Why two or three options and not the five Meta nudges you toward: in the accounts I run, the fifth option is rarely as relevant to the creative as the first two, and more combinations can slow the point where delivery settles on a winner. Meta’s interface will tell you more options improve your opportunity score. It does not tell you they improve your cost per purchase. If you run a handful of ads into a very broad audience, test more against fewer rather than take either view on trust.

Cold copy and warm copy are different jobs

Top of funnel

In my cold ads, no offers. No “BOGO”, no “30% off”, no “free shipping today”. The call to action stays generic: “See your limited-time offer” is 27 characters and fits every placement. Two reasons. I don’t want to train cold customers to wait for a discount, and it keeps the ad decoupled from whatever offer is on the page this month (more on that under testing links). The hook is the motivator, inside the first 125 characters, and the proof line follows. One problem per ad. Ads that try to say everything about the product have failed for us more reliably than anything else we test.

Retargeting

These people have seen the ads and visited the site, so there is no brand intro. The offer set leads with the deal and its value, and urgency is allowed. The evergreen objection set answers the objection in the first line, uses proof over adjectives, carries no offer hook and closes with a generic limited-time line. Offer-specific creative lives here and only here.

Two things the data taught us about warm copy in that account: static images with the offer on them beat offer videos, and buy-one-get-one and bundles are our strongest offer frames. Your margins decide whether either belongs in your plan; I wrote about matching offers to cohorts in the Black Friday grid.

Evergreen or it doesn’t ship

The goal is copy that is still true in six months, so the ad never needs an edit. For example, the rules I run for the text that sits in the slot:

  • No absolute prices. Frame value relatively: “full-size filter free”, “pennies per wash”, “less than one facial”. Prices change; those lines survive the change.

  • No named sales. “New Year’s sale” is dead in February and will still be spending in March if nobody catches it.

  • No year stamps, unless someone owns the January refresh.

  • No “of the year” superlatives. “Our biggest deal of the year” has to be literally true or it gets retired.

  • No dated deadlines. “Ends Sunday” lives on the creative and in copy loaded with new ads at the monthly rotation. The text in the slot stays date-light: “a limited-time offer is waiting”.

Then the monthly scan. Export every live headline and primary text and search for year references, seasonal and holiday names, the word “sale”, “of the year”, weekday and “last day” deadlines, and calendar dates. Anything that hits gets flagged, spending ads first. It is a five-minute script, and it has caught legacy copy still spending that everyone assumed was paused.

The claims also have to match the live site. In one copy library, the guarantee window in the ads did not match the product page; it was fixed before anything loaded. Copy is a liability if nobody checks it against the page it sends people to.

Compliance lives in the rows, not a PDF

For a health-adjacent product, the rules I write in: “up to” on every performance stat, “clinically tested” and never “clinically proven”, no treat or cure claims, no competitor names, and consumer-study percentages carry “*results may vary.” in the same text box, where it stays if the line gets shortened. The softeners are standard: “helps with”, “may contribute to”. Doctor and expert ads need talent approval before launch. Your category’s rules will be different. Where they live should not.

The point is that they are written into the rows of the matrix, so the version the buyer copies is already compliant. A compliance PDF nobody opens is not a control.

Text options without resetting the learning phase

This is the part most Meta ad copy guides skip, and it is what makes the rest possible.

The settings

I load multiple text options, leave optimize text per person on so Meta can choose the combination for each viewer, keep translation off, and use “Get offer” rather than “Shop now”. Plenty of guides tell you to switch text optimization off to control the pairings. I leave it on because the matrix means every option is relevant to the ad, so there is nothing to protect; if yours are not, the guides have a point. Meta renames and reshuffles these settings often, so check what each one does before you trust a default.

The template

Every ad gets built the same way: a name from the taxonomy, two or three primary texts, two or three headlines, two descriptions, a generic call to action, and the destination set to the product’s testing link. One template is what makes a couple of hundred live ads manageable, and it is what makes them readable later, because the tagging and the reporting both parse the same structure.

Don’t edit a live ad

Meta treats edits to an ad’s text, creative or destination as significant edits, and those can send the ad set back into learning, throwing away the engagement, the social proof and the delivery data the ad has built. So I never go back and change a running ad. Copy changes ship on new ads: duplicate, load the new rows, launch, and pause the old one at the monthly rotation. It feels slower. In my experience it isn’t, because a reset ad spends a week relearning what the old one already knew.

This is why getting the templates right matters more than any single ad. Whatever the weekly read teaches goes into the matrix and shows up in the next launch cycle. The ads already live keep running on the templates they launched with.

Testing links

For example, every top-of-funnel ad in that account points at one static URL per product group: a shower page, a faucet page, a bundle page. Behind each URL, a page-testing tool (we use Intelligems) splits traffic between a control page and a variant, one hypothesis per variant, read weekly on conversion rate, revenue per visitor and cost per acquisition. The winner becomes the new control and the next variant gets queued. The ad’s URL never changes, so the engagement, the social proof and the learning on the ad carry across every page test and every offer change. (How I pay a team to run those tests is in why conversion rate is a terrible bonus target.)

That is why the cold copy can stay generic about the offer: the page carries it. We can run buy-one-get-one one month and a bundle the next, test a listicle against an advertorial, or a dermatologist-led page against a water-quality page, and not one ad gets touched. The latest extension is ad-to-page match: route by a tag in the ad name to a page built for that creative, tested against the best generic page as the control.

Name the ad so the copy decision is readable

You cannot read a dimension you did not name. For example, every ad name in that account carries the launch week and version; the concept type (NNC for a net new concept, ITER for an iteration of a winner); the ad format (us versus them, testimonial, UGC, founder, before and after); the product and archetype; the one problem the ad is fixing; talent gender and age bracket; the offer code and a BOGO flag; and the strategist, editor and creator. Roughly:

2644-ITER-V2-UGC-SHW-SKIN-DRYSKIN-F30-NOOFFER-{strategist}-{editor}-{creator}

We learned this the hard way. We started with one field called “ad focus” that mixed what the ad looked like with what it was about, so you could not tell whether testimonials were winning or dry-skin ads were winning. We split it into ad format and ad problem. The copy angle now lives in archetype plus ad problem, and both are columns in every export.

When every field is a column, every field becomes a chart. That is the whole trick, and it is the same tagging idea behind how I turn Meta creative data into better briefs.

The weekly read

Best practices are inputs. The weekly read is where the decisions come from, and every decision it produces lands in the templates for the next launch, not in the ads already running.

For example, our cadence: launches twice a week, roughly half the week’s new ads on Monday and half on Thursday, with the performance review on Monday morning and pauses and reactivations right after.

The data: ad-level results for the last 7, 14 and 30 days, excluding the most recent two days so attribution settles. Meta-reported purchases, cost per purchase, ROAS, link click-through rate, add-to-cart rate and hook rate, with Triple Whale’s click-only new-customer view as the second opinion. Top of funnel and retargeting are read separately, and offer ads are read apart from everything else, because offer performance will flatter or sink any blended view.

The cuts: every field in the ad name gets its own chart, then an AI tagging layer reads the ads for what a name cannot carry (persona, hook tactic, emotion, angle), then the headline exports and the survey by week.

Reading Meta against the attribution tool

Neither view is the truth. They are two consistent trajectories with different windows, which is why the tool’s new-customer CAC usually runs higher than Meta’s cost per purchase. My rules of thumb in that account: a small gap, I go with Meta’s read. A big gap, I watch it. A gap that doubles, the ad gets downgraded. Zero new customers in the tool, I don’t promote the ad however good Meta says it looks. The reverse matters as much: if Meta is under target and lifetime ROAS holds, the ad stays live even when the tool is light. Most of the gaps I see are tracking, not performance. More on why the tools disagree in what you are really paying for in an attribution tool.

The decision rules

  • A small share of ads drives most new customers. Spend concentrates there, and the copy learnings come from there.

  • Iterations over net-new concepts. A new hook on a proven winner beats a new concept most weeks in that account.

  • Pause relative to peers in the same campaign, not against an absolute line. A high-spend ad doing worse than its neighbours gets pulled.

  • Fatigue gets fresh hook and call-to-action variations on a duplicate, not an edit.

  • Rotation is monthly. New copy rides new ads.

What the data has taught us about copy in that account, so far: authority beats benefit in retargeting headlines. Cost is the retargeting conversation. Skin angles work with a specific persona and a credible voice and fail as generic beauty copy. The edit is the biggest performance variable (each video concept ships in three to five edit versions with different hooks), and copy variations are the cheapest version of the same idea. Carousels have not worked for us. Superlatives age badly. And a 42-character headline can win.

A worked example

Three illustrative copy sets from the matrix, with the counts the sheet would show.

Top of funnel: shower filter, skin archetype

  • Primary text (107 characters, before the fold): My skin stopped feeling tight after showers about two weeks in. Turns out it was the chlorine, not my soap.

  • After the fold: The filter takes out up to 99% of it and installs in minutes, no plumber. See your limited-time offer.

  • Headline (36, amber): Softer skin starts at the showerhead

  • Description (19): Installs in minutes

Retargeting: objection buster, skeptic archetype, proof

  • Primary text (109): You looked, you didn’t buy. Fair. The proof: independently certified, tested on the contaminants that matter.

  • Closer: A limited-time offer is waiting.

  • Headline (36, amber): Certified. Tested. Derm recommended.

  • Description (22): See the certifications

Retargeting: offer, bundle

  • Primary text (106): Shower filter + faucet filter, and the second full-size filter is free. Whole house, one order. Ends soon.

  • Headline (36, amber): Buy one, get one free - limited time

  • Description (26): Shower + faucet, one order

No prices. No dates. The offer is named in retargeting only. The cold ad’s call to action is generic so the page can carry whatever offer is winning this month. And the headline “Softer skin in two weeks or your money back” would have gone red at 43; the sheet flags it before anyone loads it.

Steal the template

The matrix columns:

copy set name | ad set | angle (motivator / offer / objection) | product | archetype | var
primary text | pt chars | headline | hl chars | description | desc chars | landing page

The launch checklist as our buyer runs it, in order; adapt it to your own rules:

  1. The ad name follows the taxonomy, every field filled.

  2. Rows filtered to the ad’s archetype, product and angle.

  3. Two or three primary texts, two or three headlines and two descriptions loaded.

  4. The hook, offer or objection answer lands before character 125.

  5. No prices, dates, named sales or superlatives: the evergreen scan passes.

  6. Compliance language intact, “*results may vary.” attached where it belongs.

  7. Text options on, optimize text per person on, translation off.

  8. Call to action “Get offer”.

  9. The destination is the product’s testing link, not a product page.

  10. It is a new ad. Nothing live was edited.

And the monthly loop: the rotation scan, the headline export review, new rows into the matrix from the survey and reviews, new hooks on the winners, and old copy retired with the paused ads.

The copy is the smallest part

A good primary text is maybe a tenth of the outcome. That is my rough guess, not a measurement. The rest is where the words came from, whether they are still true in six months, whether the ad had to be edited to change the offer, whether the name tells you why it won, and whether anyone reads the numbers on Monday.

What I would tell a CEO: before hiring a better copywriter, ask whether the loop exists. Customer data into a matrix of templates by product and archetype, every new ad built from it and pointed at a testing link, every ad named so the decision is readable, a weekly read that rewrites the templates for the next launch while the live ads stay untouched. Run it every week and most of the copy writes itself. Skip a step and you are back to guessing what to put in 125 characters.

FAQ

What are the character limits for Meta ad copy?

Meta lets you enter far more than it shows. As a working guide, primary text shows about 125 characters in the mobile feed before “See more”, headlines about 27 characters in Facebook Feed and around 40 in most other placements, and descriptions 25 to 30 characters in the few placements that show them. Truncation varies by placement and device, so put the hook before the fold and treat the numbers as defaults rather than laws.

How many primary text and headline options should I add to a Meta ad?

Meta allows up to five per field. I usually load two or three primary texts, two or three headlines and two descriptions, all written for that specific creative, because extra options are rarely as relevant and more combinations can slow down delivery settling on a winner. If you run a few ads into a broad audience, test more options against fewer rather than taking either approach on trust.

Should top-of-funnel Meta ads mention the offer?

I keep offers out of cold copy and use a generic call to action, so cold customers are not trained to wait for a discount and the landing page can carry whichever offer is winning that month. Retargeting is where offers, urgency and objection answers belong. A brand that runs one permanent offer might reasonably make a different call.

Does editing Meta ad copy reset the learning phase?

Meta treats edits to an ad’s text, creative or destination as significant edits, which can put the ad set back into learning. I ship copy changes on a duplicate ad and pause the old one at the next rotation, so the live ad keeps what it has learned.

Seeing this in your own numbers?

A free 20-minute intro call. Bring what you have and I’ll tell you where I’d look first.

Book an intro call