In a large Dutch oven or heavy pot, cook the Italian sausage over medium-high heat, breaking it up with a spoon, until browned and cooked through (about 8 minutes). Remove and set aside.
In the same pot, add olive oil if needed. Sauté the onion, carrots, and celery for 6-7 minutes until softened.
Add the garlic and cook for 1 minute until fragrant.
Return the sausage to the pot along with the cannellini beans, crushed tomatoes, chicken broth, Italian seasoning, basil, red pepper flakes (if using), and bay leaves.
Bring to a boil, then reduce heat and simmer uncovered for 20-25 minutes, stirring occasionally, until the flavors meld together beautifully.
Stir in the fresh spinach and cook for 2-3 minutes until wilted.
Remove bay leaves and season with salt and pepper to taste. Serve in bowls topped with grated Parmesan cheese and crusty bread on the side for dipping!