FirstCustomer.ai
A first customer for every PR

Your CI runs tests.Ours uses your app.

FirstCustomer runs real user paths on every PR and reports what broke.

We named it FirstCustomer because that's what it is. The first user to try every change, before any real one does.

Problem

Tests know assertions. They do not know the customer path.

Traditional CI can tell you that mocked fixtures pass. It cannot tell you that a pricing change broke a guest checkout path that real users hit every day.

Legacy CI Pipeline
$ pnpm testRunning 142 test suites...✓ Header component renders✓ Auth flow passes✓ Checkout validation Status: PASS (142/142) // Production 2 hours later:Uncaught TypeError: Cannot read properties of undefined (reading 'price')
FirstCustomer Analysis
> Running PR #4802 as persona: GuestUser  → land /  → add to cart  → /checkout △ Path failed at /checkout (step 3 of 4)File: src/components/Checkout.tsxIssue: 'price' undefined for guest session. Unit tests passed against a mocked data shape the live flow never produces. Confidence Score: 94% Status: BLOCK (revenue path broke)

How it works

The pipeline learns the app before it judges the PR.

Four steps: read the diff, map it to user paths, run the affected flows in a browser, and report the exact path that broke.

01 / Diff intake

Read the change as intent

FirstCustomer parses changed files, routes, components, API contracts, and test hints before CI turns the PR into a pass/fail binary.

02 / App graph

Map touched code to lived paths

An onboarding crawl uses the app like a customer. It builds a graph of checkout, auth, billing, empty states, and integrations. Each diff is projected onto that graph.

03 / Persona run

Use the app as a real customer

A browser agent opens the PR build and walks the flows your diff touched. It tests first-time users, returning customers, and edge cases with real execution.

04 / CI decision

Block only when it matters

Engineers get the exact path the agent took, where it broke, the persona that broke it, and the files that caused it. No new dashboard to babysit.

Personas

The same PR. Four customers. Different verdicts.

One pass/fail can't describe what a release does to real users. Each persona has an intent, walks the affected flows, and reports what happened.

First-time guest

no account, mobile, in a hurry

fail

Intent

browse → add to cart → guest checkout

  1. 01lands on /
  2. 02adds item
  3. 03hits /checkout
  4. 04enters card

Verdict

price undefined for guest session

Returning customer

logged in, stored card, desktop

pass

Intent

reorder a previous item

  1. 01signs in
  2. 02reopens last order
  3. 03one-click reorder

Verdict

completed in 2.4s, receipt sent

Coupon hunter

stacked promo codes, edge cases

fail

Intent

apply expired + valid coupon together

  1. 01adds item
  2. 02applies CODE1
  3. 03applies CODE2
  4. 04checkout

Verdict

stacked coupons crash price resolver

Empty-cart wanderer

exploring, never commits

skip

Intent

open checkout with nothing in cart

  1. 01opens /cart
  2. 02navigates /checkout directly

Verdict

untouched by this diff

The Graph

We map the reality of your codebase.

The graph links user flows to components, API boundaries, routes, and external systems. A diff that touches the checkout component is no longer a file change. It is a change to a revenue path.

What it watches

Quiet infrastructure for teams that do not want another flaky gate.

persona-driven browser agentGitHub Checksreal-browser PR runsAPI boundary driftuser path confidenceSlack risk alertspersona-driven browser agentGitHub Checksreal-browser PR runsAPI boundary driftuser path confidenceSlack risk alertspersona-driven browser agentGitHub Checksreal-browser PR runsAPI boundary driftuser path confidenceSlack risk alerts

Private access

Join the early access.

We are onboarding a small number of high-velocity engineering teams that ship product through CI every day.

Full persona walkthrough on every PR
GitHub, GitLab, and Bitbucket CI integrations
Direct Slack alerts when a customer path breaks
Persona-driven browser agent on every PR