Back

AutoAcquire

Agent-Driven Ad Engine for Bowldem

About the Project

AutoAcquire is an autonomous user acquisition engine built for Bowldem, a daily cricket puzzle game. The idea came from reading Karpathy's essay on autoresearch — a loop where an agent evaluates its own output, kills what fails, breeds from what works, and repeats on a fixed tick. An ad campaign is structurally identical: you're searching across creative variants for the one that converts cheapest.

Give it an outcome — email subscribers — and a daily budget. The engine figures out the rest. No daily tweaking, no manual A/B tests, no logging into Ads Manager to pause losers.

How It Works

Three agents, one cron job, one shared state object in Supabase. The cron fires at 06:00 UTC. Twenty-four hours later it fires again.

The CMO agent reads yesterday's funnel data — impressions, clicks, landings, plays, subscriptions — and scores every active variant. The scoring rule is tiered: if a variant has a real conversion, it outranks any variant with only clicks, no matter how high the CTR. The first version scored on CTR alone and spent two weeks optimizing toward clickbait that never converted.

The setup agent takes the CMO's brief and builds campaign scaffolding on Meta. Ad sets, budgets, targeting, UTM structure. It talks to Meta's Marketing API directly.

The creative agent fills those ad sets with new variants. It mutates yesterday's winners — same value prop, different hook. Provider chain is layered: Grok first, Gemini as fallback, static templates as the always-works option so the cycle ships even if every model is down.

The Handoff

Each agent writes its output to a shared state object in Supabase. The next agent reads from the same object. No chat, no negotiation, no multi-turn back-and-forth. Agent A writes. Agent B reads. The state object is the protocol.

This matters because the failure mode of multi-agent systems is usually coordination. The cog-wheel design avoids it by making every handoff unidirectional.

Safety Rails

Four rails run every cycle: token expiry preflight, hard daily budget cap, paired ad+adset kills (never one without the other), and the provider fallback chain. These rails do not learn. That's on purpose. The part of the system that can hurt you should not also be the part that changes.

What I Learned

Attribution has to close before the loop is useful. We burned ₹2,068 across 4,279 clicks with zero attributed plays before finding that the Supabase view was keyed on a UTM field the creative agent never populated. The agents were rotating against noise for ten days. The loop is only as good as the data feeding it.

Status: Live

Tech Stack: Supabase, Meta Marketing API, Multi-agent orchestration

View on GitHub