Add payments to the app you built with AI

Paste one prompt into Lovable, Bolt, v0, Replit or Cursor. Your app gets a cart and a checkout, and the money goes to your own Stripe, PayPal, Square or Mollie account.

Start selling
Or give your builder one line:
  • No monthly fee
  • Your own payment account
  • Works on any website

Your AI builder adds the script tag and turns your buttons into Tilnivo buttons.

your app · AI builder
Add a Tilnivo cart and checkout to this app. Tilnivo handles the cart, the checkout, payments, tax and shipping, so don't build any of those or a payments backend.1. Add this script tag once, in index.html before </body>… (5 steps)
Done. Here's what I changed:
Added the Tilnivo scriptindex.html
Made the buy buttons Tilnivo buttonsProductCard.tsx
Added a cart button with a live countHeader.tsx
Passed the Supabase session to TilnivouseAuth.ts
Ask for a change…⌘↵
For AI app builders

Built for apps made with AI builders

Ask a builder for payments and it writes its own checkout, often with the price check in the browser. Give it this prompt instead, and Tilnivo handles the parts that have to be right.

When a builder writes the checkout
With Tilnivo
Takes the price the browser sends
Prices every line on the server, twice
Unlocks access without checking the webhook
Signs every webhook, so your server can check it
Records a payment again when the provider retries
Marks each order paid once, however often it's told
Leaves sales tax as a TODO
Works out tax from your rates, Stripe Tax or TaxJar
Sells stock it doesn't have
Checks stock before it takes payment
Prompt for your AI builder
Add a Tilnivo cart and checkout to this app. Tilnivo handles the cart, the checkout, payments, tax and shipping, so don't build any of those or a payments backend.1. Add this script tag once, in index.html before </body>:   <script async src="https://tilnivo.com/c.js" data-store="sto_8f2k"></script>2. Make each buy button a Tilnivo button. The page is the catalog: the button says everything about the product, and Tilnivo reads this page again on the server before it takes payment, so render buttons in the HTML the server sends (or answer JSON at data-item-url) and keep the price there the real one:   <button data-tilnivo-add data-item-id="black-tee" data-item-name="Black tee" data-item-price="25.00" data-item-url="https://yourshop.com/black-tee" data-item-image="https://yourshop.com/tee.jpg">Add to cart</button>   data-item-id is the product's id and never changes. Options go in data-item-custom1-name="Size" data-item-custom1-options="S|M|L[+2.00]", stock in data-item-stock. My domain must be in my Tilnivo store's domain list.   Buttons rendered later by React work in the cart, but the server never runs JavaScript: in a single-page app, point each data-item-url at a URL that answers the product as JSON ({ "id", "name", "price", "url" }). From code, call window.Tilnivo.add({ id, name, price, url }) and window.Tilnivo.open().   For a form with a size picker and a quantity, put the same data-item-* on a <form data-tilnivo-form="add"> (custom options as data-item-custom1-name="Size" data-item-custom1-options="S|M|L"), name each input after its option (name="Size", name="quantity"), and add <p data-tilnivo-error="Size"></p> and <p data-tilnivo-message></p> for errors. data-tilnivo-form="signin" (name="email", then name="code") and "discount" (name="code") work the same way. Don't write submit handlers for these. To show something only when the shopper is signed in or out, or the cart has items or is empty, add data-tilnivo-if="signed-in" (or signed-out, has-items, empty) instead of writing that logic.3. Add a cart button to the header:   <button data-tilnivo-open>Cart (<span data-tilnivo-count>0</span>)</button>4. To react to a purchase, listen for the tilnivo:order_completed event on window. Never unlock anything paid from that event alone: do it from Tilnivo's signed order.paid webhook on the server.5. If the app has sign-in (Supabase, Clerk, Firebase…), call window.Tilnivo.identify(token) with the signed-in user's token whenever the session changes, and window.Tilnivo.identify(null) on sign-out.

Your dashboard has the same prompt with your store filled in, under Storefront → Install.

No backend to write

Prices, stock, tax and payments run on our server, so editing your app's code in a browser can't change what anything costs.

Made for React apps

Buttons your app renders later work as soon as they appear, and @tilnivo/react gives you the cart count and its events as hooks.

Uses your sign-in

Pass a Supabase, Clerk or Firebase token to Tilnivo.identify() and buyers see their orders and downloads.

