# 05 — The Facebook Ad (Ads Manager)

[← Back to README](README.md) · Previous: [04-the-worker.md](04-the-worker.md) · Next: [06-go-live-and-monitor.md](06-go-live-and-monitor.md) · Alt path: [appendix-B-meta-api-path.md](appendix-B-meta-api-path.md)

---

By now your lead form ([02](02-lead-form.md)) and your engine ([04](04-the-worker.md))
are built and tested. This stage creates the ad that feeds them: the campaign, the ad
sets, the targeting, and the creative. This file uses the **Meta Ads Manager UI** (the
point-and-click path). If you would rather have an AI assistant build the campaign through
the Marketing API, do this stage from [Appendix B](appendix-B-meta-api-path.md) instead.
The business decisions in this file (offers, budgets, targeting, creative rules) are the
same either way, so read them here first regardless.

Everything below is shown as NeatNow's **real 2026 campaign**, with `🔧 Customize`
callouts for what to swap. The click-paths were re-walked in the live Ads Manager in
**July 2026**, so they match the current Advantage+ era of the UI. These steps are text-only;
the screenshots in [`appendix-D-visual-walkthrough.md`](appendix-D-visual-walkthrough.md)
cover a different part of the build, the System User token setup from sections 1 and 4, not
these Ads Manager screens.

> ℹ️ **Meta renames these screens often.** Ads Manager moved almost everything under an
> "Advantage+" banner (automatic budget, audience, and placements). Labels below are what
> the tool showed in mid-2026; if a name has drifted by the time you read this, the *intent*
> of each step still tells you what to look for. Where the automation genuinely takes a
> control away, we say so instead of pretending the old manual step still exists.

> ⚠️ **Build everything PAUSED.** Create the campaign, ad sets, and ads without publishing.
> Ads Manager auto-saves your work as an **In draft** campaign that does not spend, finish your
> review, then publish and activate. You control when spend starts, not Meta.

---

## 1. The campaign

In Ads Manager, click the green **Create** button. A **Create new campaign** dialog opens:

1. **Choose a buying type:** leave it on **Auction**.
2. **Choose a campaign objective:** pick **Leads** (the API name is `OUTCOME_LEADS`). This is
   the objective that lets you attach an instant lead form and optimize for form fills.
   Click **Continue**.
3. Meta may then offer to **"Save time and start from a high-performing leads campaign"** and
   suggest cloning an existing one. Choose **No, start from a new campaign** and continue.

You now land in the full-screen builder. It has **three levels** stacked in the left rail:
**Campaign → Ad set → Ad**. You fill them top to bottom in one sitting. This section is
the Campaign level; sections 3-4 are the Ad set level; section 8 is the Ad level.

**On the Campaign screen:**

- **Campaign objective** reads **Leads** (set above). Under **Campaign details → Show more
  options** you will only find **Campaign spending limit (Optional)**, there is **no
  "Special ad category" picker in this flow anymore**. Cleaning is a normal commercial
  service (not housing, employment, credit, or a social/political issue), so there is
  nothing to declare. If your account does surface a special-category prompt, choose **None**,
  flagging a category you do not need only narrows your reach.
- **"Advantage+ leads campaign" shows "On" in the top-right panel, and there is no switch to
  turn it off.** It is a status indicator, not a toggle: do not go looking for an off button,
  there isn't one in this flow. It reports three automations that are on by default:
  **Campaign budget**, **Advantage+ audience**, and **Advantage+ placements**. You can change
  the budget one (next bullet); the audience and placement automation stay on, and you steer
  them with the controls in section 4 rather than switching them off. This is why several
  manual levers older guides describe now look different or are gone.
