
Three-prompt sequence for diagnosing and optimizing a client's Facebook ad targeting. Use when: - A client's audience size feels too small (below ~750K) - Lead quality complaints are rising (kill-switch rate up, setter complaints about bad numbers) - Form conversion rate has dropped without a creative change - New client onboarding — set targeting correctly from day one
The workflow pairs three prompts that each solve one piece of the targeting problem. Run them in sequence, feed each output into the next. Concept context: Zip Code Exclusion Targeting.
| Step | Input | Prompt | Output |
|---|---|---|---|
| 1 | Client wiki page + current FB targeting screenshot | (none — diagnostic) | List of mismatches between what client requested at onboarding and what's actually live |
| 2 | Center city + radius (or zip list / city list) | Prompt B — Messy Location → Radius | Optimized radius pin(s) + zip add-ons + exclusion radius |
| 3 | Center city + radius from step 2 | Prompt A — Zip Exclusion Research | 3-tier zip exclusion list with population math |
| 4 | Final radius + zip excludes | Prompt C — Lead Form Qualifier | "Are you a homeowner in [X]?" question with answer options |
| 5 | All of the above | (synthesis) | Paste-ready setup for media buyer (radius + excludes + qualifier + ad copy callout) |
Before running any prompts, audit the gap between what the client asked for and what's actually live:
Common mismatches: - Survey input shipped, but verbal-call expansion never made it to the targeting (dropped onboarding action item) - Radius scoops up zips the client explicitly excluded - Qualifier question doesn't match the geo (e.g., "Are you in the Dayton area?" while targeting Cincinnati metro suburbs) - Exclusion pins are outside the include radius and doing nothing
Use when: you have a center city + radius and need a 3-tier zip exclusion list.
I run Facebook ads for HVAC contractors. I'm launching campaigns in [CITY, STATE] with a [X]-mile radius from the city center.
My model: I get paid per qualified homeowner who shows for an in-person estimate. My incentive is shown appointments, not lead volume. Unqualified leads (renters, people who can't afford $5K-$15K+ projects) cost me real money because I cover ad spend.
What I need: A zip code exclusion list for my Facebook ad targeting, broken into 3 tiers. I will be running a radius target and EXCLUDING these zips — I am NOT building an inclusion list.
---
How to Research This (Data Sources & Method)
Do not freestyle the research. Use these sources in this order — they have zip-level data pre-aggregated so you don't need to cross-reference:
Primary Sources (start here)
1. Census Reporter — censusreporter.org/profiles/86000US[ZIPCODE]-[ZIPCODE]/
- Has: population, median HH income, poverty rate, median home value, per capita income
- ACS 5-year estimates, updated annually
- Limitation: Does NOT show homeownership % or renter % directly on the profile page
2. UnitedStatesZipCodes.org Rankings — unitedstateszipcodes.org/rankings/zips-in-[STATE ABBREV]/poverty_rate/
- Has: Poverty rate rankings for every zip in the state
- Also has tabs for: median household income, homeownership, rent burden
- Use this to quickly identify the worst zips in the metro
3. IncomeByZipCode.com — incomebyzipcode.com/[state]/[zipcode]
- Has: Median HH income, average HH income, per capita, % high income households
- Also compares to neighboring zips automatically — great for spotting clusters
For Homeownership & Renter Data (the hardest metric to find by zip)
4. HealthySouthernNevada.org (or equivalent regional health/community data portal)
- Search: [region] community health indicators homeownership zip code
- These regional portals often pull ACS data into interactive dashboards with zip-level tenure data
- Alternatives: Search for [STATE] community indicators homeownership zip code ACS
5. Zip-Codes.com — zip-codes.com/zip-code/[ZIPCODE]/zip-code-[ZIPCODE].asp
- Has: Homeownership %, renter %, housing characteristics, poverty, income
- One of the few sources with all metrics on a single page per zip
6. ZipAtlas.com — zipatlas.com/us/[state abbrev]/[city]/zip-code-comparison/
- Has: Comparative rankings within a city (renter %, income, home values, etc.)
- Good for quickly ranking all zips in a metro against each other
For Metro Population & Validation
7. MacroTrends or Census Reporter Metro Profile — for total MSA population
8. CBER/UNLV equivalent — state university economic research centers often publish metro population forecasts
Avoid / Low Value
- Census.gov QuickFacts — city-level only, not zip-level
- Statista — paywalled, metro-level only
- Generic real estate sites (Zillow, Redfin) — good for current home values but don't have poverty/income/tenure data
- City-Data.com — has zip data but is cluttered and slow to parse
---
Criteria for Exclusion
A zip should hit 2+ of these to be considered for exclusion:
| Criteria | Threshold |
|---|---|
| Poverty rate | Above 30% |
| Homeownership rate | Below 35% |
| Median household income | Below $35,000 |
| Renter-occupied housing | Above 65% |
| Median home value | Below $100,000 |
Threshold calibration — IMPORTANT: the two dollar thresholds above are baselined to a low-cost metro (Cleveland, OH — they equal ~55% of Cleveland's metro median household income and ~50% of its metro median home value). Before classifying any zip, look up the target metro's (MSA) median household income and median home value, then scale:
- Median household income threshold = ~55% of metro median HH income
- Median home value threshold = ~50% of metro median home value
- Poverty threshold = ~2x the metro poverty rate, bounded between 20% and 30% (the federal poverty line is cost-of-living-blind, so the official rate understates hardship in expensive metros)
- The percentage-based tenure criteria (homeownership <35%, renter >65%) stay fixed — they self-scale.
State the computed thresholds you used at the top of your output. Rationale: the project price is fixed (~$5K-$15K regardless of metro), but higher housing costs mean less disposable income and worse debt-to-income ratios at the same nominal income — so in high-cost metros, unqualified households sit at HIGHER nominal incomes, not the same ones.
---
Output Format — 3 Tiers
Each tier needs copy-paste-ready zip codes formatted for Facebook Ads Manager:
Tier 1 — Hard Exclude (Exclude Day 1)
Zips that fail on 3+ criteria. Guaranteed waste.
12345, 12345, 12345, 12345, 12345
Include per zip: area/neighborhood name, population, which criteria it fails, and why it's waste. Include total: estimated population removed.
Tier 2 — Soft Exclude (Add Next)
Zips that fail on 2 criteria but have mixed signals (gentrifying areas, some homeowner pockets). Start excluded, test later if needed.
12345, 12345, 12345, 12345
Include: estimated additional population removed and cumulative total.
Tier 3 — If You Have the Luxury
Borderline zips — working class, not great but not guaranteed waste. Only exclude if Tier 1 + Tier 2 audience is still over 1M people.
12345, 12345
Include: estimated additional population removed and final cumulative total.
---
Summary Section (at the bottom)
| Item | Value |
|---|---|
| Total metro population | [X] |
| Pop removed — Tier 1 | [X] |
| Pop removed — Tier 1+2 cumulative | [X] |
| Pop removed — All tiers cumulative | [X] |
| Remaining audience | [X] (confirm above 500K, ideally 1M+) |
Top 5 "Money Zips" — the suburban areas with highest homeownership + income that will be included by default in the radius. Include zip, area name, median HH income, and a one-line reason.
---
Constraints
- Use ACS 5-year estimates (most current available)
- Don't exclude so aggressively that audience drops below 500K
- Cite your data sources with specific table/dataset references
- If you're estimating any metric (not pulling it directly), flag it clearly — mark estimated values with an asterisk and explain what you derived it from
- Note any metro-specific quirks (e.g., Strip hotels inflating housing counts, military base zips, university zips with transient populations)
---
Geographic Constraints (if applicable)
- [STATE ONLY / MULTI-STATE] — e.g., "Nevada only" means exclude any zips outside state lines even if within the radius
- Note any small-population rural zips caught by the radius that aren't worth excluding (too few people to matter)
---
EXAMPLE OUTPUT (Cleveland, OH — 30mi radius)
Tier 1 — Hard Exclude. Poverty 35%+, median income under $30K, heavily renter-occupied.
44115, 44104, 44103, 44127, 44108, 44114
~85K people removed. Downtown core, Kinsman, Hough, Industrial Valley, Glenville, Downtown commercial.
Tier 2 — Soft Exclude. Poverty 30-35%, low income, some homeowner pockets.
44110, 44112, 44105, 44102
~127K additional removed (~212K cumulative). Collinwood, East Cleveland, Slavic Village, Near West Side.
Tier 3 — If You Have the Luxury. Working class, mixed signals. Only exclude if audience stays above 1M.
44109, 44128
~72K additional removed (~284K cumulative). Old Brooklyn, Southeast Cleveland.
Metro population: ~2.1M. Remaining audience after all 3 tiers: ~1.8M+. Money zips (included by default): 44011 (Avon), 44141 (Brecksville), 44139 (Solon), 44140 (Bay Village), 44149 (Strongsville).
Use when: client gave a zip list, city list, or chaotic targeting setup, and you need to convert it to clean radius targeting.
ROLE: You are a Facebook Ads targeting specialist for home service lead generation. You understand that zip code targeting limits audience size and that radius targeting is almost always better for maximizing reach to qualified homeowners.
TASK: Convert the following location input into an optimized radius-based targeting setup for Facebook Ads Manager.
INPUT (paste one of these formats):
- A list of zip codes: [PASTE ZIP CODES]
- A list of city names: [PASTE CITIES]
- A screenshot description of current FB targeting: [DESCRIBE OR PASTE]
INSTRUCTIONS:
1. Map all zip codes or cities to identify the geographic spread.
2. Find the geographic center of the cluster — this is where the radius pin goes. The center should be a recognizable city, not an empty field.
3. Calculate the minimum radius that captures all listed locations.
4. If any locations are outliers (significantly farther from the cluster), separate them into zip code targeting add-ons rather than stretching the radius and pulling in irrelevant area.
5. If the client's territory has a boundary (e.g., franchise territory, county line), recommend an exclusion pin to carve it out.
OUTPUT FORMAT:
Primary radius:
[City, ST] + [X] mile radius
Secondary radius (if needed):
[City, ST] + [X] mile radius
Zip code add-ons (outliers only):
12345, 12345, 12345
Exclusion radius (if needed):
[City, ST] + [X] mile radius (carves out [reason])
Audience note: [Estimated total population covered, and whether this is a clean single-pin setup or requires multiple elements]
City callout for ad copy: [State callout or local/regional callout — based on whether locals identify more with the state or the region]
Lead form question: Are you a homeowner in [Region/Area]?
- Yes
- No
RULES:
- Radius targeting > zip code targeting for audience size. Always convert to radius unless the spread is too irregular.
- Don't stretch a radius more than 5 extra miles just to catch 1-2 outlier zips. Use zip code add-ons instead.
- The pin city should be one a local would recognize, ideally the geographic center of the cluster.
- If two distinct zones exist 40+ miles apart, use two separate radius pins rather than one massive radius.
- For the lead form question, use the simplest geographic label locals would recognize. Prefer regional nicknames (e.g., "Treasure Valley," "Lowcountry," "East Texas") over county lists. If no regional name exists, use county names (max 4). If 5+ counties, find a regional name.
- For ad copy callouts, use state-level only if the city lacks a distinct identity that resists the state label. Most cities = state callout. Cities with strong regional identity (Charleston, St. Louis, etc.) = local callout.
---
EXAMPLE 1 — Zip Code List (Charlotte, NC)
Input: 28017 28021 28020 28027 28042 28054, 28056, 28052 28012 28073 28120 28117 28086 28089 28090 28078 28205, 28206, 28208, 28212, 28213, 28214, 28215, 28216, 28262, 28269 28031 28227 28124 28144, 28145, 28146, 28147
Output:
Primary radius:
Charlotte, NC + 25 mile radius
Secondary radius:
Salisbury, NC + 10 mile radius
Zip code add-ons (western outliers):
28017, 28020, 28021, 28042, 28086, 28089, 28090
Exclusion radius:
Matthews, NC + 10 mile radius (carves out south Charlotte franchise territory)
Audience note: ~1.8M people in primary radius + ~85K in Salisbury secondary. Western zip add-ons cover ~35K additional. Clean setup with 2 pins + exclusion + zip add-ons.
City callout for ad copy: State callout (NC). North Charlotte lacks the deep-rooted identity that creates state-label friction.
Lead form question: Are you a homeowner in the Charlotte or Salisbury area?
- Yes, Charlotte area
- Yes, Salisbury area
- No
---
EXAMPLE 2 — Zip Code List (Boise, ID)
Input: Boise (83706), Boise (83709), Boise (83712), Boise (83713), Boise (83702), Boise (83703), Boise (83704), Boise (83705), Caldwell (83605), Garden City (83714), Huston (83607), Idaho City (83716), Kuna (83634), Meridian (83646), Meridian (83642), Middleton (83644), Nampa (83651), Nampa (83686), Nampa (83687), Star (83669), Sweet (83616)
Output:
Primary radius:
Meridian, ID + 20 mile radius
No secondary radius, zip add-ons, or exclusion needed. Single clean pin covers everything. Meridian sits dead center between Caldwell/Nampa (west) and Boise (east).
Audience note: ~750K people in the Treasure Valley. Facebook labels 83616 as "Sweet" and 83716 as "Idaho City" — both are actually Eagle and SE Boise respectively. The 83716 wilderness extension is irrelevant; population is concentrated in the western portion.
City callout for ad copy: State callout (Idaho). Boise doesn't resist the state label.
Lead form question: Are you a homeowner in the Treasure Valley?
- Yes
- No
---
EXAMPLE 3 — City List (Summerville, SC)
Input: Summerville SC, Ladson SC, North Charleston SC, Moncks Corner, Goose Creek SC
Output:
Primary radius:
Summerville, SC + 20 mile radius
No secondary radius, zip add-ons, or exclusion needed. Clean single pin.
Audience note: ~450K people. All five towns cluster tightly northwest of Charleston.
City callout for ad copy: Local callout (Charleston). Lowcountry residents identify with "Charleston area," not "South Carolina."
Lead form question: Are you a homeowner in the Charleston Tri-County area?
- Yes
- No
Use when: you have the targeting set and need the form qualifier question.
ROLE:
You are an expert marketing copywriter specializing in high-converting lead generation forms for local home service businesses.
TASK:
Create a location-qualifying question for a Facebook lead form. The question must pass two tests:
1. Could a homeowner instantly identify if they're in range without hesitation?
2. Does the question capture everyone in the service area plus a small buffer? (Slightly too broad beats slightly too narrow.)
RULES:
- Always start with "Are you a homeowner in..."
- Never use "Is your property" or "Is your home located in"
- Use the simplest, most recognizable geographic label possible
- Prefer regional nicknames locals actually use (e.g., "Treasure Valley," "Central Jersey," "East Texas") over county lists when the region has a well-known name
- Only list counties when the area lacks a common regional name OR when counties ARE the way locals identify (e.g., Harris County, Salt Lake County)
- If listing counties, keep it to 4 or fewer. If you need 5+, find a regional name instead
- If the service area covers multiple distinct zones (e.g., San Antonio + Lakeway + Lake LBJ), list them as separate locations in one question
- Answers are always: Yes / No (unless multiple distinct zones need to be distinguished, then use: Yes, [Zone A] / Yes, [Zone B] / No)
INSTRUCTIONS:
1. Analyze the provided [Central Location] and [Service Radius or Zip Code List].
2. Determine what geographic area is covered.
3. Ask: "What would a local homeowner call this area?" Use that as the label.
4. If no regional name exists, identify the primary counties (max 4).
5. Generate the question in the format below.
OUTPUT FORMAT:
Question:
Are you a homeowner in [Region Name or County List]?
Answers:
- Yes
- No
EXAMPLES:
Input: Fort Myers, FL / 50 miles
Output:
Are you a homeowner in Lee, Collier, or Charlotte County?
- Yes
- No
Input: Boise, ID / Zip codes covering Ada and Canyon County
Output:
Are you a homeowner in the Treasure Valley?
- Yes
- No
Input: Springboro, OH / 20 mile radius
Output:
Are you a homeowner in the Dayton area?
- Yes
- No
Input: San Antonio, TX 40 mi + Lakeway, TX 10 mi + Lake LBJ, TX 10 mi
Output:
Are you a homeowner in San Antonio, Lakeway, or the Lake LBJ area?
- Yes, San Antonio area
- Yes, Lakeway or Lake LBJ area
- No
Input: Tyler, TX / 40 miles
Output:
Are you a homeowner in East Texas?
- Yes
- No
NOW, GENERATE THE OUTPUT FOR THE FOLLOWING INPUTS:
The 3-tier exclusion model has audience-floor caveats. This is when to stop adding exclusions:
| Audience Size (after exclusions) | Strategy |
|---|---|
| 1M+ | Keep adding exclusions freely — quality wins, algorithm has plenty to work with |
| 750K-1M | Only add exclusions for confirmed problem zips (data + setter feedback) |
| 500K-750K | Stop adding. Focus on creative/offer instead |
| Below 500K | Reverse course — start removing exclusions or expanding radius |
Floor: 750K. Below that, Facebook's algorithm starts struggling to find enough conversion signal, CPL rises, and the marginal "bad zip" you exclude costs more in optimization quality than it saves in wasted impressions.
When the media buyer plans to run audience-pack tests (detailed/intent-targeted ad set vs. broad ad set in parallel), the floor only applies to the broad pack — broad always gets the full base audience, the detailed pack is intentionally smaller. (Reference: Claude memory feedback_audience_packs_not_splits; promotable to a wiki concept page if it gets cited by other SOPs.)
When the media buyer plans 50/50 split tests (same creative split across two audience halves), double the floor: the base needs to be ~1.5M so each half is above 750K. Most LLM media-buying tests are pack-based, not split-based.
After running prompts A, B, and C, package the results into a single Discord-ready message for the media buyer:
PRIMARY RADIUS:
[City, ST] + [X]mi
SECONDARY RADIUS (if applicable):
[City, ST] + [Y]mi
ZIP CODE ADD-ONS (outliers, if any):
[zip, zip, zip]
ZIP CODE EXCLUSIONS (Tier 1 + Tier 2 + others applied):
[zip, zip, zip, zip, zip]
EXCLUSION RADIUS (if applicable):
[City, ST] + [Z]mi (reason: [why])
LEAD FORM QUALIFIER:
Are you a homeowner in [Region]?
- Yes
- No
AD COPY CALLOUT:
[State-level or local/regional callout, with reasoning]
ESTIMATED AUDIENCE (30+):
[X]M-[Y]M
See Paradise Targeting Audit — 2026-05-02 for a fully worked example: 22mi-from-Springboro single-pin setup at 527K audience → 30mi-from-Springboro single-pin + 19 zip excludes + Southwest Ohio qualifier at ~952K audience. The diagnostic also surfaced two dropped onboarding action items (4-county verbal expansion never made it to targeting; $8,997 + Local Leap tag never formalized).