[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"navigation_en":3,"/docs/features/payments-data":144},[4,16,91,117,127],{"title":5,"path":6,"stem":7,"children":8,"icon":15},"Getting Started","/docs/get-started","docs/1.get-started/1.index",[9,11],{"title":10,"path":6,"stem":7},"Introduction",{"title":12,"path":13,"stem":14},"Setup","/docs/get-started/setup","docs/1.get-started/2.setup","mage:fast-forward-fill",{"title":17,"icon":18,"path":19,"stem":20,"children":21,"page":90},"Features","ic:baseline-cable","/docs/features","docs/2.features",[22,26,30,34,38,42,46,50,54,58,62,66,70,74,78,82,86],{"title":23,"path":24,"stem":25},"Database","/docs/features/database","docs/2.features/01.database",{"title":27,"path":28,"stem":29},"Authentication","/docs/features/auth","docs/2.features/02.auth",{"title":31,"path":32,"stem":33},"Payments","/docs/features/payments","docs/2.features/03.payments",{"title":35,"path":36,"stem":37},"Admin Panel","/docs/features/admin-panel","docs/2.features/04.admin-panel",{"title":39,"path":40,"stem":41},"AI","/docs/features/ai","docs/2.features/05.ai",{"title":43,"path":44,"stem":45},"Customization","/docs/features/customization","docs/2.features/06.customization",{"title":47,"path":48,"stem":49},"Storage","/docs/features/storage","docs/2.features/07.storage",{"title":51,"path":52,"stem":53},"Email","/docs/features/email","docs/2.features/08.email",{"title":55,"path":56,"stem":57},"Languages","/docs/features/languages","docs/2.features/09.languages",{"title":59,"path":60,"stem":61},"SEO","/docs/features/seo","docs/2.features/10.seo",{"title":63,"path":64,"stem":65},"Blogs","/docs/features/blogs","docs/2.features/11.blogs",{"title":67,"path":68,"stem":69},"Documentation","/docs/features/documentation","docs/2.features/12.documentation",{"title":71,"path":72,"stem":73},"Cron Jobs","/docs/features/cron-jobs","docs/2.features/13.cron-jobs",{"title":75,"path":76,"stem":77},"Error Handling","/docs/features/error-handling","docs/2.features/14.error-handling",{"title":79,"path":80,"stem":81},"Analytics","/docs/features/analytics","docs/2.features/15.analytics",{"title":83,"path":84,"stem":85},"PWA","/docs/features/pwa","docs/2.features/15.pwa",{"title":87,"path":88,"stem":89},"Customer Support","/docs/features/customer-support","docs/2.features/16.customer-support",false,{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":90},"Tutorials","ic:baseline-library-books","/docs/tutorials","docs/3.tutorials",[97,101,105,109,113],{"title":98,"path":99,"stem":100},"Project Structure","/docs/tutorials/project-structure","docs/3.tutorials/1.project-structure",{"title":102,"path":103,"stem":104},"Page Routes","/docs/tutorials/page-routes","docs/3.tutorials/2.page-routes",{"title":106,"path":107,"stem":108},"API Calls","/docs/tutorials/api-calls","docs/3.tutorials/3.api-calls",{"title":110,"path":111,"stem":112},"State Management","/docs/tutorials/state-management","docs/3.tutorials/4.state-management",{"title":114,"path":115,"stem":116},"Legal Pages by GPT","/docs/tutorials/legal-pages-by-gpt","docs/3.tutorials/5.legal-pages-by-gpt",{"title":118,"icon":119,"path":120,"stem":121,"children":122,"page":90},"Formatting & Linting","ic:baseline-format-align-left","/docs/formatting-and-linting","docs/4.formatting-and-linting",[123],{"title":124,"path":125,"stem":126},"Overview","/docs/formatting-and-linting/overview","docs/4.formatting-and-linting/1.overview",{"title":128,"icon":129,"path":130,"stem":131,"children":132,"page":90},"Deployment","ic:baseline-rocket-launch","/docs/deployment","docs/5.deployment",[133,136,140],{"title":124,"path":134,"stem":135},"/docs/deployment/overview","docs/5.deployment/1.overview",{"title":137,"path":138,"stem":139},"Vercel","/docs/deployment/vercel","docs/5.deployment/2.vercel",{"title":141,"path":142,"stem":143},"Cloudflare Workers","/docs/deployment/cloudflare","docs/5.deployment/3.cloudflare",{"page":145,"surround":1570},{"id":146,"title":31,"body":147,"description":1562,"extension":1563,"head":1564,"meta":1565,"navigation":1566,"ogImage":1564,"path":32,"robots":1564,"schemaOrg":1564,"seo":1567,"sitemap":1568,"stem":33,"__hash__":1569},"docs_en/docs/2.features/03.payments.md",{"type":148,"value":149,"toc":1554},"minimark",[150,154,159,690,694,1080,1084,1488,1492,1550],[151,152,12],"h2",{"id":153},"setup",[155,156,158],"h3",{"id":157},"stripe","Stripe",[160,161,162,172,198,209,223,636],"ol",{},[163,164,165,166,171],"li",{},"Sign up at ",[167,168,158],"a",{"href":169,"target":170},"https://dashboard.stripe.com/register","_blank"," and create an account.",[163,173,174,175,179,180],{},"Create a ",[176,177,178],"strong",{},"Product"," in the Stripe Dashboard.\n",[181,182,183,186],"ul",{},[163,184,185],{},"Add pricing plans (e.g. Monthly $10, Yearly $60).",[163,187,188,189,192,193,197],{},"Copy the ",[176,190,191],{},"Price IDs"," (they look like ",[194,195,196],"code",{},"price_xxx",").",[163,199,200,201,204,205,208],{},"Copy your ",[176,202,203],{},"Secret Key"," and ",[176,206,207],{},"Webhook Secret"," from the Stripe Dashboard (Developers > API Keys and Webhooks).",[163,210,211,212],{},"Set the following environment variables:\n",[213,214,221],"pre",{"className":215,"code":217,"filename":218,"language":219,"meta":220},[216],"language-text","STRIPE_SECRET_KEY=\"your-stripe-secret-key\"\nSTRIPE_WEBHOOK_SECRET=\"your-stripe-webhook-secret\"\n",".env","text","",[194,222,217],{"__ignoreMap":220},[163,224,225,226],{},"Update pricing plans in your config:\n",[213,227,232],{"className":228,"code":229,"filename":230,"language":231,"meta":220,"style":220},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pricing: {\n    paymentProvider: enums.paymentProvider.stripe, // Set paymentProvider Stripe\n    successUrlPath: '/payment-success', // Redirect after successful payment\n    failedUrlPath: '/payment-failed', // Redirect after failed payment\n    plans: {\n        pro: {\n            enable: true,  // Is show Pro Plan\n            key: 'pro',\n            monthly: {\n                key: 'pro-monthly',\n                priceId: 'price_monthly', // Set Stripe Price ID for monthly subscription\n                mode: 'subscription', // Payment is subscription\n            },\n            yearly: {\n                key: 'pro-yearly',\n                priceId: 'price_yearly', // Set Stripe Price ID for yearly subscription\n                mode: 'subscription', // Payment is subscription\n            },\n        },\n        lifetime: {\n            enable: true,  // Is show Lifetime Plan\n            key: 'lifetime',\n            priceId: 'price_lifetime', // Set Stripe Price ID for one-time payment\n            promoCodeId: '', // Optional - Set Stripe Promo ID for any promo/coupon to discount\n            mode: 'payment', // Payment is one-time\n        },\n    },\n},\n","shared/config.ts","ts",[194,233,234,250,279,302,322,332,342,359,377,387,404,424,444,450,460,476,495,512,517,523,533,547,563,583,599,619,624,630],{"__ignoreMap":220},[235,236,239,243,247],"span",{"class":237,"line":238},"line",1,[235,240,242],{"class":241},"sBMFI","pricing",[235,244,246],{"class":245},"sMK4o",":",[235,248,249],{"class":245}," {\n",[235,251,253,256,258,262,265,268,270,272,275],{"class":237,"line":252},2,[235,254,255],{"class":241},"    paymentProvider",[235,257,246],{"class":245},[235,259,261],{"class":260},"sTEyZ"," enums",[235,263,264],{"class":245},".",[235,266,267],{"class":260},"paymentProvider",[235,269,264],{"class":245},[235,271,157],{"class":260},[235,273,274],{"class":245},",",[235,276,278],{"class":277},"sHwdD"," // Set paymentProvider Stripe\n",[235,280,282,285,287,290,294,297,299],{"class":237,"line":281},3,[235,283,284],{"class":241},"    successUrlPath",[235,286,246],{"class":245},[235,288,289],{"class":245}," '",[235,291,293],{"class":292},"sfazB","/payment-success",[235,295,296],{"class":245},"'",[235,298,274],{"class":245},[235,300,301],{"class":277}," // Redirect after successful payment\n",[235,303,305,308,310,312,315,317,319],{"class":237,"line":304},4,[235,306,307],{"class":241},"    failedUrlPath",[235,309,246],{"class":245},[235,311,289],{"class":245},[235,313,314],{"class":292},"/payment-failed",[235,316,296],{"class":245},[235,318,274],{"class":245},[235,320,321],{"class":277}," // Redirect after failed payment\n",[235,323,325,328,330],{"class":237,"line":324},5,[235,326,327],{"class":241},"    plans",[235,329,246],{"class":245},[235,331,249],{"class":245},[235,333,335,338,340],{"class":237,"line":334},6,[235,336,337],{"class":241},"        pro",[235,339,246],{"class":245},[235,341,249],{"class":245},[235,343,345,348,350,354,356],{"class":237,"line":344},7,[235,346,347],{"class":241},"            enable",[235,349,246],{"class":245},[235,351,353],{"class":352},"sfNiH"," true",[235,355,274],{"class":245},[235,357,358],{"class":277},"  // Is show Pro Plan\n",[235,360,362,365,367,369,372,374],{"class":237,"line":361},8,[235,363,364],{"class":241},"            key",[235,366,246],{"class":245},[235,368,289],{"class":245},[235,370,371],{"class":292},"pro",[235,373,296],{"class":245},[235,375,376],{"class":245},",\n",[235,378,380,383,385],{"class":237,"line":379},9,[235,381,382],{"class":241},"            monthly",[235,384,246],{"class":245},[235,386,249],{"class":245},[235,388,390,393,395,397,400,402],{"class":237,"line":389},10,[235,391,392],{"class":241},"                key",[235,394,246],{"class":245},[235,396,289],{"class":245},[235,398,399],{"class":292},"pro-monthly",[235,401,296],{"class":245},[235,403,376],{"class":245},[235,405,407,410,412,414,417,419,421],{"class":237,"line":406},11,[235,408,409],{"class":241},"                priceId",[235,411,246],{"class":245},[235,413,289],{"class":245},[235,415,416],{"class":292},"price_monthly",[235,418,296],{"class":245},[235,420,274],{"class":245},[235,422,423],{"class":277}," // Set Stripe Price ID for monthly subscription\n",[235,425,427,430,432,434,437,439,441],{"class":237,"line":426},12,[235,428,429],{"class":241},"                mode",[235,431,246],{"class":245},[235,433,289],{"class":245},[235,435,436],{"class":292},"subscription",[235,438,296],{"class":245},[235,440,274],{"class":245},[235,442,443],{"class":277}," // Payment is subscription\n",[235,445,447],{"class":237,"line":446},13,[235,448,449],{"class":245},"            },\n",[235,451,453,456,458],{"class":237,"line":452},14,[235,454,455],{"class":241},"            yearly",[235,457,246],{"class":245},[235,459,249],{"class":245},[235,461,463,465,467,469,472,474],{"class":237,"line":462},15,[235,464,392],{"class":241},[235,466,246],{"class":245},[235,468,289],{"class":245},[235,470,471],{"class":292},"pro-yearly",[235,473,296],{"class":245},[235,475,376],{"class":245},[235,477,479,481,483,485,488,490,492],{"class":237,"line":478},16,[235,480,409],{"class":241},[235,482,246],{"class":245},[235,484,289],{"class":245},[235,486,487],{"class":292},"price_yearly",[235,489,296],{"class":245},[235,491,274],{"class":245},[235,493,494],{"class":277}," // Set Stripe Price ID for yearly subscription\n",[235,496,498,500,502,504,506,508,510],{"class":237,"line":497},17,[235,499,429],{"class":241},[235,501,246],{"class":245},[235,503,289],{"class":245},[235,505,436],{"class":292},[235,507,296],{"class":245},[235,509,274],{"class":245},[235,511,443],{"class":277},[235,513,515],{"class":237,"line":514},18,[235,516,449],{"class":245},[235,518,520],{"class":237,"line":519},19,[235,521,522],{"class":245},"        },\n",[235,524,526,529,531],{"class":237,"line":525},20,[235,527,528],{"class":241},"        lifetime",[235,530,246],{"class":245},[235,532,249],{"class":245},[235,534,536,538,540,542,544],{"class":237,"line":535},21,[235,537,347],{"class":241},[235,539,246],{"class":245},[235,541,353],{"class":352},[235,543,274],{"class":245},[235,545,546],{"class":277},"  // Is show Lifetime Plan\n",[235,548,550,552,554,556,559,561],{"class":237,"line":549},22,[235,551,364],{"class":241},[235,553,246],{"class":245},[235,555,289],{"class":245},[235,557,558],{"class":292},"lifetime",[235,560,296],{"class":245},[235,562,376],{"class":245},[235,564,566,569,571,573,576,578,580],{"class":237,"line":565},23,[235,567,568],{"class":241},"            priceId",[235,570,246],{"class":245},[235,572,289],{"class":245},[235,574,575],{"class":292},"price_lifetime",[235,577,296],{"class":245},[235,579,274],{"class":245},[235,581,582],{"class":277}," // Set Stripe Price ID for one-time payment\n",[235,584,586,589,591,594,596],{"class":237,"line":585},24,[235,587,588],{"class":241},"            promoCodeId",[235,590,246],{"class":245},[235,592,593],{"class":245}," ''",[235,595,274],{"class":245},[235,597,598],{"class":277}," // Optional - Set Stripe Promo ID for any promo/coupon to discount\n",[235,600,602,605,607,609,612,614,616],{"class":237,"line":601},25,[235,603,604],{"class":241},"            mode",[235,606,246],{"class":245},[235,608,289],{"class":245},[235,610,611],{"class":292},"payment",[235,613,296],{"class":245},[235,615,274],{"class":245},[235,617,618],{"class":277}," // Payment is one-time\n",[235,620,622],{"class":237,"line":621},26,[235,623,522],{"class":245},[235,625,627],{"class":237,"line":626},27,[235,628,629],{"class":245},"    },\n",[235,631,633],{"class":237,"line":632},28,[235,634,635],{"class":245},"},\n",[163,637,638,639],{},"Set up a webhook:\n",[181,640,641,663],{},[163,642,643,646,647,653,660,661,264],{},[176,644,645],{},"Local",": Use ",[167,648,652],{"href":649,"rel":650},"https://docs.stripe.com/stripe-cli",[651],"nofollow","Stripe CLI",[213,654,658],{"className":655,"code":656,"filename":657,"language":219,"meta":220},[216],"stripe listen --forward-to localhost:3000/api/auth/stripe/webhook\n","Terminal",[194,659,656],{"__ignoreMap":220},"\nCopy the Webhook Secret into ",[194,662,218],{},[163,664,665,668,669,675,676,679,680,679,683,686,687,264],{},[176,666,667],{},"Production",": Add a webhook endpoint in Stripe Dashboard pointing to:\n",[213,670,673],{"className":671,"code":672,"language":219},[216],"https://your-site.com/api/auth/stripe/webhook\n",[194,674,672],{"__ignoreMap":220},"\nSelect events like ",[194,677,678],{},"checkout.session.completed",", ",[194,681,682],{},"customer.subscription.created",[194,684,685],{},"customer.subscription.updated",", and ",[194,688,689],{},"customer.subscription.deleted",[155,691,693],{"id":692},"polar","Polar",[160,695,696,701,713,724,732,1045],{},[163,697,165,698,171],{},[167,699,693],{"href":700,"target":170},"https://polar.sh",[163,702,174,703,705,706],{},[176,704,178],{}," in the Polar Dashboard.\n",[181,707,708,710],{},[163,709,185],{},[163,711,712],{},"Copy the Product IDs (found in the product details/API settings).",[163,714,715,716,719,720,723],{},"Generate a ",[176,717,718],{},"Personal Access Token"," (or Organization Token) and configure a ",[176,721,722],{},"Webhook"," in the Polar Dashboard (Settings > Developers).",[163,725,211,726],{},[213,727,730],{"className":728,"code":729,"filename":218,"language":219,"meta":220},[216],"POLAR_ACCESS_TOKEN=\"your-polar-access-token\"\nPOLAR_WEBHOOK_SECRET=\"your-polar-webhook-secret\"\n",[194,731,729],{"__ignoreMap":220},[163,733,225,734],{},[213,735,737],{"className":228,"code":736,"filename":230,"language":231,"meta":220,"style":220},"pricing: {\n    paymentProvider: enums.paymentProvider.polar, // Set paymentProvider Polar\n    successUrlPath: '/payment-success', // Redirect after successful payment\n    failedUrlPath: '/payment-failed', // Redirect after failed payment\n    plans: {\n        pro: {\n            enable: true, // Is show Pro Plan\n            key: 'pro',\n            monthly: {\n                key: 'pro-monthly',\n                priceId: 'price_monthly', // Set Polar Product ID for monthly subscription\n                mode: 'subscription', // Payment is subscription\n            },\n            yearly: {\n                key: 'pro-yearly',\n                priceId: 'price_yearly', // Set Polar Product ID for yearly subscription\n                mode: 'subscription', // Payment is subscription\n            },\n        },\n        lifetime: {\n            enable: true, // Is show Lifetime Plan\n            key: 'lifetime',\n            priceId: 'price_lifetime', // Set Polar Product ID for one-time payment\n            mode: 'payment', // Payment is one-time\n        },\n    },\n},\n",[194,738,739,747,768,784,800,808,816,829,843,851,865,882,898,902,910,924,941,957,961,965,973,986,1000,1017,1033,1037,1041],{"__ignoreMap":220},[235,740,741,743,745],{"class":237,"line":238},[235,742,242],{"class":241},[235,744,246],{"class":245},[235,746,249],{"class":245},[235,748,749,751,753,755,757,759,761,763,765],{"class":237,"line":252},[235,750,255],{"class":241},[235,752,246],{"class":245},[235,754,261],{"class":260},[235,756,264],{"class":245},[235,758,267],{"class":260},[235,760,264],{"class":245},[235,762,692],{"class":260},[235,764,274],{"class":245},[235,766,767],{"class":277}," // Set paymentProvider Polar\n",[235,769,770,772,774,776,778,780,782],{"class":237,"line":281},[235,771,284],{"class":241},[235,773,246],{"class":245},[235,775,289],{"class":245},[235,777,293],{"class":292},[235,779,296],{"class":245},[235,781,274],{"class":245},[235,783,301],{"class":277},[235,785,786,788,790,792,794,796,798],{"class":237,"line":304},[235,787,307],{"class":241},[235,789,246],{"class":245},[235,791,289],{"class":245},[235,793,314],{"class":292},[235,795,296],{"class":245},[235,797,274],{"class":245},[235,799,321],{"class":277},[235,801,802,804,806],{"class":237,"line":324},[235,803,327],{"class":241},[235,805,246],{"class":245},[235,807,249],{"class":245},[235,809,810,812,814],{"class":237,"line":334},[235,811,337],{"class":241},[235,813,246],{"class":245},[235,815,249],{"class":245},[235,817,818,820,822,824,826],{"class":237,"line":344},[235,819,347],{"class":241},[235,821,246],{"class":245},[235,823,353],{"class":352},[235,825,274],{"class":245},[235,827,828],{"class":277}," // Is show Pro Plan\n",[235,830,831,833,835,837,839,841],{"class":237,"line":361},[235,832,364],{"class":241},[235,834,246],{"class":245},[235,836,289],{"class":245},[235,838,371],{"class":292},[235,840,296],{"class":245},[235,842,376],{"class":245},[235,844,845,847,849],{"class":237,"line":379},[235,846,382],{"class":241},[235,848,246],{"class":245},[235,850,249],{"class":245},[235,852,853,855,857,859,861,863],{"class":237,"line":389},[235,854,392],{"class":241},[235,856,246],{"class":245},[235,858,289],{"class":245},[235,860,399],{"class":292},[235,862,296],{"class":245},[235,864,376],{"class":245},[235,866,867,869,871,873,875,877,879],{"class":237,"line":406},[235,868,409],{"class":241},[235,870,246],{"class":245},[235,872,289],{"class":245},[235,874,416],{"class":292},[235,876,296],{"class":245},[235,878,274],{"class":245},[235,880,881],{"class":277}," // Set Polar Product ID for monthly subscription\n",[235,883,884,886,888,890,892,894,896],{"class":237,"line":426},[235,885,429],{"class":241},[235,887,246],{"class":245},[235,889,289],{"class":245},[235,891,436],{"class":292},[235,893,296],{"class":245},[235,895,274],{"class":245},[235,897,443],{"class":277},[235,899,900],{"class":237,"line":446},[235,901,449],{"class":245},[235,903,904,906,908],{"class":237,"line":452},[235,905,455],{"class":241},[235,907,246],{"class":245},[235,909,249],{"class":245},[235,911,912,914,916,918,920,922],{"class":237,"line":462},[235,913,392],{"class":241},[235,915,246],{"class":245},[235,917,289],{"class":245},[235,919,471],{"class":292},[235,921,296],{"class":245},[235,923,376],{"class":245},[235,925,926,928,930,932,934,936,938],{"class":237,"line":478},[235,927,409],{"class":241},[235,929,246],{"class":245},[235,931,289],{"class":245},[235,933,487],{"class":292},[235,935,296],{"class":245},[235,937,274],{"class":245},[235,939,940],{"class":277}," // Set Polar Product ID for yearly subscription\n",[235,942,943,945,947,949,951,953,955],{"class":237,"line":497},[235,944,429],{"class":241},[235,946,246],{"class":245},[235,948,289],{"class":245},[235,950,436],{"class":292},[235,952,296],{"class":245},[235,954,274],{"class":245},[235,956,443],{"class":277},[235,958,959],{"class":237,"line":514},[235,960,449],{"class":245},[235,962,963],{"class":237,"line":519},[235,964,522],{"class":245},[235,966,967,969,971],{"class":237,"line":525},[235,968,528],{"class":241},[235,970,246],{"class":245},[235,972,249],{"class":245},[235,974,975,977,979,981,983],{"class":237,"line":535},[235,976,347],{"class":241},[235,978,246],{"class":245},[235,980,353],{"class":352},[235,982,274],{"class":245},[235,984,985],{"class":277}," // Is show Lifetime Plan\n",[235,987,988,990,992,994,996,998],{"class":237,"line":549},[235,989,364],{"class":241},[235,991,246],{"class":245},[235,993,289],{"class":245},[235,995,558],{"class":292},[235,997,296],{"class":245},[235,999,376],{"class":245},[235,1001,1002,1004,1006,1008,1010,1012,1014],{"class":237,"line":565},[235,1003,568],{"class":241},[235,1005,246],{"class":245},[235,1007,289],{"class":245},[235,1009,575],{"class":292},[235,1011,296],{"class":245},[235,1013,274],{"class":245},[235,1015,1016],{"class":277}," // Set Polar Product ID for one-time payment\n",[235,1018,1019,1021,1023,1025,1027,1029,1031],{"class":237,"line":585},[235,1020,604],{"class":241},[235,1022,246],{"class":245},[235,1024,289],{"class":245},[235,1026,611],{"class":292},[235,1028,296],{"class":245},[235,1030,274],{"class":245},[235,1032,618],{"class":277},[235,1034,1035],{"class":237,"line":601},[235,1036,522],{"class":245},[235,1038,1039],{"class":237,"line":621},[235,1040,629],{"class":245},[235,1042,1043],{"class":237,"line":626},[235,1044,635],{"class":245},[163,1046,638,1047],{},[181,1048,1049,1056],{},[163,1050,1051,1053,1054,264],{},[176,1052,645],{},": Use a tunneling service (like ngrok) or Polar's CLI if available to forward events to your local environment. Copy the Webhook Secret into ",[194,1055,218],{},[163,1057,1058,1060,1061,1067,1068,679,1071,679,1074,679,1077,264],{},[176,1059,667],{},": Add a webhook endpoint in Polar Dashboard pointing to:\n",[213,1062,1065],{"className":1063,"code":1064,"language":219},[216],"https://your-site.com/api/auth/polar/webhooks\n",[194,1066,1064],{"__ignoreMap":220},"\nSelect at least the following events like ",[194,1069,1070],{},"order.created",[194,1072,1073],{},"subscription.created",[194,1075,1076],{},"subscription.updated",[194,1078,1079],{},"subscription.canceled",[155,1081,1083],{"id":1082},"dodo-payments","Dodo Payments",[160,1085,1086,1091,1108,1116,1124,1436],{},[163,1087,165,1088,171],{},[167,1089,1083],{"href":1090,"target":170},"https://app.dodopayments.com/login",[163,1092,174,1093,1095,1096],{},[176,1094,178],{}," and its associated pricing plans in the Dodo Payments Dashboard.\n",[181,1097,1098],{},[163,1099,188,1100,1103,1104,1107],{},[176,1101,1102],{},"Product IDs"," (they typically start with ",[194,1105,1106],{},"pdt_",") for each unique plan/interval.",[163,1109,200,1110,204,1113,1115],{},[176,1111,1112],{},"API Key",[176,1114,207],{}," from the Dodo Payments Dashboard (Developer > API Keys and Webhooks).",[163,1117,211,1118],{},[213,1119,1122],{"className":1120,"code":1121,"filename":218,"language":219,"meta":220},[216],"DODO_PAYMENTS_API_KEY=\"your-dodo-api-key\"\nDODO_PAYMENTS_WEBHOOK_SECRET=\"your-dodo-webhook-secret\"\n",[194,1123,1121],{"__ignoreMap":220},[163,1125,225,1126],{},[213,1127,1129],{"className":228,"code":1128,"filename":230,"language":231,"meta":220,"style":220},"pricing: {\n    paymentProvider: enums.paymentProvider.dodo, // Set paymentProvider Dodo\n    successUrlPath: '/payment-success', // Redirect after successful payment\n    failedUrlPath: '/payment-failed', // Redirect after failed payment\n    plans: {\n        pro: {\n            enable: true, // Is show Pro Plan\n            key: 'pro',\n            monthly: {\n                key: 'pro-monthly',\n                priceId: 'price_monthly', // Set Dodo Product ID for monthly subscription\n                mode: 'subscription', // Payment is subscription\n            },\n            yearly: {\n                key: 'pro-yearly',\n                priceId: 'price_yearly', // Set Dodo Product ID for yearly subscription\n                mode: 'subscription', // Payment is subscription\n            },\n        },\n        lifetime: {\n            enable: true, // Is show Lifetime Plan\n            key: 'lifetime',\n            priceId: 'price_lifetime', // Set Dodo Product ID for one-time payment\n            mode: 'payment', // Payment is one-time\n        },\n    },\n},\n",[194,1130,1131,1139,1161,1177,1193,1201,1209,1221,1235,1243,1257,1274,1290,1294,1302,1316,1333,1349,1353,1357,1365,1377,1391,1408,1424,1428,1432],{"__ignoreMap":220},[235,1132,1133,1135,1137],{"class":237,"line":238},[235,1134,242],{"class":241},[235,1136,246],{"class":245},[235,1138,249],{"class":245},[235,1140,1141,1143,1145,1147,1149,1151,1153,1156,1158],{"class":237,"line":252},[235,1142,255],{"class":241},[235,1144,246],{"class":245},[235,1146,261],{"class":260},[235,1148,264],{"class":245},[235,1150,267],{"class":260},[235,1152,264],{"class":245},[235,1154,1155],{"class":260},"dodo",[235,1157,274],{"class":245},[235,1159,1160],{"class":277}," // Set paymentProvider Dodo\n",[235,1162,1163,1165,1167,1169,1171,1173,1175],{"class":237,"line":281},[235,1164,284],{"class":241},[235,1166,246],{"class":245},[235,1168,289],{"class":245},[235,1170,293],{"class":292},[235,1172,296],{"class":245},[235,1174,274],{"class":245},[235,1176,301],{"class":277},[235,1178,1179,1181,1183,1185,1187,1189,1191],{"class":237,"line":304},[235,1180,307],{"class":241},[235,1182,246],{"class":245},[235,1184,289],{"class":245},[235,1186,314],{"class":292},[235,1188,296],{"class":245},[235,1190,274],{"class":245},[235,1192,321],{"class":277},[235,1194,1195,1197,1199],{"class":237,"line":324},[235,1196,327],{"class":241},[235,1198,246],{"class":245},[235,1200,249],{"class":245},[235,1202,1203,1205,1207],{"class":237,"line":334},[235,1204,337],{"class":241},[235,1206,246],{"class":245},[235,1208,249],{"class":245},[235,1210,1211,1213,1215,1217,1219],{"class":237,"line":344},[235,1212,347],{"class":241},[235,1214,246],{"class":245},[235,1216,353],{"class":352},[235,1218,274],{"class":245},[235,1220,828],{"class":277},[235,1222,1223,1225,1227,1229,1231,1233],{"class":237,"line":361},[235,1224,364],{"class":241},[235,1226,246],{"class":245},[235,1228,289],{"class":245},[235,1230,371],{"class":292},[235,1232,296],{"class":245},[235,1234,376],{"class":245},[235,1236,1237,1239,1241],{"class":237,"line":379},[235,1238,382],{"class":241},[235,1240,246],{"class":245},[235,1242,249],{"class":245},[235,1244,1245,1247,1249,1251,1253,1255],{"class":237,"line":389},[235,1246,392],{"class":241},[235,1248,246],{"class":245},[235,1250,289],{"class":245},[235,1252,399],{"class":292},[235,1254,296],{"class":245},[235,1256,376],{"class":245},[235,1258,1259,1261,1263,1265,1267,1269,1271],{"class":237,"line":406},[235,1260,409],{"class":241},[235,1262,246],{"class":245},[235,1264,289],{"class":245},[235,1266,416],{"class":292},[235,1268,296],{"class":245},[235,1270,274],{"class":245},[235,1272,1273],{"class":277}," // Set Dodo Product ID for monthly subscription\n",[235,1275,1276,1278,1280,1282,1284,1286,1288],{"class":237,"line":426},[235,1277,429],{"class":241},[235,1279,246],{"class":245},[235,1281,289],{"class":245},[235,1283,436],{"class":292},[235,1285,296],{"class":245},[235,1287,274],{"class":245},[235,1289,443],{"class":277},[235,1291,1292],{"class":237,"line":446},[235,1293,449],{"class":245},[235,1295,1296,1298,1300],{"class":237,"line":452},[235,1297,455],{"class":241},[235,1299,246],{"class":245},[235,1301,249],{"class":245},[235,1303,1304,1306,1308,1310,1312,1314],{"class":237,"line":462},[235,1305,392],{"class":241},[235,1307,246],{"class":245},[235,1309,289],{"class":245},[235,1311,471],{"class":292},[235,1313,296],{"class":245},[235,1315,376],{"class":245},[235,1317,1318,1320,1322,1324,1326,1328,1330],{"class":237,"line":478},[235,1319,409],{"class":241},[235,1321,246],{"class":245},[235,1323,289],{"class":245},[235,1325,487],{"class":292},[235,1327,296],{"class":245},[235,1329,274],{"class":245},[235,1331,1332],{"class":277}," // Set Dodo Product ID for yearly subscription\n",[235,1334,1335,1337,1339,1341,1343,1345,1347],{"class":237,"line":497},[235,1336,429],{"class":241},[235,1338,246],{"class":245},[235,1340,289],{"class":245},[235,1342,436],{"class":292},[235,1344,296],{"class":245},[235,1346,274],{"class":245},[235,1348,443],{"class":277},[235,1350,1351],{"class":237,"line":514},[235,1352,449],{"class":245},[235,1354,1355],{"class":237,"line":519},[235,1356,522],{"class":245},[235,1358,1359,1361,1363],{"class":237,"line":525},[235,1360,528],{"class":241},[235,1362,246],{"class":245},[235,1364,249],{"class":245},[235,1366,1367,1369,1371,1373,1375],{"class":237,"line":535},[235,1368,347],{"class":241},[235,1370,246],{"class":245},[235,1372,353],{"class":352},[235,1374,274],{"class":245},[235,1376,985],{"class":277},[235,1378,1379,1381,1383,1385,1387,1389],{"class":237,"line":549},[235,1380,364],{"class":241},[235,1382,246],{"class":245},[235,1384,289],{"class":245},[235,1386,558],{"class":292},[235,1388,296],{"class":245},[235,1390,376],{"class":245},[235,1392,1393,1395,1397,1399,1401,1403,1405],{"class":237,"line":565},[235,1394,568],{"class":241},[235,1396,246],{"class":245},[235,1398,289],{"class":245},[235,1400,575],{"class":292},[235,1402,296],{"class":245},[235,1404,274],{"class":245},[235,1406,1407],{"class":277}," // Set Dodo Product ID for one-time payment\n",[235,1409,1410,1412,1414,1416,1418,1420,1422],{"class":237,"line":585},[235,1411,604],{"class":241},[235,1413,246],{"class":245},[235,1415,289],{"class":245},[235,1417,611],{"class":292},[235,1419,296],{"class":245},[235,1421,274],{"class":245},[235,1423,618],{"class":277},[235,1425,1426],{"class":237,"line":601},[235,1427,522],{"class":245},[235,1429,1430],{"class":237,"line":621},[235,1431,629],{"class":245},[235,1433,1434],{"class":237,"line":626},[235,1435,635],{"class":245},[163,1437,638,1438],{},[181,1439,1440,1453],{},[163,1441,1442,1444,1445,1452],{},[176,1443,645],{},": Use a tunneling service (like ngrok) to expose your local development server.\n",[213,1446,1450],{"className":1447,"code":1448,"filename":1449,"language":219,"meta":220},[216],"# Example using ngrok to tunnel to your app's port\nngrok http 3000\n","terminal",[194,1451,1448],{"__ignoreMap":220},"\nCopy the resulting URL and add /api/payment/dodo/webhook to it for the Dodo Webhook configuration.",[163,1454,1455,1457,1458,1464,1465,679,1468,679,1471,679,1474,679,1476,679,1479,679,1482,686,1485,264],{},[176,1456,667],{},": Add a webhook endpoint in Dodo Payments Dashboard pointing to:\n",[213,1459,1462],{"className":1460,"code":1461,"language":219},[216],"https://your-site.com/api/payment/dodo/webhook\n",[194,1463,1461],{"__ignoreMap":220},"\nSelect at lease the following events like ",[194,1466,1467],{},"payment.succeeded",[194,1469,1470],{},"payment.failed",[194,1472,1473],{},"subscription.active",[194,1475,1076],{},[194,1477,1478],{},"subscription.renewed",[194,1480,1481],{},"subscription.cancelled",[194,1483,1484],{},"subscription.on_hold",[194,1486,1487],{},"subscription.failed",[151,1489,1491],{"id":1490},"usage","Usage",[181,1493,1494,1500,1506,1535],{},[163,1495,1496,1499],{},[176,1497,1498],{},"Handle Webhooks",": Plugin automatically updates subscription status on payment events.",[163,1501,1502,1505],{},[176,1503,1504],{},"Verify Payments",": Check transactions and subscriptions in the plugin dashboard.",[163,1507,1508,1511,1512,1515,1516,1527,1528,1531,1532],{},[176,1509,1510],{},"Initiate Checkout",": Use the ",[194,1513,1514],{},"paymentCheckout"," function to start a payment.\n",[213,1517,1521],{"className":1518,"code":1519,"language":1520,"meta":220,"style":220},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const { payment } = useAuth(); payment.paymentCheckout(appConfig.pricing.plans.lifetime.key, locale.value);\n","vue",[194,1522,1523],{"__ignoreMap":220},[235,1524,1525],{"class":237,"line":238},[235,1526,1519],{"class":260},"\nUsers are redirected to payment's checkout page, then back to ",[194,1529,1530],{},"successUrlPath"," or ",[194,1533,1534],{},"failedUrlPath",[163,1536,1537,1540,1541],{},[176,1538,1539],{},"Customer Portal",": Let users manage subscriptions, invoices, and payment methods:\n",[213,1542,1544],{"className":1518,"code":1543,"language":1520,"meta":220,"style":220},"const { payment } = useAuth(); payment.toCustomerPortal();\n",[194,1545,1546],{"__ignoreMap":220},[235,1547,1548],{"class":237,"line":238},[235,1549,1543],{"class":260},[1551,1552,1553],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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":220,"searchDepth":252,"depth":252,"links":1555},[1556,1561],{"id":153,"depth":252,"text":12,"children":1557},[1558,1559,1560],{"id":157,"depth":281,"text":158},{"id":692,"depth":281,"text":693},{"id":1082,"depth":281,"text":1083},{"id":1490,"depth":252,"text":1491},"Set up Stripe, Polar, or Dodo Payments via Better Auth plugins to handle one-time and subscription payments.","md",null,{},true,{"title":31,"description":1562},{"loc":32},"qxRr_myar7NTZuWbSYldHH_29hr2w8VjyydLkTgQQhU",[1571,1573],{"title":27,"path":28,"stem":29,"description":1572,"children":-1},"Set up authentication in your app to allow users to sign in, sign up, and manage accounts securely.",{"title":35,"path":36,"stem":37,"description":1574,"children":-1},"Set up the Admin Panel dashboard in your app to manage users, revenue, and subscriptions."]