First off, you all have done an excellent job of building a robust and capable e-Commerce platform on .Net.  There really isn't anything else out there that compares.

I am working on a current implementation where we do a couple of things.

1. Integrate nopCommerce with Intacct ERP.
2. Integrate nopCommerce with Avalara for Tax Calculation

We weren't able to use any of the Avalara plugins because the implementation of the tax provider was at a card/rate level. Avalara typically wants you to send it the entire order, with origin and destination and tax-ability information on the customer and item.  It returns an order with item level tax rates.  Applying the tax at the order level in nopCommerce and at the item level in Intacct was causing issues.  I ended up writing a much deeper integration than the tax rate provider to send the whole cart to Avalara effectively.

This led me to look at the order calculation sequence a little closer and I was curious if you have considered a bit different approach. There are many instances in the calculation process where order subtotal or shipping is calculated multiple times.  For instance, it is calculated once in GetShoppingCartTotal, then again in GetTotalTax which is called by GetShoppingCartTotal.

What if a Cart class was created that had properties for all of the variable information that is created and maintained during the cart calculation process.  That information may or may not change as the card changes.  The cart is effectively a state machine. It goes through a few different states during calculation and is finally completed when it is confirmed by the customer, at that point it should be written to an order.  

It would also be much, much easier to allow for plugins that accepted a cart as an input, manipulated it, then returned it back to the overall calculation process.

Sorry if I am not explaining this well.  Let me know your thoughts.