Business Central Power Automate Connectors: Capabilities, Triggers & Limitations
How do Business Central native Power Automate connectors work for integration?
TL;DR
Bottom line: The native Business Central V3 connector for Power Automate provides 13 triggers (record CRUD, approval requests, business events, manual selection) and 12 actions (record CRUD, find, run action, file/image operations) — ideal for approval workflows and low-to-medium volume event-driven automation without custom code.
Key limit: 300 API calls per connection per 60 seconds; all records must be under 8 MB per action; no S2S or managed identity auth.
Watch out for: The connector requires a Premium Power Automate license (it is a Premium connector), and business events triggers are still in Preview — not production-ready for mission-critical flows.
Best for: Purchase/sales document approval flows, record-change notifications to Teams/email/SharePoint, and user-initiated instant flows from within the BC client.
Authentication: Delegated user OAuth 2.0 only — the flow runs in the context of the connection owner's BC permissions. No service principal support on the connector.
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]
Property
Value
Vendor
Microsoft
System
Dynamics 365 Business Central (SaaS)
API Surface
Power Automate Connector (V3), wraps OData v4
Current Connector Version
V3 (2024 Wave 2+)
Editions Covered
Essentials, Premium (Business Central Online)
Deployment
Cloud only (separate on-premises connector exists)
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 Surface
Protocol
Best For
Max Records/Request
Rate Limit
Real-time?
Bulk?
BC Connector V3
Power Automate / OData wrapper
Approval flows, CRUD automation, notifications
1,000 (via $top)
300 calls/60s per connection
Yes (triggers)
No
BC API v2.0 (direct)
OData v4 / HTTPS
High-volume integrations, custom endpoints
20,000 per page
6,000/5min per user
Yes
Pagination
Business Events (Preview)
Webhook via connector
Custom AL event reactions
N/A (event-driven)
Shared with connector
Yes
N/A
Dataverse Virtual Tables
Dataverse connector
Power Apps data access to BC
Dataverse limits
Dataverse throttling
30-min sync delay
No
Triggers (13 Total)
Trigger
Type
Description
When a record is created (V3)
Automated
Fires when a new record is inserted in a specified table
When a record is modified (V3)
Automated
Fires when an existing record is updated (not on create or delete)
When a record is deleted (V3)
Automated
Fires when a record is removed
When a record is changed (V3)
Automated
Fires 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)
Automated
Purchase order/invoice approval workflow
When a sales document approval is requested (V3)
Automated
Sales order/quote/invoice/credit memo approval
When a customer approval is requested (V3)
Automated
Customer master data approval
When a vendor approval is requested (V3)
Automated
Vendor master data approval
When an item approval is requested (V3)
Automated
Item master data approval
When a general journal batch approval is requested (V3)
Automated
Journal batch approval
When a general journal line approval is requested (V3)
Automated
Journal line approval
Actions (12 Total)
Action
Description
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 Type
Value
Applies To
Notes
Max record size per action
8 MB
All CRUD actions
Partner/custom APIs may produce larger records — will fail with "response too large" [src1]
The ONLY auth method supported by native connector [src1]
Custom connector + OAuth 2.0 client credentials
S2S automation without user context
1h access token
Yes (refresh token)
Requires custom connector build
HTTP action + OAuth 2.0 JWT/client credentials
Direct API calls bypassing connector
1h access token
Yes
Use HTTP premium action with Entra ID app
Authentication Gotchas
No service-to-service auth on native connector: The BC connector requires a delegated user connection. If the connection owner's account is disabled, all flows break silently. Use a dedicated service account. [src1, src2]
Connection owner permissions = flow permissions: The flow can only access BC data that the connection owner can access via their BC permission sets. [src2]
Multi-environment/multi-company selection: Each trigger and action requires explicit environment and company selection. No "all environments" option except for business events triggers. [src1]
Connection credential rotation: When the service account password changes, the connection must be manually re-authenticated — no automated credential rotation. [src2]
Constraints
Premium connector classification: Requires Power Automate Premium per-user ($15/user/month) or per-flow ($100/flow/month). NOT included in standard M365 licenses. [src1]
No S2S/managed identity: Unlike the direct BC API v2.0, the connector cannot use service principal or managed identity auth. All flows run as a delegated user. [src1, src2]
8 MB record size limit: Any action that returns or sends a record exceeding 8 MB will fail. Hard connector limit. [src1]
Business events trigger is Preview: May change or be removed without notice. Do not use for mission-critical production flows. [src7]
300 calls/60s throttle: Flows processing more than ~5 records/second per connection will hit 429 errors. [src1]
No batch/bulk operations: Each record requires a separate Create/Update action. Unsuitable for data migration or large ETL jobs. [src1]
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
Operation
Connector Action
Required Parameters
Key Limitation
Insert a record
Create record (V3)
Environment, Company, API category, Table, Row data
8 MB max record size
Read a single record
Get record (V3)
Environment, Company, API category, Table, Row ID
Must know System ID
Query multiple records
Find records (V3)
Environment, Company, API category, Table + optional $filter
1,000 default page size
Query single match
Find one record (V3)
Environment, Company, API category, Table + filter conditions
No Apply to each loop needed
Update a record
Update record (V3)
Environment, Company, API category, Table, Row ID, Row data
Optimistic concurrency (ETag)
Delete a record
Delete record (V3)
Environment, Company, API category, Table, Row ID
Permanent — no soft delete
Execute OData action
Run action (V3)
Environment, Company, API category, Action name, Parameters
Bound actions need entity context
Get Teams adaptive card
Get adaptive card (V3)
Target URL, Target app
Requires BC web client URL
Download file/image
Get image/file/document (V3)
Environment, Company, API category, Path
Binary content returned
Upload file/image
Update image/file/document (V3)
Environment, Company, API category, Path
Replaces existing content
Get record deep link
Get url (V3)
Environment, Company, Page ID, Row ID
Opens in BC web client
List companies
List companies (V3)
Environment
Read-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 Field
BC API v2.0 Field
Type
Transform
Gotcha
Row ID (trigger output)
systemId
GUID
Direct — use in Get record action
This is NOT the BC record number (e.g., "C10000")
Environment Name
N/A (URL parameter)
String
Selected from dropdown
Must match exact name including case
Company
companyId
GUID
Selected from dropdown
Each action must specify company explicitly
Table name
API endpoint path
String
Dropdown maps to API entity set
Custom APIs need publisher prefix in API category
$filter (Find records)
OData $filter
String
Manual OData syntax
Case-sensitive string comparisons by default
Row (Create/Update)
JSON body
Dynamic object
Power Automate dynamic content
Fields vary by table; required fields cause error if omitted
Data Type Gotchas
GUID vs. display values: The connector returns System IDs (GUIDs), but BC users think in customer numbers ("C10000"). Map using "Find one record" with a number filter. [src1]
Date/time handling: BC stores dates as Date (no time) or DateTime (UTC). Use formatDateTime(utcNow(), 'yyyy-MM-dd') for Date fields. [src6]
Decimal precision: BC currency amounts use the currency's decimal precision. Round explicitly with formatNumber() before writing back to BC. [src1]
Enum/Option fields: BC option fields map to integer values in the API (e.g., Document Type: 0=Quote, 1=Order, 2=Invoice). Expressions require the integer value, not the display name. [src4]
Error Handling & Failure Points
Common Error Codes
Code
Meaning
Cause
Resolution
429
Rate limit exceeded
>300 calls per connection in 60s
Implement delays; reduce loop iterations; use direct API for high volume [src1]
400
Bad Request
Invalid OData filter, missing required field
Check filter syntax; verify all required fields; validate date formats
Reduce record size; use direct API for binary content
409
Conflict
ETag mismatch (optimistic concurrency)
Re-fetch record, merge changes, retry update
Failure Points in Production
Connection owner account lockout: If the connection owner's Entra ID account is locked/disabled, ALL flows using that connection fail silently. Fix: Use a dedicated, MFA-excluded service account with no password expiration. [src2]
Environment name changes: If a BC sandbox is renamed or recreated, flows targeting it break. Fix: Use Power Automate environment variables to parameterize the BC environment name. [src4]
Record-change trigger backlog: Large batch operations in BC can queue thousands of flow runs, exhausting daily limits. Fix: Add early condition filters; consider business events for controlled emission. [src7]
Approval flow orphaning: If the flow owner loses their Power Automate license, in-flight approvals stop processing. Fix: Assign flow ownership to a shared service account. [src8]
V2 to V3 migration gap: Flows using deprecated V2 triggers/actions will eventually stop working. Fix: Audit all flows; recreate with V3 equivalents. V2 and V3 have different IDs. [src4]
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
Assuming the connector is free with M365: The BC connector is Premium tier. Standard M365 E3/E5 users cannot use it. Budget for Power Automate Premium licenses. [src1, src8]
Ignoring trigger granularity: "When a record is modified" fires on ANY field change, not specific fields. Always add an early condition to check the specific field. [src4]
Trigger outputs are limited: Record-change triggers return only System ID, Environment Name, and Company ID — NOT the full record. Add a "Get record (V3)" action to retrieve field values. [src1, src5]
Not handling pagination: Default $top is 1,000 records. For larger result sets, implement pagination using $skip in a Do Until loop. [src1]
Using personal accounts for shared flows: When an employee leaves, their connection is deactivated and all flows stop. Use a shared service account or solution-aware flows. [src2]
Testing only in sandbox: Sandbox environments have different names and may have different companies. Always use environment variables. [src4]
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 Version
Release Date
Status
Breaking Changes
Migration Notes
V3 (current)
2024 Wave 1
GA (business events: Preview)
V2 deprecated
Recreate all V2 triggers/actions with V3; IDs differ
V2 (deprecated)
2022
Deprecated
N/A
Microsoft recommends immediate migration to V3
V1 (removed)
2019
Removed
All triggers/actions removed
N/A
When to Use / When Not to Use
Use When
Don't Use When
Use Instead
Approval workflows for purchase/sales documents, journals
High-volume data migration (>1,000 records/batch)
BC API v2.0 with OData $batch
Low-volume record-change notifications to Teams, email, SharePoint
Simple CRUD operations on standard BC entities (<300/min)
Real-time bidirectional sync with high throughput
Azure 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 automations
Mission-critical event-driven architecture
Direct API + Azure Functions + Event Grid
Important Caveats
Premium connector cost: The Business Central connector requires Power Automate Premium licensing ($15/user/month or $100/flow/month) IN ADDITION TO the Business Central license.
No service principal support: Unlike the direct BC API which supports S2S auth, the connector requires a delegated user. Every flow runs as a specific user with that user's permissions.
Business events trigger is Preview: The most powerful trigger for custom scenarios is NOT GA. Microsoft may change, delay, or remove Preview features.
Trigger latency: Record-change triggers are not instant — expect 1-5 minute latency. For sub-second latency, use BC webhooks via the direct API.
Connector throttle vs. API throttle: The 300 calls/60s connector throttle is SEPARATE from and MORE RESTRICTIVE than the BC API's 6,000 calls/5min limit. The connector is the bottleneck.
Information currency: Connector capabilities are updated with each Power Platform release (typically quarterly). Always verify against current documentation at learn.microsoft.com.