Vivere Web · Internal Campaign Report · Eyes Only

Mimi's Sweet Treats
4th of July & 2nd Anniversary Campaign

A real-conversation walkthrough of how this campaign was built — what was said, what ran, what was produced — so it can be cloned for any future event.
Client: Mimi's Sweet Treats · Delta, CO Campaign: Jun 29 – Jul 5, 2026 Platforms: FB · IG · TikTok · YouTube Scheduling: Blotato (fully automated) Prepared: Joseph Sutliff · Vivere Web · July 1, 2026

1 · Campaign Overview & Stats

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.

46Total Posts
4Platforms
7Campaign Days
23Media Files
16Time Slots

Content Built

Platform Breakdown

Campaign Status

Card 1 published live Jun 29. All 45 remaining posts scheduled in Blotato and fire automatically. No manual input needed through Jul 5.

2 · The Build Conversation

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.

Step 1 — Content Audit & Sizing Check

You said

"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"

Agent did

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.

Result

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

Step 2 — Black Video Thumbnail Fix

You said

"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?"

Agent did

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.

Files produced

thumbs/CAMP01–05 · anim1 · anim2 — 7 real-frame thumbnails at correct timestamps · all uploaded to CDN ✓

Step 3 — GIF Animation Upscale

You said (after audit flagged both GIFs)

"the animations were only 540×960 — they need to be 1080×1920 for reels"

Agent did

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.mp4
Files produced

anim1_liberty.mp4 · anim2_birthday4th.mp4 — both 1080×1920 verified ✓

Step 4 — Menu Card Build

You said

"build menu cards for the augie, the espresso, and the avalanche — use the gallery photos"

Agent did

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.

Files produced

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 ✓

3 · How Each Asset Was Built

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

3.1 · Thumbnail Rule — Say This if Video Previews Show Black

Say this

"extract real thumbnails from all videos and pass them to each platform — I don't want a black preview"

Agent does

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:

4 · Upload & Scheduling Conversation

Two requests — one to upload everything, one to schedule everything. The agent handles all the technical steps inside each.

The Upload Request

You said

"upload all assets to Blotato — all the cards, menu cards, thumbnails, and videos"

Agent did (3 steps, no further input)

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.

Result

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)

Presigned URLs Expire in ~2 Hours

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.

The Scheduling Request

You said

"verify schedule and readiness is correct then continue with schedule — as long as it is on YouTube, Instagram, TikTok and Facebook correctly"

Agent did

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.

Result

46/46 posts scheduled · FB 16 · IG 16 · TikTok 7 · YouTube 7
Campaign live Jun 29 · All fire automatically through Jul 5

5 · Platform Rules Reference

These constraints are enforced by Blotato's API. Violations drop the post — no retry, no warning. Know them before scheduling.

Instagram — 5 Hashtag Maximum (Hard Limit)

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
Facebook 37823
pageId: 377584465431192
pageId always · mediaType:"reel" for video None 1080×1920 MP4
Instagram 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

5.1 · TikTok Field Names — Exact Spelling Required

Correct (use this)Wrong (will fail)Value Used
disabledCommentsdisableCommentfalse (allow comments)
disabledDuetdisableDuetfalse (allow duets)
disabledStitchdisableStitchfalse (allow stitches)
isBrandedContent(missing entirely)false (not paid promo)
isYourBrand(missing entirely)true (own brand content)
isAiGeneratedtrue for CAMP01–05 · false for Canva animations

5.2 · Time Zone — MDT to UTC

Blotato uses UTC. Delta, CO is MDT = UTC−6 in summer. Add 6 hours. If result ≥ 24:00, roll to next calendar day.

Local MDTUTCUsed for
8:00 AMT14:00:00ZCAMP01 hero launch · Card 5 event day
10:00 AMT16:00:00ZMid-morning card · CAMP04 Yard announcement
11:00 AMT17:00:00ZCAMP03 Liberty Scoop · Avalanche menu card
1:00 PMT19:00:00Zanim2 birthday animation
2:00 PMT20:00:00ZAfternoon cards · Espresso menu card
4:00 PMT22:00:00ZPost-game CAMP05
5:00 PMT23:00:00Zanim1 Thank You close
7:00 PMT01:00:00Z (next day)CAMP02 — Jul 1 7PM MDT = Jul 2 01:00 UTC

