Out of curiosity, does your system use a NoSQL database?
> Right - and what happens when you raise or lower your prices?
The billing table has "CustomerID, ResourceID, HourID, Units, SKU_ID" columns. You raise or lower your prices on the hour boundaries. The new rows inserted after the price change will have the new SKU ID with the new costs.
Irrespective of when you send an invoice to the customer, the report simply does a "GROUP BY" over the (CustomerID, ResorceID, SKU_ID) columns and some range of the HourID column. You sum up the Units * SKU_ID.UnitCost value, or whatever.
This isn't exactly rocket science for any normal database engine.
I suspect the error people are making is not recording the change-of-billing-model as a "slowly changing dimension", and instead trying to do complicated rules-engines in code...