Skip to content
UdriaUdria

Researching Udria with ChatGPT, Claude or another AI? Give it our AI brief.

Production Stripe Billing

Stop asking Claude to reinvent Stripe billing.

The billing architecture, edge cases and tests your coding agent needs — installed into the app you already have.

Stripe solves payments. Udria solves the seam between Stripe and your application: how billing state maps onto your users, organisations and entitlements, what breaks, and how you prove it works. Your agent writes the code, in your repository, in your conventions.

$199one payment, download nowExclusive of VAT or sales tax · October price — $299 from 1 November 2026
  • Existing Next.js app
  • TypeScript
  • PostgreSQL / Supabase
  • Claude Code
  • Codex
  • No runtime dependency
  • Udria claims no ownership

Production Stripe Billing is delivered immediately after payment, by a download link sent to your email.

$199 charged once, never recurring. The download link is yours and keeps working, so a new machine or a second repository costs nothing. Every v1.x update released in the five years after purchase is included.

For existing Next.js + TypeScript apps on PostgreSQL or Supabase, installed by Claude Code or Codex.

Sold by 815MC Ltd, a company registered in England and Wales (company number 14188435). Founded by Roman Grigoriev.

claude code

Install Production Stripe Billing from .udria/
Reading .udria/production-stripe-billing/
Analysing repository...
✓ Next.js 15 · TypeScript · Supabase
✓ organisations and memberships tables found
✓ authentication via Supabase sessions
! no billing tables present
Specification mapped onto your domain model. I will write:
✓ 3 migrations — subscriptions, billing_events, entitlements
✓ webhook route with the event ledger from spec/webhooks
✓ entitlement resolver over your organisations table
✓ proration preview that matches the applied invoice
✓ billing settings and plan picker in your design system
✓ 6 acceptance test files, wired to your schema
Proceed? (y/n) y
Writing to your repository...
✓ 19 files created · 7 modified
Running acceptance suite...
83 / 83 passed
Production Stripe Billing is running in your app.
Illustrative product preview

Why Udria

Stripe solves payments.Udria solves the seam between Stripe and your application.

Stripe gives you APIs, events, Checkout and billing primitives. What it deliberately leaves to you is everything on your side of the line: how billing state maps onto your users and organisations, what each plan actually unlocks, what happens when a webhook arrives twice or out of order, and how you prove any of it works.

Yes — Claude Code or Codex can build Stripe billing without us.

That is not in dispute, and any page that told you otherwise would be worth closing. A capable agent will write the code. What it will also do is choose an architecture from scratch, discover the edge cases the hard way, and leave you to work out afterwards whether the result is actually correct. Production Stripe Billing gives it the decisions and the verification up front.

Building Stripe billing from scratch compared with using Udria
From scratchWith Production Stripe Billing
The agent picks an architectureA proven architecture, supplied
Edge cases surface in productionEdge cases defined before the first line
Tests written afterwards, if at allRunnable acceptance tests included
Billing state invented per projectA domain model already worked out
The same bugs, rediscoveredKnown failure modes documented
Rebuilt from zero on the next projectReuse the decisions, not the debugging

The agent is more than capable. It is working without a specification — and a specification is the part nobody has written down.

What you actually receive

We ship the specification.Your agent writes the code.

Production Stripe Billing is not a boilerplate, not an npm package and not a hosted service. It is the accumulated set of decisions, edge cases and tests that a correct billing implementation needs — in a form a coding agent can apply to a codebase that already exists.

The artifact

A versioned capability package: implementation instructions, architecture, specification, acceptance criteria and runnable TypeScript tests. Human-readable, written to be read by an agent. No compiled library, no runtime dependency on Udria.

How it gets in

Download the package and drop the folder at .udria/production-stripe-billing/in your repository, then tell Claude Code or Codex to install it. No CLI, nothing to trust at runtime, nothing that phones home.

What your agent produces

