Quick Recipe Version (TL;DR)
Quick Ingredients
- 2 lb (900 g) russet or Yukon Gold potatoes, peeled and chunked
- 4 tbsp (56 g) unsalted butter
- 1/2 cup (120 ml) whole milk, warmed
- 1/4 cup (60 g) sour cream
- 1 large egg yolk
- Kosher salt and black or white pepper
- 1 1/2 lb (680 g) 85–90% lean ground beef
- 1 tbsp olive oil
- 1 large onion, finely diced
- 2 medium carrots, diced small
- 2 cloves garlic, minced
- 1 1/2 tbsp all-purpose flour
- 1 tbsp tomato paste
- 2 tbsp Worcestershire sauce
- 1 cup (240 ml) low-sodium beef stock
- 1 tsp fresh thyme (or 1/2 tsp dried), 1 bay leaf
- 1 cup (130 g) frozen peas
- Chopped parsley, optional; 1/2 cup (56 g) shredded sharp cheddar, optional
Do This
- 1. Heat oven to 400°F (200°C). Grease a 2-quart baking dish.
- 2. Boil potatoes in salted water 15–20 minutes until tender; drain and steam off moisture.
- 3. Brown beef in a large skillet over medium-high heat; drain excess fat.
- 4. Sauté onion, carrots, and garlic; stir in flour and tomato paste, then Worcestershire, stock, thyme, and bay. Simmer 8–10 minutes; add peas.
- 5. Mash potatoes with butter, warm milk, sour cream, yolk, salt, and pepper until smooth.
- 6. Layer beef mixture in dish; top with mash, rake peaks; add cheddar if using. Bake 20–25 minutes until bubbling and golden. Rest 10 minutes, garnish, serve.
Why You’ll Love This Recipe
- Classic comfort: rich, savory beef in a glossy gravy under buttery, crisp-tipped potatoes.
- Weeknight-friendly method: make the filling while the potatoes boil.
- Balanced flavors: Worcestershire, tomato paste, and thyme add depth without fuss.
- Flexible: easy swaps for gluten-free, lamb, or extra veg.
Grocery List
- Produce: Potatoes, onion, carrots, garlic, thyme, parsley (optional), bay leaf, frozen peas
- Dairy: Butter, whole milk, sour cream, egg, sharp cheddar (optional)
- Pantry: Ground beef, olive oil, tomato paste, Worcestershire sauce, low-sodium beef stock, all-purpose flour, kosher salt, black or white pepper
Full Ingredients
Beef Filling
- 1 1/2 lb (680 g) ground beef, 85–90% lean
- 1 tbsp olive oil
- 1 large yellow onion, finely diced (about 1 1/2 cups / 200 g)
- 2 medium carrots, diced small (about 1 cup / 130 g)
- 2 cloves garlic, minced
- 1 1/2 tbsp all-purpose flour
- 1 tbsp tomato paste
- 2 tbsp Worcestershire sauce
- 1 cup (240 ml) low-sodium beef stock
- 1 tsp fresh thyme leaves or 1/2 tsp dried thyme
- 1 bay leaf
- 1 cup (130 g) frozen peas
- 3/4 tsp kosher salt, plus more to taste
- 1/2 tsp freshly ground black pepper
Buttery Potato Topping
- 2 lb (900 g) russet or Yukon Gold potatoes, peeled and cut into 1 1/2-inch chunks
- 1 tbsp kosher salt for the boiling water
- 4 tbsp (56 g) unsalted butter
- 1/2 cup (120 ml) whole milk, warmed
- 1/4 cup (60 g) sour cream
- 1 large egg yolk
- 3/4 tsp kosher salt (for the mash), or to taste
- 1/4 tsp white pepper (or black pepper)
- Optional: 1/2 cup (56 g) shredded sharp cheddar for the top
To Finish
- Chopped fresh parsley or chives, for garnish (optional)

