Business Central Power Automate Connectors: Capabilities, Triggers & Limitations

Type: ERP Integration System: Microsoft Dynamics 365 Business Central (V3 connector) Confidence: 0.87 Sources: 8 Verified: 2026-03-03 Freshness: 2026-03-03

TL;DR

System Profile

The Business Central Power Automate connector (V3) is the native, Microsoft-built integration surface between Dynamics 365 Business Central Online (SaaS) and the Power Platform. It wraps the Business Central OData API v2.0 behind a user-friendly connector interface with dropdown selectors for environment, company, API category, and table. The connector is classified as Premium tier across all Power Platform products — Power Automate, Power Apps, Logic Apps, and Copilot Studio. [src1]

The V3 connector replaced the V2 connector in 2024 Wave 1 (February 2024), with V2 triggers and actions being deprecated. All new flows should use V3 actions and triggers exclusively. The connector is available in all Power Automate regions except US Government (GCC High), China Cloud (21Vianet), and US DoD. [src1, src4]

PropertyValue
VendorMicrosoft
SystemDynamics 365 Business Central (SaaS)
API SurfacePower Automate Connector (V3), wraps OData v4
Current Connector VersionV3 (2024 Wave 2+)
Editions CoveredEssentials, Premium (Business Central Online)
DeploymentCloud only (separate on-premises connector exists)
Connector DocsDynamics 365 Business Central Connector
StatusGA (except business events trigger — Preview)

API Surfaces & Capabilities

The connector exposes Business Central's OData API through a simplified interface. For direct OData access (custom endpoints, higher throughput), use the Business Central API v2.0 directly. [src1, src2]

API SurfaceProtocolBest ForMax Records/RequestRate LimitReal-time?Bulk?
BC Connector V3Power Automate / OData wrapperApproval flows, CRUD automation, notifications1,000 (via $top)300 calls/60s per connectionYes (triggers)No
BC API v2.0 (direct)OData v4 / HTTPSHigh-volume integrations, custom endpoints20,000 per page6,000/5min per userYesPagination
Business Events (Preview)Webhook via connectorCustom AL event reactionsN/A (event-driven)Shared with connectorYesN/A
Dataverse Virtual TablesDataverse connectorPower Apps data access to BCDataverse limitsDataverse throttling30-min sync delayNo

Triggers (13 Total)

TriggerTypeDescription
When a record is created (V3)AutomatedFires when a new record is inserted in a specified table
When a record is modified (V3)AutomatedFires when an existing record is updated (not on create or delete)
When a record is deleted (V3)AutomatedFires when a record is removed
When a record is changed (V3)AutomatedFires on create, modify, or delete (combined trigger)
When a business event occurs (V3)Automated (Preview)Fires on custom AL-defined business events
For a selected record (V3)Instant (manual)User-initiated from a BC page's Automate menu
When a purchase document approval is requested (V3)AutomatedPurchase order/invoice approval workflow
When a sales document approval is requested (V3)AutomatedSales order/quote/invoice/credit memo approval
When a customer approval is requested (V3)AutomatedCustomer master data approval
When a vendor approval is requested (V3)AutomatedVendor master data approval
When an item approval is requested (V3)AutomatedItem master data approval
When a general journal batch approval is requested (V3)AutomatedJournal batch approval
When a general journal line approval is requested (V3)AutomatedJournal line approval

Actions (12 Total)

ActionDescription
Create record (V3)Insert a new BC record into any exposed API table
Get record (V3)Retrieve a single record by System ID
Update record (V3)Modify an existing record by System ID
Delete record (V3)Remove a record by System ID
Find records (V3)Query records with OData $filter, $orderby, $top, $skip
Find one record (V3)Retrieve a single record matching filter criteria (no Apply to each needed)
Run action (V3)Execute a BC OData action (bound or unbound procedure)
List companies (V3)Retrieve all companies in an environment
Get url (V3)Generate a web client URL for a specific record and page
Get adaptive card (V3)Retrieve an adaptive card for a BC URL (for Teams integration)
Get an image, file or document (V3)Download binary content from a BC record
Update an image, file or document (V3)Upload/update binary content on a BC record

