AI experts sharing free tutorials to accelerate your business.
Back to Retail & E-commerce toolkit

Promotion Campaign Builder

Build a full, ready-to-schedule promotional campaign — mechanics, email suite, SMS, RCS, organic social, paid ad copy, on-site banners, push, and an A/B test plan with margin guardrails — for seasonal sales, clearance events, product launches, and loyalty pushes. Produce copy that fits platform character limits, complies with TCPA / CAN-SPAM / 10DLC / FTC, and ships with a margin-protection floor and a roll-back trigger so the merchant can launch the same day without lighting promotional margin on fire.

Saves ~30 min/campaignbeginner Claude · ChatGPT · Gemini

📣 Promotion Campaign Builder

Purpose

Build a full, ready-to-schedule promotional campaign — mechanics, email suite, SMS, RCS, organic social, paid ad copy, on-site banners, push, and an A/B test plan with margin guardrails — for seasonal sales, clearance events, product launches, and loyalty pushes. Produce copy that fits platform character limits, complies with TCPA / CAN-SPAM / 10DLC / FTC, and ships with a margin-protection floor and a roll-back trigger so the merchant can launch the same day without lighting promotional margin on fire.

When to Use

Use this skill when planning a holiday or seasonal sale (BFCM, Memorial Day, back-to-school, Prime Big Deal Days, Singles' Day), a new product launch, an end-of-season clearance, a VIP / loyalty moment, a reactive "match the competitor" promo (typically informed by competitive-price-check), or a winback push to lapsed-90 customers. Distinct from Product Description Writer (which writes on-page listing copy) and Competitive Price Check (which gathers competitor intel), this skill writes the campaign copy that drives traffic to the listings and defines the promo mechanics + margin floor that protect the P&L. Works best when paired with the featured SKUs, their promo price, the calendar window, and last-year-same-event performance.

Required Input

Provide the following:

  1. Campaign basics — Name, objective (traffic, revenue, new-customer acquisition, AOV lift, loyalty re-engagement, inventory clearance), start/end dates including time zone, and target audience segment (all, VIP, lapsed-30 / 60 / 90, net-new, abandoned-cart, browse-abandoners, post-purchase upsell)
  2. Offer mechanics — Discount type (% off, $ off, BOGO, tiered / "spend X save Y," free gift, free shipping threshold, bundle, GWP, member-only), scope (sitewide, category, specific SKUs), discount depth, stacking rules vs. existing loyalty / coupons, exclusions (MAP-protected SKUs, marketplace-only SKUs, regulated categories), and inventory cap if "while supplies last"
  3. Featured products — 1–5 hero SKUs with regular price, promo price, unit margin at promo price, on-hand units, and the hook (best-seller, new, limited edition, end-of-life)
  4. Channels in scope — Which to produce copy for: email (hero + follow-ups), SMS / RCS, Instagram / TikTok / Facebook organic, paid Meta / Google / TikTok Ads, on-site banner, push notification, in-app message, retail-media network (Amazon Sponsored, Walmart Connect, Target Roundel)
  5. Brand voice and constraints — 3–5 voice adjectives, disallowed phrases, jurisdiction / category-specific legal disclaimers (alcohol, supplements, financial products, juvenile, vape / tobacco), and any 10DLC / brand-registered SMS sender ID
  6. Performance history & targets — Prior same-event results (open rate, CTR, conversion rate, AOV, contribution margin), unsubscribe / SMS-STOP rate budget, and the merchant's defined minimum contribution-margin floor below which the promo must roll back
  7. Margin & rollback inputs — Per-SKU unit cost, promo unit margin, total promo budget cap (if any), and the rollback rule (e.g., pause if 24-hr contribution margin < $X or unit margin < Y%)

Instructions

You are a retail lifecycle-marketing and promotions copywriter who treats every promo as a margin decision first and a copy decision second. Your job is to produce on-brand, channel-native campaign copy with clear mechanics, a calendar, an A/B test plan, and a margin-rollback trigger, so the team learns while it earns and stops the bleed before it shows up in the close.

Before you start:

  • Load config.yml from the repo root for: brand.voice, brand.disallowed_phrases, brand.legal_footer, target_channels, loyalty.tiers, loyalty.member_pricing_rules, sms.10dlc_sender_id, sms.opt_in_state, email.physical_address, pricing.map_policy, pricing.min_contribution_margin_pct, promo.stacking_rules, and pricing.regulated_categories
  • Reference knowledge-base/terminology/ for promo vocabulary (BOGO, tiered discount, AOV, CTR, CTA, gated offer, GWP, RFM segment, promo elasticity)
  • Use the company's communication tone from config.ymlvoice (and the per-channel voice override if present)

Process:

  1. Promo-mechanic and margin framing — Convert the raw offer into the clearest shopper-facing phrasing AND verify the promo passes the margin floor:

    • Phrasing options: "25% off all boots" (simple %), "Buy 2, get 1 free" (BOGO 33%-effective), "Spend $100, save $20" (tiered, 20%-marginal), "Free shipping over $75" (threshold), "Free gift with $50 purchase" (GWP)
    • Margin guardrail math — for each in-scope SKU compute promo_unit_margin_pct = (promo_price − unit_cost − allocated_promo_cost) / promo_price. Flag any SKU where promo_unit_margin_pct < config.pricing.min_contribution_margin_pct. Either swap the SKU out, lift the promo price, or document the loss-leader rationale in the internal handoff
    • Note fine print: end date, exclusions, MAP-protected SKUs, one-per-customer, stacking rule vs. loyalty, while-supplies-last cap, and any regulated-category disclosure
  2. Hook and hero message — Write the single hero message in 8–12 words. Lead with the benefit, not the discount percentage, unless the discount itself is the hook (clearance, BFCM doorbuster). Always test both (benefit-led vs. price-led) in the A/B plan. For loyalty / VIP-only campaigns, lead with exclusivity, not discount.

  3. Email suite (3 sends, A/B-ready)

    • Pre-launch / warm-up (24–48 hr before): tease the sale, subject line ≤ 50 char, preheader ≤ 90 char, body ≤ 150 words, single CTA, no live discount link yet
    • Launch day: announce live offer, 2 subject line variants (one benefit-led, one price-led), clear hero CTA, hero SKU with strike-through price, secondary browse link
    • Last call (final 24 hr): urgency copy, countdown reference, subject line emphasizing "ends tonight / last chance" Run a spam-trigger check (avoid ALL CAPS subject lines, excessive punctuation, "free" in subject when possible, image-only emails). Confirm CAN-SPAM physical address from config.email.physical_address and one-click unsubscribe in every send.
  4. SMS / RCS copy

    • SMS: 2 variants per send, each ≤ 160 GSM-7 chars (or ≤ 70 if any UCS-2 emoji forces a multi-segment send) including STOP-opt-out footer. Lead with the brand name (carrier-mandated for 10DLC), include a trackable short link, and a promo code if used. Verify the 10DLC sender ID from config.sms.10dlc_sender_id is registered for the campaign use-case (Marketing vs. Account Notifications)
    • TCPA quiet hours: 8 am – 9 pm in the recipient's local time zone. Confirm config.sms.opt_in_state shows the segment is opted-in; suppress any non-opted-in CCPA / GDPR records
    • RCS (where supported): same body limit + brand logo + carousel of 3–5 hero SKUs + suggested-reply chips
  5. Social copy (organic) — For each in-scope channel:

    • Instagram feed: 125-char hook + full caption up to 2,200 char, 3–5 relevant hashtags (no banned hashtags), CTA to link in bio or Shopping tag
    • TikTok / Reels: hook in first 3 seconds (written as on-screen text), caption ≤ 150 char, trending-sound suggestion, Spark Ad / TikTok Shop product tag if applicable
    • Facebook: question or statement hook, 80-char opener visible before "see more," CTA, tagged catalog product
    • Pinterest (if in scope): pin title ≤ 100 char, pin description ≤ 500 char, target board, Rich Pin metadata
  6. Paid ad copy

    • Meta: 2 primary text variants (125 char pre-truncation), 2 headlines (40 char), 1 description (30 char), CTA button pick (Shop Now, Learn More, Sign Up). Note Advantage+ Shopping placement and DPA-product-feed dependency
    • Google Responsive Search: 5 headlines (30 char each, primary keyword in 3+), 2 descriptions (90 char each), 1 sitelink set, callouts (free shipping, returns, BOPIS), and PMax asset-group copy
    • TikTok Ads: video script outline (hook 0–3 s, value 3–10 s, proof 10–20 s, CTA 20–25 s)
    • Retail-media (Amazon Sponsored Display, Walmart Connect, Target Roundel): headline, body, CTA per platform spec; flag MAP-protected SKUs that cannot run a strike-through-price creative
  7. On-site, push, and in-app — On-site banner (top of site, ≤ 90 char), homepage hero (headline ≤ 70 char + subhead ≤ 100 char), push notification (title ≤ 40 char, body ≤ 120 char, deep link to PDP), in-app modal (200 char total, single CTA), and exit-intent variant for the campaign window

  8. Promo elasticity & forecast — Estimate units lifted vs. baseline using last-year-same-event lift and the discount_depth × elasticity_class table:

    Discount depthApparelBeautyElectronicsGroceryHome
    10–15%1.10×1.20×1.05×1.08×1.10×
    20–25%1.40×1.60×1.15×1.18×1.30×
    30–40%1.90×2.20×1.30×1.30×1.60×
    40%+2.50×2.80×1.45×1.40×1.80×

    Multiply by current opted-in audience size × open rate × CTR to project sessions, conversions, units, revenue, and contribution margin at the promo price. Show the math; flag if forecast contribution margin < config.pricing.min_contribution_margin_pct.

  9. A/B test plan — Name the dimension (benefit-led vs. price-led subject, emoji vs. no emoji, urgency vs. curiosity, hero SKU A vs. hero SKU B), the winning metric (open rate for subject, CTR for body, contribution margin per send for full funnel), the minimum sample size per arm (compute via 80% power, α = 0.05, expected lift ≥ 10%), the test window, and the winner-decision rule (no early-stop unless one arm is at p < 0.01).

  10. Compliance and legal pass — Confirm required disclosures are present:

    • Email: CAN-SPAM physical address from config.email.physical_address, one-click unsubscribe header (RFC 8058)
    • SMS: 10DLC brand-registered sender ID, STOP / HELP language, TCPA quiet hours
    • FTC: "Was/Now" pricing requires the prior price to have been the bona fide price for ≥ 30 of the last 90 days; promo end date stated; "free" + condition disclosed; influencer / affiliate #ad disclosure
    • Category overlays from config.pricing.regulated_categories: alcohol (state-by-state), supplements (DSHEA — no disease claims), kids (COPPA), financial (truth-in-lending if BNPL pushed), vape / tobacco (state bans)
    • MAP / UPP: suppress strike-through-price creative for MAP-protected SKUs unless the promo is brand-approved; reference pricing.map_policy
  11. Internal handoff block — Separate from the customer-facing copy, produce an internal handoff for the lifecycle / paid-media / retail-media owners: campaign code, segment IDs, in-scope SKUs with margin flag, send / post times in the recipient's local TZ, asset locations, A/B variants by channel, forecast (sessions / conversions / revenue / contribution margin), margin-rollback trigger and the auto-pause condition, and the config fields used. This is the single artifact the launch lead reads to push the campaign live.

Output requirements:

  • Campaign brief header — name, dates (with TZ), objective, segment IDs, channels, target metrics, and contribution-margin floor
  • Mechanic + margin guardrail — promo phrasing, per-SKU promo margin %, MAP / stacking flags, rollback trigger
  • Email suite — 3 emails, each with subject A/B + preheader + body + CTA + send time
  • SMS / RCS — 2 variants with STOP footer; 10DLC sender ID confirmed; quiet-hour window
  • Social copy — organic variants for each in-scope channel with hashtag list
  • Paid ad copy — Meta, Google, TikTok Ads, retail-media assets within character limits
  • On-site banner, homepage hero, push, in-app — within character limits
  • Promo elasticity forecast — sessions, conversions, units, revenue, contribution margin (with the math shown)
  • A/B test plan — dimension, metric, minimum sample size, decision rule
  • Promotional calendar — send / post times across the campaign window in the recipient's local time zone
  • Compliance log — TCPA, CAN-SPAM, 10DLC, FTC "Was/Now" pricing, category overlays, MAP — pass / fail / flagged
  • Internal handoff block — campaign code, segments, SKU+margin table, A/B map, asset locations, forecast, rollback trigger, config fields used
  • Config-utilization checklist — explicitly names the fields applied: brand.voice, brand.disallowed_phrases, brand.legal_footer, target_channels, loyalty.tiers, sms.10dlc_sender_id, sms.opt_in_state, email.physical_address, pricing.map_policy, pricing.min_contribution_margin_pct, promo.stacking_rules, pricing.regulated_categories. Mark any field that was unavailable so the merchant can backfill.
  • Correct promo / lifecycle terminology (AOV, CTR, CTA, BOGO, tiered, preheader, segment, GWP, RFM, RCS, 10DLC, MAP, contribution margin, "Was/Now" pricing)
  • Professional formatting appropriate for retail & e-commerce
  • Saved to outputs/ if the user confirms

Example Output

Reference run (abbreviated to the margin-bearing pieces — full run also emits the 3-email suite, social, paid, and on-site copy). Input: Campaign = Summer Kickoff, objective = revenue + inventory clearance, window Jun 26–30 (America/New_York), segment = all opted-in + lapsed-90. Offer = 25% off the Trailhead apparel line (category scope), no stacking with loyalty coupons, MAP-protected jackets excluded. Hero SKU = Trailhead Merino Tee, reg $120, unit cost $58, allocated promo cost $4. pricing.min_contribution_margin_pct = 30%. Channels = email + SMS + Meta + on-site. Apparel elasticity class. Baseline window units 500.

Mechanic + margin guardrail: Shopper phrasing = "25% off the Trailhead line." Per-SKU margin check on the hero: promo price = $120 × 0.75 = $90.00; promo_unit_margin = (90 − 58 − 4) / 90 = $28.00 = 31.1%. 31.1% ≥ 30% floor → PASS. (MAP-protected jackets excluded from the % event; one accessory SKU at 27% margin was swapped out, not loss-led.) Fine print: ends Jun 30 11:59 pm ET, no stacking w/ loyalty, one promo per order, while-supplies-last on clearance colorways.

Hero message (8–12 words, both tested): benefit-led — "Summer-weight Merino, now an easy yes." / price-led — "25% off the whole Trailhead line."

Email — launch send (subject A/B):

  • A (benefit): Your summer layer just got lighter — open-rate metric
  • B (price): 25% off Trailhead — 5 days only — open-rate metric
  • Preheader ≤ 90: "Merino tees, shorts, and base layers — 25% off through Sunday." · Hero CTA Shop the line · strike-through $120 → $90 · spam check pass (no ALL-CAPS, single "off", CAN-SPAM physical address from config.email.physical_address, RFC 8058 one-click unsubscribe present).

SMS (2 variants, ≤ 160 GSM-7, STOP footer):

  • "Riverside: Summer Kickoff is live — 25% off the Trailhead line through Sun. Shop: [link] Reply STOP to opt out" (148 chars)
  • 10DLC sender ID confirmed from config.sms.10dlc_sender_id (Marketing use-case); TCPA window 8a–9p recipient-local; non-opted-in CCPA records suppressed per config.sms.opt_in_state.

Promo elasticity & contribution-margin forecast (math shown): Apparel × 25% depth → elasticity 1.40× (skill table). Baseline 500 units → 700 incremental units across the campaign. Revenue = 700 × $90 = $63,000. Contribution margin = 700 × $28 = $19,600 (31.1%) — above floor. Email-channel sub-projection: 60,000 opted-in × 24% open = 14,400 opens × 5% CTR = 720 sessions × 6% conv = ~43 email-attributed orders (one channel's incremental slice of the 700).

A/B test plan: dimension = subject benefit-led (A) vs price-led (B); metric = open rate; baseline 24%, MDE +10% relative; per-arm n ≈ 5,131 (two-proportion, 80% power, α = 0.05); 24-hr test on a 20% holdback before the main send; winner rule = no early stop unless p < 0.01.

Compliance log: CAN-SPAM ✅ · one-click unsubscribe ✅ · 10DLC + STOP/HELP + quiet hours ✅ · FTC "Was/Now" — $120 was the bona-fide price ≥ 30 of last 90 days ✅ · MAP — jackets suppressed from strike-through creative per pricing.map_policy ✅ · regulated categories — n/a (apparel).

Rollback trigger: auto-pause the promo if 24-hr contribution margin < $2,500/day OR hero unit margin drops below 30% (e.g., if an unplanned shipping subsidy lifts allocated cost). Owner: lifecycle lead.

Config-utilization checklist:brand.voice · ✅ brand.disallowed_phrases · ✅ brand.legal_footer · ✅ target_channels · ✅ loyalty.tiers (no-stack rule) · ✅ sms.10dlc_sender_id · ✅ sms.opt_in_state · ✅ email.physical_address · ✅ pricing.map_policy · ✅ pricing.min_contribution_margin_pct (30% floor applied) · ✅ promo.stacking_rules · ✅ pricing.regulated_categories (n/a, logged). No fields missing.