/ โ† Schema Debugger Fixes / Recipe Schema Errors
In this guide
  1. What Recipe markup does in Google today
  2. The fields Recipe needs
  3. The errors you will see, and what each one means
  4. Images: the most common critical error
  5. Times, yield, nutrition and ratings
  6. Fixing JSON that cannot be read
  7. Making the markup match the recipe on the page
  8. The fix, step by step
  9. Stopping it from coming back
  10. Questions and answers

What Recipe markup does in Google today

Recipe is a schema.org type for a single dish: its name, a photo, the ingredients, the method, how long it takes and how many it serves. Google reads it to build recipe rich results, the listing with a picture, star rating, total time and calories, and to place the page in recipe carousels and in the recipe filters on image and mobile search.

Unlike FAQ and HowTo, which Google cut back in 2023, Recipe rich results are still shown to all sites. That is why Recipe has its own report in Search Console, under Enhancements, and why the Rich Results Test still checks it in full. A Recipe error is not just an audit warning: it can be the difference between a listing with a photo and stars and a plain blue link.

Google splits Recipe problems into two kinds, and it helps to know which is which before starting:

๐Ÿ’ก Fix errors first, then warnings in order of what they add to the listing: image, rating, total time and calories are what the reader sees in the search result.

When Recipe is the wrong type

The fields Recipe needs

Only two fields are strictly required, but a recipe rich result without the recommended fields is thin. This table lists what Google reads, and what each one adds.

FieldRequired?What it holds
nameRequiredThe name of the dish, as shown on the page.
imageRequiredOne or more photos of the finished dish. Full https addresses to images Google can crawl.
recipeIngredientRecommendedAn array of strings, one per ingredient, with the amount: "200g plain flour".
recipeInstructionsRecommendedAn array of HowToStep items, or HowToSection items for recipes in parts.
prepTime, cookTime, totalTimeRecommendedISO 8601 durations such as PT15M. Give totalTime, or both prepTime and cookTime.
recipeYieldRecommendedHow many it serves or makes. A number, or text such as "12 cookies".
nutrition.caloriesRecommendedA NutritionInformation with calories per serving, written as text: "320 calories".
aggregateRatingRecommendedThe average of real ratings left by readers and shown on the page.
author, datePublished, descriptionRecommendedWho wrote it, when, and a short summary of the dish.
recipeCategory, recipeCuisine, keywordsRecommendedThe course (Dessert), the cuisine (Italian) and other terms. Do not repeat category or cuisine in keywords.
videoRecommendedA VideoObject if the page has a video of the recipe being made.

A correct block you can copy

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Recipe",
  "name": "Lemon drizzle cake",
  "description": "A light sponge soaked in a sharp lemon syrup, ready in under an hour.",
  "image": [
    "https://example.com/images/lemon-drizzle-16x9.jpg",
    "https://example.com/images/lemon-drizzle-4x3.jpg",
    "https://example.com/images/lemon-drizzle-1x1.jpg"
  ],
  "author": { "@type": "Person", "name": "Sam Baker" },
  "datePublished": "2026-03-14",
  "prepTime": "PT15M",
  "cookTime": "PT40M",
  "totalTime": "PT55M",
  "recipeYield": "8",
  "recipeCategory": "Dessert",
  "recipeCuisine": "British",
  "keywords": "lemon cake, afternoon tea, traybake",
  "nutrition": { "@type": "NutritionInformation", "calories": "320 calories" },
  "recipeIngredient": [
    "225g unsalted butter, softened",
    "225g caster sugar",
    "4 large eggs",
    "225g self-raising flour",
    "2 lemons, zested and juiced",
    "85g icing sugar"
  ],
  "recipeInstructions": [
    { "@type": "HowToStep", "name": "Make the batter", "text": "Beat the butter and caster sugar until pale, then beat in the eggs one at a time and fold in the flour and lemon zest.", "url": "https://example.com/lemon-drizzle#step-1" },
    { "@type": "HowToStep", "name": "Bake", "text": "Spoon into a lined 2lb loaf tin and bake at 180C (160C fan) for 40 minutes until a skewer comes out clean.", "url": "https://example.com/lemon-drizzle#step-2" },
    { "@type": "HowToStep", "name": "Drizzle", "text": "Mix the lemon juice with the icing sugar, prick the warm cake all over and pour the syrup over it.", "url": "https://example.com/lemon-drizzle#step-3" }
  ],
  "aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.7", "ratingCount": "38" }
}
</script>

The errors you will see, and what each one means

These are the messages the Rich Results Test, the Search Console Recipes report, the Schema Markup Validator and the Schema Debugger give for Recipe, with the cause behind each one.