Code in your repository, in your conventions, against your schema — migrations, a webhook route, an entitlement resolver, proration previews and billing UI. Your implementation stays in your repository, and Udria claims no ownership in the implementation your agent writes.

Installed at .udria/production-stripe-billing/
your-app/
└─ .udria/
   └─ production-stripe-billing/
      ├─ ARTIFACT.md                 master implementation instructions
      ├─ SKILL.md                    Claude Code entry point
      ├─ AGENTS.md                   Codex entry point
      ├─ architecture/
      │  ├─ overview.md
      │  ├─ compatibility.md         supported stacks and rules
      │  └─ decisions/               architecture decision records
      ├─ spec/
      │  ├─ billing-domain.md
      │  ├─ data-model.md
      │  ├─ webhooks.md
      │  ├─ idempotency-and-ordering.md
      │  ├─ subscription-lifecycle.md
      │  ├─ entitlements.md
      │  ├─ plan-changes.md          upgrades, downgrades, cancellation
      │  ├─ customer-portal.md
      │  └─ security.md
      ├─ implementation/
      │  ├─ sequence.md              the order your agent works in
      │  └─ verification.md
      ├─ acceptance/
      │  ├─ criteria.md
      │  └─ tests/                   runnable TypeScript acceptance tests
      └─ troubleshooting.md

What the package covers

  • Master implementation instructions
  • Architecture and decision records
  • Supported-stack and compatibility rules
  • Stripe billing domain specification
  • Database and data model
  • Webhook behaviour
  • Idempotency and event-ordering rules
  • Subscription lifecycle
  • Entitlements
  • Upgrades, downgrades and cancellation
  • Customer portal
  • Security requirements
  • Implementation sequence for Claude Code and Codex
  • Acceptance criteria
  • Runnable TypeScript acceptance tests
  • Troubleshooting and verification

Runnable TypeScript acceptance tests, not just prose. Your agent wires them to your schema and runs them before it reports the work as finished.

The tests are the definition of done: your agent is instructed not to report the work as finished until they run green against your database. You can read the specification and one of the test files below.

Give the package to Claude Code or Codex. It analyses your existing repository, adapts the implementation to it, builds the capability, and verifies the result against Udria's acceptance tests.

The offer

$199once

Download immediately

  • One payment — no subscription
  • No revenue share, ever
  • Delivered immediately, by a link emailed to you
  • Re-download any time, on any machine
  • October price — $299 from 1 November 2026

If your agent gets stuck, that is our problem

Founding customers get direct installation support for 30 days after purchase. If you are on the supported stack and your coding agent hits a problem with the Production Stripe Billing package, we help you get it working — that is the part we are on the hook for.

Supported today

  • Next.js App Router
  • TypeScript
  • PostgreSQL or Supabase
  • Claude Code or Codex
  • An application that already exists
Buy now — $199

Payment is taken by Stripe; we never see your card. Full pricing and the terms are further down.

Why not just Stripe

Stripe has solved payments.It has not solved your domain model.

If you have read the Stripe docs you already know most of billing is handled. We are not going to pretend otherwise.

Stripe already gives you

  • Checkout and embeddable pricing tables
  • Billing subscriptions, with scheduled upgrades and downgrades
  • The hosted Customer Portal
  • Webhook signature verification
  • Dunning with Smart Retries
  • Test clocks
  • The Entitlements API

What is left is the seam between Stripe and your application — roughly twenty decisions about how billing state maps onto your domain model. An agent makes those decisions differently every time you ask.

Enforcing entitlements at runtime

The Entitlements API tells you what a customer is entitled to. It does not gate a request. You cannot call Stripe on every authorisation check, so every check needs a local answer that is still correct milliseconds after a webhook lands.

Your tenancy model

Stripe knows customers and subscriptions. It does not know your organisations table, your roles, or your RLS policies. Turning a subscription into “which member of which org may do what” is application work, and it is different in every application.

