---
name: static-ad-factory
description: "From one concept, produce a batch of on-brand static ads via Canva — headline/visual/CTA variations sized to platform placements, with a creative-testing structure in mind."
license: MIT
compatibility: "Works with any Agent-Skills-compatible AI (Claude, ChatGPT, Cursor, Codex, and more). Ad-account actions run through Adspirer."
metadata:
  author: "Adspirer"
  version: "1.0.0"
  adspirer_category: "creative-production"
  adspirer_source: "https://www.adspirer.com/skills/static-ad-factory"
  adspirer_connection_url: "https://adspirer.ai/sign-up"
  adspirer_primary_keyword: "static ad creator"
  adspirer_secondary_keywords: "static ads, ad creative generator"
  adspirer_launch_wave: "1"
  adspirer_kind: "skill"
  adspirer_level: "operator"
  adspirer_platforms: "meta,google"
  adspirer_supported_clients: "claude,claude-code,chatgpt,codex,cursor,gemini,windsurf"
  adspirer_summary: "From one concept, produce a batch of on-brand static ads via Canva — headline/visual/CTA variations sized to platform placements, with a creative-testing structure in mind."
  adspirer_connections_required: "canva,adobe,adspirer"
  adspirer_connections_optional: ""
---

# Static Ad Factory

## Use this when

You have one creative concept (a product, offer, or angle) and need a real testing batch of static ads before launch — not one hero image. Use this when spinning up a new campaign/ad set and you want 4-8 genuinely distinct creative variants (not just recolors) sized correctly per placement, with headline/visual/CTA axes varied on purpose so the eventual winner tells you *why* it won. Not for single-asset touch-ups, video ads, or UGC-style creative (those need a different production path). Best run before you open Ads Manager / Google Ads to build the ad set — the skill hands you a ready-to-upload batch plus a naming convention that survives into reporting.

## What you need

A concept brief (product/offer, target audience, 1 primary value prop, any brand assets — logo, product shots, color/font rules). A Canva account (brand kit connected if you have one — pulls exact hex codes and fonts instead of guessing from a logo file). Know which platforms/placements you're testing (Meta Feed/Story/Reels, Google Display/Demand Gen, or both) — the size list depends on it. Optional: existing top-performing ad screenshots if you want the batch to riff on a proven angle rather than start cold. Optional Adobe access if you need vector logo cleanup, precise brand-color extraction from a PDF brand guide, or background removal beyond what Canva's built-in tool handles.

## Procedure

1. Lock the creative brief before opening any tool: one product/offer, one primary audience, one primary value prop, and the 2-3 secondary value props you're willing to test against it (e.g. price vs. speed vs. social proof). If the user hasn't specified these, ask — don't guess a value prop and burn a batch on the wrong angle.

2. Confirm placements in scope and derive the size list. Default Meta static set: Feed/Right Column 1080×1080 (1:1) and 1080×1350 (4:5, now the de-facto Feed default — crops less on mobile than 1:1), Story/Reels 1080×1920 (9:16). Default Google set: Display 1200×628 (1.91:1), 1200×1200 (1:1), 300×250 and 300×600 (legacy Display banner sizes, still served heavily), and Demand Gen 1200×628 + 1080×1920 if in scope. State these as defaults and ask if the user wants a narrower set — building all of them when only Meta Feed is running wastes the batch.

3. 
**Connect Canva:** this step uses Canva. Add the Canva MCP/connector to your agent — setup: https://www.canva.dev/docs/mcp/, then continue. Skip only if a step says it's optional.
 Open or create the Canva brand kit for this account (logo, hex codes, fonts). If a brand kit doesn't exist and the user supplied a style guide PDF or a hex/font list, set one up now rather than eyeballing colors off a screenshot — off-brand color drift is the #1 reason creative gets rejected in a brand review after the test already ran.

4. If source assets need cleanup Canva can't do well — vector-trace a raster logo, isolate a product on a busy background with clean edges, or extract exact CMYK-to-hex from a print brand guide — use 
**Connect Adobe:** this step uses Adobe. Add the Adobe MCP/connector to your agent — setup: https://developer.adobe.com/adobe-for-creativity/, then continue. Skip only if a step says it's optional.
 for that prep step, then bring the cleaned asset back into Canva. Skip this step entirely if assets are already clean; don't force an Adobe round-trip for a logo that's already a transparent PNG.

