[{"data":1,"prerenderedAt":1033},["ShallowReactive",2],{"navigation_docs":3,"-packages-fluent-php-webhook-flow":465,"-packages-fluent-php-webhook-flow-surround":1028},[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":467,"body":468,"description":1021,"extension":1022,"links":1023,"meta":1024,"navigation":1025,"path":201,"seo":1026,"stem":202,"__hash__":1027},"docs\u002F3.packages\u002F2.fluent-php\u002F09.webhook-flow.md","Event flow",{"type":469,"value":470,"toc":1016},"minimark",[471,480,654,661,666,834,849,863,873,877,962,965,969,992,999,1012],[472,473,474,475,479],"p",{},"Choose the event that matches your task. To listen for a paid order, implement your event dispatcher and register it in ",[476,477,478],"code",{},"Wiring",". This small adapter forwards typed events to an application callback:",[481,482,487],"pre",{"className":483,"code":484,"language":485,"meta":486,"style":486},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","use Vatly\\Fluent\\Contracts\\EventDispatcherInterface;\n\nfinal class BillingEvents implements EventDispatcherInterface\n{\n    public function __construct(private Closure $listener) {}\n\n    public function dispatch(object $event): void\n    {\n        ($this->listener)($event);\n    }\n}\n","php","",[476,488,489,522,529,549,555,589,594,620,626,642,648],{"__ignoreMap":486},[490,491,494,498,502,506,509,511,514,516,519],"span",{"class":492,"line":493},"line",1,[490,495,497],{"class":496},"sbssI","use",[490,499,501],{"class":500},"sTEyZ"," Vatly",[490,503,505],{"class":504},"sMK4o","\\",[490,507,508],{"class":500},"Fluent",[490,510,505],{"class":504},[490,512,513],{"class":500},"Contracts",[490,515,505],{"class":504},[490,517,518],{"class":500},"EventDispatcherInterface",[490,520,521],{"class":504},";\n",[490,523,525],{"class":492,"line":524},2,[490,526,528],{"emptyLinePlaceholder":527},true,"\n",[490,530,532,536,539,543,546],{"class":492,"line":531},3,[490,533,535],{"class":534},"spNyl","final",[490,537,538],{"class":534}," class",[490,540,542],{"class":541},"sBMFI"," BillingEvents",[490,544,545],{"class":534}," implements",[490,547,548],{"class":541}," EventDispatcherInterface\n",[490,550,552],{"class":492,"line":551},4,[490,553,554],{"class":504},"{\n",[490,556,558,561,564,568,571,574,577,580,583,586],{"class":492,"line":557},5,[490,559,560],{"class":534},"    public",[490,562,563],{"class":534}," function",[490,565,567],{"class":566},"s2Zo4"," __construct",[490,569,570],{"class":504},"(",[490,572,573],{"class":534},"private",[490,575,576],{"class":541}," Closure",[490,578,579],{"class":504}," $",[490,581,582],{"class":500},"listener",[490,584,585],{"class":504},")",[490,587,588],{"class":504}," {}\n",[490,590,592],{"class":492,"line":591},6,[490,593,528],{"emptyLinePlaceholder":527},[490,595,597,599,601,604,606,609,611,614,617],{"class":492,"line":596},7,[490,598,560],{"class":534},[490,600,563],{"class":534},[490,602,603],{"class":566}," dispatch",[490,605,570],{"class":504},[490,607,608],{"class":496},"object",[490,610,579],{"class":504},[490,612,613],{"class":500},"event",[490,615,616],{"class":504},"):",[490,618,619],{"class":496}," void\n",[490,621,623],{"class":492,"line":622},8,[490,624,625],{"class":504},"    {\n",[490,627,629,632,634,637,639],{"class":492,"line":628},9,[490,630,631],{"class":504},"        ($this->",[490,633,582],{"class":500},[490,635,636],{"class":504},")($",[490,638,613],{"class":500},[490,640,641],{"class":504},");\n",[490,643,645],{"class":492,"line":644},10,[490,646,647],{"class":504},"    }\n",[490,649,651],{"class":492,"line":650},11,[490,652,653],{"class":504},"}\n",[472,655,656,657,660],{},"In production, let that callback write outbox jobs on the same transaction as your repositories. It receives the typed event after the built-in reactions have run. Follow ",[658,659,50],"a",{"href":197}," for verification, deduplication, and the transaction boundary.",[662,663,665],"h2",{"id":664},"events-that-save-records","Events that save records",[667,668,669,682],"table",{},[670,671,672],"thead",{},[673,674,675,679],"tr",{},[676,677,678],"th",{},"Event",[676,680,681],{},"Built-in persistence",[683,684,685,696,714,724,734,744,754,764,778,792,802,818],"tbody",{},[673,686,687,693],{},[688,689,690],"td",{},[476,691,692],{},"order.paid",[688,694,695],{},"Find by Vatly ID; store a new order or update the existing one. New store data includes lines.",[673,697,698,703],{},[688,699,700],{},[476,701,702],{},"order.payment_failed",[688,704,705,706,709,710,713],{},"Store or update the order with the payload's status, usually ",[476,707,708],{},"pending"," during recovery. It does not invent a ",[476,711,712],{},"failed"," order status.",[673,715,716,721],{},[688,717,718],{},[476,719,720],{},"order.canceled",[688,722,723],{},"Update an existing order's status and cancellation reason; skip if missing.",[673,725,726,731],{},[688,727,728],{},[476,729,730],{},"subscription.started",[688,732,733],{},"Store a new subscription or update an existing one.",[673,735,736,741],{},[688,737,738],{},[476,739,740],{},"subscription.updated",[688,742,743],{},"Update an existing subscription's plan, name, and quantity for an immediate change.",[673,745,746,751],{},[688,747,748],{},[476,749,750],{},"subscription.billing_updated",[688,752,753],{},"Update an existing subscription's mandate summary.",[673,755,756,761],{},[688,757,758],{},[476,759,760],{},"subscription.resumed",[688,762,763],{},"Clear the end date on an existing subscription.",[673,765,766,775],{},[688,767,768,771,772],{},[476,769,770],{},"subscription.canceled_immediately",", ",[476,773,774],{},"subscription.canceled_with_grace_period",[688,776,777],{},"Update the existing subscription's confirmed end date and reason.",[673,779,780,785],{},[688,781,782],{},[476,783,784],{},"subscription.canceled_for_nonpayment",[688,786,787,788,791],{},"End the existing subscription after recovery is exhausted, with reason ",[476,789,790],{},"payment_failure",".",[673,793,794,799],{},[688,795,796],{},[476,797,798],{},"subscription.cancellation_grace_period_completed",[688,800,801],{},"Stamp the actual end date on an existing subscription.",[673,803,804,815],{},[688,805,806,771,809,771,812],{},[476,807,808],{},"refund.completed",[476,810,811],{},"refund.failed",[476,813,814],{},"refund.canceled",[688,816,817],{},"Store or update only when a refund repository is wired.",[673,819,820,828],{},[688,821,822,771,825],{},[476,823,824],{},"order.chargeback_received",[476,826,827],{},"order.chargeback_reversed",[688,829,830,831,791],{},"Store or update only when a chargeback repository is wired. The order stays ",[476,832,833],{},"paid",[472,835,836,837,840,841,844,845,848],{},"Order and subscription creation resolve ",[476,838,839],{},"hostCustomerId"," through your binding repository. It can be ",[476,842,843],{},"null",". The store DTOs carry ",[476,846,847],{},"testmode","; persist it. Order, refund, and chargeback store DTOs also carry totals, currency, and tax details.",[472,850,851,852,854,855,858,859,862],{},"All entity stores can return ",[476,853,843],{}," for an unroutable record. Successful new paid-order and subscription stores dispatch ",[476,856,857],{},"OrderWasCreatedFromWebhook"," and ",[476,860,861],{},"SubscriptionWasCreatedFromWebhook",". Updates do not dispatch those local-created events. This distinction is not a concurrency lock: enforce unique IDs and transactions in storage.",[472,864,865,866,868,869,872],{},"Partial updates use ",[476,867,843],{}," for no change. Persist cancellation reasons if your host needs them. Subscription resume uses ",[476,870,871],{},"clearEndsAt: true","; honor it in your writer.",[662,874,876],{"id":875},"events-your-app-handles","Events your app handles",[667,878,879,888],{},[670,880,881],{},[673,882,883,885],{},[676,884,678],{},[676,886,887],{},"Useful for",[683,889,890,904,917,933,943,951],{},[673,891,892,897],{},[688,893,894],{},[476,895,896],{},"subscription.update_scheduled",[688,898,899,900,903],{},"Showing a pending next-cycle change from the typed ",[476,901,902],{},"scheduledUpdate",". No current local plan change.",[673,905,906,911],{},[688,907,908],{},[476,909,910],{},"checkout.paid",[688,912,913,914,916],{},"Checkout analytics or handoff. Use ",[476,915,692],{}," for full order persistence.",[673,918,919,930],{},[688,920,921,771,924,771,927],{},[476,922,923],{},"checkout.failed",[476,925,926],{},"checkout.canceled",[476,928,929],{},"checkout.expired",[688,931,932],{},"Retry and abandoned-cart flows.",[673,934,935,940],{},[688,936,937],{},[476,938,939],{},"webhook.setup",[688,941,942],{},"Endpoint setup verification; acknowledge with 2xx.",[673,944,945,948],{},[688,946,947],{},"Product update, approval, rejection, archive, and unarchive events",[688,949,950],{},"Catalog notifications; no built-in storage.",[673,952,953,956],{},[688,954,955],{},"Unknown event names",[688,957,958,961],{},[476,959,960],{},"UnsupportedWebhookReceived",", so you can observe new events without inventing a handler.",[472,963,964],{},"Refund and chargeback events still dispatch when their optional repositories are absent. Checkout events do not create local orders or bindings on their own. Anonymous checkout events may have no customer ID yet.",[662,966,968],{"id":967},"money-and-snapshots","Money and snapshots",[472,970,971,972,975,976,979,980,983,984,987,988,991],{},"Typed event classes are owned by ",[476,973,974],{},"vatly-api-php"," in ",[476,977,978],{},"Vatly\\API\\Webhooks\\Events",". Money-bearing events use ",[476,981,982],{},"Money",", not integer amounts. For paid orders and refunds, read currency from ",[476,985,986],{},"total->currency","; use ",[476,989,990],{},"total->toCents()"," for local integer cents. Chargeback amounts are nullable at the event contract level and retain a separate currency field.",[472,993,994,995,998],{},"Fluent builds events from the signed resource snapshot without a follow-up GET. Its reactions flatten money to integer cents in persistence DTOs. They do not save subscription prices or build entitlement policy for you. Reversal totals are read live through the ",[658,996,997],{"href":190},"order handle",", not synthesized into order statuses.",[472,1000,1001,1002,1005,1006,1011],{},"See ",[658,1003,1004],{"href":205},"Host tables"," for routing initial payments and renewals, and the ",[658,1007,280],{"href":1008,"rel":1009},"https:\u002F\u002Fdocs.vatly.com\u002Fapi-reference",[1010],"nofollow"," for complete payload fields.",[1013,1014,1015],"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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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":486,"searchDepth":524,"depth":524,"links":1017},[1018,1019,1020],{"id":664,"depth":524,"text":665},{"id":875,"depth":524,"text":876},{"id":967,"depth":524,"text":968},"Choose the event that matches your task.","md",null,{},{"title":200},{"title":467,"description":1021},"Z4vKx-VwS-mLNhyL93AdJZq_vclrh9Vh3mCQEfpamd0",[1029,1031],{"title":50,"path":197,"stem":198,"description":1030,"children":-1},"Keep local billing records current after checkout, renewals, and portal changes.",{"title":204,"path":205,"stem":206,"description":1032,"children":-1},"Reuse an application's existing orders instead of creating parallel Fluent tables.",1794594923546]