Install
openclaw skills install @canvora/canvora-ad-campaignProduce paid ad creative sets with Canvora — Meta, Instagram, LinkedIn, Google Display and banner placements in one pass, with variants for testing. Use when the user wants ads, ad creative, paid social assets, display banners, or a campaign creative set.
openclaw skills install @canvora/canvora-ad-campaignAds fail on placement coverage and on having only one creative to test. Canvora
fixes both cheaply: every placement from one source in a single call, then
variants from the winner. Setup and credits: see the canvora skill.
| Format | Size | Placement |
|---|---|---|
ad_square | 1:1 | feed (Meta, LinkedIn, the safe default) |
ad_portrait | 9:16 | stories, reels, vertical video slots |
ad_landscape | 16:9 1200×628 | link ads, in-stream, LinkedIn sponsored |
ad_banner | 21:9 728×90 | classic leaderboard display |
google_display | 1200×628 | Google Display Network |
Full coverage = ad_square,ad_portrait,ad_landscape — three placements,
30 credits, one consistent look. Add ad_banner/google_display only if they
actually run display.
Ads are 10 credits per creative. Say the total in the same message as the run —
announce it, don't ask permission; if you decided the number of angles yourself,
confirm that number. A campaign is several sequential calls, so sum the whole
plan and run canvora credits --json once before you start: running dry
halfway leaves a half-covered campaign with the earlier calls already paid for.
Any single call producing 3+ creatives should fire-and-poll rather than --wait
— most harnesses kill a shell command at 120s while the generation carries on
server-side, and re-running generate starts a second, separate job. See the
canvora skill's "Long runs" section.
google_display + ad_banner. Unsure → the
three-format set.--brand + --logo. Ads without the mark waste the spend.--cta.# Full placement coverage from a product page (3 outputs — fire and poll)
ID=$(canvora generate --url https://store.example.com/product \
--format ad_square,ad_portrait,ad_landscape \
--brand $BRAND --logo --cta --style bold | head -1)
canvora status "$ID" --json # repeat every ~30s until completed
# Offer-led ad from a written brief
canvora generate --idea "Book a free 30-minute logistics audit — for e-commerce ops managers losing money on returns" \
--format ad_square,ad_landscape --brand $BRAND --logo --cta --wait --json
# Display set
canvora generate --url $URL --format google_display,ad_banner --brand $BRAND --logo --wait --json
One creative is not a campaign. Two correct ways, in order of preference:
canvora variations <id> --count 2 for visual re-rolls of the same
message (10 credits per new image on single-image ad formats). Use this when
the copy is right and only the look needs alternatives.for ANGLE in \
"Cut returns by 30% — the audit that finds where the money leaks" \
"Your returns process is costing more than your ad spend" \
"How Acme cut returns 30% in one quarter"
do
canvora generate --idea "$ANGLE" --format ad_square \
--brand $BRAND --logo --cta --wait --json
done
Rate limit is 20 generations/minute — run these sequentially with --wait.
--style bold is the right default for promotional creative; elegant
or dark for premium/luxury; minimal for B2B SaaS.--exact when legal or pricing copy must appear verbatim.--no-text if the team overlays their own copy in Ads Manager.edit (3 credits) rather than regenerating a set.--project <uuid> so everything stays together in the
dashboard.--cta set and the offer stated in the brief