agentkit

The billing framework for Swiss software

Subscriptions, invoices, shop and members – as a library that runs inside your app. QR-bill, TWINT, VAT and four languages are built in, and the data stays in your database. From club projects to SaaS, in TypeScript and PHP.

npx agentkit init

Try the VAT maths

CHF

VAT rate

Net
CHF 210.92
VAT 8.1 %
CHF 17.08
Total
CHF 228.00

Same rounding as subkit: whole Rappen, rounded half up.

Pick what your product needs.

Each kit works on its own, and they all share one adapter, one customer and one payment provider. Same kit, same behaviour, in every programming language we ship.

Preview

subkit

Subscriptions & invoices

  • Plans, trials, proration
  • Card, TWINT or QR-bill
  • Reminders & retries
  • VAT on every invoice
  • Entitlements & limits
  • Billing portal UI
npm i @agentkit/subkit
In progress

membershipkit

Members & renewals

  • Membership types & seasons
  • Households & families
  • Renewal campaigns
  • Signup forms & custom fields
  • Fee invoices via subkit
  • Member cards & export
npm i @agentkit/membershipkit
planned

shopkit

Commerce

  • Products & variants
  • Cart & checkout with TWINT
  • Orders & refunds
  • Stock & Swiss Post shipping
  • Discount codes
  • Gift vouchers
npm i @agentkit/shopkit
eventkit Events, registrations, tickets, waitlistsbookingkit Appointments, resources, reservationsinvoicekit One-off invoices with QR-bill, no subscriptionmailkit Newsletters, lists, double opt-in

Swiss by default

Not localised later. Swiss from the first line

Generic billing libraries think in Stripe, cents and one language. Swiss customers pay by QR-bill and TWINT, expect VAT on every invoice and read it in German, French or Italian. agentkit starts there.

RechnungFactureFatturaInvoice

Payment part

Currency

CHF

Amount

228.00

Account / Payable to

CH44 3199 9123 0008 8901 2
Acme AG
Bahnhofstrasse 1
8001 Zürich

Reference

21 00000 00003 13947 14300 09017

Additional information

Invoice 2026-0142 · Club Pro, annual plan
incl. 8.1 % VAT CHF 17.08 · CHE-123.456.789 VAT

Payable by

FC Seebach
Dorfstrasse 12
8052 Zürich
Generated by subkit: QR-IBAN with QR reference, VAT line, payer from your customer table. Sample data.
live

Swiss QR-bill

Payment part per SIX guidelines, QR-IBAN with QR reference or IBAN with RF creditor reference. CHF and EUR. Scan-to-pay in every Swiss banking app.

live

TWINT via zahls.ch

Payments through zahls.ch with TWINT and credit cards. Card data never touches your server. Other providers plug in through one interface.

live

VAT done right

Inclusive or exclusive prices, VAT line and CHE number on every invoice, integer Rappen instead of floats. Per-line rates (8.1 / 2.6 / 3.8 %) and 5-Rappen rounding are next.

live

de · fr · it · en

UI, emails and invoices in German, French, Italian and English, with Swiss formats: 15.10.2026, CHF 1’900.00, «guillemets», ss instead of ß.

next

Bank reconciliation

Import camt.054 / camt.053 from your bank, match QR references to open invoices and mark them paid. No more manual matching of bank statements.

next

Reminders, Swiss style

Today: payment terms, automatic retries and reminder emails. Next: 1st, 2nd and 3rd reminder with fees, reminder PDFs with a fresh QR-bill, export for debt collection.

by design

revDSG friendly

The kits run in your app and write to your database. No extra processor for your customer data – host it in a Swiss data centre if you like.

planned

eBill

Deliver invoices straight into the e-banking of your customers through the Swiss eBill network, with the QR-bill as fallback.

A library in your app. Not a service in front of it.

Your app

  • Next.js · Laravel · Symfony · Hono
  • <BillingPortal /> · <ak-cart>
  • your auth → authorize()

agentkit · in your process · TS or PHP

  • subkit · membershipkit · shopkit
  • database adapter · payment provider

Yours

  • Your Postgres · MySQL · SQLite
  • zahls.ch · TWINT
  • Your bank · camt.054
  • Your mailer

One spec. Native in every stack.

Every kit is defined once – schema, rules, HTTP API, emails, translations – and implemented natively per programming language. A shared conformance suite runs the same billing scenarios against each implementation, so a renewal in PHP produces exactly the rows a renewal in TypeScript does. The React UI talks to both.