6 · Full 46-Post Schedule

Date / Local Time Content Type FB IG TT YT
Jun 29 · LiveCard 1 — "Two years. Two candles."Image
Jul 1 · 8:00 AMCAMP01 — Two Sweet Years (hero reel)Reel
Jul 1 · 10:00 AMCard 2 — "Always end with ice cream"Image
Jul 1 · 2:00 PMCard 3 — "Ice cream at The Yard"Image
Jul 1 · 7:00 PMCAMP02 — Happy Birthday reelReel
Jul 2 · 10:00 AMMenu — The Augie (Banana Split)Image
Jul 2 · 2:00 PMCard 4 — "Two years and still going strong"Image
Jul 3 · 8:00 AMCard 5 — "IT'S HAPPENING TODAY"Image
Jul 3 · 10:00 AMCAMP04 — Mimi's at The Yard reelReel
Jul 3 · 4:00 PMCAMP05 — Grab a Scoop (post-game)Reel
Jul 4 · 8:30 AMCard 6 — Happy 4th & 2nd BirthdayImage
Jul 4 · 11:00 AMCAMP03 — The Liberty Scoop reelReel
Jul 4 · 1:00 PManim2 — Birthday 4th animationAnim
Jul 5 · 11:00 AMMenu — The AvalancheImage
Jul 5 · 2:00 PMMenu — The EspressoImage
Jul 5 · 5:00 PManim1 — Thank You Delta closeAnim
Facebook16 posts
Instagram16 posts
TikTok7 posts (video only)
YouTube7 posts (Shorts, all ≤60s)
Total scheduled46 · All confirmed live

7 · Caption Strategy & Brand Voice

7.1 · How to Request Captions

Say this

"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."

Agent produces

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.

7.2 · The 4-Line Caption Formula

LinePurposeExample
1 — HookBold opener, no hashtags, creates FOMO"Two years. Two candles. Two thousand scoops worth of memories. 🎂🍦"
2 — ContextWhat's happening, when, why it matters"Celebrating ALL WEEK in Delta — you're invited!"
3 — CTAOne action only — visit or click (not both)"📍 227 N. Palmer, Delta · mimissweettreats.com"
4 — Hashtags5 max on IG · 6–8 on FB/TikTok · Lead with brand tag"#mimissweettreats #anniversary #deltacolorado #icecream #twoyears"

7.3 · Instagram Hashtag Formula

Core 3 (always use these)#mimissweettreats · #deltacolorado · #icecream
+ 2 event-specific (pick from)#anniversary · #4thofJuly · #TheYard · #TwoYears · #GrabAScoop · #birthday · #celebrate
IG total5 hashtags — do not exceed

Always

Never

8 · How to Clone This Campaign for Any Event

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.

8.1 · Start Any New Campaign — Say This

Opening request (new session)

"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."

Agent loads automatically

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.

Content brief

"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]."

Agent does

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.

Scheduling approval

"Show me the schedule — verify everything looks right and then go ahead and schedule it all."

Agent does

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.

8.2 · Event Type — What to Request

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

8.3 · Quick Pre-Schedule Audit

Say before scheduling any campaign

"Audit everything in the campaign folder — verify sizing, check the schedule, flag anything wrong before we go live."

Agent checks

9 · Errors, Fixes & What to Say

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.

Error 1 — Instagram Hashtag Limit

Error returned by Blotato

"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.

Root cause

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.

Say this to fix it

"That IG post failed for too many hashtags — trim to 5 using the 3+2 formula and retry it."

Agent does

Counts existing hashtags, removes extras, keeps core 3 + 2 event-specific, retries. New post ID confirms.

Prevention