Seat accounting

Quantity on a subscription item is a number. Deciding what happens when the sixth person is invited to a five-seat plan — block, queue, or bill the overage — is a product decision enforced against your data, not Stripe's.

Webhook reconciliation

Stripe verifies the signature. Idempotency, out-of-order delivery, replay against your schema, and what you do when Stripe and your database disagree are all yours. This is where the expensive bugs live.

Degrading gracefully

A card fails on day 40 and Smart Retries works the dunning. What does your product actually do on day 41, day 47 and day 50? Most teams never decide this deliberately — the behaviour is whatever the code happened to do.

Testing the states that break

Test clocks exist. Suites that use them mostly don't. The states that lose customers are precisely the ones nobody wrote a test for, because reproducing them by hand takes a fortnight.

Udria specifies all twenty, with the edge cases written down and a test for each one, so your agent makes the same decisions a team that has shipped billing three times would make.

Claude writes the code.Udria provides the playbook.

From scratch

“Add Stripe subscriptions.”

  • architecture?
  • event ordering?
  • schema?
  • entitlements?
  • seats?
  • retries?
  • dunning?
  • tests?

Every answer gets rediscovered, slightly differently, in every project — and you only find out which answer you got in production.

With Udria

Install production-stripe-billing from .udria/

  • architecture specified
  • edge cases defined
  • implementation workflow
  • acceptance tests included
  • repository-aware adaptation
  • verification before done

The agent starts from a known-good architecture instead of a blank page.

Don’t spend AI tokens rediscovering known software architecture.

The architecture

Billing as a domain, not a payment button.

Your application keeps its own billing state rather than asking Stripe a question every time it decides whether a user can do something. Stripe events reconcile into that state; entitlements read from it.

UserYour applicationBilling domainStripeLocal stateEventsEntitlements
  • Migrations for subscriptions, the event ledger and entitlements
  • A webhook route with idempotent, replay-safe ingestion
  • An entitlement resolver your authorisation checks call
  • Proration preview that matches the invoice actually charged
  • Dunning and degradation states
  • Pricing page, billing settings and portal hand-off in your design system

The result

A billing surface that looks like the rest of your product.

Plan, renewal date, payment method and invoices — generated with your existing design system, inside your existing settings area.

yourapp.com/settings/billing

Current plan

Pro$49 / month

Active
Plan
Pro · monthly
Renews
12 Sep 2026
Payment method
Visa ·· 4242

Invoices

  • 12 Aug 2026$196.00
  • 12 Jul 2026$196.00
  • 12 Jun 2026$147.00

Illustrative product preview

Stripe stays yours

Your Stripe account, your keys, your payouts. Udria never sits between you and your customers’ money, and takes no percentage of it.

Your application already exists.Why rebuild it around somebody else's starter kit?

Most SaaS boilerplates are excellent when you’re starting from an empty repository. But what happens when you’ve already built your product?

Production Stripe Billing is designed to be installed into the application you already have. Your agent reads your users, organisations, database conventions and design system first, then adapts the billing implementation around them.

Traditional boilerplate compared with Udria
Traditional boilerplateUdria
Start from our repositoryKeep your repository
Adapt your app to the templateAdapt the capability to your app
We ship application codeWe ship the specification, your agent writes the code
Fixed architectureRepository-aware integration
You integrateYour coding agent integrates
Tests varyAcceptance tests included and run before done

Look inside

This is the actual package.Read it before you buy.

The terminal above is a scripted preview and says so. These two files are not previews. They are the webhook specification and one of the acceptance test files exactly as they ship in version 1.0.0.

For a knowledge product the sample is the proof, so judge Udria on this rather than on the marketing above it. If it does not tell you something you did not already know, do not buy it.

.udria/production-stripe-billing/spec/webhooks.md

# Webhook ingestion

