“We were giving away about three percent of our minutes and had no idea which customers it was.”
Know what every request costs,before you invoice for it.
Usage metering and billing ledgers for indie SaaS.
| Customer | Draft | State |
|---|---|---|
| Hollowell Studios | $711.65 | Review |
| Brackwater FM | $329.52 | Review |
| Lantern Hour | $94.52 | Approved |
| Marlow & Finch | $0.00 | Drift |
Closing the books every month for small software companies like these.
No invoice leaves until the ledger balances.
Three moves, in the order your money moves. Click through them; each panel is the real screen you will use.
import { Penrule } from "@penrule/node"; const ledger = new Penrule(process.env.PENRULE_KEY); // after a job finishes, once per job await ledger.record({ customer: "cus_brackwater", meter: "audio.minutes", quantity: 42.5, idempotencyKey: job.id, });
Retries are safe: the idempotency key keeps a job from being counted twice.
| Meter | Metered | Delta |
|---|---|---|
| audio.minutes | 412,880 | 0 |
| diarized.minutes | 18,402 | 18,402 |
| storage.gb_months | 1,204 | 0 |
| seats | 38 | 0 |
diarized.minutes and back-price this period.
Based on your rate for audio.minutes plus your published diarization add-on.
Rules are versioned. Changing a price never rewrites past lines; it adds new ones.
Period Mar 1 to Mar 31, 2026
Net 14
| Line | Qty | Amount |
|---|---|---|
| Audio transcriptionaudio.minutes at $0.0050 | 61,240 | $306.20 |
| Speaker diarizationdiarized.minutes at $0.0040 | 4,880 | $19.52 |
| Archive storagestorage.gb_months at $0.10 | 38 | $3.80 |
Built like a ledger, not a dashboard.
Nothing is edited. Corrections are new lines.
Each line is hash-chained to the one before it, so any number on an invoice traces back to the events that made it.
Undercharging shows up the next morning.
Your customers see the numbers you see.
Approved drafts go wherever you already bill from.
A signed webhook, a REST endpoint and a nightly CSV. Penrule never charges a card; it hands your billing provider a number you have already checked.
POST /hooks/penrule invoice.approved { "invoice": "INV-2026-0318", "customer": "cus_brackwater", "period": "2026-03", "total": 39542, "currency": "usd", "price_book": "v7", "ledger_head": "9f3c...e41a" }
Built for people who keep their own books.
“The approval gate is the feature. I read every draft for thirty seconds, then I stop thinking about billing.”
“We left a spreadsheet for Penrule in an afternoon. The first nightly check found a customer billed on the wrong plan.”
“Tile requests, seats and storage on one invoice, with the rule printed beside each line. Billing tickets nearly stopped.”
Three ways to meter usage.
| Criterion | Month-end spreadsheetWhat most of us start with | Built in-houseA table, a cron job, a weekend | PenruleA ledger for this one job |
|---|---|---|---|
| Where it shines | Familiar, free, endlessly flexible | Fits your stack and data model exactly | Metering, pricing and approval in one record |
| Time to a trusted invoice | Two days, every month | Six to ten weeks of build | One afternoon to instrument |
| Catches undercharging | Only if someone notices | If you write and maintain the checks | Nightly, per customer, per meter |
| Audit trail | Cell history, at best | Whatever you remembered to log | Append-only and hash-chained |
| Who maintains it | You, at every month-end | You, forever | We do, or you self-host the same code |
| Cost | Free, plus your evenings | About a quarter of an engineer | From $19 a month, flat |
Build estimates come from our own first attempt in 2022, and from conversations with 31 teams who moved to Penrule.
One meter, three ways to run it.
Flat prices. We never take a percentage of what you bill.
Estimate your month
Drag to your expected volume. Overage is billed per 100k events, never per invoice.
Your numbers stay yours.
Billing data is the most sensitive data a small company holds. We treat it that way, and we write down exactly how.
Read the security overviewTamper-evident ledger
SHA-256 chainEvery line carries the hash of the line before it. A daily head hash is emailed to you, so you can prove nothing changed.
Pick where data lives
EU or USChoose Frankfurt or Virginia when you create a workspace. Ledgers, backups and logs stay in that region.
Keys that can only write
scoped keysServer keys can record events and nothing else. Reading invoices or changing prices needs a separate, rotatable key.
Self-host the same code
1 containerThe Self-host license runs the exact build we run, as one container with Postgres. Your ledger never leaves your network.
Questions founders ask before switching.
Something missing? Write to us. A founder answers, usually the same day.
hello@penrule.appA small tool from a small team.
Two of us ran a usage-billed API for four years. On the last weekend of every month we exported logs, pasted them into a spreadsheet and hoped the formulas still matched the pricing page. They often did not.
Penrule is the tool we wanted then: a ledger that records every billable event once, prices it with a rule you can read, and refuses to invoice until the numbers agree. We are self-funded, we answer support ourselves, and we charge a flat price because metering software should not take a cut of your revenue.
Your first balanced ledger, this afternoon.
Fourteen days free on any plan. We only ask for a card after you approve your first real invoice.
- Instrument one meter with a single call
- Import your current pricing page as a price book
- Reconcile last month before you trust this one
Your workspace is ready.
We sent a sign-in link to your inbox. It expires in 15 minutes.
What changed, line by line.
Every release, dated. We ship small changes most weeks and never change how past lines are priced.
Nothing in the ledger matches that.
Try a different word, or clear the filters to see every release.
Quickstart: a first balanced ledger.
About forty minutes from an empty workspace to an approved draft. You need a server-side key and one place in your code where billable work finishes.
Create a key
In Settings, API keys, create a write-only server key. It can record events and nothing else, so it is safe to keep in your worker environment as PENRULE_KEY.
Install the SDK
Official SDKs for Node and Python, or call the REST endpoint directly.
Record an event
Call record once per finished unit of work, with the customer ID you already use and a stable idempotency key. Penrule accepts events up to 35 days late and places them in the right period.
- Quantities can be decimals; rounding happens at invoice time, per rule.
- Unknown meters are accepted and flagged as drift, never dropped.
Add a price rule
Open Price book and describe each meter: a flat unit price, tiers, a monthly minimum or a per-seat fee. Import your public pricing page and Penrule drafts the rules for you to check.
Approve a draft
At period close, drafts appear in Invoices with three checks beside them. Approve one and it is sent to your billing provider by webhook. That is the whole loop.
Start a workspace or read the security overview.
How Kettleby stopped giving away three percent of its minutes.
A two-person transcription API, 214 podcast studios as customers, and a month-end spreadsheet that had quietly stopped matching the pricing page.
Before
Kettleby bills podcast studios by the minute of audio it transcribes, with an add-on for speaker diarization and a small fee for archive storage. Hanna Lindqvist wrote the first billing script in an evening in 2023. By 2026 it was a spreadsheet, two scripts and a calendar reminder called "do the bills".
The pricing page had changed three times since. The spreadsheet had changed twice.
The switch
Hanna added one record call at the end of each transcription job and imported the pricing page as a price book. Penrule drafted rules for audio and storage and flagged diarization as a meter with no rule at all.
The first close
The first nightly reconciliation replayed February. It found 18,402 diarized minutes that had never been priced, and two studios still on a trial plan that had ended. Together that was $1,284 of usage nobody had billed.
Kettleby back-priced the current period only and wrote to the two studios before their next invoice. Neither objected; both asked for the usage page.
Now
Month-end takes about forty minutes: read the drafts, look at anything more than fifteen percent off last month, approve. There have been no disputed invoices since March.
Security overview
How we store, protect and prove your billing data. Plain language first; the technical detail follows each point.
Last reviewed September 14, 2026
Ledger integrity
The ledger is append-only. Every line stores the SHA-256 hash of the previous line, and each night we email you the head hash. If a single historic line changed, every hash after it would stop matching.
Data and residency
You choose the EU (Frankfurt) or the US (Virginia) when creating a workspace. Ledgers, backups and logs stay in that region. Data is encrypted at rest with AES-256 and in transit with TLS 1.3.
- Backups every six hours, kept for 35 days.
- Full ledger export as CSV or Parquet at any time.
- Deleted workspaces are purged from backups within 35 days.
Access
Server keys are write-only. Read keys and admin sessions are separate, scoped and rotatable. Workspace roles are owner, approver and viewer; only approvers can release a draft invoice.
Infrastructure
Penrule runs on a major cloud provider in two regions, with a transactional email provider for sign-in links and digests. We list every subprocessor in our privacy notice and give 30 days' notice before adding one.
Reporting an issue
Email security@penrule.app. We reply within one working day and credit researchers who ask to be credited.
Welcome back to the ledger.
We email you a one-time link. No passwords to keep, nothing to reset.
Check your inbox.
We sent a sign-in link. It works once and expires in 15 minutes.
Privacy notice
Effective June 1, 2026. Penrule Ltd, Leeds, United Kingdom.
What we collect
Account data (name, work email, company), billing data you send us as usage events, and basic service logs (IP address, user agent, request time). We do not use advertising cookies or third-party trackers on this site or in the app.
Why we collect it
To run the service you signed up for, to keep it secure and to send the emails you asked for. For usage events you are the controller and we are your processor; our data processing agreement applies automatically.
Who we share it with
- Cloud hosting, in the region you choose.
- A transactional email provider, for sign-in links and digests.
- Our payment processor, for your own Penrule subscription only.
Your rights
You can access, export, correct or delete your data at any time from Settings, or by writing to privacy@penrule.app. We answer within 30 days, usually much sooner.
Terms of service
Effective June 1, 2026. A plain summary; the full agreement is sent with your first invoice.
The service
Penrule records usage events you send, prices them with rules you write and drafts invoices for you to approve. You are responsible for the prices you set and the invoices you approve; we are responsible for recording and computing them exactly as configured.
Paying us
Plans are billed monthly or yearly in advance; overage is billed monthly in arrears per 100,000 events. Self-host licenses are a one-time fee with a year of updates.
Your data
Your ledger is yours. You can export it in full at any time, including after you cancel, for 35 days.
Ending
Cancel from Settings at any time; the plan runs to the end of the period you paid for. We may end the agreement with 60 days' notice, or immediately for abuse of the service.
This page is not in the ledger.
The link may be old, or the page moved. Everything we publish is reachable from the home page.