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.
- 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.
index.htmlProductCard.tsxHeader.tsxuseAuth.tsPreview · the buttons now add to a Tilnivo cart
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.
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 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
Cards, iDEAL, Bancontact, Klarna and more, on Mollie's payment page.
Sign in with Mollie
GoCardless
Straight from the shopper's bank account, on GoCardless's page.
Sign in with GoCardless
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.
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.
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.
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.
Live carrier rates from Shippo, EasyPost and ShipStation Coming 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.
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.
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.
1import { TilnivoProvider, BuyButton } from "@tilnivo/react"23const tee = { id: "tee", name: "Logo tee", price: 25 }45export default function App() {6 return (7 <TilnivoProvider store="sto_8f2k">8 <Header />9 <BuyButton product={tee}>Add to cart</BuyButton>10 </TilnivoProvider>11 )12}
1import { useCart, useTilnivoEvent } from "@tilnivo/react"23export function CartButton() {4 const { count, open } = useCart()56 useTilnivoEvent("order_completed", ({ number }) => {7 toast(`Order #${number} placed`)8 })910 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.
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.
1import { verifyWebhook } from "@tilnivo/sdk"23export 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 })1112 if (event.event === "order.paid") {13 await unlock(event.order)14 }15 return new Response("ok")16 },17}
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.
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.
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.
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.