You ship your AI product. tack does the boring part.

Under every AI product there is hard, boring work: keeping customers apart, collecting money before the model spends it, deciding what the AI may do, and writing every step down. tack is that part, already built. You write the tools and screens that make your product yours.

For builders who charge money.

Get a key → See how it works two API calls to a live tenant
In production at synoveoAI-native SaaS for lodging: every property is a tenant minuitagency: AI builds for clients, one project per client

Every turn writes both books. In one transaction.

A ship's log is the record that holds up afterwards. tack keeps one for your AI: usage and money, committed together. Both or neither.

usage_ledgerwallet_ledger org_01J9 / dentalintake-prod / ten_04QF balance 3,418.00 u
entries marked ⎣ txn commit in the same database transaction: both or neither. A refused turn writes its audit row and costs 0.

Two API calls between a signup and their AI answering.

01

Create a tenant

From your own signup code. Idempotent: retries can't fork a customer.

POST /v1/tenants { "external_ref": "cus_9f2k" }
02

Submit a turn

Stream the reply over plain SSE. Tools call back into your codebase, signed.

POST /v1/turns { "tenant": "ten_04qf", "message": "Book me Tuesday" }
03

Bill in turns

Usage rolls up per tenant. Price your product per turn: the spread is your margin.

GET /v1/usage?group=tenant → invoice your customers on it

Pick your anxiety. It has a table.

Enforced in the schema and the type system, not asserted in comments. When a customer disputes a bill, "trust us" is not an answer.

IDGuaranteeMechanism
MTR-01A turn that can't pay never runsPrepaid wallet checked before every turn; hard cap; the usage row and the wallet debit commit in one transaction. Refusals cost 0 and are audited.
ISO-01Tenants cannot see each otherorg → project → tenant from migration 0001. Every row, Redis key, queue job and trace carries the tuple; a foreign tenant id is a 404.
CLR-01Access fails closedYour backend asserts what a user earned; tack computes min(ceiling, earned) once per turn. Unknown rung → ladder floor.
TOOL-01A broken tool degrades a turn, never kills itPer-tool timeout resolves to an error envelope; the model works around it. Repeated failure raises tool_degraded: failure is routed, not accidental.
AUD-01Every AI decision is reconstructibleSpan tree per turn, tool inputs/results, clearance verdict, cost by trace id. Cost is read from the ledger, never recomputed.

Boring technology, arranged carefully. No exotic databases, no bespoke protocols: parts your team already knows how to operate.

Yours
your appscreens, auth, business logic · untouched
your toolsHTTPS callbacks living in your codebase
The wire
https · sse · webhooksplain protocols, signed both ways · no SDK required
The engine
tack-serverAPI keys · org / project / tenant · durable turn queue
@tack/runtimethe turn loop · pre-emit guards · transcript memory
@tack/registrytool contracts · clearance · confirmation gates
@tack/retrievalhybrid search · access control per leg, before fusion
@tack/ledgermetering · wallets · the atomic debit
@tack/gatewaymodel calls · managed keys · circuit breakers
The substrate
postgresthe money and the memory · fails closed
redisqueues and brakes · fails open, counted and alerted
frontier modelsmanaged keys · you never hold a provider key

Prompt injection is assumed, not hoped away. Controls map to MITRE ATLAS; the adversarial suite replays these classes, against the money path and across tenants, as a release gate.

ATLASTechniqueControl
AML.T0051LLM Prompt InjectionInjected instructions can only ask for what the turn could already see: context is clearance-gated before injection, retrieval is tenant-keyed before ranking, a pre-emit guard screens output. Denial by structural absence.
AML.T0054LLM JailbreakGuardrails are semantic judges, not regex lists, running pre-emit inside the stream. Abuse ceilings brake repeat probing.
AML.T0057LLM Data LeakageYour sensitivity vocabulary maps to retrieval floors; the reserved never class is structurally unretrievable; redacted fields are stripped before model, storage, webhooks.
AML.T0086Exfiltration via Agent Tool InvocationTools are clearance-gated per turn; tenant identity and the verdict ride the signed server envelope, never the model-visible schema.
AML.T0034Cost HarvestingPrepaid wallets, hard caps, fair-use envelopes, per-tenant kill switch. The bill cannot be weaponized.
AML.T0029Denial of AI ServicePer-tenant concurrency slots, fair scheduling: a hot tenant deepens its own queue, never a neighbor's.