MessageCauseFix
Missing field "image" (critical)No image, or the image is set only in Open Graph tags and not in the Recipe.Add image with at least one full https address.
Missing field "name" (critical)The dish name is in headline or title.Put it in name.
Missing field "recipeIngredient"No ingredients, or they are in the old ingredients field.Rename ingredients to recipeIngredient.
Missing field "recipeInstructions"The method is only on the page, or in description.Add the method as HowToStep items.
Invalid value in field "cookTime" / "totalTime"Words ("40 mins"), clock format ("0:40") or a missing T.Use ISO 8601: PT40M, PT1H10M.
Missing field "totalTime"Only one of prepTime and cookTime is given, and no totalTime.Give totalTime, or both prepTime and cookTime.
Invalid object type for field "nutrition"Calories written straight onto the Recipe, or nutrition as a plain number.Use a NutritionInformation with calories inside it.
Invalid value in field "ratingValue" / Missing "ratingCount" or "reviewCount"A rating with no count, a count of 0, or a value outside the scale.Give a count above 0, and bestRating if the scale is not 1 to 5.
Unparsable structured dataA trailing comma, curly quote, unescaped quote or raw line break.See the parsing section below.
Duplicate RecipeA recipe card plugin and the theme or an SEO plugin both output Recipe.Keep the recipe card and switch the other off.

Images: the most common critical error

A recipe without a usable image cannot get a rich result, and image problems are the most frequent critical Recipe error we see in audits. Google asks for more than one image in different shapes so it can crop for each place the recipe appears.

โš ๏ธ Many recipe plugins use the post's featured image. If a post has no featured image, the plugin outputs an empty image field, and every such page fails with a critical error. Check the featured image is set on every recipe post.

Times, yield, nutrition and ratings

Times

prepTime, cookTime and totalTime are ISO 8601 durations. They start with P, and a T comes before hours, minutes and seconds.

You meanWriteCommon mistake
15 minutesPT15MP15M means 15 months
1 hour 20 minutesPT1H20MPT80M is valid but awkward; 1:20 is invalid
Overnight (12 hours)PT12H"overnight"
2 days (curing, proving)P2DPT2D: days go before the T

If you give all three, totalTime should equal prepTime plus cookTime, or be longer when there is resting or chilling time. A totalTime shorter than the cooking time is flagged as a mismatch.

Yield

recipeYield takes a number of servings ("8") or a quantity with its unit ("12 cookies", "1 loaf"). Google uses the number to work out calories per serving, so give the servings count when you can.

Nutrition

Nutrition sits inside its own object. calories is text with the unit: "320 calories". Other values such as fatContent, proteinContent and sugarContent also take text with a unit: "12 g". Give values per serving, to match recipeYield.

Ratings

aggregateRating needs a ratingValue and a ratingCount or reviewCount above zero. The rating must come from real readers and be shown on the page. A rating written by the site owner, or copied from another site, breaks Google's review snippet rules and can lead to a manual action.

Fixing JSON that cannot be read

An unparsable block is ignored completely, including every other type in the same script. Recipe blocks are long and full of text typed by people, so they break often. Four mistakes cause almost all of them.

1. A comma after the last ingredient or step

    "85g icing sugar",
  ],      <-- the comma before ] breaks the JSON

2. Curly quotes

Recipe text pasted from a word processor often carries โ€œ and โ€. They are fine inside a value, but the quotes that open and close each name and value must be straight: ".

3. A double quote inside a value

