[{"data":1,"prerenderedAt":934},["ShallowReactive",2],{"navigation_docs":3,"-integrations-bolt":465,"-integrations-bolt-surround":931},[4,8,62,115,450],{"title":5,"path":6,"stem":7},"Introduction","\u002Fintroduction","0.introduction",{"title":9,"path":10,"stem":11,"children":12,"page":61},"Guides","\u002Fguides","1.guides",[13,17,21,25,29,33,37,41,45,49,53,57],{"title":14,"path":15,"stem":16},"Quickstart","\u002Fguides\u002Fquickstart","1.guides\u002F1.quickstart",{"title":18,"path":19,"stem":20},"Payouts & Settlement","\u002Fguides\u002Fpayouts","1.guides\u002F10.payouts",{"title":22,"path":23,"stem":24},"Customer Emails","\u002Fguides\u002Fcustomer-emails","1.guides\u002F11.customer-emails",{"title":26,"path":27,"stem":28},"Build your own integration","\u002Fguides\u002Fbuild-your-own-integration","1.guides\u002F2.build-your-own-integration",{"title":30,"path":31,"stem":32},"Selling Workflow","\u002Fguides\u002Fselling-workflow","1.guides\u002F2.selling-workflow",{"title":34,"path":35,"stem":36},"Vatly SDKs","\u002Fguides\u002Fsdks","1.guides\u002F3.sdks",{"title":38,"path":39,"stem":40},"Authentication","\u002Fguides\u002Fauthentication","1.guides\u002F4.authentication",{"title":42,"path":43,"stem":44},"Pagination","\u002Fguides\u002Fpagination","1.guides\u002F5.pagination",{"title":46,"path":47,"stem":48},"Errors","\u002Fguides\u002Ferrors","1.guides\u002F6.errors",{"title":50,"path":51,"stem":52},"Webhooks","\u002Fguides\u002Fwebhooks","1.guides\u002F7.webhooks",{"title":54,"path":55,"stem":56},"Idempotency","\u002Fguides\u002Fidempotency","1.guides\u002F8.idempotency",{"title":58,"path":59,"stem":60},"Testing","\u002Fguides\u002Ftesting","1.guides\u002F9.testing",false,{"title":63,"path":64,"stem":65,"children":66,"page":61},"Api Reference","\u002Fapi-reference","2.api-reference",[67,71,75,79,83,87,91,95,99,103,107,111],{"title":68,"path":69,"stem":70},"Customers","\u002Fapi-reference\u002Fcustomers","2.api-reference\u002F1.customers",{"title":72,"path":73,"stem":74},"Webhook Endpoints","\u002Fapi-reference\u002Fwebhook-endpoints","2.api-reference\u002F10.webhook-endpoints",{"title":76,"path":77,"stem":78},"Test helpers","\u002Fapi-reference\u002Ftest-helpers","2.api-reference\u002F11.test-helpers",{"title":80,"path":81,"stem":82},"Checkouts","\u002Fapi-reference\u002Fcheckouts","2.api-reference\u002F2.checkouts",{"title":84,"path":85,"stem":86},"One-off Products","\u002Fapi-reference\u002Fone-off-products","2.api-reference\u002F3.one-off-products",{"title":88,"path":89,"stem":90},"Subscriptions","\u002Fapi-reference\u002Fsubscriptions","2.api-reference\u002F4.subscriptions",{"title":92,"path":93,"stem":94},"Subscription Plans","\u002Fapi-reference\u002Fsubscription-plans","2.api-reference\u002F5.subscription-plans",{"title":96,"path":97,"stem":98},"Orders","\u002Fapi-reference\u002Forders","2.api-reference\u002F6.orders",{"title":100,"path":101,"stem":102},"Order Refunds","\u002Fapi-reference\u002Frefunds","2.api-reference\u002F7.refunds",{"title":104,"path":105,"stem":106},"Refunds","\u002Fapi-reference\u002Fglobal-refunds","2.api-reference\u002F8.global-refunds",{"title":108,"path":109,"stem":110},"Chargebacks","\u002Fapi-reference\u002Fchargebacks","2.api-reference\u002F9.chargebacks",{"title":112,"path":113,"stem":114},"Webhook Events","\u002Fapi-reference\u002Fwebhook-events","2.api-reference\u002F99.webhook-events",{"title":116,"path":117,"stem":118,"children":119},"Packages","\u002Fpackages","3.packages",[120,122,164,210,244,283,318,366,408],{"title":116,"path":117,"stem":121},"3.packages\u002Findex",{"title":123,"path":124,"stem":125,"children":126,"page":61},"PHP SDK","\u002Fpackages\u002Fphp","3.packages\u002F1.php",[127,131,134,137,140,144,147,151,154,157,160],{"title":128,"path":129,"stem":130},"Getting started","\u002Fpackages\u002Fphp\u002Freadme","3.packages\u002F1.php\u002F00.readme",{"title":68,"path":132,"stem":133},"\u002Fpackages\u002Fphp\u002Fcustomers","3.packages\u002F1.php\u002F02.customers",{"title":80,"path":135,"stem":136},"\u002Fpackages\u002Fphp\u002Fcheckouts","3.packages\u002F1.php\u002F03.checkouts",{"title":88,"path":138,"stem":139},"\u002Fpackages\u002Fphp\u002Fsubscriptions","3.packages\u002F1.php\u002F04.subscriptions",{"title":141,"path":142,"stem":143},"Subscription plans","\u002Fpackages\u002Fphp\u002Fsubscriptionplans","3.packages\u002F1.php\u002F05.subscriptionplans",{"title":96,"path":145,"stem":146},"\u002Fpackages\u002Fphp\u002Forders","3.packages\u002F1.php\u002F06.orders",{"title":148,"path":149,"stem":150},"One-off products","\u002Fpackages\u002Fphp\u002Foneoffproducts","3.packages\u002F1.php\u002F07.oneoffproducts",{"title":104,"path":152,"stem":153},"\u002Fpackages\u002Fphp\u002Frefunds","3.packages\u002F1.php\u002F08.refunds",{"title":108,"path":155,"stem":156},"\u002Fpackages\u002Fphp\u002Fchargebacks","3.packages\u002F1.php\u002F09.chargebacks",{"title":50,"path":158,"stem":159},"\u002Fpackages\u002Fphp\u002Fwebhooks","3.packages\u002F1.php\u002F10.webhooks",{"title":161,"path":162,"stem":163},"Webhook URLs","\u002Fpackages\u002Fphp\u002Fwebhookendpoints","3.packages\u002F1.php\u002F11.webhookendpoints",{"title":165,"path":166,"stem":167,"children":168,"page":61},"PHP Fluent","\u002Fpackages\u002Ffluent-php","3.packages\u002F2.fluent-php",[169,172,176,180,183,186,189,192,196,199,203,207],{"title":128,"path":170,"stem":171},"\u002Fpackages\u002Ffluent-php\u002Freadme","3.packages\u002F2.fluent-php\u002F00.readme",{"title":173,"path":174,"stem":175},"Configuration","\u002Fpackages\u002Ffluent-php\u002Fconfiguration","3.packages\u002F2.fluent-php\u002F01.configuration",{"title":177,"path":178,"stem":179},"Core concepts","\u002Fpackages\u002Ffluent-php\u002Fcoreconcepts","3.packages\u002F2.fluent-php\u002F02.coreconcepts",{"title":68,"path":181,"stem":182},"\u002Fpackages\u002Ffluent-php\u002Fcustomers","3.packages\u002F2.fluent-php\u002F03.customers",{"title":80,"path":184,"stem":185},"\u002Fpackages\u002Ffluent-php\u002Fcheckouts","3.packages\u002F2.fluent-php\u002F04.checkouts",{"title":88,"path":187,"stem":188},"\u002Fpackages\u002Ffluent-php\u002Fsubscriptions","3.packages\u002F2.fluent-php\u002F05.subscriptions",{"title":96,"path":190,"stem":191},"\u002Fpackages\u002Ffluent-php\u002Forders","3.packages\u002F2.fluent-php\u002F06.orders",{"title":193,"path":194,"stem":195},"Customer portal","\u002Fpackages\u002Ffluent-php\u002Fcustomerportal","3.packages\u002F2.fluent-php\u002F07.customerportal",{"title":50,"path":197,"stem":198},"\u002Fpackages\u002Ffluent-php\u002Fwebhooks","3.packages\u002F2.fluent-php\u002F08.webhooks",{"title":200,"path":201,"stem":202},"Webhook event flow","\u002Fpackages\u002Ffluent-php\u002Fwebhook-flow","3.packages\u002F2.fluent-php\u002F09.webhook-flow",{"title":204,"path":205,"stem":206},"Existing tables","\u002Fpackages\u002Ffluent-php\u002Fhost-owns-its-tables","3.packages\u002F2.fluent-php\u002F10.host-owns-its-tables",{"title":58,"path":208,"stem":209},"\u002Fpackages\u002Ffluent-php\u002Ftesting","3.packages\u002F2.fluent-php\u002F11.testing",{"title":211,"path":212,"stem":213,"children":214,"page":61},"Laravel","\u002Fpackages\u002Flaravel","3.packages\u002F3.laravel",[215,218,221,224,227,230,233,236,240],{"title":128,"path":216,"stem":217},"\u002Fpackages\u002Flaravel\u002Freadme","3.packages\u002F3.laravel\u002F00.readme",{"title":173,"path":219,"stem":220},"\u002Fpackages\u002Flaravel\u002Fconfiguration","3.packages\u002F3.laravel\u002F01.configuration",{"title":68,"path":222,"stem":223},"\u002Fpackages\u002Flaravel\u002Fcustomers","3.packages\u002F3.laravel\u002F02.customers",{"title":80,"path":225,"stem":226},"\u002Fpackages\u002Flaravel\u002Fcheckouts","3.packages\u002F3.laravel\u002F03.checkouts",{"title":88,"path":228,"stem":229},"\u002Fpackages\u002Flaravel\u002Fsubscriptions","3.packages\u002F3.laravel\u002F04.subscriptions",{"title":96,"path":231,"stem":232},"\u002Fpackages\u002Flaravel\u002Forders","3.packages\u002F3.laravel\u002F05.orders",{"title":50,"path":234,"stem":235},"\u002Fpackages\u002Flaravel\u002Fwebhooks","3.packages\u002F3.laravel\u002F06.webhooks",{"title":237,"path":238,"stem":239},"Comparison","\u002Fpackages\u002Flaravel\u002Fcomparison","3.packages\u002F3.laravel\u002F07.comparison",{"title":241,"path":242,"stem":243},"Migrating from Cashier","\u002Fpackages\u002Flaravel\u002Fmigrating-to-vatly","3.packages\u002F3.laravel\u002F08.migrating-to-vatly",{"title":245,"path":246,"stem":247,"children":248,"page":61},"JavaScript SDK","\u002Fpackages\u002Fjavascript","3.packages\u002F4.javascript",[249,252,255,258,261,264,267,270,273,276,279],{"title":128,"path":250,"stem":251},"\u002Fpackages\u002Fjavascript\u002Freadme","3.packages\u002F4.javascript\u002F00.readme",{"title":68,"path":253,"stem":254},"\u002Fpackages\u002Fjavascript\u002Fcustomers","3.packages\u002F4.javascript\u002F02.customers",{"title":80,"path":256,"stem":257},"\u002Fpackages\u002Fjavascript\u002Fcheckouts","3.packages\u002F4.javascript\u002F03.checkouts",{"title":88,"path":259,"stem":260},"\u002Fpackages\u002Fjavascript\u002Fsubscriptions","3.packages\u002F4.javascript\u002F04.subscriptions",{"title":141,"path":262,"stem":263},"\u002Fpackages\u002Fjavascript\u002Fsubscriptionplans","3.packages\u002F4.javascript\u002F05.subscriptionplans",{"title":96,"path":265,"stem":266},"\u002Fpackages\u002Fjavascript\u002Forders","3.packages\u002F4.javascript\u002F06.orders",{"title":148,"path":268,"stem":269},"\u002Fpackages\u002Fjavascript\u002Foneoffproducts","3.packages\u002F4.javascript\u002F07.oneoffproducts",{"title":104,"path":271,"stem":272},"\u002Fpackages\u002Fjavascript\u002Frefunds","3.packages\u002F4.javascript\u002F08.refunds",{"title":108,"path":274,"stem":275},"\u002Fpackages\u002Fjavascript\u002Fchargebacks","3.packages\u002F4.javascript\u002F09.chargebacks",{"title":50,"path":277,"stem":278},"\u002Fpackages\u002Fjavascript\u002Fwebhooks","3.packages\u002F4.javascript\u002F10.webhooks",{"title":280,"path":281,"stem":282},"API reference","\u002Fpackages\u002Fjavascript\u002Fapi","3.packages\u002F4.javascript\u002F12.api",{"title":284,"path":285,"stem":286,"children":287,"page":61},"JavaScript Fluent","\u002Fpackages\u002Ffluent-js","3.packages\u002F5.fluent-js",[288,291,294,297,300,303,306,309,312,315],{"title":128,"path":289,"stem":290},"\u002Fpackages\u002Ffluent-js\u002Freadme","3.packages\u002F5.fluent-js\u002F00.readme",{"title":173,"path":292,"stem":293},"\u002Fpackages\u002Ffluent-js\u002Fconfiguration","3.packages\u002F5.fluent-js\u002F01.configuration",{"title":177,"path":295,"stem":296},"\u002Fpackages\u002Ffluent-js\u002Fcoreconcepts","3.packages\u002F5.fluent-js\u002F02.coreconcepts",{"title":68,"path":298,"stem":299},"\u002Fpackages\u002Ffluent-js\u002Fcustomers","3.packages\u002F5.fluent-js\u002F03.customers",{"title":80,"path":301,"stem":302},"\u002Fpackages\u002Ffluent-js\u002Fcheckouts","3.packages\u002F5.fluent-js\u002F04.checkouts",{"title":88,"path":304,"stem":305},"\u002Fpackages\u002Ffluent-js\u002Fsubscriptions","3.packages\u002F5.fluent-js\u002F05.subscriptions",{"title":96,"path":307,"stem":308},"\u002Fpackages\u002Ffluent-js\u002Forders","3.packages\u002F5.fluent-js\u002F06.orders",{"title":193,"path":310,"stem":311},"\u002Fpackages\u002Ffluent-js\u002Fcustomerportal","3.packages\u002F5.fluent-js\u002F07.customerportal",{"title":50,"path":313,"stem":314},"\u002Fpackages\u002Ffluent-js\u002Fwebhooks","3.packages\u002F5.fluent-js\u002F08.webhooks",{"title":58,"path":316,"stem":317},"\u002Fpackages\u002Ffluent-js\u002Ftesting","3.packages\u002F5.fluent-js\u002F11.testing",{"title":319,"path":320,"stem":321,"children":322,"page":61},"Python SDK","\u002Fpackages\u002Fpython","3.packages\u002F6.python",[323,326,329,332,335,338,341,344,347,350,353,356,359,362],{"title":128,"path":324,"stem":325},"\u002Fpackages\u002Fpython\u002Freadme","3.packages\u002F6.python\u002F00.readme",{"title":173,"path":327,"stem":328},"\u002Fpackages\u002Fpython\u002Fconfiguration","3.packages\u002F6.python\u002F01.configuration",{"title":68,"path":330,"stem":331},"\u002Fpackages\u002Fpython\u002Fcustomers","3.packages\u002F6.python\u002F02.customers",{"title":80,"path":333,"stem":334},"\u002Fpackages\u002Fpython\u002Fcheckouts","3.packages\u002F6.python\u002F03.checkouts",{"title":88,"path":336,"stem":337},"\u002Fpackages\u002Fpython\u002Fsubscriptions","3.packages\u002F6.python\u002F04.subscriptions",{"title":141,"path":339,"stem":340},"\u002Fpackages\u002Fpython\u002Fsubscriptionplans","3.packages\u002F6.python\u002F05.subscriptionplans",{"title":96,"path":342,"stem":343},"\u002Fpackages\u002Fpython\u002Forders","3.packages\u002F6.python\u002F06.orders",{"title":148,"path":345,"stem":346},"\u002Fpackages\u002Fpython\u002Foneoffproducts","3.packages\u002F6.python\u002F07.oneoffproducts",{"title":104,"path":348,"stem":349},"\u002Fpackages\u002Fpython\u002Frefunds","3.packages\u002F6.python\u002F08.refunds",{"title":108,"path":351,"stem":352},"\u002Fpackages\u002Fpython\u002Fchargebacks","3.packages\u002F6.python\u002F09.chargebacks",{"title":50,"path":354,"stem":355},"\u002Fpackages\u002Fpython\u002Fwebhooks","3.packages\u002F6.python\u002F10.webhooks",{"title":161,"path":357,"stem":358},"\u002Fpackages\u002Fpython\u002Fwebhookendpoints","3.packages\u002F6.python\u002F11.webhookendpoints",{"title":280,"path":360,"stem":361},"\u002Fpackages\u002Fpython\u002Fapi","3.packages\u002F6.python\u002F12.api",{"title":363,"path":364,"stem":365},"Development","\u002Fpackages\u002Fpython\u002Fdevelopment","3.packages\u002F6.python\u002F13.development",{"title":367,"path":368,"stem":369,"children":370,"page":61},"Python Fluent","\u002Fpackages\u002Ffluent-python","3.packages\u002F7.fluent-python",[371,374,377,380,383,386,389,392,395,398,401,405],{"title":128,"path":372,"stem":373},"\u002Fpackages\u002Ffluent-python\u002Freadme","3.packages\u002F7.fluent-python\u002F00.readme",{"title":173,"path":375,"stem":376},"\u002Fpackages\u002Ffluent-python\u002Fconfiguration","3.packages\u002F7.fluent-python\u002F01.configuration",{"title":177,"path":378,"stem":379},"\u002Fpackages\u002Ffluent-python\u002Fcoreconcepts","3.packages\u002F7.fluent-python\u002F02.coreconcepts",{"title":68,"path":381,"stem":382},"\u002Fpackages\u002Ffluent-python\u002Fcustomers","3.packages\u002F7.fluent-python\u002F03.customers",{"title":80,"path":384,"stem":385},"\u002Fpackages\u002Ffluent-python\u002Fcheckouts","3.packages\u002F7.fluent-python\u002F04.checkouts",{"title":88,"path":387,"stem":388},"\u002Fpackages\u002Ffluent-python\u002Fsubscriptions","3.packages\u002F7.fluent-python\u002F05.subscriptions",{"title":96,"path":390,"stem":391},"\u002Fpackages\u002Ffluent-python\u002Forders","3.packages\u002F7.fluent-python\u002F06.orders",{"title":193,"path":393,"stem":394},"\u002Fpackages\u002Ffluent-python\u002Fcustomerportal","3.packages\u002F7.fluent-python\u002F07.customerportal",{"title":50,"path":396,"stem":397},"\u002Fpackages\u002Ffluent-python\u002Fwebhooks","3.packages\u002F7.fluent-python\u002F08.webhooks",{"title":58,"path":399,"stem":400},"\u002Fpackages\u002Ffluent-python\u002Ftesting","3.packages\u002F7.fluent-python\u002F11.testing",{"title":402,"path":403,"stem":404},"Porting","\u002Fpackages\u002Ffluent-python\u002Fporting","3.packages\u002F7.fluent-python\u002F12.porting",{"title":363,"path":406,"stem":407},"\u002Fpackages\u002Ffluent-python\u002Fdevelopment","3.packages\u002F7.fluent-python\u002F13.development",{"title":409,"path":410,"stem":411,"children":412,"page":61},"Django","\u002Fpackages\u002Fdjango","3.packages\u002F8.django",[413,416,420,423,427,431,434,437,440,444,447],{"title":128,"path":414,"stem":415},"\u002Fpackages\u002Fdjango\u002Freadme","3.packages\u002F8.django\u002F00.readme",{"title":417,"path":418,"stem":419},"Installation","\u002Fpackages\u002Fdjango\u002Finstallation","3.packages\u002F8.django\u002F01.installation",{"title":173,"path":421,"stem":422},"\u002Fpackages\u002Fdjango\u002Fconfiguration","3.packages\u002F8.django\u002F02.configuration",{"title":424,"path":425,"stem":426},"Billable models","\u002Fpackages\u002Fdjango\u002Fbillablemodels","3.packages\u002F8.django\u002F03.billablemodels",{"title":428,"path":429,"stem":430},"Checkout","\u002Fpackages\u002Fdjango\u002Fcheckout","3.packages\u002F8.django\u002F04.checkout",{"title":88,"path":432,"stem":433},"\u002Fpackages\u002Fdjango\u002Fbilling","3.packages\u002F8.django\u002F05.billing",{"title":193,"path":435,"stem":436},"\u002Fpackages\u002Fdjango\u002Fcustomerportal","3.packages\u002F8.django\u002F06.customerportal",{"title":50,"path":438,"stem":439},"\u002Fpackages\u002Fdjango\u002Fwebhooks","3.packages\u002F8.django\u002F07.webhooks",{"title":441,"path":442,"stem":443},"Admin","\u002Fpackages\u002Fdjango\u002Fadmin","3.packages\u002F8.django\u002F08.admin",{"title":58,"path":445,"stem":446},"\u002Fpackages\u002Fdjango\u002Ftesting","3.packages\u002F8.django\u002F09.testing",{"title":363,"path":448,"stem":449},"\u002Fpackages\u002Fdjango\u002Fdevelopment","3.packages\u002F8.django\u002F10.development",{"title":451,"path":452,"stem":453,"children":454},"Integrations","\u002Fintegrations","4.integrations",[455,457,461],{"title":451,"path":452,"stem":456},"4.integrations\u002Findex",{"title":458,"path":459,"stem":460},"Lovable payments with Vatly","\u002Fintegrations\u002Flovable","4.integrations\u002F1.lovable",{"title":462,"path":463,"stem":464},"Bolt payments with Vatly","\u002Fintegrations\u002Fbolt","4.integrations\u002F2.bolt",{"id":466,"title":462,"body":467,"description":924,"extension":925,"links":926,"meta":927,"navigation":928,"path":463,"seo":929,"stem":464,"__hash__":930},"docs\u002F4.integrations\u002F2.bolt.md",{"type":468,"value":469,"toc":913},"minimark",[470,479,495,498,503,512,521,525,571,575,593,605,609,615,629,644,647,691,699,703,716,719,732,736,779,790,808,812,815,825,832,836,893,908],[471,472,473,474,478],"p",{},"Add ",[475,476,477],"strong",{},"Vatly payments to your Bolt.new app"," without turning a generated checkout into a tax and invoicing project. Vatly is the European merchant of record for AI, software and digital products: it acts as the legal seller for your software, digital downloads, or subscriptions, while your Bolt app handles the product and customer access.",[471,480,481],{},[475,482,483,490,491],{},[484,485,489],"a",{"href":486,"rel":487},"https:\u002F\u002Fmy.vatly.com",[488],"nofollow","Sign up and get a test key"," · ",[484,492,494],{"href":493},"#prompt-bolt-to-add-checkout-and-webhooks","Copy the Bolt integration prompt",[471,496,497],{},"This is a custom API integration, not a native Bolt connector or an endorsement by Bolt. It uses Vatly's existing API and JavaScript packages; no platform changes are required on Vatly's side.",[499,500,502],"h2",{"id":501},"a-payment-integration-is-not-a-merchant-of-record","A payment integration is not a merchant of record",[471,504,505,506,511],{},"Bolt's Stripe integration can generate checkout and webhook code. With a standard payment-processing integration, though, your business is still the seller: you must arrange tax compliance and customer invoicing alongside the integration. The distinction is between processing a payment and taking on the seller's responsibilities. See ",[484,507,510],{"href":508,"rel":509},"https:\u002F\u002Fvatly.com\u002Fvs\u002Fstripe",[488],"Vatly vs Stripe"," for the broader comparison.",[471,513,514,515,520],{},"Vatly takes on the latter for Vatly sales. It handles ",[484,516,519],{"href":517,"rel":518},"https:\u002F\u002Fvatly.com\u002F",[488],"EU VAT, applicable sales tax, registrations, returns, remittance, and customer invoices",". That leaves Bolt's server functions responsible for a smaller integration: create checkout, verify billing events, and update your app's access state. Your product logic and fulfillment remain yours.",[499,522,524],{"id":523},"what-vatly-gives-your-bolt-app","What Vatly gives your Bolt app",[526,527,528,541,547,561],"ul",{},[529,530,531,534,535,540],"li",{},[475,532,533],{},"A European merchant of record."," Vatly is based in the Netherlands and focuses on European software and digital products, with ",[484,536,539],{"href":537,"rel":538},"https:\u002F\u002Fvatly.com\u002Fmollie-merchant-of-record",[488],"Mollie-powered European payment methods"," for international sales.",[529,542,543,546],{},[475,544,545],{},"A fit for AI and software products."," Sell access to an AI tool or SaaS app as a subscription, or sell a one-off license or digital download. Use Vatly's existing API rather than building a billing system around your frontend framework.",[529,548,549,552,553,556,557,560],{},[475,550,551],{},"One checkout, multiple order lines."," Pass products and quantities to the ",[484,554,555],{"href":81},"checkout API",", then use the resulting ",[484,558,559],{"href":97},"order lines"," to fulfill a purchase containing more than one item.",[529,562,563,566,567,570],{},[475,564,565],{},"Hosted billing screens."," Vatly provides the checkout and a ",[484,568,569],{"href":310},"customer portal"," for invoices and subscription management. Portal access requires an issued invoice; you still authenticate the user and create the portal session on your server.",[499,572,574],{"id":573},"get-your-first-test-payment-working","Get your first test payment working",[471,576,577,588,589,592],{},[475,578,579,583,584,587],{},[484,580,582],{"href":486,"rel":581},[488],"Sign up for Vatly",", get a test API key under Developers » API keys, and ",[484,585,586],{"href":493},"copy the Bolt integration prompt","."," Add a test product in ",[475,590,591],{},"Manage Products",". Bolt can then build the server functions and checkout button against your existing Bolt Database or Supabase backend; you do not need to switch database providers to use Vatly.",[471,594,595,596,599,600,604],{},"Start in test mode as soon as your account is ready, with credentials stored in database ",[475,597,598],{},"Secrets",". Verify a complete test checkout and webhook before considering the integration ready. Going live also depends on ",[484,601,603],{"href":602},"\u002Fintroduction#going-live","Vatly approval, product review, and Mollie business verification",". Product review typically takes one to two business days, but neither that nor generated code guarantees a launch date.",[499,606,608],{"id":607},"identify-your-bolt-backend-first","Identify your Bolt backend first",[471,610,611,612,614],{},"Your customers keep using your Bolt app. A checkout button sends them to Vatly's hosted payment page, and a background billing update tells your app when to grant access. You keep the product UI, login, and database; Vatly handles checkout, tax, and invoicing. See ",[484,613,26],{"href":27}," for the overall responsibilities before asking the agent to make changes.",[471,616,617,618,623,624,628],{},"Bolt supports ",[484,619,622],{"href":620,"rel":621},"https:\u002F\u002Fsupport.bolt.new\u002Freference\u002Fsupported-technologies",[488],"JavaScript frontend frameworks and Node.js backends",", rather than requiring one frontend framework. Inspect ",[625,626,627],"code",{},"package.json"," and the deployed backend instead of assuming every app is a React + Vite app or that a Node process in the editor is deployed as a production server.",[471,630,631,632,637,638,643],{},"New projects use ",[484,633,636],{"href":634,"rel":635},"https:\u002F\u002Fsupport.bolt.new\u002Fintegrations\u002Fsupabase",[488],"Bolt Database by default",". Bolt Cloud ",[484,639,642],{"href":640,"rel":641},"https:\u002F\u002Fsupport.bolt.new\u002Fbolt-cloud\u002Fdatabase\u002Fserver-functions",[488],"server functions",", also called edge functions, handle external API calls, payments, and webhooks outside the browser. They belong to the connected database, and Bolt deploys them when it creates or updates them.",[471,645,646],{},"You can also use an existing Supabase project with its database, authentication, and Edge Functions. Bolt's Supabase integration is available on Pro and Teams plans. Keep the database your app already uses: replacing its connection can risk existing data, and Vatly does not require a database migration to another provider.",[648,649,650,663],"table",{},[651,652,653],"thead",{},[654,655,656,660],"tr",{},[657,658,659],"th",{},"Existing setup",[657,661,662],{},"Where to add Vatly",[664,665,666,675,683],"tbody",{},[654,667,668,672],{},[669,670,671],"td",{},"Bolt Cloud with Bolt Database",[669,673,674],{},"Server functions for authenticated checkout creation and a separate signed webhook endpoint.",[654,676,677,680],{},[669,678,679],{},"Connected Supabase project",[669,681,682],{},"Supabase Edge Functions and the existing auth\u002Fdatabase integration.",[654,684,685,688],{},[669,686,687],{},"Separately hosted Node.js backend",[669,689,690],{},"Private server routes and that host's runtime secrets. Confirm the routes actually deploy; a browser-only static host cannot run them.",[471,692,693,694,698],{},"This guide focuses on Bolt Cloud and Supabase. For a separately hosted backend, choose a ",[484,695,697],{"href":696},"\u002Fguides\u002Fbuild-your-own-integration#choose-your-tools","package or direct HTTP integration"," that fits its runtime.",[499,700,702],{"id":701},"use-vatly-not-bolts-stripe-integration","Use Vatly, not Bolt's Stripe integration",[471,704,705,706,711,712,715],{},"Bolt's ",[484,707,710],{"href":708,"rel":709},"https:\u002F\u002Fsupport.bolt.new\u002Fintegrations\u002Fstripe",[488],"built-in Stripe integration"," imports Stripe products and generates checkout and webhook code. Those conveniences apply to Stripe, ",[475,713,714],{},"not to a custom Vatly integration",". Do not paste a Vatly key into the Stripe setup or reuse Stripe event names, signatures, or test cards.",[471,717,718],{},"Tell the agent to use Vatly explicitly. Create your products in Vatly, create checkouts on your server, and register your webhook URL in Vatly yourself. Your app remains responsible for authorizing checkout requests and updating access from verified Vatly events.",[471,720,721,722,727,728,731],{},"The prompt below starts your agent with ",[484,723,724],{"href":289},[625,725,726],{},"@getvatly\u002Ffluent",", the higher-level JavaScript billing package. Your agent connects its checkout and webhook building blocks to your existing database and access rules; it is not a ready-made Bolt Database or Supabase adapter. For other approaches, see ",[484,729,730],{"href":696},"Choose your tools",". Implementation examples live in the package docs.",[499,733,735],{"id":734},"configure-the-database-and-secrets","Configure the database and secrets",[737,738,739,745,748,772],"ol",{},[529,740,741,742,744],{},"Follow the ",[484,743,14],{"href":15}," to get a test key and product ID.",[529,746,747],{},"Ensure your Bolt project has a connected database. Bolt's server functions and secrets require one; if none exists, ask the agent to add it before building the payment functions.",[529,749,750,751,754,755,758,759,762,763,766,767,587],{},"Open the ",[475,752,753],{},"database icon » Secrets"," and add ",[625,756,757],{},"VATLY_API_KEY"," using your Vatly ",[625,760,761],{},"test_"," key. Add ",[625,764,765],{},"VATLY_WEBHOOK_SECRET"," with the signing secret configured for your Vatly webhook endpoint. Bolt can also prompt you to add these securely. See ",[484,768,771],{"href":769,"rel":770},"https:\u002F\u002Fsupport.bolt.new\u002Fbolt-cloud\u002Fdatabase\u002Fsecrets",[488],"Bolt secrets",[529,773,774,775,778],{},"Use ",[475,776,777],{},"database icon » Server Functions"," to inspect the generated functions and their logs. Never log the keys or full billing payloads while debugging.",[471,780,781,782,785,786,789],{},"Secrets are available to server functions, not browser code. Do not put Vatly credentials in Bolt's project ",[625,783,784],{},".env",", ",[625,787,788],{},"VITE_*"," variables, frontend components, or agent chat. With a separately hosted backend, configure equivalent private runtime secrets on that host.",[471,791,792,793,795,796,799,800,803,804,807],{},"Both ",[625,794,726],{}," and its underlying ",[625,797,798],{},"@getvatly\u002Fsdk"," are ",[475,801,802],{},"alpha",". Use the compatible, exact versions in ",[484,805,806],{"href":292},"fluent installation and configuration"," and review breaking changes before upgrading.",[499,809,811],{"id":810},"prompt-bolt-to-add-checkout-and-webhooks","Prompt Bolt to add checkout and webhooks",[471,813,814],{},"Use this prompt in your Bolt project. The agent should ask for product IDs and app URLs, not for secret values in chat.",[816,817,823],"pre",{"className":818,"code":820,"language":821,"meta":822},[819],"language-text","Integrate Vatly as this app's merchant of record for payments and billing.\nDo not use Bolt's Stripe integration, Stripe products, or Stripe webhooks.\n\nInspect package.json and identify the deployed backend. Keep the current\nBolt Database or Supabase connection; do not replace it. If there is no\ndatabase, explain that Bolt server functions and secrets need one and set\nit up before adding the functions. Use deployed server functions for\ncheckout creation and a separate public Vatly webhook receiver, not a\nbrowser-only helper or a Node server that only runs in the editor.\n\nRead:\nhttps:\u002F\u002Fdocs.vatly.com\u002Fguides\u002Fbuild-your-own-integration\nhttps:\u002F\u002Fdocs.vatly.com\u002Fpackages\u002Ffluent-js\u002Freadme\nhttps:\u002F\u002Fdocs.vatly.com\u002Fpackages\u002Ffluent-js\u002Fconfiguration\nhttps:\u002F\u002Fdocs.vatly.com\u002Fpackages\u002Ffluent-js\u002Fcheckouts\nhttps:\u002F\u002Fdocs.vatly.com\u002Fpackages\u002Ffluent-js\u002Fwebhooks\nhttps:\u002F\u002Fdocs.vatly.com\u002Fpackages\u002Ffluent-js\u002Fcoreconcepts\nhttps:\u002F\u002Fdocs.vatly.com\u002Fguides\u002Fwebhooks\nhttps:\u002F\u002Fdocs.vatly.com\u002Fapi-reference\nhttps:\u002F\u002Fdocs.vatly.com\u002Fopenapi.yaml\n\nStart with @getvatly\u002Ffluent and its required @getvatly\u002Fsdk dependency.\nPin the compatible alpha versions documented in configuration and check\nthe deployed runtime; use pinned npm: imports for Deno. Use the underlying\nSDK when a fluent helper is missing or the deployed runtime requires a\ndifferent approach, and explain the reason. Wire the documented storage\ndrivers to our database; do not assume adapters are included. Ask me to add\nVATLY_API_KEY and VATLY_WEBHOOK_SECRET via database Secrets, never in chat\nor .env. Keep SDK imports and credentials exclusively in server functions.\nAsk me for a test-mode product ID and fixed success\u002Fcanceled return URLs.\n\nRequire authentication for checkout creation. Load or create the Vatly\ncustomer for the signed-in user and keep a server-owned database mapping.\nNever accept an arbitrary customer ID, price, or redirect URL from the UI.\nAllowlist products and validate quantities server-side. Use the documented\nfluent checkout or subscription builder; return only its hosted checkout\nURL so the browser can redirect. Add CORS handling restricted to\nmy app's origins where functions are cross-origin. A return URL visit must\nnever grant access.\n\nThe webhook function must accept Vatly without a user JWT, while checkout\ncreation stays authenticated. Follow fluent's webhook guide: verify the\nuntouched request with the endpoint secret before writes, validate the\nenvelope, and wire transactional webhook storage. Reject invalid signatures\nand acknowledge verified webhook.setup. Use the signed event.id for\ndeduplication, commit processing and database changes atomically, and retry\non failure. Protect billing tables from client writes.\nImplement Vatly event names and top-level object payloads, including the\nsubscription lifecycle when selling subscriptions, not data.object.\n\nShow the deployed functions and HTTPS webhook URL, the Vatly events I need\nto subscribe to, and where to inspect function logs. Test login enforcement,\ncross-user isolation, invalid signatures, duplicate\u002Fconcurrent deliveries,\nstorage failure retries, and a completed test checkout. Distinguish tested\nbehavior from configuration or deployment work I still need to do.\n","text","",[625,824,820],{"__ignoreMap":822},[471,826,827,828,831],{},"Use the JavaScript packages in Bolt's managed server functions. A separately hosted backend can use ",[484,829,830],{"href":696},"another package or the HTTP API",". For Supabase Edge Functions, Vatly's webhook route needs JWT verification disabled for that function only: Vatly's signature, not a user's session, authenticates deliveries.",[499,833,835],{"id":834},"debug-a-deployed-bolt-integration","Debug a deployed Bolt integration",[648,837,838,848],{},[651,839,840],{},[654,841,842,845],{},[657,843,844],{},"Symptom",[657,846,847],{},"What to check",[664,849,850,858,866,877,885],{},[654,851,852,855],{},[669,853,854],{},"No Secrets or Server Functions view",[669,856,857],{},"A database must be connected. Ask Bolt to confirm which backend it uses before creating another one.",[654,859,860,863],{},[669,861,862],{},"Checkout works in preview but not after publishing",[669,864,865],{},"Confirm the function deployed, the runtime has its secret, and CORS allows the published app's origin. The frontend preview alone does not prove a working backend.",[654,867,868,871],{},[669,869,870],{},"Vatly cannot register or deliver to the webhook",[669,872,873,874,587],{},"Use the deployed public HTTPS function URL. Remove user-JWT requirements from that endpoint only, verify Vatly signatures, and acknowledge signed ",[625,875,876],{},"webhook.setup",[654,878,879,882],{},[669,880,881],{},"Webhook reports an invalid signature",[669,883,884],{},"Confirm the matching endpoint secret and verify the raw body before any JSON parsing. Use Vatly's verifier, not Stripe's.",[654,886,887,890],{},[669,888,889],{},"User pays but access stays pending",[669,891,892],{},"Inspect Server Functions logs and the durable inbox. Check event subscriptions, test\u002Flive mode, customer mapping, and failed database transactions. Do not bypass verification to make access appear.",[471,894,895,896,899,900,903,904,907],{},"Follow ",[484,897,898],{"href":316},"fluent testing"," and the ",[484,901,902],{"href":59},"test-mode guide"," before publishing for customers. Confirm unsigned, tampered, and stale webhooks are rejected, concurrent duplicates cannot fulfill twice, and storage failures can retry. Complete ",[484,905,906],{"href":602},"Vatly onboarding"," before switching to live credentials.",[471,909,910,911,587],{},"Building in Lovable instead? See ",[484,912,458],{"href":459},{"title":822,"searchDepth":914,"depth":914,"links":915},2,[916,917,918,919,920,921,922,923],{"id":501,"depth":914,"text":502},{"id":523,"depth":914,"text":524},{"id":573,"depth":914,"text":574},{"id":607,"depth":914,"text":608},{"id":701,"depth":914,"text":702},{"id":734,"depth":914,"text":735},{"id":810,"depth":914,"text":811},{"id":834,"depth":914,"text":835},"Add Vatly payments to Bolt.new for European software and digital products. Offload tax and invoicing, get a test API key, and prompt Bolt to wire up checkout.","md",null,{},true,{"title":462,"description":924},"HAywtT8ygHhArAvYYwOpdjaD3BH5RxQAFCZNRuQrMLs",[932,926],{"title":458,"path":459,"stem":460,"description":933,"children":-1},"Sell European software and digital products from Lovable with Vatly handling tax and invoicing. Start with a test API key and a copy-paste integration prompt.",1794594923137]