Full threat model, DPA and disclosure policy → security

Gateways proxy calls. Frameworks structure code. Billing platforms meter events you define. None will run your customer's turn, refuse it when the wallet is empty, and hand you a unit to invoice. The business engine is a new category.

Runs the turnKeeps the booksIsolates tenantsUnit you can bill on
Model gatewaysproxies callsper-key budgetstokens
Agent frameworksin your code
Usage-billing platformsmeters your eventsyou define it
Build it yourself≈ 6 months≈ 6 monthsif you get it righteventually
tackthe productatomic ledger + walletby constructionthe turn

The six months you don't spend.

Every AI SaaS rebuilds the same subsystems before it can send its first invoice. None of them are your product. They are runway burned before go-to-market.

SubsystemBuild yourself¹On tack
Metering + usage ledger4 wkincluded
Prepaid wallets, top-ups, billing reconciliation5 wkincluded
Tenant isolation: rows, caches, queues3 wkincluded
Permissions for AI: clearance, channel ceilings3 wkincluded
Tool safety: timeouts, confirmations, idempotency3 wkincluded
Audit trail + trace explorer3 wkincluded
Cost control: caps, kill switches, fair-use envelopes2 wkincluded
Runway spent before your first invoice≈ 6 monthsday one

1 Typical single-engineer estimates for a production-grade version, not a demo. Your mileage varies; the total doesn't shrink much.

Built for our own products first.

tack wasn't built to be sold. It was extracted from a SaaS that needed all of it in production. Then a second business put it to work.

synoveo
AI-native SaaS · customer zero

Guest-facing and back-office AI for lodging businesses. Every property is a tenant; every reply, booking action and escalation runs as a metered turn with a full audit trail.

in production · thousands of turns/mo · the engine's origin
minuit
Agency · multi-client

Ships AI features for client products on one engine — a project per client, tenants per their customers, wallets keeping every client's spend separate and capped.

client builds · isolated projects · one console

A subscription for the platform. A wallet for the usage.

One turn = one submitted message → one completed agent response, everything under its trace id included. You price your own product per turn too: this table is your cost line, and the spread is your margin.

TierMonthlyProjectsTenantsTurns¹
Launch$1991100~3,000
Scale$59951,000~12,000
Business$1,999~45,000
Turn classShapeRate²
Lightfast model, no tool loop$0.008
Standardtool loop + guards$0.06
Heavyagentic, long context$0.30

1 Allowances meter in standard-turn equivalents; mixed workloads burn by class at published ratios. 2 Rates set from measured production cost distributions at a fixed margin; a fair-use envelope bounds each class. No free tier. 14-day money-back. tack never spends money it hasn't collected.

The questions serious buyers ask.

Which models run my turns?
Frontier reasoning and embedding models on managed keys. You configure a class per function (light / standard / heavy), never a provider. Model routing is tack's job; your prices don't move when providers reprice.
Can I bring my own API key?
No. Managed keys are how the hard caps, margin and audit trail stay true: a key outside the meter would make every guarantee optional. BYOK exists only in the self-hosted enterprise license.
What happens when a wallet runs out?
Turns refuse at the gate: cost 0, audit row written, a typed refusal envelope to your app, webhook fired at the threshold before it happens. Optional auto-reload tops up from Stripe. Nothing silently serves unbilled.
Am I locked in?
Your tools live in your codebase; the interface is plain HTTPS + SSE. Transcripts, knowledge and usage export via API. If you leave, you take your data and your business logic — what stays is the engine you no longer need.
Where does my customers' data live?
Isolated per tenant, retention windows you configure, erasure cascade on tenant deletion (money rows anonymize: financial records survive, attribution doesn't). You are the controller, tack is the processor; DPA available.
What does tack add to latency?
Turns are model-dominated: measured production p50 ≈ 4.5s is the model call itself. Engine overhead (queue, gates, ledger) is 2–10% of the turn. Tool callbacks add your endpoint's latency, bounded by per-tool timeouts.
What if tack is down?
Turn submission is durable: queued work survives restarts; results deliver at-least-once via signed webhooks with idempotent event ids. Status page + incident history public from day one.
Why is there no free tier?
tack is for products that charge money; a free tier would optimize the engine for tenants who never will. There's a 14-day money-back guarantee instead: real usage, real refund if it's not for you.

Set your course. The books keep themselves.

Create a tenant. Submit a turn. Everything else was already running.