Say "IG captions max 5 hashtags" at start of session. Never copy FB captions to IG directly.

Error 2 — TikTok Wrong Parameter Names

Error returned

"must have required property 'disabledComments', 'disabledDuet', 'disabledStitch', 'isBrandedContent', 'isYourBrand'" — CAMP02 TikTok dropped.

Root cause

Used singular form (disableComment) instead of plural past tense (disabledComments). Also omitted isBrandedContent and isYourBrand entirely.

Say this to fix it

"The TikTok post failed — use the correct parameter names (disabledComments, disabledDuet, disabledStitch) and include all 7 required TikTok fields, then retry."

Agent does

Corrects field names and adds missing fields. Post confirms on retry.

Prevention

Say "use the correct TikTok parameter block" when requesting any TikTok scheduling.

Error 3 — Upload Failed HTTP 400 (Token Corruption)

Error seen

HTTP 400 on CAMP05 PUT. Token string had a %20 (encoded space) where a hyphen should be — auth signature invalid.

Root cause

Presigned URL token was carried across a context boundary and one character corrupted. Expired or malformed tokens return 400.

Say this to fix it

"CAMP05 upload returned 400 — get a fresh presigned URL and retry the upload right now."

Agent does

Gets fresh token for CAMP05 only, uploads immediately in same session. Returns HTTP 200.

Prevention

Always upload within the same session as the presigned URL request. Never carry token strings across context resets.

Error 4 — GIF at Half Resolution

Flagged in audit

Both Canva GIF exports at 540×960 — half the required 1080×1920 for Reels and Shorts.

Root cause

Canva defaults to 50% resolution on GIF exports. Must be changed in export settings, or converted via ffmpeg.

Say this

"Both GIFs are 540×960 — convert them both to 1080×1920 MP4 with letterbox."

Agent does

Runs ffmpeg upscale + letterbox pad on both. Produces full-res 1080×1920 MP4s. Verifies with ffprobe before upload.

Prevention

Say "verify all video dimensions" in audit. If Canva GIF is used, always say "convert to 1080×1920 MP4."

Error 5 — Video Shows Black Preview on Share

You said

"the video preview thumbnail is still a blank black screen — will the video show a real image when uploaded to social media?"

Agent explained + fixed

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.

Prevention

Say "extract real thumbnails for all videos" in every video campaign. Now part of standard pre-upload audit.

Error 6 — PowerShell Won't Run Multi-line Python

Error seen

"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.

Say this

"Write the Python script to a file first, then run it from the file — don't paste inline."

Agent does

Writes script to a .py file using the Write tool, then runs python filename.py. No paste, no parse errors.

Prevention

For any Python task, say "write to file and run." The agent already does this by default after this error.

10 · Quick Reference

10.1 · Account IDs — Never Guess, Use These

PlatformHandleaccountIdExtraStatus
FacebookMimi's Sweet Treats37823pageId: 377584465431192Active
Instagram@_mimis_est202455698Active
Instagramjoseph.sutliff1054565⛔ BLOCKED — never Mimi's
TikTok@mimis.sweettreats32048315Active
YouTubeMimi's Sweet Treats40924Active

10.2 · What to Say to Trigger Each Action

What You WantWhat to SayAgent 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

10.3 · Content Standards

Feed images (all platforms)1080 × 1350 px
Reels / Shorts / TikTok1080 × 1920 px
YouTube Shorts max duration60 seconds
Image formatJPEG · quality 90–95
Video formatMP4 · H.264 · yuv420p
IG max hashtags5
TikTok required params7 fields (exact spelling)
YouTube titleRequired + #Shorts
Scheduling timezoneUTC (MDT + 6)
Presigned URL lifespan~2 hours — use immediately

10.4 · CDN Base

Blotato CDN public base URLhttps://database.blotato.io/storage/v1/object/public/public_media/687fa983-393b-4d72-88cf-cd4169908c3f/
This campaign23 files · 9 images · 7 thumbs · 7 videos
CDN URLsPermanent — never expire