"recipeIngredient": ["1 8" cake tin"]           <-- broken: inch mark ends the string
"recipeIngredient": ["1 8\" cake tin"]         <-- fixed

Inch marks in tin sizes are the most common cause of a broken Recipe block. Escape them with a backslash, or write "20cm" or "8 inch".

4. A line break inside the text

A raw line break inside a value ends the string. Split long methods into separate HowToStep items rather than one long value with line breaks.

โš ๏ธ Fix the template, not the page. Output the block with json_encode() in PHP or JSON.stringify() in JavaScript, and a reader typing an inch mark into a recipe can never break the block again.

Making the markup match the recipe on the page

Google's structured data rules apply in full to recipes: the markup must describe the recipe the reader sees. Mismatches are common because recipes get edited after publishing.

๐Ÿ’ก The Schema Debugger compares the recipe markup with the page text and lists ingredients and steps that appear in one but not the other, so edits made on the page but not in the markup show up straight away.

The fix, step by step

Step 1

Find every Recipe block on the page

Open the page source (Ctrl+U, or Cmd+Option+U on a Mac) and search for "Recipe". Note each match and where it comes from: a recipe card plugin (WP Recipe Maker, Tasty Recipes, Create), an SEO plugin, the theme or code added by hand. The Schema Debugger lists every block with its source position, and shows straight away when two sources are both writing a Recipe for the same dish.

Step 2

Fix JSON that cannot be read

Paste each block into the Schema Markup Validator. A parsing error gives the line and column; the fault is almost always one of the four in the parsing section, and in recipes it is most often an inch mark in a tin size. Fix it in the recipe card or template rather than in a saved copy of the page, then paste the block in again until the validator reads it cleanly.

Step 3

Add the required fields and images

Make sure the Recipe has a name and an image with a full https address. Set the featured image on the post, and if your plugin supports it, generate the 16x9, 4x3 and 1x1 crops at 1200 pixels wide. Open each image address in a private browser window to confirm it loads without a login, a redirect or hotlink protection, then run the page through the Rich Results Test.

Step 4

Put ingredients, instructions and times in the right fields

Ingredients go in recipeIngredient as an array of strings with amounts. The method goes in recipeInstructions as HowToStep items, grouped into HowToSection items for recipes in parts, such as "For the sauce". Rewrite every time as an ISO 8601 duration, such as PT40M, and check that totalTime is at least prepTime plus cookTime. Make the ingredient amounts and the step wording match the recipe card readers see on the page, so the markup and the page never disagree.

Step 5

Correct nutrition, yield and ratings

Move calories into a NutritionInformation object as text with the unit, such as 320 calories, per serving. Give recipeYield the number of servings so calories per serving make sense. Keep aggregateRating only if real readers rate the recipe on the page, with a ratingCount above zero and the score visible on the page. Remove any rating copied from another site or typed in by hand.

Step 6

Test and request a recrawl

Test the live URL in the Rich Results Test: it should show Recipes as a valid item with no critical errors. Then use URL Inspection in Search Console and choose Request indexing. The Recipes report under Enhancements updates as Google recrawls, usually within a few days to two weeks; press Validate fix on the report so Google confirms every corrected page. Re-test after plugin updates.

Stopping it from coming back

Questions and answers

1. Does Google still show recipe rich results?

Yes. Unlike FAQ and HowTo, recipe rich results are still shown for all sites: the photo, star rating, total time and calories beside the search listing, plus a place in recipe carousels and recipe filters. Search Console has a Recipes report under Enhancements that lists the errors and warnings for every recipe page it has crawled. Valid Recipe markup makes a page eligible for these results, although Google still decides when to show them.

2. Why is my recipe not showing with stars and a photo?

Check the live page in the Rich Results Test first. A critical error, usually a missing or unreachable image, stops the recipe rich result completely. Stars also need an aggregateRating built from real reader ratings shown on the page. If the test is clean, the page may not have been recrawled yet, or Google may choose not to show a rich result for that search. Valid markup makes a page eligible but never guarantees the display.

3. What is the difference between an error and a warning?

An error, such as a missing name or image, or JSON that cannot be read, stops the page getting a recipe rich result at all until it is fixed. A warning, such as missing nutrition, totalTime or ratings, lets the page keep its rich result but with that detail left out of the listing. Fix every error first, then work through the warnings in order of what they add for the reader: image, rating, time and calories.

4. How do I write calories in Recipe schema?

Put a NutritionInformation object in the nutrition field and write calories inside it as text with the unit, for example 320 calories, per serving. Do not put calories straight onto the Recipe, and do not write it as a bare number. Other values such as fatContent, sugarContent and proteinContent also take text with a unit, such as 12 g. Give every value per serving so it matches the number of servings in recipeYield.

5. Can I use one recipe image for all three sizes?

You can give a single image and still pass, but Google recommends the same photo in three crops, 16x9, 4x3 and 1x1, so it has the right shape for each place the recipe appears, from search listings to carousels. Each crop should be at least 50,000 pixels in area, such as 1200 by 675, 1200 by 900 and 1200 by 1200. Many recipe plugins create the three crops for you from the featured image.

6. Should recipeInstructions be text or HowToStep?

Use an array of HowToStep items, one per step, each with the full instruction in text and ideally a name and a url pointing to that step on the page. A single block of text is still accepted, but separate steps are clearer to search engines and AI assistants, and they let Google link straight to a step. For recipes made in parts, such as a cake and its icing, group the steps into HowToSection items with their own names.

7. How long before the Recipes report shows the fix?

After you request indexing with URL Inspection, Google usually recrawls the page within a few days. The Recipes report in Search Console updates as Google recrawls each affected page, which can take up to two weeks across a whole site. Press Validate fix on the report once the pages are corrected, so Google rechecks them and tells you when they pass. Check each page straight away in the Rich Results Test rather than waiting.

Check your Recipe markup now

The Schema Debugger lists every structured data block on a page, shows each missing or invalid Recipe field, checks image addresses and time formats, and compares your ingredients and steps with the visible recipe.

Open Schema Debugger Fixes โ†’
๐Ÿ’ฌ Got a problem?
Related Guides: All Schema Debugger Fixes  ·  Schema Debugger Guide  ·  HowTo Schema Errors  ·  aggregateRating Errors  ·  Learning Hub

About aiwebpageseo

aiwebpageseo.com is a data-driven SEO and AEO (Answer Engine Optimisation) platform providing a free suite of technical SEO tools. Rather than relying on AI-theorised assumptions, the platform analyses live URL performance, delivering objective diagnostics, page speed metrics, CLS debugging, and site crawl data alongside actionable technical tutorials.