Built for Mimi's Sweet Treats (Delta, CO) to celebrate the store's 2nd anniversary and Independence Day week simultaneously. All 46 posts scheduled via Blotato — zero manual publishing required after the build session.
Card 1 published live Jun 29. All 45 remaining posts scheduled in Blotato and fire automatically. No manual input needed through Jul 5.
This is the actual sequence of what was said and what happened — the real request, and what the agent did with it. No manual commands were typed. Each short request triggered a cascade of technical work shown in the agent blocks.
"audit all content we have created and verify that each is ready to post, matches and is consistent with sizing and calendar for each specific day it is supposed to — show me the schedule for all over next week and if good let's move forward"
Ran dimension checks across all files in the campaign folder. Compared each against platform standards (1080×1350 images, 1080×1920 video). Mapped every file to its calendar slot and flagged gaps.
6 campaign cards → 1080×1350 ✓ · 5 CAMP videos → 1080×1920 ✓
anim1_liberty.gif → 540×960 ✗ — needs upscale to 1080×1920
anim2_birthday4th.gif → 540×960 ✗ — needs upscale to 1080×1920
No thumbnails yet → flagged for all 7 videos before upload
"see screenshot of video preview thumbnail — it is still blank black screen for the video animation — will the video render a real image or screenshot when uploaded to social media?"
Identified root cause: embedded poster art inside the MP4 container is ignored by every platform — Facebook, Instagram, TikTok, and YouTube all decode the first frame instead, which is often a fade-in from black. The fix is to extract a real JPEG frame from inside the video at ~40% duration and pass it separately to each platform's thumbnail field.
Ran ffmpeg on all 7 videos, extracted one JPEG per video. Uploaded all 7 thumbnail JPEGs to Blotato CDN as separate files.
thumbs/CAMP01–05 · anim1 · anim2 — 7 real-frame thumbnails at correct timestamps · all uploaded to CDN ✓
"the animations were only 540×960 — they need to be 1080×1920 for reels"
Converted both Canva GIF exports from 540×960 to 1080×1920 MP4 using ffmpeg — upscaled to full res with letterbox padding to maintain aspect ratio without stretching.
ffmpeg -i anim1_liberty.gif -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:color=black" -c:v libx264 -pix_fmt yuv420p -r 30 anim1_liberty.mp4anim1_liberty.mp4 · anim2_birthday4th.mp4 — both 1080×1920 verified ✓
"build menu cards for the augie, the espresso, and the avalanche — use the gallery photos"
Wrote a Python PIL script, sourced gallery photos for each product, applied the Mimi's brand template (dark gradient overlay, red bottom strip, logo watermark, white product name and description in Arial Bold), and rendered 3 product cards at 1080×1350 JPEG quality 93. Ran the script to file — did not paste into terminal.
menu_card_augie.jpg (Banana Split) · menu_card_espresso.jpg (Coffee Lover's Dream) · menu_card_avalanche.jpg (Our Most Beloved Creation) — all 1080×1350 ✓
Each content type uses a different build method. This table shows which method to request for each type of content in any future campaign.
| Content Type | What to Say to Request It | What the Agent Uses | Output |
|---|---|---|---|
| Static Campaign Cards | "I have Canva cards ready in the campaign folder — audit them and add to schedule" | Dimension check · calendar mapping | 1080×1350 JPEG |
| AI Video Reels | "build a reel about [theme] using the explainer engine" | FAL.ai images → Kling AI animation → AI voice → MP4 | 1080×1920 MP4 |
| Menu / Product Cards | "build a menu card for [product] using the gallery photo of [item]" | Python PIL — gradient + brand strip + Arial text on photo | 1080×1350 JPEG |
| Animated Cards | "convert this Canva GIF to 1080×1920 MP4" | ffmpeg upscale + letterbox to 1080×1920 | 1080×1920 MP4 |
| Video Thumbnails | "extract real thumbnails for all videos" | ffmpeg — one JPEG frame per video at ~40% duration | JPEG frame from video |
| Campaign Report | "build a campaign report in the GVEC style — Cloudflare URL, print-ready" | HTML write → wrangler pages deploy | Live CF Pages URL |
"extract real thumbnails from all videos and pass them to each platform — I don't want a black preview"
Extracts a JPEG from each video at ~40% of its duration so you see actual content, not a fade-in. Uploads each thumbnail to CDN as a separate file. Passes to platforms as:
Two requests — one to upload everything, one to schedule everything. The agent handles all the technical steps inside each.
"upload all assets to Blotato — all the cards, menu cards, thumbnails, and videos"
1 — Got presigned URLs. Called Blotato's upload API for each of the 23 files. Each call returned a temporary PUT address and a permanent public URL. The permanent URL is what goes into post scheduling — it never expires.
2 — PUT files to CDN. Wrote a Python batch upload script and ran it to file (not pasted into terminal). Each file sent to its presigned URL. HTTP 200 or 201 = success.
3 — Logged all permanent URLs. CDN registry complete and available for scheduling calls.
23/23 uploaded · 9 images · 7 thumbnails · 7 videos · All HTTP 200/201 ✓
One retry on CAMP05 (token copy corruption — see Section 9, Error 3)
Get and upload in the same session. If you see HTTP 400 on upload, say "get a fresh presigned URL for [file] and retry" — the agent will get a new token and upload immediately.
"verify schedule and readiness is correct then continue with schedule — as long as it is on YouTube, Instagram, TikTok and Facebook correctly"
Pre-checked all constraints before calling the API: IG hashtag counts (≤5 each), TikTok parameter names (exact spelling), YouTube title presence (+#Shorts), all times converted from MDT to UTC. Scheduled in batches of 8.
Two IG posts failed on first try (hashtag limit) → trimmed and retried. One TikTok post failed (wrong field names) → corrected and retried. All 46 confirmed.
46/46 posts scheduled · FB 16 · IG 16 · TikTok 7 · YouTube 7
Campaign live Jun 29 · All fire automatically through Jul 5
These constraints are enforced by Blotato's API. Violations drop the post — no retry, no warning. Know them before scheduling.
Any caption with 6 or more hashtags fails at the API layer immediately. Always use the 3+2 formula: #mimissweettreats · #deltacolorado · #icecream + 2 event-specific.
| Platform | accountId | Required Fields Beyond mediaUrls + text | Hashtag Cap | Video Format |
|---|---|---|---|---|
| 37823 pageId: 377584465431192 |
pageId always · mediaType:"reel" for video | None | 1080×1920 MP4 | |
| 55698 @_mimis_est2024 |
Video: mediaType:"reel" + coverImageUrl + shareToFeed:true | MAX 5 | 1080×1920 MP4 | |
| TikTok | 48315 @mimis.sweettreats320 |
privacyLevel · disabledComments · disabledDuet · disabledStitch · isBrandedContent · isYourBrand · isAiGenerated | None | 1080×1920 MP4 |
| YouTube | 40924 | title required · thumbnailUrl · include #Shorts in title · video ≤60s | None | 1080×1920 MP4 |
| Correct (use this) | Wrong (will fail) | Value Used |
|---|---|---|
| disabledComments | disableComment | false (allow comments) |
| disabledDuet | disableDuet | false (allow duets) |
| disabledStitch | disableStitch | false (allow stitches) |
| isBrandedContent | (missing entirely) | false (not paid promo) |
| isYourBrand | (missing entirely) | true (own brand content) |
| isAiGenerated | — | true for CAMP01–05 · false for Canva animations |
Blotato uses UTC. Delta, CO is MDT = UTC−6 in summer. Add 6 hours. If result ≥ 24:00, roll to next calendar day.
| Local MDT | UTC | Used for |
|---|---|---|
| 8:00 AM | T14:00:00Z | CAMP01 hero launch · Card 5 event day |
| 10:00 AM | T16:00:00Z | Mid-morning card · CAMP04 Yard announcement |
| 11:00 AM | T17:00:00Z | CAMP03 Liberty Scoop · Avalanche menu card |
| 1:00 PM | T19:00:00Z | anim2 birthday animation |
| 2:00 PM | T20:00:00Z | Afternoon cards · Espresso menu card |
| 4:00 PM | T22:00:00Z | Post-game CAMP05 |
| 5:00 PM | T23:00:00Z | anim1 Thank You close |
| 7:00 PM | T01:00:00Z (next day) | CAMP02 — Jul 1 7PM MDT = Jul 2 01:00 UTC |
| Date / Local Time | Content | Type | FB | IG | TT | YT |
|---|---|---|---|---|---|---|
| Jun 29 · Live | Card 1 — "Two years. Two candles." | Image | ✓ | ✓ | — | — |
| Jul 1 · 8:00 AM | CAMP01 — Two Sweet Years (hero reel) | Reel | ✓ | ✓ | ✓ | ✓ |
| Jul 1 · 10:00 AM | Card 2 — "Always end with ice cream" | Image | ✓ | ✓ | — | — |
| Jul 1 · 2:00 PM | Card 3 — "Ice cream at The Yard" | Image | ✓ | ✓ | — | — |
| Jul 1 · 7:00 PM | CAMP02 — Happy Birthday reel | Reel | ✓ | ✓ | ✓ | ✓ |
| Jul 2 · 10:00 AM | Menu — The Augie (Banana Split) | Image | ✓ | ✓ | — | — |
| Jul 2 · 2:00 PM | Card 4 — "Two years and still going strong" | Image | ✓ | ✓ | — | — |
| Jul 3 · 8:00 AM | Card 5 — "IT'S HAPPENING TODAY" | Image | ✓ | ✓ | — | — |
| Jul 3 · 10:00 AM | CAMP04 — Mimi's at The Yard reel | Reel | ✓ | ✓ | ✓ | ✓ |
| Jul 3 · 4:00 PM | CAMP05 — Grab a Scoop (post-game) | Reel | ✓ | ✓ | ✓ | ✓ |
| Jul 4 · 8:30 AM | Card 6 — Happy 4th & 2nd Birthday | Image | ✓ | ✓ | — | — |
| Jul 4 · 11:00 AM | CAMP03 — The Liberty Scoop reel | Reel | ✓ | ✓ | ✓ | ✓ |
| Jul 4 · 1:00 PM | anim2 — Birthday 4th animation | Anim | ✓ | ✓ | ✓ | ✓ |
| Jul 5 · 11:00 AM | Menu — The Avalanche | Image | ✓ | ✓ | — | — |
| Jul 5 · 2:00 PM | Menu — The Espresso | Image | ✓ | ✓ | — | — |
| Jul 5 · 5:00 PM | anim1 — Thank You Delta close | Anim | ✓ | ✓ | ✓ | ✓ |
"write captions for [post name] — warm, local Delta Colorado tone, one CTA. Give me an IG version with max 5 hashtags and a Facebook version."
Two caption versions — IG-safe (5 hashtags max, 3+2 formula) and FB/TikTok extended (6–8 hashtags, same copy). Follows the 4-line formula below. Never puts hashtags in line 1.
| Line | Purpose | Example |
|---|---|---|
| 1 — Hook | Bold opener, no hashtags, creates FOMO | "Two years. Two candles. Two thousand scoops worth of memories. 🎂🍦" |
| 2 — Context | What's happening, when, why it matters | "Celebrating ALL WEEK in Delta — you're invited!" |
| 3 — CTA | One action only — visit or click (not both) | "📍 227 N. Palmer, Delta · mimissweettreats.com" |
| 4 — Hashtags | 5 max on IG · 6–8 on FB/TikTok · Lead with brand tag | "#mimissweettreats #anniversary #deltacolorado #icecream #twoyears" |
This is the actual conversation flow to reuse — phrased the way you'd say it, not as code to copy. Three requests drive an entire campaign from zero to scheduled.
"We're building a new campaign for Mimi's Sweet Treats. [EVENT NAME], running [START] through [END]. I want [static cards / AI reels / menu cards]. Schedule on all 4 Mimi's platforms. Use the same account IDs and CDN from the campaign report."
Mimi's account IDs (FB 37823 · IG 55698 · TikTok 48315 · YouTube 40924), CDN base URL, IG security block (54565 never used), all platform rules, hashtag limits, TikTok field names, MDT→UTC conversion table. Campaign scaffold begins.
"I have [N] Canva cards in the campaign folder. I need menu cards for [products]. Build the reels. Here are the dates and themes: [list them]."
Audits existing files for size and format → converts any GIFs → generates missing menu cards via Python PIL → extracts thumbnails for all videos → uploads all to CDN → confirms sizes before scheduling.
"Show me the schedule — verify everything looks right and then go ahead and schedule it all."
Presents full schedule for review. After you confirm, pre-checks all constraints (IG ≤5 hashtags, TikTok all 7 params, YouTube title+#Shorts, UTC times) and schedules all posts in Blotato. Returns count confirmation per platform.
| Event Type | What to Say | Content Mix | Best Platforms |
|---|---|---|---|
| Anniversary / Milestone | "hero reel + story cards + product spotlights + thank-you close" | 1 hero reel · 4–6 cards · 1–3 menu cards · 1 closing anim | All 4 |
| Holiday Campaign | "themed reel + limited-item card + celebration animation" | 1 themed reel · 2–3 cards · 1 animation | All 4 |
| Event / Pop-Up | "announce card 3 days out, day-before reminder, day-of reel, recap" | 3 cards + 1–2 reels across 4 days | FB + IG (local reach) |
| Product / Menu Launch | "build menu cards for [products] and one short demo reel" | 1 PIL card per product · 1 reel | IG + FB |
| Seasonal Campaign | "series of 6 cards with consistent template + weekly reel" | 6–8 cards every other day + 1 reel/week | All 4 |
| Grand Opening | "7-day countdown cards + hero reel + day-1 post + follow-up recap" | 7 countdown cards + 2 reels + 1 recap | All 4 |
"Audit everything in the campaign folder — verify sizing, check the schedule, flag anything wrong before we go live."
Six issues surfaced. Each shows the error, the root cause, and the exact thing to say to fix it — so these never require debugging again.
"Instagram allows a maximum of 5 hashtags per post." Post dropped. Affected Card 1 IG and CAMP01 IG — both had 7+ hashtags copied from FB captions.
Blotato enforces Instagram's limit at the API layer. 6+ hashtags = immediate failure, no retry, post is gone. FB captions were reused for IG without trimming.
"That IG post failed for too many hashtags — trim to 5 using the 3+2 formula and retry it."
Counts existing hashtags, removes extras, keeps core 3 + 2 event-specific, retries. New post ID confirms.
Say "IG captions max 5 hashtags" at start of session. Never copy FB captions to IG directly.
"must have required property 'disabledComments', 'disabledDuet', 'disabledStitch', 'isBrandedContent', 'isYourBrand'" — CAMP02 TikTok dropped.
Used singular form (disableComment) instead of plural past tense (disabledComments). Also omitted isBrandedContent and isYourBrand entirely.
"The TikTok post failed — use the correct parameter names (disabledComments, disabledDuet, disabledStitch) and include all 7 required TikTok fields, then retry."
Corrects field names and adds missing fields. Post confirms on retry.
Say "use the correct TikTok parameter block" when requesting any TikTok scheduling.
HTTP 400 on CAMP05 PUT. Token string had a %20 (encoded space) where a hyphen should be — auth signature invalid.
Presigned URL token was carried across a context boundary and one character corrupted. Expired or malformed tokens return 400.
"CAMP05 upload returned 400 — get a fresh presigned URL and retry the upload right now."
Gets fresh token for CAMP05 only, uploads immediately in same session. Returns HTTP 200.
Always upload within the same session as the presigned URL request. Never carry token strings across context resets.
Both Canva GIF exports at 540×960 — half the required 1080×1920 for Reels and Shorts.
Canva defaults to 50% resolution on GIF exports. Must be changed in export settings, or converted via ffmpeg.
"Both GIFs are 540×960 — convert them both to 1080×1920 MP4 with letterbox."
Runs ffmpeg upscale + letterbox pad on both. Produces full-res 1080×1920 MP4s. Verifies with ffprobe before upload.
Say "verify all video dimensions" in audit. If Canva GIF is used, always say "convert to 1080×1920 MP4."
"the video preview thumbnail is still a blank black screen — will the video show a real image when uploaded to social media?"
Embedded poster art inside the MP4 container is ignored by every social platform. They all decode the first frame — usually a fade-in from black. Fix: extract a real JPEG frame at ~40% of video duration and pass it as a separate thumbnail parameter to each platform. Not embedded in the file.
Say "extract real thumbnails for all videos" in every video campaign. Now part of standard pre-upload audit.
"The string is missing the terminator." When multi-line Python script pasted directly into PowerShell terminal — single quotes inside Python strings break PowerShell's parser.
"Write the Python script to a file first, then run it from the file — don't paste inline."
Writes script to a .py file using the Write tool, then runs python filename.py. No paste, no parse errors.
For any Python task, say "write to file and run." The agent already does this by default after this error.
| Platform | Handle | accountId | Extra | Status |
|---|---|---|---|---|
| Mimi's Sweet Treats | 37823 | pageId: 377584465431192 | Active | |
| @_mimis_est2024 | 55698 | — | Active | |
| joseph.sutliff10 | 54565 | — | ⛔ BLOCKED — never Mimi's | |
| TikTok | @mimis.sweettreats320 | 48315 | — | Active |
| YouTube | Mimi's Sweet Treats | 40924 | — | Active |
| What You Want | What to Say | Agent Uses |
|---|---|---|
| Check all asset sizes | "audit everything — verify sizing and flag problems" | ffprobe + dimension check |
| Convert Canva GIF to MP4 | "convert [file] to 1080×1920 MP4" | ffmpeg scale + letterbox |
| Extract video thumbnails | "extract real thumbnails for all videos" | ffmpeg -ss [40%] -vframes 1 |
| Build product card | "build a menu card for [product] using the gallery photo" | Python PIL + brand template |
| Upload everything | "upload all assets to Blotato" | presigned URL + Python batch PUT |
| Schedule everything | "verify schedule looks right then go ahead and schedule it all" | blotato_create_post per platform |
| Fix IG hashtag fail | "trim to 5 hashtags and retry the IG post for [name]" | Caption edit + retry |
| Fix TikTok param fail | "use the correct TikTok parameter names and retry [post]" | disabledComments/Duet/Stitch block |
| Fix failed upload (400) | "get a fresh presigned URL and retry the upload for [file]" | New token + immediate PUT |
| Build a campaign report | "build a campaign report in the GVEC style — Cloudflare URL, print-ready" | HTML + wrangler pages deploy |