[{"data":1,"prerenderedAt":826},["ShallowReactive",2],{"navigation_docs":3,"-guides-build-your-own-integration":465,"-guides-build-your-own-integration-surround":821},[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":26,"body":467,"description":814,"extension":815,"links":816,"meta":817,"navigation":818,"path":27,"seo":819,"stem":28,"__hash__":820},"docs\u002F1.guides\u002F2.build-your-own-integration.md",{"type":468,"value":469,"toc":803},"minimark",[470,474,477,482,520,524,576,583,587,605,611,615,637,640,643,647,650,721,728,732,735,749,767,771,774,788],[471,472,473],"p",{},"You do not need to build a payment form or your own tax and invoicing workflow to sell with Vatly. Vatly is the European merchant of record for AI, software and digital products: it acts as the legal seller and provides hosted checkout. Your app delivers the product and controls access.",[471,475,476],{},"This guide helps you decide what to connect before writing code or asking an agent to implement it. Whether a developer or an AI agent does the work, the responsibilities are the same.",[478,479,481],"h2",{"id":480},"choose-your-starting-point","Choose your starting point",[483,484,485,505,511],"ul",{},[486,487,488,492,493,497,498,501,502,504],"li",{},[489,490,491],"strong",{},"Using Lovable or Bolt?"," Follow the ",[494,495,496],"a",{"href":459},"Lovable"," or ",[494,499,500],{"href":463},"Bolt"," guide for the setup in your platform and a ready-to-use agent prompt. Find platform-specific instructions under ",[494,503,451],{"href":452},".",[486,506,507,510],{},[489,508,509],{},"Connecting your own app?"," Continue below to plan the integration and choose the right implementation documentation.",[486,512,513,516,517,519],{},[489,514,515],{},"Ready to make an API request?"," The ",[494,518,14],{"href":15}," covers your first authenticated call. It is a technical first step, not a complete payment integration.",[478,521,523],{"id":522},"what-vatly-handles-and-what-stays-in-your-app","What Vatly handles, and what stays in your app",[525,526,527,540],"table",{},[528,529,530],"thead",{},[531,532,533,537],"tr",{},[534,535,536],"th",{},"Vatly handles",[534,538,539],{},"Your app handles",[541,542,543,552,560,568],"tbody",{},[531,544,545,549],{},[546,547,548],"td",{},"Being the legal seller, including tax and customer invoicing for Vatly sales",[546,550,551],{},"Your software or digital product, customer accounts, and support for your product",[531,553,554,557],{},[546,555,556],{},"The hosted checkout and payment flow",[546,558,559],{},"Your pricing UI and the decision about which products a customer can buy",[531,561,562,565],{},[546,563,564],{},"Billing events, including payments and subscription changes",[546,566,567],{},"Delivering downloads, activating licenses, or granting and updating access",[531,569,570,573],{},[546,571,572],{},"A hosted customer portal for eligible customers",[546,574,575],{},"Authenticating the customer and opening their portal session securely",[471,577,578,579,582],{},"Portal access requires an issued invoice. See the ",[494,580,581],{"href":310},"customer portal documentation",". Your existing login and database can remain in place; adding Vatly does not require replacing them.",[478,584,586],{"id":585},"what-a-purchase-looks-like","What a purchase looks like",[588,589,590,593,596,599,602],"ol",{},[486,591,592],{},"A customer chooses a product or plan in your app.",[486,594,595],{},"Your backend checks what that customer can buy and asks Vatly to create a checkout. The API key stays on your server.",[486,597,598],{},"Your app sends the customer to Vatly's hosted checkout to pay, then shows a return page in your app.",[486,600,601],{},"Vatly sends a signed notification, called a webhook, to your backend. Your app verifies it before recording the purchase and delivering access.",[486,603,604],{},"For subscriptions, your app keeps access in step with renewals, cancellations, and other billing changes. Refunds and disputes also need an access policy.",[471,606,607,608,610],{},"The return page is not proof of payment. A customer may close the checkout tab or visit the return URL directly; delivery must depend on the verified billing result, not that browser visit. The ",[494,609,30],{"href":31}," walks through the sale lifecycle in more detail.",[478,612,614],{"id":613},"prepare-a-test-integration","Prepare a test integration",[471,616,617,623,624,628,629,632,633,636],{},[494,618,622],{"href":619,"rel":620},"https:\u002F\u002Fmy.vatly.com",[621],"nofollow","Create a Vatly account",", get a ",[625,626,627],"code",{},"test_"," key under ",[489,630,631],{},"Developers » API keys",", and create a test product under ",[489,634,635],{},"Manage Products",". Choose a one-off product for a single purchase or a subscription plan for recurring access. Keep the key, products, and customers in the same storefront and mode.",[471,638,639],{},"Your app needs a deployed backend that can call Vatly privately, receive HTTPS webhooks, and store billing state. A frontend-only site needs a backend or server functions for these tasks. Store API keys and webhook signing secrets in that backend's secret manager—not browser code, frontend environment variables, or agent chat.",[471,641,642],{},"Test mode is available before going live. Your first milestone is one complete test purchase that grants the right customer access, not a finished billing dashboard.",[478,644,646],{"id":645},"choose-your-tools","Choose your tools",[471,648,649],{},"For app-level billing, start with a fluent package rather than assembling every flow from low-level API calls:",[483,651,652,672,684,696],{},[486,653,654,657,658,663,664,667,668,671],{},[489,655,656],{},"JavaScript \u002F TypeScript:"," ",[494,659,660],{"href":289},[625,661,662],{},"@getvatly\u002Ffluent"," builds on ",[625,665,666],{},"@getvatly\u002Fsdk"," with checkout and subscription builders, customer bindings, and webhook processing. Follow ",[494,669,670],{"href":292},"configuration"," for compatible versions and runtime requirements.",[486,673,674,657,677,679,680,683],{},[489,675,676],{},"PHP:",[494,678,165],{"href":201}," provides higher-level billing flows. The ",[494,681,682],{"href":216},"Laravel package"," wires fluent for Laravel.",[486,685,686,657,689,691,692,695],{},[489,687,688],{},"Python:",[494,690,367],{"href":372}," provides async-first billing flows and storage contracts. The ",[494,693,694],{"href":414},"Django package"," integrates fluent with Django's ORM and webhook handling. Both are available on PyPI.",[486,697,698,701,702,705,706,709,710,712,713,716,717,720],{},[489,699,700],{},"Direct API access:"," Use the matching ",[494,703,704],{"href":117},"SDK"," when you only need the API client, or the ",[494,707,708],{"href":64},"HTTP API"," from another server-side language. The ",[494,711,319],{"href":324}," is available on PyPI as ",[625,714,715],{},"vatly-api-python"," (import ",[625,718,719],{},"vatly",").",[471,722,723,724,727],{},"The JavaScript, Python, Django and PHP fluent packages are ",[489,725,726],{},"alpha",". Every alpha release may include breaking changes. Pin exact versions during alpha. Follow each package's installation guidance and review upgrades. Fluent packages provide building blocks, not your app's access policy or a database integration that configures itself: your developer or agent must wire the required storage drivers and authorization checks.",[478,729,731],{"id":730},"hand-off-a-clear-brief","Hand off a clear brief",[471,733,734],{},"Give your developer or agent the decisions that belong to your business:",[483,736,737,740,743,746],{},[486,738,739],{},"Which products or plans you will sell, and what each purchase unlocks.",[486,741,742],{},"Which existing login, database, and deployed backend to use.",[486,744,745],{},"Where customers should return after completing or canceling checkout.",[486,747,748],{},"How access should change after a renewal, cancellation, refund, or dispute.",[471,750,751,752,757,758,760,761,766],{},"Ask them to follow the chosen package's checkout and webhook documentation, and to show you the deployed checkout flow and webhook URL. Secrets should be entered through the host's secure secret form, never included in the brief. Agents can use the ",[494,753,756],{"href":754,"rel":755},"https:\u002F\u002Fdocs.vatly.com\u002Fllms.txt",[621],"documentation index",", ",[494,759,280],{"href":64},", and ",[494,762,765],{"href":763,"rel":764},"https:\u002F\u002Fdocs.vatly.com\u002Fopenapi.yaml",[621],"OpenAPI specification"," to check implementation details.",[478,768,770],{"id":769},"know-when-you-are-ready-to-sell","Know when you are ready to sell",[471,772,773],{},"Before switching to live credentials, review the integration as a customer:",[483,775,776,779,782,785],{},[486,777,778],{},"A completed test purchase grants the right access; a canceled checkout or a visit to the return URL alone does not.",[486,780,781],{},"Customers cannot buy on another user's account or grant themselves access through the browser.",[486,783,784],{},"Repeated webhook deliveries do not fulfill a purchase twice, invalid signatures are rejected, and failed processing can retry.",[486,786,787],{},"Subscription and post-payment changes follow the access policy you chose.",[471,789,790,791,757,794,797,798,802],{},"Your implementer can use the ",[494,792,793],{"href":51},"webhook guide",[494,795,796],{"href":59},"test-mode guide",", and package-specific tests for these checks. Live selling also requires ",[494,799,801],{"href":800},"\u002Fintroduction#going-live","Vatly approval, product review, and Mollie verification",". A working test integration is not a guarantee of a go-live date.",{"title":804,"searchDepth":805,"depth":805,"links":806},"",2,[807,808,809,810,811,812,813],{"id":480,"depth":805,"text":481},{"id":522,"depth":805,"text":523},{"id":585,"depth":805,"text":586},{"id":613,"depth":805,"text":614},{"id":645,"depth":805,"text":646},{"id":730,"depth":805,"text":731},{"id":769,"depth":805,"text":770},"Understand what adopting Vatly involves: responsibilities, checkout and fulfillment, choosing an integration path, and preparing your developer or AI agent.","md",null,{},true,{"title":26,"description":814},"2SSa0vGnoFiy-6vR3Wx4XfDtorzswL7_Kobivt6ONq0",[822,824],{"title":22,"path":23,"stem":24,"description":823,"children":-1},"The billing emails Vatly sends to your customers as Merchant of Record, when each one is sent, and what you can configure.",{"title":30,"path":31,"stem":32,"description":825,"children":-1},"Follow the typical Vatly happy path from account setup to product delivery, and prepare for refunds and chargebacks.",1794594921316]