I would say that it depends, it's not really a YES or NO answer ...
If you want to make analysis on your full population of customers all the time (and not miss those without transactions) creating FACT rows for all of them will make your life easier.
If on the other hand you mainly do analysis on customers with transactions and you just want to know, for example, how many customers don't have a single transaction for the month XX then you can also stay without the "empty" rows in your FACT table and work with outer joins to get the list of customers without transactions.
That's why it's difficult to answer with a YES or NO, everything is possible as you can model things in a way to get your information (for example think about making your D1 Customers a fact table as well with an outer join on the Fact transaction table and adding a condition where transaction is null and you get all your customers without transactions ....
I would implement a fact table that just contains the transactions that happen for customers (i.e. your couple of thousand of transactions per month vs. your 9 million "customers"). Then you can create metrics which show the transactions by month, or you can create a "life to date" type metric that would sum over time. That way, if you only want to see the transactions that happened in a month it's super easy, but if you want to see total spend by customer over their lifetimes you could still see that also (without having to insert tons of "empty" fact records).
Hope this helps,