Move from another app

Migrate a recipe spreadsheet to Savvy

However you’ve kept recipes in a spreadsheet — columns of your own, in whatever order — there’s a way into Savvy that doesn’t involve retyping a row. Here’s the whole route, start to finish.

How the move works

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

  1. Save your spreadsheet as CSV

    One menu in Google Sheets, Excel or Numbers. One file, nothing to unpack.
  2. Hand the file to an AI assistant with the prompt below

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

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

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

Step 1 · How it comes out

Save it as CSV.

In Google Sheets, File → Download → Comma-separated values. In Excel or Numbers, Save As or Export and choose CSV. One file comes out, and there’s nothing to unpack — a CSV is already plain text an assistant reads straight.

Your columns can be in any order and named however you like. You’re not expected to have kept the sheet tidy; the prompt works from what’s there and matches your columns by what they hold.

This makes a copy. Your original spreadsheet is untouched — you’re only handing over a saved version of it.

Step 2 · How it is 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 your rows and columns 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 a spreadsheet — it matches your columns by meaning, and it pulls a quantity like “225g” apart from the ingredient beside it. Copy it, open your assistant, paste it in, attach your CSV, and send.

Conversion prompt · Spreadsheet
Attached is my recipe spreadsheet, saved as CSV. Convert
every recipe in it into Savvy's archive format.

Each row is one recipe. My column names are my own, so match
by meaning, not by an exact label.

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

{
  "recipe": {
    "core": {
      "name": "Lemon drizzle cake",
      "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": "Imported", "position": 1 }
}

Where my columns go:
- The title or name column -> core.name.
- An ingredients column -> core.ingredient_groups. It is often
  one cell with an ingredient per line: split it into separate
  ingredients, one group with "name": null.
- A method, steps or directions column -> core.method_groups.
  Split one cell into steps and number them from 1.
- A servings or yield column -> core.yield.raw.
- A link, URL or source column -> core.source.url or
  core.source.description.
- A meal or type column -> metadata.meal_type only if it names
  a meal (breakfast, lunch, dinner, dessert, snack).
- Any other column worth keeping goes into one note with
  "heading": "From my spreadsheet".

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.
- Where a cell holds a quantity and an ingredient together
  ("225g plain flour"), split them: "value" 225, "unit" "g",
  "ingredient_name" "plain flour".
- "value" is a number: 0.5, not "1/2". Where a cell 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.
- Skip the header row, and skip any empty rows.
- One element per recipe. Do not merge, shorten or improve
  anything.
- If a field isn't in my spreadsheet, 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 it is imported

Four presses, and it’s in.

  1. Sign in

    A free account is enough. Nothing about moving your recipes 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 spreadsheet.
  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 the whole sheet 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 columns decide how much converts.

Each recipe converts as well as its row held it

A spreadsheet keeps only what you put in cells, so this is where the result depends most on you. Separate columns for ingredients and method convert cleanly. One long cell per recipe converts to one long recipe. The prompt does its best with the shape it’s given.

Your columns are matched by meaning

You named your own columns in whatever order suited you, so the prompt matches them by what they hold rather than by a fixed label. A "Serves" column, a "Source" column, a "Type" column all land in the right place.

Quantities are pulled apart where they’re joined

A cell reading "225g plain flour" comes in as a quantity of 225g against the ingredient "plain flour", so your amounts scale and convert like any other recipe’s rather than sitting as plain text.

There are no photos to lose

A spreadsheet holds no images, so nothing is left behind here — the one way this is simpler than moving from an app. You add a cover to the recipes you care about, the same as any recipe you write from scratch.

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.

Your spreadsheet keeps working

Nothing about this touches your file. It is a copy, made from a CSV you saved, 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

A spreadsheet is the loosest of these formats, so this check matters most here. Open five, compare them against your rows, and you’ll see quickly whether your columns converted the way you expected.

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 with the file.

Save your sheet as CSV first. That’s the only step nobody can do for you, and it’s the one that takes two minutes.