The short answer
If Power BI never brings more than 2,000 rows from a Salesforce report, nothing is broken. You are using the Salesforce Reports connector, and Salesforce's reports API hands over at most the first 2,000 rows. The rest never reaches Power BI, and no error tells you so.
The lasting fix is to read the data under the report with the Salesforce Objects connector, which has no such limit, and rebuild the logic in Power Query and DAX. For how to connect the two in the first place, see our Salesforce Power BI connector overview.
Where the Salesforce report API 2,000-row limit comes from
The limit is Salesforce's, not Power BI's. The connector runs on the Reports and Dashboards REST API, and its developer guide (version 68.0, Winter '27, last updated 9 October 2026) says it plainly: «The API returns up to the first 2,000 report rows. You can narrow results using filters.»
Microsoft's Salesforce Reports connector page confirms it: rows in Salesforce Reports are limited by Salesforce to 2,000, and the workaround is the Salesforce Objects connector, which doesn't have that limit. So:
- No setting lifts it. Changing the ApiVersion, the refresh schedule or your Power BI licence changes nothing.
- It applies per report. Every report you load is cut at its own row 2,000.
- It is silent. The refresh succeeds and the numbers simply come out low.
The same guide lists other report limits: the API only processes reports with up to 100 fields selected as columns, and an org can request up to 500 synchronous report runs per hour.
How to tell the connector has cut your report
- 1Count the rowsUse Table.RowCount in Power Query or a row count on a card. Exactly 2,000 is the giveaway: real data rarely lands on a round number.
- 2Compare a closed periodCompare the total amount and number of deals for a finished quarter with the same report in Salesforce. Closed periods don't move, so any gap is missing rows.
- 3Keep the checkLeave a measure in the model that flags 2,000. A report that fits today can pass the limit next quarter.
Power BI Salesforce Objects vs Reports: what changes
Fix 1: rebuild the report with the Salesforce Objects connector
This is Microsoft's own recommendation. The work is translating what the report does into a model.
Objects and fields to load
The report type tells you which objects to load. Take only the columns the report uses, which also avoids the «too many fields» error. For an opportunity pipeline report:
- Opportunity: Id, Name, AccountId, OwnerId, Amount, CloseDate, StageName, Probability, ForecastCategoryName, IsClosed, IsWon, RecordTypeId, LeadSource, CreatedDate.
- OpportunityLineItem: OpportunityId, Product2Id, Quantity, UnitPrice, TotalPrice. Only if the report shows products.
- Product2: Id, Name, Family.
- Account: Id, Name, Industry, BillingCountry, OwnerId.
- User: Id, Name, UserRoleId, IsActive. Add UserRole if the report groups by role or team.
Relationships
Opportunity to Account on AccountId and to User on OwnerId; OpportunityLineItem to Opportunity on OpportunityId and to Product2 on Product2Id. Add a date table related to CloseDate, with your fiscal year if it doesn't start in January.
Filters become Power Query steps or slicers
Fixed filters, such as record type or excluding test accounts, go in Power Query so those rows never load. Filters people change, such as close date, stage or owner, become slicers.
Groupings and summaries become DAX measures
The report's subtotals become measures, defined once and reused on every page:
- Open pipeline = CALCULATE ( SUM ( Opportunity[Amount] ), Opportunity[IsClosed] = FALSE () )
- Won amount = CALCULATE ( SUM ( Opportunity[Amount] ), Opportunity[IsWon] = TRUE () )
- Win rate = DIVIDE ( CALCULATE ( COUNTROWS ( Opportunity ), Opportunity[IsWon] = TRUE () ), CALCULATE ( COUNTROWS ( Opportunity ), Opportunity[IsClosed] = TRUE () ) )
The grouping (by owner, stage or month) is just the column you put on the visual.
Check before anyone uses it
Compare totals with the original report for two or three closed periods. Gaps usually come from a missed filter, currency or visibility: the connector gets what its signed-in Salesforce user may see, which may differ from the report owner. Use an integration user that sees what the model needs, and control access with row-level security in Power BI.
Fix 2: split the report with filters and append the pieces
If you can't rebuild yet, cut the data into pieces under 2,000 rows each. Save several copies of the report in Salesforce, each filtered to one slice (by quarter, region or record type), load each with the Salesforce Reports connector and append them in Power Query.
What to watch:
- Slices grow. When one passes 2,000 rows it gets cut without an error. Keep a row count per slice.
- Relative dates move. Filters such as «this quarter» shift on their own, and slices can overlap or leave gaps. Use fixed ranges for closed periods.
- Upkeep multiplies. A column change has to be made in every copy, or the append breaks.
- Report runs count. Each refresh runs every slice, against the org's hourly limit.
It is a stopgap: with growing data you end up at Fix 1 or Fix 3.
Fix 3: land Salesforce in a data warehouse before Power BI
When Salesforce has to sit next to GA4, ad platforms or the ERP, copy its objects into a warehouse on a schedule and point Power BI there. No row limit, history you control, and opportunities defined once.
- Microsoft Fabric. Data Factory has a Salesforce objects connector for Dataflow Gen2, pipelines and copy jobs with full load, append or upsert, according to the Fabric documentation. Data lands in OneLake. See what is Microsoft Fabric.
- BigQuery. The BigQuery Data Transfer Service loads Salesforce Sales Cloud data on a schedule, in full or incrementally, according to Google Cloud's documentation. See BigQuery consulting.
- Snowflake. A scheduled load, your own or through an ingestion tool. See Snowflake consulting.
The modelling from Fix 1 doesn't disappear: it moves into the warehouse, where every tool reuses it. New to the term? Read what a data warehouse is.
Fix 4: Data 360 zero copy, only if you already have it
Salesforce Data 360 (formerly Data Cloud) has zero copy, a data federation feature that lets Data 360 and warehouses such as Snowflake, Databricks, Redshift and BigQuery use each other's data without copying it. If you already pay for Data 360, sharing its data into the warehouse Power BI reads can save a separate load.
If you don't, buying it just to get past a Power BI row limit rarely adds up.
Which fix to choose
Other Salesforce Reports connector limitations
Both Salesforce connectors need the API Enabled permission, don't work with trial accounts or Lightning URLs, need IP-locked sessions turned off and only import, with no DirectQuery. Details and API call allowances are in our Salesforce Power BI connector guide.
Salesforce report 2,000-row limit: frequently asked questions
Can I raise the 2,000-row limit in Salesforce or Power BI?
No. It is a limit of Salesforce's Reports and Dashboards REST API, and no setting in Salesforce or Power BI changes it.
Does the Salesforce Objects connector have a row limit?
Not the 2,000-row one. Microsoft's documentation says the Objects connector doesn't have it. Other Salesforce limits still apply, such as daily API calls and concurrent queries.
Why does my report have more than 2,000 rows in Salesforce but not in Power BI?
Because Power BI reads it through the API, which returns only the first 2,000 rows. The data in Salesforce is complete.
Do I need a data warehouse to get all my Salesforce data into Power BI?
No. The Salesforce Objects connector is enough for many teams. A warehouse pays off when Salesforce meets other sources or you need history.
Stuck at 2,000 rows? Let's look at your reports
In a 30-minute call we look at the Salesforce reports you load into Power BI and tell you which fix makes sense for them. If we can't help, we'll tell you that too.
Book the 30-minute call