Marketing · Startup, built from zero

A full AI marketing platform, built by one person

More people now ask ChatGPT or Gemini what to buy. EasyFound helps brands show up in those answers. I learned the marketing side from zero and built the platform end to end, with AI as my main tool.

Role
Solo builder
Started
July 2026
Status
Beta
Approach
AI-assisted delivery
Illustration of EasyFound with demo data
1person, from idea to beta
~50beta users planned
4product modules
The problem

SEO is no longer the whole story

Agencies know how to rank on Google. They had no way to measure or improve how often AI assistants recommend their clients.

  • Invisible in AI answersBrands could not see whether AI assistants mention them at all.
  • Nothing to measureNo baseline, no trend, no comparison with competitors.
  • No clear next stepEven when a brand loses a question, nobody knows what to change.
  • A new field for meI had no marketing background, and GEO itself is brand new.
What I did

From first conversation to running system

  1. Learned the domain

    How agencies work, what they report to clients, and what GEO actually needs.

  2. Measure

    Check how often a brand appears in AI answers and where it is weak.

  3. Monitor

    Track each important question across AI engines over time.

  4. Win the prompt

    Turn each lost question into concrete actions.

  5. Content engine

    Help write the content that moves those results.

See it work

Winning the questions that matter

Demo dataEach cell is one question on one AI engine
Under the hood

How it works

For technical readers: the moving parts, and the mechanism that makes it reliable.

A loop, not a report

Measure, monitor, act, then measure again. Every action is checked against the next round of AI answers.

Built with AI, checked by me

AI did much of the drafting, coding and testing. Every change still went through my review and a real-browser acceptance run.

Agency-shaped

Data is organised by agency, client and prompt, so one team can manage many brands.

Engineering deep dive

How a brand gets measured across AI engines

For engineers: the services, how one scan fans out across AI engines, and how results settle correctly when some calls fail.

Stack

Backend
NestJSTypeScriptgRPC
Jobs
BullMQRedis
Data
PostgreSQL 17
AI engines
OpenAIAnthropicPerplexityGeminiGoogle AI ModeAI Overviews
Frontend
Next.jsReactTanStack QueryTailwind
Delivery
RailwayStripeVitestPlaywright

Five domains behind two gateways

  • AuthAccounts, sessions and login.
  • BillingStripe subscriptions, credits and usage metering.
  • BrandBrands, competitors and the prompts each brand is tracked on.
  • ScanRuns prompts across AI engines and records mentions and citations.
  • ContentTurns results into share of voice, insights and suggested actions.
  • Web and Admin gatewaysEach has its own OpenAPI contract and calls the domains over gRPC.

One scan, from prompt to dashboard

Each prompt and engine pair is its own job, so one slow or failing engine never blocks the rest.

  1. TriggerA five-minute cadence tick, a manual start or a free scan starts a run.
  2. Fan-outThe run creates one job for every active prompt times every enabled engine, and records the total.
  3. WorkerUp to 10 jobs run at once. Each one asks the engine and stores the full answer.
  4. RetryTemporary errors retry up to 3 times with backoff. Bad API keys fail at once, with no wasted retries.
  5. ParseBrand and competitor mentions are matched as whole words, and cited URLs are de-duplicated.
  6. SettleEach finished job adds to a counter in one atomic update. The last one closes the run.
  7. InsightShare of voice and citation trends are recomputed and shown on the dashboard.

Run states

Running→Completed/Partial/Failed/Cancelled

Cancel and natural finish race on the same conditional update, so only one of them wins.

Key decisions

One job per prompt and engine

Problem
AI engines are slow, rate-limited and fail in different ways. One big job per scan meant one bad engine ruined the whole scan.
Choice
Fan out into small BullMQ jobs and settle the run with atomic counters: all passed is completed, some failed is partial, all failed is failed.
Why
Customers still get results when one engine is down, and the run status always tells the truth.

Domain services with frozen contracts

Problem
AI writes a lot of the code. Without hard boundaries, changes leak across features and break callers silently.
Choice
Five gRPC domain services behind Web and Admin gateways. Every endpoint has a frozen OpenAPI slice, and wire-shape tests check the gRPC messages.
Why
A change that breaks a contract fails in CI, not in front of a customer.

Transactions for every credit and charge

Problem
Credits are reserved, used and refunded by many workers at once. A crash halfway could charge twice or lose usage.
Choice
PostgreSQL with explicit SQL, unique constraints, transactions and versioned schema migrations.
Why
No double charges and no half-written records, and the database itself enforces the rules.

Settling a run, simplified

run-settlement.tssimplified sketch
async onJobFinished(runId: string, ok: boolean) {
  // one atomic update per job: no read-modify-write race between workers
  const run = await sql`
    UPDATE runs SET completed_jobs = completed_jobs + ${ok ? 1 : 0},
                    failed_jobs = failed_jobs + ${ok ? 0 : 1}
    WHERE id = ${runId} RETURNING *`;
  if (run.completed_jobs + run.failed_jobs < run.total_jobs) return;

  const status = run.failed_jobs === 0 ? 'completed'
    : run.completed_jobs === 0 ? 'failed' : 'partial';
  // CAS: only close a run that is still running (cancel may have won)
  const won = await sql`
    UPDATE runs SET status = ${status} WHERE id = ${runId} AND status = 'running'`;
  if (won.count === 1) await insights.recompute(run.brand_id);
}

Scale

5domain services over gRPC
6AI answer engines tracked
10jobs in parallel per worker
5minute scheduling tick
3tries per job before it fails

Reliability and operations

  • Gates on every changeTypecheck, lint, convention checks, tests, build and contract checks run before anything reaches main.
  • Real-stack testsIntegration tests run against real PostgreSQL and Redis. Mocks never count as proof.
  • Browser acceptancePlaywright runs real user flows in a browser before a feature is accepted.
  • Release readbackEvery deploy exposes its commit and build, so what is live is always known.
Illustration for EasyFound
The hard part

A product that used to need a whole team, or a year of one person's time.

With AI handling much of the drafting, coding and testing, one person can now ship what used to be out of reach alone. I kept the scope tight and checked every change myself.

The result

What changed for the business

  • A complete product, built solo with AI
  • Four modules: measure, monitor, win the prompt, content
  • Preparing for around 50 beta users
  • A real example of one engineer plus AI delivering a full product
Next project

A6API

Read the story →