V·NESTERENKO
← All work
Lead Engineer · 2025–26 · 12 months

Creator-Audience Acquisition Platform

Client confidential – details anonymized.

Creators have audiences. Brands want to advertise to people who look like those audiences. This platform is the contract between the two: a creator connects their Instagram accounts, the platform measures and packages the audience, and a brand leases access for a period.

“Leases” is the operative word, and it took a while to land there. The legal framing moved over the year from a conventional terms-and-conditions page to a Master Audience Data Leasing Agreement, and the product had to follow – what is being sold is time-boxed access to a dataset, not a transfer of it. That distinction shapes the schema, the checkout, and what happens on expiry.

I was lead engineer and primary author across twelve months on a five-person team.

Connecting accounts is harder than it looks

The obvious version – creator clicks “connect Instagram”, we store the account – survives about a day of real use. Creators have several accounts. Some are already connected to another profile. Some were connected, removed, and are being reconnected. Some genuinely need to exist twice under different profiles.

A lot of the signup work went into this: filtering accounts that are already linked, a find-or-create path that links rather than overwrites, an explicit “allow duplicate” route for the cases where two profiles legitimately need the same account, and an early exit when there is nothing to do rather than creating empty profiles. Each one came from something going wrong.

New creator profiles also queue an Instagram snapshot job immediately, so the first thing they see is their own numbers rather than an empty state.

Keeping audiences current

Audience data goes stale, so five scheduled jobs keep it moving: a per-minute worker for queued tasks, plus daily and three-hourly refreshes for snapshots, custom audiences, and lookalikes. Meta rate-limits, so the work is queued and spread rather than fetched on demand.

Billing, and one decision reversed

Payments run on Stripe, covering brand checkout, guest checkout, and shareable public checkout links. Pricing supports platform-owned and creator-owned bundles with markup and fee percentages applied differently to each.

We tried manual capture – authorise at checkout, capture on fulfilment – and took it back out. It made sense for a marketplace where the thing being bought might not be deliverable, but it added a failure mode we did not need and a state to reconcile that nobody was watching.

Admin profile deletion cascades through listings, inquiries, orders, and related records in a single transaction, which matters when the data being deleted is the subject of a lease agreement.

Scope

74 API routes, 50 pages, 19 Prisma models, 5 scheduled jobs, 18 test files, and Sentry in production. Roughly 75,000 lines of TypeScript, most of it mine.

Next project →