[{"data":1,"prerenderedAt":1383},["ShallowReactive",2],{"navigation_docs":3,"-packages-laravel-comparison":190,"-packages-laravel-comparison-surround":1378},[4,8,50,103,186],{"title":5,"path":6,"stem":7},"Introduction","/introduction","0.introduction",{"title":9,"path":10,"stem":11,"children":12,"page":49},"Guides","/guides","1.guides",[13,17,21,25,29,33,37,41,45],{"title":14,"path":15,"stem":16},"Quickstart","/guides/quickstart","1.guides/1.quickstart",{"title":18,"path":19,"stem":20},"Selling Workflow","/guides/selling-workflow","1.guides/2.selling-workflow",{"title":22,"path":23,"stem":24},"Vatly SDKs","/guides/sdks","1.guides/3.sdks",{"title":26,"path":27,"stem":28},"Authentication","/guides/authentication","1.guides/4.authentication",{"title":30,"path":31,"stem":32},"Pagination","/guides/pagination","1.guides/5.pagination",{"title":34,"path":35,"stem":36},"Errors","/guides/errors","1.guides/6.errors",{"title":38,"path":39,"stem":40},"Webhooks","/guides/webhooks","1.guides/7.webhooks",{"title":42,"path":43,"stem":44},"Idempotency","/guides/idempotency","1.guides/8.idempotency",{"title":46,"path":47,"stem":48},"Testing","/guides/testing","1.guides/9.testing",false,{"title":51,"path":52,"stem":53,"children":54,"page":49},"Api Reference","/api-reference","2.api-reference",[55,59,63,67,71,75,79,83,87,91,95,99],{"title":56,"path":57,"stem":58},"Customers","/api-reference/customers","2.api-reference/1.customers",{"title":60,"path":61,"stem":62},"Webhook Endpoints","/api-reference/webhook-endpoints","2.api-reference/10.webhook-endpoints",{"title":64,"path":65,"stem":66},"Test helpers","/api-reference/test-helpers","2.api-reference/11.test-helpers",{"title":68,"path":69,"stem":70},"Checkouts","/api-reference/checkouts","2.api-reference/2.checkouts",{"title":72,"path":73,"stem":74},"One-off Products","/api-reference/one-off-products","2.api-reference/3.one-off-products",{"title":76,"path":77,"stem":78},"Subscriptions","/api-reference/subscriptions","2.api-reference/4.subscriptions",{"title":80,"path":81,"stem":82},"Subscription Plans","/api-reference/subscription-plans","2.api-reference/5.subscription-plans",{"title":84,"path":85,"stem":86},"Orders","/api-reference/orders","2.api-reference/6.orders",{"title":88,"path":89,"stem":90},"Order Refunds","/api-reference/refunds","2.api-reference/7.refunds",{"title":92,"path":93,"stem":94},"Refunds","/api-reference/global-refunds","2.api-reference/8.global-refunds",{"title":96,"path":97,"stem":98},"Chargebacks","/api-reference/chargebacks","2.api-reference/9.chargebacks",{"title":100,"path":101,"stem":102},"Webhook Events","/api-reference/webhook-events","2.api-reference/99.webhook-events",{"title":104,"path":105,"stem":106,"children":107},"Packages","/packages","3.packages",[108,111,151],{"title":109,"path":105,"stem":110},"","3.packages/index",{"title":112,"path":113,"stem":114,"children":115,"page":49},"Php","/packages/php","3.packages/1.php",[116,120,123,126,129,132,135,138,142,145,148],{"title":117,"path":118,"stem":119},"Getting Started","/packages/php/readme","3.packages/1.php/0.readme",{"title":56,"path":121,"stem":122},"/packages/php/customers","3.packages/1.php/1.customers",{"title":68,"path":124,"stem":125},"/packages/php/checkouts","3.packages/1.php/2.checkouts",{"title":76,"path":127,"stem":128},"/packages/php/subscriptions","3.packages/1.php/3.subscriptions",{"title":80,"path":130,"stem":131},"/packages/php/subscriptionplans","3.packages/1.php/4.subscriptionplans",{"title":84,"path":133,"stem":134},"/packages/php/orders","3.packages/1.php/5.orders",{"title":92,"path":136,"stem":137},"/packages/php/refunds","3.packages/1.php/6.refunds",{"title":139,"path":140,"stem":141},"One-Off Products","/packages/php/oneoffproducts","3.packages/1.php/7.oneoffproducts",{"title":96,"path":143,"stem":144},"/packages/php/chargebacks","3.packages/1.php/8.chargebacks",{"title":38,"path":146,"stem":147},"/packages/php/webhooks","3.packages/1.php/9.webhooks",{"title":60,"path":149,"stem":150},"/packages/php/webhookendpoints","3.packages/1.php/99.webhookendpoints",{"title":152,"path":153,"stem":154,"children":155,"page":49},"Laravel","/packages/laravel","3.packages/2.laravel",[156,159,162,165,168,171,174,178,182],{"title":117,"path":157,"stem":158},"/packages/laravel/readme","3.packages/2.laravel/0.readme",{"title":56,"path":160,"stem":161},"/packages/laravel/customers","3.packages/2.laravel/1.customers",{"title":68,"path":163,"stem":164},"/packages/laravel/checkouts","3.packages/2.laravel/2.checkouts",{"title":76,"path":166,"stem":167},"/packages/laravel/subscriptions","3.packages/2.laravel/3.subscriptions",{"title":84,"path":169,"stem":170},"/packages/laravel/orders","3.packages/2.laravel/4.orders",{"title":38,"path":172,"stem":173},"/packages/laravel/webhooks","3.packages/2.laravel/5.webhooks",{"title":175,"path":176,"stem":177},"Vs Cashier (Stripe, Paddle) & Lemon Squeezy","/packages/laravel/comparison","3.packages/2.laravel/6.comparison",{"title":179,"path":180,"stem":181},"Migrating from Cashier","/packages/laravel/migrating-to-vatly","3.packages/2.laravel/7.migrating-to-vatly",{"title":183,"path":184,"stem":185},"Configuration","/packages/laravel/configuration","3.packages/2.laravel/99.configuration",{"title":187,"path":188,"stem":189},"Integrations","/integrations","4.integrations",{"id":191,"title":175,"body":192,"description":1372,"extension":1373,"links":1374,"meta":1375,"navigation":658,"path":176,"seo":1376,"stem":177,"__hash__":1377},"docs/3.packages/2.laravel/6.comparison.md",{"type":193,"value":194,"toc":1365},"minimark",[195,226,252,264,267,272,576,579,607,609,613,619,700,1130,1139,1141,1145,1148,1259,1262,1264,1268,1275,1296,1303,1305,1309,1347,1361],[196,197,198,199,203,204,207,208,211,212,216,217,221,222,225],"p",{},"Picking the billing layer for a new Laravel app? If you've reached for Laravel Cashier\nbefore, Vatly will feel immediately familiar — a ",[200,201,202],"code",{},"Billable"," trait, ",[200,205,206],{},"subscribed()",",\n",[200,209,210],{},"subscription()->swap()",", a wired-up webhook endpoint. The difference is what sits ",[213,214,215],"em",{},"behind","\nthe API: Vatly is a ",[218,219,220],"strong",{},"Merchant of Record",", so it is the legal seller and handles VAT,\ninvoicing, and payment compliance for you — and it's ",[218,223,224],{},"Europe-first",", operating under EU\njurisdiction.",[196,227,228,229,232,233,207,240,245,246,251],{},"This page is an honest, side-by-side look at how ",[200,230,231],{},"vatly-laravel"," stacks up against the\nCashier-style packages you might otherwise reach for —\n",[234,235,239],"a",{"href":236,"rel":237},"https://laravel.com/docs/12.x/billing",[238],"nofollow","Laravel Cashier (Stripe)",[234,241,244],{"href":242,"rel":243},"https://laravel.com/docs/12.x/cashier-paddle",[238],"Laravel Cashier (Paddle)",", and\n",[234,247,250],{"href":248,"rel":249},"https://github.com/lmsqueezy/laravel",[238],"Lemon Squeezy for Laravel"," — gaps included.",[253,254,255],"blockquote",{},[196,256,257,260,261,263],{},[218,258,259],{},"Already running one of these in an existing app?"," This page helps you choose. Once you\nhave, ",[234,262,179],{"href":180}," shows how to add Vatly\nnext to your current biller and migrate customers over gradually.",[265,266],"hr",{},[268,269,271],"h2",{"id":270},"at-a-glance","At a glance",[273,274,275,298],"table",{},[276,277,278],"thead",{},[279,280,281,284,287,290,293],"tr",{},[282,283],"th",{},[282,285,286],{},"Cashier (Stripe Billing)",[282,288,289],{},"Cashier (Paddle)",[282,291,292],{},"Lemon Squeezy",[282,294,295],{},[218,296,297],{},"Vatly",[299,300,301,327,352,372,401,424,461,485,510,527,543,561],"tbody",{},[279,302,303,307,312,317,322],{},[304,305,306],"td",{},"Composer package",[304,308,309],{},[200,310,311],{},"laravel/cashier",[304,313,314],{},[200,315,316],{},"laravel/cashier-paddle",[304,318,319],{},[200,320,321],{},"lemonsqueezy/laravel",[304,323,324],{},[200,325,326],{},"vatly/vatly-laravel",[279,328,329,332,337,342,347],{},[304,330,331],{},"Billable trait",[304,333,334],{},[200,335,336],{},"Laravel\\Cashier\\Billable",[304,338,339],{},[200,340,341],{},"Laravel\\Paddle\\Billable",[304,343,344],{},[200,345,346],{},"LemonSqueezy\\Laravel\\Billable",[304,348,349],{},[200,350,351],{},"Vatly\\Laravel\\Billable",[279,353,354,356,362,365,367],{},[304,355,220],{},[304,357,358,361],{},[218,359,360],{},"No"," — you are the seller",[304,363,364],{},"Yes",[304,366,364],{},[304,368,369],{},[218,370,371],{},"Yes (full)",[279,373,374,377,383,389,396],{},[304,375,376],{},"Entity / jurisdiction",[304,378,379,382],{},[213,380,381],{},"You"," (wherever you're registered)",[304,384,385,386],{},"Paddle, ",[218,387,388],{},"UK",[304,390,391,392,395],{},"Lemon Squeezy, ",[218,393,394],{},"US"," (Stripe-owned)",[304,397,398],{},[218,399,400],{},"EEA / EU jurisdiction",[279,402,403,406,415,418,420],{},[304,404,405],{},"Who remits VAT/sales tax",[304,407,408,410,411,414],{},[218,409,381],{}," (Stripe Tax only ",[213,412,413],{},"calculates",")",[304,416,417],{},"Provider",[304,419,417],{},[304,421,422],{},[218,423,417],{},[279,425,426,429,436,445,451],{},[304,427,428],{},"Customer stored as",[304,430,431,432,435],{},"columns on the billable model (",[200,433,434],{},"stripe_id",", …)",[304,437,438,441,442,414],{},[200,439,440],{},"customers"," table (",[200,443,444],{},"paddle_id",[304,446,447,450],{},[200,448,449],{},"lemon_squeezy_customers"," table",[304,452,453,456,457,460],{},[200,454,455],{},"vatly_id"," column on the billable model + ",[200,458,459],{},"vatly_*"," tables",[279,462,463,466,469,476,479],{},[304,464,465],{},"Checkout",[304,467,468],{},"Stripe Checkout (hosted) / Elements",[304,470,471,472,475],{},"Paddle.js ",[218,473,474],{},"overlay / inline"," (client-side JS)",[304,477,478],{},"Lemon.js overlay / hosted URL",[304,480,481,484],{},[218,482,483],{},"Vatly-hosted redirect"," (+ guest claim)",[279,486,487,490,495,500,505],{},[304,488,489],{},"Webhook route",[304,491,492],{},[200,493,494],{},"/stripe/webhook",[304,496,497],{},[200,498,499],{},"/paddle/webhook",[304,501,502],{},[200,503,504],{},"/lemon-squeezy/webhook",[304,506,507],{},[200,508,509],{},"/webhooks/vatly",[279,511,512,515,517,519,521],{},[304,513,514],{},"Coupons / promo codes",[304,516,364],{},[304,518,364],{},[304,520,364],{},[304,522,523,526],{},[218,524,525],{},"On the roadmap"," (workaround below)",[279,528,529,532,534,536,538],{},[304,530,531],{},"License keys",[304,533,360],{},[304,535,360],{},[304,537,364],{},[304,539,540,542],{},[218,541,525],{}," (rarely needed for SaaS)",[279,544,545,548,551,554,556],{},[304,546,547],{},"Refunds & chargebacks",[304,549,550],{},"wire it yourself",[304,552,553],{},"events",[304,555,553],{},[304,557,558],{},[218,559,560],{},"first-class models + events",[279,562,563,566,568,570,572],{},[304,564,565],{},"Trials, swap, grace/resume",[304,567,364],{},[304,569,364],{},[304,571,364],{},[304,573,574],{},[218,575,364],{},[196,577,578],{},"Two takeaways:",[580,581,582,601],"ol",{},[583,584,585,594,595,600],"li",{},[218,586,587,589,590,593],{},[200,588,311],{}," runs on classic Stripe Billing, where ",[213,591,592],{},"you're"," the seller of record"," and\nown VAT registration, filing and remittance. Stripe has a real MoR too\n(",[234,596,599],{"href":597,"rel":598},"https://stripe.com/managed-payments",[238],"Managed Payments","), and Cashier — actively maintained —\nwill likely support it before long. Being an MoR is table stakes now, not a Vatly-only edge.",[583,602,603,606],{},[218,604,605],{},"So the real difference between MoRs is jurisdiction."," Paddle is UK, Lemon Squeezy and Stripe\nare US, Vatly is EEA — your seller-of-record entity and customer data stay under EU law. That,\nnot the API, is the reason to choose one over another.",[265,608],{},[268,610,612],{"id":611},"the-developer-experience","The developer experience",[196,614,615,616,618],{},"For a greenfield app, Vatly is your only biller — so you use the plain ",[200,617,202],{}," trait, and\nthe code reads like Cashier:",[620,621,625],"pre",{"className":622,"code":623,"language":624,"meta":109,"style":109},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","use Vatly\\Laravel\\Billable;\n\nclass User extends Authenticatable\n{\n    use Billable;\n}\n","php",[200,626,627,653,660,677,683,694],{"__ignoreMap":109},[628,629,632,636,640,644,646,648,650],"span",{"class":630,"line":631},"line",1,[628,633,635],{"class":634},"sbssI","use",[628,637,639],{"class":638},"sTEyZ"," Vatly",[628,641,643],{"class":642},"sMK4o","\\",[628,645,152],{"class":638},[628,647,643],{"class":642},[628,649,202],{"class":638},[628,651,652],{"class":642},";\n",[628,654,656],{"class":630,"line":655},2,[628,657,659],{"emptyLinePlaceholder":658},true,"\n",[628,661,663,667,671,674],{"class":630,"line":662},3,[628,664,666],{"class":665},"spNyl","class",[628,668,670],{"class":669},"sBMFI"," User",[628,672,673],{"class":665}," extends",[628,675,676],{"class":669}," Authenticatable\n",[628,678,680],{"class":630,"line":679},4,[628,681,682],{"class":642},"{\n",[628,684,686,689,692],{"class":630,"line":685},5,[628,687,688],{"class":634},"    use",[628,690,691],{"class":638}," Billable",[628,693,652],{"class":642},[628,695,697],{"class":630,"line":696},6,[628,698,699],{"class":642},"}\n",[620,701,703],{"className":622,"code":702,"language":624,"meta":109,"style":109},"// Start a subscription — redirect to Vatly's hosted checkout\n$checkout = $user->subscribe()\n    ->toPlan('subscription_plan_7Hd9Kf2Lm')\n    ->withTrialDays(14)\n    ->create();\n\nreturn redirect($checkout->links->checkoutUrl->href);\n\n// Gate features on subscription state\nif ($user->subscribed()) {\n    // …\n}\n\n$user->subscription()->swap('subscription_plan_other');\n$user->subscription()->cancel();      // Vatly decides immediate vs. grace\n$user->subscription()->resume();      // while on the grace period\n\n// One-off purchase\n$user->checkout()->create(\n    items: [['id' => 'one_off_product_3Qb8Wz1Yt', 'quantity' => 1]],\n    redirectUrlSuccess: route('billing.success'),\n    redirectUrlCanceled: route('billing'),\n);\n\n// Receipts — hosted invoice URLs, no PDF plumbing\nforeach ($user->orders as $order) {\n    echo $order->invoiceUrl();\n}\n",[200,704,705,711,738,761,775,785,789,823,828,834,856,862,867,872,901,923,944,949,955,973,1021,1044,1065,1070,1075,1081,1108,1125],{"__ignoreMap":109},[628,706,707],{"class":630,"line":631},[628,708,710],{"class":709},"sHwdD","// Start a subscription — redirect to Vatly's hosted checkout\n",[628,712,713,716,719,722,725,728,731,735],{"class":630,"line":655},[628,714,715],{"class":642},"$",[628,717,718],{"class":638},"checkout ",[628,720,721],{"class":642},"=",[628,723,724],{"class":642}," $",[628,726,727],{"class":638},"user",[628,729,730],{"class":642},"->",[628,732,734],{"class":733},"s2Zo4","subscribe",[628,736,737],{"class":642},"()\n",[628,739,740,743,746,749,752,756,758],{"class":630,"line":662},[628,741,742],{"class":642},"    ->",[628,744,745],{"class":733},"toPlan",[628,747,748],{"class":642},"(",[628,750,751],{"class":642},"'",[628,753,755],{"class":754},"sfazB","subscription_plan_7Hd9Kf2Lm",[628,757,751],{"class":642},[628,759,760],{"class":642},")\n",[628,762,763,765,768,770,773],{"class":630,"line":679},[628,764,742],{"class":642},[628,766,767],{"class":733},"withTrialDays",[628,769,748],{"class":642},[628,771,772],{"class":634},"14",[628,774,760],{"class":642},[628,776,777,779,782],{"class":630,"line":685},[628,778,742],{"class":642},[628,780,781],{"class":733},"create",[628,783,784],{"class":642},"();\n",[628,786,787],{"class":630,"line":696},[628,788,659],{"emptyLinePlaceholder":658},[628,790,792,796,799,802,805,807,810,812,815,817,820],{"class":630,"line":791},7,[628,793,795],{"class":794},"s7zQu","return",[628,797,798],{"class":733}," redirect",[628,800,801],{"class":642},"($",[628,803,804],{"class":638},"checkout",[628,806,730],{"class":642},[628,808,809],{"class":638},"links",[628,811,730],{"class":642},[628,813,814],{"class":638},"checkoutUrl",[628,816,730],{"class":642},[628,818,819],{"class":638},"href",[628,821,822],{"class":642},");\n",[628,824,826],{"class":630,"line":825},8,[628,827,659],{"emptyLinePlaceholder":658},[628,829,831],{"class":630,"line":830},9,[628,832,833],{"class":709},"// Gate features on subscription state\n",[628,835,837,840,843,845,847,850,853],{"class":630,"line":836},10,[628,838,839],{"class":794},"if",[628,841,842],{"class":642}," ($",[628,844,727],{"class":638},[628,846,730],{"class":642},[628,848,849],{"class":733},"subscribed",[628,851,852],{"class":642},"())",[628,854,855],{"class":642}," {\n",[628,857,859],{"class":630,"line":858},11,[628,860,861],{"class":709},"    // …\n",[628,863,865],{"class":630,"line":864},12,[628,866,699],{"class":642},[628,868,870],{"class":630,"line":869},13,[628,871,659],{"emptyLinePlaceholder":658},[628,873,875,877,879,881,884,887,890,892,894,897,899],{"class":630,"line":874},14,[628,876,715],{"class":642},[628,878,727],{"class":638},[628,880,730],{"class":642},[628,882,883],{"class":733},"subscription",[628,885,886],{"class":642},"()->",[628,888,889],{"class":733},"swap",[628,891,748],{"class":642},[628,893,751],{"class":642},[628,895,896],{"class":754},"subscription_plan_other",[628,898,751],{"class":642},[628,900,822],{"class":642},[628,902,904,906,908,910,912,914,917,920],{"class":630,"line":903},15,[628,905,715],{"class":642},[628,907,727],{"class":638},[628,909,730],{"class":642},[628,911,883],{"class":733},[628,913,886],{"class":642},[628,915,916],{"class":733},"cancel",[628,918,919],{"class":642},"();",[628,921,922],{"class":709},"      // Vatly decides immediate vs. grace\n",[628,924,926,928,930,932,934,936,939,941],{"class":630,"line":925},16,[628,927,715],{"class":642},[628,929,727],{"class":638},[628,931,730],{"class":642},[628,933,883],{"class":733},[628,935,886],{"class":642},[628,937,938],{"class":733},"resume",[628,940,919],{"class":642},[628,942,943],{"class":709},"      // while on the grace period\n",[628,945,947],{"class":630,"line":946},17,[628,948,659],{"emptyLinePlaceholder":658},[628,950,952],{"class":630,"line":951},18,[628,953,954],{"class":709},"// One-off purchase\n",[628,956,958,960,962,964,966,968,970],{"class":630,"line":957},19,[628,959,715],{"class":642},[628,961,727],{"class":638},[628,963,730],{"class":642},[628,965,804],{"class":733},[628,967,886],{"class":642},[628,969,781],{"class":733},[628,971,972],{"class":642},"(\n",[628,974,976,979,982,985,987,990,992,995,998,1001,1003,1006,1008,1011,1013,1015,1018],{"class":630,"line":975},20,[628,977,978],{"class":669},"    items",[628,980,981],{"class":642},":",[628,983,984],{"class":642}," [[",[628,986,751],{"class":642},[628,988,989],{"class":754},"id",[628,991,751],{"class":642},[628,993,994],{"class":642}," =>",[628,996,997],{"class":642}," '",[628,999,1000],{"class":754},"one_off_product_3Qb8Wz1Yt",[628,1002,751],{"class":642},[628,1004,1005],{"class":642},",",[628,1007,997],{"class":642},[628,1009,1010],{"class":754},"quantity",[628,1012,751],{"class":642},[628,1014,994],{"class":642},[628,1016,1017],{"class":634}," 1",[628,1019,1020],{"class":642},"]],\n",[628,1022,1024,1027,1029,1032,1034,1036,1039,1041],{"class":630,"line":1023},21,[628,1025,1026],{"class":669},"    redirectUrlSuccess",[628,1028,981],{"class":642},[628,1030,1031],{"class":733}," route",[628,1033,748],{"class":642},[628,1035,751],{"class":642},[628,1037,1038],{"class":754},"billing.success",[628,1040,751],{"class":642},[628,1042,1043],{"class":642},"),\n",[628,1045,1047,1050,1052,1054,1056,1058,1061,1063],{"class":630,"line":1046},22,[628,1048,1049],{"class":669},"    redirectUrlCanceled",[628,1051,981],{"class":642},[628,1053,1031],{"class":733},[628,1055,748],{"class":642},[628,1057,751],{"class":642},[628,1059,1060],{"class":754},"billing",[628,1062,751],{"class":642},[628,1064,1043],{"class":642},[628,1066,1068],{"class":630,"line":1067},23,[628,1069,822],{"class":642},[628,1071,1073],{"class":630,"line":1072},24,[628,1074,659],{"emptyLinePlaceholder":658},[628,1076,1078],{"class":630,"line":1077},25,[628,1079,1080],{"class":709},"// Receipts — hosted invoice URLs, no PDF plumbing\n",[628,1082,1084,1087,1089,1091,1093,1096,1099,1101,1104,1106],{"class":630,"line":1083},26,[628,1085,1086],{"class":794},"foreach",[628,1088,842],{"class":642},[628,1090,727],{"class":638},[628,1092,730],{"class":642},[628,1094,1095],{"class":638},"orders ",[628,1097,1098],{"class":642},"as",[628,1100,724],{"class":642},[628,1102,1103],{"class":638},"order",[628,1105,414],{"class":642},[628,1107,855],{"class":642},[628,1109,1111,1114,1116,1118,1120,1123],{"class":630,"line":1110},27,[628,1112,1113],{"class":733},"    echo",[628,1115,724],{"class":642},[628,1117,1103],{"class":638},[628,1119,730],{"class":642},[628,1121,1122],{"class":733},"invoiceUrl",[628,1124,784],{"class":642},[628,1126,1128],{"class":630,"line":1127},28,[628,1129,699],{"class":642},[196,1131,1132,1133,1135,1136,1138],{},"No VAT logic, no tax tables, no invoice templates, no client-side checkout widget to embed —\nthe checkout is a server-side redirect, like Stripe Checkout. See ",[234,1134,76],{"href":166},"\nand ",[234,1137,68],{"href":163}," for the full surface.",[265,1140],{},[268,1142,1144],{"id":1143},"feature-parity-and-whats-still-on-the-roadmap","Feature parity, and what's still on the roadmap",[196,1146,1147],{},"Vatly covers what a SaaS needs to start selling: subscriptions with trials, plan swaps,\ncancellation with grace and resume, one-off purchases, hosted checkout, refunds and chargebacks,\nand — because it's a Merchant of Record — VAT, invoicing and tax compliance handled for you. A\nfew capabilities you may use elsewhere aren't in the box yet. Here's the honest picture, and how\nto bridge it.",[273,1149,1150,1163],{},[276,1151,1152],{},[279,1153,1154,1157,1160],{},[282,1155,1156],{},"Capability",[282,1158,1159],{},"Vatly today",[282,1161,1162],{},"Notes",[299,1164,1165,1176,1188,1202,1211,1225,1241],{},[279,1166,1167,1170,1173],{},[304,1168,1169],{},"Subscriptions, trials, swap, grace, resume",[304,1171,1172],{},"✅",[304,1174,1175],{},"Full lifecycle, Cashier-shaped API",[279,1177,1178,1181,1183],{},[304,1179,1180],{},"One-off / multi-item checkout",[304,1182,1172],{},[304,1184,1185],{},[200,1186,1187],{},"checkout()->create(items: …)",[279,1189,1190,1193,1195],{},[304,1191,1192],{},"VAT, invoicing, tax remittance",[304,1194,1172],{},[304,1196,1197,1198,1201],{},"Handled — it's the point of a MoR. With Cashier (classic Stripe Billing) this is ",[213,1199,1200],{},"your"," job.",[279,1203,1204,1206,1208],{},[304,1205,547],{},[304,1207,1172],{},[304,1209,1210],{},"First-class models + events (more than most provide)",[279,1212,1213,1216,1218],{},[304,1214,1215],{},"Test / live segregation",[304,1217,1172],{},[304,1219,1220,1221,1224],{},"Every record carries ",[200,1222,1223],{},"testmode","; key prefix selects the mode",[279,1226,1227,1231,1234],{},[304,1228,1229],{},[218,1230,514],{},[304,1232,1233],{},"🔜 Roadmap",[304,1235,1236,1237,1240],{},"Until native codes land, model a promo as a dedicated ",[200,1238,1239],{},"subscription_plan_…"," at the discounted price and point that cohort at it. A couple of extra plans in the dashboard — not a blocker for launching offers.",[279,1242,1243,1247,1249],{},[304,1244,1245],{},[218,1246,531],{},[304,1248,1233],{},[304,1250,1251,1252,1254,1255,1258],{},"Vatly is built for SaaS, where entitlement follows subscription state — ",[200,1253,206],{}," ",[213,1256,1257],{},"is"," your license check. Per-seat keys for downloadable/offline software (Lemon Squeezy's signature feature) aren't here yet. If you ship license-activated desktop binaries, that's the one workflow to keep elsewhere for now.",[196,1260,1261],{},"The shape of the trade is deliberate: Vatly does the compliance-heavy core that's genuinely\nhard to build — being the seller of record, VAT across the EU, invoicing, disputes — and is\nfilling in the conveniences (coupons next) in the open. For a subscription SaaS selling into\nEurope and the world, there's enough here to launch today.",[265,1263],{},[268,1265,1267],{"id":1266},"why-teams-choose-vatly","Why teams choose Vatly",[196,1269,1270,1271,1274],{},"A Merchant of Record handles VAT, invoicing and tax remittance for you — and that part is now\ntable stakes. Paddle, Lemon Squeezy, Stripe Managed Payments and Vatly all do it; on Stripe it's\na flag on the request. So the real question isn't ",[213,1272,1273],{},"whether"," compliance is handled — it's whose\nentity you sell through:",[1276,1277,1278,1284,1290],"ul",{},[583,1279,1280,1283],{},[218,1281,1282],{},"Europe-first, by design."," EEA-based, EU jurisdiction, customer data kept in Europe. The other\nMoRs sit in the UK (Paddle) or the US (Lemon Squeezy, Stripe Managed Payments) — jurisdiction is\nthe one axis that genuinely separates them, and the reason Vatly exists.",[583,1285,1286,1289],{},[218,1287,1288],{},"No exposure to US policy."," Your seller-of-record relationship and your customers' data stay\nunder EU law — a clean answer when an enterprise buyer, or your own board, asks where they sit.",[583,1291,1292,1295],{},[218,1293,1294],{},"One familiar API."," The Cashier-shaped surface means there's little to learn and little to\nrewrite.",[253,1297,1298],{},[196,1299,1300],{},[218,1301,1302],{},"You Just Ship.",[265,1304],{},[268,1306,1308],{"id":1307},"next-steps","Next steps",[1276,1310,1311,1321,1329],{},[583,1312,1313,1316,1317,1320],{},[218,1314,1315],{},"Starting fresh"," → ",[234,1318,1319],{"href":157},"Getting started"," wires up the trait, config, migrations and\nwebhook in a few minutes.",[583,1322,1323,1316,1326,1328],{},[218,1324,1325],{},"Already running another provider",[234,1327,179],{"href":180},"\nshows how to add Vatly beside your current biller and migrate customers over gradually.",[583,1330,1331,1316,1334,1336,1337,1336,1339,1336,1341,1336,1343,1336,1345],{},[218,1332,1333],{},"Reference",[234,1335,183],{"href":184}," · ",[234,1338,56],{"href":160},[234,1340,68],{"href":163},[234,1342,76],{"href":166},[234,1344,84],{"href":169},[234,1346,38],{"href":172},[196,1348,1349,1350,1353,1354,1353,1357,1360],{},"Compared against, at time of writing:\n",[234,1351,239],{"href":236,"rel":1352},[238]," ·\n",[234,1355,244],{"href":242,"rel":1356},[238],[234,1358,250],{"href":248,"rel":1359},[238],".\nTheir method names and table layouts follow those packages' current releases — verify against\nthe version you have pinned before relying on a specific signature.",[1362,1363,1364],"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 .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);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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}",{"title":109,"searchDepth":655,"depth":655,"links":1366},[1367,1368,1369,1370,1371],{"id":270,"depth":655,"text":271},{"id":611,"depth":655,"text":612},{"id":1143,"depth":655,"text":1144},{"id":1266,"depth":655,"text":1267},{"id":1307,"depth":655,"text":1308},"Vatly Laravel Package - Vs Cashier (Stripe, Paddle) & Lemon Squeezy","md",null,{},{"title":175,"description":1372},"id16HSEuihWiEnAF2AUQnUXftmx8UQeW1ols-xKi5r8",[1379,1381],{"title":38,"path":172,"stem":173,"description":1380,"children":-1},"Vatly Laravel Package - Webhooks",{"title":179,"path":180,"stem":181,"description":1382,"children":-1},"Vatly Laravel Package - Migrating from Cashier",1783281131262]