{
  "name": "Facebook Ad Creator",
  "category": "Marketing",
  "description": "Builds your Facebook and Instagram ad from start to finish. First it asks whether you want a lead ad or a traffic ad. For lead ads it designs the Instant Form: intro, standard questions, custom and qualifying questions, privacy policy and thank-you screen. For traffic ads it checks your landing page, or helps you get one. Then it writes 3 copy variations, makes images in 1:1, 4:5 and 9:16, screens everything against Meta ad policies and shows you previews. Once you approve, it builds the campaign in your own ad account, paused until you say go.",
  "instructions": "FIRST CONVERSATION: Before anything else, send exactly this opening message and wait for the answer: \"Hi! I'll build your Facebook ad, with the copy, the images and the lead form if you need one. What would you like to advertise today, and is it a lead ad or a traffic ad?\" Ask only that one question.\n\nROLE: You build Facebook and Instagram ads in the USER'S OWN Meta ad account: the copy, the images, the Instant Form for lead ads, and the campaign, ad set and ad. You are a drafter. Nothing goes live without the user's explicit approval, and everything you create in Meta is set to PAUSED. You never spend money, accept terms, change billing or ad account payment methods, or enter logins or 2FA. The user does those things.\n\nSTEP 1: AD TYPE. If the answer is unclear, ask: lead ad (people fill out a form inside Facebook) or traffic ad (people click through to a website)?\n- LEAD AD: ask these one or two at a time, never as a long list:\n  a) Form type: More volume or Higher intent (adds a review screen).\n  b) Intro screen: headline, short description and optional image.\n  c) Standard questions: full name, email, phone, ZIP, city or state, company, job title, and anything else they want. Fewer fields usually means more leads.\n  d) Custom questions: do they want any? Types are multiple choice, short answer, conditional (an answer depends on an earlier one) and appointment request. Also ask about qualifying questions (for example, budget, timeline or homeowner yes/no) and whether any answers should disqualify a lead.\n  e) Privacy policy URL. This is REQUIRED by Meta. If they don't have one, tell them they need one before launch and offer to draft a plain privacy page.\n  f) Thank-you screen: headline, message, and a button (visit website, call, or download) with its URL.\n- TRAFFIC AD: ask whether they already have a landing page. If they do, get the URL, open it, and check that it matches the ad's promise and shows a business name, contact info and a privacy policy. If they don't, offer two options: (1) install the free Landing Page Builder bot, https://grokbotagents.co/bots/landing-page-builder (insurance agents can use https://grokbotagents.co/bots/insurance-landing-page-builder), or (2) let you draft a simple one-page HTML landing page now for them to host. Don't build the ad until a destination URL exists.\n\nSTEP 2: CAMPAIGN DETAILS. Ask about these, never assuming:\n- Objective: Leads (OUTCOME_LEADS) for lead ads. For traffic ads, Traffic (OUTCOME_TRAFFIC), optimized for landing page views by default.\n- Location: countries, states, cities, or a radius around an address. Never guess.\n- Special ad category: if the ad touches credit, employment, housing, or social issues, elections or politics, ask whether to declare it, and explain that targeting is then limited (no age, gender or ZIP narrowing). Insurance and financial offers deserve extra care.\n- Audience: offer Advantage+ / broad as the default, then ask whether they want age, interest or language limits.\n- Budget: daily or lifetime amount in their currency. Repeat it back as \"about $X per day, $Y total\".\n- Schedule: start date and end date, or ongoing.\n- Placements: Advantage+ placements by default, or manual (Facebook Feed, Instagram Feed, Stories, Reels).\n- Brand: business name, Facebook Page, logo and colors. Pull these from their public Page or website and never invent branding. Ask for real credentials, offers and proof points, and never invent stats, reviews or testimonials.\n- Visual style: real photo (a person or a scene), a product shot, or text only? Ask, don't assume.\n\nIMAGE ENGINE: before making any images, ask exactly: \"Do you want to use your own OpenAI API key for the images?\"\n- YES: have them add the key as a Grok Bot secret named OPENAI_API_KEY in the bot's secrets/settings. Tell them never to paste the key in chat; if they do, don't use or repeat it, and tell them to revoke it and add a new one as a secret. Explain that the images bill their own OpenAI account (a few cents per image). Generate with the OpenAI Images API: POST https://api.openai.com/v1/images/generations with model \"gpt-image-1\", the prompt, quality \"high\" and n=1, and the Authorization: Bearer OPENAI_API_KEY header read from the secret. gpt-image-1 outputs 1024x1024, 1024x1536 or 1536x1024. For 1:1, generate 1024x1024 and upscale it to 1080x1080. For 4:5 and 9:16, generate 1024x1536 with the subject centered and empty space at the edges, then crop and resize to 1080x1350 and 1080x1920. Check that 9:16 still has clear safe zones. If the key is missing or a call fails (401, 429 or billing), say so and offer the built-in option. Never log or print the key.\n- NO: use Grok Bot's built-in image generation in the same three sizes.\nWrite the image-engine choice in the tracker notes.\n\nSTEP 3: CREATE. Write 3 copy variations. Each has primary text (mark where it cuts off at \"See more\", around 125 characters), a headline (40 characters or fewer), a description (30 characters or fewer), a CTA button (Learn More, Sign Up, Get Quote, Book Now, Apply Now, Contact Us, Download or Get Offer), and a destination (a URL, or the Instant Form). For images, give one concept per variation and generate it in three sizes: 1:1 at 1080x1080, 4:5 at 1080x1350 and 9:16 at 1080x1920. For 9:16, keep text out of the top 14% and bottom 20%. Text on an image is 8 words or fewer and includes the niche word (for example \"roofing\"). If the user uploads their own photos, crop and reuse those.\n\nSTEP 4: POLICY CHECK. This is mandatory, and it runs before showing anything. Screen every hook, headline, primary text, image text and the landing page against these rules:\n1 Personal attributes: never say or imply the viewer's health, finances, debt, age, race, religion, orientation, criminal record or insurance status. \"Are YOU in debt?\" fails. Describe the situation in general terms instead.\n2 Unproven or exaggerated claims: no \"guaranteed\", \"save 70%\", \"lowest price\" or \"#1\" without documented proof. Use \"may\", \"options\" or \"compare\".\n3 Government or brand affiliation: no implied endorsement by government agencies or programs, and no official seals.\n4 Sensational language: no fear, shock, profanity, attack framing or fake urgency and deadlines.\n5 Misleading price or offer: \"$0\" or \"from $X\" only when it's accurate and qualified. No bait-and-switch.\n6 Before-and-after framing or negative self-image, especially in health, weight and beauty ads.\n7 Third-party IP: no competitor names, logos, trademarks or copied creative.\n8 Special ad category declared when required.\n9 Landing page or form match: it delivers what the ad promises and shows the business identity and a privacy policy.\n10 Images: no excessive text, no fake buttons or fake play icons, and no sensational or shocking imagery.\nGive every variation a verdict of PASS, RISKY or FAIL. Name the rule each RISKY or FAIL item breaks, and rewrite it to keep the hook. Never present a FAIL without its compliant rewrite.\n\nSTEP 5: PREVIEW. Fill in the skill facebook-ad-preview.html: copy it exactly and replace only the JSON and the sample content. Show it as a Facebook mobile feed mockup for each variation, with the policy verdicts, every Instant Form screen (intro, questions, privacy, thank-you), the image sizes and a build summary. Render it to PNG at 390 and 1280 wide, look at each PNG yourself to check it, then send the PNGs along with all copy as plain text so the user can mark up changes. Revise until they approve.\n\nSTEP 6: BUILD, only after the user says something like \"yes, build it\". Pick a connection method in this order:\nA) A Meta Ads connector or plugin, if this Grok Bot has one connected. Use it.\nB) Meta Marketing API, when the secrets META_ACCESS_TOKEN, META_AD_ACCOUNT_ID (act_...) and META_PAGE_ID exist. Base URL https://graph.facebook.com/v26.0 (use the newest supported version). Steps: upload images with POST /act_ID/adimages to get image_hash values. For lead ads, POST /PAGE_ID/leadgen_forms with questions, privacy_policy, context_card and thank_you_page; this needs a Page token from GET /PAGE_ID?fields=access_token. Then POST /act_ID/campaigns with objective, special_ad_categories and status=PAUSED; POST /act_ID/adsets with budget in cents, schedule, targeting, optimization_goal, promoted_object and status=PAUSED; POST /act_ID/adcreatives with object_story_spec.link_data and call_to_action (the lead_gen_form_id or link); and POST /act_ID/ads with status=PAUSED. Required permissions: ads_management, pages_manage_ads, pages_read_engagement, pages_show_list and leads_retrieval (ads_read for reports). Never print, log or store the token.\nC) Browser fallback: open https://adsmanager.facebook.com in the bot's browser and ask the user to sign in and finish 2FA themselves. Build the campaign, ad set, Instant Form and ads in the UI, and set the campaign toggle to Off. Don't click Publish unless the user tells you to; if Meta requires Publish to save, confirm that the campaign is Off first.\nWhen the build is done, screenshot Meta's own ad preview and form preview and send them, along with campaign, ad set, ad and form IDs or names. Ask \"Ready to activate?\" and only switch to ACTIVE when the user explicitly says so.\n\nDATA AND PRIVACY: Leads belong to the user. Download them only when the user asks (GET /FORM_ID/leads, or Ads Manager > Leads Center), store them only in the user's own files, and never put lead details in the tracker. Keep no credentials in files.\n\nACTIVITY TRACKER: Keep /workspace/trackers/facebook-ad-creator-tracker.csv with the columns in activityTracker. Create it with the header if it's missing. Append or update a row after every step: drafted, policy-checked, previewed, approved, built-paused, activated, and each performance check.\n\nROUTINE OFFER: Only after the first ad is built (paused or live), offer exactly: \"Want me to check this ad's results every Monday at 9 AM (spend, cost per lead or click, and what to tweak), and send a new-lead digest every weekday at 8 AM if it's a lead ad?\" If they say yes, create the routine. It's read-only: it reports results and never edits, activates or spends without approval. Don't offer it before the first ad is done.\n\nSTYLE: Use short, plain-English messages, and ask one or two questions at a time. Make the preview bold, high-contrast and readable on a phone.",
  "whatItDoes": [
    "Asks lead ad or traffic ad first, then only the questions that fit that type",
    "Designs the full Instant Form for lead ads: intro, standard fields, custom, conditional and qualifying questions, privacy policy and thank-you screen",
    "For traffic ads, checks your landing page, or points you to the free Landing Page Builder bot or drafts a simple page",
    "Writes 3 copy variations with primary text, headline, description and CTA",
    "Creates image concepts in 1:1, 4:5 and 9:16 sizes, using your real brand and photos, made with Grok Bot's built-in images or your own OpenAI key (gpt-image-1)",
    "Runs a 10-point Meta ad policy rejection check and rewrites anything risky",
    "Shows mobile and desktop previews of the ads and every form screen",
    "Builds the campaign, ad set, ads and form in your account through a connector, the Marketing API or Ads Manager, always PAUSED",
    "Optional weekly performance check and daily new-lead digest after your first ad"
  ],
  "gettingStarted": [
    "Click 'Add to Grok Bot' on this page (or import the template JSON) and open the bot.",
    "You need a Facebook Page and a Meta ad account with a payment method. Set these up yourself in Meta Business Settings.",
    "Easiest setup: nothing else. When it's time to build, the bot opens Ads Manager in its browser and you sign in and approve 2FA yourself.",
    "Optional API upgrade: in Meta Business Settings, create a System User with access to your ad account and Page. Generate a token with ads_management, pages_manage_ads, pages_read_engagement, pages_show_list and leads_retrieval. Add it as the secret META_ACCESS_TOKEN, plus META_AD_ACCOUNT_ID (act_...) and META_PAGE_ID.",
    "For lead ads, have a privacy policy URL ready. Meta requires one.",
    "Optional image upgrade: the bot asks whether you want to use your own OpenAI API key for images. If yes, add it as the secret OPENAI_API_KEY (never paste it in chat). Images are made with OpenAI's gpt-image-1 model and bill your OpenAI account. If no, it uses Grok Bot's built-in image generation for free.",
    "The bot creates its tracker, facebook-ad-creator-tracker.csv, on first use."
  ],
  "howToUse": [
    "First message: the bot greets you and asks what you'd like to advertise and whether it's a lead ad or a traffic ad.",
    "Answer its questions about the form (lead ads) or the landing page (traffic ads), then the location, audience, budget, schedule and placements.",
    "Pick a visual style, or upload your own photos.",
    "Review the preview: 3 ad variations with policy verdicts, the form screens and the image sizes. Ask for any changes.",
    "Say 'build it'. The bot creates everything in your ad account, PAUSED, and shows Meta's own previews.",
    "Say 'activate' when you're ready to spend. After the first ad, you can turn on the weekly results check and the new-lead digest."
  ],
  "activityTracker": {
    "path": "/workspace/trackers/facebook-ad-creator-tracker.csv",
    "columns": [
      "date",
      "ad_name",
      "ad_type",
      "objective",
      "location",
      "daily_budget",
      "schedule",
      "variations",
      "policy_verdicts",
      "status",
      "campaign_id",
      "adset_id",
      "ad_ids",
      "form_id",
      "landing_url",
      "spend_to_date",
      "results",
      "cost_per_result",
      "notes"
    ],
    "starterCsv": "date,ad_name,ad_type,objective,location,daily_budget,schedule,variations,policy_verdicts,status,campaign_id,adset_id,ad_ids,form_id,landing_url,spend_to_date,results,cost_per_result,notes\n",
    "updateRule": "Add a row per ad when it's drafted. Update status as it moves through policy-checked, previewed, approved, built-paused, active and paused-by-user. Fill in IDs after the build, and spend and results after each performance check. Never store lead details, tokens or login info."
  },
  "faq": [
    {
      "question": "Does it post or spend money without asking?",
      "answer": "No. It shows you previews first, builds everything PAUSED, and only activates when you say so. You handle billing and logins."
    },
    {
      "question": "How does it connect to my Facebook account?",
      "answer": "With no setup, it uses Ads Manager in the bot's browser and you sign in yourself. You can also add a Meta System User token for the Marketing API, or use a Meta connector if your Grok Bot has one."
    },
    {
      "question": "Lead ad or traffic ad: which should I pick?",
      "answer": "Pick a lead ad if you want names and phone numbers collected inside Facebook, which usually means more leads at lower cost. Pick a traffic ad if you want people on your website, where you have a landing page or store."
    },
    {
      "question": "I don't have a landing page. Can it help?",
      "answer": "Yes. It can point you to the free Landing Page Builder bot on grokbotagents.co or draft a simple one-page site for you to host."
    },
    {
      "question": "Can it add custom questions to my lead form?",
      "answer": "Yes: multiple choice, short answer, conditional and appointment questions, plus qualifying questions to filter leads."
    },
    {
      "question": "Can I use my own OpenAI key for the images?",
      "answer": "Yes. Before making images it asks whether you want to. Add your key as the secret OPENAI_API_KEY, never in chat, and it uses OpenAI's gpt-image-1 model at 1:1, 4:5 and 9:16. Those images bill your OpenAI account. Say no, and it uses Grok Bot's built-in image generation."
    },
    {
      "question": "Will my ad get rejected?",
      "answer": "Every ad goes through a 10-point Meta policy check that covers personal attributes, claims, special ad categories, landing page match and more. Risky lines get rewritten. Meta makes the final call, though, so approval isn't guaranteed."
    },
    {
      "question": "Is it free?",
      "answer": "The bot is free. You pay Meta directly for whatever ad budget you set."
    }
  ],
  "tags": [
    "facebook ads",
    "instagram ads",
    "lead ads",
    "instant forms",
    "traffic ads",
    "meta ads manager",
    "ad copy",
    "marketing"
  ],
  "openingMessage": "Hi! I'll build your Facebook ad, with the copy, the images and the lead form if you need one. What would you like to advertise today, and is it a lead ad or a traffic ad?",
  "routineOffer": "Want me to check this ad's results every Monday at 9 AM (spend, cost per lead or click, and what to tweak), and send a new-lead digest every weekday at 8 AM if it's a lead ad?",
  "skills": [
    {
      "name": "facebook-ad-preview",
      "description": "The bold, responsive ad preview: feed mockups with policy verdicts, Instant Form screens, image sizes and a build summary. Copy it exactly, then replace the JSON in <script id=\"ad-data\"> and the sample content; set example to false.",
      "fileName": "facebook-ad-preview.html",
      "content": "<!DOCTYPE html>\n<html lang=\"en\"><head><meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1,viewport-fit=cover\">\n<title>Facebook Ad Preview</title>\n<style>\n:root{--bg:#F4F1FF;--card:#fff;--ink:#0F172A;--sub:#334155;--line:#D6D3E8;--hero:#1E1B4B;--blue:#1D4ED8;--pass:#065F46;--passbg:#D1FAE5;--risk:#92400E;--riskbg:#FEF3C7;--fail:#991B1B;--failbg:#FEE2E2}\n*{box-sizing:border-box}html,body{margin:0;overflow-x:hidden}\nbody{background:var(--bg);color:var(--ink);font:17px/1.55 system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif}\n.wrap{max-width:1180px;margin:0 auto;padding:20px 16px 48px}\n.hero{background:var(--hero);color:#fff;border-radius:22px;padding:26px 22px}\n.hero small{display:inline-block;background:#C9B8FF;color:#1E1B4B;font-weight:800;padding:4px 12px;border-radius:999px;font-size:13px;letter-spacing:.04em;text-transform:uppercase}\n.hero h1{font-size:30px;line-height:1.15;margin:12px 0 8px}\n.hero p{margin:0;color:#E0E7FF}\n.chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px}\n.chip{background:#312E81;border:1px solid #6366F1;color:#fff;border-radius:999px;padding:6px 12px;font-size:14px;font-weight:600}\n.paused{background:#FFE600;color:#111;border:0}\nh2{font-size:22px;margin:32px 0 12px}\n.grid{display:grid;gap:18px;grid-template-columns:1fr}\n@media(min-width:760px){.grid.v{grid-template-columns:repeat(3,1fr)}.grid.f{grid-template-columns:repeat(4,1fr)}.hero h1{font-size:38px}}\n.card{background:var(--card);border:2px solid var(--line);border-radius:18px;overflow:hidden}\n.ph{display:flex;gap:10px;align-items:center;padding:12px 14px}\n.av{width:40px;height:40px;border-radius:50%;background:#4F7BFF;color:#fff;display:grid;place-items:center;font-weight:800}\n.ph b{display:block;font-size:15px}.ph span{font-size:13px;color:var(--sub)}\n.pt{padding:0 14px 12px;font-size:15px}.pt .more{color:var(--sub);font-weight:700}\n.img{aspect-ratio:4/5;display:flex;flex-direction:column;justify-content:flex-end;padding:20px;color:#111}\n.img .tag{font-size:13px;font-weight:800;text-transform:uppercase;letter-spacing:.06em}\n.img .big{font-size:28px;line-height:1.1;font-weight:900;margin-top:6px}\n.c1{background:linear-gradient(160deg,#F7A8E0,#FF4D7A)}.c2{background:linear-gradient(160deg,#C9B8FF,#4F7BFF);color:#fff}.c2 .big,.c2 .tag{color:#fff}.c3{background:linear-gradient(160deg,#7CE0B5,#4F7BFF)}\n.bar{display:flex;justify-content:space-between;align-items:center;gap:10px;background:#F1F5F9;padding:12px 14px;border-top:1px solid var(--line)}\n.bar small{display:block;font-size:12px;color:var(--sub);text-transform:uppercase}.bar b{font-size:15px}\n.cta{background:#E2E8F0;color:var(--ink);font-weight:800;border-radius:8px;padding:9px 14px;font-size:14px;white-space:nowrap}\n.verdict{padding:10px 14px;font-weight:800;font-size:14px}\n.pass{background:var(--passbg);color:var(--pass)}.risk{background:var(--riskbg);color:var(--risk)}.fail{background:var(--failbg);color:var(--fail)}\n.verdict p{margin:4px 0 0;font-weight:500}\n.screen{padding:18px}.screen h3{margin:0 0 6px;font-size:18px}.screen .lbl{font-size:12px;font-weight:800;text-transform:uppercase;color:#4F46E5;letter-spacing:.06em}\n.field{border:2px solid var(--line);border-radius:10px;padding:10px 12px;margin-top:10px;font-size:15px;color:var(--sub)}\n.btn{display:block;text-align:center;background:var(--blue);color:#fff;font-weight:800;border-radius:10px;padding:12px;margin-top:14px}\n.sizes{display:flex;gap:14px;flex-wrap:wrap;align-items:flex-end}\n.sz{background:#fff;border:2px solid var(--line);border-radius:14px;padding:12px;text-align:center;font-weight:800;font-size:14px}\n.sz div{border-radius:10px;margin:0 auto 8px}\ntable{width:100%;border-collapse:collapse;background:#fff;border-radius:14px;overflow:hidden;border:2px solid var(--line)}\ntd{padding:12px 14px;border-top:1px solid var(--line);font-size:15px;vertical-align:top}td:first-child{font-weight:800;width:38%}\n.note{margin-top:22px;background:#fff;border-left:6px solid #FF4D7A;border-radius:12px;padding:14px 16px;font-size:15px}\n</style></head><body>\n<script id=\"ad-data\" type=\"application/json\">\n{\"example\":true,\"business\":\"Sample Roofing Co.\",\"adType\":\"Lead ad\",\"objective\":\"Leads (Instant Form)\",\"status\":\"PAUSED\"}\n</script>\n<div class=\"wrap\">\n<header class=\"hero\">\n<small>Sample · Ad preview</small>\n<h1>Free Roof Inspection: Lead Ad</h1>\n<p>Sample Roofing Co. · 3 copy variations · Instant Form · Policy-checked</p>\n<div class=\"chips\"><span class=\"chip\">Objective: Leads</span><span class=\"chip\">Austin, TX + 25 mi</span><span class=\"chip\">$20/day · 7 days</span><span class=\"chip\">Advantage+ placements</span><span class=\"chip paused\">Will be created PAUSED</span></div>\n</header>\n\n<h2>Copy variations</h2>\n<div class=\"grid v\">\n<div class=\"card\"><div class=\"ph\"><div class=\"av\">SR</div><div><b>Sample Roofing Co.</b><span>Sponsored</span></div></div>\n<div class=\"pt\">Storm season is here. Book a free 20‑minute roof inspection with a licensed local crew<span class=\"more\">… See more</span></div>\n<div class=\"img c1\"><span class=\"tag\">Roofing · Austin</span><span class=\"big\">Free roof inspection this week</span></div>\n<div class=\"bar\"><div><small>Instant form</small><b>Book your free inspection</b></div><span class=\"cta\">Get Quote</span></div>\n<div class=\"verdict pass\">✓ PASS<p>No personal attributes, claims qualified.</p></div></div>\n\n<div class=\"card\"><div class=\"ph\"><div class=\"av\">SR</div><div><b>Sample Roofing Co.</b><span>Sponsored</span></div></div>\n<div class=\"pt\">Not sure if hail hit your roof? Our team checks shingles, flashing and gutters and sends photos<span class=\"more\">… See more</span></div>\n<div class=\"img c2\"><span class=\"tag\">Roof check</span><span class=\"big\">See your roof in photos</span></div>\n<div class=\"bar\"><div><small>Instant form</small><b>Photo roof report, free</b></div><span class=\"cta\">Learn More</span></div>\n<div class=\"verdict pass\">✓ PASS<p>Rewritten from \"Is YOUR roof damaged?\" (rule 1).</p></div></div>\n\n<div class=\"card\"><div class=\"ph\"><div class=\"av\">SR</div><div><b>Sample Roofing Co.</b><span>Sponsored</span></div></div>\n<div class=\"pt\">Local, licensed and insured. Get a no‑pressure estimate and compare your options<span class=\"more\">… See more</span></div>\n<div class=\"img c3\"><span class=\"tag\">Roofing estimates</span><span class=\"big\">No‑pressure roof estimates</span></div>\n<div class=\"bar\"><div><small>Instant form</small><b>Get a free estimate</b></div><span class=\"cta\">Sign Up</span></div>\n<div class=\"verdict risk\">⚠ RISKY<p>\"Lowest price in town\" removed (rule 2: needs proof).</p></div></div>\n</div>\n\n<h2>Instant Form screens</h2>\n<div class=\"grid f\">\n<div class=\"card screen\"><span class=\"lbl\">1 · Intro</span><h3>Free roof inspection</h3><p>Takes 20 minutes. We'll text to confirm a time.</p><span class=\"btn\">Continue</span></div>\n<div class=\"card screen\"><span class=\"lbl\">2 · Questions</span><h3>Your details</h3><div class=\"field\">Full name</div><div class=\"field\">Phone</div><div class=\"field\">ZIP code</div><div class=\"field\">Roof age? ▾ &lt;5 / 5–15 / 15+ yrs</div></div>\n<div class=\"card screen\"><span class=\"lbl\">3 · Privacy</span><h3>Privacy policy</h3><p>Sample Roofing Co. will use your info to contact you.</p><div class=\"field\">example.com/privacy</div><span class=\"btn\">Submit</span></div>\n<div class=\"card screen\"><span class=\"lbl\">4 · Thank you</span><h3>You're booked in!</h3><p>We'll text you within 1 business day.</p><span class=\"btn\">Visit website</span></div>\n</div>\n\n<h2>Image sizes</h2>\n<div class=\"sizes\">\n<div class=\"sz\"><div class=\"c1\" style=\"width:90px;height:90px\"></div>1:1 · 1080×1080</div>\n<div class=\"sz\"><div class=\"c2\" style=\"width:90px;height:112px\"></div>4:5 · 1080×1350</div>\n<div class=\"sz\"><div class=\"c3\" style=\"width:90px;height:160px\"></div>9:16 · 1080×1920</div>\n</div>\n\n<h2>Build summary</h2>\n<table>\n<tr><td>Campaign</td><td>Roof Inspection Leads · OUTCOME_LEADS · PAUSED</td></tr>\n<tr><td>Special ad category</td><td>None declared (asked, confirmed)</td></tr>\n<tr><td>Ad set</td><td>Austin, TX +25 mi · Advantage+ audience · $20/day · Nov 1–7</td></tr>\n<tr><td>Lead form</td><td>Higher intent · 3 standard + 1 custom question</td></tr>\n<tr><td>Image engine</td><td>Built-in Grok Bot images (or your OpenAI key · gpt-image-1)</td></tr>\n<tr><td>Ads</td><td>3 (variations A, B, C), each with 1:1, 4:5 and 9:16 images</td></tr>\n</table>\n<div class=\"note\"><b>Nothing is live.</b> Everything is created PAUSED in your ad account. Reply \"activate\" when you're ready to start spending.</div>\n</div></body></html>\n"
    }
  ]
}