Inspiration
Every small business owner we know has the same dead-end folder: marketing videos they made (or AI made for them) that never became actual ads. Ads Manager is a part-time job — uploading, copywriting, campaign/ad-set/ad hierarchies, placements, review states, budgets. Agents shouldn't just answer questions about ads; they should run them.
What it does
IgniteAds is a task-completing agent, not a chatbot. One mission — "launch this video as an ad" — becomes a fully autonomous multi-step plan:
- Pulls the video + its generation script from our creative platform (or any video URL)
- Gemini 2.5 Flash writes policy-safe ad copy (primary text / headline / description) grounded in the video script + brand kit
- Resolves the Meta identity chain — page, Instagram actor, auto-creating a page-backed Instagram account when none exists
- Builds the full chain on the Meta Marketing API: video upload → creative → campaign → ad set → ad
- Launches everything PAUSED — the human gives one typed
ACTIVATEto start spend - Monitors review status and pulls daily Insights (impressions, clicks, CTR, spend) back into the loop
How we built it
- 3-layer agent architecture: markdown directives (SOPs) → agent orchestration → deterministic Python tools. The LLM never improvises an API call; it decides, deterministic code executes.
- Idempotent step-resume state machine: each Graph API step persists its platform ID to Firestore before the next step. Interrupt it anywhere and resume — zero duplicates, zero double spend. Our first production launch survived 2 failures and 3 resume cycles and completed cleanly.
- Google Cloud: Cloud Run (FastAPI), Firestore (multi-tenant launch state), Cloud Tasks (durable async), Firebase Auth + Hosting (Angular dashboard), Cloud Build deploys, Gemini for copy.
- Guardrails for an agent that spends money: PAUSED-first, hard budget caps, typed human confirmation for activation, full Graph API audit log.
Challenges we ran into
The Meta API's real surface diverges from its docs — all found in ONE live launch: video creatives require an Instagram actor even for Facebook-only placements; Graph v23 renamed instagram_actor_id → instagram_user_id without fanfare; campaigns now require is_adset_budget_sharing_enabled. Our self-annealing loop (fix the tool → update the directive → the agent never hits it again) turned each failure into permanent knowledge.
Accomplishments we're proud of
A real, verifiable launch: our agent created a live (paused) campaign — video, creative, campaign, ad set, ad — on a real Meta ad account, visible in Ads Manager, in under 2 minutes of agent time.
What we learned
Idempotency is the most important property of an agent with a wallet. And PAUSED-first is the right trust contract between humans and autonomous systems: the agent does 100% of the work; the human spends one word of attention exactly where it matters.
What's next
Multi-tenant OAuth (Meta App Review in progress), Google Ads as a second platform behind the same abstraction, and the full closed loop: performance data → Gemini proposes new creative variants → auto-generate → relaunch.
Built With
- angular.js
- cloud-build
- cloud-firestore
- fastapi
- firebase-auth
- firebase-hosting
- gemini
- google-cloud-run
- google-cloud-tasks
- mcp
- meta-marketing-api
- python
- typescript
Log in or sign up for Devpost to join the conversation.