Rate Limits & Quotas

Per-Request Limits

Limit TypeValueApplies ToNotes
Max record size per action8 MBAll CRUD actionsPartner/custom APIs may produce larger records — will fail with "response too large" [src1]
Max records per Find Records query1,000 defaultFind records (V3)Use $skip for pagination beyond 1,000
Max OData $filter complexity~2,048 charactersFind records, Find one recordComplex filters may time out
Max request body size~4 MBCreate/Update recordMatches BC OData limits

Rolling / Daily Limits

Limit TypeValueWindowLicense Differences
API calls per connection30060 secondsSame for all license tiers [src1]
Power Platform API requests (per user)40,00024 hoursPremium per-user; 6,000 for seeded; varies by M365 plan [src8]
Flow runs per user100,00024 hours500,000 with Performance profile [src6]
Actions per flow run500,000Per runLoops limited to 5,000 iterations by default [src6]
Flow trigger frequency (minimum)1s (instant), 1min (automated)Per flowAutomated triggers poll on internal schedule [src6]

Platform-Level Limits

Limit TypeValueNotes
Concurrent outbound calls500 per flowAcross all actions [src6]
Max flow duration30 daysFor long-running flows
Retry policy max retries90Configurable per action
Content throughput per 5 min600 MBIngress + egress combined

Authentication

FlowUse WhenToken LifetimeRefresh?Notes
Delegated OAuth 2.0 (interactive)All connector flowsSession-based (managed)AutomaticThe ONLY auth method supported by native connector [src1]
Custom connector + OAuth 2.0 client credentialsS2S automation without user context1h access tokenYes (refresh token)Requires custom connector build
HTTP action + OAuth 2.0 JWT/client credentialsDirect API calls bypassing connector1h access tokenYesUse HTTP premium action with Entra ID app

Authentication Gotchas

Constraints

Integration Pattern Decision Tree

START -- User needs to automate Business Central with Power Automate
|-- What type of automation?
|   |-- Approval Workflow
|   |   |-- Purchase document? --> "When a purchase document approval is requested (V3)"
|   |   |-- Sales document? --> "When a sales document approval is requested (V3)"
|   |   |-- Customer/Vendor/Item master? --> respective approval trigger
|   |   |-- General journal? --> journal batch or line approval trigger
|   |   +-- Custom approval? --> "When a record is modified (V3)" + Approvals connector
|   |-- Record Change Notification
|   |   |-- Need create + modify + delete? --> "When a record is changed (V3)"
|   |   |-- Need only creates? --> "When a record is created (V3)"
|   |   |-- Need only updates? --> "When a record is modified (V3)"
|   |   +-- Need only deletes? --> "When a record is deleted (V3)"
|   |-- Custom Business Event
|   |   |-- AL extension with business events? --> "When a business event occurs (V3)" [Preview]
|   |   +-- No AL access? --> Use record-change triggers as alternative
|   |-- User-Initiated Action
|   |   +-- Run from BC page? --> "For a selected record (V3)" instant flow
|   +-- External System --> BC
|       |-- Volume < 300 records/min? --> Use connector actions (Create/Update record)
|       +-- Volume > 300 records/min? --> Use direct BC API v2.0 instead
|-- Authentication
|   |-- Can use delegated user? --> Native connector (standard setup)
|   |-- Need S2S/unattended? --> Custom connector or HTTP action with OAuth 2.0
|   +-- Need managed identity? --> NOT SUPPORTED -- use direct API
+-- Volume assessment
    |-- < 300 calls/min --> Safe for native connector
    |-- 300-6,000 calls/5min --> Direct API v2.0 recommended
    +-- > 6,000 calls/5min --> Direct API with throttling strategy

Quick Reference