> Excerpt from `.udria/production-stripe-billing/spec/webhooks.md`.

Stripe verifies the signature. Everything after that is yours, and it is where
the bugs live. This section specifies ingestion; entitlement resolution is
specified in `entitlements.md`, and event ordering in
`idempotency-and-ordering.md`.

## Invariants

The agent MUST satisfy all five before this section is considered implemented.

1. **Signature.** Reject any request whose signature fails `constructEvent`,
   with 400, before the body is parsed or persisted.
2. **Idempotency.** Processing the same `event.id` twice MUST leave the
   database byte-identical to processing it once.
3. **Ordering.** Stripe does not guarantee delivery order. Applying an older
   event after a newer one MUST NOT move billing state backwards.
4. **Durability.** An event is acknowledged only once its business effect is
   committed. An event that has been *received* but not *processed* MUST NOT
   be mistaken for one that has been processed.
5. **Reconciliation.** Where local state and Stripe disagree, Stripe wins, and
   the disagreement is recorded rather than silently overwritten.

## Seen is not processed

Invariant 4 is the one that is usually implemented wrongly, and the wrong
implementation is the natural one:

```
insert into billing_events (id, ...) values (...) on conflict (id) do nothing
-- zero rows means we have seen this event; acknowledge with 200 and stop
```

Trace a transient failure through it. The first delivery inserts the row. The
business effect then fails — a pool timeout, a failover, a deadlock. The
endpoint correctly returns non-2xx, so Stripe retries. The retry inserts,
conflicts, gets zero rows, concludes "duplicate", and returns 200. Stripe is
now satisfied and stops retrying, and the event has been processed by nobody.
A subscription is never activated, a customer is never granted what they paid
for, and no error is raised anywhere, because every individual component did
what it was told.

The ledger therefore records two different facts, separately:

```text
received   — this event id has arrived at least once
processed  — this event's business effect is committed
```

A duplicate delivery is only a no-op when the second fact is true.

## Ledger table

```sql
create table billing_events (
  id                    text primary key,          -- Stripe's event.id
  type                  text        not null,
  status                text        not null default 'processing',
  received_at           timestamptz not null default now(),
  processing_started_at timestamptz not null default now(),
  processed_at          timestamptz,
  attempt_count         integer     not null default 1,
  last_error            text,
  last_error_at         timestamptz,
  constraint billing_events_status_check
    check (status in ('processing', 'processed', 'failed_permanent'))
);
```

Three states, and deliberately not more:

| `status` | Meaning |
| --- | --- |
| `processing` | Claimed by an instance. The business effect is not committed. |
| `processed` | The business effect is committed. `processed_at` is set. |
| `failed_permanent` | Retrying cannot help. Terminal, with the reason recorded. |

There is no separate `failed_recoverable`. A handler that failed recoverably
and a handler whose process was killed leave the database in the same
condition, and giving them one state gives them one recovery path instead of
two that have to be kept in step.

## Claiming an event

A claim is a **lease**, not a flag. One statement, and it is atomic:

```sql
insert into billing_events (id, type, status, attempt_count, processing_started_at)
values ($1, $2, 'processing', 1, now())
on conflict (id) do update
   set status                = 'processing',
       attempt_count         = billing_events.attempt_count + 1,
       processing_started_at = now(),
       last_error            = null
 where billing_events.status = 'processing'
   and billing_events.processing_started_at < now() - interval '3 minutes'
returning attempt_count
```

`on conflict do update` takes a row lock, so two deliveries arriving together
serialise on it: the loser re-evaluates its `where` against the winner's
committed row, sees a fresh lease, and matches nothing. That is a database
guarantee, so it holds across every instance you are running. An in-memory
mutex does not, and MUST NOT be used for this.

One row back means the event is yours to process. Zero rows means one of three
things, and the difference decides the response:

