shopkit· Commerce

Sell with TWINT and QR-bill.

shopkit brings catalog, cart, checkout and back office into your TypeScript app. Customers pay by TWINT, card or on invoice; shopkit works out stock, shipping and VAT, and the labels come from Swiss Post. The data stays in your database.

Try the demo
$npm i @agentkit.ch/shopkit

Cart

Club scarf29.00
Home jersey, M89.00
Shipping9.00
TotalCHF 127.00
Pay with TWINT
3
VAT rates per product: 8.1, 2.6 and 3.8 %
4
Languages for shop, emails and receipts
CHF 0
Fee per order to us
MIT
Open source on GitHub, packages on npm

Who it is for

For shops that serve Swiss customers.

From a club’s fan shop to the bakery with pickup: shopkit knows TWINT, the QR-bill, Swiss Post and the Swiss VAT rates.

01

Club shops & merch

Jerseys in sizes, scarves and gift cards – paid by TWINT or on invoice, shipped with Swiss Post or picked up.

02

Bakeries & farm shops

Pickup day with time window, order cutoff and closed days. With WaWiAssist from HS-Soft the articles, allergens included, come from the ERP.

03

Roasters & SMEs

Variants, stock, shipping by weight and the Swiss Post label in one click. Regulars even order through their AI agent.

New in shopkit 0.2 · Ordering through AI agents

Your customers order in the chat.

Your shop becomes an MCP server. Your customers’ agent – Claude, ChatGPT or Cursor – finds products, prices the order with VAT and shipping, and places it. Payment goes through a zahls.ch link or straight to the saved TWINT. For every shopkit shop, no extra service.

  • Sign-in with OAuth – Claude and ChatGPT connect without a token
  • Only the amount the customer confirmed is charged
  • Shipping, pickup or delivery day with time window – the agent asks
  • Payment tokens never reach the model
import { createShopCustomerMcpHandler } from '@agentkit.ch/shopkit/mcp'Guide in the README
AgentMCP · Rösterei Aare

Two bags of the house blend and a descaler, by post please.

search_productshouse blend, descaler

quote_order

2 × House blend 500 g37.00

Descaler12.90

PostPac Priority9.00

TotalCHF 58.90

Pay CHF 58.90 with your saved TWINT?

Yes, please.

place_orderexpectedAmount: 5890

TWINT …

New in shopkit 0.2 · For bakeries

HS-Soft (WaWiAssist) connected.

For bakeries and confectioners on WaWiAssist: products come from WaWiAssist, and every order lands there as a WaWiAssist order – with the pickup day as the order date. Whether placed in the web shop or through an agent.

  • Import with price category, special price, image, declaration, allergens and nutrition
  • Only pickup days on which every article in the cart can be had
  • If HS-Soft is unreachable, shopkit sends the order again later
  • State and resend in the back office and through MCP
import { createHsSoftSync } from '@agentkit.ch/shopkit/hssoft'Guide in the README

Articles → products

WaWiAssist

  • A1Zopf 500 g6.80
  • A7Farmhouse loaf5.20
  • A12Grittibänz4.50

shopkit

  • Zopf 500 gimported
  • Farmhouse loafimported
  • Grittibänzfrom 1.11.

Order → WaWiAssist

shopkit

#2187 · CHF 18.80

Pickup 31.10.2026

WaWiAssist

—

New in shopkit 0.4 · Swiss Post

Swiss Post labels and addresses.

One click in the order and the label with barcode is ready – with the order’s shipping method, billed to your franking licence. At checkout Swiss Post suggests postcode, locality, street and house number and checks the address before the order is placed.

  • PostPac Economy and Priority, bulky goods, Swiss-Express «Moon», VinoLog and A Mail Plus
  • A5, A6 or A7 as PDF or ZPL2 for the label printer
  • Additional services such as signature, fragile or Saturday delivery
  • Tracking number with Track & Trace in the shipping e-mail
import { createSwissPost } from '@agentkit.ch/shopkit/swisspost'Guide in the README

<Checkout />

Street and number

Bahnhofst

Postcode and city

8001 Zürich

Address confirmed by Swiss Post

#1044

A6 · PRI

1.2 kg

Create label

Rösterei Aare

Aarstrasse 12

3011 Bern

PRI

Anna Muster

Bahnhofstrasse 12

8001 Zürich

99.60.123456.00000001

Tracking number —

Features

Everything a shop needs.

Catalog, checkout and back office, with the Swiss details that generic shop systems add later as a plugin.

Products & variants

Physical products and gift cards, variants with their own price and stock, struck-through prices, images and texts in four languages.

Stock you can trust

Stock is reserved at checkout: shopkit sells the last item once, also under load.

TWINT, card or invoice