OperationConnector ActionRequired ParametersKey Limitation
Insert a recordCreate record (V3)Environment, Company, API category, Table, Row data8 MB max record size
Read a single recordGet record (V3)Environment, Company, API category, Table, Row IDMust know System ID
Query multiple recordsFind records (V3)Environment, Company, API category, Table + optional $filter1,000 default page size
Query single matchFind one record (V3)Environment, Company, API category, Table + filter conditionsNo Apply to each loop needed
Update a recordUpdate record (V3)Environment, Company, API category, Table, Row ID, Row dataOptimistic concurrency (ETag)
Delete a recordDelete record (V3)Environment, Company, API category, Table, Row IDPermanent — no soft delete
Execute OData actionRun action (V3)Environment, Company, API category, Action name, ParametersBound actions need entity context
Get Teams adaptive cardGet adaptive card (V3)Target URL, Target appRequires BC web client URL
Download file/imageGet image/file/document (V3)Environment, Company, API category, PathBinary content returned
Upload file/imageUpdate image/file/document (V3)Environment, Company, API category, PathReplaces existing content
Get record deep linkGet url (V3)Environment, Company, Page ID, Row IDOpens in BC web client
List companiesList companies (V3)EnvironmentRead-only

Step-by-Step Integration Guide

1. Set up the Power Automate connection to Business Central

Create a connection using a dedicated service account with appropriate BC permission sets. The account should have a Power Automate Premium license and a BC Essentials or Premium license. [src2]

1. Go to https://make.powerautomate.com
2. Navigate to Data > Connections > + New connection
3. Search for "Dynamics 365 Business Central"
4. Sign in with the dedicated service account credentials
5. Grant consent for the connector to access BC data

Verify: Go to Connections list and confirm the Business Central connection shows "Connected" status with the service account name.

2. Create an automated flow with a record-change trigger

Build a flow that triggers when a customer record is created in Business Central and sends a Teams notification. [src1, src3]

1. Create flow > Automated cloud flow
2. Trigger: "When a record is created (V3)"
   - Environment: [select your production environment]
   - Company: [select company]
   - API category: "v2.0"
   - Table name: "customers"
3. Add action: Microsoft Teams > Post message in a chat or channel
   - Team: [select team]
   - Channel: [select channel]
   - Message: "New customer created: @{triggerOutputs()?['body/displayName']}"

Verify: Create a test customer in BC — the Teams message should appear within 1-3 minutes.

3. Build a purchase document approval flow

Create an approval flow for purchase orders over a threshold amount. [src1, src3]

1. Create flow > Automated cloud flow
2. Trigger: "When a purchase document approval is requested (V3)"
   - Environment: [select environment]
   - Company: [select company]
   - Header first condition: "Document Type" = "Order"
3. Add action: "Get record (V3)" to retrieve full PO details
4. Add condition: Amount > threshold
5. Add action: Approvals > "Start and wait for an approval"
   - Type: Approve/Reject - First to respond
   - Title: "Purchase Order @{...documentNumber} for @{...amount}"
   - Assigned to: [approver email]
6. If approved --> Update record (set status)
   If rejected --> Send rejection email

Verify: Submit a purchase order for approval in BC — approver receives notification in Teams/Outlook — approval/rejection flows back to BC.

4. Implement an instant flow for user-initiated actions

Create a flow that a BC user can trigger from a customer card to send a welcome email. [src2]

1. Create flow > Instant cloud flow
2. Trigger: "For a selected record (V3)"
   - Page or table (optional): "PAGE21" (Customer Card)
3. Add action: "Get record (V3)" using trigger's SystemId
4. Add action: Office 365 Outlook > Send an email (V2)
   - To: customer email from Get record
   - Subject: "Welcome to [Company]"
   - Body: HTML welcome template
5. Save flow

Verify: Open a customer card in BC — Automate menu — run the flow — customer receives welcome email.

Code Examples

