[{"data":1,"prerenderedAt":877},["ShallowReactive",2],{"navigation_docs":3,"-integrations-lovable":465,"-integrations-lovable-surround":872},[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":458,"body":467,"description":865,"extension":866,"links":867,"meta":868,"navigation":869,"path":459,"seo":870,"stem":460,"__hash__":871},"docs\u002F4.integrations\u002F1.lovable.md",{"type":468,"value":469,"toc":854},"minimark",[470,479,495,498,503,512,521,525,570,574,591,599,603,608,617,653,662,677,681,698,706,721,725,746,770,785,789,792,802,813,817,849],[471,472,473,474,478],"p",{},"Use Vatly as the ",[475,476,477],"strong",{},"European merchant of record for your Lovable app"," to sell software, digital products, or SaaS subscriptions without building your own tax and invoicing workflow. Vatly is the European merchant of record for AI, software and digital products: it becomes the legal seller, while you build and deliver the product.",[471,480,481],{},[475,482,483,490,491],{},[484,485,489],"a",{"href":486,"rel":487},"https:\u002F\u002Fmy.vatly.com",[488],"nofollow","Get a test API key"," · ",[484,492,494],{"href":493},"#prompt-lovable-to-build-the-integration","Copy the Lovable agent prompt",[471,496,497],{},"This is a custom API integration using Vatly's existing JavaScript packages, not a native Lovable payment connector or an endorsement by Lovable. You do not need a Vatly-specific change to Lovable or Vatly to follow this approach.",[499,500,502],"h2",{"id":501},"why-use-a-merchant-of-record-instead-of-plain-stripe","Why use a merchant of record instead of plain Stripe?",[471,504,505,506,511],{},"Lovable can add a payment integration, but accepting a card payment is not the same as handing over the seller's responsibilities. With a standard payment-processing integration, your business remains the seller and must arrange tax compliance and invoicing. For a broader comparison, see ",[484,507,510],{"href":508,"rel":509},"https:\u002F\u002Fvatly.com\u002Fvs\u002Fstripe",[488],"Vatly vs Stripe",".",[471,513,514,515,520],{},"With Vatly, the ",[484,516,519],{"href":517,"rel":518},"https:\u002F\u002Fvatly.com\u002F",[488],"tax and invoicing for Vatly sales are Vatly's responsibility",": calculating and collecting EU VAT and applicable sales tax, handling registrations, filing and remitting tax, and issuing customer invoices. You still own your app, access control, and fulfillment. The difference is who takes on the legal seller's tax work, not just which checkout button you use.",[499,522,524],{"id":523},"why-vatly-fits-a-lovable-app","Why Vatly fits a Lovable app",[526,527,528,540,550,560],"ul",{},[529,530,531,534,535,511],"li",{},[475,532,533],{},"Europe-first."," Vatly is based in the Netherlands and built for European software and digital product businesses selling internationally, with ",[484,536,539],{"href":537,"rel":538},"https:\u002F\u002Fvatly.com\u002Fmollie-merchant-of-record",[488],"European payment methods through Mollie",[529,541,542,545,546,549],{},[475,543,544],{},"Software billing, including AI apps."," Sell an AI app's subscription or a one-off digital product through the same ",[484,547,548],{"href":81},"checkout API",". You do not need a payment integration specific to the model or AI service your app uses.",[529,551,552,555,556,559],{},[475,553,554],{},"Multi-line orders."," A checkout can include multiple products and quantities, for example a subscription plan and a one-off digital download, with ",[484,557,558],{"href":97},"order lines and tax information"," available to your backend.",[529,561,562,565,566,569],{},[475,563,564],{},"Hosted checkout and customer portal."," Redirect customers to checkout instead of building a payment form. The ",[484,567,568],{"href":310},"hosted portal"," provides invoice history and subscription controls for eligible customers; portal access requires an issued invoice.",[499,571,573],{"id":572},"start-with-a-test-checkout","Start with a test checkout",[471,575,576,586,587,590],{},[475,577,578,582,583,511],{},[484,579,581],{"href":486,"rel":580},[488],"Create your Vatly account",", get a test API key under Developers » API keys, and ",[484,584,585],{"href":493},"copy the Lovable agent prompt"," Create a test product under ",[475,588,589],{},"Manage Products",", then let Lovable connect a checkout button to your existing backend using the prompt below. Enter the key only in Lovable's secure secret form, never in chat.",[471,592,593,594,598],{},"Test mode works from the start. Your first milestone is a hosted test checkout followed by a verified webhook that updates access in your app, not a complete billing UI built from scratch. Live sales require ",[484,595,597],{"href":596},"\u002Fintroduction#going-live","Vatly approval, product review, and Mollie verification",". Product review typically takes one to two business days; that is not a guarantee of your integration or go-live date.",[499,600,602],{"id":601},"choose-the-right-server-code-for-your-lovable-project","Choose the right server code for your Lovable project",[471,604,605,606,511],{},"You keep your existing app, customer login, and database. Lovable adds a checkout action that sends customers to Vatly's hosted payment page, plus a background receiver for billing updates. After a verified payment, your app grants the purchased access. You do not need to build a card-entry form. For the responsibilities behind this flow, see ",[484,607,26],{"href":27},[471,609,610,611,616],{},"Lovable's ",[484,612,615],{"href":613,"rel":614},"https:\u002F\u002Fdocs.lovable.dev\u002Fintroduction\u002Ffaq",[488],"current stack documentation"," distinguishes two kinds of app:",[618,619,620,633],"table",{},[621,622,623],"thead",{},[624,625,626,630],"tr",{},[627,628,629],"th",{},"Your project",[627,631,632],{},"Where Vatly code belongs",[634,635,636,645],"tbody",{},[624,637,638,642],{},[639,640,641],"td",{},"Newer TanStack Start app",[639,643,644],{},"A server function for authenticated checkout creation, and a public server route for signed webhooks. Keep SDK imports and secrets out of code shared with the browser.",[624,646,647,650],{},[639,648,649],{},"Older React + Vite app",[639,651,652],{},"An Edge Function in Lovable's built-in backend (Lovable Cloud), or your connected Supabase project. A React component or Vite development server is not a private backend.",[471,654,655,656,661],{},"Lovable says apps created from May 13, 2026 (June 22, 2026 for Enterprise workspaces) use TanStack Start. Inspect your actual project before choosing a route: an older project may have been upgraded. Its ",[484,657,660],{"href":658,"rel":659},"https:\u002F\u002Fdocs.lovable.dev\u002Fintegrations\u002Fany-api",[488],"direct API integration guide"," explains this server-function versus Edge Function split.",[471,663,664,665,670,671,676],{},"The ",[484,666,669],{"href":667,"rel":668},"https:\u002F\u002Fdocs.lovable.dev\u002Ffeatures\u002Fcloud",[488],"built-in backend"," provides database, auth, storage, and Edge Functions using Supabase's open-source foundation. A ",[484,672,675],{"href":673,"rel":674},"https:\u002F\u002Fdocs.lovable.dev\u002Fintegrations\u002Fsupabase",[488],"connected Supabase project"," gives you ownership of the backend in your own Supabase account. Use the backend you already have; adding Vatly does not require migrating it. Store user-to-Vatly-customer mappings and processed webhook IDs in your database.",[499,678,680],{"id":679},"add-vatly-rather-than-the-default-payments-flow","Add Vatly rather than the default payments flow",[471,682,683,684,689,690,693,694,697],{},"Lovable offers ",[484,685,688],{"href":686,"rel":687},"https:\u002F\u002Fdocs.lovable.dev\u002Ffeatures\u002Fpayments",[488],"built-in payments"," and other payment integrations. If you want ",[475,691,692],{},"Vatly"," to be the merchant of record, explicitly request a ",[475,695,696],{},"direct Vatly API integration",". Do not ask only to \"add payments\": the agent could choose a different provider.",[471,699,700,701,705],{},"Lovable also supports ",[484,702,704],{"href":658,"rel":703},[488],"custom API connectors",". This guide uses server-side Vatly packages so your app owns checkout authorization, webhook verification, and fulfillment. It does not use Lovable's built-in payments setup or ask you to connect a Stripe account for Vatly.",[471,707,708,709,715,716,720],{},"The prompt below starts your agent with ",[484,710,711],{"href":289},[712,713,714],"code",{},"@getvatly\u002Ffluent",", the higher-level JavaScript billing package. It provides building blocks for checkout, subscriptions, and webhook processing; your agent connects those to your database and access rules. The ",[484,717,719],{"href":718},"\u002Fguides\u002Fbuild-your-own-integration#choose-your-tools","general integration guide"," explains the alternatives, while the package docs own implementation examples.",[499,722,724],{"id":723},"set-up-the-account-and-secrets","Set up the account and secrets",[471,726,727,728,730,731,733,734,737,738,741,742,745],{},"Follow the ",[484,729,14],{"href":15},", starting with a test key and product. Both ",[712,732,714],{}," and its underlying ",[712,735,736],{},"@getvatly\u002Fsdk"," are ",[475,739,740],{},"alpha","; use the compatible, exact versions in ",[484,743,744],{"href":292},"fluent installation and configuration",", because alpha updates may break compatibility.",[471,747,748,749,752,753,756,757,760,761,764,765,511],{},"When Lovable prompts for ",[712,750,751],{},"VATLY_API_KEY",", use the secure ",[475,754,755],{},"Add secret"," form, not the chat. Manage project secrets under ",[475,758,759],{},"More » Settings » Secrets",". If your app uses an external Supabase project, Lovable's ",[475,762,763],{},"Manage secrets"," opens the Supabase dashboard; store the secret in that project's Edge Function settings. See ",[484,766,769],{"href":767,"rel":768},"https:\u002F\u002Fdocs.lovable.dev\u002Ffeatures\u002Fsecrets",[488],"Lovable secrets",[471,771,772,773,776,777,780,781,784],{},"Add a separate ",[712,774,775],{},"VATLY_WEBHOOK_SECRET"," matching the signing secret configured for your Vatly webhook endpoint. Both values are ",[475,778,779],{},"server-side only",". Never create ",[712,782,783],{},"VITE_VATLY_API_KEY",", put the key in React code, or paste it into an agent prompt. Public Supabase connection values do not make a Vatly API key safe to expose.",[499,786,788],{"id":787},"prompt-lovable-to-build-the-integration","Prompt Lovable to build the integration",[471,790,791],{},"Paste this into Lovable after choosing your product and return URLs. Provide IDs and URLs when asked, but enter secret values only in the secure secret form.",[793,794,800],"pre",{"className":795,"code":797,"language":798,"meta":799},[796],"language-text","Use Vatly as the merchant of record for this app. Build a direct API\nintegration, not Lovable built-in payments or a Stripe\u002FPaddle integration.\n\nFirst inspect this project's framework and backend. If it uses TanStack\nStart, keep checkout creation in a server function and webhooks in a public\nserver route. If it uses React + Vite, use an Edge Function in the existing\nLovable Cloud or connected Supabase backend. Do not migrate the backend.\nTell me which files and deployed routes will contain server-only code.\n\nRead these sources before writing code:\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.\nAsk me for a test-mode Vatly product ID and fixed success\u002Fcanceled URLs.\nAsk for VATLY_API_KEY and VATLY_WEBHOOK_SECRET through the secret form,\nnever chat. Never put either value in VITE_ variables or browser code.\n\nAuthenticate checkout requests, load or create the signed-in user's Vatly\ncustomer on the server, and store the mapping in the database. Restrict\nproducts and quantities server-side. Use the documented fluent checkout\nor subscription builder and return only the hosted checkout URL to the\nbrowser. Redirect there. Do not unlock access on return.\n\nMake only the webhook route public without user JWT\u002Fsession requirements.\nFollow fluent's webhook guide: verify the untouched request with the\nendpoint secret before writes, validate the envelope, and wire transactional\nwebhook storage. Reject bad signatures and acknowledge verified webhook.setup.\nUse the verified event.id for deduplication; commit processing and database\nchanges atomically, with retries on failure. Configure access policies so users\ncannot write their own billing\u002Faccess state. Follow Vatly's actual event\nnames and envelope, and handle subscription cancellation and renewals.\n\nShow me the deployed HTTPS webhook URL and which Vatly events to subscribe\nto under Developers > Webhooks. Test auth, cross-user customer access, CORS\nwhere needed, invalid signatures, duplicate events, and payment confirmation.\nReport what you tested and what still needs my setup; do not claim live\npayments work without a completed test-mode checkout and verified delivery.\n","text","",[712,801,797],{"__ignoreMap":799},[471,803,804,805,808,809,812],{},"Use the JavaScript packages in Lovable's managed server functions. A separately hosted backend can use ",[484,806,807],{"href":718},"another package or the HTTP API",". If Lovable generates a Supabase function with JWT verification enabled for the webhook, ask it to allow external requests ",[475,810,811],{},"only on that function",", while keeping Vatly signature verification mandatory. The checkout function must still require your user's authentication.",[499,814,816],{"id":815},"review-the-result-in-lovable","Review the result in Lovable",[526,818,819,826,829,832,842],{},[529,820,821,822,825],{},"Ask the agent to identify the server-only SDK imports and show that the browser calls your backend, not ",[712,823,824],{},"api.vatly.com"," with your API key.",[529,827,828],{},"In an older Vite app, confirm it deployed an Edge Function, not just a frontend helper. In a TanStack Start app, confirm the webhook is a deployed HTTP route, not a server function that only the UI can invoke.",[529,830,831],{},"Confirm the return page stays pending until the database reflects a verified payment event, and database policies prevent clients from granting themselves access.",[529,833,834,835,838,839,511],{},"Test unsigned, tampered, and stale webhooks, duplicate deliveries, and a database failure. Confirm retries cannot grant access twice. Follow ",[484,836,837],{"href":316},"fluent testing"," and the ",[484,840,841],{"href":59},"test-mode guide",[529,843,844,845,848],{},"Register the deployed webhook URL in Vatly, not the editor preview URL. Do not replace the test key with a live key until ",[484,846,847],{"href":596},"onboarding"," is complete.",[471,850,851,852,511],{},"Building in Bolt instead? See ",[484,853,462],{"href":463},{"title":799,"searchDepth":855,"depth":855,"links":856},2,[857,858,859,860,861,862,863,864],{"id":501,"depth":855,"text":502},{"id":523,"depth":855,"text":524},{"id":572,"depth":855,"text":573},{"id":601,"depth":855,"text":602},{"id":679,"depth":855,"text":680},{"id":723,"depth":855,"text":724},{"id":787,"depth":855,"text":788},{"id":815,"depth":855,"text":816},"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.","md",null,{},true,{"title":458,"description":865},"te8AMCgeUD9apiwGTApDDNlu4V04i2QcGLh7_RBmUfs",[873,875],{"title":451,"path":452,"stem":456,"description":874,"children":-1},"Find platform-specific guides for using Vatly as merchant of record. Connect your Lovable or Bolt app and take the next step toward your first test purchase.",{"title":462,"path":463,"stem":464,"description":876,"children":-1},"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.",1794594922855]