Soups & Stews
This tomato fish soup recipe delivers the perfect balance of rich, aromatic broth and tender fish, all simmered in one pot for hands-off ease. I first made it during a rainy Boston evening when I needed a comforting yet elegant dish that didn’t require hours in the kitchen.
The secret lies in building layers of flavor—starting with a deep tomato base, then adding fish that melts into the broth while keeping its delicate texture.
The beauty of this recipe is its versatility—it works with firm white fish like cod or haddock, or even sustainable options like pollock. I use a blend of crushed tomatoes and fresh garlic for depth, then let the spices bloom before adding the fish. The result?
A soup that’s creamy without dairy, packed with umami from the tomato and a subtle kick from red pepper flakes. It’s the kind of dish that tastes even better the next day, making it perfect for meal prep or feeding a crowd.
What you’ll end up with is a bowl of golden, fragrant soup where flaky fish pieces float in a velvety tomato broth, garnished with fresh herbs. The aroma alone will have everyone gathered around the table, and the first sip delivers that perfect harmony of sweet, savory, and slightly spicy.
This isn’t just a soup—it’s a restaurant-quality meal you can make at home, even on a weeknight.
Serve it with crusty bread to soak up every last drop of that flavorful broth, or pair it with a simple green salad for balance. The best part? Leftovers reheat beautifully, so you’ll have dinner covered for days. Let’s get started—this soup is worth every minute of simmering time.
Ingredients for tomato fish soup
Pantry staples meet fresh fish for a soup that tastes like a hug in a bowl.
| Ingredient | Amount | Notes |
|---|---|---|
| White Fish Fillets 🐟 | 1 ½ lb | Cod, haddock, or pollock preferred |
| Crushed Tomatoes 🍅 | 2 cups | San Marzano preferred for sweetness |
| Garlic Cloves 🧄 | 4 cloves | Freshly minced for bold flavor |
| Yellow Onion 🧅 | 1 medium | Diced, yellow or red variety |
| Carrots 🥕 | 2 medium | Diced, baby carrots work too |
| Celery Stalks 🥬 | 2 whole | Diced, for classic mirepoix |
| Extra-Virgin Olive Oil 🫒 | ¼ cup | For sautéing vegetables |
| Dry White Wine 🍷 | ½ cup | Sauvignon Blanc preferred |
| Fish Stock 💧 | 2 cups | Homemade or high-quality store-bought |
| Canned Diced Tomatoes 🍅 | 1 can | 14.5 oz can, for extra thickness |
| Red Pepper Flakes 🌶️ | ½ tsp | Adjust for spice preference |
| Dried Oregano 🍃 | 1 tsp | Or 1 tbsp fresh chopped |
| Salt 🧂 | 1 ½ tsp | Kosher or sea salt |
| Black Pepper 🌶️ | ½ tsp | Freshly ground preferred |
| Fresh Parsley 🌿 | ¼ cup | Chopped, for garnish |
The fish is the star, so grab firm white fillets like cod or haddock—they hold up best to simmering. Whole Foods or local seafood markets usually have the freshest cuts, but don't stress if you grab frozen—just thaw it in the fridge overnight. For the tomatoes, San Marzano cans make all the difference—they're sweeter and less acidic. If you can't find them, any good-quality crushed tomatoes work, but you might need to add a pinch of sugar to balance the acidity. The garlic? Freshly minced is non-negotiable here—jarred garlic won't cut it for this dish.
No white wine? Fish stock with a splash of lemon juice works perfectly—just add an extra tablespoon of lemon. Short on fresh parsley? Dried parsley at one-third the amount gets you close, though fresh is always better. The carrots and celery can be swapped for frozen mirepoix mix if you're in a pinch, but fresh veggies give that home-cooked feel. For the fish stock, low-sodium versions are better since you'll be adding plenty of salt later. And if you're feeling fancy, add a pinch of smoked paprika with the red pepper flakes for extra depth.
This soup tastes even better the next day—honestly, the flavors meld together beautifully. Keeps 4-5 days in the fridge, so make a big batch and freeze portions for quick meals later. I like to portion it into glass containers so it reheats evenly. The fish will flake apart completely when reheated, making it perfect for lunchboxes or meal prep. If you're serving it immediately, garnish with fresh parsley and a drizzle of extra-virgin olive oil—trust me, it makes all the difference.
Why You'll Love This Recipe
- I swear by this rule: if it’s not on my shelf, I’m not buying it. Crushed tomatoes, onion, garlic, carrots—these are the basics I always have. The fish? You can grab whatever’s on sale. That’s real budget-friendly.
- I’ll be real: most soups turn sad after day two. Not this one. The fish stays tender, the tomatoes deepen in flavor, and the broth? Even better the next day. Freeze half, and you’ve got a 10-minute meal when you’re desperate.
Step-by-step instructions for tomato fish soup
This rich, aromatic tomato fish soup delivers bold Mediterranean flavors in one simple, satisfying pot.
Sauté the Vegetable Base
Heat the 0.25 cup extra-virgin olive oil in a large pot over medium heat. Add the diced 1 medium yellow onion, 2 medium carrots, and 2 whole celery stalks, stirring occasionally for 5-6 minutes until the vegetables soften and begin to release their natural sweetness. You'll notice the onions turn translucent and the carrots develop a slight caramelization at the edges.
Add the 4 cloves minced garlic cloves and cook for another 30 seconds until fragrant. This aromatic foundation forms the flavor backbone of your soup. If you smell the garlic burning, reduce the heat slightly—it should sizzle gently, not smoke. Keep the vegetables finely chopped so they dissolve into the soup rather than remaining as distinct pieces.
Build the Tomato Sauce
Pour in the 2 cups crushed tomatoes and 1 can canned diced tomatoes (with juices), scraping up any browned bits from the bottom of the pot. Stir in the 1.5 tsp salt, 0.5 tsp black pepper, 1 tsp dried oregano, and 0.5 tsp red pepper flakes. Bring the mixture to a gentle simmer over medium-low heat and let it cook uncovered for 10-12 minutes until the tomatoes break down and the sauce thickens slightly.
Here's where the magic happens: the tomatoes should reduce enough to coat the back of a spoon but still maintain a vibrant red color. Taste and adjust seasoning—you want a balance of sweetness from the tomatoes, heat from the red pepper flakes, and earthiness from the oregano. This is your chance to tweak the flavor profile before adding the fish, so don't be shy about adding more salt or pepper if needed.
Deglaze and Add Liquid
Pour in the 0.5 cup dry white wine and let it simmer for 3-4 minutes until mostly evaporated. The alcohol will cook off, leaving behind concentrated flavor. Add the 2 cups fish stock and bring the entire mixture to a gentle boil. Reduce heat to low and let it simmer uncovered for 10 minutes, allowing the flavors to meld together.
This simmering step is crucial—it develops the depth of flavor in your soup. You'll notice the soup becomes more aromatic as the vegetables release their essence into the liquid. If the soup seems too thick, add a splash of water or more fish stock to reach your desired consistency. The soup should be smooth but still have body, not watery.
Cook the Fish to Perfection
Gently add the 1.5 lb white fish fillets to the simmering soup. The fish should be arranged in a single layer, not crowded. Simmer uncovered for 8-10 minutes until the fish is just cooked through and flakes easily with a fork. You'll know it's done when the fish turns opaque and pulls apart with gentle pressure—it should never be rubbery or dry.
Here's the thing about fish in soups: it cooks quickly and can become tough if overcooked. I like to check for doneness by gently lifting a piece with a slotted spoon—it should separate into flakes with minimal resistance. If the soup seems too thin after adding the fish, you can remove the fish and reduce the soup by 5 minutes to thicken it slightly before returning the fish to warm through.
Finish and Serve
Remove the pot from heat and stir in the 0.25 cup chopped fresh parsley. Let the soup rest for 5 minutes to allow the flavors to settle. This final step brightens the soup with fresh herbs and gives you a chance to taste and adjust seasoning one last time. The parsley should be distributed evenly throughout the soup, adding a pop of color and freshness.
Ladle the soup into bowls and serve immediately. Each spoonful should deliver a perfect balance of rich tomato flavor, tender fish, and aromatic vegetables. The soup should be hot but not scalding, with the fish maintaining its delicate texture. For extra flavor, serve with crusty bread to soak up every last drop of that delicious broth!
Pro Tips For Making Tomato Fish Soup
- Sweat the Onion First: I used to toss everything in raw, and the soup would taste like a sad stew. Slice the onion thin, cook it in olive oil over medium-low heat until it’s translucent and just starting to caramelize—about 5 minutes. That sweet, soft base makes the whole dish sing.
- Crush Tomatoes by Hand: Canned crushed tomatoes work, but nothing beats the texture of tomatoes you actually crush yourself. Drain a can of whole peeled tomatoes, then smash them with your fist (wear a glove if you’re squeamish). The bigger chunks hold up better in cooking, and the sauce stays chunkier—way more flavorful than the mushy canned version.
- Add Fish Late, Keep Heat Gentle: Fish cooks in a flash, and if you drop it in too early, it’ll turn to rubber. Wait until the onions, garlic, and carrots are tender (about 8-10 minutes in), then add the crushed tomatoes and simmer for 5 more minutes. Slide the fish in just as the soup comes to a gentle simmer—no boiling—and cook for 3-4 minutes max.
- Deglaze with a Splash of Wine: After browning the onions and garlic, resist the urge to jump straight to the tomatoes. Pour in ¼ cup of dry white wine (or even a splash of broth) and let it bubble for 30 seconds. The extra depth of flavor—just a little effort—makes the soup taste like you actually put in work. (Yes, even if you’re using cheap wine.)
Troubleshooting perfect results
Fish Too Rubbery
Overcooked fish is the most common mistake, and I’ve definitely been guilty of it myself. The key is timing—fish in soup cooks in 8-10 minutes max once added. If your fish turns rubbery, it’s already been in too long.
Next time, use a thermometer (I swear by the ThermoWorks Thin Cook) and aim for an internal temp of 145°F. Also, never crowd the pot—give the fish space to cook evenly. 🌡️
Broth Too Thin
If your soup ends up watery, it’s usually because the tomatoes didn’t reduce enough or you added too much liquid. My trick? Simmer the tomato base uncovered for 15-20 minutes before adding the fish stock.
You can also remove the fish, reduce the soup by 5 minutes, then return the fish to warm through. For extra body, stir in 1 tbsp cornstarch mixed with 2 tbsp water at the end and simmer for 2 minutes.
Vegetables Still Crunchy
If your carrots and celery remain tough, they didn’t cook long enough. The veggies should soften completely—about 15-20 minutes total simmering time before adding fish. For extra insurance, chop them smaller than ¼ inch so they dissolve into the broth.
If you’re short on time, swap fresh veggies for frozen mirepoix mix, which cooks faster and still delivers great flavor.
Fish Falling Apart Too Soon
If your fish disintegrates before you’re ready to serve, it was likely overcooked or too delicate to begin with. Stick to firm white fish like cod or haddock—they hold up best. For extra stability, add the fish in the last 5-8 minutes of cooking.
If you’re using frozen fish, thaw it thoroughly in the fridge first. The last thing you want is a bowl of tomato-flavored fish water! 🐟
Tomato Flavor Missing
If your soup tastes bland, the tomatoes likely didn’t develop enough flavor. Always use San Marzano crushed tomatoes for sweetness, and let them simmer uncovered for 10-12 minutes before adding wine or stock.
For extra depth, add 1 tsp sugar to balance acidity or a pinch of smoked paprika for complexity. Taste as you go—this is where most home cooks miss the mark!
Soup Too Acidic
If your soup tastes sharp, it’s probably from the tomatoes or wine. Balance it with ½ tsp sugar or a splash of lemon juice (about 1 tbsp). For a richer flavor, stir in 1 tbsp tomato paste at the end.
I’ve also had success adding a pinch of baking soda (just ⅛ tsp) to neutralize acidity—it’s a pro trick I learned from my Nonna. Just don’t overdo it!
Nutrition facts
Frequently asked questions
What type of fish works best for this tomato soup?
Firm white fish like cod, haddock, or pollock hold up perfectly in the broth. Avoid delicate varieties like flounder—they'll fall apart too quickly. For a richer flavor, try sustainable options like mahi-mahi or even shrimp in the last 5 minutes of cooking.
Can I make this soup without wine?
Use fish stock with 1 tbsp lemon juice instead of white wine. The acidity will still brighten the tomatoes. For extra depth, add ½ tsp sugar to balance any tartness from the tomatoes.
How do I store leftovers?
Transfer to airtight containers and refrigerate for up to 4-5 days. The flavors actually improve overnight! For longer storage, freeze portions for 3 months. Reheat gently on low heat—never microwave directly from frozen.
Is this soup gluten-free?
Yes, as written! Just ensure your fish stock and tomatoes are certified gluten-free. For extra richness, stir in 1 tbsp cornstarch mixed with water at the end if you prefer a thicker texture.
What if I don't have fresh parsley?
Use dried parsley (⅓ the amount) or swap for basil or cilantro for a different flavor profile. If you're out of all herbs, a pinch of smoked paprika adds warmth instead.
