[{"data":1,"prerenderedAt":1152},["ShallowReactive",2],{"navigation_docs":3,"-packages-fluent-php-coreconcepts":465,"-packages-fluent-php-coreconcepts-surround":1147},[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":177,"body":467,"description":1140,"extension":1141,"links":1142,"meta":1143,"navigation":1144,"path":178,"seo":1145,"stem":179,"__hash__":1146},"docs\u002F3.packages\u002F2.fluent-php\u002F02.coreconcepts.md",{"type":468,"value":469,"toc":1134},"minimark",[470,479,898,909,914,928,931,935,1004,1019,1034,1038,1056,1069,1080,1090,1094,1115,1130],[471,472,473,474,478],"p",{},"Connect Fluent to your database without replacing your models. Build a driver by implementing the storage contracts, then pass those implementations to ",[475,476,477],"code",{},"Wiring",":",[480,481,486],"pre",{"className":482,"code":483,"language":484,"meta":485,"style":485},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","use Vatly\\Fluent\\Contracts\\ConfigurationInterface;\nuse Vatly\\Fluent\\Contracts\\CustomerBindingRepository;\nuse Vatly\\Fluent\\Contracts\\EventDispatcherInterface;\nuse Vatly\\Fluent\\Contracts\\OrderRepositoryInterface;\nuse Vatly\\Fluent\\Contracts\\SubscriptionRepositoryInterface;\nuse Vatly\\Fluent\\Contracts\\WebhookCallRepositoryInterface;\nuse Vatly\\Fluent\\Vatly;\nuse Vatly\\Fluent\\Wiring;\n\nfunction billing(\n    ConfigurationInterface $config,\n    CustomerBindingRepository $bindings,\n    SubscriptionRepositoryInterface $subscriptions,\n    OrderRepositoryInterface $orders,\n    WebhookCallRepositoryInterface $webhookCalls,\n    EventDispatcherInterface $events,\n): Vatly {\n    return new Vatly(new Wiring(\n        config: $config,\n        subscriptions: $subscriptions,\n        orders: $orders,\n        webhookCalls: $webhookCalls,\n        events: $events,\n        customerBindings: $bindings,\n    ));\n}\n","php","",[475,487,488,521,543,565,587,609,631,649,666,673,687,703,716,729,742,755,768,779,802,816,830,844,858,872,886,892],{"__ignoreMap":485},[489,490,493,497,501,505,508,510,513,515,518],"span",{"class":491,"line":492},"line",1,[489,494,496],{"class":495},"sbssI","use",[489,498,500],{"class":499},"sTEyZ"," Vatly",[489,502,504],{"class":503},"sMK4o","\\",[489,506,507],{"class":499},"Fluent",[489,509,504],{"class":503},[489,511,512],{"class":499},"Contracts",[489,514,504],{"class":503},[489,516,517],{"class":499},"ConfigurationInterface",[489,519,520],{"class":503},";\n",[489,522,524,526,528,530,532,534,536,538,541],{"class":491,"line":523},2,[489,525,496],{"class":495},[489,527,500],{"class":499},[489,529,504],{"class":503},[489,531,507],{"class":499},[489,533,504],{"class":503},[489,535,512],{"class":499},[489,537,504],{"class":503},[489,539,540],{"class":499},"CustomerBindingRepository",[489,542,520],{"class":503},[489,544,546,548,550,552,554,556,558,560,563],{"class":491,"line":545},3,[489,547,496],{"class":495},[489,549,500],{"class":499},[489,551,504],{"class":503},[489,553,507],{"class":499},[489,555,504],{"class":503},[489,557,512],{"class":499},[489,559,504],{"class":503},[489,561,562],{"class":499},"EventDispatcherInterface",[489,564,520],{"class":503},[489,566,568,570,572,574,576,578,580,582,585],{"class":491,"line":567},4,[489,569,496],{"class":495},[489,571,500],{"class":499},[489,573,504],{"class":503},[489,575,507],{"class":499},[489,577,504],{"class":503},[489,579,512],{"class":499},[489,581,504],{"class":503},[489,583,584],{"class":499},"OrderRepositoryInterface",[489,586,520],{"class":503},[489,588,590,592,594,596,598,600,602,604,607],{"class":491,"line":589},5,[489,591,496],{"class":495},[489,593,500],{"class":499},[489,595,504],{"class":503},[489,597,507],{"class":499},[489,599,504],{"class":503},[489,601,512],{"class":499},[489,603,504],{"class":503},[489,605,606],{"class":499},"SubscriptionRepositoryInterface",[489,608,520],{"class":503},[489,610,612,614,616,618,620,622,624,626,629],{"class":491,"line":611},6,[489,613,496],{"class":495},[489,615,500],{"class":499},[489,617,504],{"class":503},[489,619,507],{"class":499},[489,621,504],{"class":503},[489,623,512],{"class":499},[489,625,504],{"class":503},[489,627,628],{"class":499},"WebhookCallRepositoryInterface",[489,630,520],{"class":503},[489,632,634,636,638,640,642,644,647],{"class":491,"line":633},7,[489,635,496],{"class":495},[489,637,500],{"class":499},[489,639,504],{"class":503},[489,641,507],{"class":499},[489,643,504],{"class":503},[489,645,646],{"class":499},"Vatly",[489,648,520],{"class":503},[489,650,652,654,656,658,660,662,664],{"class":491,"line":651},8,[489,653,496],{"class":495},[489,655,500],{"class":499},[489,657,504],{"class":503},[489,659,507],{"class":499},[489,661,504],{"class":503},[489,663,477],{"class":499},[489,665,520],{"class":503},[489,667,669],{"class":491,"line":668},9,[489,670,672],{"emptyLinePlaceholder":671},true,"\n",[489,674,676,680,684],{"class":491,"line":675},10,[489,677,679],{"class":678},"spNyl","function",[489,681,683],{"class":682},"s2Zo4"," billing",[489,685,686],{"class":503},"(\n",[489,688,690,694,697,700],{"class":491,"line":689},11,[489,691,693],{"class":692},"sBMFI","    ConfigurationInterface",[489,695,696],{"class":503}," $",[489,698,699],{"class":499},"config",[489,701,702],{"class":503},",\n",[489,704,706,709,711,714],{"class":491,"line":705},12,[489,707,708],{"class":692},"    CustomerBindingRepository",[489,710,696],{"class":503},[489,712,713],{"class":499},"bindings",[489,715,702],{"class":503},[489,717,719,722,724,727],{"class":491,"line":718},13,[489,720,721],{"class":692},"    SubscriptionRepositoryInterface",[489,723,696],{"class":503},[489,725,726],{"class":499},"subscriptions",[489,728,702],{"class":503},[489,730,732,735,737,740],{"class":491,"line":731},14,[489,733,734],{"class":692},"    OrderRepositoryInterface",[489,736,696],{"class":503},[489,738,739],{"class":499},"orders",[489,741,702],{"class":503},[489,743,745,748,750,753],{"class":491,"line":744},15,[489,746,747],{"class":692},"    WebhookCallRepositoryInterface",[489,749,696],{"class":503},[489,751,752],{"class":499},"webhookCalls",[489,754,702],{"class":503},[489,756,758,761,763,766],{"class":491,"line":757},16,[489,759,760],{"class":692},"    EventDispatcherInterface",[489,762,696],{"class":503},[489,764,765],{"class":499},"events",[489,767,702],{"class":503},[489,769,771,774,776],{"class":491,"line":770},17,[489,772,773],{"class":503},"):",[489,775,500],{"class":692},[489,777,778],{"class":503}," {\n",[489,780,782,786,789,791,794,797,800],{"class":491,"line":781},18,[489,783,785],{"class":784},"s7zQu","    return",[489,787,788],{"class":495}," new",[489,790,500],{"class":692},[489,792,793],{"class":503},"(",[489,795,796],{"class":495},"new",[489,798,799],{"class":692}," Wiring",[489,801,686],{"class":503},[489,803,805,808,810,812,814],{"class":491,"line":804},19,[489,806,807],{"class":692},"        config",[489,809,478],{"class":503},[489,811,696],{"class":503},[489,813,699],{"class":499},[489,815,702],{"class":503},[489,817,819,822,824,826,828],{"class":491,"line":818},20,[489,820,821],{"class":692},"        subscriptions",[489,823,478],{"class":503},[489,825,696],{"class":503},[489,827,726],{"class":499},[489,829,702],{"class":503},[489,831,833,836,838,840,842],{"class":491,"line":832},21,[489,834,835],{"class":692},"        orders",[489,837,478],{"class":503},[489,839,696],{"class":503},[489,841,739],{"class":499},[489,843,702],{"class":503},[489,845,847,850,852,854,856],{"class":491,"line":846},22,[489,848,849],{"class":692},"        webhookCalls",[489,851,478],{"class":503},[489,853,696],{"class":503},[489,855,752],{"class":499},[489,857,702],{"class":503},[489,859,861,864,866,868,870],{"class":491,"line":860},23,[489,862,863],{"class":692},"        events",[489,865,478],{"class":503},[489,867,696],{"class":503},[489,869,765],{"class":499},[489,871,702],{"class":503},[489,873,875,878,880,882,884],{"class":491,"line":874},24,[489,876,877],{"class":692},"        customerBindings",[489,879,478],{"class":503},[489,881,696],{"class":503},[489,883,713],{"class":499},[489,885,702],{"class":503},[489,887,889],{"class":491,"line":888},25,[489,890,891],{"class":503},"    ));\n",[489,893,895],{"class":491,"line":894},26,[489,896,897],{"class":503},"}\n",[471,899,900,901,908],{},"Register that instance in your application's container. Fluent does not ship a database driver or migrations. Laravel users should use ",[902,903,907],"a",{"href":904,"rel":905},"https:\u002F\u002Fgithub.com\u002Fvatly\u002Fvatly-laravel",[906],"nofollow","vatly-laravel"," instead of writing this wiring.",[910,911,913],"h2",{"id":912},"choose-the-billable","Choose the billable",[471,915,916,917,920,921,924,925,927],{},"Your billable is the user, team, company, or tenant that pays. There is no ",[475,918,919],{},"Billable"," interface or required base model. Give Fluent a ",[475,922,923],{},"CustomerProfile"," with a Vatly customer ID, or use ",[902,926,68],{"href":181}," to create and bind one to your host ID.",[471,929,930],{},"A profile is input, not a stored customer. Supplying only its email to a checkout builder does not create or bind a customer. Create the customer explicitly, or use an empty profile for an anonymous checkout.",[910,932,934],{"id":933},"save-local-billing-state","Save local billing state",[936,937,938,951],"table",{},[939,940,941],"thead",{},[942,943,944,948],"tr",{},[945,946,947],"th",{},"Contract",[945,949,950],{},"Your implementation does",[952,953,954,964,973,982,991],"tbody",{},[942,955,956,961],{},[957,958,959],"td",{},[475,960,540],{},[957,962,963],{},"Maps host IDs to Vatly customer IDs in both directions; records unattributed customers.",[942,965,966,970],{},[957,967,968],{},[475,969,606],{},[957,971,972],{},"Finds by Vatly ID, stores a subscription, updates it.",[942,974,975,979],{},[957,976,977],{},[475,978,584],{},[957,980,981],{},"Finds by Vatly ID, stores an order, updates it.",[942,983,984,988],{},[957,985,986],{},[475,987,628],{},[957,989,990],{},"Records received deliveries and cleans up old audit rows. It does not skip duplicate processing.",[942,992,993,997],{},[957,994,995],{},[475,996,562],{},[957,998,999,1000,1003],{},"Dispatches typed events to your listeners. ",[475,1001,1002],{},"NullEventDispatcher"," is available if you need no listeners.",[471,1005,1006,1007,1010,1011,1014,1015,1018],{},"Repositories return your objects implementing ",[475,1008,1009],{},"SubscriptionInterface"," or ",[475,1012,1013],{},"OrderInterface",". Wrap existing host records rather than copying them; see ",[902,1016,1017],{"href":205},"Host tables",". Reader and writer contracts are also available separately when a component needs only one role.",[471,1020,1021,1022,1025,1026,1029,1030,1033],{},"Enforce unique Vatly IDs in storage and binding uniqueness in both directions. Accept ",[475,1023,1024],{},"hostCustomerId: null"," on store data: anonymous payments may arrive before a customer is linked. Entity ",[475,1027,1028],{},"store()"," methods may return ",[475,1031,1032],{},"null"," when a record genuinely does not belong to your integration. Throw on a storage failure so the delivery can retry.",[910,1035,1037],{"id":1036},"apply-partial-updates-correctly","Apply partial updates correctly",[471,1039,1040,1043,1044,1047,1048,1051,1052,1055],{},[475,1041,1042],{},"Store*Data"," and ",[475,1045,1046],{},"Update*Data"," carry local persistence data. Amounts are integer cents with a separate currency. SDK resources and money-bearing webhook events use ",[475,1049,1050],{},"Money"," objects instead; use ",[475,1053,1054],{},"toCents()"," at your own persistence boundary.",[471,1057,1058,1059,1061,1062,1043,1065,1068],{},"In updates, ",[475,1060,1032],{}," normally means leave the stored value alone. Subscription updates have explicit ",[475,1063,1064],{},"clearEndsAt",[475,1066,1067],{},"clearMandate"," flags. A non-null mandate replaces both its method and masked identifier; do not keep an old card's last four digits when a new mandate has no identifier.",[471,1070,1071,1072,1075,1076,1079],{},"Persist ",[475,1073,1074],{},"testmode"," from store data and expose it through the entity's ",[475,1077,1078],{},"isTestmode()",". Select the matching key in your application; storing the flag does not switch keys automatically.",[471,1081,1082,1085,1086,1089],{},[475,1083,1084],{},"DerivesSubscriptionState"," implements the subscription state predicates from ",[475,1087,1088],{},"getEndsAt()",": no end date means active, a future end date means a valid grace period, a past date means ended. These predicates are not a full entitlement policy for trials, failed payments, or disputes. Your app decides access.",[910,1091,1093],{"id":1092},"add-optional-records","Add optional records",[471,1095,1096,1098,1099,1102,1103,1106,1107,1110,1111,1114],{},[475,1097,477],{}," also accepts ",[475,1100,1101],{},"refunds",", ",[475,1104,1105],{},"chargebacks",", and ",[475,1108,1109],{},"orderLines",". Refund and chargeback repositories enable their persistence reactions. Order lines need your order writer to persist the ",[475,1112,1113],{},"StoreOrderData::$lines"," supplied on a new paid order; wiring a line reader alone does not save lines.",[471,1116,1117,1118,1120,1121,1124,1125,1129],{},"Use ",[902,1119,50],{"href":197}," for transactions and ",[902,1122,1123],{"href":201},"Event flow"," for the event-to-storage mapping. Field details live in the ",[902,1126,280],{"href":1127,"rel":1128},"https:\u002F\u002Fdocs.vatly.com\u002Fapi-reference",[906],".",[1131,1132,1133],"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 .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":485,"searchDepth":523,"depth":523,"links":1135},[1136,1137,1138,1139],{"id":912,"depth":523,"text":913},{"id":933,"depth":523,"text":934},{"id":1036,"depth":523,"text":1037},{"id":1092,"depth":523,"text":1093},"Connect Fluent to your database without replacing your models.","md",null,{},{"title":177},{"title":177,"description":1140},"PAiBCG3SapP-H_ygfi43cfJxIcDLCj6WfVxxmEUTFuA",[1148,1150],{"title":173,"path":174,"stem":175,"description":1149,"children":-1},"Install Fluent on your server with PHP 8.1 or newer and Composer.",{"title":68,"path":181,"stem":182,"description":1151,"children":-1},"Create a Vatly customer for the account that pays, then save the link to your own ID.",1794594927242]