TypeScript

reference

Frameworks

Next.js · Hono · SvelteKit · Nuxt · Express · Workers

Databases

Drizzle · Prisma · Kysely

PHP

next

Frameworks

Laravel · Symfony · PHP 8.3+

Databases

Eloquent · Doctrine · PDO

Python

later

Frameworks

Django · FastAPI · Flask

Databases

Django ORM · SQLAlchemy

Everything around the money, done once.

Your database

The data never leaves your app.

Kits write to tables in your database through adapters. Join them, back them up, migrate away – no sync, no silo.

Drizzle · Prisma · Eloquent · Doctrine · PDO

Any stack

TypeScript and PHP, one HTTP API.

Native libraries per language, mounted as a route in your framework. Every implementation speaks the same API, so the same UI works on top.

Next.js · Hono · Laravel · Symfony · OpenAPI

Host it anywhere

Your servers, your data centre.

Vercel, a Swiss cloud or the server in the basement: the kits go wherever your app goes. There is no agentkit backend to call home to.

Infomaniak · Exoscale · Swisscom · Vercel · on-prem

UI included

Self-service out of the box.

Drop-in components for the boring screens – React, or a web component for Blade and Twig. Headless hooks when you want your own.

<BillingPortal /> · useBilling() · <ak-cart>

Emails & documents

Every lifecycle email, ready.

Receipts, failed payments, reminders, renewals, order confirmations – in four languages, HTML and text, any mailer. Printable invoices with QR-bill.

Resend · SMTP · Postmark · PDF

Agent-native

Your coding agent can wire it in.

llms.txt, skills, an MCP server per kit and errors that link to the fix. One prompt from zero to a working checkout.

llms.txt · MCP · Skills · AGENTS.md

Correct by design

Money paths are boring on purpose.

Compare-and-set updates, idempotent webhooks, transactions where it matters. One conformance suite for every language and database.

CAS · Idempotency · Transactions

Composable

Kits that know each other.

One customer, one payment provider, one invoice system across kits. Membership fees and shop orders end up on the same QR-bill.

Shared customer · Typed events · Plugins

Open source

MIT. Every line readable – from v0.1.

The code goes public on GitHub with version 0.1. No per-transaction fee to us, no lock-in. A hosted dashboard and webhook relay will be optional, not required.

MIT · TypeScript · PHP · Tested

Declared in code. Reviewed in pull requests.

Kits describe their tables declaratively. The CLI turns that into a schema or migration for the ORM you already use – Drizzle, Prisma, Eloquent, Doctrine – and every adapter passes the same conformance suite.

import { agentkit } from '@agentkit/core';
import { drizzleAdapter } from '@agentkit/drizzle';
import { subkit } from '@agentkit/subkit';
import { shopkit } from '@agentkit/shopkit';
import { membershipkit } from '@agentkit/membershipkit';
import { zahls } from '@agentkit/zahls';

export const kit = agentkit({
  database: drizzleAdapter(db, { tablePrefix: 'ak_' }),
  payments: zahls({ instance: 'acme', apiKey: env.ZAHLS_KEY }),
  kits: [
    subkit({ plans, defaultPlanId: 'free' }),
    shopkit({ currency: 'CHF', vat: { rateBps: 810 } }),
    membershipkit({ seasons: 'yearly', invoiceWith: 'subkit' }),
  ],
});

kit.on('shop.order.paid', async ({ order }) => fulfil(order));

Extracted from production, one kit at a time.

Every kit comes from code that already runs in production and is pulled out once it has proven itself.

  1. 1

    core + subkit

    Q4 2026 · now

    Adapter contract and test suite, Drizzle adapter, subkit 0.1 with QR-bill, VAT and zahls.ch/TWINT on npm. Docs in German and English.

  2. 2

    subkit for PHP

    Q1 2027

    Conformance suite as language-neutral fixtures, PHP port with Eloquent, Doctrine and PDO adapters, Laravel and Symfony integration.

  3. 3

    membershipkit

    Q1 2027

    Fee invoices through subkit. camt.054 bank reconciliation.

  4. 4

    shopkit & more

    2027

    Catalogue, cart, TWINT checkout, Swiss Post shipping, vouchers. eBill, then eventkit and bookingkit.

Roll your own billing – in minutes, not months

Ship the product. Let the kits handle subscriptions, orders and members – Swiss-ready, in your database, under your control.