Case study

Teamful logoCampaign operations for agencies and brands running creator campaigns

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

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

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

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

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

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

  6. 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.”
Marc OgiharaCEO, Teamful

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.

* Required. No spam, ever. By submitting you agree to our Privacy Policy.

What to expect

  • Confirmation email

    01

    You'll receive an immediate confirmation with next steps.

  • Response within 24 hours

    02

    A team member will reach out within one business day.

  • Discovery call

    03

    30-minute conversation about your goals and challenges.

  • No obligation

    04

    Exploratory conversations carry no commitment.