1import{r as t,j as e}from"./index-DLaW0kCz.js";import{H as M}from"./helmet-AwaUy7t7.js";import B from"./shared-header-B5Myrkod.js";import{S as F}from"./shared-footer-B2Xa0xHg.js";import{P as y,E as m,O as H,C as $,T as R,a as s,b as a,Y as r,c as l,d as E,e as i,f as W,S as D,N as o,g as I,B as j,h as f}from"./index-BHIqvzvS.js";import{c as v}from"./toolsData-98rtv-Ek.js";import"./home-islands-Cu9UpNyG.js";import"./brand-logo-EGQHv4z7.js";import"./phone-CxSzmUIz.js";import"./createLucideIcon-DGQTtyHg.js";import"./x-BpwemI1R.js";import"./printer-8BtFJ0Kl.js";import"./calculator-CrJ9r0So.js";import"./clock-BwUfeKWY.js";import"./triangle-alert-BT6fg4aP.js";import"./file-text-OaOH9o4p.js";v("schedule_optimization","nav_cta");const z=v("schedule_optimization","primary_cta"),Y={overlap:"Shift overlap is your biggest leak. Start with Chapter 2 (Overlap Audit) and Chapter 4 (Stagger by Demand Curve). Both compress overlap inside one schedule cycle.",forecast:"Forecast mismatch is your biggest leak. Start with Chapter 3 (8-Week Demand Curve) and Chapter 5 (Daypart Schedule Build). Both fix the upstream signal."};function q(){const[n,d]=t.useState(420),[h,w]=t.useState(22),[x,k]=t.useState(18),[u,N]=t.useState(35),[c,T]=t.useState(1),{overlap:S,forecast:C,total:O,biggest:p}=t.useMemo(()=>{const g=x*u/60*h*52*Math.max(1,c),b=n*.08*h*52*Math.max(1,c),P=g+b,A=g>=b?"overlap":"forecast";return{overlap:g,forecast:b,total:P,biggest:A}},[n,h,x,u,c]);return e.jsxs("div",{className:"bg-m-card border border-m-border rounded-lg p-6 md:p-8 space-y-5",children:[e.jsx(o,{id:"scheduledHours",label:"Scheduled hours per week",hint:"across all roles, per location",value:n,onChange:d,testid:"input-scheduled"}),e.jsx(o,{id:"wage",label:"Average wage",hint:"loaded, including burden",value:h,onChange:w,prefix:"$",testid:"input-wage"}),e.jsx(o,{id:"overlapMin",label:"Average overlap per shift transition",hint:"minutes both staff are clocked in",value:x,onChange:k,suffix:"min",testid:"input-overlap-min"}),e.jsx(o,{id:"transitions",label:"Shift transitions per week",hint:"openâmidâclose handoffs",value:u,onChange:N,testid:"input-transitions"}),e.jsx(o,{id:"locations",label:"Number of locations",hint:"",value:c,onChange:T,testid:"input-locations"}),e.jsx(I,{totalLabel:"Your annual schedule waste",total:f(O),routing:Y[p],buckets:e.jsxs(e.Fragment,{children:[e.jsx(j,{label:"Shift overlap waste",sub:"Both staff clocked in during the handoff window",value:f(S),highlighted:p==="overlap",testid:"text-overlap"}),e.jsx(j,{label:"Forecast mismatch",sub:"8% over-staffing on dayparts that don't need it",value:f(C),highlighted:p==="forecast",testid:"text-forecast"})]})})]})}function oe(){return t.useEffect(()=>{window.scrollTo(0,0)},[]),e.jsxs("div",{className:"public-route min-h-screen bg-m-bg text-m-t1",children:[e.jsxs(M,{children:[e.jsx("title",{children:"The Schedule Optimization Playbook | Marty"}),e.jsx("meta",{name:"description",content:"A 14-minute playbook for restaurant owners. Build labor-efficient schedules in 30 minutes instead of 3 hours. Recover 4 to 9 hours per week per location."}),e.jsx("link",{rel:"canonical",href:"https://usemarty.com/tools/schedule-optimization"}),e.jsx("meta",{property:"og:title",content:"The Schedule Optimization Playbook | Marty"}),e.jsx("meta",{property:"og:description",content:"A 14-minute playbook for restaurant owners. Build labor-efficient schedules in 30 minutes instead of 3 hours."}),e.jsx("meta",{property:"og:type",content:"article"})]}),e.jsx(B,{publicContent:!0}),e.jsxs("section",{className:"max-w-3xl mx-auto px-6 pt-12 sm:pt-16 pb-12",children:[e.jsxs("h1",{className:"text-[36px] sm:text-5xl md:text-6xl font-extrabold leading-[1.1] tracking-[-0.02em] mb-6","data-testid":"text-hero-title",children:["Build the schedule in 30 minutes."," ",e.jsx("span",{children:"Recover 4 to 9 hours a week."})]}),e.jsx("p",{className:"text-lg sm:text-xl text-m-t2 mb-4 leading-relaxed",children:"A 14-minute playbook for independent owners. The overlap audit, the demand curve build, and the daypart schedule structure that takes labor cost down without taking shifts away from anyone who wants them."}),e.jsxs("p",{className:"text-lg sm:text-xl text-m-t2 mb-10 leading-relaxed","data-testid":"text-hero-subline",children:["Owners running this routine recover"," ",e.jsx("strong",{className:"font-bold text-m-t1",children:"4 to 9 hours"})," per week per location."]}),e.jsx("div",{className:"h-px mb-10",style:{background:`linear-gradient(to right, transparent, ${y}, transparent)`}}),e.jsxs("div",{className:"bg-m-card border border-m-border rounded-lg p-6 sm:p-8 mb-12",children:[e.jsx(m,{children:"Read This First"}),e.jsx("p",{className:"text-lg leading-relaxed mb-4 text-m-t2",children:"Most independent owners schedule by memory. Last week's sc
1hedule, copy-paste, adjust for time-off requests, post. The result is a schedule that fits last week's demand curve, not next week's. Off by 4 to 9 hours per week per location, every week, all year."}),e.jsx("p",{className:"text-lg leading-relaxed mb-4 text-m-t2",children:"The fix isn't a fancier scheduling tool. It's a rebuild of the inputs. An 8-week demand curve. A daypart-aware structure. An overlap audit. After that, the schedule writes itself in 30 minutes."}),e.jsx("p",{className:"text-lg leading-relaxed font-medium text-m-t1",children:"One schedule cycle to install. Permanent recovery."}),e.jsx(H,{quote:"Marty saves us hours every week. The platform is intuitive, the team is fast, and whenever something comes up they have it fixed before I can worry about it. Excited to see where it goes next.",name:"Timothy Tow",role:"Owner, Bin 35 Bistro"})]}),e.jsx("h3",{className:"text-2xl font-bold mb-4",children:"What you will have by the end of this page"}),e.jsx("ol",{className:"space-y-3 text-lg text-m-t2 mb-10",children:["An hours-per-week recovery number specific to your operation.","The 8-Week Demand Curve template you can build in 90 minutes.","The Overlap Audit checklist for shift handoffs.","A Daypart Schedule Build worksheet you can use Sunday night.","The post-cycle review that catches the next set of inefficiencies before they harden."].map((n,d)=>e.jsxs("li",{className:"flex gap-3",children:[e.jsxs("span",{className:"font-bold tabular-nums",style:{color:y},children:["0",d+1]}),e.jsx("span",{children:n})]},d))})]}),e.jsx("section",{className:"bg-m-card border-y border-m-border py-16",children:e.jsxs("div",{className:"max-w-3xl mx-auto px-6",children:[e.jsx(m,{children:"Quick Win, 60 Seconds"}),e.jsx("h2",{className:"text-3xl sm:text-4xl md:text-5xl font-extrabold mb-4 leading-[1.1] tracking-[-0.02em]",children:"The Schedule Waste Calculator"}),e.jsx("p",{className:"text-lg text-m-t2 mb-10",children:"Five inputs. Two buckets of recoverable waste."}),e.jsx(q,{}),e.jsx($,{}),e.jsx(R,{})]})}),e.jsxs("section",{className:"max-w-3xl mx-auto px-6 py-20",children:[e.jsx(m,{children:"The Playbook"}),e.jsx("h2",{className:"text-3xl sm:text-4xl md:text-5xl font-extrabold mb-4 leading-[1.1] tracking-[-0.02em]",children:"Six chapters. Fourteen minutes. One system."}),e.jsx("p",{className:"text-lg text-m-t2 mb-16",children:"Each chapter ends with something you've actually done."}),e.jsxs("article",{className:"mb-16","data-testid":"chapter-1",children:[e.jsx(s,{n:"01"}),e.jsx("h3",{className:"text-2xl sm:text-3xl font-bold mb-5",children:"Inventory the schedule you have today"}),e.jsx("p",{className:"text-lg leading-relaxed mb-4 text-m-t2",children:`Pull last week's published schedule and circle every shift that exists for a reason you can't immediately articulate. "Because that's what we always do" doesn't count. Most schedules carry 3 to 6 of those phantom shifts. They were added during a busy season two years ago and never got removed.`}),e.jsx("p",{className:"text-lg leading-relaxed mb-6 text-m-t2",children:"The inventory exercise takes 20 minutes and surfaces the easy wins. Shifts that exist for inertia, not for demand. Cuts to those shifts are the lowest-friction labor recovery in the building."}),e.jsx(a,{tag:"Filled example, phantom shift inventory",children:e.jsxs("ul",{className:"text-base text-m-t2 space-y-1.5 list-disc pl-5",children:[e.jsx("li",{children:"Sunday brunch barback 9am to 12pm. Set up after 2023 brunch surge, brunch covers down 30% since."}),e.jsx("li",{children:"Tuesday opener prep cook 8am to 10am. Covered by Wed deliveries now, 4 hrs/wk wasted."}),e.jsx("li",{children:"Friday host 4pm to 6pm. Overlaps with weekend host who clocks in at 5pm, 1 hr overlap."}),e.jsx("li",{children:"Late-night dishwasher Mon to Wed. Kitchen closes earlier on weeknights, last 90 min often idle."})]})}),e.jsx(r,{children:"Print last week's schedule. For each shift, write the demand reason. Anything you can't articulate is a phantom shift. Most owners find 3 to 6."}),e.jsx(l,{children:"The first hours back are the ones you stopped justifying years ago."})]}),e.jsxs("article",{className:"mb-16","data-testid":"chapter-2",children:[e.jsx(s,{n:"02"}),e.jsx("h3",{className:"text-2xl sm:text-3xl font-bold mb-5",children:"The Overlap Audit"}),e.jsx("p",{className:"text-lg leading-relaxed mb-4 text-m-t2",children:"Shift handoffs are where minutes pile up. The closer clocks out at 11:15. The opener clocks in at 10:45. Thirty overlapping minutes at $22 loaded wage is $11. Multiply by 35 transitions per week and you're at $385 a week, or $20K a year per location."}),e.jsx("p",{className:"text-lg leading-relaxed mb-6 text-m-t2",children:'Audit every transition once. The fix is rarely "cut the overlap to zero," because you need some handoff time. The fix is moving from 18 minutes of overlap to 8 minutes through handoff checklists and scheduled prep.'}),e.jsx(a,{tag:"Overlap audit, before / after",children:e.jsxs("table",{className:"w-full text-sm text-m-t1",children:[e.jsx("thead",{className:"border-b border-m-border text-m-t3",children:e.jsxs("tr",{children:[e.jsx("th",{className:"text-left pb-2 font-medium",children:"Handoff"}),e.jsx("th",{className:"text-right pb-2 font-medium",children:"Before"}),e.jsx("th",{className:"text-right pb-2 font-medium",children:"After"}),e.jsx("th",{className:"text-right pb-2 font-medium",children:"Saved/wk"})]})}),e.jsxs("tbody",{className:"font-mono",children:[e.jsxs("tr",{className:"border-b border-m-border/50",children:[e.jsx("td",{className:"py-2",children:"Open â Mid kitchen"}),e.jsx("td",{className:"text-right",children:"22m à 6"}),e.jsx("td",{className:"text-right",children:"10m à 6"}),e.jsx("td",{className:"text-right",children:"1.2 hr"})]}),e.jsxs("tr",{className:"border-b border-m-border/50",children:[e.jsx("td",{className:"py-2",children:"Mid â Close server"}),e.jsx("td",{className:"text-right",children:"18m à 7"}),e.jsx("td",{className:"text-right",children:"8m à 7"}),e.jsx("td",{className:"text-right",children:"1.2 hr"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2",children:"Day â Night bar"}),e.jsx("td",{className:"text-right",children:"25m à 5"}),e.jsx("td",{className:"text-right",children:"10m à 5"}),e.jsx("td",{className:"text-right",children:"1.3 hr"})]})]})]})}),e.jsx(r,{children:"Time five shift transitions this week. Note the actual overlap. If anything is over 12 minutes, identify the handoff task that's eating the time. Fix the task, the overlap shrinks naturally."}),e.jsx(l,{children:"Eight minutes of structured handoff beats 18 minutes of unstructured overlap."})]}),e.jsxs("article",{className:"mb-16","data-testid":"chapter-3",children:[e.jsx(s,{n:"03"}),e.jsx("h3",{className:"text-2xl sm:text-3xl font-bold mb-5",children:"Build the 8-Week Demand Curve"}),e.jsx("p",{className:"text-lg leading-relaxed mb-4 text-m-t2",children:"Pull POS sales by hour for the last 8 weeks. Not 4 weeks (too noisy), not 13 weeks (too smoothed). Eight weeks gives you the current demand pattern with enough signal to staff to. Everything downstream depends on this curve being right."}),e.jsx("p",{className:"text-lg leading-relaxed mb-6 text-m-t2",children:"Look at the curve b
1y day of week and hour. You'll find dayparts where you're 30% overstaffed and dayparts where you're under. Both are problems. Overstaffing is the obvious leak. Understaffing kills service and capped revenue."}),e.jsx(a,{tag:"Filled example, Tuesday demand curve",children:e.jsxs("table",{className:"w-full text-sm text-m-t1",children:[e.jsx("thead",{className:"border-b border-m-border text-m-t3",children:e.jsxs("tr",{children:[e.jsx("th",{className:"text-left pb-2 font-medium",children:"Hour"}),e.jsx("th",{className:"text-right pb-2 font-medium",children:"Avg sales"}),e.jsx("th",{className:"text-right pb-2 font-medium",children:"Cur staff"}),e.jsx("th",{className:"text-right pb-2 font-medium",children:"$/labor hr"})]})}),e.jsxs("tbody",{className:"font-mono",children:[e.jsxs("tr",{className:"border-b border-m-border/50",children:[e.jsx("td",{className:"py-2",children:"11a-12p"}),e.jsx("td",{className:"text-right",children:"$240"}),e.jsx("td",{className:"text-right",children:"5"}),e.jsx("td",{className:"text-right text-[#F87171]",children:"$48"})]}),e.jsxs("tr",{className:"border-b border-m-border/50",children:[e.jsx("td",{className:"py-2",children:"12p-1p"}),e.jsx("td",{className:"text-right",children:"$910"}),e.jsx("td",{className:"text-right",children:"5"}),e.jsx("td",{className:"text-right",children:"$182"})]}),e.jsxs("tr",{className:"border-b border-m-border/50",children:[e.jsx("td",{className:"py-2",children:"1p-2p"}),e.jsx("td",{className:"text-right",children:"$540"}),e.jsx("td",{className:"text-right",children:"5"}),e.jsx("td",{className:"text-right",children:"$108"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2",children:"2p-3p"}),e.jsx("td",{className:"text-right",children:"$180"}),e.jsx("td",{className:"text-right",children:"5"}),e.jsx("td",{className:"text-right text-[#F87171]",children:"$36"})]})]})]})}),e.jsx(r,{children:"Pull 8 weeks of hourly POS data. Drop into a sheet, average by day-of-week and hour. Calculate sales-per-labor-hour at each cell. Anything under $80/hr in a tipped-FOH role is a staffing question."}),e.jsx(l,{children:"The curve is the schedule. Staff the curve, not the habit."})]}),e.jsxs("article",{className:"mb-16","data-testid":"chapter-4",children:[e.jsx(s,{n:"04"}),e.jsx("h3",{className:"text-2xl sm:text-3xl font-bold mb-5",children:"Stagger to match the curve"}),e.jsx("p",{className:"text-lg leading-relaxed mb-4 text-m-t2",children:"The default schedule has everyone start at 11 and everyone leave at 10. The demand curve almost never looks like that. The fix is staggered shifts: 10:30 / 11:00 / 11:30 for the lunch ramp, with paired late-cuts when the dinner pace softens."}),e.jsx("p",{className:"text-lg leading-relaxed mb-6 text-m-t2",children:"Staggering looks small on paper but compounds. A 30-minute cut-back across four servers four nights a week is 8 hours. Over 52 weeks that's 416 hours, or roughly $9K at a typical loaded wage."}),e.jsx("p",{className:"text-lg leading-relaxed mb-6 text-m-t2",children:"Most owners see 6 to 9 hours back per week per location once the stagger is dialed in."}),e.jsx(a,{tag:"Staggered shift example, Tuesday FOH",children:e.jsxs("table",{className:"w-full text-sm text-m-t1",children:[e.jsx("thead",{className:"border-b border-m-border text-m-t3",children:e.jsxs("tr",{children:[e.jsx("th",{className:"text-left pb-2 font-medium",children:"Role"}),e.jsx("th",{className:"text-left pb-2 font-medium",children:"Default"}),e.jsx("th",{className:"text-left pb-2 font-medium",children:"Staggered"})]})}),e.jsxs("tbody",{className:"font-mono",children:[e.jsxs("tr",{className:"border-b border-m-border/50",children:[e.jsx("td",{className:"py-2",children:"Server 1"}),e.jsx("td",{children:"11:00-9:00"}),e.jsx("td",{children:"10:30-2:30 + 5:00-9:00"})]}),e.jsxs("tr",{className:"border-b border-m-border/50",children:[e.jsx("td",{className:"py-2",children:"Server 2"}),e.jsx("td",{children:"11:00-9:00"}),e.jsx("td",{children:"11:00-3:00 + 5:30-9:30"})]}),e.jsxs("tr",{children:[e.jsx("td",{className:"py-2",children:"Server 3"}),e.jsx("td",{children:"11:00-9:00"}),e.jsx("td",{children:"11:30-3:30 + 6:00-10:00"})]})]})]})}),e.jsx(r,{children:"Take your busiest weekday. Apply the stagger to FOH only. Hold BOH constant. Compare the labor cost vs. the existing schedule. Most owners see meaningful hours back on the very first staggered day."}),e.jsx(l,{children:"The default schedule fights the demand curve. The staggered schedule rides it."})]}),e.jsxs("article",{className:"mb-16","data-testid":"chapter-5",children:[e.jsx(s,{n:"05"}),e.jsx("h3",{className:"text-2xl sm:text-3xl font-bold mb-5",children:"The 30-Minute Build Routine"}),e.jsx("p",{className:"text-lg leading-relaxed mb-4 text-m-t2",children:"With the demand curve and the staggered template in place, the actual schedule build collapses to 30 minutes. You're not making creative decisions every Sunday. You're applying the template to next week's known constraints (time-off, sales forecast, event bookings)."}),e.jsx("p",{className:"text-lg leading-relaxed mb-6 text-m-t2",children:"The order matters. Build by daypart. Build kitchen first (less flexibility), then bar, then floor, then host/support. Each pass is 5 to 8 minutes if you have the inputs ready."}),e.jsx(a,{tag:"30-minute build sequence",children:e.jsxs("ol",{className:"text-base text-m-t2 space-y-1.5 list-decimal pl-5",children:[e.jsx("li",{children:"Min 0-3: pull next week's forecast, time-off requests, event bookings."}),e.jsx("li",{children:"Min 3-10: kitchen build (BOH first, least flexible)."}),e.jsx("li",{children:"Min 10-16: bar build."}),e.jsx("li",{children:"Min 16-23: floor build with stagger applied."}),e.jsx("li",{children:"Min 23-27: host / support / runners."}),e.jsx("li",{children:"Min 27-30: final pass, post."})]})}),e.jsx(r,{children:"Time yourself this Sunday. If you can't get the build under 60 minutes with the template, the template needs more pre-decision. Rework the template, not the build."}),e.jsx(l,{children:"If the build takes longer than 30 minutes, the template is doing too little."})]}),e.jsxs("article",{className:"mb-16","data-testid":"chapter-6",children:[e.jsx(s,{n:"06"}),e.jsx("h3",{className:"text-2xl sm:text-3xl font-bold mb-5",children:"The Post-Cycle Review"}),e.jsx("p",{className:"text-lg leading-relaxed mb-4 text-m-t2",children:"Every 4 weeks, run a 15-minute review. Pull the actual labor % vs. the target by daypart. Identify the two dayparts that drifted most. Adjust the template for the next cycle. That's it. The point is incremental refinement, not constant overhaul."}),e.jsx("p",{className:"text-lg leading-relaxed mb-6 text-m-t2",children:"Most owners try to optimize everything every week. That's why they never optimize anything. The 4-week cadence gives the changes time to settle and produce signal."}),e.jsx(a,{tag:"Post-cycle review template",children:e.jsxs("ol",{className:"text-base text-m-t2 space-y-1.5 list-decimal pl-5",children:[e.jsx("li",{children:"Pull actual labor % by daypart for the last 4 weeks."}),e.jsx("li",{children:"Compare to target. Highlight the two largest variances."}),e.jsx("li",{children:"For each: adjust the template (add/remove a stagger, retime a handoff, change a daypart line)."}),e.jsx("li",{children:"Document the change in a single line in the schedule template's changelog."}),e.jsx("li",{children:"Re-run for next 4 weeks. Repeat."})]})}),e.jsx(r,{children:'Put a recurring 15-minute block on the calendar every 4 weeks. The cadence is the system. The review without the cadence becomes "when I get to it," which means never.'}),e.jsx(l,{children:"Tune two dayparts every four weeks. Compounds faster than rebuilding everything."})]})]}),e.jsx("section",{className:"bg-m-card border-y border-m-border py-20 print-show",children:e.jsxs("div",{className:"max-w-3xl mx-auto px-6",children:[e.jsx("h1",{className:"hidden print:block text-2xl font-bold mb-6",children:"The Schedule Optimization Playbook"}),e.jsx(E,{}),e.jsx(m,{children:"The Cheat Sheet"}),e.jsx("h2",{className:"text-3xl sm:text-4xl md:text-5xl font-extrabold mb-4 leading-[1.1] tracking-[-0.02em]",children:"One page. Print it. Pin it."}),e.jsx("p",{className:"text-lg text-m-t2 mb-10",children:"Everything in this playbook, c
1ondensed."}),e.jsxs("div",{className:"grid md:grid-cols-2 gap-4",children:[e.jsx(i,{tag:"Phantom Shift Inventory",children:"Print the schedule. Articulate the demand reason for every shift. Anything without a reason = phantom. Most owners find 3-6."}),e.jsx(i,{tag:"Overlap Audit",children:"Time five shift transitions. Anything over 12 min = handoff task eating time. Target 8 min of structured handoff."}),e.jsx(i,{tag:"8-Week Demand Curve",children:"POS hourly sales, last 8 weeks. Avg by day-of-week à hour. Compute $/labor-hr per cell. Under $80/hr (FOH) = staffing question."}),e.jsx(i,{tag:"Staggered Shifts",children:"Replace 11:00 starts with 10:30 / 11:00 / 11:30. Pair late-cuts when pace softens. 6-9 hours back per day per location."}),e.jsx(i,{tag:"30-Min Build",children:"BOH (5-7 min) â Bar (5-7 min) â Floor with stagger (7 min) â Host/support (4 min) â final pass (3 min). Template carries the decisions."}),e.jsx(i,{tag:"4-Week Post-Cycle",children:"Top 2 daypart variances. Adjust template, not schedule. Document one-line change. Compound, don't rebuild."})]})]})}),e.jsx(W,{calendlyHref:z,cantDoBullets:["Pull and refresh the 8-week demand curve every Sunday for you","Surface phantom shifts the moment they appear in your weekly build","Watch real overlap minutes per transition and flag drift","Run the post-cycle review automatically every 4 weeks"],martyParagraph:"We connect to your POS and timekeeping, refresh the 8-week demand curve every Sunday, surface phantom shifts in your weekly build, watch real overlap minutes per transition, and run a full operational Cash Recovery Plan across the rest of your restaurant."}),e.jsx(D,{}),e.jsx(F,{publicContent:!0})]})}export{oe as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.