Power BI and Salesforce Analytics - Getting Your CRM Data Into Reports That People Actually Trust
Almost every sales team we work with has the same quiet frustration. They live in Salesforce all day, they trust the pipeline numbers when they are looking at them inside the CRM, and then someone builds a report in Power BI and the numbers do not match. The forecast on the Power BI dashboard says one thing, the Salesforce forecast tab says another, and now nobody trusts either. This is one of the most common jobs we get called in on, and the fix is almost never a fancy one. It is usually about understanding what the connection between the two actually does.
Power BI has a couple of built-in ways to pull Salesforce data, and on paper it looks like a five-minute job. You pick the Salesforce connector, you log in, you pick your objects, and you have reports. For a small sales team with a clean org, that genuinely is most of the work. But Salesforce is rarely a clean org, and the gap between the demo and the deployment is where the trouble lives. Microsoft's Salesforce reports and dashboards connector guidance is the official reference, and it is worth reading. This is the field version.
The two ways in, and why the difference matters
There are broadly two ways to get Salesforce data into Power BI, and picking the wrong one causes a lot of confusion later.
The first is the Salesforce Reports connector. This pulls in reports you have already built inside Salesforce. If your sales ops person has spent years crafting the perfect pipeline report in the CRM, this hands that same report to Power BI more or less as-is. It is quick and it feels safe because the numbers match what people already see. The catch is that you are limited to what those reports contain, and Salesforce caps how many rows a report can return. If your report is meant to show every open opportunity and you have more than the cap, you are silently missing rows, and nobody notices until a quarter-end reconciliation goes sideways.
The second is the Salesforce Objects connector. This goes straight at the underlying objects: Accounts, Opportunities, Leads, Contacts, and whatever custom objects your org has grown over the years. This is the one to use for anything serious. You are working with the raw data, you build the logic yourself in Power BI, and you are not boxed in by someone's pre-built report. It is more work up front, but it is the only version that scales and the only version you can actually trust for reporting the business depends on. When we do proper Power BI work for a client with Salesforce, this is almost always the path we take.
The mistake we see is a team starting with the Reports connector because it is fast, getting hooked on it, and then hitting the row cap or discovering they cannot build the calculation they need. Redoing it against objects later is more painful than starting there. If the reporting matters, start with objects.
Authentication is where the first day goes
Connecting to Salesforce sounds like "log in and go". In practice, the first real snag is almost always authentication, and it is worth knowing what you are walking into before you promise anyone a delivery date.
Salesforce is strict about API access, and rightly so. Depending on your Salesforce edition and how your admin has locked things down, you may need API access enabled on the licence, you may need a security token appended to the login, and you may hit trusted IP range restrictions that block the connection outright until someone whitelists it. None of this is hard, but every step usually needs the Salesforce admin, and if that person is busy or cautious, your two-hour job becomes a two-week job waiting on approvals.
Then there is the question of whose credentials the connection runs under. If you build the whole thing logged in as an individual salesperson, you have baked their permissions and their view of the data into the report. When they leave, or their access changes, the report breaks or quietly starts showing a different slice of data. This is the same trap people fall into with data gateways. Use a dedicated integration account with its own licence and a documented, sensible set of permissions. It costs a licence, and it is worth every cent the first time someone changes roles and nothing breaks.
One more thing worth flagging: Salesforce enforces API call limits per day depending on your edition. A badly built refresh that pulls everything, every hour, can chew through your daily API allowance and start failing, and the error message does not always make it obvious that is what happened. Sensible refresh schedules and pulling only what you need are not just tidy, they keep you under the limit.
Where the numbers stop matching, and why
Here is the part that causes the most grief, and it is rarely a bug. It is a difference in how the two systems think.
Salesforce reports often include logic that is invisible when you are looking at them. Roll-up summary fields, formula fields, sharing rules that filter what each user sees, and the way Salesforce handles multi-currency all shape the number you see in the CRM. When you pull the raw objects into Power BI, none of that logic comes along automatically. You get the base data, and you have to rebuild the meaning yourself.
Multi-currency is the classic one for Australian businesses selling across the region. Salesforce can show every opportunity converted into your corporate currency using its own exchange rates. Pull the raw objects and you get the amounts in their original currencies with no conversion, so your total pipeline number in Power BI looks wildly different from the one in Salesforce until you replicate the conversion. We have watched a finance team spend half a day convinced the integration was broken when the real issue was that nobody had accounted for currency conversion.
Sharing and visibility is another. A sales rep looking at a Salesforce report sees only their accounts because of sharing rules. An integration account pulling the raw objects might see everything, so the Power BI total is legitimately higher than what any individual rep sees in the CRM. That is not wrong, it is just different, and you need to decide deliberately whose view the report is meant to represent.
The honest takeaway is that getting Salesforce data into Power BI is easy, and getting it to mean the same thing as Salesforce is the actual work. Budget for that, and do a proper reconciliation against known-good CRM numbers before you let anyone make decisions on the report. This kind of reconciliation is a standard part of the business intelligence work we do, and it is the step people are most tempted to skip.
What it does well, and what stays rough
The connector itself is solid and well maintained. For standard objects and a reasonably clean org, it does what it says. Refreshes are reliable once authentication is sorted. And because it is a first-party Microsoft connector, you are not depending on some third-party tool that might vanish.
What stays rough is anything to do with scale and custom complexity. Very large Salesforce orgs with millions of opportunity records will refresh slowly, and you will want to think about incremental refresh rather than pulling everything every time. Heavily customised orgs with dozens of custom objects and deep relationships take real effort to model correctly in Power BI, because the connector gives you tables but not the relationships and business logic that make them meaningful. And the row limits on the Reports connector remain a genuine trap for the unwary.
There is also a broader point about what you do once the data is in. A dashboard that shows the current pipeline is useful. A model that flags which deals are slipping, which reps are sandbagging their forecast, and where the pipeline is thin three quarters out is a different level of value, and it is the kind of thing we increasingly build with AI layered over the reporting. The Salesforce connection is the plumbing. What you do with the clean data on top is where the return actually comes from.
Getting it right the first time
If you are setting this up, the version that stays reliable is not complicated. Use the Objects connector for anything that matters. Run it under a dedicated integration account, not a person. Sort out API access, security tokens and IP restrictions with your Salesforce admin before you promise a date. Replicate the currency and visibility logic deliberately, and reconcile hard against known CRM numbers before anyone trusts the output. Keep refresh schedules sane so you stay under the API limits.
Do that and you get sales reporting that people believe, which is the whole point. Get it wrong and you get two systems showing different numbers and a sales team that trusts neither, which is worse than having no dashboard at all.
If you have Salesforce and Power BI and the numbers are not lining up, or you are about to build this and want it done properly from the start, that is squarely the kind of work we do. Have a look at our services or get in touch and we will give you an honest read on how much work your particular org is going to be.
For the official setup steps and current limits, Microsoft's Salesforce connector documentation is the reference to keep open.