Preheat the oven to 350°F. Generously spray a large sheet pan with cooking spray.
In a large bowl, combine all the meatball ingredients. Season to taste (I add 1/4 teaspoon salt). Mix gently with your hands until evenly combined—don’t overmix.
Roll the mixture into tablespoon-sized balls (about 1 inch in diameter; you’ll get around 45 meatballs) and arrange them spaced out on the prepared sheet pan. Spray the tops generously with cooking spray. Bake for 17 minutes, flip, and bake for another 5 minutes. Set aside.
In a large pot or Dutch oven, heat olive oil over medium heat. Add onions, carrots, celery, garlic, and salt and pepper (I add 1/4 teaspoon each). Cook, stirring often, until the vegetables are soft and fragrant, about 10 minutes. Don’t rush this step—it builds the base flavor and you don't want crunchy veggies in the soup!
Pour in the chicken broth and bring to a boil. Add pasta and cook uncovered for 2 minutes less than the package directions.
Reduce heat to low and add spinach and cooked meatballs. Simmer until the spinach is wilted and the meatballs are warmed through. Add more broth if you prefer a thinner soup. Taste and adjust seasoning as needed.
Ladle into bowls and top with freshly grated Parmesan. Serve with warm crusty buttered bread if desired.
Video
Notes
Note 1: The secret to this soup is the Parm! Always use refrigerated Parmesan—never the shelf-stable kind (it’s not real cheese!). Go for good-quality grated Parmesan with a sandy texture for the best flavor and perfect saltiness.Note 2: A good chicken broth makes a huge difference in flavor. I recommend using Swanson®.Storage: Store leftovers in an airtight container for 3–4 days. The pasta will keep soaking up liquid, so use a wire skimmer to remove it and store it separately from the broth.