Unlocks on payment

A signed order.paid webhook tells your server, a Cloudflare Worker or a Lambda who paid for what.

Payments

Payments go to your own account

Connect Stripe, PayPal, Square, Mollie, GoCardless or Mercado Pago, or several at once. You're the merchant of record, payouts follow your provider's schedule, and there's no monthly fee, only a small cut of each sale.

Stripe

Cards, Apple Pay, Google Pay, Link and whatever else you turn on in Stripe.

Hosted onboarding

PayPal

PayPal, Pay Later and Venmo, from the shopper's PayPal account.

PayPal partner onboarding

Square

Cards, from your Square account.

Sign in with Square

mollie

Mollie

Cards, iDEAL, Bancontact, Klarna and more, on Mollie's payment page.

Sign in with Mollie

G

GoCardless

Straight from the shopper's bank account, on GoCardless's page.

Sign in with GoCardless

M

Mercado Pago

Cards, Pix, boleto and Mercado Pago balance, on Mercado Pago's page.

Sign in with Mercado Pago

Your account, your payouts

Every payment is made on your account at the provider, which takes our fee on each sale. Card details go into the provider's own fields, never your code.

Jo Park pays$72.08
Your Stripe accountPaid
Your bankOn Stripe's schedule

Test everything before you go live

Every store has a sandbox on its providers' test keys, with its own orders, its own API keys and emails marked [Test]. Nothing it does moves real money.

SandboxTest mode
Orders3
Charged$0.00
Keyssc_test_…
Tax & shipping

Tax and shipping, worked out on the server

Checkout re-prices whenever the address, the shipping method or a discount changes, so buyers pay exactly what they see.

Tax from your rates, Stripe Tax or TaxJar

Paid orders are recorded with the service as sales for your filings, and reversed on refund. Prices can include VAT or have tax added on top.

Your own ratesPer country, state or province, stacked like GST and QST
Stripe TaxOn your connected Stripe account
TaxJarTaxJarWith your own API token
AvalaraAvalara AvaTaxComing soonCompany codes and address checks

Checkout won't take payment until the address is enough to work tax out. If the service can't answer, it falls back to your rates or waits, whichever you choose.

Shipping rates by country

Flat rates for where you ship, free over a threshold, with a delivery estimate. Digital products skip the address entirely.

Harbour & Pine · shipping4 rates
GroundUS, Canada · 3–5 days$8Free over $75
ExpressUS · 1–2 days$18
InternationalEverywhere else · 7–14 days$25Free over $200
DownloadsNo address askedNone

Live carrier rates from Shippo, EasyPost and ShipStation Coming soon

SubscriptionsComing soon

Subscriptions and memberships

We're building monthly and yearly plans on your own Stripe account, with Stripe running the renewals, plus members-only pages and member prices checked on the server.

Until then, sell lifetime access as a one-off product and unlock it in your app from the order.paid webhook.

Features

Everything else a shop needs

Discounts, accounts, emails, downloads and a dashboard to run them, ready from the first sale.

Prices the browser can't change

The cart sends products and quantities, never prices. Every line is priced on the server, and again just before payment.

Digital downloads

Buyers get a link that counts uses and stops working at the limit, at expiry or on refund.

Discounts

Percent or amount off, buy some get some free, or free shipping, with codes or automatic, limits and dates.

Abandoned cart emails

Up to three reminders, each with its own timing and discount code, linking back to the checkout in your app.

Customer accounts

An emailed code, or your own sign-in through Supabase, Clerk, Auth0, Firebase or any OpenID Connect provider.

Stock per size

Count stock per product or per choice, so a sold-out size stops selling on its own.

Orders and refunds

Ship with tracking emails, refund in one click, print receipts, and export orders and customers as CSV.

Your pages are the catalog

No product list to keep twice: the button on your page says what it is and what it costs, and we read it again before every payment.

Snipcart's markup

Moving a shop over? Its data-item-* attributes, custom options and crawler feeds work as they are.

Developers

A few attributes, or a few lines of code

Buy buttons are plain HTML, so they work in whatever a builder wrote. For a cart count, a button that adds from code, or something that should happen once someone has paid, there are small packages for JavaScript, React, Vue and Svelte.