- **Budget → Budget strategy:** choose **Ad set budget**, not **Campaign budget**
  (**Campaign budget** is the setting formerly called CBO, now labeled *"Also known as
  Advantage+ campaign budget"*). **Ad set budget** is selectable here, picking it gives each ad
  set its own budget and schedule, for the reason in the next section. (Selecting it does not
  turn Advantage+ off; the panel still reads "On".)

> 🔧 **Customize:** Name the campaign so future-you can read it at a glance, e.g.
> `Lead Test [YYYY-MM] | [Offer A] + [Offer B]`. NeatNow's was
> `Lead Test 2026-06 | Move-out + Recurring`.

---

## 2. The key insight: one offer per ad set

This is a structural lesson that cost NeatNow real money to learn.

**If you put two different offers in ONE ad set, Meta will starve one of them.** Meta
optimizes within an ad set for the cheapest result. When NeatNow ran its recurring offer
and its move-out offer as two ads inside a single ad set, Meta funneled almost the entire
budget to whichever got cheaper clicks and starved the other:

| In one shared ad set | Spend | Leads |
|---|---|---|
| Recurring offer | ~$239 | 14 |
| Move-out offer | ~$7 | 1 |

The move-out offer never got a fair test. It was not worse, it was simply not fed.

**The fix: give each offer its own ad set with its own budget.** An ad set is the unit
Meta allocates budget to, so a separate ad set is the only way to guarantee an offer gets
spend. NeatNow split into two ad sets and each lane finally got a real test.

> 🔧 **Customize:** One ad set per distinct offer you want to guarantee gets spend. If you
> only run one offer, one ad set is fine, this lesson is about not co-mingling offers.

---

## 3. NeatNow's two ad sets (worked example)

### Ad set A — Recurring (~$20/day)

The higher-value, repeat-revenue offer, so it gets the larger budget.

- **Daily budget:** ~$20/day
- **Optimization:** optimize for **Leads** (the campaign objective handles this)
- **Creative:** cleaner-in-kitchen image + a "From $200/biweekly" price band
  (NeatNow's is an AI cleaner composited into a real kitchen; see section 6 on keeping AI
  imagery believable)
- **Targeting:** affluent neighborhoods via **custom-location pins** (see section 4)
- **Age:** minimum 22 (see the age note in section 4, the tool now treats the *upper* end as
  a suggestion, not a hard cap)
- **Placements:** NeatNow ran feed-first. The default is **Advantage+ placements** (all
  placements), but you can restrict to feeds by unticking the other placement groups under
  **Placement controls** (see section 4).

### Ad set B — Move-out (~$10/day)

A one-time, transactional offer. Smaller budget, broader reach.

- **Daily budget:** ~$10/day
- **Optimization:** optimize for **Leads**
- **Creative:** inspection-checklist collage with **NO price**
- **Targeting:** broad metro, the whole city plus nearby towns (see section 4)
- **Age:** minimum 22 (see section 4)
- **Placements:** same as above, **Advantage+ placements** by default (see section 4)

> 🔧 **Customize:** Your offers and budgets. The principle that transfers: put the bigger
> budget behind your repeat-revenue offer and tightly-targeted audience, a smaller budget
> behind your one-time/broad offer. Exact dollars are yours to set.

---

## 4. Targeting (the ad set's Audience section)

Two offers, two different targeting strategies. What follows is the reasoning NeatNow used
and what it actually ran. We are not targeting experts, so read this as one business's
approach worth testing, not as a rule.

### First, understand how the Audience section now works

Meta split the ad set's **Audience** into two kinds of setting, and the difference matters:

- **"Controls" are hard limits.** The tool literally says *"We won't reach people beyond
  these settings, even with Advantage+ on."* Your **Locations**, a **Minimum age**,
  **Languages**, and any **Excluded** audiences live here. **This is where your real targeting
  happens.**
- **"Suggest an audience" is a set of *soft* hints** (custom audiences, an age range, gender,
  and detailed-interest targeting). Meta will *"reach people beyond"* these when it thinks it
  will improve results. So anything you put here is a suggestion, not a fence.

The practical upshot: the geographic targeting below is a hard **Control** and does what you
expect. Interest/detailed targeting and the upper age bound are now suggestions Meta can
overshoot, so do not lean on them to keep the audience tight.

> ⚠️ **Check Locations first, every time.** Under **Controls**, **Locations** defaults to your
> whole **country** (NeatNow's showed "Canada"). If you skip this step you will pay to show a
> local cleaning ad nationwide. Setting your city is the single most important targeting move.

### Recurring → custom-location pins on affluent neighborhoods

Our thinking: recurring cleaning is a higher-lifetime-value commitment, and we guessed
affluent households were the likeliest to buy it. So rather than target the whole city,
NeatNow dropped **pins** directly on the affluent areas.

In the ad set, under **Audience → Controls → Locations**:

1. Remove the default country entry. In the **Search locations** box, type an area (a city,
   neighborhood, or postal code) and pick it. A map appears with your area; you can also place a
   point by hand using the **Drop pin** control on the map.
2. Click the location chip's dropdown to tighten the radius. Choose **Current city only**, or
   **Cities within radius** and drag the slider down (NeatNow used the smallest useful radius so
   a pin covers the affluent area and not the cheaper postal codes beside it). The default
   radius is a wide 25 mi / 40 km, so this almost always needs shrinking.
3. Repeat for each affluent cluster (**Add locations in bulk** speeds up a long list). NeatNow
   used **four pins**:
   - Elbow River cluster (Mount Royal / Elbow Park / Britannia / Roxboro / Bel-Aire / Elboya)
   - Altadore / Marda Loop
   - Aspen / Springbank Hill / West Springs
   - Bayview / Pump Hill / Palliser

> 🔧 **Customize:** Your city's affluent areas. What NeatNow chose to avoid was targeting the
> whole metro for a recurring offer, on the theory it would pay to reach households unlikely to
> buy a standing biweekly clean. We found the few neighborhoods where the houses are big and the
> incomes are high, and pinned those. Whether that holds in your market is worth testing.

### Move-out → broad metro

Move-out cleaning is more of a one-time, life-event purchase, so NeatNow treated anyone moving
in the metro as a possible prospect regardless of neighborhood, and targeted broadly. In the
same **Locations** control, add the whole city plus nearby commuter towns instead of pins.
NeatNow used **Calgary + Airdrie + Cochrane + Chestermere** as one broad area.

> 🔧 **Customize:** Your city plus the towns within your service radius. Broad is what worked
> for NeatNow on the one-time offer; pin-targeting a one-time mover audience did not make sense
> to us for this purchase. Test what fits your market.

### Age

Set your **Minimum age** under **Controls** (NeatNow used 22, and left **Languages** on
**All**). Note the change from older guides: only the *minimum* age is a hard control now. A
full range like "22-65" lives under **Suggest an audience**, where the upper bound is just a
hint Meta can exceed. So set the floor you actually want and treat the ceiling as advisory.
NeatNow used **no gender restriction**.

### Placements

By default, **Placements** is set to **Advantage+ placements**, which Meta recommends: your ad
runs across all available placements automatically (Facebook, Instagram, Audience Network,
Messenger, Threads; the tool counts 21 in total). But you are not locked into all of them. You
can restrict delivery to specific placements, for example a feed-only lead test.

To do it, open **Placements → Show more settings → Placement controls**. Each placement group
is a **checkbox you can untick**: **Feeds**; **Stories, Status, Reels**; **In-stream ads for
reels**; **Search results**; and **Apps and sites**. Untick everything except **Feeds** and
your ad runs feed-only. (Separately, **Placement controls → Account controls** lets you exclude
individual placements, e.g. drop Audience Network, across the account.)

Whether you *should* restrict placements is your call: Meta pushes Advantage+ placements as the
default and it often finds cheaper results across placements. A reasonable middle path is to
start on Advantage+ placements, watch lead quality by placement in reporting, and untick the
ones whose leads never book.

> Source: Meta Business Help Center, *"Choose ad placements in Meta Ads Manager"* — *"It is
> recommended that you choose Advantage+ placements… However, you can also manually choose your
> own ad placements if you want your ads to appear in specific placements only,"* with a
> dedicated flow for the `leads` objective. (Verified live in Ads Manager, July 2026: in the
> leads flow this lives under **Placements → Show more settings → Placement controls**. Meta's
> page shows no publication date.)

---

## 5. Two acceptances that can block delivery (keep them straight)

People conflate these. They are different, and only one is specific to lead ads.

### Lead Ads Terms (per Page, always required for lead ads)

Before a Page can run lead ads at all, someone has to accept Meta's **Lead Ads Terms** for
that Page. You do this at the Ad level, under **Identity** (section 8): once accepted, the Page
shows *"You've accepted Meta's Lead Ads Terms for this Page."* This one is genuinely lead-ad
specific, and if it is not accepted, the lead ad cannot deliver.

### Non-Discrimination certification (periodic, not lead-specific)

Separately, Meta asks advertisers to certify compliance with its Discriminatory Practices
(non-discrimination) policy. Per Meta's own help page, this is a **periodic** ask, not a
blanket precondition on every campaign: *"we may periodically ask you to review the policy and
certify."* Meta says it is *"especially important for advertisers who run housing, employment
or financial products and services ads"*, which is where it is most likely to fire. Cleaning
is not one of those categories, so do not assume every cleaning campaign will trip it.

But if Meta does ask you, it is a hard gate: *"you'll have to complete the process before your
ads can be approved,"* and *"your ads will be rejected if you don't certify."* NeatNow was in
fact prompted for this while building a lead campaign, and the ad would not deliver until it
was certified. So it can happen to a cleaning advertiser even though the policy is aimed
elsewhere; treat it as "handle it if Meta shows the prompt," not "a step everyone must do."

**If you are asked, certify here:**

1. Go directly to `facebook.com/certification/nondiscrimination`, or accept the prompt where
   Meta surfaces it (Ads Manager, Meta Business Suite, or account notifications).
2. Read the policy, then select **I accept**.
3. Re-check right before you activate. NeatNow saw the requirement lag or re-trigger around
   ad-set edits, so confirm it is still satisfied at go-live.

> ⚠️ **On the error code:** NeatNow saw this surface as a "Certification Required" rejection
> with error code **`2859024`**. That code is **not** in Meta's public
> [error reference](https://developers.facebook.com/docs/graph-api/guides/error-handling/) and
> is not named on Meta's certification help page, so treat it as one account's observation,
> not a documented code. (Sources for this section: Meta Business Help Center, *"Review and
> Certify Compliance for Meta's Discriminatory Practices Policy"*, and the live certification
> page at `facebook.com/certification/nondiscrimination`; neither shows a publication date.)

> Detailed step-by-step and what to do if it keeps re-triggering is in
> [Appendix C — Troubleshooting](appendix-C-troubleshooting.md).

---

## 6. Creative rules (test these in your own account)

**Read this first.** The performance notes in this section are from **one ad account over a
few weeks** (NeatNow's), not a controlled test. The sample is tiny. Treat them as **things to
test in your own account, not laws.** Two kinds of guidance follow: **principles** that hold
up on their own because they are about honesty and relevance (not about beating an algorithm),
and **what happened to work for NeatNow**, which is anecdote you should re-test for yourself.

### Principles (these stand on their own merits)

**Price anchors MUST match what your lead form can actually honor.** If your ad promises a
price the form cannot deliver, that is bait-and-switch, and it burns trust the moment the
auto-quote text lands. NeatNow's form's smallest size bucket is **1700-1999 sqft**, so the
smallest honest recurring quote the engine can text a form-filler is ~$200/biweekly. So:

- **Recurring ad shows "From $200/biweekly"**, the true floor for what the form actually
  serves. (The lower numbers NeatNow can do for tiny homes are not on the form, so they do
  not go on the ad.)
- **Move-out ad shows NO price.** Move-out demand spans home sizes the current form
  mis-serves, so any single number would mislead someone. Instead it competes on
  **thoroughness**: "inspection-ready", the full landlord checklist, every spot they
  inspect. The collage of real job photos is the pitch.

> 🔧 **Customize:** Find the smallest size your form actually offers, quote that size's price
> as your "From" anchor, and only on offers where one honest number fits. If an offer's
> audience spans sizes your form handles badly, show no price and sell on thoroughness instead.

**Match the trust line to the offer.** A trust line should be true for that specific job, or
it reads as recycled.

- Move-out trust line: **"$2M insured, background-checked."** Concrete and relevant to letting
  a crew into an empty home you are handing back to a landlord.
- Do **not** put **"same cleaner every visit"** on a move-out ad. That is a recurring benefit;
  it means nothing for a one-time job.

**Keep to about 3 or fewer live creatives at once.** On a small budget, every extra variant
means each one gets less data, so you learn slower. Add a new creative when you retire a weak one.

**Use Meta's recommended image spec.** As of Meta's current Ads Guide, a Facebook Feed image
ad is **4:5 ratio at 1440 × 1800 pixels** (JPG or PNG, max 30MB; minimum 600px wide and 750px
tall; 3% aspect-ratio tolerance). Note that 1440×1800 is what Meta now lists as the recommended
resolution, so export to that; the older 1080×1350 you will see in dated guides is below the
current spec. Keep key text and your logo away from the very top and bottom so app UI never
covers them. (The "~200px from the top / ~180px from the bottom" figure is a Stories-style rule
of thumb, not a documented Meta feed safe-zone; Meta's Feed spec lists no safe zone.) See Meta's
[ad image specs](https://www.facebook.com/business/ads-guide/update/image) (verified July 2026;
no publication date shown on the page).

### What worked for NeatNow (one account, small spend, test your own)

These are NeatNow's own observations from a small budget. They are not guarantees and not
industry claims, just what happened in one account. Run your own versions and let the results
decide.

**Owner / founder photos worked.** Ads built around the owner's own photos produced
good-quality leads. A real person who runs the business reads as authentic, which is what a
stranger deciding whether to let a cleaner into their home is weighing. So do not assume you
should keep your face off your ads. What matters is authentic, relevant imagery, and a genuine
owner photo is one way to get it.

**The recurring creative was an AI cleaner composited into a real kitchen, and it produced
good leads.** A bright, simple image of a cleaner in a branded shirt in a real kitchen shows
the service in one glance. Ours used an **AI-generated** cleaner over a real kitchen
background, with a price band along the bottom. What mattered was believability: a composite
that looks like a real photo builds trust, while an obviously-fake or uncanny image does the
opposite, so if you use AI imagery the bar is "does this look like a real photo a real business
would post." **We did not test a photo of an actual cleaner**, so treat that as an untested
alternative worth trying. When in doubt, shoot the real thing.

**Real before/after and on-the-job photos are worth shooting.** NeatNow's move-out collage
uses real job detail shots (tubs, oven, floors, fixtures). The simplest way to capture usable
before/after pairs is to shoot the SAME spot at the SAME angle before and after the clean, so
the only thing that changes between the two frames is the result.

> 🔧 **Customize:** Do not adopt any of these as a rule. Run your own face, a real staff photo,
> and a believable real-kitchen shot as separate creatives, then judge them on **lead
> quality**, not just cost-per-lead. Cheap leads that never book are worse than fewer leads
> that close.

---

## 7. What NeatNow's two creatives looked like

These are the two creatives NeatNow is **currently running**, not early drafts. Each is a later
version: we went through a couple of rounds on the image, the copy, and the headline before
landing on these, and we will keep changing them over time. They are shared as reference, not as
a template to copy. You will build your own versions with your own brand and photos.

**Recurring** — an AI-generated cleaner composited into a real kitchen, branded shirt, with a
navy price band reading "From $200/biweekly."

![NeatNow recurring ad: an AI cleaner in a real kitchen with a "From $200/biweekly" price band](assets/examples/example-recurring-ad.jpg)

**Move-out** — a 2x2 grid of real job photos (tub and tile, inside the oven, floors, sinks and
fixtures), a center line "We clean every spot they inspect," and a trust line "$2M insured.
Background-checked cleaners." No price.

![NeatNow move-out ad: a 2x2 grid of real job photos with a "$2M insured, background-checked" trust line and no price](assets/examples/example-move-out-ad.jpg)

> ℹ️ **The creative is not an afterthought here, it just isn't what this guide teaches.** Most
> of this playbook is the plumbing: the form, the pricing logic, the worker, the campaign
> structure. The ad creative, the image, the primary text, the headline, and the offer, is doing
> just as much of the work of turning a scroll into a lead, and it deserves real attention. What
> we deliberately leave out is the ongoing craft of *optimizing* it: testing headlines, rotating
> images, and chasing down cost-per-lead over time. That is a marketing discipline in its own
> right, and we are an automation shop, not a marketing agency, so we are not going to pretend to
> teach it. We show you the creatives we landed on and the reasoning; refining your own is your
> call, and worth taking seriously.

Treat these as a starting point. Shoot your own brand, your own photos, your own numbers. This
is just what worked for one Calgary cleaning business.

---

## 8. Building the ad itself (the Ad level)

Sections 1-4 set up the Campaign and Ad set. The last level in the left rail, **Ad**, is where
you attach the lead form and load the creative you just designed. This is the step older guides
tend to skip, so here is the full click-path.

**Identity, who the ad comes from.**

- **Facebook Page** (Required): select your business Page. The first time you run a lead ad
  from a Page, Meta makes you accept its **Lead Ads Terms** for that Page, a one-time click
  (**View Terms** → accept). If you do not, the ad cannot deliver.
- **Instagram profile:** pick your Instagram account, or choose **Use Facebook Page** to run it
  under the Page's name if you have no IG.
- **Threads profile:** optional; **Use Instagram account** is a fine default.

**Ad setup, the format.**

- Leave the setup dropdown on **Create ad** (rather than **Use existing post**).
- **Format:** **Single image or video** for a single creative like NeatNow's, or **Carousel**
  for a multi-card ad. NeatNow ran single-image ads.

**Destination, this is where the lead form attaches.**

- Under **Destination**, choose **Instant form** (not **Website**, a Website destination sends
  people off Facebook and skips the whole prefilled-form advantage).
- Then attach your form: use **Search your forms** and pick the one you built in
  [02 — Lead form](02-lead-form.md) from the **Active** list, **or** click **Create instant
  form** to build it right here (the fields, questions, and privacy link are all covered in
  [02](02-lead-form.md), the builder is the same one).
- **Quality filters** (optional): you can **Require SMS verification** to make leads confirm
  their phone with a one-time code. It cuts spam but adds friction, NeatNow left it off to keep
  the form fast, and relied on the auto-quote text to weed out bad numbers.

**Ad creative, load your image and copy.**

- **Media** (Required): click **Edit** (or the add-media control) and upload the creative you
  designed in section 6. Meta shows previews grouped by where the ad appears (**Feeds**;
  **Stories, Reels**; **Right column**). One image can serve all of them, or you can tailor a
  crop per group, for a first test, one clean 4:5 image everywhere is plenty.
- **Primary text:** your main caption (the block above the image). Meta's Ads Guide recommends
  **50-150 characters**; the feed shows only the first couple of lines before a "See more"
  link, so lead with the hook.
- **Headline:** the short bold line under the image. Meta recommends about **27 characters**
  (NeatNow's read like "Get An Honest Home Cleaning").
- **Description:** optional supporting line; fine to leave blank.
- **Call to action:** choose **Get quote** from the dropdown. It matches a quote-by-text funnel
  better than **Learn more** or **Sign up**. (The API value is `GET_QUOTE`.)

**Then stop.** Do not click **Publish** yet. Review all three levels once more (the
[go-live checklist](06-go-live-and-monitor.md) walks the end-to-end test). Your work is safe as
an **In draft** campaign that does not spend. When you are ready, **Publish** pushes it live;
**Discard drafts** (from the campaigns list) throws the whole draft away if you change your mind.

> 🔧 **Customize:** Everything here, your Page, your form, your image, your caption, your
> headline. The one setting worth not second-guessing is **Get quote** as the CTA if your engine
> texts a price back, it sets the right expectation for what happens after the tap.

---

## Next

With the campaign, ad sets, targeting, and creative built (and paused), go to
[06 — Go live and monitor](06-go-live-and-monitor.md) to test the whole chain end-to-end,
activate, and judge whether it's working.

- Building this via API instead? → [Appendix B — Meta API path](appendix-B-meta-api-path.md)
- Ad not delivering / "Certification Required"? → [Appendix C — Troubleshooting](appendix-C-troubleshooting.md)
- Back to the [README](README.md)