| Ledger state | Response | Why |
| --- | --- | --- |
| `processed` | 200 | The genuine duplicate. Do no further work. |
| `failed_permanent` | 200 | Retrying cannot repair it. Stripe must stop. |
| `processing`, lease live | **non-2xx** | Another instance has it. Let Stripe redeliver. |

The lease interval MUST exceed your maximum handler duration. Set it shorter
and a slow-but-healthy handler has its event stolen, and the business effect
runs twice in parallel — the failure this table exists to prevent.

## Completing an event

```text
1. Verify the Stripe signature.
2. Atomically claim the event id, as above.
3. If it is already processed, or terminally failed, return 200 and stop.
4. If another instance holds a live lease, return non-2xx and stop.
5. Apply the business effect, idempotently (see below).
6. Only now mark processed and set processed_at.
7. Return 200.
```

Step 6 is the only write on which correctness depends, and it is on the happy
path. Everything else may fail and self-heal.

**Do not compensate by deleting the claim row.** It is the tempting fix — the
handler failed, so remove the claim and let the retry re-claim it — and it
puts correctness in the hands of the failure path. The most common reason a
handler fails is that the database is unreachable, which is also the reason
the compensating delete will fail, and then the row stays behind unprocessed
and every retry is rejected as a duplicate. You have reintroduced the original
bug by a longer route. Let the lease expire instead: doing nothing is already
correct.

## Failure handling

Return non-2xx **only** when a retry could succeed — a database outage, a
timeout, a rate limit. On that path, record the error and set
`processing_started_at` into the past so the next delivery can reclaim
immediately rather than waiting the lease out. This write is best-effort: if
it fails, the lease expires and recovery happens anyway, just later.

Return 2xx and set `failed_permanent` for anything a retry cannot fix — a
malformed payload, an event about an object that does not exist locally and
never will. Classify conservatively: treating a transient fault as permanent
loses the event, while treating a permanent fault as transient costs three days
of retries and leaves a row you can see. Default to recoverable.

`attempt_count >= 5` MUST raise an operational alert. Deciding what "alert"
means is the host application's choice; the specification only requires that
silence is not an option.

## The ledger is not the only defence

Transport-level deduplication tells you an event arrived twice. It cannot tell
you a handler crashed after writing and before acknowledging, and no amount of
ledger design will, because the business write and the ledger write cannot be
made atomic once a Stripe API call or an email send sits between them.

So every business effect MUST be independently idempotent, keyed on a stable
Stripe identifier:

| Effect | What makes a second run a no-op |
| --- | --- |
| Link customer to account | `unique (stripe_customer_id)` |
| Create local subscription | `unique (stripe_subscription_id)` |
| Record an invoice | `unique (stripe_invoice_id)` |
| Grant seats | Set the absolute quantity; never increment |
| Append a lifecycle row | `unique (stripe_event_id, subscription_id)` |
| Send a customer email | Claim a `unique (subscription_id, kind)` row first |

Written this way, replaying an event is safe whether or not the ledger
remembers it — which is the only defence that survives a process dying at the
worst possible moment.

## Ordering

Stripe does not deliver in creation order, and `event.created` has one-second
resolution — two subscription updates in the same second are common on a plan
change with proration. So:

**Do not** write `if (event.created <= last_event_at) discard`. With
second-resolution timestamps that discards legitimate newer state, and the
symptom is a customer on the wrong plan with nothing in the logs.

Nor is a status guard sufficient on its own. `customer.subscription.updated`
carrying `status: canceled` is a legitimate transition out of `active` and a
stale redelivery of a cancellation that was already reversed — the same event
shape, the same local status, opposite correct outcomes. No rule that looks
only at the event and the current row can separate them.

Order per object, never globally, and pick the weakest mechanism that is
actually sufficient for the transition in front of you:

1. **Re-fetch, for anything with a lifecycle.** For subscription- and
   invoice-shaped events, treat the event as a notification that something
   changed, retrieve the object from Stripe, and apply what comes back.
   Delivery order then stops mattering: whichever event you process last, you
   converge on Stripe's current state, which is the state that is true.
   This is the default for every event in the V1 table below.
