Fixing Recipe Schema Errors
Recipe markup is one of the few structured data types that still earns a rich result in Google: the photo, rating, cooking time and calories shown beside a search listing, and a place in recipe carousels. That makes Recipe errors worth fixing properly.
They fall into a short list: a missing image, ingredients or instructions in the wrong field, times in the wrong format, nutrition and ratings written as the wrong type, and markup that does not match the recipe on the page. This guide covers each one with the exact fix and a complete example you can copy.
- What Recipe markup does in Google today
- The fields Recipe needs
- The errors you will see, and what each one means
- Images: the most common critical error
- Times, yield, nutrition and ratings
- Fixing JSON that cannot be read
- Making the markup match the recipe on the page
- The fix, step by step
- Stopping it from coming back
- 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:
- Errors (red, "critical"): the page cannot get a recipe rich result at all until
they are fixed. A missing
nameorimage, and JSON that cannot be read, are errors. - Warnings (orange, "non-critical"): the page can still get a rich result, but with
less in it. Missing
recipeIngredient,totalTime,nutritionoraggregateRatingare warnings, and each one removes something from the listing.
When Recipe is the wrong type
- A round-up of recipes ("20 summer salads") is a list, not a recipe. Mark up each
recipe on its own page, and use an
ItemListon the round-up page that points to them. - Non-food instructions such as mixing paint or making soap are not recipes. Use HowTo or a plain article.
- A product page for a sauce or a meal kit is a Product, even if it lists ingredients.
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.
| Field | Required? | What it holds |
|---|---|---|
name | Required | The name of the dish, as shown on the page. |
image | Required | One or more photos of the finished dish. Full https addresses to images Google can crawl. |
recipeIngredient | Recommended | An array of strings, one per ingredient, with the amount: "200g plain flour". |
recipeInstructions | Recommended | An array of HowToStep items, or HowToSection items for recipes in parts. |
prepTime, cookTime, totalTime | Recommended | ISO
8601 durations such as PT15M. Give totalTime, or both prepTime and cookTime. |
recipeYield | Recommended | How many it serves or makes. A number, or text such as "12 cookies". |
nutrition.calories | Recommended | A NutritionInformation with calories per serving, written as text: "320 calories". |
aggregateRating | Recommended | The average of real ratings left by readers and shown on the page. |
author, datePublished, description | Recommended | Who wrote it, when, and a short summary of the dish. |
recipeCategory, recipeCuisine, keywords | Recommended | The course (Dessert), the cuisine (Italian) and other terms. Do not repeat category or cuisine in keywords. |
video | Recommended | A 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.
| Message | Cause | Fix |
|---|---|---|
| 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 data | A trailing comma, curly quote, unescaped quote or raw line break. | See the parsing section below. |
| Duplicate Recipe | A 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.
- Use full https addresses. A relative path such as
/images/cake.jpgis not a valid URL in structured data. - Give three crops. Google recommends the same photo in 16x9, 4x3 and 1x1 ratios, each at least 50,000 pixels in area (for example 1200 x 675, 1200 x 900 and 1200 x 1200).
- Let Google crawl them. An image folder blocked in robots.txt, a hotlink-protection rule, or an image served only after a script runs, all count as missing.
- Show the finished dish. The image must be of this recipe. A site logo, a stock photo or an image of the author is not a valid recipe image.
- Keep it on the page. The marked-up image should be one the reader can see on the page.
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 mean | Write | Common mistake |
|---|---|---|
| 15 minutes | PT15M | P15M means 15 months |
| 1 hour 20 minutes | PT1H20M | PT80M is valid but awkward;
1:20 is invalid |
| Overnight (12 hours) | PT12H | "overnight" |
| 2 days (curing, proving) | P2D | PT2D: 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.
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.
- Same ingredients. Every ingredient in the markup must be in the visible ingredient list, with the same amounts.
- Same method. Steps in the markup should match the visible steps in number and order.
- Same times and servings. If the recipe card says 45 minutes and serves 6, the markup
should say
PT45Mand 6. - One recipe per block. A page with two recipes (a cake and its icing) can mark up both, each in its own Recipe, only if both are full recipes on the page.
- Ratings visible. If the markup has an aggregateRating, the page must show the rating and let readers leave one.
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
- One recipe source. Let the recipe card plugin output Recipe, and switch off Recipe output in the theme and any SEO plugin.
- Make the image compulsory. Do not publish a recipe post without a featured image.
- Store times as numbers. Keep minutes as numbers in the recipe card and let it write the ISO 8601 durations, so no one types "about an hour" into the markup.
- Watch the Recipes report. Search Console emails you when new Recipe errors appear. Treat those emails as a to-do list.
- Test after updates. Re-run the Schema Debugger on one recipe after every plugin or theme update.
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.
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 โ