App.tsx
1import { TilnivoProvider, BuyButton } from "@tilnivo/react"
2
3const tee = { id: "tee", name: "Logo tee", price: 25 }
4
5export default function App() {
6 return (
7 <TilnivoProvider store="sto_8f2k">
8 <Header />
9 <BuyButton product={tee}>Add to cart</BuyButton>
10 </TilnivoProvider>
11 )
12}
CartButton.tsx
1import { useCart, useTilnivoEvent } from "@tilnivo/react"
2
3export function CartButton() {
4 const { count, open } = useCart()
5
6 useTilnivoEvent("order_completed", ({ number }) => {
7 toast(`Order #${number} placed`)
8 })
9
10 return <button onClick={open}>Cart ({count})</button>
11}

The package adds the script tag for you. Works in Lovable, Bolt, v0, Replit, Next.js, Webflow and anywhere else you can add a script tag.

Webhooks

Unlock things on your server when someone pays

Tilnivo signs every order.paid, order.fulfilled and order.refunded event, retries failed deliveries with backoff, and keeps a log of each attempt. verifyWebhook in @tilnivo/sdk checks the signature on any host that runs JavaScript.

src/index.ts
1import { verifyWebhook } from "@tilnivo/sdk"
2
3export default {
4 async fetch(request, env) {
5 const event = await verifyWebhook(
6 await request.text(),
7 request.headers.get("Tilnivo-Signature"),
8 env.TILNIVO_WEBHOOK_SECRET,
9 )
10 if (!event) return new Response(null, { status: 401 })
11
12 if (event.event === "order.paid") {
13 await unlock(event.order)
14 }
15 return new Response("ok")
16 },
17}
DeliveriesLive
tilnivo-hooks.you.workers.devReceiving
12:04:52order.paid#104220084ms
12:04:12order.paid#1041200retry 1 · 91ms
12:03:42order.paid#1041503retrying in 30s
11:58:40order.fulfilled#103820077ms
11:52:03order.refunded#1036200102ms
11:47:19order.paid#103720069ms

A REST API and keys. Products, orders, discounts and customers, with sc_live_ and sc_test_ keys for scripts and back offices.

AI shopping agents. Every store speaks the Universal Commerce Protocol, so an agent can fill a cart and send the buyer to your checkout.

A Merchant Center feed. Every product and choice, with the same ids the cart uses, ready for Google Shopping.

Pricing

1.5%

a sale, and no monthly fee

Your payment provider charges its own fee on top, as it would anyway, and that's all. No plan to pick, no minimum, and nothing to pay in a month you don't sell.

FeesA $50 order, all in
Tilnivo1.5% a sale · no monthly fee$2.50
Snipcart2% a sale · $20 instead of 2% under $1,000 in sales$2.75
Foxy1% a sale, capped at 35¢ · $35 a month$2.10
EcwidNo fee per sale · $5 a month$1.75
Lemon Squeezy5% + 50¢ a sale · no monthly fee · processing included$3.00
Gumroad10% + 50¢ a sale · no monthly fee$7.25
Tilnivo
Snipcart
Foxy
Ecwid
Lemon Squeezy
Gumroad
Monthly fee
None
None$20 instead of 2% under $1,000 in sales
$35 a monthStarter, 100 orders included
$5 a monthStarter, up to 10 products
None
None
Fee per sale
1.5%
2%
1%capped at 35¢
None
5% + 50¢
10% + 50¢
Card processing
Your provider's
Your provider's
Your provider's
Your provider's
Includedfiles sales tax for you, as merchant of record
Your provider's
Total on a $50 order
$2.50No monthly fee
$2.75No monthly fee
$2.10+ $35/month
$1.75+ $5/month
$3.00No monthly fee
$7.25No monthly fee

A $50 order paid by a US card, with card processing at Stripe's 2.9% + 30¢ wherever it's charged on top. Competitors' prices are from their own pricing pages on 5 November 2026, on their lowest plan that sells on your own site.

FAQ

Frequently asked questions

Yes. Paste the prompt into the builder's chat. The cart is one script tag, it picks up buttons React renders after the page loads, and it has a JavaScript API for anything else. Your dashboard has the prompt with your store filled in, under Storefront → Install.

Start taking payments in your app today

Connect your payment account, paste the prompt, and the first sale lands in your own account.

Create your store
Or give your builder one line: