[{"data":1,"prerenderedAt":1030},["ShallowReactive",2],{"navigation_docs":3,"-packages-fluent-php-readme":465,"-packages-fluent-php-readme-surround":1025},[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":165,"body":467,"description":1018,"extension":1019,"links":1020,"meta":1021,"navigation":1022,"path":170,"seo":1023,"stem":171,"__hash__":1024},"docs\u002F3.packages\u002F2.fluent-php\u002F00.readme.md",{"type":468,"value":469,"toc":1013},"minimark",[470,474,483,491,496,503,800,806,810,865,883,886,1001,1009],[471,472,473],"p",{},"Sell a download, start a subscription, and keep your app's billing records in step with Vatly.\nVatly is the European Merchant of Record for AI, software and digital products.",[475,476,477],"blockquote",{},[471,478,479],{},[480,481,482],"strong",{},"Alpha — under active development. Every alpha release may include breaking changes. Pin exact versions during alpha.",[471,484,485,486,490],{},"Fluent adds checkout builders, subscription operations, customer bindings, and a webhook processing pipeline to ",[487,488,489],"code",{},"vatly\u002Fvatly-api-php",". You keep your database and framework. Fluent calls your storage contracts to save orders and subscriptions.",[492,493,495],"h2",{"id":494},"start-a-subscription","Start a subscription",[471,497,498,499,502],{},"Install the package using ",[500,501,173],"a",{"href":174},". This function creates a hosted checkout and returns the URL to send to the browser:",[504,505,510],"pre",{"className":506,"code":507,"language":508,"meta":509,"style":509},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","use Vatly\\Fluent\\CustomerProfile;\nuse Vatly\\Fluent\\Vatly;\n\nfunction subscriptionCheckout(string $apiKey, string $customerId, string $planId): string\n{\n    $vatly = Vatly::apiOnly($apiKey);\n    $checkout = $vatly->subscriptionBuilder(new CustomerProfile(vatlyId: $customerId))\n        ->toPlan($planId)\n        ->withRedirectUrlSuccess('https:\u002F\u002Fapp.example.com\u002Fbilling\u002Freturn')\n        ->withRedirectUrlCanceled('https:\u002F\u002Fapp.example.com\u002Fbilling\u002Fcanceled')\n        ->create();\n\n    return $checkout->links->checkoutUrl->href;\n}\n","php","",[487,511,512,540,558,565,614,620,649,693,709,730,749,760,765,794],{"__ignoreMap":509},[513,514,517,521,525,529,532,534,537],"span",{"class":515,"line":516},"line",1,[513,518,520],{"class":519},"sbssI","use",[513,522,524],{"class":523},"sTEyZ"," Vatly",[513,526,528],{"class":527},"sMK4o","\\",[513,530,531],{"class":523},"Fluent",[513,533,528],{"class":527},[513,535,536],{"class":523},"CustomerProfile",[513,538,539],{"class":527},";\n",[513,541,543,545,547,549,551,553,556],{"class":515,"line":542},2,[513,544,520],{"class":519},[513,546,524],{"class":523},[513,548,528],{"class":527},[513,550,531],{"class":523},[513,552,528],{"class":527},[513,554,555],{"class":523},"Vatly",[513,557,539],{"class":527},[513,559,561],{"class":515,"line":560},3,[513,562,564],{"emptyLinePlaceholder":563},true,"\n",[513,566,568,572,576,579,582,585,588,591,594,596,599,601,603,605,608,611],{"class":515,"line":567},4,[513,569,571],{"class":570},"spNyl","function",[513,573,575],{"class":574},"s2Zo4"," subscriptionCheckout",[513,577,578],{"class":527},"(",[513,580,581],{"class":519},"string",[513,583,584],{"class":527}," $",[513,586,587],{"class":523},"apiKey",[513,589,590],{"class":527},",",[513,592,593],{"class":519}," string",[513,595,584],{"class":527},[513,597,598],{"class":523},"customerId",[513,600,590],{"class":527},[513,602,593],{"class":519},[513,604,584],{"class":527},[513,606,607],{"class":523},"planId",[513,609,610],{"class":527},"):",[513,612,613],{"class":519}," string\n",[513,615,617],{"class":515,"line":616},5,[513,618,619],{"class":527},"{\n",[513,621,623,626,629,632,635,638,641,644,646],{"class":515,"line":622},6,[513,624,625],{"class":527},"    $",[513,627,628],{"class":523},"vatly ",[513,630,631],{"class":527},"=",[513,633,524],{"class":634},"sBMFI",[513,636,637],{"class":527},"::",[513,639,640],{"class":574},"apiOnly",[513,642,643],{"class":527},"($",[513,645,587],{"class":523},[513,647,648],{"class":527},");\n",[513,650,652,654,657,659,661,664,667,670,672,675,678,680,683,686,688,690],{"class":515,"line":651},7,[513,653,625],{"class":527},[513,655,656],{"class":523},"checkout ",[513,658,631],{"class":527},[513,660,584],{"class":527},[513,662,663],{"class":523},"vatly",[513,665,666],{"class":527},"->",[513,668,669],{"class":574},"subscriptionBuilder",[513,671,578],{"class":527},[513,673,674],{"class":519},"new",[513,676,677],{"class":634}," CustomerProfile",[513,679,578],{"class":527},[513,681,682],{"class":634},"vatlyId",[513,684,685],{"class":527},":",[513,687,584],{"class":527},[513,689,598],{"class":523},[513,691,692],{"class":527},"))\n",[513,694,696,699,702,704,706],{"class":515,"line":695},8,[513,697,698],{"class":527},"        ->",[513,700,701],{"class":574},"toPlan",[513,703,643],{"class":527},[513,705,607],{"class":523},[513,707,708],{"class":527},")\n",[513,710,712,714,717,719,722,726,728],{"class":515,"line":711},9,[513,713,698],{"class":527},[513,715,716],{"class":574},"withRedirectUrlSuccess",[513,718,578],{"class":527},[513,720,721],{"class":527},"'",[513,723,725],{"class":724},"sfazB","https:\u002F\u002Fapp.example.com\u002Fbilling\u002Freturn",[513,727,721],{"class":527},[513,729,708],{"class":527},[513,731,733,735,738,740,742,745,747],{"class":515,"line":732},10,[513,734,698],{"class":527},[513,736,737],{"class":574},"withRedirectUrlCanceled",[513,739,578],{"class":527},[513,741,721],{"class":527},[513,743,744],{"class":724},"https:\u002F\u002Fapp.example.com\u002Fbilling\u002Fcanceled",[513,746,721],{"class":527},[513,748,708],{"class":527},[513,750,752,754,757],{"class":515,"line":751},11,[513,753,698],{"class":527},[513,755,756],{"class":574},"create",[513,758,759],{"class":527},"();\n",[513,761,763],{"class":515,"line":762},12,[513,764,564],{"emptyLinePlaceholder":563},[513,766,768,772,774,777,779,782,784,787,789,792],{"class":515,"line":767},13,[513,769,771],{"class":770},"s7zQu","    return",[513,773,584],{"class":527},[513,775,776],{"class":523},"checkout",[513,778,666],{"class":527},[513,780,781],{"class":523},"links",[513,783,666],{"class":527},[513,785,786],{"class":523},"checkoutUrl",[513,788,666],{"class":527},[513,790,791],{"class":523},"href",[513,793,539],{"class":527},[513,795,797],{"class":515,"line":796},14,[513,798,799],{"class":527},"}\n",[471,801,802,803,805],{},"Use a customer and plan from the same storefront and mode as your key. Authorize the signed-in user's access to that customer first. Redirect to the returned URL, then use ",[500,804,50],{"href":197}," to confirm the subscription and grant access. The return page alone is not proof of payment.",[492,807,809],{"id":808},"choose-your-layer","Choose your layer",[811,812,813,826],"table",{},[814,815,816],"thead",{},[817,818,819,823],"tr",{},[820,821,822],"th",{},"You need",[820,824,825],{},"Use",[827,828,829,844,852],"tbody",{},[817,830,831,835],{},[832,833,834],"td",{},"Billing in a Laravel app",[832,836,837,843],{},[500,838,842],{"href":839,"rel":840},"https:\u002F\u002Fgithub.com\u002Fvatly\u002Fvatly-laravel",[841],"nofollow","vatly-laravel",". It wires Fluent into Laravel for you.",[817,845,846,849],{},[832,847,848],{},"Fluent billing flows in plain PHP, Symfony, WordPress, or a custom driver",[832,850,851],{},"This package. Start without storage; add repositories when you need local records.",[817,853,854,857],{},[832,855,856],{},"A few direct API calls, without local billing state",[832,858,859,864],{},[500,860,863],{"href":861,"rel":862},"https:\u002F\u002Fdocs.vatly.com\u002Fpackages\u002Fphp\u002Freadme",[841],"vatly-api-php",". No Fluent layer required.",[471,866,867,868,871,872,871,875,878,879,882],{},"With the raw SDK you assemble checkout payloads and coordinate webhook persistence yourself. Fluent gives those common tasks names: ",[487,869,870],{},"toPlan()",", ",[487,873,874],{},"swapAndInvoice()",[487,876,877],{},"updateBilling()",", and ",[487,880,881],{},"webhookProcessor()->handle()",". It does not supply tables, routes, authorization, transactions, or exactly-once delivery.",[492,884,9],{"id":885},"guides",[811,887,888,898],{},[814,889,890],{},[817,891,892,895],{},[820,893,894],{},"Task",[820,896,897],{},"Page",[827,899,900,909,918,927,936,945,954,963,973,982,991],{},[817,901,902,905],{},[832,903,904],{},"Install, set keys, redirects, and handle errors",[832,906,907],{},[500,908,173],{"href":174},[817,910,911,914],{},[832,912,913],{},"Connect billables and storage",[832,915,916],{},[500,917,177],{"href":178},[817,919,920,923],{},[832,921,922],{},"Link your users to Vatly customers",[832,924,925],{},[500,926,68],{"href":181},[817,928,929,932],{},[832,930,931],{},"Sell one-off products and subscriptions",[832,933,934],{},[500,935,80],{"href":184},[817,937,938,941],{},[832,939,940],{},"Swap, cancel, resume, and update billing",[832,942,943],{},[500,944,88],{"href":187},[817,946,947,950],{},[832,948,949],{},"Open hosted self-service billing",[832,951,952],{},[500,953,193],{"href":194},[817,955,956,959],{},[832,957,958],{},"Verify deliveries and handle retries safely",[832,960,961],{},[500,962,50],{"href":197},[817,964,965,968],{},[832,966,967],{},"Choose which events to persist or listen for",[832,969,970],{},[500,971,972],{"href":201},"Event flow",[817,974,975,978],{},[832,976,977],{},"Show invoices, lines, refunds, and chargebacks",[832,979,980],{},[500,981,96],{"href":190},[817,983,984,987],{},[832,985,986],{},"Test without charging a customer",[832,988,989],{},[500,990,58],{"href":208},[817,992,993,996],{},[832,994,995],{},"Reuse your existing order and subscription tables",[832,997,998],{},[500,999,1000],{"href":205},"Host tables",[471,1002,1003,1004,1008],{},"For request and response fields, see the ",[500,1005,280],{"href":1006,"rel":1007},"https:\u002F\u002Fdocs.vatly.com\u002Fapi-reference",[841],".",[1010,1011,1012],"style",{},"html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":509,"searchDepth":542,"depth":542,"links":1014},[1015,1016,1017],{"id":494,"depth":542,"text":495},{"id":808,"depth":542,"text":809},{"id":885,"depth":542,"text":9},"Sell a download, start a subscription, and keep your app's billing records in step with Vatly.","md",null,{},{"title":128},{"title":165,"description":1018},"eXKuggwzIs-ggBMx7n6hTb3nrKIOFLIcrjow4JQCwZM",[1026,1028],{"title":161,"path":162,"stem":163,"description":1027,"children":-1},"A webhook endpoint is the HTTPS URL Vatly POSTs event deliveries to — registered from code (or infrastructure-as-code) rather than the dashboard.",{"title":173,"path":174,"stem":175,"description":1029,"children":-1},"Install Fluent on your server with PHP 8.1 or newer and Composer.",1794594926981]