Power Automate Expression: Filter customers by city

// Input:  Business Central environment with customer records
// Output: Filtered list of customers in a specific city

// In the "Find records (V3)" action, use this OData filter:
$filter: city eq 'London'
$orderby: displayName asc
$top: 50

// Access results in subsequent actions:
@{outputs('Find_records_(V3)')?['body/value']}

// Loop through results:
// Add "Apply to each" with: @{outputs('Find_records_(V3)')?['body/value']}
// Inside loop: @{items('Apply_to_each')?['displayName']}

Power Automate Expression: Conditional approval routing

// Input:  Purchase document approval request trigger output
// Output: Dynamic approver assignment based on amount

// Use expression in "Assigned to" field of Approvals action:
@{if(
  greater(triggerOutputs()?['body/amount'], 10000),
  '[email protected]',
  if(
    greater(triggerOutputs()?['body/amount'], 1000),
    '[email protected]',
    '[email protected]'
  )
)}

cURL: Test Business Central API directly (for debugging connector issues)

# Input:  Entra ID app registration with BC API permissions
# Output: JSON list of customers from BC API v2.0

# Step 1: Get OAuth 2.0 access token
curl -X POST "https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "client_id={app-id}&scope=https://api.businesscentral.dynamics.com/.default&client_secret={secret}&grant_type=client_credentials"

# Step 2: Query customers
curl -X GET "https://api.businesscentral.dynamics.com/v2.0/{tenant-id}/{environment}/api/v2.0/companies({company-id})/customers?$top=10" \
  -H "Authorization: Bearer {access-token}" \
  -H "Accept: application/json"

# Expected: { "value": [ { "id": "...", "number": "10000", "displayName": "Adatum Corp" } ] }

Data Mapping

Field Mapping Reference

BC Connector FieldBC API v2.0 FieldTypeTransformGotcha
Row ID (trigger output)systemIdGUIDDirect — use in Get record actionThis is NOT the BC record number (e.g., "C10000")
Environment NameN/A (URL parameter)StringSelected from dropdownMust match exact name including case
CompanycompanyIdGUIDSelected from dropdownEach action must specify company explicitly
Table nameAPI endpoint pathStringDropdown maps to API entity setCustom APIs need publisher prefix in API category
$filter (Find records)OData $filterStringManual OData syntaxCase-sensitive string comparisons by default
Row (Create/Update)JSON bodyDynamic objectPower Automate dynamic contentFields vary by table; required fields cause error if omitted

Data Type Gotchas

Error Handling & Failure Points

Common Error Codes

CodeMeaningCauseResolution
429Rate limit exceeded>300 calls per connection in 60sImplement delays; reduce loop iterations; use direct API for high volume [src1]
400Bad RequestInvalid OData filter, missing required fieldCheck filter syntax; verify all required fields; validate date formats
401UnauthorizedConnection expired, account disabled, license revokedRe-authenticate connection; verify licenses are active
404Not FoundRecord deleted between trigger and actionAdd "Configure run after" to handle gracefully
408Request TimeoutBC server under load, complex querySimplify query; add retry policy; avoid peak hours
413Payload Too LargeRecord exceeds 8 MB limitReduce record size; use direct API for binary content
409ConflictETag mismatch (optimistic concurrency)Re-fetch record, merge changes, retry update

Failure Points in Production

Anti-Patterns

Wrong: Processing thousands of records in a loop with connector actions

// BAD -- Using Apply to each loop with Create record (V3) for 5,000 records
// Will take hours and hit 300 calls/60s throttle limit
Trigger: Recurrence (daily)
Action: HTTP --> get 5,000 records from external system
Apply to each (5,000 iterations):
  Action: Create record (V3) --> insert each record into BC
// Result: 429 errors after ~5 minutes, 8+ hours with retries

Correct: Use direct BC API v2.0 for bulk operations