Step-by-Step Instructions
Step 1: Preheat and prep the dish
Heat the oven to 400°F (200°C). Lightly grease a 2-quart baking dish (about a 9-inch square or similar). Fill a large pot with water, add 1 tablespoon kosher salt, and bring to a boil for the potatoes.
Step 2: Boil and dry the potatoes
Add the potato chunks to the boiling water and cook 15–20 minutes until very tender when pierced with a fork. Drain well, then return the potatoes to the hot pot and let them steam-dry for 1–2 minutes. This step keeps the mash fluffy, not watery.
Step 3: Brown the beef deeply
While the potatoes cook, heat a large skillet (12-inch) over medium-high. Add the olive oil and the ground beef. Cook, breaking it up, until well browned with crispy edges, 5–7 minutes. Spoon off excess fat, leaving about 1 tablespoon in the pan. Season with a pinch of salt and pepper.
Step 4: Build the savory gravy
Add the onion and carrots to the beef and cook, stirring, until the onion is translucent and the carrots start to soften, 5–6 minutes. Stir in the garlic and cook 30 seconds. Sprinkle over the flour and stir for 1 minute. Add the tomato paste and cook another 30 seconds to caramelize. Pour in Worcestershire and beef stock; add thyme and bay leaf. Scrape up browned bits and bring to a lively simmer. Cook 8–10 minutes until thick, glossy, and spoon-coating. Stir in the peas. Remove and discard the bay leaf. Taste and season with salt and pepper as needed.
Step 5: Make the buttery mash
To the hot potatoes, add the butter and mash until mostly smooth. Stir in the warm milk and sour cream until creamy. Mix in the egg yolk, salt, and pepper until silky and well combined. The mash should be spreadable; add a splash more warm milk if needed.
Step 6: Assemble and rake peaks
Spread the beef mixture evenly in the prepared baking dish. Dollop the potatoes over the top, then gently spread to the edges to seal in the filling. Use a fork to rake ridges across the surface—these peaks turn golden and crisp in the oven. If using, scatter the cheddar over the top. Place the dish on a rimmed sheet pan to catch any bubbles.
Step 7: Bake, rest, and serve
Bake 20–25 minutes, until the edges are bubbling and the top is lightly golden. For extra color, broil for 1–2 minutes, watching closely. Let rest 10 minutes to set, then garnish with parsley or chives. Serve warm.
Pro Tips
- Steam-dry the potatoes after draining to avoid watery mash that slides off the filling.
- Brown the beef well; deep browning = deeper flavor in the final gravy.
- Rake the potato topping with a fork—more ridges mean more crispy browned bits.
- Seal the mash to the dish edges to keep the gravy from bubbling up and drying out.
- If the filling seems thin, simmer a few extra minutes before assembling; it should be thick and glossy.
Variations
- Shepherd’s Pie: Swap the beef for ground lamb and add a pinch of rosemary with the thyme.
- Stout-Boosted: Replace 1/2 cup (120 ml) of the stock with stout beer; simmer well to cook off alcohol and concentrate flavor.
- Gluten-Free: Use 1 tbsp cornstarch mixed with 2 tbsp cold stock; stir in at the end and simmer 1–2 minutes until thick.
Storage & Make-Ahead
Refrigerate leftovers in an airtight container up to 4 days. Reheat at 350°F (175°C), covered, for 20–25 minutes, or microwave individual portions until hot. Make-ahead: Assemble up to 24 hours in advance, cover, and refrigerate; bake straight from the fridge at 400°F (200°C) for 25–30 minutes. Freeze unbaked (tightly wrapped) up to 2 months; bake from frozen at 375°F (190°C), covered, 45 minutes, then uncover 15–20 minutes to brown. You can also freeze baked leftovers; thaw overnight and reheat at 350°F (175°C) 25–30 minutes.
Nutrition (per serving)
Approx. 550 calories; 27 g protein; 36 g carbohydrates; 33 g fat; 4 g fiber; 870 mg sodium. Values are estimates and will vary with optional cheese and exact ingredients.
