[{"data":1,"prerenderedAt":970},["ShallowReactive",2],{"navigation":3,"\u002Fbooki-documentation\u002Fguides\u002Fguides-environment-setup":303,"\u002Fbooki-documentation\u002Fguides\u002Fguides-environment-setup-surround":965},[4,55,105],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":54},"Nuxt Guide","i-lucide-layout","\u002Fnuxt-guide","1.nuxt-guide",[10,14,19,24,29,34,39,44,49],{"title":11,"path":12,"stem":13,"icon":6},"Overview","\u002Fnuxt-guide\u002Foverview","1.nuxt-guide\u002F1.overview",{"title":15,"path":16,"stem":17,"icon":18},"Folder Structure","\u002Fnuxt-guide\u002Ffolder-structure","1.nuxt-guide\u002F2.folder-structure","i-lucide-folder-tree",{"title":20,"path":21,"stem":22,"icon":23},"Components","\u002Fnuxt-guide\u002Fcomponents","1.nuxt-guide\u002F3.components","i-lucide-component",{"title":25,"path":26,"stem":27,"icon":28},"Composables","\u002Fnuxt-guide\u002Fcomposables","1.nuxt-guide\u002F4.composables","i-lucide-puzzle",{"title":30,"path":31,"stem":32,"icon":33},"Pages & Routing","\u002Fnuxt-guide\u002Fpages-routing","1.nuxt-guide\u002F5.pages-routing","i-lucide-file-text",{"title":35,"path":36,"stem":37,"icon":38},"Middleware","\u002Fnuxt-guide\u002Fmiddleware","1.nuxt-guide\u002F6.middleware","i-lucide-shield-check",{"title":40,"path":41,"stem":42,"icon":43},"Plugins","\u002Fnuxt-guide\u002Fplugins","1.nuxt-guide\u002F7.plugins","i-lucide-plug",{"title":45,"path":46,"stem":47,"icon":48},"State Management","\u002Fnuxt-guide\u002Fstate-management","1.nuxt-guide\u002F8.state-management","i-lucide-database",{"title":50,"path":51,"stem":52,"icon":53},"TypeScript","\u002Fnuxt-guide\u002Ftypescript","1.nuxt-guide\u002F9.typescript","i-lucide-braces",false,{"title":56,"icon":57,"path":58,"stem":59,"children":60,"page":54},"Node \u002F Express Guide","i-lucide-server","\u002Fnode-express-guide","2.node-express-guide",[61,64,69,72,77,82,86,91,96,100],{"title":11,"path":62,"stem":63,"icon":57},"\u002Fnode-express-guide\u002Foverview","2.node-express-guide\u002F1.overview",{"title":65,"path":66,"stem":67,"icon":68},"Error Handling","\u002Fnode-express-guide\u002Ferror-handling","2.node-express-guide\u002F10.error-handling","i-lucide-alert-triangle",{"title":15,"path":70,"stem":71,"icon":18},"\u002Fnode-express-guide\u002Ffolder-structure","2.node-express-guide\u002F2.folder-structure",{"title":73,"path":74,"stem":75,"icon":76},"Controllers","\u002Fnode-express-guide\u002Fcontrollers","2.node-express-guide\u002F3.controllers","i-lucide-cpu",{"title":78,"path":79,"stem":80,"icon":81},"Services","\u002Fnode-express-guide\u002Fservices","2.node-express-guide\u002F4.services","i-lucide-workflow",{"title":83,"path":84,"stem":85,"icon":48},"Repositories","\u002Fnode-express-guide\u002Frepositories","2.node-express-guide\u002F5.repositories",{"title":87,"path":88,"stem":89,"icon":90},"Models","\u002Fnode-express-guide\u002Fmodels","2.node-express-guide\u002F6.models","i-lucide-boxes",{"title":92,"path":93,"stem":94,"icon":95},"Routes","\u002Fnode-express-guide\u002Froutes","2.node-express-guide\u002F7.routes","i-lucide-route",{"title":35,"path":97,"stem":98,"icon":99},"\u002Fnode-express-guide\u002Fmiddleware","2.node-express-guide\u002F8.middleware","i-lucide-shield",{"title":101,"path":102,"stem":103,"icon":104},"Validation","\u002Fnode-express-guide\u002Fvalidation","2.node-express-guide\u002F9.validation","i-lucide-check-circle",{"title":106,"icon":107,"path":108,"stem":109,"children":110,"page":54},"Booki Documentation","i-lucide-book-open","\u002Fbooki-documentation","3.booki-documentation",[111,115,120,125,130,229,244,257],{"title":112,"path":113,"stem":114,"icon":107},"Project Overview","\u002Fbooki-documentation\u002Foverview","3.booki-documentation\u002F1.overview",{"title":116,"path":117,"stem":118,"icon":119},"Installation","\u002Fbooki-documentation\u002F1.installation","3.booki-documentation\u002F2.1.installation","i-lucide-download",{"title":121,"path":122,"stem":123,"icon":124},"Development Overview","\u002Fbooki-documentation\u002F2.architecture","3.booki-documentation\u002F2.2.architecture","i-lucide-layers",{"title":126,"path":127,"stem":128,"icon":129},"Local Development","\u002Fbooki-documentation\u002F3.local-development","3.booki-documentation\u002F2.3.local-development","i-lucide-monitor",{"title":131,"icon":57,"path":132,"stem":133,"children":134,"page":54},"API","\u002Fbooki-documentation\u002Fapi","3.booki-documentation\u002F3.api",[135,139,144,149,154,159,163,168,173,178,183,188,192,197,202,206,211,216,220,224],{"title":136,"path":137,"stem":138,"icon":57},"Booki API Reference","\u002Fbooki-documentation\u002Fapi\u002Fbooki-api","3.booki-documentation\u002F3.api\u002F1.booki-api",{"title":140,"path":141,"stem":142,"icon":143},"Auth - Login & Refresh","\u002Fbooki-documentation\u002Fapi\u002Fauth","3.booki-documentation\u002F3.api\u002F2.auth","i-lucide-key",{"title":145,"path":146,"stem":147,"icon":148},"Auth - Customer Registration","\u002Fbooki-documentation\u002Fapi\u002Fauth-customer-register","3.booki-documentation\u002F3.api\u002F2.auth-customer-register","i-lucide-user-check",{"title":150,"path":151,"stem":152,"icon":153},"Auth - Owner Registration","\u002Fbooki-documentation\u002Fapi\u002Fauth-owner-register","3.booki-documentation\u002F3.api\u002F2.auth-owner-register","i-lucide-user-plus",{"title":155,"path":156,"stem":157,"icon":158},"Bookings","\u002Fbooki-documentation\u002Fapi\u002Fbookings","3.booki-documentation\u002F3.api\u002F3.bookings","i-lucide-calendar-check",{"title":160,"path":161,"stem":162,"icon":158},"Bookings - Authenticated","\u002Fbooki-documentation\u002Fapi\u002Fbookings-auth","3.booki-documentation\u002F3.api\u002F3.bookings-auth",{"title":164,"path":165,"stem":166,"icon":167},"Bookings - Public & Guest","\u002Fbooki-documentation\u002Fapi\u002Fbookings-public","3.booki-documentation\u002F3.api\u002F3.bookings-public","i-lucide-calendar-plus",{"title":169,"path":170,"stem":171,"icon":172},"Booking Services","\u002Fbooki-documentation\u002Fapi\u002Fbooking-services","3.booki-documentation\u002F3.api\u002F4.booking-services","i-lucide-box",{"title":174,"path":175,"stem":176,"icon":177},"Organizations - Branches","\u002Fbooki-documentation\u002Fapi\u002Fbranches","3.booki-documentation\u002F3.api\u002F5.branches","i-lucide-git-branch",{"title":179,"path":180,"stem":181,"icon":182},"Organizations - Business Hours","\u002Fbooki-documentation\u002Fapi\u002Fbusiness-hours","3.booki-documentation\u002F3.api\u002F5.business-hours","i-lucide-clock",{"title":184,"path":185,"stem":186,"icon":187},"Organizations - Base","\u002Fbooki-documentation\u002Fapi\u002Forganizations","3.booki-documentation\u002F3.api\u002F5.organizations","i-lucide-building-2",{"title":189,"path":190,"stem":191,"icon":172},"Organizations - Packages","\u002Fbooki-documentation\u002Fapi\u002Fpackages","3.booki-documentation\u002F3.api\u002F5.packages",{"title":193,"path":194,"stem":195,"icon":196},"Organizations - Payments & Integrations","\u002Fbooki-documentation\u002Fapi\u002Fpayments","3.booki-documentation\u002F3.api\u002F5.payments","i-lucide-credit-card",{"title":198,"path":199,"stem":200,"icon":201},"Users - Profile & Settings","\u002Fbooki-documentation\u002Fapi\u002Fusers","3.booki-documentation\u002F3.api\u002F6.users","i-lucide-user",{"title":203,"path":204,"stem":205,"icon":196},"Maya Payments","\u002Fbooki-documentation\u002Fapi\u002Fmaya","3.booki-documentation\u002F3.api\u002F7.maya",{"title":207,"path":208,"stem":209,"icon":210},"Owner - Booking Management","\u002Fbooki-documentation\u002Fapi\u002Fowner-bookings","3.booki-documentation\u002F3.api\u002F7.owner-bookings","i-lucide-calendar",{"title":212,"path":213,"stem":214,"icon":215},"Owner - Customer Management","\u002Fbooki-documentation\u002Fapi\u002Fowner-customers","3.booki-documentation\u002F3.api\u002F7.owner-customers","i-lucide-users",{"title":217,"path":218,"stem":219,"icon":196},"Admin - Billing & Subscriptions","\u002Fbooki-documentation\u002Fapi\u002Fadmin-billing","3.booki-documentation\u002F3.api\u002F8.admin-billing",{"title":221,"path":222,"stem":223,"icon":187},"Admin - Organizations Management","\u002Fbooki-documentation\u002Fapi\u002Fadmin-organizations","3.booki-documentation\u002F3.api\u002F8.admin-organizations",{"title":225,"path":226,"stem":227,"icon":228},"Admin - User Management","\u002Fbooki-documentation\u002Fapi\u002Fadmin-users","3.booki-documentation\u002F3.api\u002F8.admin-users","i-lucide-shield-admin",{"title":230,"icon":231,"path":232,"stem":233,"children":234,"page":54},"Shared","i-lucide-package","\u002Fbooki-documentation\u002Fshared","3.booki-documentation\u002F4.shared",[235,240],{"title":236,"path":237,"stem":238,"icon":239},"codi-node-utils","\u002Fbooki-documentation\u002Fshared\u002Fcodi-node-utils","3.booki-documentation\u002F4.shared\u002F1.codi-node-utils","i-lucide-wrench",{"title":241,"path":242,"stem":243,"icon":124},"codi-layer","\u002Fbooki-documentation\u002Fshared\u002Fcodi-layer","3.booki-documentation\u002F4.shared\u002F2.codi-layer",{"title":245,"path":246,"stem":247,"children":248,"page":54},"Flowcharts","\u002Fbooki-documentation\u002Fflowcharts","3.booki-documentation\u002F5.flowcharts",[249,253],{"title":250,"path":251,"stem":252,"icon":158},"Owner Booking Management Flow","\u002Fbooki-documentation\u002Fflowcharts\u002Fowner-booking-management","3.booki-documentation\u002F5.flowcharts\u002F1.owner-booking-management",{"title":254,"path":255,"stem":256,"icon":167},"Customer Booking Flow","\u002Fbooki-documentation\u002Fflowcharts\u002Fcustomer-booking-flow","3.booki-documentation\u002F5.flowcharts\u002F2.customer-booking-flow",{"title":258,"path":259,"stem":260,"children":261,"page":54},"Guides","\u002Fbooki-documentation\u002Fguides","3.booki-documentation\u002Fguides",[262,267,271,275,280,285,290,294,298],{"title":263,"path":264,"stem":265,"icon":266},"Guide - Authentication Flow & Sessions","\u002Fbooki-documentation\u002Fguides\u002Fguides-auth-flow","3.booki-documentation\u002Fguides\u002Fguides-auth-flow","i-lucide-lock",{"title":268,"path":269,"stem":270,"icon":177},"Guide - Branch Management","\u002Fbooki-documentation\u002Fguides\u002Fguides-branch-management","3.booki-documentation\u002Fguides\u002Fguides-branch-management",{"title":272,"path":273,"stem":274,"icon":196},"Guide - Customer Payment Methods","\u002Fbooki-documentation\u002Fguides\u002Fguides-customer-payments","3.booki-documentation\u002Fguides\u002Fguides-customer-payments",{"title":276,"path":277,"stem":278,"icon":279},"Guide - Environment Setup","\u002Fbooki-documentation\u002Fguides\u002Fguides-environment-setup","3.booki-documentation\u002Fguides\u002Fguides-environment-setup","i-lucide-settings",{"title":281,"path":282,"stem":283,"icon":284},"Guide - Common Error Responses","\u002Fbooki-documentation\u002Fguides\u002Fguides-errors","3.booki-documentation\u002Fguides\u002Fguides-errors","i-lucide-alert-circle",{"title":286,"path":287,"stem":288,"icon":289},"Guide - Gmail SMTP Setup","\u002Fbooki-documentation\u002Fguides\u002Fguides-gmail-setup","3.booki-documentation\u002Fguides\u002Fguides-gmail-setup","i-lucide-mail",{"title":291,"path":292,"stem":293,"icon":124},"Guide - Multi-Tenancy & Tenant Slug Resolution","\u002Fbooki-documentation\u002Fguides\u002Fguides-multi-tenancy","3.booki-documentation\u002Fguides\u002Fguides-multi-tenancy",{"title":295,"path":296,"stem":297,"icon":48},"Guide - Redis Caching","\u002Fbooki-documentation\u002Fguides\u002Fguides-redis","3.booki-documentation\u002Fguides\u002Fguides-redis",{"title":299,"path":300,"stem":301,"icon":302},"Guide - Subscription Billing","\u002Fbooki-documentation\u002Fguides\u002Fguides-subscription-billing","3.booki-documentation\u002Fguides\u002Fguides-subscription-billing","i-lucide-receipt",{"id":304,"title":276,"body":305,"description":958,"extension":959,"links":960,"meta":961,"navigation":962,"path":277,"seo":963,"stem":278,"__hash__":964},"docs\u002F3.booki-documentation\u002Fguides\u002Fguides-environment-setup.md",{"type":306,"value":307,"toc":948},"minimark",[308,317,322,354,361,438,441,445,448,477,491,497,519,524,609,615,640,647,649,653,656,681,709,722,724,728,731,746,809,811,815,818,853,860,867,869,873,888,927,929,936,944],[309,310,311,312,316],"p",{},"This guide walks through every service that ",[313,314,315],"code",{},"booki-api"," depends on and explains how to obtain the required credentials.",[318,319,321],"h2",{"id":320},"quick-start","Quick Start",[323,324,329],"pre",{"className":325,"code":326,"language":327,"meta":328,"style":328},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","cp .env.example .env\n# Then fill in the sections below\n","bash","",[313,330,331,347],{"__ignoreMap":328},[332,333,336,340,344],"span",{"class":334,"line":335},"line",1,[332,337,339],{"class":338},"sBMFI","cp",[332,341,343],{"class":342},"sfazB"," .env.example",[332,345,346],{"class":342}," .env\n",[332,348,350],{"class":334,"line":349},2,[332,351,353],{"class":352},"sHwdD","# Then fill in the sections below\n",[309,355,356,357,360],{},"Variables already pre-configured in ",[313,358,359],{},".env.example"," (no action needed for local dev):",[362,363,364,377],"table",{},[365,366,367],"thead",{},[368,369,370,374],"tr",{},[371,372,373],"th",{},"Variable",[371,375,376],{},"Purpose",[378,379,380,395,405,415,428],"tbody",{},[368,381,382,392],{},[383,384,385,388,389],"td",{},[313,386,387],{},"NODE_ENV",", ",[313,390,391],{},"PORT",[383,393,394],{},"App environment and port",[368,396,397,402],{},[383,398,399],{},[313,400,401],{},"ACCESS_TOKEN_EXPIRY",[383,403,404],{},"JWT expiry duration",[368,406,407,412],{},[383,408,409],{},[313,410,411],{},"MAILER_TRANSPORT_*",[383,413,414],{},"Ethereal (test) email transport",[368,416,417,425],{},[383,418,419,388,422],{},[313,420,421],{},"APP_ACCOUNT",[313,423,424],{},"FRONTEND_URL",[383,426,427],{},"Frontend URLs",[368,429,430,435],{},[383,431,432],{},[313,433,434],{},"DEFAULT_USER_*",[383,436,437],{},"Default admin seed credentials",[439,440],"hr",{},[318,442,444],{"id":443},"_1-redis","1. Redis",[309,446,447],{},"Redis is used for caching and session management.",[323,449,453],{"className":450,"code":451,"language":452,"meta":328,"style":328},"language-env shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","REDIS_HOST=your-redis-host.redis.cloud\nREDIS_PORT=12345\nREDIS_PASSWORD=your-redis-password\nREDIS_TLS=true\n","env",[313,454,455,460,465,471],{"__ignoreMap":328},[332,456,457],{"class":334,"line":335},[332,458,459],{},"REDIS_HOST=your-redis-host.redis.cloud\n",[332,461,462],{"class":334,"line":349},[332,463,464],{},"REDIS_PORT=12345\n",[332,466,468],{"class":334,"line":467},3,[332,469,470],{},"REDIS_PASSWORD=your-redis-password\n",[332,472,474],{"class":334,"line":473},4,[332,475,476],{},"REDIS_TLS=true\n",[478,479,480],"blockquote",{},[309,481,482,483,486,487,490],{},"Set ",[313,484,485],{},"REDIS_TLS=true"," for Redis Cloud and production. Set to ",[313,488,489],{},"false"," for local Redis.",[309,492,493],{},[494,495,496],"strong",{},"Option A — Redis Cloud (recommended for beginners):",[498,499,500,512],"ol",{},[501,502,503,504,511],"li",{},"Sign up at ",[505,506,510],"a",{"href":507,"rel":508},"https:\u002F\u002Fredis.com\u002Ftry-free\u002F",[509],"nofollow","redis.com\u002Ftry-free"," — free 30 MB tier.",[501,513,514,515,518],{},"Create a database and copy host, port, and password into ",[313,516,517],{},".env",".",[309,520,521],{},[494,522,523],{},"Option B — Local Redis:",[323,525,527],{"className":325,"code":526,"language":327,"meta":328,"style":328},"# macOS\nbrew install redis && brew services start redis\n\n# Linux\nsudo apt-get install redis-server && sudo systemctl start redis\n\n# Windows — download from https:\u002F\u002Fgithub.com\u002Fmicrosoftarchive\u002Fredis\u002Freleases\n",[313,528,529,534,561,567,572,598,603],{"__ignoreMap":328},[332,530,531],{"class":334,"line":335},[332,532,533],{"class":352},"# macOS\n",[332,535,536,539,542,545,549,552,555,558],{"class":334,"line":349},[332,537,538],{"class":338},"brew",[332,540,541],{"class":342}," install",[332,543,544],{"class":342}," redis",[332,546,548],{"class":547},"sMK4o"," &&",[332,550,551],{"class":338}," brew",[332,553,554],{"class":342}," services",[332,556,557],{"class":342}," start",[332,559,560],{"class":342}," redis\n",[332,562,563],{"class":334,"line":467},[332,564,566],{"emptyLinePlaceholder":565},true,"\n",[332,568,569],{"class":334,"line":473},[332,570,571],{"class":352},"# Linux\n",[332,573,575,578,581,583,586,588,591,594,596],{"class":334,"line":574},5,[332,576,577],{"class":338},"sudo",[332,579,580],{"class":342}," apt-get",[332,582,541],{"class":342},[332,584,585],{"class":342}," redis-server",[332,587,548],{"class":547},[332,589,590],{"class":338}," sudo",[332,592,593],{"class":342}," systemctl",[332,595,557],{"class":342},[332,597,560],{"class":342},[332,599,601],{"class":334,"line":600},6,[332,602,566],{"emptyLinePlaceholder":565},[332,604,606],{"class":334,"line":605},7,[332,607,608],{"class":352},"# Windows — download from https:\u002F\u002Fgithub.com\u002Fmicrosoftarchive\u002Fredis\u002Freleases\n",[309,610,611,612,614],{},"Local ",[313,613,517],{}," values:",[323,616,618],{"className":450,"code":617,"language":452,"meta":328,"style":328},"REDIS_HOST=localhost\nREDIS_PORT=6379\nREDIS_PASSWORD=\nREDIS_TLS=false\n",[313,619,620,625,630,635],{"__ignoreMap":328},[332,621,622],{"class":334,"line":335},[332,623,624],{},"REDIS_HOST=localhost\n",[332,626,627],{"class":334,"line":349},[332,628,629],{},"REDIS_PORT=6379\n",[332,631,632],{"class":334,"line":467},[332,633,634],{},"REDIS_PASSWORD=\n",[332,636,637],{"class":334,"line":473},[332,638,639],{},"REDIS_TLS=false\n",[309,641,642,643,518],{},"For detailed Redis commands and cache patterns, see ",[505,644,646],{"href":645},".\u002Fguides-redis","Redis Guide",[439,648],{},[318,650,652],{"id":651},"_2-maya","2. Maya",[309,654,655],{},"Maya is the payment gateway used for booking payments and subscription billing.",[323,657,659],{"className":450,"code":658,"language":452,"meta":328,"style":328},"MAYA_PUBLIC_KEY=pk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\nMAYA_SECRET_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\nMAYA_API_URL=https:\u002F\u002Fpg-sandbox.paymaya.com\nMAYA_PAYMENT_EXPIRY=1440\n",[313,660,661,666,671,676],{"__ignoreMap":328},[332,662,663],{"class":334,"line":335},[332,664,665],{},"MAYA_PUBLIC_KEY=pk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n",[332,667,668],{"class":334,"line":349},[332,669,670],{},"MAYA_SECRET_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n",[332,672,673],{"class":334,"line":467},[332,674,675],{},"MAYA_API_URL=https:\u002F\u002Fpg-sandbox.paymaya.com\n",[332,677,678],{"class":334,"line":473},[332,679,680],{},"MAYA_PAYMENT_EXPIRY=1440\n",[498,682,683,686,692,699],{},[501,684,685],{},"Obtain Maya sandbox credentials from the project supervisor or the Maya developer portal.",[501,687,482,688,691],{},[313,689,690],{},"MAYA_API_URL=https:\u002F\u002Fpg-sandbox.paymaya.com"," for development.",[501,693,694,695,698],{},"Switch to ",[313,696,697],{},"https:\u002F\u002Fpg.paymaya.com"," for production.",[501,700,701,704,705,708],{},[313,702,703],{},"MAYA_PAYMENT_EXPIRY"," is in minutes (default ",[313,706,707],{},"1440"," = 24 hours).",[478,710,711],{},[309,712,713,714,717,718,721],{},"Use sandbox keys (",[313,715,716],{},"pk-Z0OS..."," \u002F ",[313,719,720],{},"sk-aXQd..."," pattern) for development. Switch to live keys only in production.",[439,723],{},[318,725,727],{"id":726},"_3-google-oauth","3. Google OAuth",[309,729,730],{},"Required for Google Sign-In.",[323,732,734],{"className":450,"code":733,"language":452,"meta":328,"style":328},"GOOGLE_CLIENT_ID=1084594124395-xxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com\nGOOGLE_CLIENT_SECRET=GOCSPX-xxxxxxxxxxxxxxxxxxxxxxxxx\n",[313,735,736,741],{"__ignoreMap":328},[332,737,738],{"class":334,"line":335},[332,739,740],{},"GOOGLE_CLIENT_ID=1084594124395-xxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com\n",[332,742,743],{"class":334,"line":349},[332,744,745],{},"GOOGLE_CLIENT_SECRET=GOCSPX-xxxxxxxxxxxxxxxxxxxxxxxxx\n",[498,747,748,756,759,770,775,781,799],{},[501,749,750,751,518],{},"Open ",[505,752,755],{"href":753,"rel":754},"https:\u002F\u002Fconsole.cloud.google.com",[509],"console.cloud.google.com",[501,757,758],{},"Create or select a project.",[501,760,761,762,765,766,769],{},"Go to ",[494,763,764],{},"APIs & Services → Library",", search ",[494,767,768],{},"Google+ API",", and enable it.",[501,771,761,772,518],{},[494,773,774],{},"APIs & Services → Credentials → Create Credentials → OAuth 2.0 Client ID",[501,776,777,778,518],{},"Application type: ",[494,779,780],{},"Web application",[501,782,783,784],{},"Authorized redirect URIs:\n",[785,786,787,793],"ul",{},[501,788,789,792],{},[313,790,791],{},"http:\u002F\u002Flocalhost:3000\u002Fauth\u002Fgoogle\u002Fcallback"," (development)",[501,794,795,798],{},[313,796,797],{},"https:\u002F\u002Fyour-domain.com\u002Fauth\u002Fgoogle\u002Fcallback"," (production)",[501,800,801,802,805,806,518],{},"Copy the ",[494,803,804],{},"Client ID"," and ",[494,807,808],{},"Client Secret",[439,810],{},[318,812,814],{"id":813},"_4-gmail-smtp","4. Gmail SMTP",[309,816,817],{},"Used for transactional emails — booking confirmations, password resets, and notifications.",[323,819,821],{"className":450,"code":820,"language":452,"meta":328,"style":328},"GMAIL_USER=your-email@gmail.com\nGMAIL_APP_PASSWORD=xxxx xxxx xxxx xxxx\nGMAIL_HOST=smtp.gmail.com\nGMAIL_PORT=587\nGMAIL_SECURE=false\nADMIN_EMAIL=admin@yourdomain.com\n",[313,822,823,828,833,838,843,848],{"__ignoreMap":328},[332,824,825],{"class":334,"line":335},[332,826,827],{},"GMAIL_USER=your-email@gmail.com\n",[332,829,830],{"class":334,"line":349},[332,831,832],{},"GMAIL_APP_PASSWORD=xxxx xxxx xxxx xxxx\n",[332,834,835],{"class":334,"line":467},[332,836,837],{},"GMAIL_HOST=smtp.gmail.com\n",[332,839,840],{"class":334,"line":473},[332,841,842],{},"GMAIL_PORT=587\n",[332,844,845],{"class":334,"line":574},[332,846,847],{},"GMAIL_SECURE=false\n",[332,849,850],{"class":334,"line":600},[332,851,852],{},"ADMIN_EMAIL=admin@yourdomain.com\n",[309,854,855,856,859],{},"You need a ",[494,857,858],{},"Gmail App Password"," (not your regular Google password). App Passwords require 2-Step Verification to be enabled on the account.",[309,861,862,863,518],{},"For step-by-step instructions, see ",[505,864,866],{"href":865},".\u002Fguides-gmail-setup","Gmail Setup Guide",[439,868],{},[318,870,872],{"id":871},"_5-mongodb","5. MongoDB",[323,874,876],{"className":450,"code":875,"language":452,"meta":328,"style":328},"MONGO_URI=mongodb+srv:\u002F\u002Fusername:password@cluster.mongodb.net\u002F\nMONGO_DB=codiDev\n",[313,877,878,883],{"__ignoreMap":328},[332,879,880],{"class":334,"line":335},[332,881,882],{},"MONGO_URI=mongodb+srv:\u002F\u002Fusername:password@cluster.mongodb.net\u002F\n",[332,884,885],{"class":334,"line":349},[332,886,887],{},"MONGO_DB=codiDev\n",[498,889,890,898,901,908,921],{},[501,891,892,893,518],{},"Create a free cluster at ",[505,894,897],{"href":895,"rel":896},"https:\u002F\u002Fwww.mongodb.com\u002Fcloud\u002Fatlas",[509],"mongodb.com\u002Fcloud\u002Fatlas",[501,899,900],{},"Create a database user and whitelist your IP.",[501,902,903,904,907],{},"Click ",[494,905,906],{},"Connect → Drivers"," and copy the connection string.",[501,909,910,911,388,914,917,918,518],{},"Replace ",[313,912,913],{},"username",[313,915,916],{},"password",", and cluster in ",[313,919,920],{},"MONGO_URI",[501,922,482,923,926],{},[313,924,925],{},"MONGO_DB"," to your database name.",[439,928],{},[318,930,932,933,935],{"id":931},"full-env-reference","Full ",[313,934,517],{}," Reference",[309,937,938,939,943],{},"The canonical variable reference lives in the ",[505,940,942],{"href":941},"..\u002F2.1.installation","Installation doc",". The sections above explain how to obtain credentials for each service.",[945,946,947],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .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 .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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":328,"searchDepth":335,"depth":349,"links":949},[950,951,952,953,954,955,956],{"id":320,"depth":349,"text":321},{"id":443,"depth":349,"text":444},{"id":651,"depth":349,"text":652},{"id":726,"depth":349,"text":727},{"id":813,"depth":349,"text":814},{"id":871,"depth":349,"text":872},{"id":931,"depth":349,"text":957},"Full .env Reference","How to configure all required environment variables for booki-api including Redis, Maya, Google OAuth, Gmail SMTP, and MongoDB.","md",null,{},{"icon":279},{"title":276,"description":958},"U815YksGjVHT8sNGqfu7Y6-2CApO-VVOhGvP58j2_Js",[966,968],{"title":272,"path":273,"stem":274,"description":967,"icon":196,"children":-1},"How customers save and manage Maya payment methods in booki-api, including payment preferences and organization-level payment method validation.",{"title":281,"path":282,"stem":283,"description":969,"icon":284,"children":-1},"Standard HTTP error codes, error response formats, and how to handle them.",1777787844708]