// GOOD -- Use HTTP action with OAuth 2.0 to call BC API directly
// Send batched requests with OData $batch endpoint
Trigger: Recurrence (daily)
Action: HTTP --> get records from external system
Action: HTTP (to BC API) --> POST to $batch endpoint, 100 ops per batch
// 5,000 records in ~50 batches instead of 5,000 individual calls

Wrong: Hardcoding environment and company names

// BAD -- Every action has "Production" and "CRONUS" typed directly
// Copying to sandbox requires editing every single action
Trigger: When a record is created (V3) { Environment: "Production", Company: "Cronus" }
Action: Get record (V3) { Environment: "Production", Company: "Cronus" }
// 15 actions x 2 fields = 30 manual edits to change environment

Correct: Use Power Automate environment variables

// GOOD -- Environment variables referenced in every action
// Switching environment = update 2 variable values, not 30 fields
Environment Variable: "BC_Environment" = "Production"
Environment Variable: "BC_Company" = "Cronus International Ltd."
All actions reference: @{variables('BC_Environment')}

Wrong: No error handling on approval flows

// BAD -- Approval with no timeout, no fallback
Trigger: When a purchase document approval is requested (V3)
Action: Start and wait for an approval (no timeout)
Condition: If approved --> Update record
// Approver on vacation = flow hangs 30 days then fails

Correct: Approval with timeout and escalation

// GOOD -- Timeout, escalation, and error handling
Trigger: When a purchase document approval is requested (V3)
Action: Start and wait for an approval { Timeout: P3D }
If timed out --> reassign to backup approver
If approved --> Update record
If rejected --> Notify requester
Configure run after (failed) --> Alert IT admin

Common Pitfalls

Diagnostic Commands

# Check Power Automate flow run history
# Navigate to: https://make.powerautomate.com > My flows > [flow] > Run history
# Look for: failed runs, 429 throttle errors, duration anomalies

# Check connector throttle status via Power Platform admin center
# Navigate to: https://admin.powerplatform.microsoft.com > Analytics > Power Automate

# Test BC connectivity directly (bypassing connector)
curl -X GET "https://api.businesscentral.dynamics.com/v2.0/{tenant-id}/{environment}/api/v2.0/companies" \
  -H "Authorization: Bearer {token}" \
  -H "Accept: application/json"
# Expected: 200 OK with list of companies

# Check BC user permissions for the connection account
# In BC: Search for "Effective Permissions" page
# Verify service account has required permission sets

# Monitor Power Platform API request consumption
# Navigate to: admin.powerplatform.microsoft.com > Resources > Capacity > Add-ons

# Verify Business Events subscription (Preview)
# In BC: Search for "Business Events" page
# Check: event status, subscriber count, last triggered timestamp

Version History & Compatibility

Connector VersionRelease DateStatusBreaking ChangesMigration Notes
V3 (current)2024 Wave 1GA (business events: Preview)V2 deprecatedRecreate all V2 triggers/actions with V3; IDs differ
V2 (deprecated)2022DeprecatedN/AMicrosoft recommends immediate migration to V3
V1 (removed)2019RemovedAll triggers/actions removedN/A

When to Use / When Not to Use

Use WhenDon't Use WhenUse Instead
Approval workflows for purchase/sales documents, journalsHigh-volume data migration (>1,000 records/batch)BC API v2.0 with OData $batch
Low-volume record-change notifications to Teams, email, SharePointS2S/unattended integration requiring managed identityDirect API with Entra ID service principal
User-initiated instant flows from within BC pagesComplex multi-table transactional operationsAL code extensions with custom API pages
Simple CRUD operations on standard BC entities (<300/min)Real-time bidirectional sync with high throughputAzure Integration Services (Logic Apps + Service Bus)
Connecting BC to Power Platform apps (Power Apps, Copilot Studio)Complex business logic (field validation, cascading updates)BC AL extensions with business events
Non-developer business users building automationsMission-critical event-driven architectureDirect API + Azure Functions + Event Grid

Important Caveats

Related Units