At Root16, we’re using Dynamics 365 to manage quite a bit of our day to day operations (Sales, Account/Contact Management, Marketing and Project Management among other things) – the one thing we are not using it for (yet) is our financials, for that we’re using QuickBooks Online as that currently makes the most sense for our business.
When we initially launched Root16, these two key components of our business were completely segmented. As you can imagine, this introduced issues like double-data entry, miskeyed information and a sheer lack of efficiency (which drives us nuts) – as a result, we started looking into options around how we could integrate Dynamics with QuickBooks. There are a few solutions available in AppSource that we looked at, but what fun would that be? We wanted to see if we could create something using the tools we already had available, tailored to our exact need, and not take on additional licensing costs. Walking into this, we were fully prepared to write custom code to make this happen, but are happy to report that we were able to accomplish everything we wanted to with this integration without opening Visual Studio.
Here are the different components we used:
- QuickBooks Online API
- QuickBooks Online provides a robust API that supports OAuth 2.0 authentication.
- QuickBooks Webhooks
- We enabled the Webhooks for Create and Update of Invoices in QuickBooks to trigger a Power Automate flow that updates our invoices in Dynamics when something changes on the QuickBooks side.
- Added a Custom Connector via the Power Apps Portal
- We configured the Custom Connector from the QuickBooks Online API definition that our Power Automate flows use to communicate with QuickBooks.
- Power Automate
- The existing Common Data Service connector and our new QuickBooks Online custom connector were used in our Power Automate cloud flows to connect the two systems. other
For Root16, Dynamics serves as our system of record for customer information. For invoicing, we push data required for invoicing into QuickBooks to generate and manage our invoices, ultimately bringing said invoice and related data back into Dynamics. The following table shows the simple data mapping used for our QuickBooks integration:
Our integration kicks off when a Dynamics Opportunity is closed as ‘Won’. If this is a net-new customer, a Customer record will be created in QuickBooks via a Power Automate flow. Within that same flow, a Project record is created in Dynamics and linked to the Customer record. The Project record in Dynamics is where our consultants are tracking things like Time and Expense, specific to a given Project/Customer.
When it’s time to invoice a customer, we create a shell Invoice record linked to the Account/Project in Dynamics. The creation of the Dynamics invoice triggers a different Power Automate cloud flow that loops through all Approved time records related to the Project that fall within the defined invoice period. We then generate Invoice Line Items based on consultant rate and total hours worked. These records are then sent to QuickBooks, which ultimately creates an Invoice. The QuickBooks Webhooks mentioned above then trigger another Power Automate flow that updates our Dynamics Invoice record with the total service amount calculated in QuickBooks, as well as other attributes like Invoice Status.
At a high-level, that’s it. Notice there are no C# code snippets or SQL up above – this was all done without custom code on the Power Platform. As someone who grew up on the software development side of the fence, I’m impressed with how much I was able to accomplish using Power Automate connectors, actions, and expressions.
We’ve had this integration in place for several invoice cycles now, and the efficiency gains we’ve seen are phenomenal (~3 hours down to about 25 minutes). As we continue to grow (and hopefully send out more invoices!), we expect the efficiency gained to also grow exponentially. If this resonates with you and is something you’d like to hear more about, drop us a line!