[{"data":1,"prerenderedAt":4043},["ShallowReactive",2],{"doc:\u002Fv\u002F2026.3\u002Fscheduling\u002Fset-up-a-booking-embed-with-an-ai-assistant":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"section":10,"version":11,"lastUpdated":12,"body":13,"_type":4037,"_id":4038,"_source":4039,"_file":4040,"_stem":4041,"_extension":4042},"\u002Fv\u002F2026.3\u002Fscheduling\u002Fset-up-a-booking-embed-with-an-ai-assistant","scheduling",false,"","Set up a booking embed with an AI assistant","Hand this page to ChatGPT, Claude, or Copilot. It carries the whole booking embed contract, eight copy-paste recipes, the limits, and the exact errors.","Scheduling","2026.3","2026-09-08",{"type":14,"children":15,"toc":4012},"root",[16,24,54,61,85,261,266,287,297,308,389,407,413,420,431,505,1079,1116,1157,1413,1459,1465,1476,1510,1534,1543,1595,1600,1638,1644,1656,1746,1759,1770,1776,1789,2125,2131,2136,2234,2240,2275,2358,2370,2376,2381,2449,2473,2479,2484,2493,2505,2514,2520,2525,2534,2547,2555,2561,2566,2575,2602,2610,2616,2621,2630,2664,2672,2678,2683,2692,2725,2733,2739,2744,2755,2801,2809,2815,2820,2958,2970,2978,2984,2989,3028,3037,3050,3058,3064,3069,3182,3187,3193,3207,3490,3533,3539,3551,3983,4004],{"type":17,"tag":18,"props":19,"children":20},"element","p",{},[21],{"type":22,"value":23},"text","You do not have to write the embed code yourself. This page is written to be pasted into an AI assistant such as ChatGPT, Claude, or Copilot, together with a sentence about your own site. Everything the assistant needs is here: every attribute, the JavaScript API, the limits, the phone rules, and the exact messages you will see when something is wrong.",{"type":17,"tag":18,"props":25,"children":26},{},[27,29,35,37,44,46,52],{"type":22,"value":28},"Use ",{"type":17,"tag":30,"props":31,"children":32},"strong",{},[33],{"type":22,"value":34},"Copy to LLM",{"type":22,"value":36}," at the top of this article to copy the whole page as Markdown, paste it into your assistant, then ask for the recipe you want. Every recipe below is complete: replace ",{"type":17,"tag":38,"props":39,"children":41},"code",{"className":40},[],[42],{"type":22,"value":43},"WS_ID",{"type":22,"value":45}," and ",{"type":17,"tag":38,"props":47,"children":49},{"className":48},[],[50],{"type":22,"value":51},"SLUG",{"type":22,"value":53}," and it works.",{"type":17,"tag":55,"props":56,"children":58},"h2",{"id":57},"what-you-need-first",[59],{"type":22,"value":60},"What you need first",{"type":17,"tag":18,"props":62,"children":63},{},[64,69,71,76,78,83],{"type":17,"tag":30,"props":65,"children":66},{},[67],{"type":22,"value":68},"Every ID, in one place.",{"type":22,"value":70}," Open the booking page's ",{"type":17,"tag":30,"props":72,"children":73},{},[74],{"type":22,"value":75},"Share & embed",{"type":22,"value":77}," action and expand ",{"type":17,"tag":30,"props":79,"children":80},{},[81],{"type":22,"value":82},"IDs for developers",{"type":22,"value":84},", the collapsed section under the snippet. It lists each value with a copy button:",{"type":17,"tag":86,"props":87,"children":88},"table",{},[89,108],{"type":17,"tag":90,"props":91,"children":92},"thead",{},[93],{"type":17,"tag":94,"props":95,"children":96},"tr",{},[97,103],{"type":17,"tag":98,"props":99,"children":100},"th",{},[101],{"type":22,"value":102},"Row",{"type":17,"tag":98,"props":104,"children":105},{},[106],{"type":22,"value":107},"Use it for",{"type":17,"tag":109,"props":110,"children":111},"tbody",{},[112,143,172,201,230],{"type":17,"tag":94,"props":113,"children":114},{},[115,124],{"type":17,"tag":116,"props":117,"children":118},"td",{},[119],{"type":17,"tag":30,"props":120,"children":121},{},[122],{"type":22,"value":123},"Workspace ID",{"type":17,"tag":116,"props":125,"children":126},{},[127,133,135,141],{"type":17,"tag":38,"props":128,"children":130},{"className":129},[],[131],{"type":22,"value":132},"data-workspace",{"type":22,"value":134},", and ",{"type":17,"tag":38,"props":136,"children":138},{"className":137},[],[139],{"type":22,"value":140},"workspace",{"type":22,"value":142}," in the JavaScript API",{"type":17,"tag":94,"props":144,"children":145},{},[146,154],{"type":17,"tag":116,"props":147,"children":148},{},[149],{"type":17,"tag":30,"props":150,"children":151},{},[152],{"type":22,"value":153},"Page slug",{"type":17,"tag":116,"props":155,"children":156},{},[157,163,164,170],{"type":17,"tag":38,"props":158,"children":160},{"className":159},[],[161],{"type":22,"value":162},"data-page",{"type":22,"value":134},{"type":17,"tag":38,"props":165,"children":167},{"className":166},[],[168],{"type":22,"value":169},"page",{"type":22,"value":171}," in the JavaScript API. Leave it out entirely on the default page",{"type":17,"tag":94,"props":173,"children":174},{},[175,183],{"type":17,"tag":116,"props":176,"children":177},{},[178],{"type":17,"tag":30,"props":179,"children":180},{},[181],{"type":22,"value":182},"Services",{"type":17,"tag":116,"props":184,"children":185},{},[186,192,193,199],{"type":17,"tag":38,"props":187,"children":189},{"className":188},[],[190],{"type":22,"value":191},"data-service",{"type":22,"value":45},{"type":17,"tag":38,"props":194,"children":196},{"className":195},[],[197],{"type":22,"value":198},"service",{"type":22,"value":200},"; each service the page offers, name then ID",{"type":17,"tag":94,"props":202,"children":203},{},[204,212],{"type":17,"tag":116,"props":205,"children":206},{},[207],{"type":17,"tag":30,"props":208,"children":209},{},[210],{"type":22,"value":211},"Hosts",{"type":17,"tag":116,"props":213,"children":214},{},[215,221,222,228],{"type":17,"tag":38,"props":216,"children":218},{"className":217},[],[219],{"type":22,"value":220},"data-member",{"type":22,"value":45},{"type":17,"tag":38,"props":223,"children":225},{"className":224},[],[226],{"type":22,"value":227},"member",{"type":22,"value":229},"; each team member those services allow, display name then ID",{"type":17,"tag":94,"props":231,"children":232},{},[233,241],{"type":17,"tag":116,"props":234,"children":235},{},[236],{"type":17,"tag":30,"props":237,"children":238},{},[239],{"type":22,"value":240},"Intake questions",{"type":17,"tag":116,"props":242,"children":243},{},[244,246,252,253,259],{"type":22,"value":245},"The keys of ",{"type":17,"tag":38,"props":247,"children":249},{"className":248},[],[250],{"type":22,"value":251},"data-intake",{"type":22,"value":45},{"type":17,"tag":38,"props":254,"children":256},{"className":255},[],[257],{"type":22,"value":258},"prefill.intake",{"type":22,"value":260},"; each question, label then ID",{"type":17,"tag":18,"props":262,"children":263},{},[264],{"type":22,"value":265},"Most sites never need the service, host, and question IDs: leave them out and the visitor chooses on the page.",{"type":17,"tag":18,"props":267,"children":268},{},[269,271,277,279,285],{"type":22,"value":270},"The workspace ID and page slug are also in the public link, ",{"type":17,"tag":38,"props":272,"children":274},{"className":273},[],[275],{"type":22,"value":276},"https:\u002F\u002F369.dev\u002Fws\u002FWS_ID\u002Fbook\u002FSLUG",{"type":22,"value":278},"; the default page drops the slug and answers ",{"type":17,"tag":38,"props":280,"children":282},{"className":281},[],[283],{"type":22,"value":284},"https:\u002F\u002F369.dev\u002Fws\u002FWS_ID\u002Fbook",{"type":22,"value":286},".",{"type":17,"tag":18,"props":288,"children":289},{},[290,295],{"type":17,"tag":30,"props":291,"children":292},{},[293],{"type":22,"value":294},"Fallback, if you cannot reach the app.",{"type":22,"value":296}," This read-only address returns the same public data the booking page itself uses, for your own workspace and slug:",{"type":17,"tag":298,"props":299,"children":303},"pre",{"className":300,"code":302,"language":22,"meta":7},[301],"language-text","https:\u002F\u002F369.dev\u002Fapi\u002Fbooking\u002Fpage?workspaceId=WS_ID&pageSlug=SLUG\n",[304],{"type":17,"tag":38,"props":305,"children":306},{"__ignoreMap":7},[307],{"type":22,"value":302},{"type":17,"tag":18,"props":309,"children":310},{},[311,317,318,324,326,331,333,339,340,345,346,352,354,360,361,367,368,374,376,381,383,387],{"type":17,"tag":38,"props":312,"children":314},{"className":313},[],[315],{"type":22,"value":316},"page.service_ids",{"type":22,"value":45},{"type":17,"tag":38,"props":319,"children":321},{"className":320},[],[322],{"type":22,"value":323},"services[].id",{"type":22,"value":325}," are the values for ",{"type":17,"tag":38,"props":327,"children":329},{"className":328},[],[330],{"type":22,"value":191},{"type":22,"value":332},", ",{"type":17,"tag":38,"props":334,"children":336},{"className":335},[],[337],{"type":22,"value":338},"services[].team_members[].id",{"type":22,"value":325},{"type":17,"tag":38,"props":341,"children":343},{"className":342},[],[344],{"type":22,"value":220},{"type":22,"value":134},{"type":17,"tag":38,"props":347,"children":349},{"className":348},[],[350],{"type":22,"value":351},"page.intake_questions[]",{"type":22,"value":353}," lists each question's ",{"type":17,"tag":38,"props":355,"children":357},{"className":356},[],[358],{"type":22,"value":359},"id",{"type":22,"value":332},{"type":17,"tag":38,"props":362,"children":364},{"className":363},[],[365],{"type":22,"value":366},"type",{"type":22,"value":134},{"type":17,"tag":38,"props":369,"children":371},{"className":370},[],[372],{"type":22,"value":373},"options",{"type":22,"value":375}," for ",{"type":17,"tag":38,"props":377,"children":379},{"className":378},[],[380],{"type":22,"value":251},{"type":22,"value":382},". The shape of that response is not a public contract and can change without notice; ",{"type":17,"tag":30,"props":384,"children":385},{},[386],{"type":22,"value":82},{"type":22,"value":388}," is the supported way to read these IDs.",{"type":17,"tag":18,"props":390,"children":391},{},[392,397,399,406],{"type":17,"tag":30,"props":393,"children":394},{},[395],{"type":22,"value":396},"An active booking page.",{"type":22,"value":398}," A paused page, or a workspace whose last active page was paused or deleted, answers \"Booking is not available\". See ",{"type":17,"tag":400,"props":401,"children":403},"a",{"href":402},"\u002Fv\u002F2026.3\u002Fscheduling\u002Fcreate-and-share-a-booking-page\u002F",[404],{"type":22,"value":405},"Create and share a booking page",{"type":22,"value":286},{"type":17,"tag":55,"props":408,"children":410},{"id":409},"the-complete-contract",[411],{"type":22,"value":412},"The complete contract",{"type":17,"tag":414,"props":415,"children":417},"h3",{"id":416},"the-script-tag",[418],{"type":22,"value":419},"The script tag",{"type":17,"tag":298,"props":421,"children":426},{"className":422,"code":424,"language":425,"meta":7},[423],"language-html","\u003Cscript src=\"https:\u002F\u002F369.dev\u002Fbooking.js\" data-booking data-workspace=\"WS_ID\" async>\u003C\u002Fscript>\n","html",[427],{"type":17,"tag":38,"props":428,"children":429},{"__ignoreMap":7},[430],{"type":22,"value":424},{"type":17,"tag":18,"props":432,"children":433},{},[434,440,442,448,450,456,458,464,466,472,474,480,482,488,490,496,497,503],{"type":17,"tag":38,"props":435,"children":437},{"className":436},[],[438],{"type":22,"value":439},"data-mode",{"type":22,"value":441}," decides what one script tag renders of its own: an inline frame where the tag sits (",{"type":17,"tag":38,"props":443,"children":445},{"className":444},[],[446],{"type":22,"value":447},"inline",{"type":22,"value":449},", the default), a floating button (",{"type":17,"tag":38,"props":451,"children":453},{"className":452},[],[454],{"type":22,"value":455},"popup",{"type":22,"value":457},"), or nothing at all (",{"type":17,"tag":38,"props":459,"children":461},{"className":460},[],[462],{"type":22,"value":463},"api",{"type":22,"value":465},"). Whichever you pick, the tag installs ",{"type":17,"tag":38,"props":467,"children":469},{"className":468},[],[470],{"type":22,"value":471},"window.W369Booking",{"type":22,"value":473},", the delegated ",{"type":17,"tag":38,"props":475,"children":477},{"className":476},[],[478],{"type":22,"value":479},"data-w369-booking",{"type":22,"value":481}," click listener, and the ",{"type":17,"tag":38,"props":483,"children":485},{"className":484},[],[486],{"type":22,"value":487},"w369:ready",{"type":22,"value":489}," event, so ",{"type":17,"tag":38,"props":491,"children":493},{"className":492},[],[494],{"type":22,"value":495},"W369Booking.open()",{"type":22,"value":45},{"type":17,"tag":38,"props":498,"children":500},{"className":499},[],[501],{"type":22,"value":502},"W369Booking.mount()",{"type":22,"value":504}," add overlays and frames on top of that, wherever you want them. A second script tag on the same page mounts its own frame or button and reuses the first tag's API.",{"type":17,"tag":86,"props":506,"children":507},{},[508,529],{"type":17,"tag":90,"props":509,"children":510},{},[511],{"type":17,"tag":94,"props":512,"children":513},{},[514,519,524],{"type":17,"tag":98,"props":515,"children":516},{},[517],{"type":22,"value":518},"Attribute",{"type":17,"tag":98,"props":520,"children":521},{},[522],{"type":22,"value":523},"Required",{"type":17,"tag":98,"props":525,"children":526},{},[527],{"type":22,"value":528},"Purpose",{"type":17,"tag":109,"props":530,"children":531},{},[532,554,574,595,616,637,679,700,727,747,767,788,815,843,886,907,928,949,970,990,1011,1038,1059],{"type":17,"tag":94,"props":533,"children":534},{},[535,544,549],{"type":17,"tag":116,"props":536,"children":537},{},[538],{"type":17,"tag":38,"props":539,"children":541},{"className":540},[],[542],{"type":22,"value":543},"data-booking",{"type":17,"tag":116,"props":545,"children":546},{},[547],{"type":22,"value":548},"Yes",{"type":17,"tag":116,"props":550,"children":551},{},[552],{"type":22,"value":553},"Marks the script tag as a booking embed",{"type":17,"tag":94,"props":555,"children":556},{},[557,565,569],{"type":17,"tag":116,"props":558,"children":559},{},[560],{"type":17,"tag":38,"props":561,"children":563},{"className":562},[],[564],{"type":22,"value":132},{"type":17,"tag":116,"props":566,"children":567},{},[568],{"type":22,"value":548},{"type":17,"tag":116,"props":570,"children":571},{},[572],{"type":22,"value":573},"Your workspace ID",{"type":17,"tag":94,"props":575,"children":576},{},[577,585,590],{"type":17,"tag":116,"props":578,"children":579},{},[580],{"type":17,"tag":38,"props":581,"children":583},{"className":582},[],[584],{"type":22,"value":162},{"type":17,"tag":116,"props":586,"children":587},{},[588],{"type":22,"value":589},"No",{"type":17,"tag":116,"props":591,"children":592},{},[593],{"type":22,"value":594},"The booking page slug; omit it for the default page",{"type":17,"tag":94,"props":596,"children":597},{},[598,607,611],{"type":17,"tag":116,"props":599,"children":600},{},[601],{"type":17,"tag":38,"props":602,"children":604},{"className":603},[],[605],{"type":22,"value":606},"data-mode=\"inline\"",{"type":17,"tag":116,"props":608,"children":609},{},[610],{"type":22,"value":589},{"type":17,"tag":116,"props":612,"children":613},{},[614],{"type":22,"value":615},"The default, and the fallback for any unrecognised value: the booking flow renders where the script tag sits and sizes itself",{"type":17,"tag":94,"props":617,"children":618},{},[619,628,632],{"type":17,"tag":116,"props":620,"children":621},{},[622],{"type":17,"tag":38,"props":623,"children":625},{"className":624},[],[626],{"type":22,"value":627},"data-mode=\"popup\"",{"type":17,"tag":116,"props":629,"children":630},{},[631],{"type":22,"value":589},{"type":17,"tag":116,"props":633,"children":634},{},[635],{"type":22,"value":636},"A floating button opens the booking flow in an overlay",{"type":17,"tag":94,"props":638,"children":639},{},[640,649,653],{"type":17,"tag":116,"props":641,"children":642},{},[643],{"type":17,"tag":38,"props":644,"children":646},{"className":645},[],[647],{"type":22,"value":648},"data-mode=\"api\"",{"type":17,"tag":116,"props":650,"children":651},{},[652],{"type":22,"value":589},{"type":17,"tag":116,"props":654,"children":655},{},[656,658,663,665,670,672,677],{"type":22,"value":657},"No frame and no button: only the overlay, ",{"type":17,"tag":38,"props":659,"children":661},{"className":660},[],[662],{"type":22,"value":471},{"type":22,"value":664},", the ",{"type":17,"tag":38,"props":666,"children":668},{"className":667},[],[669],{"type":22,"value":479},{"type":22,"value":671}," triggers, and ",{"type":17,"tag":38,"props":673,"children":675},{"className":674},[],[676],{"type":22,"value":487},{"type":22,"value":678},". Use it whenever the page brings its own button, link, or form",{"type":17,"tag":94,"props":680,"children":681},{},[682,691,695],{"type":17,"tag":116,"props":683,"children":684},{},[685],{"type":17,"tag":38,"props":686,"children":688},{"className":687},[],[689],{"type":22,"value":690},"data-label",{"type":17,"tag":116,"props":692,"children":693},{},[694],{"type":22,"value":589},{"type":17,"tag":116,"props":696,"children":697},{},[698],{"type":22,"value":699},"The popup button text, up to 40 characters; defaults to \"Book now\"",{"type":17,"tag":94,"props":701,"children":702},{},[703,712,716],{"type":17,"tag":116,"props":704,"children":705},{},[706],{"type":17,"tag":38,"props":707,"children":709},{"className":708},[],[710],{"type":22,"value":711},"data-color",{"type":17,"tag":116,"props":713,"children":714},{},[715],{"type":22,"value":589},{"type":17,"tag":116,"props":717,"children":718},{},[719,721],{"type":22,"value":720},"The popup button color, a six-digit hex value such as ",{"type":17,"tag":38,"props":722,"children":724},{"className":723},[],[725],{"type":22,"value":726},"#111827",{"type":17,"tag":94,"props":728,"children":729},{},[730,738,742],{"type":17,"tag":116,"props":731,"children":732},{},[733],{"type":17,"tag":38,"props":734,"children":736},{"className":735},[],[737],{"type":22,"value":191},{"type":17,"tag":116,"props":739,"children":740},{},[741],{"type":22,"value":589},{"type":17,"tag":116,"props":743,"children":744},{},[745],{"type":22,"value":746},"A service ID; the flow starts with that service selected",{"type":17,"tag":94,"props":748,"children":749},{},[750,758,762],{"type":17,"tag":116,"props":751,"children":752},{},[753],{"type":17,"tag":38,"props":754,"children":756},{"className":755},[],[757],{"type":22,"value":220},{"type":17,"tag":116,"props":759,"children":760},{},[761],{"type":22,"value":589},{"type":17,"tag":116,"props":763,"children":764},{},[765],{"type":22,"value":766},"A team member ID; the flow starts with that host selected",{"type":17,"tag":94,"props":768,"children":769},{},[770,779,783],{"type":17,"tag":116,"props":771,"children":772},{},[773],{"type":17,"tag":38,"props":774,"children":776},{"className":775},[],[777],{"type":22,"value":778},"data-theme",{"type":17,"tag":116,"props":780,"children":781},{},[782],{"type":22,"value":589},{"type":17,"tag":116,"props":784,"children":785},{},[786],{"type":22,"value":787},"A theme name; see the list below",{"type":17,"tag":94,"props":789,"children":790},{},[791,800,804],{"type":17,"tag":116,"props":792,"children":793},{},[794],{"type":17,"tag":38,"props":795,"children":797},{"className":796},[],[798],{"type":22,"value":799},"data-layout",{"type":17,"tag":116,"props":801,"children":802},{},[803],{"type":22,"value":589},{"type":17,"tag":116,"props":805,"children":806},{},[807,813],{"type":17,"tag":38,"props":808,"children":810},{"className":809},[],[811],{"type":22,"value":812},"minimal",{"type":22,"value":814}," shows only the scheduler; any other value keeps the page's own layout. See the minimal layout below",{"type":17,"tag":94,"props":816,"children":817},{},[818,827,831],{"type":17,"tag":116,"props":819,"children":820},{},[821],{"type":17,"tag":38,"props":822,"children":824},{"className":823},[],[825],{"type":22,"value":826},"data-accent",{"type":17,"tag":116,"props":828,"children":829},{},[830],{"type":22,"value":589},{"type":17,"tag":116,"props":832,"children":833},{},[834,836,841],{"type":22,"value":835},"A six-digit hex value such as ",{"type":17,"tag":38,"props":837,"children":839},{"className":838},[],[840],{"type":22,"value":726},{"type":22,"value":842},", used in the minimal layout for the confirm button and the selected day and time. An invalid value is ignored",{"type":17,"tag":94,"props":844,"children":845},{},[846,855,859],{"type":17,"tag":116,"props":847,"children":848},{},[849],{"type":17,"tag":38,"props":850,"children":852},{"className":851},[],[853],{"type":22,"value":854},"data-hide",{"type":17,"tag":116,"props":856,"children":857},{},[858],{"type":22,"value":589},{"type":17,"tag":116,"props":860,"children":861},{},[862,864,870,871,877,878,884],{"type":22,"value":863},"Parts of the minimal layout to drop: any of ",{"type":17,"tag":38,"props":865,"children":867},{"className":866},[],[868],{"type":22,"value":869},"header",{"type":22,"value":332},{"type":17,"tag":38,"props":872,"children":874},{"className":873},[],[875],{"type":22,"value":876},"instructions",{"type":22,"value":332},{"type":17,"tag":38,"props":879,"children":881},{"className":880},[],[882],{"type":22,"value":883},"timezone",{"type":22,"value":885},", comma-separated. Unknown names are ignored",{"type":17,"tag":94,"props":887,"children":888},{},[889,898,902],{"type":17,"tag":116,"props":890,"children":891},{},[892],{"type":17,"tag":38,"props":893,"children":895},{"className":894},[],[896],{"type":22,"value":897},"data-prefill-name",{"type":17,"tag":116,"props":899,"children":900},{},[901],{"type":22,"value":589},{"type":17,"tag":116,"props":903,"children":904},{},[905],{"type":22,"value":906},"The client's name, up to 200 characters",{"type":17,"tag":94,"props":908,"children":909},{},[910,919,923],{"type":17,"tag":116,"props":911,"children":912},{},[913],{"type":17,"tag":38,"props":914,"children":916},{"className":915},[],[917],{"type":22,"value":918},"data-prefill-email",{"type":17,"tag":116,"props":920,"children":921},{},[922],{"type":22,"value":589},{"type":17,"tag":116,"props":924,"children":925},{},[926],{"type":22,"value":927},"The client's email, up to 200 characters",{"type":17,"tag":94,"props":929,"children":930},{},[931,940,944],{"type":17,"tag":116,"props":932,"children":933},{},[934],{"type":17,"tag":38,"props":935,"children":937},{"className":936},[],[938],{"type":22,"value":939},"data-prefill-phone",{"type":17,"tag":116,"props":941,"children":942},{},[943],{"type":22,"value":589},{"type":17,"tag":116,"props":945,"children":946},{},[947],{"type":22,"value":948},"The client's phone in E.164, up to 200 characters",{"type":17,"tag":94,"props":950,"children":951},{},[952,961,965],{"type":17,"tag":116,"props":953,"children":954},{},[955],{"type":17,"tag":38,"props":956,"children":958},{"className":957},[],[959],{"type":22,"value":960},"data-prefill-notes",{"type":17,"tag":116,"props":962,"children":963},{},[964],{"type":22,"value":589},{"type":17,"tag":116,"props":966,"children":967},{},[968],{"type":22,"value":969},"The message the client would otherwise type, up to 2,000 characters",{"type":17,"tag":94,"props":971,"children":972},{},[973,981,985],{"type":17,"tag":116,"props":974,"children":975},{},[976],{"type":17,"tag":38,"props":977,"children":979},{"className":978},[],[980],{"type":22,"value":251},{"type":17,"tag":116,"props":982,"children":983},{},[984],{"type":22,"value":589},{"type":17,"tag":116,"props":986,"children":987},{},[988],{"type":22,"value":989},"Intake answers as JSON, keyed by question ID",{"type":17,"tag":94,"props":991,"children":992},{},[993,1002,1006],{"type":17,"tag":116,"props":994,"children":995},{},[996],{"type":17,"tag":38,"props":997,"children":999},{"className":998},[],[1000],{"type":22,"value":1001},"data-metadata",{"type":17,"tag":116,"props":1003,"children":1004},{},[1005],{"type":22,"value":589},{"type":17,"tag":116,"props":1007,"children":1008},{},[1009],{"type":22,"value":1010},"Your own fields as JSON",{"type":17,"tag":94,"props":1012,"children":1013},{},[1014,1023,1027],{"type":17,"tag":116,"props":1015,"children":1016},{},[1017],{"type":17,"tag":38,"props":1018,"children":1020},{"className":1019},[],[1021],{"type":22,"value":1022},"data-step",{"type":17,"tag":116,"props":1024,"children":1025},{},[1026],{"type":22,"value":589},{"type":17,"tag":116,"props":1028,"children":1029},{},[1030,1036],{"type":17,"tag":38,"props":1031,"children":1033},{"className":1032},[],[1034],{"type":22,"value":1035},"time",{"type":22,"value":1037}," skips the details form when the name, the email, and a valid phone are prefilled",{"type":17,"tag":94,"props":1039,"children":1040},{},[1041,1050,1054],{"type":17,"tag":116,"props":1042,"children":1043},{},[1044],{"type":17,"tag":38,"props":1045,"children":1047},{"className":1046},[],[1048],{"type":22,"value":1049},"data-origin",{"type":17,"tag":116,"props":1051,"children":1052},{},[1053],{"type":22,"value":589},{"type":17,"tag":116,"props":1055,"children":1056},{},[1057],{"type":22,"value":1058},"The origin serving the booking runtime; defaults to the origin the script was loaded from. Only for testing another environment",{"type":17,"tag":94,"props":1060,"children":1061},{},[1062,1070,1074],{"type":17,"tag":116,"props":1063,"children":1064},{},[1065],{"type":17,"tag":38,"props":1066,"children":1068},{"className":1067},[],[1069],{"type":22,"value":479},{"type":17,"tag":116,"props":1071,"children":1072},{},[1073],{"type":22,"value":589},{"type":17,"tag":116,"props":1075,"children":1076},{},[1077],{"type":22,"value":1078},"Goes on any other element, never on the script tag: clicking that element opens the popup",{"type":17,"tag":18,"props":1080,"children":1081},{},[1082,1084,1089,1091,1096,1097,1102,1103,1108,1109,1114],{"type":22,"value":1083},"An element carrying ",{"type":17,"tag":38,"props":1085,"children":1087},{"className":1086},[],[1088],{"type":22,"value":479},{"type":22,"value":1090}," can also carry ",{"type":17,"tag":38,"props":1092,"children":1094},{"className":1093},[],[1095],{"type":22,"value":132},{"type":22,"value":332},{"type":17,"tag":38,"props":1098,"children":1100},{"className":1099},[],[1101],{"type":22,"value":162},{"type":22,"value":332},{"type":17,"tag":38,"props":1104,"children":1106},{"className":1105},[],[1107],{"type":22,"value":191},{"type":22,"value":134},{"type":17,"tag":38,"props":1110,"children":1112},{"className":1111},[],[1113],{"type":22,"value":220},{"type":22,"value":1115}," to open a different page from that one trigger.",{"type":17,"tag":18,"props":1117,"children":1118},{},[1119,1121,1126,1128,1133,1135,1141,1143,1148,1150,1156],{"type":22,"value":1120},"The \"Powered by Workspace369\" credit ships with every mode and cannot be turned off. ",{"type":17,"tag":38,"props":1122,"children":1124},{"className":1123},[],[1125],{"type":22,"value":447},{"type":22,"value":1127}," puts it under the frame, ",{"type":17,"tag":38,"props":1129,"children":1131},{"className":1130},[],[1132],{"type":22,"value":455},{"type":22,"value":1134}," next to the button, ",{"type":17,"tag":38,"props":1136,"children":1138},{"className":1137},[],[1139],{"type":22,"value":1140},"mount()",{"type":22,"value":1142}," right after the frame inside your target, and ",{"type":17,"tag":38,"props":1144,"children":1146},{"className":1145},[],[1147],{"type":22,"value":463},{"type":22,"value":1149},", which renders neither, right after the script tag — or at the end of the body when the script sits in ",{"type":17,"tag":38,"props":1151,"children":1153},{"className":1152},[],[1154],{"type":22,"value":1155},"\u003Chead>",{"type":22,"value":286},{"type":17,"tag":18,"props":1158,"children":1159},{},[1160,1165,1167,1173,1174,1180,1181,1187,1188,1194,1195,1201,1202,1208,1209,1215,1216,1222,1223,1229,1230,1236,1237,1243,1244,1250,1251,1257,1258,1264,1265,1271,1272,1278,1279,1285,1286,1292,1293,1299,1300,1306,1307,1313,1314,1320,1321,1327,1328,1334,1335,1341,1342,1348,1349,1355,1356,1362,1363,1369,1370,1376,1377,1383,1384,1390,1391,1397,1398,1404,1405,1411],{"type":17,"tag":38,"props":1161,"children":1163},{"className":1162},[],[1164],{"type":22,"value":778},{"type":22,"value":1166}," accepts one of: ",{"type":17,"tag":38,"props":1168,"children":1170},{"className":1169},[],[1171],{"type":22,"value":1172},"light",{"type":22,"value":332},{"type":17,"tag":38,"props":1175,"children":1177},{"className":1176},[],[1178],{"type":22,"value":1179},"dark",{"type":22,"value":332},{"type":17,"tag":38,"props":1182,"children":1184},{"className":1183},[],[1185],{"type":22,"value":1186},"cupcake",{"type":22,"value":332},{"type":17,"tag":38,"props":1189,"children":1191},{"className":1190},[],[1192],{"type":22,"value":1193},"bumblebee",{"type":22,"value":332},{"type":17,"tag":38,"props":1196,"children":1198},{"className":1197},[],[1199],{"type":22,"value":1200},"emerald",{"type":22,"value":332},{"type":17,"tag":38,"props":1203,"children":1205},{"className":1204},[],[1206],{"type":22,"value":1207},"corporate",{"type":22,"value":332},{"type":17,"tag":38,"props":1210,"children":1212},{"className":1211},[],[1213],{"type":22,"value":1214},"synthwave",{"type":22,"value":332},{"type":17,"tag":38,"props":1217,"children":1219},{"className":1218},[],[1220],{"type":22,"value":1221},"retro",{"type":22,"value":332},{"type":17,"tag":38,"props":1224,"children":1226},{"className":1225},[],[1227],{"type":22,"value":1228},"cyberpunk",{"type":22,"value":332},{"type":17,"tag":38,"props":1231,"children":1233},{"className":1232},[],[1234],{"type":22,"value":1235},"valentine",{"type":22,"value":332},{"type":17,"tag":38,"props":1238,"children":1240},{"className":1239},[],[1241],{"type":22,"value":1242},"halloween",{"type":22,"value":332},{"type":17,"tag":38,"props":1245,"children":1247},{"className":1246},[],[1248],{"type":22,"value":1249},"garden",{"type":22,"value":332},{"type":17,"tag":38,"props":1252,"children":1254},{"className":1253},[],[1255],{"type":22,"value":1256},"forest",{"type":22,"value":332},{"type":17,"tag":38,"props":1259,"children":1261},{"className":1260},[],[1262],{"type":22,"value":1263},"aqua",{"type":22,"value":332},{"type":17,"tag":38,"props":1266,"children":1268},{"className":1267},[],[1269],{"type":22,"value":1270},"lofi",{"type":22,"value":332},{"type":17,"tag":38,"props":1273,"children":1275},{"className":1274},[],[1276],{"type":22,"value":1277},"pastel",{"type":22,"value":332},{"type":17,"tag":38,"props":1280,"children":1282},{"className":1281},[],[1283],{"type":22,"value":1284},"fantasy",{"type":22,"value":332},{"type":17,"tag":38,"props":1287,"children":1289},{"className":1288},[],[1290],{"type":22,"value":1291},"wireframe",{"type":22,"value":332},{"type":17,"tag":38,"props":1294,"children":1296},{"className":1295},[],[1297],{"type":22,"value":1298},"black",{"type":22,"value":332},{"type":17,"tag":38,"props":1301,"children":1303},{"className":1302},[],[1304],{"type":22,"value":1305},"luxury",{"type":22,"value":332},{"type":17,"tag":38,"props":1308,"children":1310},{"className":1309},[],[1311],{"type":22,"value":1312},"dracula",{"type":22,"value":332},{"type":17,"tag":38,"props":1315,"children":1317},{"className":1316},[],[1318],{"type":22,"value":1319},"cmyk",{"type":22,"value":332},{"type":17,"tag":38,"props":1322,"children":1324},{"className":1323},[],[1325],{"type":22,"value":1326},"autumn",{"type":22,"value":332},{"type":17,"tag":38,"props":1329,"children":1331},{"className":1330},[],[1332],{"type":22,"value":1333},"business",{"type":22,"value":332},{"type":17,"tag":38,"props":1336,"children":1338},{"className":1337},[],[1339],{"type":22,"value":1340},"acid",{"type":22,"value":332},{"type":17,"tag":38,"props":1343,"children":1345},{"className":1344},[],[1346],{"type":22,"value":1347},"lemonade",{"type":22,"value":332},{"type":17,"tag":38,"props":1350,"children":1352},{"className":1351},[],[1353],{"type":22,"value":1354},"night",{"type":22,"value":332},{"type":17,"tag":38,"props":1357,"children":1359},{"className":1358},[],[1360],{"type":22,"value":1361},"coffee",{"type":22,"value":332},{"type":17,"tag":38,"props":1364,"children":1366},{"className":1365},[],[1367],{"type":22,"value":1368},"winter",{"type":22,"value":332},{"type":17,"tag":38,"props":1371,"children":1373},{"className":1372},[],[1374],{"type":22,"value":1375},"dim",{"type":22,"value":332},{"type":17,"tag":38,"props":1378,"children":1380},{"className":1379},[],[1381],{"type":22,"value":1382},"nord",{"type":22,"value":332},{"type":17,"tag":38,"props":1385,"children":1387},{"className":1386},[],[1388],{"type":22,"value":1389},"sunset",{"type":22,"value":332},{"type":17,"tag":38,"props":1392,"children":1394},{"className":1393},[],[1395],{"type":22,"value":1396},"caramellatte",{"type":22,"value":332},{"type":17,"tag":38,"props":1399,"children":1401},{"className":1400},[],[1402],{"type":22,"value":1403},"abyss",{"type":22,"value":332},{"type":17,"tag":38,"props":1406,"children":1408},{"className":1407},[],[1409],{"type":22,"value":1410},"silk",{"type":22,"value":1412},". An unknown name is ignored and the page keeps the theme set in its editor.",{"type":17,"tag":18,"props":1414,"children":1415},{},[1416,1421,1423,1428,1430,1435,1437,1442,1444,1450,1452,1457],{"type":17,"tag":30,"props":1417,"children":1418},{},[1419],{"type":22,"value":1420},"The minimal layout.",{"type":22,"value":1422}," Use it when your own site collected the details and all that is left is picking a time and confirming it. It shows a top bar with the service name, its duration, the location kind when the service has one, and a quiet timezone control; then the calendar and the times available on the chosen day; then a confirm step with the date and time on one line and a ",{"type":17,"tag":30,"props":1424,"children":1425},{},[1426],{"type":22,"value":1427},"Change",{"type":22,"value":1429}," link, the details summary card or the details form, any required questions still unanswered, the payment summary when something is due, the security check, the terms row, and the confirm button. It removes the step indicator, the ",{"type":17,"tag":30,"props":1431,"children":1432},{},[1433],{"type":22,"value":1434},"Book appointment",{"type":22,"value":1436}," heading and its service cards, and the ",{"type":17,"tag":30,"props":1438,"children":1439},{},[1440],{"type":22,"value":1441},"Availability",{"type":22,"value":1443}," heading and instructions band. The \"Powered by Workspace369\" credit stays. ",{"type":17,"tag":38,"props":1445,"children":1447},{"className":1446},[],[1448],{"type":22,"value":1449},"accent",{"type":22,"value":1451}," colors the confirm button and the selected day and time only; the theme still governs everything else. Hiding ",{"type":17,"tag":38,"props":1453,"children":1455},{"className":1454},[],[1456],{"type":22,"value":883},{"type":22,"value":1458}," removes the control, not the timezone, which still applies to the times shown.",{"type":17,"tag":414,"props":1460,"children":1462},{"id":1461},"the-javascript-api",[1463],{"type":22,"value":1464},"The JavaScript API",{"type":17,"tag":298,"props":1466,"children":1471},{"className":1467,"code":1469,"language":1470,"meta":7},[1468],"language-ts","W369Booking.open(options?)            \u002F\u002F opens the popup overlay\nW369Booking.close()                   \u002F\u002F closes the popup\nW369Booking.mount(target, options?)   \u002F\u002F renders the flow inside target\n","ts",[1472],{"type":17,"tag":38,"props":1473,"children":1474},{"__ignoreMap":7},[1475],{"type":22,"value":1469},{"type":17,"tag":18,"props":1477,"children":1478},{},[1479,1485,1487,1492,1494,1500,1502,1508],{"type":17,"tag":38,"props":1480,"children":1482},{"className":1481},[],[1483],{"type":22,"value":1484},"target",{"type":22,"value":1486}," is an element or a CSS selector. ",{"type":17,"tag":38,"props":1488,"children":1490},{"className":1489},[],[1491],{"type":22,"value":1140},{"type":22,"value":1493}," returns a handle, ",{"type":17,"tag":38,"props":1495,"children":1497},{"className":1496},[],[1498],{"type":22,"value":1499},"{ container, destroy() }",{"type":22,"value":1501},", or ",{"type":17,"tag":38,"props":1503,"children":1505},{"className":1504},[],[1506],{"type":22,"value":1507},"null",{"type":22,"value":1509}," when nothing matches the selector.",{"type":17,"tag":18,"props":1511,"children":1512},{},[1513,1518,1520,1526,1527,1532],{"type":17,"tag":38,"props":1514,"children":1516},{"className":1515},[],[1517],{"type":22,"value":373},{"type":22,"value":1519}," is the same for ",{"type":17,"tag":38,"props":1521,"children":1523},{"className":1522},[],[1524],{"type":22,"value":1525},"open()",{"type":22,"value":45},{"type":17,"tag":38,"props":1528,"children":1530},{"className":1529},[],[1531],{"type":22,"value":1140},{"type":22,"value":1533},", and every field is optional:",{"type":17,"tag":298,"props":1535,"children":1538},{"className":1536,"code":1537,"language":1470,"meta":7},[1468],"{\n  workspace?: string, page?: string, service?: string, member?: string, theme?: string,\n  layout?: '' | 'minimal',\n  accent?: string,                      \u002F\u002F '#rrggbb'\n  hide?: string | string[],             \u002F\u002F 'header' | 'instructions' | 'timezone'\n  step?: '' | 'time',\n  prefill?: { name?, email?, phone?, notes?, intake?: object, metadata?: object }\n}\n",[1539],{"type":17,"tag":38,"props":1540,"children":1541},{"__ignoreMap":7},[1542],{"type":22,"value":1537},{"type":17,"tag":18,"props":1544,"children":1545},{},[1546,1548,1554,1556,1562,1563,1568,1569,1574,1576,1581,1582,1587,1588,1593],{"type":22,"value":1547},"Each option overrides the matching attribute on the script tag. ",{"type":17,"tag":38,"props":1549,"children":1551},{"className":1550},[],[1552],{"type":22,"value":1553},"hide",{"type":22,"value":1555}," takes an array or a comma-separated string; ",{"type":17,"tag":38,"props":1557,"children":1559},{"className":1558},[],[1560],{"type":22,"value":1561},"layout",{"type":22,"value":332},{"type":17,"tag":38,"props":1564,"children":1566},{"className":1565},[],[1567],{"type":22,"value":1449},{"type":22,"value":134},{"type":17,"tag":38,"props":1570,"children":1572},{"className":1571},[],[1573],{"type":22,"value":1553},{"type":22,"value":1575}," behave exactly as ",{"type":17,"tag":38,"props":1577,"children":1579},{"className":1578},[],[1580],{"type":22,"value":799},{"type":22,"value":332},{"type":17,"tag":38,"props":1583,"children":1585},{"className":1584},[],[1586],{"type":22,"value":826},{"type":22,"value":134},{"type":17,"tag":38,"props":1589,"children":1591},{"className":1590},[],[1592],{"type":22,"value":854},{"type":22,"value":1594}," do.",{"type":17,"tag":18,"props":1596,"children":1597},{},[1598],{"type":22,"value":1599},"Rules that matter when you mount:",{"type":17,"tag":1601,"props":1602,"children":1603},"ul",{},[1604,1617,1622,1627],{"type":17,"tag":1605,"props":1606,"children":1607},"li",{},[1608,1610,1615],{"type":22,"value":1609},"A mounted frame is always inline, so it sizes itself to the booking flow whatever ",{"type":17,"tag":38,"props":1611,"children":1613},{"className":1612},[],[1614],{"type":22,"value":439},{"type":22,"value":1616}," the script tag uses.",{"type":17,"tag":1605,"props":1618,"children":1619},{},[1620],{"type":22,"value":1621},"The frame is appended into your target, and the \"Powered by Workspace369\" credit goes right after it, inside the same target.",{"type":17,"tag":1605,"props":1623,"children":1624},{},[1625],{"type":22,"value":1626},"Mounting again into the same target destroys the previous mount first, so re-opening a modal never stacks frames.",{"type":17,"tag":1605,"props":1628,"children":1629},{},[1630,1636],{"type":17,"tag":38,"props":1631,"children":1633},{"className":1632},[],[1634],{"type":22,"value":1635},"destroy()",{"type":22,"value":1637}," removes the frame, the credit, and the event listener. Calling it twice does nothing.",{"type":17,"tag":414,"props":1639,"children":1641},{"id":1640},"events",[1642],{"type":22,"value":1643},"Events",{"type":17,"tag":18,"props":1645,"children":1646},{},[1647,1649,1655],{"type":22,"value":1648},"Both fire on ",{"type":17,"tag":38,"props":1650,"children":1652},{"className":1651},[],[1653],{"type":22,"value":1654},"window",{"type":22,"value":286},{"type":17,"tag":86,"props":1657,"children":1658},{},[1659,1675],{"type":17,"tag":90,"props":1660,"children":1661},{},[1662],{"type":17,"tag":94,"props":1663,"children":1664},{},[1665,1670],{"type":17,"tag":98,"props":1666,"children":1667},{},[1668],{"type":22,"value":1669},"Event",{"type":17,"tag":98,"props":1671,"children":1672},{},[1673],{"type":22,"value":1674},"Detail",{"type":17,"tag":109,"props":1676,"children":1677},{},[1678,1707],{"type":17,"tag":94,"props":1679,"children":1680},{},[1681,1689],{"type":17,"tag":116,"props":1682,"children":1683},{},[1684],{"type":17,"tag":38,"props":1685,"children":1687},{"className":1686},[],[1688],{"type":22,"value":487},{"type":17,"tag":116,"props":1690,"children":1691},{},[1692,1698,1700,1705],{"type":17,"tag":38,"props":1693,"children":1695},{"className":1694},[],[1696],{"type":22,"value":1697},"event.detail.api",{"type":22,"value":1699}," is the same object as ",{"type":17,"tag":38,"props":1701,"children":1703},{"className":1702},[],[1704],{"type":22,"value":471},{"type":22,"value":1706},". Fires once, as soon as the API is installed",{"type":17,"tag":94,"props":1708,"children":1709},{},[1710,1719],{"type":17,"tag":116,"props":1711,"children":1712},{},[1713],{"type":17,"tag":38,"props":1714,"children":1716},{"className":1715},[],[1717],{"type":22,"value":1718},"w369:booked",{"type":17,"tag":116,"props":1720,"children":1721},{},[1722,1728,1730,1736,1738,1744],{"type":17,"tag":38,"props":1723,"children":1725},{"className":1724},[],[1726],{"type":22,"value":1727},"event.detail",{"type":22,"value":1729}," is ",{"type":17,"tag":38,"props":1731,"children":1733},{"className":1732},[],[1734],{"type":22,"value":1735},"{ bookingId, status, startMs }",{"type":22,"value":1737},", where ",{"type":17,"tag":38,"props":1739,"children":1741},{"className":1740},[],[1742],{"type":22,"value":1743},"startMs",{"type":22,"value":1745}," is the appointment's start time in milliseconds",{"type":17,"tag":18,"props":1747,"children":1748},{},[1749,1751,1757],{"type":22,"value":1750},"The script is loaded ",{"type":17,"tag":38,"props":1752,"children":1754},{"className":1753},[],[1755],{"type":22,"value":1756},"async",{"type":22,"value":1758},", so it may not be ready when your own code runs. Use this helper before every call:",{"type":17,"tag":298,"props":1760,"children":1765},{"className":1761,"code":1763,"language":1764,"meta":7},[1762],"language-js","function w369Ready(fn) {\n  if (window.W369Booking && typeof window.W369Booking.mount === 'function') fn(window.W369Booking)\n  else window.addEventListener('w369:ready', function (e) { fn(e.detail.api) }, { once: true })\n}\n","js",[1766],{"type":17,"tag":38,"props":1767,"children":1768},{"__ignoreMap":7},[1769],{"type":22,"value":1763},{"type":17,"tag":414,"props":1771,"children":1773},{"id":1772},"the-iframe-url",[1774],{"type":22,"value":1775},"The iframe URL",{"type":17,"tag":18,"props":1777,"children":1778},{},[1779,1781,1787],{"type":22,"value":1780},"The script builds the frame's address from the attributes and options. You only write it yourself for a plain iframe, where ",{"type":17,"tag":38,"props":1782,"children":1784},{"className":1783},[],[1785],{"type":22,"value":1786},"embed=1",{"type":22,"value":1788}," is the one parameter you need.",{"type":17,"tag":86,"props":1790,"children":1791},{},[1792,1808],{"type":17,"tag":90,"props":1793,"children":1794},{},[1795],{"type":17,"tag":94,"props":1796,"children":1797},{},[1798,1803],{"type":17,"tag":98,"props":1799,"children":1800},{},[1801],{"type":22,"value":1802},"Parameter",{"type":17,"tag":98,"props":1804,"children":1805},{},[1806],{"type":22,"value":1807},"Value",{"type":17,"tag":109,"props":1809,"children":1810},{},[1811,1827,1854,1871,1900,1921,1959,1992,2030,2047,2064,2080],{"type":17,"tag":94,"props":1812,"children":1813},{},[1814,1822],{"type":17,"tag":116,"props":1815,"children":1816},{},[1817],{"type":17,"tag":38,"props":1818,"children":1820},{"className":1819},[],[1821],{"type":22,"value":1786},{"type":17,"tag":116,"props":1823,"children":1824},{},[1825],{"type":22,"value":1826},"Required. Renders the page as an embed",{"type":17,"tag":94,"props":1828,"children":1829},{},[1830,1839],{"type":17,"tag":116,"props":1831,"children":1832},{},[1833],{"type":17,"tag":38,"props":1834,"children":1836},{"className":1835},[],[1837],{"type":22,"value":1838},"mode",{"type":17,"tag":116,"props":1840,"children":1841},{},[1842,1847,1849],{"type":17,"tag":38,"props":1843,"children":1845},{"className":1844},[],[1846],{"type":22,"value":447},{"type":22,"value":1848}," or ",{"type":17,"tag":38,"props":1850,"children":1852},{"className":1851},[],[1853],{"type":22,"value":455},{"type":17,"tag":94,"props":1855,"children":1856},{},[1857,1866],{"type":17,"tag":116,"props":1858,"children":1859},{},[1860],{"type":17,"tag":38,"props":1861,"children":1863},{"className":1862},[],[1864],{"type":22,"value":1865},"host",{"type":17,"tag":116,"props":1867,"children":1868},{},[1869],{"type":22,"value":1870},"The origin of the page holding the embed. The script fills it in; without it the frame cannot resize itself or report a booking",{"type":17,"tag":94,"props":1872,"children":1873},{},[1874,1895],{"type":17,"tag":116,"props":1875,"children":1876},{},[1877,1882,1883,1888,1889],{"type":17,"tag":38,"props":1878,"children":1880},{"className":1879},[],[1881],{"type":22,"value":198},{"type":22,"value":332},{"type":17,"tag":38,"props":1884,"children":1886},{"className":1885},[],[1887],{"type":22,"value":227},{"type":22,"value":332},{"type":17,"tag":38,"props":1890,"children":1892},{"className":1891},[],[1893],{"type":22,"value":1894},"theme",{"type":17,"tag":116,"props":1896,"children":1897},{},[1898],{"type":22,"value":1899},"The same IDs and theme name as the attributes",{"type":17,"tag":94,"props":1901,"children":1902},{},[1903,1911],{"type":17,"tag":116,"props":1904,"children":1905},{},[1906],{"type":17,"tag":38,"props":1907,"children":1909},{"className":1908},[],[1910],{"type":22,"value":1561},{"type":17,"tag":116,"props":1912,"children":1913},{},[1914,1919],{"type":17,"tag":38,"props":1915,"children":1917},{"className":1916},[],[1918],{"type":22,"value":812},{"type":22,"value":1920}," for the scheduler-only layout; anything else keeps the page's own layout",{"type":17,"tag":94,"props":1922,"children":1923},{},[1924,1932],{"type":17,"tag":116,"props":1925,"children":1926},{},[1927],{"type":17,"tag":38,"props":1928,"children":1930},{"className":1929},[],[1931],{"type":22,"value":1449},{"type":17,"tag":116,"props":1933,"children":1934},{},[1935,1937,1943,1945,1951,1953],{"type":22,"value":1936},"The six-digit hex accent. Written by hand in an address, the ",{"type":17,"tag":38,"props":1938,"children":1940},{"className":1939},[],[1941],{"type":22,"value":1942},"#",{"type":22,"value":1944}," becomes ",{"type":17,"tag":38,"props":1946,"children":1948},{"className":1947},[],[1949],{"type":22,"value":1950},"%23",{"type":22,"value":1952},", as in ",{"type":17,"tag":38,"props":1954,"children":1956},{"className":1955},[],[1957],{"type":22,"value":1958},"accent=%23111827",{"type":17,"tag":94,"props":1960,"children":1961},{},[1962,1970],{"type":17,"tag":116,"props":1963,"children":1964},{},[1965],{"type":17,"tag":38,"props":1966,"children":1968},{"className":1967},[],[1969],{"type":22,"value":1553},{"type":17,"tag":116,"props":1971,"children":1972},{},[1973,1975,1980,1981,1986,1987],{"type":22,"value":1974},"A comma-separated list of ",{"type":17,"tag":38,"props":1976,"children":1978},{"className":1977},[],[1979],{"type":22,"value":869},{"type":22,"value":332},{"type":17,"tag":38,"props":1982,"children":1984},{"className":1983},[],[1985],{"type":22,"value":876},{"type":22,"value":332},{"type":17,"tag":38,"props":1988,"children":1990},{"className":1989},[],[1991],{"type":22,"value":883},{"type":17,"tag":94,"props":1993,"children":1994},{},[1995,2025],{"type":17,"tag":116,"props":1996,"children":1997},{},[1998,2004,2005,2011,2012,2018,2019],{"type":17,"tag":38,"props":1999,"children":2001},{"className":2000},[],[2002],{"type":22,"value":2003},"name",{"type":22,"value":332},{"type":17,"tag":38,"props":2006,"children":2008},{"className":2007},[],[2009],{"type":22,"value":2010},"email",{"type":22,"value":332},{"type":17,"tag":38,"props":2013,"children":2015},{"className":2014},[],[2016],{"type":22,"value":2017},"phone",{"type":22,"value":332},{"type":17,"tag":38,"props":2020,"children":2022},{"className":2021},[],[2023],{"type":22,"value":2024},"notes",{"type":17,"tag":116,"props":2026,"children":2027},{},[2028],{"type":22,"value":2029},"The prefilled client details",{"type":17,"tag":94,"props":2031,"children":2032},{},[2033,2042],{"type":17,"tag":116,"props":2034,"children":2035},{},[2036],{"type":17,"tag":38,"props":2037,"children":2039},{"className":2038},[],[2040],{"type":22,"value":2041},"step=time",{"type":17,"tag":116,"props":2043,"children":2044},{},[2045],{"type":22,"value":2046},"Skips the details form",{"type":17,"tag":94,"props":2048,"children":2049},{},[2050,2059],{"type":17,"tag":116,"props":2051,"children":2052},{},[2053],{"type":17,"tag":38,"props":2054,"children":2056},{"className":2055},[],[2057],{"type":22,"value":2058},"intake",{"type":17,"tag":116,"props":2060,"children":2061},{},[2062],{"type":22,"value":2063},"The intake answers as JSON",{"type":17,"tag":94,"props":2065,"children":2066},{},[2067,2076],{"type":17,"tag":116,"props":2068,"children":2069},{},[2070],{"type":17,"tag":38,"props":2071,"children":2073},{"className":2072},[],[2074],{"type":22,"value":2075},"meta",{"type":17,"tag":116,"props":2077,"children":2078},{},[2079],{"type":22,"value":1010},{"type":17,"tag":94,"props":2081,"children":2082},{},[2083,2120],{"type":17,"tag":116,"props":2084,"children":2085},{},[2086,2092,2093,2099,2100,2106,2107,2113,2114],{"type":17,"tag":38,"props":2087,"children":2089},{"className":2088},[],[2090],{"type":22,"value":2091},"utm_source",{"type":22,"value":332},{"type":17,"tag":38,"props":2094,"children":2096},{"className":2095},[],[2097],{"type":22,"value":2098},"utm_medium",{"type":22,"value":332},{"type":17,"tag":38,"props":2101,"children":2103},{"className":2102},[],[2104],{"type":22,"value":2105},"utm_campaign",{"type":22,"value":332},{"type":17,"tag":38,"props":2108,"children":2110},{"className":2109},[],[2111],{"type":22,"value":2112},"utm_term",{"type":22,"value":332},{"type":17,"tag":38,"props":2115,"children":2117},{"className":2116},[],[2118],{"type":22,"value":2119},"utm_content",{"type":17,"tag":116,"props":2121,"children":2122},{},[2123],{"type":22,"value":2124},"Forwarded from the address of the page holding the embed",{"type":17,"tag":414,"props":2126,"children":2128},{"id":2127},"limits",[2129],{"type":22,"value":2130},"Limits",{"type":17,"tag":18,"props":2132,"children":2133},{},[2134],{"type":22,"value":2135},"Everything you pass is cleaned before it reaches the booking page.",{"type":17,"tag":1601,"props":2137,"children":2138},{},[2139,2181,2204,2214,2224],{"type":17,"tag":1605,"props":2140,"children":2141},{},[2142,2147,2149,2155,2157,2163,2165,2171,2173,2179],{"type":17,"tag":30,"props":2143,"children":2144},{},[2145],{"type":22,"value":2146},"Metadata",{"type":22,"value":2148},": at most 20 keys; 21 or more drops the whole map. A key is 1 to 40 characters from ",{"type":17,"tag":38,"props":2150,"children":2152},{"className":2151},[],[2153],{"type":22,"value":2154},"A-Z a-z 0-9 _ . -",{"type":22,"value":2156},", and a key wrapped in double underscores such as ",{"type":17,"tag":38,"props":2158,"children":2160},{"className":2159},[],[2161],{"type":22,"value":2162},"__id__",{"type":22,"value":2164}," is never accepted. A value is text of up to 500 characters, where line breaks become single spaces and an empty result is dropped, or a finite number, or ",{"type":17,"tag":38,"props":2166,"children":2168},{"className":2167},[],[2169],{"type":22,"value":2170},"true",{"type":22,"value":2172},"\u002F",{"type":17,"tag":38,"props":2174,"children":2176},{"className":2175},[],[2177],{"type":22,"value":2178},"false",{"type":22,"value":2180},"; anything else is dropped. The whole map, serialised as JSON, must stay under 4,096 bytes, or it is dropped.",{"type":17,"tag":1605,"props":2182,"children":2183},{},[2184,2189,2191,2196,2197,2202],{"type":17,"tag":30,"props":2185,"children":2186},{},[2187],{"type":22,"value":2188},"Intake answers",{"type":22,"value":2190},": keyed by question ID, each answer text, a list of text, or ",{"type":17,"tag":38,"props":2192,"children":2194},{"className":2193},[],[2195],{"type":22,"value":2170},{"type":22,"value":2172},{"type":17,"tag":38,"props":2198,"children":2200},{"className":2199},[],[2201],{"type":22,"value":2178},{"type":22,"value":2203},", up to 2,000 characters per answer and 4,096 bytes for the whole map.",{"type":17,"tag":1605,"props":2205,"children":2206},{},[2207,2212],{"type":17,"tag":30,"props":2208,"children":2209},{},[2210],{"type":22,"value":2211},"Notes",{"type":22,"value":2213},": up to 2,000 characters.",{"type":17,"tag":1605,"props":2215,"children":2216},{},[2217,2222],{"type":17,"tag":30,"props":2218,"children":2219},{},[2220],{"type":22,"value":2221},"Name, email, phone",{"type":22,"value":2223},": up to 200 characters each.",{"type":17,"tag":1605,"props":2225,"children":2226},{},[2227,2232],{"type":17,"tag":30,"props":2228,"children":2229},{},[2230],{"type":22,"value":2231},"The frame address",{"type":22,"value":2233},": at most 8,192 characters. If your data would push it over, the intake answers are dropped first, then the metadata, and last the notes are cut to whatever still fits. Each of those is reported in the browser console.",{"type":17,"tag":414,"props":2235,"children":2237},{"id":2236},"phone-numbers",[2238],{"type":22,"value":2239},"Phone numbers",{"type":17,"tag":18,"props":2241,"children":2242},{},[2243,2245,2251,2253,2259,2260,2266,2267,2273],{"type":22,"value":2244},"Every booking stores the client's phone in E.164: a ",{"type":17,"tag":38,"props":2246,"children":2248},{"className":2247},[],[2249],{"type":22,"value":2250},"+",{"type":22,"value":2252},", the country calling code, then the national number, digits only, 8 to 15 digits in total. ",{"type":17,"tag":38,"props":2254,"children":2256},{"className":2255},[],[2257],{"type":22,"value":2258},"+14155550100",{"type":22,"value":332},{"type":17,"tag":38,"props":2261,"children":2263},{"className":2262},[],[2264],{"type":22,"value":2265},"+442071234567",{"type":22,"value":134},{"type":17,"tag":38,"props":2268,"children":2270},{"className":2269},[],[2271],{"type":22,"value":2272},"+48221234567",{"type":22,"value":2274}," are all valid.",{"type":17,"tag":1601,"props":2276,"children":2277},{},[2278,2325,2330,2335,2346],{"type":17,"tag":1605,"props":2279,"children":2280},{},[2281,2283,2289,2291,2296,2298,2304,2305,2311,2313,2318,2319,2324],{"type":22,"value":2282},"The embed removes spaces, brackets, dots, and hyphens, and turns a leading ",{"type":17,"tag":38,"props":2284,"children":2286},{"className":2285},[],[2287],{"type":22,"value":2288},"00",{"type":22,"value":2290}," into ",{"type":17,"tag":38,"props":2292,"children":2294},{"className":2293},[],[2295],{"type":22,"value":2250},{"type":22,"value":2297},". So ",{"type":17,"tag":38,"props":2299,"children":2301},{"className":2300},[],[2302],{"type":22,"value":2303},"+1 (415) 555-0100",{"type":22,"value":45},{"type":17,"tag":38,"props":2306,"children":2308},{"className":2307},[],[2309],{"type":22,"value":2310},"0044 20 7123 4567",{"type":22,"value":2312}," are handed over as ",{"type":17,"tag":38,"props":2314,"children":2316},{"className":2315},[],[2317],{"type":22,"value":2258},{"type":22,"value":45},{"type":17,"tag":38,"props":2320,"children":2322},{"className":2321},[],[2323],{"type":22,"value":2265},{"type":22,"value":286},{"type":17,"tag":1605,"props":2326,"children":2327},{},[2328],{"type":22,"value":2329},"A number it cannot put into E.164 is passed through unchanged, so the visitor can fix it in the frame, and the console explains why.",{"type":17,"tag":1605,"props":2331,"children":2332},{},[2333],{"type":22,"value":2334},"In the frame, the phone field is checked as the visitor types. While the number cannot be read, the field shows \"Include your country code, for example +1 415 555 0100.\" and the booking cannot be submitted. A number typed without a country code is read with your workspace's own country.",{"type":17,"tag":1605,"props":2336,"children":2337},{},[2338,2344],{"type":17,"tag":38,"props":2339,"children":2341},{"className":2340},[],[2342],{"type":22,"value":2343},"step: 'time'",{"type":22,"value":2345}," only skips the details form when the name, the email, and a valid phone are all prefilled.",{"type":17,"tag":1605,"props":2347,"children":2348},{},[2349,2351,2357],{"type":22,"value":2350},"A booking that still reaches the server with an unreadable number is refused with ",{"type":17,"tag":38,"props":2352,"children":2354},{"className":2353},[],[2355],{"type":22,"value":2356},"INVALID_PHONE",{"type":22,"value":286},{"type":17,"tag":18,"props":2359,"children":2360},{},[2361,2363,2368],{"type":22,"value":2362},"Give your assistant ",{"type":17,"tag":38,"props":2364,"children":2366},{"className":2365},[],[2367],{"type":22,"value":2258},{"type":22,"value":2369}," as the example phone, and ask it to send E.164 from your own form.",{"type":17,"tag":414,"props":2371,"children":2373},{"id":2372},"instant-booking-or-approval",[2374],{"type":22,"value":2375},"Instant booking or approval",{"type":17,"tag":18,"props":2377,"children":2378},{},[2379],{"type":22,"value":2380},"The booking page, not the embed, decides what happens when the visitor finishes.",{"type":17,"tag":86,"props":2382,"children":2383},{},[2384,2400],{"type":17,"tag":90,"props":2385,"children":2386},{},[2387],{"type":17,"tag":94,"props":2388,"children":2389},{},[2390,2395],{"type":17,"tag":98,"props":2391,"children":2392},{},[2393],{"type":22,"value":2394},"Mode",{"type":17,"tag":98,"props":2396,"children":2397},{},[2398],{"type":22,"value":2399},"Result",{"type":17,"tag":109,"props":2401,"children":2402},{},[2403,2419],{"type":17,"tag":94,"props":2404,"children":2405},{},[2406,2414],{"type":17,"tag":116,"props":2407,"children":2408},{},[2409],{"type":17,"tag":30,"props":2410,"children":2411},{},[2412],{"type":22,"value":2413},"Instant booking",{"type":17,"tag":116,"props":2415,"children":2416},{},[2417],{"type":22,"value":2418},"A booking that passes the service's rules, and any payment step, goes straight to the calendar",{"type":17,"tag":94,"props":2420,"children":2421},{},[2422,2430],{"type":17,"tag":116,"props":2423,"children":2424},{},[2425],{"type":17,"tag":30,"props":2426,"children":2427},{},[2428],{"type":22,"value":2429},"Request approval",{"type":17,"tag":116,"props":2431,"children":2432},{},[2433,2435,2440,2442,2447],{"type":22,"value":2434},"The request waits in the ",{"type":17,"tag":30,"props":2436,"children":2437},{},[2438],{"type":22,"value":2439},"Booking Queue",{"type":22,"value":2441}," until a team member accepts or declines it. With ",{"type":17,"tag":30,"props":2443,"children":2444},{},[2445],{"type":22,"value":2446},"Hold pending slots",{"type":22,"value":2448}," on, the time stays unavailable while it waits",{"type":17,"tag":18,"props":2450,"children":2451},{},[2452,2454,2462,2464,2471],{"type":22,"value":2453},"Both are set in the page editor. The ",{"type":17,"tag":400,"props":2455,"children":2459},{"href":2456,"rel":2457},"https:\u002F\u002F369.dev\u002Fws\u002Fdemo_showcase_apex_auto_spa\u002Fbook",[2458],"nofollow",[2460],{"type":22,"value":2461},"default demo page",{"type":22,"value":2463}," books instantly; the ",{"type":17,"tag":400,"props":2465,"children":2468},{"href":2466,"rel":2467},"https:\u002F\u002F369.dev\u002Fws\u002Fdemo_showcase_apex_auto_spa\u002Fbook\u002Fdeposit-review",[2458],[2469],{"type":22,"value":2470},"deposit-review page",{"type":22,"value":2472}," asks for approval and holds the slot.",{"type":17,"tag":55,"props":2474,"children":2476},{"id":2475},"recipe-1-inline-on-a-page",[2477],{"type":22,"value":2478},"Recipe 1: Inline on a page",{"type":17,"tag":18,"props":2480,"children":2481},{},[2482],{"type":22,"value":2483},"Use this for a dedicated booking page or a booking section. The frame renders where the tag sits and grows with the flow.",{"type":17,"tag":298,"props":2485,"children":2488},{"className":2486,"code":2487,"language":425,"meta":7},[423],"\u003Cscript src=\"https:\u002F\u002F369.dev\u002Fbooking.js\" data-booking\n  data-workspace=\"WS_ID\"\n  data-page=\"SLUG\" async>\u003C\u002Fscript>\n",[2489],{"type":17,"tag":38,"props":2490,"children":2491},{"__ignoreMap":7},[2492],{"type":22,"value":2487},{"type":17,"tag":18,"props":2494,"children":2495},{},[2496,2498,2503],{"type":22,"value":2497},"Paste it into the body of the page, at the spot the booking flow belongs. A tag in ",{"type":17,"tag":38,"props":2499,"children":2501},{"className":2500},[],[2502],{"type":22,"value":1155},{"type":22,"value":2504}," has nowhere to render in place; use recipe 5 instead.",{"type":17,"tag":2506,"props":2507,"children":2508},"blockquote",{},[2509],{"type":17,"tag":18,"props":2510,"children":2511},{},[2512],{"type":22,"value":2513},"Ask your assistant: \"Add this inline Workspace369 booking snippet to my booking page, in the body where the scheduler should appear, with WS_ID and SLUG filled in.\"",{"type":17,"tag":55,"props":2515,"children":2517},{"id":2516},"recipe-2-floating-popup-button",[2518],{"type":22,"value":2519},"Recipe 2: Floating popup button",{"type":17,"tag":18,"props":2521,"children":2522},{},[2523],{"type":22,"value":2524},"Use this to offer booking from every page without changing any layout.",{"type":17,"tag":298,"props":2526,"children":2529},{"className":2527,"code":2528,"language":425,"meta":7},[423],"\u003Cscript src=\"https:\u002F\u002F369.dev\u002Fbooking.js\" data-booking\n  data-workspace=\"WS_ID\"\n  data-page=\"SLUG\"\n  data-mode=\"popup\"\n  data-label=\"Book now\"\n  data-color=\"#111827\" async>\u003C\u002Fscript>\n",[2530],{"type":17,"tag":38,"props":2531,"children":2532},{"__ignoreMap":7},[2533],{"type":22,"value":2528},{"type":17,"tag":18,"props":2535,"children":2536},{},[2537,2539,2545],{"type":22,"value":2538},"Paste it just before the closing ",{"type":17,"tag":38,"props":2540,"children":2542},{"className":2541},[],[2543],{"type":22,"value":2544},"\u003C\u002Fbody>",{"type":22,"value":2546}," tag of every page, or into your site's site-wide footer or custom-code area.",{"type":17,"tag":2506,"props":2548,"children":2549},{},[2550],{"type":17,"tag":18,"props":2551,"children":2552},{},[2553],{"type":22,"value":2554},"Ask your assistant: \"Add this Workspace369 popup snippet site-wide before the closing body tag, and set the button label and color to match my brand.\"",{"type":17,"tag":55,"props":2556,"children":2558},{"id":2557},"recipe-3-your-own-button-or-link",[2559],{"type":22,"value":2560},"Recipe 3: Your own button or link",{"type":17,"tag":18,"props":2562,"children":2563},{},[2564],{"type":22,"value":2565},"Use this when you already have a button in your design and only want it to open the scheduler.",{"type":17,"tag":298,"props":2567,"children":2570},{"className":2568,"code":2569,"language":425,"meta":7},[423],"\u003Cscript src=\"https:\u002F\u002F369.dev\u002Fbooking.js\" data-booking\n  data-workspace=\"WS_ID\"\n  data-page=\"SLUG\"\n  data-mode=\"api\" async>\u003C\u002Fscript>\n\n\u003Ca href=\"https:\u002F\u002F369.dev\u002Fws\u002FWS_ID\u002Fbook\u002FSLUG\" data-w369-booking>Book a consultation\u003C\u002Fa>\n",[2571],{"type":17,"tag":38,"props":2572,"children":2573},{"__ignoreMap":7},[2574],{"type":22,"value":2569},{"type":17,"tag":18,"props":2576,"children":2577},{},[2578,2580,2585,2587,2592,2594,2600],{"type":22,"value":2579},"Any element with ",{"type":17,"tag":38,"props":2581,"children":2583},{"className":2582},[],[2584],{"type":22,"value":479},{"type":22,"value":2586}," opens the overlay, anywhere on the page, including elements added later. ",{"type":17,"tag":38,"props":2588,"children":2590},{"className":2589},[],[2591],{"type":22,"value":648},{"type":22,"value":2593}," is what keeps our floating button off the page, so your trigger is the only one. Keep a real ",{"type":17,"tag":38,"props":2595,"children":2597},{"className":2596},[],[2598],{"type":22,"value":2599},"href",{"type":22,"value":2601},": before the script has loaded, and without JavaScript, the link still goes to the booking page.",{"type":17,"tag":2506,"props":2603,"children":2604},{},[2605],{"type":17,"tag":18,"props":2606,"children":2607},{},[2608],{"type":22,"value":2609},"Ask your assistant: \"Add data-w369-booking to my existing Book now button and load the Workspace369 script once on the page with data-mode set to api, with WS_ID and SLUG filled in.\"",{"type":17,"tag":55,"props":2611,"children":2613},{"id":2612},"recipe-4-your-own-form-then-the-scheduler",[2614],{"type":22,"value":2615},"Recipe 4: Your own form, then the scheduler",{"type":17,"tag":18,"props":2617,"children":2618},{},[2619],{"type":22,"value":2620},"Use this when your site already asks for the visitor's details. Pass them over and the visitor only picks a time; everything you pass travels with the booking.",{"type":17,"tag":298,"props":2622,"children":2625},{"className":2623,"code":2624,"language":425,"meta":7},[423],"\u003Cscript src=\"https:\u002F\u002F369.dev\u002Fbooking.js\" data-booking\n  data-workspace=\"WS_ID\"\n  data-page=\"SLUG\"\n  data-mode=\"api\" async>\u003C\u002Fscript>\n\n\u003Cform id=\"book-form\">\n  \u003Cinput name=\"name\" placeholder=\"Full name\" required>\n  \u003Cinput name=\"email\" type=\"email\" placeholder=\"you@example.com\" required>\n  \u003Cinput name=\"phone\" type=\"tel\" placeholder=\"+14155550100\" required>\n  \u003Cinput name=\"company\" placeholder=\"Company\">\n  \u003Cbutton type=\"submit\">Pick a time\u003C\u002Fbutton>\n\u003C\u002Fform>\n\n\u003Cscript>\n  function w369Ready(fn) {\n    if (window.W369Booking && typeof window.W369Booking.mount === 'function') fn(window.W369Booking)\n    else window.addEventListener('w369:ready', function (e) { fn(e.detail.api) }, { once: true })\n  }\n\n  document.querySelector('#book-form').addEventListener('submit', function (event) {\n    event.preventDefault();\n    var form = event.target;\n    w369Ready(function (api) {\n      api.open({\n        layout: 'minimal',\n        step: 'time',\n        prefill: {\n          name: form.name.value,\n          email: form.email.value,\n          phone: form.phone.value,\n          metadata: { company: form.company.value, source: 'website-form' }\n        }\n      });\n    });\n  });\n\u003C\u002Fscript>\n",[2626],{"type":17,"tag":38,"props":2627,"children":2628},{"__ignoreMap":7},[2629],{"type":22,"value":2624},{"type":17,"tag":18,"props":2631,"children":2632},{},[2633,2635,2640,2642,2647,2649,2654,2656,2662],{"type":22,"value":2634},"Send the phone in E.164, as the placeholder shows. Metadata lands on the client record under ",{"type":17,"tag":30,"props":2636,"children":2637},{},[2638],{"type":22,"value":2639},"Other details",{"type":22,"value":2641},". ",{"type":17,"tag":38,"props":2643,"children":2645},{"className":2644},[],[2646],{"type":22,"value":648},{"type":22,"value":2648}," gives you ",{"type":17,"tag":38,"props":2650,"children":2652},{"className":2651},[],[2653],{"type":22,"value":495},{"type":22,"value":2655}," and the overlay with no floating button of ours: your form is the trigger. ",{"type":17,"tag":38,"props":2657,"children":2659},{"className":2658},[],[2660],{"type":22,"value":2661},"layout: 'minimal'",{"type":22,"value":2663}," drops the booking page's own chrome, so the overlay opens on the time picker rather than repeating what your form already asked.",{"type":17,"tag":2506,"props":2665,"children":2666},{},[2667],{"type":17,"tag":18,"props":2668,"children":2669},{},[2670],{"type":22,"value":2671},"Ask your assistant: \"Wire my existing contact form to the Workspace369 overlay with W369Booking.open, loading the script with data-mode set to api, passing name, email, an E.164 phone, and my extra fields as metadata. I want the minimal layout, so pass layout set to minimal — the visitor should only pick a time and confirm.\"",{"type":17,"tag":55,"props":2673,"children":2675},{"id":2674},"recipe-5-your-own-modal",[2676],{"type":22,"value":2677},"Recipe 5: Your own modal",{"type":17,"tag":18,"props":2679,"children":2680},{},[2681],{"type":22,"value":2682},"Use this when the scheduler should live inside your own dialog, drawer, or tab instead of our overlay.",{"type":17,"tag":298,"props":2684,"children":2687},{"className":2685,"code":2686,"language":425,"meta":7},[423],"\u003Cscript src=\"https:\u002F\u002F369.dev\u002Fbooking.js\" data-booking\n  data-workspace=\"WS_ID\"\n  data-page=\"SLUG\"\n  data-mode=\"api\" async>\u003C\u002Fscript>\n\n\u003Cbutton type=\"button\" id=\"open-booking\">Book an appointment\u003C\u002Fbutton>\n\n\u003Cdialog id=\"booking-dialog\" style=\"width:min(920px,92vw);border:0;border-radius:16px;padding:16px\">\n  \u003Cbutton type=\"button\" id=\"close-booking\">Close\u003C\u002Fbutton>\n  \u003Cdiv id=\"booking-slot\">\u003C\u002Fdiv>\n\u003C\u002Fdialog>\n\n\u003Cscript>\n  function w369Ready(fn) {\n    if (window.W369Booking && typeof window.W369Booking.mount === 'function') fn(window.W369Booking)\n    else window.addEventListener('w369:ready', function (e) { fn(e.detail.api) }, { once: true })\n  }\n\n  var dialog = document.querySelector('#booking-dialog');\n  var handle = null;\n\n  document.querySelector('#open-booking').addEventListener('click', function () {\n    dialog.showModal();\n    w369Ready(function (api) {\n      handle = api.mount('#booking-slot', {\n        layout: 'minimal',\n        accent: '#111827',\n        step: 'time',\n        prefill: { name: 'Ada Lovelace', email: 'ada@example.com', phone: '+14155550100' }\n      });\n    });\n  });\n\n  document.querySelector('#close-booking').addEventListener('click', function () {\n    dialog.close();\n    if (handle) { handle.destroy(); handle = null; }\n  });\n\u003C\u002Fscript>\n",[2688],{"type":17,"tag":38,"props":2689,"children":2690},{"__ignoreMap":7},[2691],{"type":22,"value":2686},{"type":17,"tag":18,"props":2693,"children":2694},{},[2695,2697,2702,2704,2709,2711,2716,2718,2723],{"type":22,"value":2696},"Always call ",{"type":17,"tag":38,"props":2698,"children":2700},{"className":2699},[],[2701],{"type":22,"value":1635},{"type":22,"value":2703}," when the modal closes, and mount only after the modal is on the page. ",{"type":17,"tag":38,"props":2705,"children":2707},{"className":2706},[],[2708],{"type":22,"value":648},{"type":22,"value":2710}," keeps our floating button off the page, so your dialog is the only booking surface. ",{"type":17,"tag":38,"props":2712,"children":2714},{"className":2713},[],[2715],{"type":22,"value":2661},{"type":22,"value":2717}," keeps the frame to the scheduler alone, since your dialog already frames it, and ",{"type":17,"tag":38,"props":2719,"children":2721},{"className":2720},[],[2722],{"type":22,"value":1449},{"type":22,"value":2724}," matches the confirm button and the selected day and time to your own brand color.",{"type":17,"tag":2506,"props":2726,"children":2727},{},[2728],{"type":17,"tag":18,"props":2729,"children":2730},{},[2731],{"type":22,"value":2732},"Ask your assistant: \"Open my existing modal and render the Workspace369 scheduler inside it with W369Booking.mount, loading the script with data-mode set to api, then call destroy on close. I want the minimal layout, so pass layout set to minimal and set accent to my brand color.\"",{"type":17,"tag":55,"props":2734,"children":2736},{"id":2735},"recipe-6-react-or-nextjs",[2737],{"type":22,"value":2738},"Recipe 6: React or Next.js",{"type":17,"tag":18,"props":2740,"children":2741},{},[2742],{"type":22,"value":2743},"Use this in a component-driven app. Load the script once, mount into a ref, and destroy on unmount.",{"type":17,"tag":298,"props":2745,"children":2750},{"className":2746,"code":2748,"language":2749,"meta":7},[2747],"language-jsx","import { useEffect, useRef } from 'react';\n\nfunction loadBooking() {\n  return new Promise((resolve) => {\n    if (window.W369Booking && typeof window.W369Booking.mount === 'function') {\n      resolve(window.W369Booking);\n      return;\n    }\n    window.addEventListener('w369:ready', (event) => resolve(event.detail.api), { once: true });\n    if (document.querySelector('script[data-booking]')) return;\n    const script = document.createElement('script');\n    script.src = 'https:\u002F\u002F369.dev\u002Fbooking.js';\n    script.async = true;\n    script.setAttribute('data-booking', '');\n    script.setAttribute('data-workspace', 'WS_ID');\n    script.setAttribute('data-page', 'SLUG');\n    script.setAttribute('data-mode', 'api');\n    document.body.appendChild(script);\n  });\n}\n\nexport default function BookingScheduler() {\n  const slot = useRef(null);\n\n  useEffect(() => {\n    let handle = null;\n    let cancelled = false;\n\n    loadBooking().then((api) => {\n      if (cancelled || !slot.current) return;\n      handle = api.mount(slot.current, {\n        step: 'time',\n        prefill: { name: 'Ada Lovelace', email: 'ada@example.com', phone: '+14155550100' },\n      });\n    });\n\n    return () => {\n      cancelled = true;\n      if (handle) handle.destroy();\n    };\n  }, []);\n\n  return \u003Cdiv ref={slot} \u002F>;\n}\n","jsx",[2751],{"type":17,"tag":38,"props":2752,"children":2753},{"__ignoreMap":7},[2754],{"type":22,"value":2748},{"type":17,"tag":18,"props":2756,"children":2757},{},[2758,2760,2766,2767,2772,2774,2779,2781,2786,2788,2793,2794,2799],{"type":22,"value":2759},"This component runs in the browser only, so in the Next.js app router mark the file ",{"type":17,"tag":38,"props":2761,"children":2763},{"className":2762},[],[2764],{"type":22,"value":2765},"'use client'",{"type":22,"value":2641},{"type":17,"tag":38,"props":2768,"children":2770},{"className":2769},[],[2771],{"type":22,"value":648},{"type":22,"value":2773}," means the injected script tag renders nothing by itself, so the component's mounted frame is the only scheduler on the page; switch it to ",{"type":17,"tag":38,"props":2775,"children":2777},{"className":2776},[],[2778],{"type":22,"value":455},{"type":22,"value":2780}," only if you also want the floating ",{"type":17,"tag":30,"props":2782,"children":2783},{},[2784],{"type":22,"value":2785},"Book now",{"type":22,"value":2787}," button, and then set ",{"type":17,"tag":38,"props":2789,"children":2791},{"className":2790},[],[2792],{"type":22,"value":690},{"type":22,"value":45},{"type":17,"tag":38,"props":2795,"children":2797},{"className":2796},[],[2798],{"type":22,"value":711},{"type":22,"value":2800}," to match your site.",{"type":17,"tag":2506,"props":2802,"children":2803},{},[2804],{"type":17,"tag":18,"props":2805,"children":2806},{},[2807],{"type":22,"value":2808},"Ask your assistant: \"Turn this into a React component in my project, keep the script tag with data-mode set to api and the mount and destroy behavior, and take WS_ID and SLUG from my environment variables.\"",{"type":17,"tag":55,"props":2810,"children":2812},{"id":2811},"recipe-7-site-builders",[2813],{"type":22,"value":2814},"Recipe 7: Site builders",{"type":17,"tag":18,"props":2816,"children":2817},{},[2818],{"type":22,"value":2819},"The snippets are plain HTML, so they work anywhere you can add custom code. Product menus change, so look for the wording rather than the exact path.",{"type":17,"tag":1601,"props":2821,"children":2822},{},[2823,2854,2889,2910,2927],{"type":17,"tag":1605,"props":2824,"children":2825},{},[2826,2831,2833,2838,2840,2845,2847,2852],{"type":17,"tag":30,"props":2827,"children":2828},{},[2829],{"type":22,"value":2830},"Webflow",{"type":22,"value":2832}," — the popup snippet goes in ",{"type":17,"tag":30,"props":2834,"children":2835},{},[2836],{"type":22,"value":2837},"Project settings",{"type":22,"value":2839}," → ",{"type":17,"tag":30,"props":2841,"children":2842},{},[2843],{"type":22,"value":2844},"Custom code",{"type":22,"value":2846}," → the footer code area. The inline snippet goes in an ",{"type":17,"tag":30,"props":2848,"children":2849},{},[2850],{"type":22,"value":2851},"Embed",{"type":22,"value":2853}," element placed on the canvas where the scheduler belongs.",{"type":17,"tag":1605,"props":2855,"children":2856},{},[2857,2862,2863,2868,2869,2874,2875,2880,2882,2887],{"type":17,"tag":30,"props":2858,"children":2859},{},[2860],{"type":22,"value":2861},"Squarespace",{"type":22,"value":2832},{"type":17,"tag":30,"props":2864,"children":2865},{},[2866],{"type":22,"value":2867},"Website",{"type":22,"value":2839},{"type":17,"tag":30,"props":2870,"children":2871},{},[2872],{"type":22,"value":2873},"Website tools",{"type":22,"value":2839},{"type":17,"tag":30,"props":2876,"children":2877},{},[2878],{"type":22,"value":2879},"Code injection",{"type":22,"value":2881}," → footer. The inline snippet goes in a ",{"type":17,"tag":30,"props":2883,"children":2884},{},[2885],{"type":22,"value":2886},"Code",{"type":22,"value":2888}," block on the page itself.",{"type":17,"tag":1605,"props":2890,"children":2891},{},[2892,2897,2898,2903,2904,2908],{"type":17,"tag":30,"props":2893,"children":2894},{},[2895],{"type":22,"value":2896},"Wix",{"type":22,"value":2832},{"type":17,"tag":30,"props":2899,"children":2900},{},[2901],{"type":22,"value":2902},"Settings",{"type":22,"value":2839},{"type":17,"tag":30,"props":2905,"children":2906},{},[2907],{"type":22,"value":2844},{"type":22,"value":2909},", loaded at the end of the body on all pages. For a scheduler in the layout, add an embed element and paste the plain iframe.",{"type":17,"tag":1605,"props":2911,"children":2912},{},[2913,2918,2920,2925],{"type":17,"tag":30,"props":2914,"children":2915},{},[2916],{"type":22,"value":2917},"WordPress",{"type":22,"value":2919}," — the inline snippet goes in a ",{"type":17,"tag":30,"props":2921,"children":2922},{},[2923],{"type":22,"value":2924},"Custom HTML",{"type":22,"value":2926}," block in the editor. The popup snippet goes in the theme's footer, or in a header-and-footer scripts plugin. Do not paste it into a paragraph block; the editor will escape it.",{"type":17,"tag":1605,"props":2928,"children":2929},{},[2930,2935,2936,2942,2944,2949,2951,2956],{"type":17,"tag":30,"props":2931,"children":2932},{},[2933],{"type":22,"value":2934},"Shopify",{"type":22,"value":2832},{"type":17,"tag":38,"props":2937,"children":2939},{"className":2938},[],[2940],{"type":22,"value":2941},"theme.liquid",{"type":22,"value":2943},", just before ",{"type":17,"tag":38,"props":2945,"children":2947},{"className":2946},[],[2948],{"type":22,"value":2544},{"type":22,"value":2950},", in the theme code editor. The inline snippet goes in a ",{"type":17,"tag":30,"props":2952,"children":2953},{},[2954],{"type":22,"value":2955},"Custom Liquid",{"type":22,"value":2957}," section or block on the page.",{"type":17,"tag":18,"props":2959,"children":2960},{},[2961,2963,2968],{"type":22,"value":2962},"Inline snippets have to sit in the body of the page. A builder that only offers a site-wide header slot can still run the popup, or load the script there and use ",{"type":17,"tag":38,"props":2964,"children":2966},{"className":2965},[],[2967],{"type":22,"value":1140},{"type":22,"value":2969}," from recipe 5.",{"type":17,"tag":2506,"props":2971,"children":2972},{},[2973],{"type":17,"tag":18,"props":2974,"children":2975},{},[2976],{"type":22,"value":2977},"Ask your assistant: \"I use Webflow. Tell me exactly where to paste this popup snippet, and what to add to a page so the scheduler renders inline in one section.\"",{"type":17,"tag":55,"props":2979,"children":2981},{"id":2980},"recipe-8-google-tag-manager",[2982],{"type":22,"value":2983},"Recipe 8: Google Tag Manager",{"type":17,"tag":18,"props":2985,"children":2986},{},[2987],{"type":22,"value":2988},"Use this when marketing owns the site's tags. GTM injects code into the page, so it suits the popup, not an inline frame at a fixed spot.",{"type":17,"tag":2990,"props":2991,"children":2992},"ol",{},[2993,3004,3016],{"type":17,"tag":1605,"props":2994,"children":2995},{},[2996,2998,3002],{"type":22,"value":2997},"Create a ",{"type":17,"tag":30,"props":2999,"children":3000},{},[3001],{"type":22,"value":2924},{"type":22,"value":3003}," tag.",{"type":17,"tag":1605,"props":3005,"children":3006},{},[3007,3009,3014],{"type":22,"value":3008},"Paste the code below and turn ",{"type":17,"tag":30,"props":3010,"children":3011},{},[3012],{"type":22,"value":3013},"Support document.write",{"type":22,"value":3015}," off.",{"type":17,"tag":1605,"props":3017,"children":3018},{},[3019,3021,3026],{"type":22,"value":3020},"Trigger it on ",{"type":17,"tag":30,"props":3022,"children":3023},{},[3024],{"type":22,"value":3025},"All Pages",{"type":22,"value":3027},", or only the pages that should offer booking.",{"type":17,"tag":298,"props":3029,"children":3032},{"className":3030,"code":3031,"language":425,"meta":7},[423],"\u003Cscript>\n  (function () {\n    var s = document.createElement('script');\n    s.src = 'https:\u002F\u002F369.dev\u002Fbooking.js';\n    s.async = true;\n    s.setAttribute('data-booking', '');\n    s.setAttribute('data-workspace', 'WS_ID');\n    s.setAttribute('data-page', 'SLUG');\n    s.setAttribute('data-mode', 'popup');\n    s.setAttribute('data-label', 'Book now');\n    document.body.appendChild(s);\n  })();\n\n  window.addEventListener('w369:booked', function (event) {\n    window.dataLayer = window.dataLayer || [];\n    window.dataLayer.push({\n      event: 'w369_booked',\n      bookingId: event.detail.bookingId,\n      status: event.detail.status,\n      startMs: event.detail.startMs\n    });\n  });\n\u003C\u002Fscript>\n",[3033],{"type":17,"tag":38,"props":3034,"children":3035},{"__ignoreMap":7},[3036],{"type":22,"value":3031},{"type":17,"tag":18,"props":3038,"children":3039},{},[3040,3042,3048],{"type":22,"value":3041},"The second block pushes every completed booking into the data layer, so you can build a conversion trigger on the ",{"type":17,"tag":38,"props":3043,"children":3045},{"className":3044},[],[3046],{"type":22,"value":3047},"w369_booked",{"type":22,"value":3049}," event.",{"type":17,"tag":2506,"props":3051,"children":3052},{},[3053],{"type":17,"tag":18,"props":3054,"children":3055},{},[3056],{"type":22,"value":3057},"Ask your assistant: \"Write a Google Tag Manager Custom HTML tag that loads the Workspace369 popup on all pages and pushes a w369_booked conversion event to the data layer.\"",{"type":17,"tag":55,"props":3059,"children":3061},{"id":3060},"verify-it-works",[3062],{"type":22,"value":3063},"Verify it works",{"type":17,"tag":18,"props":3065,"children":3066},{},[3067],{"type":22,"value":3068},"Work through this list once, on the published page, before you call the embed done.",{"type":17,"tag":2990,"props":3070,"children":3071},{},[3072,3084,3096,3108,3143,3148,3153,3170],{"type":17,"tag":1605,"props":3073,"children":3074},{},[3075,3077,3082],{"type":22,"value":3076},"Open the page in a private browser window. The scheduler renders, and the \"Powered by Workspace369\" credit sits with it. With ",{"type":17,"tag":38,"props":3078,"children":3080},{"className":3079},[],[3081],{"type":22,"value":648},{"type":22,"value":3083}," nothing renders until your own button, link, or form opens it, but the credit is on the page from the start.",{"type":17,"tag":1605,"props":3085,"children":3086},{},[3087,3089,3095],{"type":22,"value":3088},"Open the browser console. There should be no message starting with ",{"type":17,"tag":38,"props":3090,"children":3092},{"className":3091},[],[3093],{"type":22,"value":3094},"[w369 booking.js]",{"type":22,"value":286},{"type":17,"tag":1605,"props":3097,"children":3098},{},[3099,3101,3106],{"type":22,"value":3100},"Book a test appointment, using ",{"type":17,"tag":38,"props":3102,"children":3104},{"className":3103},[],[3105],{"type":22,"value":2258},{"type":22,"value":3107}," as the phone if you are only checking the plumbing.",{"type":17,"tag":1605,"props":3109,"children":3110},{},[3111,3113,3117,3118,3123,3124,3129,3130,3135,3137,3141],{"type":22,"value":3112},"In Workspace369, open ",{"type":17,"tag":30,"props":3114,"children":3115},{},[3116],{"type":22,"value":2902},{"type":22,"value":2839},{"type":17,"tag":30,"props":3119,"children":3120},{},[3121],{"type":22,"value":3122},"Scheduling & Tasks",{"type":22,"value":2839},{"type":17,"tag":30,"props":3125,"children":3126},{},[3127],{"type":22,"value":3128},"Calendar Settings",{"type":22,"value":2839},{"type":17,"tag":30,"props":3131,"children":3132},{},[3133],{"type":22,"value":3134},"Booking Pages",{"type":22,"value":3136},". On a Request approval page, the test booking waits in the ",{"type":17,"tag":30,"props":3138,"children":3139},{},[3140],{"type":22,"value":2439},{"type":22,"value":3142},"; on an Instant booking page it is already on the calendar.",{"type":17,"tag":1605,"props":3144,"children":3145},{},[3146],{"type":22,"value":3147},"Open the calendar event and check the client's name, email, phone, notes, and intake answers.",{"type":17,"tag":1605,"props":3149,"children":3150},{},[3151],{"type":22,"value":3152},"Check the host's inbox for the new-booking email.",{"type":17,"tag":1605,"props":3154,"children":3155},{},[3156,3158,3163,3165,3169],{"type":22,"value":3157},"Open ",{"type":17,"tag":30,"props":3159,"children":3160},{},[3161],{"type":22,"value":3162},"Clients",{"type":22,"value":3164},". The test booking created or matched a client record with the lead source Online booking, and your metadata fields are under ",{"type":17,"tag":30,"props":3166,"children":3167},{},[3168],{"type":22,"value":2639},{"type":22,"value":286},{"type":17,"tag":1605,"props":3171,"children":3172},{},[3173,3175,3180],{"type":22,"value":3174},"If you listen for ",{"type":17,"tag":38,"props":3176,"children":3178},{"className":3177},[],[3179],{"type":22,"value":1718},{"type":22,"value":3181},", confirm your own analytics or thank-you step fired.",{"type":17,"tag":18,"props":3183,"children":3184},{},[3185],{"type":22,"value":3186},"Then delete the test booking, or run the whole check on the demo workspace instead.",{"type":17,"tag":55,"props":3188,"children":3190},{"id":3189},"live-examples",[3191],{"type":22,"value":3192},"Live examples",{"type":17,"tag":18,"props":3194,"children":3195},{},[3196,3198,3205],{"type":22,"value":3197},"Every recipe runs on the ",{"type":17,"tag":400,"props":3199,"children":3202},{"href":3200,"rel":3201},"https:\u002F\u002F369.dev\u002Fexamples\u002Fbooking",[2458],[3203],{"type":22,"value":3204},"booking embed examples page",{"type":22,"value":3206},", backed by the Apex Auto Spa demo workspace. Bookings made there are test data in that demo workspace, so you can click all the way through.",{"type":17,"tag":86,"props":3208,"children":3209},{},[3210,3226],{"type":17,"tag":90,"props":3211,"children":3212},{},[3213],{"type":17,"tag":94,"props":3214,"children":3215},{},[3216,3221],{"type":17,"tag":98,"props":3217,"children":3218},{},[3219],{"type":22,"value":3220},"Page",{"type":17,"tag":98,"props":3222,"children":3223},{},[3224],{"type":22,"value":3225},"Shows",{"type":17,"tag":109,"props":3227,"children":3228},{},[3229,3250,3272,3294,3316,3337,3359,3381,3403],{"type":17,"tag":94,"props":3230,"children":3231},{},[3232,3245],{"type":17,"tag":116,"props":3233,"children":3234},{},[3235],{"type":17,"tag":400,"props":3236,"children":3238},{"href":2456,"rel":3237},[2458],[3239],{"type":17,"tag":38,"props":3240,"children":3242},{"className":3241},[],[3243],{"type":22,"value":3244},"book",{"type":17,"tag":116,"props":3246,"children":3247},{},[3248],{"type":22,"value":3249},"Instant booking, three services, services-first layout",{"type":17,"tag":94,"props":3251,"children":3252},{},[3253,3267],{"type":17,"tag":116,"props":3254,"children":3255},{},[3256],{"type":17,"tag":400,"props":3257,"children":3260},{"href":3258,"rel":3259},"https:\u002F\u002F369.dev\u002Fws\u002Fdemo_showcase_apex_auto_spa\u002Fbook\u002Fround-robin-team",[2458],[3261],{"type":17,"tag":38,"props":3262,"children":3264},{"className":3263},[],[3265],{"type":22,"value":3266},"round-robin-team",{"type":17,"tag":116,"props":3268,"children":3269},{},[3270],{"type":22,"value":3271},"Auto-assign the next available specialist",{"type":17,"tag":94,"props":3273,"children":3274},{},[3275,3289],{"type":17,"tag":116,"props":3276,"children":3277},{},[3278],{"type":17,"tag":400,"props":3279,"children":3282},{"href":3280,"rel":3281},"https:\u002F\u002F369.dev\u002Fws\u002Fdemo_showcase_apex_auto_spa\u002Fbook\u002Fchoose-specialist",[2458],[3283],{"type":17,"tag":38,"props":3284,"children":3286},{"className":3285},[],[3287],{"type":22,"value":3288},"choose-specialist",{"type":17,"tag":116,"props":3290,"children":3291},{},[3292],{"type":22,"value":3293},"The visitor picks the host",{"type":17,"tag":94,"props":3295,"children":3296},{},[3297,3311],{"type":17,"tag":116,"props":3298,"children":3299},{},[3300],{"type":17,"tag":400,"props":3301,"children":3304},{"href":3302,"rel":3303},"https:\u002F\u002F369.dev\u002Fws\u002Fdemo_showcase_apex_auto_spa\u002Fbook\u002Fintake-forms",[2458],[3305],{"type":17,"tag":38,"props":3306,"children":3308},{"className":3307},[],[3309],{"type":22,"value":3310},"intake-forms",{"type":17,"tag":116,"props":3312,"children":3313},{},[3314],{"type":22,"value":3315},"Intake questions on the details step",{"type":17,"tag":94,"props":3317,"children":3318},{},[3319,3332],{"type":17,"tag":116,"props":3320,"children":3321},{},[3322],{"type":17,"tag":400,"props":3323,"children":3325},{"href":2466,"rel":3324},[2458],[3326],{"type":17,"tag":38,"props":3327,"children":3329},{"className":3328},[],[3330],{"type":22,"value":3331},"deposit-review",{"type":17,"tag":116,"props":3333,"children":3334},{},[3335],{"type":22,"value":3336},"Request approval with held slots",{"type":17,"tag":94,"props":3338,"children":3339},{},[3340,3354],{"type":17,"tag":116,"props":3341,"children":3342},{},[3343],{"type":17,"tag":400,"props":3344,"children":3347},{"href":3345,"rel":3346},"https:\u002F\u002F369.dev\u002Fws\u002Fdemo_showcase_apex_auto_spa\u002Fbook\u002Fbuffer-limits",[2458],[3348],{"type":17,"tag":38,"props":3349,"children":3351},{"className":3350},[],[3352],{"type":22,"value":3353},"buffer-limits",{"type":17,"tag":116,"props":3355,"children":3356},{},[3357],{"type":22,"value":3358},"Buffers and daily limits, calendar-first layout",{"type":17,"tag":94,"props":3360,"children":3361},{},[3362,3376],{"type":17,"tag":116,"props":3363,"children":3364},{},[3365],{"type":17,"tag":400,"props":3366,"children":3369},{"href":3367,"rel":3368},"https:\u002F\u002F369.dev\u002Fws\u002Fdemo_showcase_apex_auto_spa\u002Fbook\u002Fcalendar-first-no-images",[2458],[3370],{"type":17,"tag":38,"props":3371,"children":3373},{"className":3372},[],[3374],{"type":22,"value":3375},"calendar-first-no-images",{"type":17,"tag":116,"props":3377,"children":3378},{},[3379],{"type":22,"value":3380},"Calendar-first layout with no service images",{"type":17,"tag":94,"props":3382,"children":3383},{},[3384,3398],{"type":17,"tag":116,"props":3385,"children":3386},{},[3387],{"type":17,"tag":400,"props":3388,"children":3391},{"href":3389,"rel":3390},"https:\u002F\u002F369.dev\u002Fws\u002Fdemo_showcase_apex_auto_spa\u002Fbook\u002Flarge-gallery",[2458],[3392],{"type":17,"tag":38,"props":3393,"children":3395},{"className":3394},[],[3396],{"type":22,"value":3397},"large-gallery",{"type":17,"tag":116,"props":3399,"children":3400},{},[3401],{"type":22,"value":3402},"A large service gallery",{"type":17,"tag":94,"props":3404,"children":3405},{},[3406,3480],{"type":17,"tag":116,"props":3407,"children":3408},{},[3409,3420,3421,3432,3433,3444,3445,3456,3457,3468,3469],{"type":17,"tag":400,"props":3410,"children":3413},{"href":3411,"rel":3412},"https:\u002F\u002F369.dev\u002Fws\u002Fdemo_showcase_apex_auto_spa\u002Fbook\u002Ftheme-corporate",[2458],[3414],{"type":17,"tag":38,"props":3415,"children":3417},{"className":3416},[],[3418],{"type":22,"value":3419},"theme-corporate",{"type":22,"value":332},{"type":17,"tag":400,"props":3422,"children":3425},{"href":3423,"rel":3424},"https:\u002F\u002F369.dev\u002Fws\u002Fdemo_showcase_apex_auto_spa\u002Fbook\u002Ftheme-dark",[2458],[3426],{"type":17,"tag":38,"props":3427,"children":3429},{"className":3428},[],[3430],{"type":22,"value":3431},"theme-dark",{"type":22,"value":332},{"type":17,"tag":400,"props":3434,"children":3437},{"href":3435,"rel":3436},"https:\u002F\u002F369.dev\u002Fws\u002Fdemo_showcase_apex_auto_spa\u002Fbook\u002Ftheme-luxury",[2458],[3438],{"type":17,"tag":38,"props":3439,"children":3441},{"className":3440},[],[3442],{"type":22,"value":3443},"theme-luxury",{"type":22,"value":332},{"type":17,"tag":400,"props":3446,"children":3449},{"href":3447,"rel":3448},"https:\u002F\u002F369.dev\u002Fws\u002Fdemo_showcase_apex_auto_spa\u002Fbook\u002Ftheme-nord",[2458],[3450],{"type":17,"tag":38,"props":3451,"children":3453},{"className":3452},[],[3454],{"type":22,"value":3455},"theme-nord",{"type":22,"value":332},{"type":17,"tag":400,"props":3458,"children":3461},{"href":3459,"rel":3460},"https:\u002F\u002F369.dev\u002Fws\u002Fdemo_showcase_apex_auto_spa\u002Fbook\u002Ftheme-emerald",[2458],[3462],{"type":17,"tag":38,"props":3463,"children":3465},{"className":3464},[],[3466],{"type":22,"value":3467},"theme-emerald",{"type":22,"value":332},{"type":17,"tag":400,"props":3470,"children":3473},{"href":3471,"rel":3472},"https:\u002F\u002F369.dev\u002Fws\u002Fdemo_showcase_apex_auto_spa\u002Fbook\u002Ftheme-cupcake",[2458],[3474],{"type":17,"tag":38,"props":3475,"children":3477},{"className":3476},[],[3478],{"type":22,"value":3479},"theme-cupcake",{"type":17,"tag":116,"props":3481,"children":3482},{},[3483,3485],{"type":22,"value":3484},"Six of the themes you can set with ",{"type":17,"tag":38,"props":3486,"children":3488},{"className":3487},[],[3489],{"type":22,"value":778},{"type":17,"tag":18,"props":3491,"children":3492},{},[3493,3495,3500,3502,3507,3509,3515,3517,3523,3525,3531],{"type":22,"value":3494},"The ",{"type":17,"tag":38,"props":3496,"children":3498},{"className":3497},[],[3499],{"type":22,"value":3310},{"type":22,"value":3501}," page is the one to copy when you want to test ",{"type":17,"tag":38,"props":3503,"children":3505},{"className":3504},[],[3506],{"type":22,"value":251},{"type":22,"value":3508},": its questions are ",{"type":17,"tag":38,"props":3510,"children":3512},{"className":3511},[],[3513],{"type":22,"value":3514},"vehicle_year_make_model",{"type":22,"value":3516}," (text), ",{"type":17,"tag":38,"props":3518,"children":3520},{"className":3519},[],[3521],{"type":22,"value":3522},"detail_priorities",{"type":22,"value":3524}," (multiple choice, with the options \"Odor removal\", \"Stain treatment\", \"Leather conditioning\", and \"Child seat cleanup\"), and ",{"type":17,"tag":38,"props":3526,"children":3528},{"className":3527},[],[3529],{"type":22,"value":3530},"access_notes",{"type":22,"value":3532}," (long text).",{"type":17,"tag":55,"props":3534,"children":3536},{"id":3535},"troubleshooting",[3537],{"type":22,"value":3538},"Troubleshooting",{"type":17,"tag":18,"props":3540,"children":3541},{},[3542,3544,3549],{"type":22,"value":3543},"Every message the embed writes starts with ",{"type":17,"tag":38,"props":3545,"children":3547},{"className":3546},[],[3548],{"type":22,"value":3094},{"type":22,"value":3550},", so filter the browser console on that string.",{"type":17,"tag":86,"props":3552,"children":3553},{},[3554,3570],{"type":17,"tag":90,"props":3555,"children":3556},{},[3557],{"type":17,"tag":94,"props":3558,"children":3559},{},[3560,3565],{"type":17,"tag":98,"props":3561,"children":3562},{},[3563],{"type":22,"value":3564},"Message or symptom",{"type":17,"tag":98,"props":3566,"children":3567},{},[3568],{"type":22,"value":3569},"What it means",{"type":17,"tag":109,"props":3571,"children":3572},{},[3573,3597,3621,3638,3662,3705,3722,3739,3756,3788,3813,3840,3880,3916,3957,3970],{"type":17,"tag":94,"props":3574,"children":3575},{},[3576,3585],{"type":17,"tag":116,"props":3577,"children":3578},{},[3579],{"type":17,"tag":38,"props":3580,"children":3582},{"className":3581},[],[3583],{"type":22,"value":3584},"[w369 booking.js] Missing or invalid data-workspace",{"type":17,"tag":116,"props":3586,"children":3587},{},[3588,3590,3595],{"type":22,"value":3589},"The script tag has no ",{"type":17,"tag":38,"props":3591,"children":3593},{"className":3592},[],[3594],{"type":22,"value":132},{"type":22,"value":3596},", or the value is not a workspace ID",{"type":17,"tag":94,"props":3598,"children":3599},{},[3600,3609],{"type":17,"tag":116,"props":3601,"children":3602},{},[3603],{"type":17,"tag":38,"props":3604,"children":3606},{"className":3605},[],[3607],{"type":22,"value":3608},"[w369 booking.js] mount: no element matches \"#booking-slot\"",{"type":17,"tag":116,"props":3610,"children":3611},{},[3612,3614,3619],{"type":22,"value":3613},"The selector you passed to ",{"type":17,"tag":38,"props":3615,"children":3617},{"className":3616},[],[3618],{"type":22,"value":1140},{"type":22,"value":3620}," matched nothing. Mount after your modal is on the page",{"type":17,"tag":94,"props":3622,"children":3623},{},[3624,3633],{"type":17,"tag":116,"props":3625,"children":3626},{},[3627],{"type":17,"tag":38,"props":3628,"children":3630},{"className":3629},[],[3631],{"type":22,"value":3632},"[w369 booking.js] phone \"415-555-0100\" is not in E.164 format (+14155550100); passed through for the visitor to correct",{"type":17,"tag":116,"props":3634,"children":3635},{},[3636],{"type":22,"value":3637},"The phone you prefilled is not E.164. The booking still works; the visitor has to fix the number",{"type":17,"tag":94,"props":3639,"children":3640},{},[3641,3650],{"type":17,"tag":116,"props":3642,"children":3643},{},[3644],{"type":17,"tag":38,"props":3645,"children":3647},{"className":3646},[],[3648],{"type":22,"value":3649},"[w369 booking.js] data-metadata ignored: not valid JSON or outside the contract caps",{"type":17,"tag":116,"props":3651,"children":3652},{},[3653,3655,3660],{"type":22,"value":3654},"The JSON does not parse, is not an object, or breaks the metadata limits. ",{"type":17,"tag":38,"props":3656,"children":3658},{"className":3657},[],[3659],{"type":22,"value":251},{"type":22,"value":3661}," reports itself the same way",{"type":17,"tag":94,"props":3663,"children":3664},{},[3665,3674],{"type":17,"tag":116,"props":3666,"children":3667},{},[3668],{"type":17,"tag":38,"props":3669,"children":3671},{"className":3670},[],[3672],{"type":22,"value":3673},"[w369 booking.js] metadata ignored: not an object or outside the contract caps after merging",{"type":17,"tag":116,"props":3675,"children":3676},{},[3677,3678,3684,3686,3691,3692,3697,3699,3704],{"type":22,"value":3494},{"type":17,"tag":38,"props":3679,"children":3681},{"className":3680},[],[3682],{"type":22,"value":3683},"metadata",{"type":22,"value":3685}," you passed to ",{"type":17,"tag":38,"props":3687,"children":3689},{"className":3688},[],[3690],{"type":22,"value":1525},{"type":22,"value":1848},{"type":17,"tag":38,"props":3693,"children":3695},{"className":3694},[],[3696],{"type":22,"value":1140},{"type":22,"value":3698}," broke the limits once merged with the script tag's own fields. ",{"type":17,"tag":38,"props":3700,"children":3702},{"className":3701},[],[3703],{"type":22,"value":2058},{"type":22,"value":3661},{"type":17,"tag":94,"props":3706,"children":3707},{},[3708,3717],{"type":17,"tag":116,"props":3709,"children":3710},{},[3711],{"type":17,"tag":38,"props":3712,"children":3714},{"className":3713},[],[3715],{"type":22,"value":3716},"[w369 booking.js] intake dropped: the booking URL would exceed 8192 characters",{"type":17,"tag":116,"props":3718,"children":3719},{},[3720],{"type":22,"value":3721},"Too much data. The intake answers went first; ask the questions in the frame instead",{"type":17,"tag":94,"props":3723,"children":3724},{},[3725,3734],{"type":17,"tag":116,"props":3726,"children":3727},{},[3728],{"type":17,"tag":38,"props":3729,"children":3731},{"className":3730},[],[3732],{"type":22,"value":3733},"[w369 booking.js] metadata dropped: the booking URL would exceed 8192 characters",{"type":17,"tag":116,"props":3735,"children":3736},{},[3737],{"type":22,"value":3738},"Still too long after the intake answers were dropped. Send fewer or shorter metadata fields",{"type":17,"tag":94,"props":3740,"children":3741},{},[3742,3751],{"type":17,"tag":116,"props":3743,"children":3744},{},[3745],{"type":17,"tag":38,"props":3746,"children":3748},{"className":3747},[],[3749],{"type":22,"value":3750},"[w369 booking.js] notes truncated to 1200 characters: the booking URL would exceed 8192 characters",{"type":17,"tag":116,"props":3752,"children":3753},{},[3754],{"type":22,"value":3755},"The notes were cut to whatever fit",{"type":17,"tag":94,"props":3757,"children":3758},{},[3759,3768],{"type":17,"tag":116,"props":3760,"children":3761},{},[3762],{"type":17,"tag":38,"props":3763,"children":3765},{"className":3764},[],[3766],{"type":22,"value":3767},"W369Booking is not defined",{"type":17,"tag":116,"props":3769,"children":3770},{},[3771,3773,3778,3780,3786],{"type":22,"value":3772},"The script is ",{"type":17,"tag":38,"props":3774,"children":3776},{"className":3775},[],[3777],{"type":22,"value":1756},{"type":22,"value":3779}," and has not finished loading. Wrap your call in the ",{"type":17,"tag":38,"props":3781,"children":3783},{"className":3782},[],[3784],{"type":22,"value":3785},"w369Ready",{"type":22,"value":3787}," helper",{"type":17,"tag":94,"props":3789,"children":3790},{},[3791,3808],{"type":17,"tag":116,"props":3792,"children":3793},{},[3794,3800,3802],{"type":17,"tag":38,"props":3795,"children":3797},{"className":3796},[],[3798],{"type":22,"value":3799},"\"code\": \"INVALID_PHONE\"",{"type":22,"value":3801}," with ",{"type":17,"tag":38,"props":3803,"children":3805},{"className":3804},[],[3806],{"type":22,"value":3807},"\"error\": \"Enter a valid phone number with its country code, for example +14155550100.\"",{"type":17,"tag":116,"props":3809,"children":3810},{},[3811],{"type":22,"value":3812},"The server refused the booking's phone number. Send E.164",{"type":17,"tag":94,"props":3814,"children":3815},{},[3816,3821],{"type":17,"tag":116,"props":3817,"children":3818},{},[3819],{"type":22,"value":3820},"Nothing renders where you pasted the inline snippet",{"type":17,"tag":116,"props":3822,"children":3823},{},[3824,3826,3831,3833,3838],{"type":22,"value":3825},"The script tag is in ",{"type":17,"tag":38,"props":3827,"children":3829},{"className":3828},[],[3830],{"type":22,"value":1155},{"type":22,"value":3832},", or the builder stripped it. Move it into the body, use ",{"type":17,"tag":38,"props":3834,"children":3836},{"className":3835},[],[3837],{"type":22,"value":1140},{"type":22,"value":3839},", or fall back to the plain iframe",{"type":17,"tag":94,"props":3841,"children":3842},{},[3843,3854],{"type":17,"tag":116,"props":3844,"children":3845},{},[3846,3848,3852],{"type":22,"value":3847},"A floating ",{"type":17,"tag":30,"props":3849,"children":3850},{},[3851],{"type":22,"value":2785},{"type":22,"value":3853}," button you did not ask for",{"type":17,"tag":116,"props":3855,"children":3856},{},[3857,3859,3864,3866,3871,3873,3878],{"type":22,"value":3858},"The script tag uses ",{"type":17,"tag":38,"props":3860,"children":3862},{"className":3861},[],[3863],{"type":22,"value":627},{"type":22,"value":3865},". Switch it to ",{"type":17,"tag":38,"props":3867,"children":3869},{"className":3868},[],[3870],{"type":22,"value":648},{"type":22,"value":3872},": the overlay, the API, and the ",{"type":17,"tag":38,"props":3874,"children":3876},{"className":3875},[],[3877],{"type":22,"value":479},{"type":22,"value":3879}," triggers stay, the button goes",{"type":17,"tag":94,"props":3881,"children":3882},{},[3883,3893],{"type":17,"tag":116,"props":3884,"children":3885},{},[3886,3891],{"type":17,"tag":38,"props":3887,"children":3889},{"className":3888},[],[3890],{"type":22,"value":648},{"type":22,"value":3892}," renders nothing at all",{"type":17,"tag":116,"props":3894,"children":3895},{},[3896,3898,3903,3904,3909,3911],{"type":22,"value":3897},"That is what it does. It only installs the overlay and the API; something on your page has to call ",{"type":17,"tag":38,"props":3899,"children":3901},{"className":3900},[],[3902],{"type":22,"value":495},{"type":22,"value":1848},{"type":17,"tag":38,"props":3905,"children":3907},{"className":3906},[],[3908],{"type":22,"value":1140},{"type":22,"value":3910},", or carry ",{"type":17,"tag":38,"props":3912,"children":3914},{"className":3913},[],[3915],{"type":22,"value":479},{"type":17,"tag":94,"props":3917,"children":3918},{},[3919,3924],{"type":17,"tag":116,"props":3920,"children":3921},{},[3922],{"type":22,"value":3923},"The embed shows the whole booking page with a step indicator",{"type":17,"tag":116,"props":3925,"children":3926},{},[3927,3929,3935,3937,3942,3944,3949,3950,3955],{"type":22,"value":3928},"That is the default layout. Add ",{"type":17,"tag":38,"props":3930,"children":3932},{"className":3931},[],[3933],{"type":22,"value":3934},"data-layout=\"minimal\"",{"type":22,"value":3936}," on the script tag, or ",{"type":17,"tag":38,"props":3938,"children":3940},{"className":3939},[],[3941],{"type":22,"value":2661},{"type":22,"value":3943}," in the ",{"type":17,"tag":38,"props":3945,"children":3947},{"className":3946},[],[3948],{"type":22,"value":1525},{"type":22,"value":1848},{"type":17,"tag":38,"props":3951,"children":3953},{"className":3952},[],[3954],{"type":22,"value":1140},{"type":22,"value":3956}," options",{"type":17,"tag":94,"props":3958,"children":3959},{},[3960,3965],{"type":17,"tag":116,"props":3961,"children":3962},{},[3963],{"type":22,"value":3964},"The frame never grows past its first screen",{"type":17,"tag":116,"props":3966,"children":3967},{},[3968],{"type":22,"value":3969},"The page holding the embed is not served over HTTPS, so the frame cannot report its height. Publish the page over HTTPS",{"type":17,"tag":94,"props":3971,"children":3972},{},[3973,3978],{"type":17,"tag":116,"props":3974,"children":3975},{},[3976],{"type":22,"value":3977},"\"Booking is not available\"",{"type":17,"tag":116,"props":3979,"children":3980},{},[3981],{"type":22,"value":3982},"The page is paused, or the last active page was paused or deleted",{"type":17,"tag":18,"props":3984,"children":3985},{},[3986,3988,3994,3996,4002],{"type":22,"value":3987},"Continue to ",{"type":17,"tag":400,"props":3989,"children":3991},{"href":3990},"\u002Fv\u002F2026.3\u002Fscheduling\u002Fmanage-booking-requests\u002F",[3992],{"type":22,"value":3993},"Manage booking requests",{"type":22,"value":3995},", or go back to ",{"type":17,"tag":400,"props":3997,"children":3999},{"href":3998},"\u002Fv\u002F2026.3\u002Fscheduling\u002Fembed-booking-on-your-website\u002F",[4000],{"type":22,"value":4001},"Embed booking on your website",{"type":22,"value":4003}," for the version written for people rather than assistants.",{"type":17,"tag":2506,"props":4005,"children":4006},{},[4007],{"type":17,"tag":18,"props":4008,"children":4009},{},[4010],{"type":22,"value":4011},"Every embed carries the \"Powered by Workspace369\" credit, which cannot be removed. Deposits and full payments open Stripe Checkout in the top-level window and need a connected Stripe account.",{"title":7,"searchDepth":4013,"depth":4013,"links":4014},2,[4015,4016,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036],{"id":57,"depth":4013,"text":60},{"id":409,"depth":4013,"text":412,"children":4017},[4018,4020,4021,4022,4023,4024,4025],{"id":416,"depth":4019,"text":419},3,{"id":1461,"depth":4019,"text":1464},{"id":1640,"depth":4019,"text":1643},{"id":1772,"depth":4019,"text":1775},{"id":2127,"depth":4019,"text":2130},{"id":2236,"depth":4019,"text":2239},{"id":2372,"depth":4019,"text":2375},{"id":2475,"depth":4013,"text":2478},{"id":2516,"depth":4013,"text":2519},{"id":2557,"depth":4013,"text":2560},{"id":2612,"depth":4013,"text":2615},{"id":2674,"depth":4013,"text":2677},{"id":2735,"depth":4013,"text":2738},{"id":2811,"depth":4013,"text":2814},{"id":2980,"depth":4013,"text":2983},{"id":3060,"depth":4013,"text":3063},{"id":3189,"depth":4013,"text":3192},{"id":3535,"depth":4013,"text":3538},"markdown","content:v:2026.3:scheduling:set-up-a-booking-embed-with-an-ai-assistant.md","content","v\u002F2026.3\u002Fscheduling\u002Fset-up-a-booking-embed-with-an-ai-assistant.md","v\u002F2026.3\u002Fscheduling\u002Fset-up-a-booking-embed-with-an-ai-assistant","md",1788830654696]