Case study
Campaign operations for agencies and brands running creator campaignsThe campaign operations engine behind Teamful
Teamful runs influencer campaigns for agencies and brands, from the brief a creator works against to the numbers the client is shown. We built the whole platform: five deployed services, designed and largely written by AI coding agents under one engineer's direction.
- Client
- Teamful
- Industry
- Influencer campaign operations
- Scope
- Full platform, five deployed services
- Stack
- React, Supabase, Postgres, n8n
- Enforcement
- Postgres RLS, never the UI
The challenge
Creator campaigns run on spreadsheets, group chats and screenshots
An agency running influencer campaigns coordinates dozens of creators across six social networks. The plan lives in a spreadsheet, the approvals happen in a group chat, and the results arrive as screenshots. Nobody can say at a glance what is late, what is waiting on whom, or whether a deliverable is actually finished. And when the client asks to see progress, the agency has two bad options: hand over the entire backstage, including declined drafts and which creator is late and why, or send a reporting view so thin it says nothing.
Measurement is the harder half. Some creators connect their accounts and some never will, so the same metric has to come either from a platform API or from a public crawl. Those are two different instruments pointed at the same thing. Blend them, or silently fall back from one to the other, and a displayed figure can move by orders of magnitude with nothing having changed in the real world. Teamful's earlier behaviour did exactly that: it showed the newest row regardless of which lane produced it, so a number flipped whenever a collector happened to land later.
What we did
A system that derives its own state, and never guesses a number
A campaign in Teamful is a tree rather than a list, and a deliverable knows what it is: the platform models 6 networks and 27 content types, each declaring which elements are required and which are optional, so an Instagram Reel materialises its own video, caption, cover image, location, audio and tags. Completion is then computed from the elements that are filled, not declared by someone ticking a box. The journey strip on every deliverable, brief to content to approval to post link to live, is derived at read time and reshapes itself: a Twitch live stream has no content phase, because the stream is the post. The same applies to progress roll-ups, overdue work and what needs attention; the system tells the team what is wrong instead of waiting to be told.
For the numbers, we drew a hard line and wrote it into the schema: API and crawled stats are mutually exclusive measurements of the same thing, and are never merged, averaged, or silently fallen back between inside one figure. Every stats row records the lane that produced it, every reading carries a flag for whether that source reported the metric at all, and the UI renders "not reported by this source" rather than a fabricated zero. Each number in the product wears a badge saying where it came from, and anything older than seven days is labelled stale, because stale means the deliverable has dropped out of collection and somebody should know.
Deliverables
What we built
Five deployed services: a web app, a Postgres backend, 53 serverless functions, 30 active automation workflows and a click tracker.
- 01
The campaign work tree
Project, collection, deliverable, task, sub-task, with four deliverable modes, including one that holds many post slots under a single row and gives each slot its own independent stats.
- 02
Platform-aware briefs
Six platforms and 27 content types, each with a declared element schema built from 11 element types, so a brief is structured data the system can check rather than free text.
- 03
The approval engine
Three modes, entered automatically: saving the work is the submission. A safety net auto-accepts and opens a 48-hour decline window, or a staged flow routes to named reviewers with per-stage quorum, scoped chat and a 24-hour SLA.
- 04
Three data collection lanes
Platform APIs, public crawling and Teamful's own tracking links. Exactly one lane owns each submission, dispatch runs in the background, and a lane that cannot be reached writes a failure the UI can show rather than leaving the work pending forever.
- 05
The automation layer
Thirty n8n workflows on six-hourly schedules and on Postgres triggers over signed webhooks, plus 14 scheduled jobs inside the database that close approval windows, reap stuck collections, detect lapsed platform tokens and keep the stats time series bounded.
- 06
The brand role
A client-facing role built on three permission keys of its own and enforced in the database, not the interface. The brand sees the outcome of the campaign and the committed plan for it, and never the process behind it.
The engine
What makes an autonomous system trustworthy
There is no model anywhere in this product. Its intelligence is in the decisions it makes without a human, and in the places it deliberately refuses to decide.
The machine approves before any human does
Every saved post link is checked for platform, content type and account ownership against the deliverable it claims to fulfil. A mismatch is declined at the input, nothing counts and no approval flow is entered. Ownership is enforced in three separate places, so a link naming another creator's account is rejected before either collection lane runs.
One lane per number, never a blend
Measurements from a platform API and from a public crawl are never mixed into one figure, and click data from tracking links is always labelled separately. A number that cannot be attributed to a source is not shown as a number.
Nothing blocks on silence
Approval windows close themselves, breached review deadlines age the row and nudge the reviewer, stuck collections are reaped every five minutes, and lapsed platform tokens are detected and replaced by the fallback lane automatically. A declined draft is a revision, not a death: it re-enters at the stage that declined it and earlier approvals stand.
Permissions the interface cannot grant
The doctrine is written into the codebase: if you delete all the permission code in the front end, unauthorised users must still be blocked. Row-level security in Postgres is the real enforcement, permissions ride in the access token, and a permission change propagates to an open browser in realtime. Even the billing plan limits are enforced by database triggers, so a direct API call cannot exceed them.
Results
What changed for the team
Teamful hasn't published campaign or commercial figures from this work, and we don't invent them. What we can describe is what the system now does on its own, and what it took to build.
What changed
- A campaign is one tree rather than a spreadsheet, and its state, completion, progress and what needs attention, is computed rather than typed.
- Approval happens by saving the work. There is no submit button, reviewers are named in advance, and no item can sit waiting on somebody's silence.
- Every figure in the product says where it came from, and a metric a source never reports is shown as not reported instead of as zero.
- Performance data is collected from six platforms on a schedule, with the paid crawler replaced by free public APIs wherever both were verified to agree on production data.
- Clients get a role of their own that shows the outcome and the committed plan, with the process behind it out of reach in the database rather than hidden in the UI.
- Built in nine months by one engineer directing AI coding agents: 131,451 lines of application TypeScript, around 74,500 lines of SQL, 53 serverless functions, and 916 unit tests plus 39 SQL suites gating every deploy.
- Hardened by adversarial AI audits of the running system, which found and closed real failures, including a stats collector failing one run in ten with no detection, and a default database grant that exposed newly created objects.
“We needed a full campaign-management platform, not another dashboard bolted onto spreadsheets. Agenthos built the SaaS end to end and automated how we pull stats from social networks, so the team runs campaigns instead of assembling reports.”
Reach us
How about a free audit?
Tell us a little about your business and where time gets lost. We'll come back with what's worth automating first.
What to expect
Confirmation email
01You'll receive an immediate confirmation with next steps.
Response within 24 hours
02A team member will reach out within one business day.
Discovery call
0330-minute conversation about your goals and challenges.
No obligation
04Exploratory conversations carry no commitment.