# Design a print-ready restaurant menu with AI instead of Canva

> Keep your menu as a simple list, have Claude or ChatGPT turn it into a clean, printable HTML menu (Letter or A4), and save it as a PDF from your browser. Includes a Google Docs route for owners who don't want to touch code, plus the allergen and print-shop caveats that matter.

- Outcome: I want a good-looking, up-to-date menu I can print in-house or send to a print shop, without paying for Canva Pro.
- Replaces: Canva (task_specific)
- Uses: Claude — Clean up the menu list, write short dish descriptions and fill the HTML menu template; it can show the result as a live preview.; ChatGPT (optional) — Alternative to Claude for the same prompts.; Google Workspace (optional) — No-code route: a Google Docs menu template exported to PDF; Google Sheets as the master price list.
- Extra monthly cost: $0 — Uses an AI assistant you already have (free tiers work for occasional menu updates), a web browser's built-in Save as PDF, and optionally Google Docs. Printing costs are the same as before.
- Difficulty: easy; skill: basic; setup: 1–2 hours for the first menu
- Evidence: editorial; illustrative example: true; last reviewed 2026-10-13
- Canonical: https://onelesstool.com/workflows/restaurant-menus-with-ai

## Good fit for
- Independent restaurants, cafés and food trucks that pay for Canva Pro mostly to update menus
- Menus that change often (seasonal dishes, price updates) where retyping in a design tool is the main cost
- Owners who want one master list of dishes, prices and allergens that every menu is generated from