2. **A status guard, for transitions that are genuinely one-way.** Where a
   local status can never be legitimately re-entered — a reservation that has
   been charged, an invoice already marked void — name the statuses the
   transition may move *from* and make that the `where` clause. Exact, cheap,
   and no extra round trip. It is only safe because the transition is
   irreversible; do not reach for it otherwise.
3. **A stored object version, where Stripe gives you one.** Some objects carry
   a monotonically increasing marker you can persist on the row and compare.
   Where one exists it is cheaper than a re-fetch and just as ordered.

Record every discarded or superseded event with its reason. A discard you
cannot see later is indistinguishable from a bug.

## Events in scope for V1

| Event | Effect |
| --- | --- |
| `checkout.session.completed` | Link the Stripe customer to the local account |
| `customer.subscription.created` | Create local subscription, grant entitlements |
| `customer.subscription.updated` | Re-resolve plan, period, cancellation and seat allowance |
| `customer.subscription.deleted` | End entitlements at `ended_at`, which is not always now |
| `invoice.paid` | Clear any dunning state, extend the period |
| `invoice.payment_failed` | Enter dunning; see `subscription-lifecycle.md` |

`customer.subscription.deleted` fires in two different situations and they do
not end access at the same moment: a cancellation scheduled with
`cancel_at_period_end` has already served the period the customer paid for,
while an immediate cancellation or a failed final payment has not. Read
`ended_at` from the object rather than assuming either. Keep the subscription
row and its history; end the entitlement, do not delete the record.

Events outside this table MUST be recorded in the ledger and ignored. Handling
an event the specification does not cover is out of scope, not a bonus.

Verification

“It compiled” isn’t the same as “billing works.”

The package doesn’t only tell your agent what to build. It tells it how to prove the implementation behaves correctly, and it does not consider the work finished until the suite runs green against your database.

Production Stripe Billing ships six spec files covering the states that actually lose customers. You can read one of them above.

acceptance suite

npm run test:billing
billing acceptance suite
✓ new subscription grants entitlement
✓ duplicate webhook has no duplicate effect
✓ invalid signature rejected before any write
✓ out-of-order events do not move state backwards
✓ cancellation retains access until period end
✓ upgrade applies entitlement immediately
✓ downgrade applies at period boundary
✓ failed payment degrades access on day 47
✓ reactivation restores access
✓ organisation boundaries respected
✓ proration preview matches the charge that lands
83 / 83 passed
Illustrative product preview

How it works

Three steps, inside your own repository.

  1. Install

    Drop the Udria package into .udria/ and tell Claude Code or Codex to install it.

  2. Adapt

    The agent reads your repository and maps the billing architecture onto your actual tables, roles and design system.

  3. Verify

    The included acceptance tests are wired to your schema and executed before the implementation counts as complete.

The agent does the labour. Udria provides the accumulated product and engineering knowledge.

Ask your AI whether Udria makes sense

Researching Production Stripe Billing with ChatGPT, Claude or another assistant? We've prepared a factual brief covering exactly what the product does, how installation works, what it costs and where its limitations are.

Open AI brief

Pricing

Founding release

One payment. No subscription, no revenue share, no marketplace membership.

$199

Charged once, exclusive of VAT or sales tax. October price — $299 from 1 November 2026.

Download immediately

Buy now — $199

Production Stripe Billing is delivered immediately after payment, by a download link sent to your email.

  • $199 is charged once, now. There is no subscription.
  • Production Stripe Billing downloads immediately — the link is emailed to you.
  • The link keeps working, from any machine, for re-downloads.
  • Every v1.x update published in the five years after purchase is included at no further cost.

Sold by 815MC Ltd, a company registered in England and Wales (company number 14188435). Founded by Roman Grigoriev.

