Move from another app

Migrate your Notion recipes to Savvy

Whatever shape your recipe database is in, there’s a way out of it and into Savvy that doesn’t involve retyping a page. Here’s the whole route, and a straight answer about how much of your layout survives.

How the move works

Three steps, and your own assistant does the hard one.

  1. Export your database as Markdown & CSV, then unpack it

    One menu on the database page. Notion hands you a zip — unpack it, and inside is a CSV of your table and a page for each recipe.
  2. Hand the folder to an AI assistant with the prompt below

    ChatGPT, Claude, Gemini — whichever one you use, and a free account will do. It reads your table and your pages together and writes them out in the shape Savvy reads.
  3. Paste what comes back into Savvy

    The whole database arrives as one job, not one job per recipe. Two hundred recipes take about as long as one.

Savvy publishes a prompt rather than a Notion importer. It’s the same route every app on Move from another app takes, written out here just for Notion.

Step 1 · How they come out

Export Markdown & CSV, then unzip.

Open your recipe database as a full page, click the ••• at the top right, and choose Export. Pick Markdown & CSV and switch Include subpages on. Notion gives you a zip: a CSV of the table itself, and a Markdown file for each recipe page.

Unpack the zip and hand your assistant the whole folder — the CSV and the Markdown files together. Each row in the CSV and the page with the same name are the same recipe, and the prompt reads them as a pair.

This makes a copy. It reads your recipes out of Notion and changes nothing in it — your workspace is exactly where it was when you’re done.

Step 2 · How they are converted

You’ll need an AI assistant for this bit.

Any AI assistant will do — ChatGPT, Claude, Gemini, whichever one you already use — because something has to translate between the shape you built in Notion and the shape Savvy reads. If you don’t use one, they all have a free version and signing up takes a minute.

Below is the message you send it. That’s all a prompt is: the words you type into the box. This one is written for Notion — it reads your table and your pages together, and it matches your own column names by what they hold rather than by a fixed label. Copy it, open your assistant, paste it in, attach the folder you unpacked, and send.

Conversion prompt · Notion
Attached is my recipe database, exported from Notion as
Markdown & CSV. Convert every recipe in it into Savvy's
archive format.

The export has a CSV of the table and one Markdown file per
recipe. The CSV row and the Markdown file with the same name
are the same recipe — read them together.

Output one JSON array. Each element is one recipe, shaped
exactly like this:

{
  "recipe": {
    "core": {
      "name": "Lemon drizzle cake",
      "description": "A plain loaf with a crunchy top.",
      "source": { "source_type": "json",
                  "description": "Where it came from",
                  "url": "https://…" },
      "yield": { "raw": "Serves 8" },
      "ingredient_groups": [
        { "name": null,
          "ingredients": [
            { "ingredient_name": "plain flour",
              "quantity": { "value": 225, "unit": "g" } },
            { "ingredient_name": "salt" }
          ] }
      ],
      "method_groups": [
        { "name": null,
          "steps": [
            { "order": 1, "text": "Heat the oven to 180C." }
          ] }
      ]
    },
    "metadata": {}
  },
  "collection": { "name": "From Notion", "position": 1 }
}

My property names are my own, so match by meaning, not by an
exact label:
- The recipe's title (the page name) -> core.name.
- Any ingredients list, wherever it is — a column, or a
  section of the Markdown -> core.ingredient_groups. A heading
  line in the Markdown becomes a group "name"; otherwise use
  one group with "name": null.
- Any method, steps or directions -> core.method_groups,
  numbered from 1.
- A servings or yield property -> core.yield.raw.
- A link, URL or source property -> core.source.url or
  core.source.description.
- A tags, type or category property -> metadata.meal_type only
  if one names a meal (breakfast, lunch, dinner, dessert,
  snack). Otherwise leave meal_type out.
- Anything else worth keeping — a rating, a time — that has no
  home below goes into one note with "heading": "From Notion".

Rules:
- "core" and "metadata" must both be present on every recipe,
  and "core" must have "name", "ingredient_groups" and
  "method_groups". "metadata" may be an empty object.
- Keep every quantity exactly as written. Do not convert units.
- "value" is a number: 0.5, not "1/2". Where a line gives a
  range, use the lower number and put the range in "note".
- "unit" is the unit as written, or "" where there isn't one.
- Leave "quantity" out entirely for anything unmeasured, like
  salt to taste.
- If a row has no recognisable ingredients or method, skip it —
  it is a note page, not a recipe.
- One element per recipe. Do not merge, shorten or improve
  anything.
- If a field isn't in my export, leave it out. Don't invent it.
- Output only the JSON array. No commentary.

What comes back is one block of JSON, starting with [ and ending with ]. It will look like nothing you recognise, and it isn’t meant to — it’s your recipes written in the shape Savvy reads. You don’t need to save it or name it. The next step is a copy and a paste, so leave it on screen.

Nothing in that prompt asks your assistant to be clever. It asks it to move your recipes without touching them. The shape it spells out is the one Savvy checks every record against, field for field, which is why it’s written out in full rather than described.

Step 3 · How they are imported

Four presses, and it’s in.

  1. Sign in

    A free account is enough. Nothing about moving your library sits behind the paywall.
  2. Press + Add recipe

    It’s in the navigation, on every screen. It opens one box, and that box is where everything enters Savvy — a link, a photo, a whole library.
  3. Paste the whole array into the box

    All of it, from the first bracket to the last, not one recipe at a time. Savvy recognises it as a library rather than reading it as a recipe. A few hundred recipes go in one paste.
  4. Send

    One run. The progress list names every recipe in the file up front, then fills them in one by one, so you can watch your whole database arrive.

They arrive as drafts, which is one filter in your recipe list — so the whole import sits together in one place while you read through it.

What comes across

Your layout decides how much converts.

Each recipe converts as well as you laid it out

Notion holds whatever structure you gave it, so this is the one source where the result depends on you. A tidy database with clear ingredient and method sections converts cleanly. A freeform page of notes converts to a freeform recipe. The prompt does its best with what’s there.

Your columns are matched by meaning

You named your own properties, so the prompt matches them by what they hold rather than by an exact label — a "Serves" column, a "Link" column, a "Tags" column all land in the right place whatever you called them.

Loose extras become a note

A rating, a time, a column that fits nowhere in a recipe — the prompt keeps it in a note headed "From Notion" rather than dropping it. Nothing you bothered to record is thrown away.

Photos do not come across

A Notion export saves your images as files inside the folder, and Savvy needs an address it can reach. So recipes arrive without their pictures, and you add a cover to the ones you care about.

A free account holds fifty recipes, which is the whole of the free plan. A paid archive has no ceiling, and bringing a converted library in is never rationed against the monthly import allowance — it costs Savvy nothing to run, so it isn’t metered.

What to check after

What to do once it’s in.

Notion keeps working

Nothing about this touches your Notion workspace. It is a copy, made from a file you exported, and the original is exactly where it was. Run the import, read what arrived, and delete nothing until you are satisfied.

Imported recipes land as drafts

Drafts are one filter in your recipe list, so the whole import sits together while you read through it, rather than scattering into an archive you then have to search.

Read a handful of recipes before trusting the rest

Notion is the freest of these formats, so this check matters most here. Open five, compare them against the Notion pages, and you’ll see quickly whether your layout converted the way you hoped.

The road out is the same road: Savvy exports your whole archive as one file whenever you want it, free on every plan. See how export works.

Where to begin

Start in Notion.

Export the database and unzip it first. That’s the only step nobody can do for you, and it’s the one that takes two minutes.