5. Design ONE hero layout per aspect ratio (not per variant) — nail composition, safe margins, and legibility at that ratio first, then vary content on top of it. Square/4:5 gets full headline + subhead + CTA button; 9:16 gets oversized text starting below the top 14% and above the bottom 20% (Story/Reels UI overlays eat those zones — text or CTA placed there gets covered by the platform's own reply bar / profile chip); Display 300×250 and 300×600 get logo + single short headline + CTA only, no subhead — there's no room and cramming text into a 250px-tall banner is the single most common reason self-serve display creative gets auto-rejected or just ignored.

6. Build the test matrix on the SAME base layout: vary exactly one axis per variant pair so the eventual winner is attributable — 2 headline angles (benefit-led vs. urgency/offer-led) × 2 visual treatments (product-forward vs. lifestyle/context shot) × 1-2 CTA button copy variants ("Shop Now" vs. "Get 20% Off"). That's 4-8 static variants per aspect ratio, not 8 unrelated designs — resist the urge to make each variant a completely different concept, or you won't learn anything from which one wins.

7. Name every export with a convention that survives upload and shows up in reporting: `{concept}_{ratio}_{headline-axis}_{visual-axis}_{cta-axis}_v1` (e.g. `springsale_1x1_urgency_product_shopnow_v1`). This is what makes the eventual ad-set-level breakdown legible three weeks from now instead of a folder of `Untitled_47.png`.

8. Export all variants at platform-native resolution (PNG for Display/crisp text, JPG acceptable for Meta photo-heavy Feed to keep file size down) and stage them in one clearly labeled folder or Canva project per concept.

9. 
**Connect Adspirer (the ads connection):** when you reach a step that touches a live ad account, connect Adspirer first. In Claude Code, run `/plugin marketplace add anthropics/claude-plugins-community` then `/plugin install adspirer-ads-agent@claude-community`. In claude.ai or ChatGPT, add the Adspirer connector from https://www.adspirer.com/docs/ai-clients. Any other agent: follow https://www.adspirer.com/docs/ai-clients for your client. Sign-in link for the user: https://adspirer.ai/sign-up. Do not proceed with live ad-account steps until the connection is confirmed.
 Pull the account's current live ad set(s) / campaign structure for the target platform(s) before proposing where the batch lands — confirm the audience, budget, and objective the new creative will run against actually exist and are active, rather than assuming a fresh ad set is needed.

10. Propose the creative batch for upload into the confirmed ad set(s): which variants go to which placement (do NOT upload a 1:1 into a Story-only placement — Meta will letterbox or auto-crop it badly), and get explicit user approval before creating any ad or ad set in the live account. No creative gets uploaded or spend gets allocated without that approval.

11. Once approved and uploaded, verify via the account's own data — pull the newly created ad(s)/ad set to confirm exact count, placements, and creative IDs match what was proposed; this is a fixed check, not a one-time step.

## Fixed checks

Before declaring success, verify against live account data — never trust Canva export success or the agent's own "uploaded" claim as proof:
- Ad/ad set count in the platform matches the number of variants proposed (no partial upload, no silent skip on a malformed asset).
- Each uploaded creative's actual pixel dimensions match its assigned placement (Meta rejects or badly crops mismatched ratios — pull the live creative spec back, don't assume the export was correct).
- No duplicate creative hash across "variants" — if two exports render pixel-identical (e.g. a CTA-copy variant that failed to re-render text), Meta will flag them as the same ad or one will get starved in delivery; catch this before it burns budget.
- Ad set budget, audience, and objective on the live account match what was confirmed in step 9 — a stale ad set (paused, wrong objective, or reassigned audience since last checked) means the creative is about to run against the wrong thing.
- Naming convention landed correctly in the platform's ad name field (not just the local filename) — confirm by reading the ad name back from the account, since manual upload UIs sometimes truncate or auto-rename.

## Stop conditions

Success: all approved variants are live in the correct ad set(s) at correct placements, names verified in-platform, brand kit colors/fonts matched (no off-brand drift flagged). No-op: user has no active ad set to attach creative to and declines to create one — batch stays staged in Canva, nothing uploaded. Blocked: brand assets insufficient to build a clean batch (no logo, no brand colors, no product imagery) and user hasn't supplied any — stop and ask rather than inventing a brand look. Blocked: Canva connection fails or brand kit can't be read — stop, don't hand-code colors from a screenshot guess. Needs-approval: creative batch is built and staged but awaiting explicit user go-ahead before any upload or ad-set creation in the live account — this is the expected default resting state, not a failure.

## Approval boundaries

All design/export work in Canva (and Adobe if used) runs freely — it's asset production, not a live-account action, and nothing there costs money. The moment this skill touches the live ad account — creating an ad, ad set, or uploading creative into an active campaign — requires the user's EXPLICIT approval first, since any upload can start serving against real budget the moment it's live (especially if the ad set is already active with an existing budget). Never auto-publish a "final" batch straight from Canva into the ad account. Do not pause, edit, or delete any existing live ad or ad set to make room for the new batch without separate explicit approval — creative testing should default to additive (new ad set or new ads within the existing set) unless the user asks for a swap-out.

## What you get

A sized, on-brand static creative batch (4-8 variants per targeted aspect ratio) staged in Canva with a consistent naming convention mapping each file to its headline/visual/CTA test axis. A clear placement plan (which variant → which platform/placement) verified against the account's live ad-set structure. If approved, the batch uploaded into the confirmed ad set(s) with in-platform names and dimensions verified against live data — ready to accumulate delivery data as a real A/B/n test rather than a guess at what "good creative" looks like.
