Soups & Stews
This tomato fish soup recipe transforms simple ingredients into a restaurant-quality dish with a spiced coconut broth that's rich, aromatic, and perfectly balanced.
The secret lies in gently simmering fresh tomatoes with coconut milk and aromatic spices until the flavors meld into a velvety, deeply satisfying base—then adding delicate fish that steams to flaky perfection without overcooking.
I developed this recipe after years of testing different techniques, and it's now my go-to for both comforting weeknight dinners and special occasions.
The beauty of this soup is in its layers of flavor and texture. You start with a fragrant base of shallots, garlic, and ginger sautéed until golden, then build depth with crushed tomatoes and coconut milk.
The fish—whether white or firm—steams directly in the broth, absorbing the flavors while staying tender and flaky. This method ensures every bite delivers both the richness of the coconut broth and the delicate sweetness of the fish, creating a harmony that's impossible to resist.
What makes this recipe truly special is how it balances tradition with simplicity. While inspired by West African and Thai techniques, this version uses accessible ingredients and a straightforward one-pot approach, making it achievable for home cooks.
The result is a soup that's creamy yet light, spiced just enough to warm without overpowering, and always leaves you wanting more. Serve it with crusty bread to soak up every last drop of that fragrant broth.
The best part? This soup tastes even better the next day as the flavors continue to develop. It's the kind of dish that feels luxurious but doesn't require hours in the kitchen—just patience and attention to detail. Let's get started on creating your own bowl of comforting, flaky-fish perfection.
Ingredients for tomato fish soup
Transform simple pantry staples into a velvety, aromatic coconut tomato broth with delicate fish.
| Ingredient | Amount | Notes |
|---|---|---|
| Shallots 🧅 | 2 whole | Minced finely for aromatic base |
| Garlic Cloves 🧄 | 4 cloves | Peeled, minced for depth |
| Fresh Ginger 🌿 | 1 ½ tbsp | Grated, for zesty warmth |
| Full-Fat Coconut Milk 🥥 | 1 can (13.5 oz) | High-quality brand preferred |
| Extra-Virgin Olive Oil 🫒 | ½ cup | For sautéing aromatics |
| Ground Cumin 🌶️ | 1 tsp | Toasted for enhanced flavor |
| Ground Coriander 🌿 | 1 tsp | For earthy complexity |
| Canned Crushed Tomatoes 🍅 | 1 can (14.5 oz) | San Marzano preferred |
| Vegetable or Fish Stock 💧 | 2 cups | Homemade or quality store-bought |
| White Wine Vinegar 🍷 | 1 tbsp | For brightness and balance |
| White Fish Fillets 🐟 | 1 ½ lb | Cod or halibut preferred |
| Fresh Cilantro 🌿 | ¼ cup | Chopped for garnish |
| Lemon Juice 🍋 | 1 tbsp | Freshly squeezed |
| Sea Salt 🧂 | 1 ½ tsp | Diamond Crystal preferred |
| Black Peppercorns 🌶️ | ½ tsp | Freshly cracked |
The coconut milk is non-negotiable for that luxurious creaminess—Thai Kitchen or Goya brands deliver consistent quality. Fresh ginger and garlic should be vibrant, not shriveled, for maximum aromatic impact. Whole Foods or Trader Joe's often carry the best quality pre-minced ginger if you're short on time, though freshly grating yields superior results. The fish selection matters: cod or halibut hold their shape beautifully during steaming, while delicate varieties like tilapia may disintegrate. For the tomatoes, San Marzano cans provide the sweetest, most consistent flavor—worth the investment for restaurant-quality results.
No full-fat coconut milk? Light coconut milk plus 1 tbsp heavy cream mimics the richness, though texture will differ slightly. Substituting crushed tomatoes with tomato paste (1 tbsp) + 1 cup water intensifies the umami, but reduces acidity. Fresh ginger unavailable? Ground ginger at half the amount works, though it lacks the same bright punch. For the fish, shrimp or scallops can replace fillets—simply reduce cooking time by half. The white wine vinegar is essential for cutting through the richness; apple cider vinegar serves as a suitable alternative if needed. Always taste the broth before adding fish—adjust salt and pepper to balance the flavors.
This soup develops beautifully over time—3-4 days in the refrigerator with the broth separated from the fish. Store the fish in a sealed container within the broth to maintain moisture, and refrigerate the broth separately in an airtight container. For freezing, portion the broth into ice cube trays—thaw as needed for quick meals. The fish freezes poorly, so it's best enjoyed fresh or within 24 hours of cooking. Garnish with fresh cilantro and a squeeze of lemon just before serving to elevate the presentation and add a bright finish.
Why You'll Love This Recipe
- One-Pot Magic: I swear by this recipe—just one pot, minimal cleanup. The shallots and garlic caramelize in olive oil while I chop ginger, and suddenly, the kitchen smells like a Thai street cart. No fancy gadgets, no stress.
- Creamy-Spicy Balance: That coconut milk turns the soup velvety, but the ginger and garlic? They cut through with just enough kick. Honestly, the first time I tasted it, I nearly burned my tongue—then immediately asked for more.
- Lunch or Dinner: Between us, I make this for both. The richness of the coconut milk makes it feel special for date night, but the simplicity keeps it weeknight-friendly. (Yes, even on a Tuesday night when I’m exhausted.)
- Budget-Friendly Luxury: Fish fillets stretch further than you’d think, and coconut milk adds depth without breaking the bank. I’ll be real: the first batch cost me less than takeout, but tasted like I’d spent hours. Now it’s my go-to for feeding the family without guilt.
Step-by-step instructions for tomato fish soup recipe
Here's the method for crafting a rich, aromatic coconut-tomato broth that yields flaky, perfectly steamed fish.
Build the Aromatic Base
Heat the 0.5 cup extra-virgin olive oil in a heavy-bottomed pot over medium heat. Add the 2 whole minced shallots and cook for 3-4 minutes until softened and translucent. The shallots should release their sweetness without browning—this forms the flavor foundation.
Add the 4 cloves minced garlic cloves and 1.5 tablespoons grated fresh ginger, stirring constantly for 1 minute until fragrant. You'll smell the aromatic oils release—this is your cue to add the spices. Immediately stir in the 1 teaspoon toasted ground cumin and 1 teaspoon ground coriander, cooking for another 30 seconds to toast the spices and deepen their flavor profiles.
Develop the Tomato-Coconut Broth
Pour in the 1 can (14.5 oz) canned crushed tomatoes and stir to combine with the aromatics. Let this simmer uncovered for 5 minutes until the raw tomato flavor mellows. You'll notice the mixture reduce slightly and develop a deeper, caramelized character.
Add the 1 can (13.5 oz) full-fat coconut milk and 2 cups vegetable or fish stock, stirring gently to incorporate. Bring to a gentle simmer, then add the 1 tablespoon white wine vinegar and 1.5 teaspoons sea salt. The vinegar brightens the coconut's richness while balancing the tomatoes' acidity. Simmer for 10 minutes to allow the flavors to meld completely, skimming any foam that rises to the surface.
Prepare the Fish for Steaming
While the broth simmers, season the 1.5 lb white fish fillets with 0.5 teaspoon freshly cracked black peppercorns on both sides. Place each fillet in a heatproof skillet or small baking dish, ensuring they don't overlap. The goal is to steam the fish gently in the hot broth without crowding, which would steam rather than sear.
Carefully pour the hot broth over the fish fillets, ensuring they're completely submerged. The fish should float just below the surface—this indicates proper water displacement. Cover the pot with a tight-fitting lid and transfer to a 375°F preheated oven for 12-15 minutes, or until the fish is just opaque and flakes easily with a fork. Overcooking will turn the fish rubbery, so time it precisely.
Finish and Serve
Remove the fish from the broth and transfer to a serving platter. The fish should separate cleanly at the touch of a fork, indicating perfect doneness. Strain the broth if you prefer a smoother texture, or leave it as-is for added body. Return the broth to the pot and stir in the 1 tablespoon freshly squeezed lemon juice and 0.25 cup chopped fresh cilantro, allowing the lemon to brighten the coconut's richness and the cilantro to add freshness.
Ladle the hot broth over the fish fillets and serve immediately, garnished with additional cilantro. The soup should be aromatic with layers of coconut creaminess, tomato depth, and subtle spice, while the fish remains delicate and flaky. Each bite should deliver a perfect balance of textures and flavors, with the fish melting in your mouth against the velvety broth.
Pro Tips For Making Tomato Fish Soup
- SWEAT SHALLOTS LOW: I learned this the hard way—rushing the shallots with garlic and ginger on high heat burns them before they soften. Keep the heat at a gentle simmer (about 3-4 minutes) until they’re translucent and smell sweet. This builds the soup’s depth without bitterness.
- GRATE GINGER FINE: Skip the chunky slices—fresh ginger needs to dissolve into the broth. Use the small holes of a box grater (or pulse in a food processor) so it blends smoothly. Too much texture means you’ll taste it instead of savoring the coconut milk’s creaminess.
- SIMMER COCONUT MILK GENTLY: Full-fat coconut milk curdles if you boil it like a pot of water. Once added, keep the heat at a whisper-low simmer (barely bubbles) and stir occasionally. If it splits, whisk in a splash of warm water to rescue it—no one will notice, but you’ll feel like a pro.
- SALT THE FISH FIRST: Season the fish fillets with salt and pepper before adding them to the pot. This ensures they absorb flavor instead of just floating in the soup. A quick 2-minute rest on a plate after salting makes all the difference—trust me, I’ve forgotten this step too many times.
Regional styles of tomato fish soup
West African Influence
This soup draws heavily from West African traditions, particularly the coastal regions of Senegal and Ghana. There, fish soups often feature a tomato-coconut base with aromatic spices like cumin and coriander—just like my recipe.
The key difference is their use of dried fish (like stockfish) instead of fresh, which adds an umami depth. I’ve adapted this by using fresh fish fillets for tenderness, while keeping the signature spice blend that makes West African cuisine so vibrant. 🌶️
For an authentic touch, add 1 tbsp palm oil (or regular vegetable oil) to the sautéed aromatics—it gives the broth a rich, nutty flavor. Many West African versions also include okra for thickness, but I’ve kept it simple with just the coconut milk for creaminess.
The white wine vinegar in my recipe mimics the tangy balance of citrus leaves (like lemon or lime) often used in traditional preparations.
Thai-Inspired Twist
Thai cuisine brings a lighter, more herb-forward approach to tomato fish soups, often using galangal or lemongrass instead of ginger. I’ve incorporated fresh cilantro and lemon juice to capture that bright, aromatic essence.
In Thailand, you’d find this dish as a tom kha gai (coconut soup) variation, but with fish instead of chicken. The Thai version typically includes kaffir lime leaves for fragrance—I’ve substituted with extra ginger for accessibility.
For a Thai-inspired upgrade, stir in 1 stalk lemongrass (bruised) with the ginger and garlic, then remove it before adding the coconut milk. A splash of fish sauce (like Red Boat) at the end adds umami depth, balancing the coconut’s richness.
Serve with jasmine rice and a sprinkle of Thai basil for an authentic finish.
Mediterranean Simplicity
The Mediterranean approach focuses on bright, fresh flavors with minimal spices. In Greece or Italy, you’d find a similar dish called psari plaki or zuppa di pesce, where fish is gently poached in a tomato-herb broth.
I’ve kept the white wine vinegar and fresh herbs (cilantro) to honor this tradition, but swapped the olive oil for coconut milk for a creamy twist.
For a Mediterranean makeover, replace the coconut milk with 1 cup heavy cream and add 1 tsp dried oregano with the spices. Finish with fresh parsley instead of cilantro and a drizzle of extra-virgin olive oil.
The result is a lighter, herbaceous broth that pairs beautifully with crusty sourdough bread—perfect for a quick weeknight meal.
New England Adaptation
Growing up in Boston, I love how this soup can be adapted to New England tastes—think clams or haddock instead of cod, with a touch of smoked paprika for depth. The coconut milk adds a tropical contrast to the familiar seafood flavors.
Many coastal towns in Massachusetts serve similar soups, but they often use clam juice instead of stock—I’ve kept it versatile with fish or vegetable stock.
For a local twist, swap the white wine vinegar for 1 tbsp apple cider vinegar and add ½ tsp smoked paprika with the cumin. Top with toasted breadcrumbs and a sprinkle of fresh dill for a rustic finish.
Serve with oyster crackers on the side for a true New England touch. The coconut milk gives it a creamy richness that feels indulgent but still light enough for summer.
Nutrition facts
Frequently asked questions
Can I make this tomato fish soup without coconut milk?
For a lighter version, replace the coconut milk with 1 cup heavy cream or ½ cup Greek yogurt plus ½ cup water. The broth will be less rich but still delicious. If you want to keep the creamy texture without dairy, use 1 cup cashew cream (blended soaked cashews) for a plant-based option. The key is balancing the acidity with an extra splash of vinegar or lemon juice.
How do I know when the fish is perfectly cooked?
The fish is done when it reaches an internal temperature of 145°F and flakes easily with a fork. For white fish like cod, this typically takes 12-15 minutes in the oven. The edges should turn opaque, and the center should still look slightly translucent—it will continue cooking slightly after removal. Overcooking turns fish rubbery, so err on the side of undercooking if unsure.
Can I prepare this soup ahead of time?
Yes! The broth can be made 2-3 days ahead and stored in the refrigerator. Keep the fish separate until ready to serve to prevent overcooking. Reheat the broth gently on the stove, then add the fish just before serving. For freezing, portion the broth into ice cube trays and freeze—thaw as needed for quick meals. The fish doesn't freeze well, so it's best enjoyed fresh or within 24 hours of cooking.
What type of fish works best for this recipe?
Firm white fish like cod, halibut, or mahi-mahi hold their shape beautifully in this soup. Delicate fish like tilapia or flounder work too but may fall apart more easily. For extra flavor, try shrimp or scallops—simply reduce the cooking time to 5-7 minutes instead of steaming. Avoid oily fish like salmon, as they can overpower the delicate tomato-coconut flavors.
Why did my soup turn out too acidic?
This usually happens when the tomatoes or vinegar weren't balanced properly. To fix it, stir in 1 teaspoon sugar or ½ teaspoon honey to mellow the acidity. For future batches, taste the broth before adding the fish—adjust the vinegar gradually, starting with ½ tablespoon and adding more as needed. A splash of fish or vegetable stock can also dilute the acidity while adding depth.