Compatibility refund: if the compatibility page lists your setup as supported and the unmodified preflight check says it is not, send us the report within 14 days of purchase, before deploying to production, and we refund you. Business sales are otherwise final.

Buying for personal use in the UK? You can also cancel within 14 days for a full refund, as long as the download has not started.

Check your setup on the compatibility page; full conditions are in the terms.

Included

  • Every update to Production Stripe Billing v1.x for five years after purchase
  • Email installation support for 30 days after purchase if your coding agent hits a problem with the Udria package

Installation support covers the Udria package and getting it installed. It is not general engineering support for your application.

What $199 actually buys

The package itself, every v1.x update for five years as the capability improves, and someone to ask for 30 days when your agent gets stuck part-way through an install. The files are the smallest part of it.

Stripe’s payment-processing fees and your own Claude or Codex usage costs are not included. Production Stripe Billing is licensed to you, not sold — clause 13.1 — with no recurring fee and no revenue share. The implementation your agent writes is a different thing, and we claim no ownership in it.

Before you buy — is this your stack?

V1 supports

  • Next.js App Router
  • TypeScript
  • PostgreSQL or Supabase
  • Claude Code or Codex
  • An application that already exists

Not yet

  • Rails, Django, Laravel, Go, .NET
  • MySQL, MongoDB, Firestore
  • Marketplaces and Stripe Connect
  • Mobile app-store billing
  • A greenfield project with no code yet

If it isn’t your stack, don’t buy — tell us what you use instead. That list decides what we build second.

Roman Grigoriev

The founder

Why I’m building this

I’ve spent years building software products, and coding agents have changed the economics of making them. But something odd happens every time.

We ask Claude or Codex to build a common capability, and the model rediscovers years of accumulated knowledge from scratch — differently each time. Billing. Permissions. CRMs. Scheduling. Document signing. Approval workflows.

The code is getting cheaper. Knowing exactly what should be built is getting more valuable.

Production Stripe Billing is the first experiment. If it works, we build the same kind of capability for the next recurring problem.

— Roman Grigoriev

Connect with Roman on LinkedIn

Udria is operated by 815MC Ltd. Questions go to hello@udria.co.

The bigger idea

Billing is only the beginning.

Our thesis is simple:

Coding agents shouldn’t reinvent solved software capabilities.

We’re starting with billing. If developers want it, we build the next one. Search Udria before you build it from scratch.

  • Available firstNo. 01 · Available now

    Production Stripe Billing

  • CRM
  • E-signatures
  • Scheduling
  • Permissions
  • Notifications
  • Audit logs
  • Approvals
  • Customer support
  • Documents

FAQ

Questions worth answering before you enter a card.

Anything not covered here — hello@udria.co.

