Fill out the times once. Walk away with a sign for the door, the exact words to paste into Google, and a block of code to send whoever made your website. About 15 minutes.
Add a street address — recommended for Google Rich Results+
All optional. Skipping these still gives you a working JSON-LD block. Adding them turns the block into a Rich-Results-ready Restaurant entry — the same data Google wants for the “restaurants near me” carousel.
Type times like 11 AM, 5 PM, or 21:00 — the tool understands all of them. Leave both boxes empty for a closed day. If you close after midnight (last call at 1 AM), check “closes next day.”
Any closed days coming up?
0 selected
Check any holiday you'll be closed for. We'll add them to the “Add closures to my phone calendar” download below.
Custom closure:
Already have hours posted somewhere? Paste them to compare.
Paste your current Google or Yelp hours here. We'll diff them against what you entered above and flag any days that don't match. (We're looking for “Monday: 11 AM–9 PM”-style lines; minor formatting differences are ignored.)
Live preview — every change updates the outputs.
Your checklist
Five greens means you're done. Tap any item to fix it.
Update Google.
For Google Business Profile
Copy the block below and paste it into your Google Business Profile hours field. Three steps:
Paste this in (or copy day-by-day if Google asks for one day at a time) and save.
Read this onto your voicemail.
For your phone greeting
Stale voicemails are the #1 customer touchpoint independents forget. Read this script naturally — pauses where the punctuation suggests. Update it the next time your hours change.
Send this to whoever made your website.
For your website builder
If a developer or agency built your site, send them the email and code below. They'll know exactly what to do with it. (For the technically curious: this is Schema.org OpeningHoursSpecification JSON-LD — the format Google reads to show your hours in search results.)
Where this goes on common site builders+
Site builder
Where to paste
Squarespace
Settings → Advanced → Code Injection → Header
WordPress
Theme header.php, or use a “Header & Footer” plugin
Wix
Settings → Custom Code → Add Custom Code → Head
Webflow
Project Settings → Custom Code → Head Code
What customers will see in Google.
Rich Result preview
Roughly what a searcher sees when Google reads the code on your site. Open / Closed updates live based on the time right now.
Real Google rendering varies (mobile vs. desktop, signed-in state, your industry). The structure, day grid, and Open/Closed status are what you control via the JSON-LD block above.
Update Apple Maps.
For Apple Business Connect
Apple Business Connect is free and now the second-most-checked map after Google — bigger than Yelp on iPhone. Sign in at businessconnect.apple.com and paste this into your hours.
Other listing platformsYelp — smaller share than Apple Maps for most independents, but worth keeping in sync if you're claimed there.+
Update Yelp
Yelp uses a slightly different format than Google. Sign in, find “Business Information,” paste this in.
Add the closures to your phone calendar.
As an iCalendar (.ics) file
Download this file and double-click it on your phone or computer. Your calendar app will offer to add the dates — you'll get a reminder the morning before each closure so you can tell your staff. Works with Apple Calendar, Google Calendar, and Outlook.
0 closures selected.
Get a quarterly nudge to re-run this.
iCalendar (.ics) · 8 events / 2 years
Hours drift. Holidays come around. Staff changes. Download an 8-event reminder — once a quarter for two years — and your calendar will ping you 90 days from today with a one-click link back to your saved scenario. The reminder URL contains your form state, so when you click it three months from now the week grid, closures, and address are all already filled in.
No account, no email. The reminder lives only on your device. The scenario lives only in the URL bar of the calendar reminder — never on a server.
Print this and tape it to your door.
Letter / A4 portrait
A clean, large-type sign with your weekly hours and the next four closures. Print it, trim, and tape inside the door — or slot it into an A-frame board out front. Reprint when the closures list goes stale; it's a built-in reminder to revisit your hours.
Send a snapshot to a partner or accountant.
1200×1500 PNG
The Store Hours Card bundles your weekly grid, upcoming closures, the website code, and the Google paste block into one shareable image. Email it to a partner or accountant; print it for the back-of-house clipboard. Same idea as the Storefront Sign, sized for a screen instead of a door.
Print the Hygiene Report.
Single-sheet letter / A4
A clean back-of-house report — weekly grid, picked closures, the Google paste block, and the JSON-LD code, all on one printed page with today's date and a re-open URL in the footer. Pin it to the manager's clipboard. Forward it to your accountant. Reprint every quarter.
Different from the Storefront Sign — the Sign is for the customer at the door; this Report is for the staff inside.
Get everything in one ZIP.
ZIP bundle
One file containing the printable Sign, the shareable Card, the website code in a ready-to-paste HTML file, the calendar (.ics) closures file, a plain-text version of all the platform copy, and a README that ties it together. Forward to an assistant, a developer, or a future you who reruns this in three months.
Save these hours to the Workshop so they follow you across devices.
Fill out at least one day's hours above to see your outputs. Or click to see how it works.
What's typical
Closest to your restaurant?
Each card is a real-world hours pattern from a different restaurant archetype. Click any one to load it as a starting point — then change the times to match your own. Faster than typing 7 days from scratch.
Plain English
What this does, in four sentences
You fill out the times. Day-by-day, in whatever format feels natural — “5 PM” or “17:00”, both work. Optional: pick which holidays you'll be closed for.
The tool quietly translates. Behind the scenes, your times get converted into Google's exact format, Yelp's exact format, Apple Maps' exact format, and the structured-data code Google reads to show your hours in search results.
You walk away with four artifacts. A printable sign for the door, a paste block for Google, a block of code to send your website builder, and a calendar file with your closures. Each one answers a sentence the owner could type into search.
You run it again next quarter. Hours drift. Holidays come around. The Storefront Sign goes stale by design — when its closure list runs out, that's your prompt to come back.
It is not an auto-syncer, a wait-time predictor, or a multi-location dashboard. More on the limits below.
Lead by example
Your hours stay in your browser.
Nine claims, each verifiable in your browser’s DevTools in under a minute. Open the inspect panel for any of them.
1
Your hours never leave this page.
No fetch(), no XMLHttpRequest, no form submission fires when you type a time. The validation, JSON-LD generation, and platform-copy generators all run entirely in your browser.
Inspect this
Open DevTools (Cmd+Opt+I / Ctrl+Shift+I) → Network tab. Type a time into the form. The request list should not grow. If it does, that’s a bug — tell us.
2
There’s no server to store them on.
The tool ships as a static page. There’s no API endpoint that accepts hours, no database that holds them, no queue that processes them.
Inspect this
Try curl -X POST https://muntin.digital/tools/store-hours/. You’ll get a 405 (Method Not Allowed). The page is read-only static HTML.
3
Analytics sees only buckets, never your hours.
Plausible tracks how many people use the tool but receives only enum-locked values like 4-5 days open or multi-service. Your restaurant name, city, specific times, and closure dates are never sent.
Inspect this
DevTools → Network → filter plausible. After typing into the form, the only payloads you’ll see carry properties like open_days: "4-5". Source: bucket helpers at /tools/store-hours/open-hours.js lines ~660–700.
4
No cookies, no localStorage, no sessionStorage.
Nothing about your inputs gets written to your browser’s persistent storage. Closing the tab clears the form completely.
Inspect this
DevTools → Application tab → Storage. Cookies, Local Storage, and Session Storage for this origin are all empty after typing into the form. (Pagefind’s search-index files appear under Cache Storage; those don’t carry your input.)
5
No third-party scripts touch the inputs.
Plausible loads from plausible.io to log a single anonymous pageview. Nothing else third-party runs on the page.
Inspect this
DevTools → Network → filter type JS. The only off-origin script is plausible.io/js/.... Open it; it has no access to the form — it just emits pageview pings.
6
Shareable scenario links keep your hours in your URL bar, not on a server.
When you copy this page’s URL, the fragment after # contains your form state. URL fragments are never sent to the server per the HTTP spec — we even add <meta name="referrer" content="no-referrer"> so links you click out of the tool don’t leak it.
Inspect this
Type into the form, copy the URL, look at it. Everything after # is your data. Now paste the URL into a new incognito window — the form rehydrates locally; no request to the server carried any of your inputs.
Right-click → View Page Source → click either .js link. Search for fetch, XMLHttpRequest, or localStorage in those files — you’ll find none.
8
Nothing persists beyond this tab.
No service worker, no background page, no IndexedDB. Close the tab and the work is gone — unless you bookmarked the URL fragment.
Inspect this
Type into the form. Close the tab. Reopen muntin.digital/tools/store-hours/ (without the fragment). The form is empty.
9
The Sign, Card, ICS, ZIP, and Quarterly Check-in are all 100% client-side.
PNG renders use Canvas. ICS files use Blob + URL.createObjectURL. The ZIP is composed in-browser via a small store-only writer. Even the Quarterly Drift Check-in’s recurring calendar event is generated locally; the URL it carries is just location.href.
Inspect this
DevTools → Network. Click any download (Sign PNG, closures ICS, quarterly ICS, ZIP). The Network tab does not grow — the file came from a blob: URL composed in your browser. Open any .ics file in a text editor; you’ll see plain RFC-5545 text, no tracking pixel.
Store Hours is the cleanest 15 minutes you can spend on the most thankless part of running a restaurant. Knowing what it doesn't do keeps the expectations honest.
Not an auto-syncer.
Tools like Yext do this — they push a single source to every platform on a schedule. They cost \$199+/month and authenticate as you. Store Hours is the no-account, no-API alternative: you copy and paste. Slower, but the privacy posture stays clean and the math is auditable.
Not a wait-time predictor or reservation widget.
Those are operational tools that need real-time data. Store Hours sets the static hours; reservation availability and wait times are downstream concerns.
Not a multi-location dashboard.
v1 is single-restaurant. If you operate three locations with different hours, you'll run the tool three times. Multi-location management is a separate market that demands different infrastructure.
Not a permanent solution to a recurring problem.
Hours drift. Holidays come around. Staff changes. Once a quarter, run this again. The Storefront Sign goes stale on its own — when the next-four-closures list runs out, that's your prompt. The tool is most useful as a quarterly ritual, not a one-and-done.
What this is: 15 minutes that prevent a year of drift.
Four audiences, four artifacts. The Storefront Sign is for the diner walking past at 10 PM. The Google paste block is for the searcher checking their phone. The website code is for the developer who built your site (or the one who'll inherit it). The calendar file is for you, three weeks before each holiday, when you've forgotten you said you'd close.
When you want this kept synced for you, hire the studio.
A custom restaurant website built by us has hours wired to a single source — change them in one place, every page updates instantly, the JSON-LD stays current. The studio's web work is what turns this 15-minute tool into something that stays right by itself.
Set your hours for the next eight US restaurant holidays. The tool spits out three outputs: a plain-text block for your website, a JSON-LD OpeningHoursSpecification override for your schema, and a Google Business Profile-formatted block you can paste into your GBP dashboard. Everything runs in your browser; nothing is sent up a server.
Your three outputs.
Pick a tab. Hit Copy. Paste into the surface that asked for it. Generate again any time you change a row.
Hit Generate outputs to see your three blocks.
Want me to keep these current every month, plus run the same hygiene pass on your Yelp and Apple Maps cards? $99/mo Care Plan Light →
What this tab does NOT do.
It doesn’t push to your GBP automatically. Google requires you to paste into Business Profile Manager yourself; that’s a feature, not a bug — the dashboard is the audit trail.
It doesn’t handle non-US holidays or religious observances. The eight US restaurant holidays are the ones that move covers; ask me directly if your concept needs more.
It doesn’t track that you actually updated the hours. If you want monthly verification across your site, GBP, Yelp, and Apple Maps, that’s what the Care Plan Light covers.