The second reason is you can't put a price on a project like an Office 365 migration. At least I can't afford to without knowing a lot of details about the environment.
I'm not sure you need to price something specific like that.
You might list something like
Cisco firewall support $200/hr
Windows desktop support $100/hr
Unifi hardware support $150/hr
But really, should an O365 migration be a project price and not hourly? You'd have to make the project price significantly more than the anticipated hourly to cover your bases in case there are issues.
If you do enough of them you can flat scope them on a base time Plus xxx per mailbox (knowing they average out). Write your scope to assume health AD and exchange, and list the first 4 hours as discovery. If it’s messy you can throw a scope amendment to fix the environment.