## Not a fit for
- Menus with heavy illustration, photo collages or custom die-cut shapes
- Large-run professional print jobs that need CMYK files, bleed and crop marks (use a designer or the print shop's own template)
- Businesses that also use Canva Pro for social posts, signage and video — cancelling Canva would remove those too
- Anyone not willing to proofread every price and allergen marker personally before printing

## Before
Open the menu design in Canva Pro, find each changed dish, retype prices and descriptions in separate text boxes, nudge alignment, re-export a PDF for the printer and a PNG for the website, and repeat for the A4 and Letter versions or the takeaway menu.

## After
Update one master list (a Google Sheet or a text note) of dishes, prices and dietary tags. Paste it into Claude with the fill prompt and the HTML template; open the result in Chrome, check it on screen, and Print > Save as PDF. Non-technical owners do the same in a Google Docs template and download a PDF.

## Steps

### 1. Make one master list of dishes, prices and dietary tags

Put every menu item in a single list — a Google Sheet works well — with columns: **section, dish name, description, price, dietary tags (V, VG, GF, N…), allergens confirmed by kitchen (yes/no), last checked date**.

This list is the source of truth. The design is regenerated from it, so prices never drift between the printed menu, the website and delivery apps.

**Allergen and dietary information is your legal responsibility, not the AI's.** Fill the allergen columns from recipes and supplier specs with your head chef. Labelling rules differ by country and city; check what your local food authority requires.

### 2. Clean up names and write short descriptions

Paste the list into Claude or ChatGPT with the **Menu clean-up prompt**. It standardises capitalisation, trims descriptions to one line and flags inconsistencies (duplicate dishes, prices without decimals in one section but not another).

Tell it **not** to add or remove ingredients. Review its suggested descriptions against the recipe: a model may make up a garnish that changes an allergen.

### 3. Generate the printable HTML menu

Use the **Fill the menu template prompt** with the template below. Choose `letter` (US) or `A4` in the `@page` line.

Ask Claude to show it as a preview (an artifact) or save the HTML to a file and open it in Chrome. On screen, the page shows a white sheet with the printable margins so you can see whether everything fits on one page.

If something overflows: ask the AI to shorten descriptions, reduce the base `font-size` from `10.5pt` to `10pt`, or move a section to a second page block.

### 4. Save as PDF and print a test copy

In Chrome: **Print > Destination: Save as PDF > Margins: Default > More settings: tick "Background graphics" > Save.**

Print one copy on your normal printer at **100% / Actual size** (not "Fit to page"). Check prices, spelling and the dietary legend on paper, where errors are easier to spot.

**Print-shop caveat:** browser PDFs are RGB, with no **bleed** or **crop marks**. Designs with colour running to the paper edge will show a thin white line after trimming. Either keep a white margin (the template does), or ask the print shop whether they can add bleed or work from your PDF.

### 5. No-code route: Google Docs menu

If you'd rather not handle HTML:

1. In Google Docs, **File > Page setup** and choose Letter or A4 with 0.5 in margins.
2. Ask the AI for the **Google Docs menu layout prompt** output, then right-click > **Paste from Markdown** (turn on Markdown in Tools > Preferences first) or paste plain text.
3. Use a 2-column table with hidden borders for "dish — price" alignment, a heading style per section, and one accent colour.
4. **File > Download > PDF.**

It looks plainer than the HTML version, but anyone on staff can update it.

### 6. Run the final proof pass and publish

Run the **Proofreading and allergen cross-check prompt** with your master list and the final menu text. It returns a mismatch table (price differs, tag missing, dish missing).

The AI can only compare the two lists. It cannot know whether a dish actually contains nuts. Fix every mismatch at the source list, regenerate, and keep the PDF with a date in the filename (e.g. `menu-2026-10-13.pdf`) so you know which version is on the tables.

## Prompts

### Menu clean-up prompt
Standardise the master list and write short descriptions without inventing ingredients.

```text
Here is the menu for {{restaurant_name}}, a {{cuisine_style}} restaurant. Each line is: section | dish | ingredients or notes | price | dietary tags.
{{raw_menu_list}}

Tasks:
1. Standardise dish names to Title Case and keep them under 5 words where possible.
2. Write a description of at most {{max_description_words}} words per dish using ONLY the ingredients I listed. Do not add garnishes, sauces or ingredients.
3. Format prices as {{price_format}} (e.g. "14" or "14.00"), consistently.
4. Keep my dietary tags exactly as given. Do not add or remove tags.
5. After the cleaned list, add a "Check these" list: duplicates, missing prices, dishes with no tags where the name suggests meat/dairy/nuts, and anything ambiguous.
Return the cleaned list in the same pipe-separated format.
```

### Fill the menu template prompt
Turn the cleaned list into a complete printable HTML menu using the template.

```text
Below is an HTML menu template and my cleaned menu list. Produce one complete HTML file:
- Keep the template's CSS and structure. Replace the sample sections and items with mine, in my section order.
- Restaurant name: {{restaurant_name}}. Menu title: {{menu_title}}. Service times: {{service_times}}.
- Paper size: {{paper_size}} (set the @page line accordingly and remove the other).
- Accent colour: {{accent_color}}.
- Footer allergen statement: "{{allergen_statement}}". Contact line: "{{address_phone_website}}".
- Only include dietary tags that appear in my list, and make the legend match the tags used.
- It must fit on {{page_count}} page(s). If it won't, tell me which descriptions to shorten rather than shrinking text below 9pt.
Template:
{{html_template}}
Menu list:
{{clean_menu_list}}
```

### Google Docs menu layout prompt
Produce Markdown that pastes cleanly into Google Docs for the no-code route.

```text
Format this menu for Google Docs. Output Markdown only:
- "# {{restaurant_name}}" then one italic line: "{{menu_title}} · {{service_times}}".
- "## Section" headings.
- For each dish, a two-column Markdown table row: "**Dish name** (tags) – description" | "price".
- A final line with the dietary legend and this statement: "{{allergen_statement}}".
Menu list:
{{clean_menu_list}}
```

### Proofreading and allergen cross-check prompt
Catch mismatches between the master list and the final menu before printing.

```text
Compare the MASTER LIST with the FINAL MENU TEXT. Report every difference in a table with columns: dish | field (name, price, tags, description, missing) | master value | menu value.
Also list spelling mistakes and inconsistent price formats. Do not judge whether tags are correct for the ingredients; only compare the two texts.
MASTER LIST:
{{master_list}}
FINAL MENU TEXT:
{{final_menu_text}}
```

## Templates and scripts

### Printable HTML menu template (Letter or A4, two columns, text dietary markers) (template)

```html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>{{restaurant_name}} – Menu</title>
<!--
  OneLessTool printable menu template.
  - Paper size: change @page size to "letter" (US) or "A4". Both are set up below; keep one.
  - Print: open in Chrome > Print > Destination "Save as PDF" > Margins "Default"
    > tick "Background graphics" > Save. Check the PDF at 100% before printing.
  - Dietary markers are plain text so they survive printing, copying and screen readers.
  - Everything is self-contained. Fonts are system fonts; swap the --serif/--sans stacks if you like.
-->
<style>
  @page { size: letter; margin: 0.5in; }      /* US Letter 8.5 x 11 in */
  /* @page { size: A4; margin: 12mm; } */    /* A4 210 x 297 mm: uncomment and delete the line above */

  :root {
    --ink: #1d1a16;
    --muted: #6b6258;
    --accent: {{accent_color}};               /* e.g. #8a2d1c */
    --rule: #cfc6b8;
    --serif: "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, serif;
    --sans: "Avenir Next", "Segoe UI", "Helvetica Neue", Arial, sans-serif;
  }
  * { box-sizing: border-box; margin: 0; padding: 0; }
  html { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
  body { color: var(--ink); font-family: var(--serif); font-size: 10.5pt; line-height: 1.35; background: #fff; }

  /* On screen, show the page outline so you can judge the layout before printing */
  @media screen {
    body { background: #e9e6e1; padding: 24px 0; }
    .page { width: 8.5in; min-height: 11in; padding: 0.5in; margin: 0 auto 24px; background: #fff;
            box-shadow: 0 2px 12px rgba(0,0,0,.15); }
    body.a4 .page { width: 210mm; min-height: 297mm; padding: 12mm; }
  }
  .page + .page { break-before: page; }

  header { text-align: center; margin-bottom: 18pt; }
  header h1 { font-size: 30pt; letter-spacing: 3pt; text-transform: uppercase; font-weight: 600; }
  header .tagline { font-family: var(--sans); font-size: 9pt; letter-spacing: 2pt; text-transform: uppercase;
                    color: var(--muted); margin-top: 4pt; }
  header .rule { width: 60pt; height: 2pt; background: var(--accent); margin: 10pt auto 0; }

  .columns { column-count: 2; column-gap: 0.4in; }
  section { break-inside: avoid; margin-bottom: 16pt; }
  section h2 { font-family: var(--sans); font-size: 10pt; letter-spacing: 2.5pt; text-transform: uppercase;
               color: var(--accent); border-bottom: 1pt solid var(--rule); padding-bottom: 3pt; margin-bottom: 8pt; }
  section .note { font-style: italic; color: var(--muted); font-size: 9pt; margin: -4pt 0 8pt; }

  .item { break-inside: avoid; margin-bottom: 8pt; }
  .item .line { display: flex; align-items: baseline; gap: 6pt; }
  .item .name { font-weight: 600; }
  .item .leader { flex: 1; border-bottom: 1pt dotted var(--rule); transform: translateY(-3pt); }
  .item .price { font-family: var(--sans); font-variant-numeric: tabular-nums; font-weight: 600; }
  .item .desc { color: var(--muted); font-size: 9.5pt; padding-right: 30pt; }
  .tags { font-family: var(--sans); font-size: 7.5pt; letter-spacing: .5pt; color: var(--accent); margin-left: 2pt; }

  footer { margin-top: 12pt; padding-top: 8pt; border-top: 1pt solid var(--rule); font-family: var(--sans);
           font-size: 8pt; color: var(--muted); text-align: center; }
  footer .legend span { white-space: nowrap; margin: 0 6pt; }
  footer p { margin-top: 4pt; }
</style>
</head>
<body>
<!-- For A4 on-screen preview add class="a4" to <body> as well as switching @page above -->
<div class="page">
  <header>
    <h1>{{restaurant_name}}</h1>
    <div class="tagline">{{menu_title}} · {{service_times}}</div>
    <div class="rule"></div>
  </header>

  <div class="columns">
    <section>
      <h2>Small Plates</h2>
      <div class="item">
        <div class="line"><span class="name">Charred Padrón Peppers <span class="tags">VG · GF</span></span><span class="leader"></span><span class="price">9</span></div>
        <div class="desc">Flaky sea salt, lemon, smoked olive oil</div>
      </div>
      <div class="item">
        <div class="line"><span class="name">Burrata <span class="tags">V · N</span></span><span class="leader"></span><span class="price">14</span></div>
        <div class="desc">Roasted grapes, pistachio crumb, grilled sourdough</div>
      </div>
      <div class="item">
        <div class="line"><span class="name">Crispy Calamari</span><span class="leader"></span><span class="price">13</span></div>
        <div class="desc">Garlic aioli, pickled chilli</div>
      </div>
    </section>

    <section>
      <h2>Mains</h2>
      <p class="note">Served with house salad. Ask about today's market fish.</p>
      <div class="item">
        <div class="line"><span class="name">Roast Half Chicken <span class="tags">GF</span></span><span class="leader"></span><span class="price">24</span></div>
        <div class="desc">Salsa verde, crushed potatoes, charred lemon</div>
      </div>
      <div class="item">
        <div class="line"><span class="name">Wild Mushroom Risotto <span class="tags">V · GF</span></span><span class="leader"></span><span class="price">21</span></div>
        <div class="desc">Aged parmesan, thyme, brown butter</div>
      </div>
      <div class="item">
        <div class="line"><span class="name">Steak Frites</span><span class="leader"></span><span class="price">32</span></div>
        <div class="desc">8 oz bavette, peppercorn sauce, fries</div>
      </div>
    </section>

    <section>
      <h2>Sides</h2>
      <div class="item"><div class="line"><span class="name">Fries <span class="tags">VG</span></span><span class="leader"></span><span class="price">6</span></div></div>
      <div class="item"><div class="line"><span class="name">Greens, Garlic &amp; Chilli <span class="tags">VG · GF</span></span><span class="leader"></span><span class="price">7</span></div></div>
    </section>

    <section>
      <h2>Desserts</h2>
      <div class="item">
        <div class="line"><span class="name">Olive Oil Cake <span class="tags">V</span></span><span class="leader"></span><span class="price">9</span></div>
        <div class="desc">Citrus, crème fraîche</div>
      </div>
      <div class="item">
        <div class="line"><span class="name">Dark Chocolate Pot <span class="tags">V · GF</span></span><span class="leader"></span><span class="price">10</span></div>
        <div class="desc">Sea salt, hazelnut praline <span class="tags">N</span></div>
      </div>
    </section>
  </div>

  <footer>
    <div class="legend">
      <span>V vegetarian</span><span>VG vegan</span><span>GF made without gluten-containing ingredients</span><span>N contains nuts</span>
    </div>
    <p>{{allergen_statement}}</p>
    <p>{{address_phone_website}}</p>
  </footer>
</div>

<!-- Copy the whole <div class="page"> block to add a second page (e.g. drinks). -->
</body>
</html>
```

## Limitations
- Browser PDFs are RGB with no bleed or crop marks; full-bleed colour and professional offset printing need a designer or the print shop's help.
- Less visual freedom than a drag-and-drop editor: photos, illustrations and unusual layouts need more prompting or CSS knowledge.
- Fonts are limited to what is installed on your computer unless you add web fonts yourself.
- The AI can rewrite or invent ingredients in descriptions; every description has to be checked against the recipe.
- The Google Docs route looks plainer and has limited layout control.

## Risks
- **compliance** (high): Wrong allergen or dietary markers can harm guests and breach food labelling rules. Tags must come from the kitchen's recipes and be checked by a person; never let the AI assign them.
- **reliability** (medium): Price typos on a printed menu can be costly. Always run the cross-check prompt and a paper proof.
- **functionality_loss** (low): Cancelling Canva Pro also removes Pro features you may use for signage or social posts.
- **data_portability** (low): Existing Canva menu designs can't be edited outside Canva; download final PDFs and image assets before cancelling.

## Verification checklist (run before cancelling)
- [ ] Your current menu, rebuilt with the template, fits on the intended number of pages at 100% scale with text no smaller than 9pt.
- [ ] A paper test print at Actual size has correct margins, no clipped text and readable prices from arm's length.
- [ ] The cross-check prompt reports zero mismatches between the master list and the final menu.
- [ ] Your head chef or kitchen lead has signed off every dietary tag and the allergen statement.
- [ ] If you use a print shop, they have confirmed they can print your browser PDF (or told you what they need for bleed).
- [ ] A price change takes you under 20 minutes from editing the master list to a new PDF.
- [ ] Any Canva menu files and images you still need are downloaded before cancelling.

## Savings methodology
Savings = your current Canva Pro cost attributable to menus − incremental cost of this workflow ($0 when using an AI assistant and Google Docs you already have). If menus are the only reason you pay for Canva Pro, the full subscription is saved; otherwise the saving is $0 until your other Canva uses are covered. Printing costs, setup time and staff time are not monetised.

Example (illustrative): A café owner pays for Canva Pro monthly and uses it only to update a one-page menu every few weeks; they already have a free Claude account and a Google account. $15/mo → $0/mo. Assumptions: Illustrative: $15/month is a round placeholder for a Canva Pro subscription. canva.com blocked automated access on 2026-10-13, so the current price was not verified. Menus are the only reason the café pays for Canva Pro. Free tiers of Claude or ChatGPT are enough for a few menu updates a month.

## Sources
- Google Docs Help: Use Markdown in Docs: https://support.google.com/docs/answer/12014036 (accessed 2026-10-13)
- Canva pricing: https://www.canva.com/pricing/ (accessed 2026-10-13)