Claude Code can already build Stripe billing. Why do I need this?
It can, and we would rather say so than pretend otherwise. The difference is not capability, it is starting conditions. Without a specification your agent picks an architecture, finds the edge cases in production, and leaves you to work out afterwards whether the result is correct. With Production Stripe Billing it starts from a domain model that is already worked out, failure modes that are already documented, and acceptance tests it has to pass before it reports the work finished. You are not buying the ability to write the code. You are buying not having to rediscover the decisions.
Why $199?
Measure it against the work it removes, not against the size of the download. Production billing is usually several days of deciding, building and debugging — entitlement enforcement, webhook idempotency, event ordering, proration, the failure states — and then the same days again on the next project. $199 once is priced against that. If your agent would have got there in an afternoon, do not buy it.
Who owns the code my agent writes?
Your implementation stays in your repository, and Udria claims no ownership in it. Where anything of ours is necessarily embedded in what your agent produces, clause 6.2 of the terms gives you a perpetual licence to it. There is no runtime dependency on Udria, nothing phones home, and nothing stops working if we disappear. What we do not claim is that output from a third-party AI is free of third-party rights — nobody selling you a package can honestly warrant that, and your agreement with your AI provider governs its output. Clauses 6.3 and 6.4 say so rather than leaving it to be inferred.
Is Udria affiliated with Stripe?
No. Udria is independent and is not affiliated with, endorsed by or sponsored by Stripe, Inc. Stripe is a trademark of Stripe, Inc. Stripe remains your payment provider and your money goes to your own Stripe account.
Why not just use Stripe Billing, the Customer Portal and the Entitlements API?
Use all three — this package assumes you do. Stripe solves payments, subscriptions, dunning and the portal, and we are not competing with any of that. What Stripe cannot do is decide how billing state maps onto your domain model. The Entitlements API tells you what a customer is entitled to; it does not gate a request, and you cannot call Stripe on every authorisation check, so the enforcement lives in your database. Stripe also knows nothing about your organisations table, your roles or your RLS policies, so seat limits and tenancy boundaries are yours. And after signature verification, idempotency, event ordering, replay and reconciliation are yours too. That seam is what this specifies.
What exactly do I download?
A versioned capability package: master implementation instructions, architecture and decision records, compatibility rules, the Stripe billing domain specification, data model, webhook behaviour, idempotency and ordering rules, subscription lifecycle, entitlements, plan changes, customer portal, security requirements, the implementation sequence for your agent, acceptance criteria, runnable TypeScript tests and troubleshooting. You put the folder at .udria/production-stripe-billing/ in your own repository. There is no CLI, no runtime dependency and nothing that phones home.
Can I see a sample before I buy?
Yes — the webhook specification and one full acceptance test file are on this page, under Look inside. They are the real files, not a mock-up.
Who writes the code — Udria or my agent?
Your agent. We ship specification, decisions and tests; Claude Code or Codex writes the implementation into your repository, in your conventions, against your schema. Your implementation stays in your repository, Udria claims no ownership in it, and there is nothing of ours left running in it.
Is this a SaaS boilerplate?
No. A boilerplate is a repository you start from. This is installed into an application you have already built.
When will I get it?
Production Stripe Billing is delivered immediately after payment, by a download link sent to your email. The link is in your inbox within seconds of paying, and it keeps working — you do not have to download everything at once.
When am I charged?
Once, at the time of the order: $199, exclusive of any VAT or sales tax we are required to collect. There is no subscription and no second charge. Every v1.x update published in the five years after purchase is included at no further cost.
What if it does not fit my stack?
Check the compatibility page before buying — it forms part of the agreement. If you are on a stack it lists as supported and the preflight refuses to install, our compatibility refund applies: send us the preflight report within 14 days of purchase, before deploying to production.
What support do founding customers get?
Every update to Production Stripe Billing v1.x for five years after purchase, and email help for 30 days if your coding agent hits a problem installing the Udria package. Installation support covers the Udria package and getting it installed. It is not general engineering support for your application.
Is my card stored by Udria?
No. Card details never touch our servers. Stripe collects the payment, and we never see or store the card.
What stack does V1 support?
Production Stripe Billing V1 targets existing Next.js applications in TypeScript on PostgreSQL or Supabase, installed by Claude Code or Codex. We deliberately do not claim universal compatibility. If that isn't you, tell us your stack instead of buying.
Do you host my billing or take a percentage?
Neither. Stripe remains your payment provider, the money goes to your account, and we take none of it.
Do I need to know Stripe?
Some technical ability is essential — you are reviewing and shipping the code your agent writes. But the architectural work, which is the part that usually takes a week of reading, is already done.
Does it include Stripe fees or my AI usage?
No to both. Stripe's processing fees stay between you and Stripe, and you pay for your own Claude or Codex usage.

Stop asking Claude to reinvent Stripe billing.

Install the specified version instead.

Buy now — $199

Production Stripe Billing is delivered immediately after payment, by a download link sent to your email.

Buy now — $199