Online through zahls.ch or on invoice with QR-bill. You decide who may buy on invoice.

VAT per product

8.1, 2.6 or 3.8 % per product, shipping split across the rates, every receipt lists all rates. Optionally rounded to 5 Rappen.

Shipping & pickup

Flat, by weight, free above an amount or pickup. Pickup and delivery day with time window and order cutoff.

Discount codes & gift cards

Percent, amount or free shipping with conditions. Sell gift cards and redeem them across several orders.

Orders & refunds

Order numbers, links for guests, statuses for payment and fulfillment, refunds in parts with restock.

Back office to embed

<ShopAdmin /> with orders, products, stock, discount codes, gift cards and bank import – behind your own sign-in.

Emails in your look

Confirmation, payment received, shipped, reminder, gift card code – in four languages, with your logo and colors.

Your database, your tables

The kits write to your database through adapters. JOIN them with your own tables – no sync, no silo.

select o.*, c.name from shop_orders o
join customers c on c.id = o.customer_external_id
numberpayment_statuspayment_methodtotal
1039refundedonline2900

Every email, in four languages

Receipts, reminders and order confirmations as HTML and text, with your mailer.

de

Deine Quittung für Pro

Acme AG

fr

Votre commande #1042 est confirmée

Boutique Léman

it

Promemoria: fattura 2026-0142

FC Lugano Nord

46° 48′ N · 8° 14′ E

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.

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
paid
nextReminders, Swiss style

For developers

A shop in ten minutes.

The shop in one file, one route for storefront API and webhook, ready-made components for checkout and back office.

Install

$ npm i @agentkit.ch/shopkit
Setup prompt for your coding agent

Add a shop with TWINT and QR-bill using @agentkit.ch/shopkit. Read https://agentkit.ch/llms.txt first.

import { createShop } from '@agentkit.ch/shopkit';
import { drizzleAdapter } from '@agentkit.ch/shopkit/drizzle';
import { zahlsProvider } from '@agentkit.ch/shopkit/zahls';
import { db, env } from './db';

export const shop = createShop({
  // your Postgres, your tables
  database: drizzleAdapter(db),
  provider: zahlsProvider({ instance: 'acme', apiKey: env.ZAHLS_KEY }),
  tax: { inclusive: true, defaultRateBps: 810 }, // Swiss VAT 8.1 %
  shipping: {
    rates: [
      {
        id: 'post',
        name: 'PostPac Economy',
        amount: 900,
        tiers: [
          { maxWeightGrams: 2_000, amount: 900 },
          { maxWeightGrams: 10_000, amount: 1_100 },
        ],
        freeAbove: 10_000,
      },
      { id: 'pickup', name: 'Abholung im Laden', amount: 0, pickup: true },
    ],
  },
  // invoice only for signed-in customers
  invoice: { allow: ({ customerExternalId }) => customerExternalId !== null },
});

The other kit

subkit

Subscriptions & invoices

For SaaS, memberships and club fees

Your customers pick a plan and pay by TWINT, card or QR-bill. subkit renews, prorates, sends reminders and matches payments with your bank.

MonthlyYearly

Pro

CHF 19.00

/ month

14 days free
Choose Pro
TWINTVISAMASTERCARDQR

Questions

Asked often.

Still unsure? The demos show the kits with their real options.

01Who is shopkit for?

For anyone selling products in their own app: club shops, bakeries with pickup, coffee roasters, SMEs with merch or gift cards. For recurring payments there is subkit.

02How do my customers pay?

By TWINT or card through zahls.ch, or on invoice with a Swiss QR-bill. Signed-in customers can save their payment method and pay the next order without the payment page. shopkit matches invoices with the camt.054 of your bank.

03Does shopkit create Swiss Post labels?

Yes, since shopkit 0.4: the label with barcode from the order, in the back office, through the API or MCP, plus the tracking number with Track & Trace in the shipping email. At checkout Swiss Post suggests addresses and checks them. You need a franking licence and access to the Digital Commerce API of Swiss Post. Labels for items abroad and live tariffs are planned.

04Does shopkit work with HS-Soft (WaWiAssist)?

Yes. @agentkit.ch/shopkit/hssoft imports the articles from WaWiAssist as products and sends every order back as a WaWiAssist order, with the pickup day as the order date. All you need is the API key of your WaWiAssist from HS-Soft.

05What does shopkit cost?

Nothing. shopkit is open source under MIT, with no fee per order. You only pay your payment provider and Swiss Post for your parcels.

Your shop, today.

Copy the setup prompt into your coding agent – or try shopkit in the browser first.

Setup prompt for your coding agent

Add a shop with TWINT and QR-bill using @agentkit.ch/shopkit. Read https://agentkit.ch/llms.txt first.

Try the demo · shop.agentkit.ch