Inspiration

In Texas, becoming a licensed journeyman electrician takes 8,000 supervised hours and one closed-book exam. The hours are the easy part. The exam is written against a code book that changes every three years, and the people sitting it are working full days on site beforehand. The courses that prepare you run $99 to $400 - real money when you're on helper's wages.

That gate is one of the last ladders someone can climb without a degree and without debt. We wanted to find out whether Gemini could make the climb cheap enough to be irrelevant as a barrier — not by cutting corners on quality, but by removing almost all of the company from the cost.

What it does

TradePass is exam prep for American electricians, $19 a month, covering eight state exams.

A candidate takes an adaptive diagnostic and gets a readiness estimate calibrated per exam section — an honest prediction of whether they'd pass today, and which section would fail them. They drill where they're weakest, sit full timed simulations under exam conditions, and can ask the AI tutor "why is this the answer?" on any question. The tutor's explanation is grounded in the specific code article the question comes from.

The questions are real work. A typical calculation item:

▎ A commercial building has a 208Y/120 V three-phase feeder supplying a continuous load of 30 kVA and a noncontinuous load of 15 kVA. What is the minimum required ampacity?

$$I = \frac{(30,\text{kVA} \times 1.25) + 15,\text{kVA}}{208,\text{V} \times \sqrt{3}} = \frac{52{,}500}{360.3} \approx 146,\text{A}$$

Every number in that calculation is re-executed in Python before the question is allowed to reach a candidate.

How we built it

Entirely on Google Cloud: Cloud Run, Firestore, Cloud Scheduler, Secret Manager, and the Gemini API.

Five agents run the business:

  • Content — Gemini 2.5 Flash writes practice questions against each state's published exam outline.
  • Verification — Gemini 2.5 Pro re-answers every question cold, never seeing the keyed answer, and must independently agree. Python then re-runs every calculation.
  • Tutor — Gemini 2.5 Flash explains any question at the candidate's level, citing the code article.
  • Support — Gemini classifies inbound email; Python recomputes refund eligibility from the account itself and issues the refund and cancellation with zero human involvement.
  • Ops — a nightly agent reviews the entire ad account, joins Google Ads spend to our own funnel, and computes cost-per-subscriber per keyword.

One rule holds it together: the model explains, the code decides. Gemini never gets the final say on anything that moves money or ships content.

The economics that follow are the point. The whole question bank — 4,362 serving items across eight state exams — cost about $455 of Gemini spend, roughly $0.104 per verified question. Cloud Run scales to zero when nobody's studying: $1.22 last month. Serving the entire business costs less than two subscriptions, and there are no operations staff. That is the entire reason the price can be $19 instead of $400.

Challenges we ran into

Our own numbers were wrong, more than once. Our analytics counted 147 internal test sessions as real users — all-time signups reported as 80 against 25 real, subscribes as 9 against 5. We inverted the exclusion rule from a denylist to an allowlist and corrected the figures downward before submitting. They now reconcile exactly against Stripe.

The transparency counter was lying in our favour. We publish how often a human had to intervene. It read 54. We'd been counting automated rejections as human work — overstating our dependence on people on the one metric meant to prove otherwise. It's 3, and we published what we got wrong on the page itself.

Our cost-per-question was understated 3.7×. We'd estimated $0.028 bottom-up from sampled token costs. Measured top-down against the actual billing console, it's $0.104 — the real pass rate was lower than assumed, verifier thinking-tokens had grown, and calculation topics burn repeated generate-verify cycles without ever filling. Ten cents makes the same argument as three cents and has the advantage of being true.

A support endpoint that could refund strangers' cards. For a period, /api/support/inbound accepted unauthenticated JSON — anyone who knew a subscriber's email could POST a refund request and have that person's card refunded and subscription cancelled. Now signature-verified, and it fails closed: with no secret configured it rejects everything rather than leaving a money-moving endpoint open.

Refunds that didn't finish. Refunding the charge alone left the Stripe subscription billing next cycle while our side had already locked the user out. Found in a live pressure test, not by a customer.

Distribution, which we have not solved. Blended customer acquisition cost is AUD 250 against AUD 108 of lifetime value — 2.3× underwater. Generic head terms are the culprit: one search term took AUD 363 across 115 clicks and produced zero subscribers, while specific exam-name intent converts at AUD 8.

Accomplishments that we're proud of

A verifier that overrules the generator 43.8% of the time. We've written 7,770 questions and thrown away 3,407. Those rejects were internally coherent and looked fine — without that gate they ship, and a candidate studies a wrong answer for a test they've paid to sit. We treat a high rejection rate as evidence the checks work, not as a yield problem.

Guardrails that are structural, not policy. The ads agent is authorised to act on the live account and runs nightly with --autopilot. It has applied zero changes without a human. It structurally cannot touch the daily budget: every operation it builds is asserted to be an ad-group-criterion op, and the run hard-fails if anything else appears.

Finding our own inflated numbers and correcting them down. In a competition judged partly on revenue evidence, that felt like the right instinct.

What we learned

Measure top-down. Every bottom-up cost estimate we made was optimistic, and every one was wrong in the same direction.

Restraint is a feature, not a gap. "Authorised to act, zero applied" is a stronger claim than full autonomy — but only if you show both halves. Alone, zero looks like something broken.

AI at creation time, not serving time. Front-loading Gemini spend into building a durable corpus is what produces a sub-$20/month floor and a price a helper can actually afford. It's an architectural decision, not a pricing one.

Supply is solvable; demand is the hard part. We can stand up a new state's question bank for $30–40. We cannot yet acquire a subscriber for less than they're worth. That asymmetry is the whole business now.

What's next for TradePass .. Time to Level UP!

NEC 2026. Texas exams switch on September 1. Our migrated bank is built and staged; the cutover lands August 28, ahead of the exam date, and the product already tells each candidate which code edition their exam will use based on when they sit it.

Fix the funnel economics. Kill the generic head terms, concentrate on exam-name intent where CAC is already profitable, and lean on SEO — three of our five subscribers arrived organically at zero cost.

More states, then more trades. WI, IA and OR next. The corpus architecture is trade-agnostic; plumbing and HVAC reuse it unchanged.

Show the work we're already doing. We compute per-topic mastery for every candidate and only render the section-level rollup. That detail is paid for and invisible — it should be on screen.

Exact cost accounting. Capture usage_metadata on every Gemini call so cost-per-question is measured, not estimated.

Built With

Share this project:

Updates