---
# === IDENTITY ===
id: business/erp-integration/business-central-power-automate/2026
canonical_question: "How do Business Central native Power Automate connectors work for integration?"
aliases:
  - "Business Central Power Automate connector triggers actions and limitations"
  - "Dynamics 365 BC Power Automate integration patterns and approval flows"
  - "How to automate Business Central workflows with Power Automate"
  - "Power Automate Business Central connector rate limits and authentication"
entity_type: erp_integration
domain: business > erp-integration > business-central-power-automate
region: global
jurisdiction: global
temporal_scope: 2024-2026

# === SYSTEM PROFILE ===
systems:
  - name: "Microsoft Dynamics 365 Business Central"
    vendor: "Microsoft"
    version: "V3 connector (2024 Wave 2+)"
    edition: "Essentials, Premium (SaaS)"
    deployment: "cloud"
    api_surface: "Power Automate Connector (V3)"

# === VERIFICATION ===
last_verified: 2026-03-03
confidence: 0.87
version: 1.0
first_published: 2026-03-03

# === TEMPORAL VALIDITY ===
temporal_validity:
  status: volatile
  last_breaking_change: "2024-02 — V2 triggers and actions deprecated in favor of V3"
  next_review: 2026-08-30
  change_sensitivity: high

# === CONSTRAINTS ===
constraints:
  - "Connector throttle: 300 API calls per connection per 60 seconds"
  - "No service-to-service (S2S), service principal, or managed identity authentication — connector requires delegated user context"
  - "Record size limit: 8 MB per record for all actions (Create, Get, Update, Find) — partner APIs may exceed this"
  - "Power Platform request limits: vary by license (e.g., 40,000/day for Power Automate Premium per user)"
  - "Business events trigger (V3) is still in Preview — not GA"
  - "Connector is Premium tier — requires Power Automate Premium license or Power Apps per-app/per-user plan"

# === SKIP CONDITIONS ===
skip_this_unit_if:
  - condition: "User needs direct OData/REST API access without Power Automate"
    use_instead: "business/erp-integration/business-central-api-v2/2026"
  - condition: "User needs Dataverse/CRM integration (Sales, Service, Marketing)"
    use_instead: "business/erp-integration/dynamics-365-rest-api/2026"
  - condition: "User needs Business Central on-premises Power Automate connector"
    use_instead: "business/erp-integration/business-central-on-prem-api/2026"

# === AGENT HINTS ===
inputs_needed:
  - key: integration_pattern
    question: "What integration pattern do you need?"
    type: choice
    options:
      - "approval workflow (purchase orders, sales documents, journal lines)"
      - "record-change automation (trigger on create/modify/delete)"
      - "business event reaction (custom AL events)"
      - "instant flow (user-initiated from BC page)"
  - key: data_volume
    question: "What's your expected flow run volume?"
    type: choice
    options:
      - "< 100 runs/day (standard approval flows)"
      - "100-1,000 runs/day (moderate automation)"
      - "> 1,000 runs/day (high-volume — check throttling limits)"
  - key: direction
    question: "What's the data flow direction?"
    type: choice
    options:
      - "BC-triggered (events in BC start external actions)"
      - "external-triggered (external events write to BC)"
      - "bidirectional (BC + external systems exchange data)"

# === DISTRIBUTION ===
canonical_source: "https://knowledgelib.io/business/erp-integration/business-central-power-automate/2026"
suggested_citation: "Source: knowledgelib.io — AI Knowledge Library (verified 2026-03-03)"

# === RELATED UNITS ===
related_kos:
  depends_on:
    - id: "business/erp-integration/business-central-api-v2/2026"
      label: "Business Central API v2.0 — the underlying OData API the connector wraps"
  related_to:
    - id: "business/erp-integration/dynamics-365-rest-api/2026"
      label: "Dynamics 365 Dataverse Web API capabilities and rate limits"
  solves:
    - id: "business/erp-integration/bc-approval-automation/2026"
      label: "Purchase order and invoice approval automation playbook"
  alternative_to:
    - id: "business/erp-integration/business-central-api-v2/2026"
      label: "Direct OData/REST API integration (more control, higher complexity)"
  often_confused_with:
    - id: "business/erp-integration/dynamics-365-rest-api/2026"
      label: "Dynamics 365 Dataverse connector (different product, different connector)"

# === SOURCES ===
sources:
  - id: src1
    title: "Dynamics 365 Business Central Connector Reference"
    author: Microsoft
    url: https://learn.microsoft.com/en-us/connectors/dynamicssmbsaas/
    type: official_docs
    published: 2024-03-01
    reliability: authoritative
  - id: src2
    title: "Power Automate Integration Overview — Business Central"
    author: Microsoft
    url: https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/powerplatform/power-automate-overview
    type: official_docs
    published: 2025-08-06
    reliability: authoritative
  - id: src3
    title: "Set Up Automated Workflows — Business Central"
    author: Microsoft
    url: https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/powerplatform/automate-workflows
    type: official_docs
    published: 2025-04-01
    reliability: authoritative
  - id: src4
    title: "Business Central and Power Automate Connector: Create, Modify, Delete Triggers"
    author: Stefano Demiliani
    url: https://demiliani.com/2024/07/15/dynamics-365-business-central-and-power-automate-connector-create-modify-delete-triggers-things-to-know/
    type: technical_blog
    published: 2024-07-15
    reliability: moderate_high
  - id: src5
    title: "Power Automate: All Business Central Triggers"
    author: AGOLUTION
    url: https://agolution.com/en/power-automate/overview-of-all-bc-triggers/
    type: community_resource
    published: 2024-06-01
    reliability: moderate_high
  - id: src6
    title: "Limits of Automated, Scheduled, and Instant Flows"
    author: Microsoft
    url: https://learn.microsoft.com/en-us/power-automate/limits-and-config
    type: official_docs
    published: 2025-06-25
    reliability: authoritative
  - id: src7
    title: "Business Events on Business Central (Preview)"
    author: Microsoft
    url: https://learn.microsoft.com/en-us/dynamics365/business-central/dev-itpro/developer/business-events-overview
    type: official_docs
    published: 2025-01-15
    reliability: authoritative
  - id: src8
    title: "Power Platform Request Limits and Allocations"
    author: Microsoft
    url: https://learn.microsoft.com/en-us/power-platform/admin/api-request-limits-allocations
    type: official_docs
    published: 2025-06-01
    reliability: authoritative
---

# Business Central Power Automate Connectors: Capabilities, Triggers & Limitations

## 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) |
| **Connector Docs** | [Dynamics 365 Business Central Connector](https://learn.microsoft.com/en-us/connectors/dynamicssmbsaas/) |
| **Status** | GA (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 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 in Find Records) | 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 apply | 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 [src1] |
| **When a record is modified (V3)** | Automated | Fires when an existing record is updated (not on create or delete) [src4] |
| **When a record is deleted (V3)** | Automated | Fires when a record is removed [src1] |
| **When a record is changed (V3)** | Automated | Fires on create, modify, or delete (combined trigger) [src1] |
| **When a business event occurs (V3)** | Automated (Preview) | Fires on custom AL-defined business events [src7] |
| **For a selected record (V3)** | Instant (manual) | User-initiated from a BC page's Automate menu [src2] |
| **When a purchase document approval is requested (V3)** | Automated | Purchase order/invoice approval workflow [src1] |
| **When a sales document approval is requested (V3)** | Automated | Sales order/quote/invoice/credit memo approval [src1] |
| **When a customer approval is requested (V3)** | Automated | Customer master data approval [src1] |
| **When a vendor approval is requested (V3)** | Automated | Vendor master data approval [src1] |
| **When an item approval is requested (V3)** | Automated | Item master data approval [src1] |
| **When a general journal batch approval is requested (V3)** | Automated | Journal batch approval [src1] |
| **When a general journal line approval is requested (V3)** | Automated | Journal line approval [src1] |

### Actions (12 Total)

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

## 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] |
| Max records per Find Records query | 1,000 default (configurable via $top) | Find records (V3) | Use $skip for pagination beyond 1,000 |
| Max OData $filter complexity | ~2,048 characters | Find records, Find one record | Complex filters may time out |
| Max request body size | ~4 MB | Create/Update record | Matches BC OData limits |

### Rolling / Daily Limits

| Limit Type | Value | Window | License Differences |
|---|---|---|---|
| API calls per connection | 300 | 60 seconds | Same for all license tiers [src1] |
| Power Platform API requests (per user) | 40,000 | 24 hours | Power Automate Premium per-user; 6,000 for seeded; varies by M365 plan [src8] |
| Flow runs per user (scheduled/automated) | 100,000 | 24 hours (non-Performance profile) | 500,000 with Performance profile [src6] |
| Actions per flow run | 500,000 | Per run | Loops limited to 5,000 iterations by default [src6] |
| Flow trigger frequency (minimum) | 1 second (instant), 1 minute (scheduled/automated) | Per flow | Automated triggers poll on internal schedule [src6] |

### Platform-Level Limits

| Limit Type | Value | Notes |
|---|---|---|
| Concurrent outbound calls | 500 per flow | Across all actions [src6] |
| Max flow duration | 30 days | For long-running flows [src6] |
| Retry policy max retries | 90 | Configurable per action [src6] |
| Max trigger recurrence | 90 days in the future | Scheduled triggers |
| Content throughput per 5 min | 600 MB | Ingress + egress combined [src6] |

## Authentication

| Flow | Use When | Token Lifetime | Refresh? | Notes |
|---|---|---|---|---|
| **Delegated OAuth 2.0 (interactive)** | All connector flows | Session-based (via connection) | Automatic (managed by Power Automate) | The ONLY auth method supported by the BC connector [src1, src2] |
| **Custom connector + OAuth 2.0 client credentials** | S2S automation without user context | Access token: 1h | Yes (refresh token) | Requires custom connector build — not the native BC connector [src4] |
| **HTTP action + OAuth 2.0 JWT/client credentials** | Direct API calls bypassing connector | Access token: 1h | Yes | Use the HTTP premium action with Entra ID app registration |

### Authentication Gotchas

- **No service-to-service auth on the native connector**: The BC connector requires a delegated user connection. If the connection owner's BC license expires or their account is disabled, all flows using that connection 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. A flow created by an admin will have broader access than one created by a clerk. [src2]
- **Multi-environment/multi-company selection**: Each trigger and action requires explicit environment and company selection. There is no "all environments" option except for the business events trigger, which allows subscribing across all companies. [src1]
- **Connection credential rotation**: When the service account password changes, the connection must be manually re-authenticated in Power Automate — there is no automated credential rotation for delegated connections. [src2]

## Constraints
<!-- Agents: read this section before recommending any integration approach from this unit.
     These are hard constraints that must not be violated. -->

- **Premium connector classification**: The Business Central connector is classified as Premium in Power Automate. Users need a Power Automate Premium per-user plan ($15/user/month) or per-flow plan ($100/flow/month). It is 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 authentication. 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. This is a hard connector limit, not a BC API limit. [src1]
- **Business events trigger is Preview**: The "When a business event occurs (V3)" trigger is in Preview status. Microsoft may change or remove it without notice. Do not use for mission-critical production flows. [src7]
- **300 calls/60s throttle**: Flows processing more than ~5 records per second per connection will hit 429 errors. For high-volume scenarios, use the direct API or implement delays. [src1]
- **No batch/bulk operations**: The connector has no native bulk insert/update action. Each record requires a separate Create/Update action, making it 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, Path parameters | Binary content returned |
| Upload file/image | Update image/file/document (V3) | Environment, Company, API category, Path, Path parameters | 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]

```text
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]

```text
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]

```text
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. Add condition: 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]

```text
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

```text
// 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, access: @{items('Apply_to_each')?['displayName']}
```

### Power Automate Expression: Conditional approval routing

```text
// 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),
  'cfo@company.com',
  if(
    greater(triggerOutputs()?['body/amount'], 1000),
    'finance-manager@company.com',
    'finance-clerk@company.com'
  )
)}
```

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

```bash
# 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 response shape:
# { "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 environment name including case |
| Company | companyId | GUID | Selected from dropdown, resolved to GUID | Multi-company: each action must specify company explicitly |
| Table name | API endpoint path | String | Dropdown selection maps to API entity set | Custom API pages need "API category" set to custom publisher prefix |
| $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) for record identification, but BC users think in terms of customer numbers ("C10000") or document numbers ("PO-1001"). Map between them using the "Find one record" action with a number filter. [src1]
- **Date/time handling**: BC stores dates as Date type (no time component) or DateTime (UTC). Power Automate expressions like `utcNow()` return full ISO 8601 — use `formatDateTime(utcNow(), 'yyyy-MM-dd')` for Date fields. [src6]
- **Decimal precision**: BC currency amounts use the currency's decimal precision setting. Power Automate may display more decimal places — 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). The connector dropdown shows display names, but expressions require the integer value. [src4]

## Error Handling & Failure Points

### Common Error Codes

| Code | Meaning | Cause | Resolution |
|---|---|---|---|
| 429 | Rate limit exceeded / Too Many Requests | >300 calls per connection in 60 seconds | Implement delays between actions; reduce loop iterations; use direct API for high volume [src1] |
| 400 | Bad Request | Invalid OData filter, missing required field, malformed JSON | Check filter syntax; verify all required fields are populated; validate date formats |
| 401 | Unauthorized | Connection expired, user account disabled, license revoked | Re-authenticate the connection; verify BC and Power Automate licenses are active |
| 404 | Not Found | Record deleted between trigger fire and action execution | Add "Configure run after" to handle gracefully; check if record exists first |
| 408 | Request Timeout | BC server under heavy load, complex query | Simplify query; add retry policy; avoid peak-hour execution for batch flows |
| 413 | Payload Too Large | Record exceeds 8 MB limit | Reduce record size; avoid records with large media fields; use direct API for binary content |
| 409 | Conflict | Optimistic concurrency violation (ETag mismatch) | Re-fetch the record, merge changes, and retry the update |

### Failure Points in Production

- **Connection owner account lockout**: If the connection owner's Entra ID account is locked, disabled, or MFA-challenged, ALL flows using that connection fail silently until re-authenticated. Fix: `Use a dedicated, MFA-excluded (conditional access policy) service account with a strong password and no expiration.` [src2]
- **Environment name changes**: If a BC sandbox environment is renamed or recreated, all flows targeting it break because environment names are hardcoded in triggers and actions. Fix: `Use Power Automate environment variables to parameterize the BC environment name.` [src4]
- **Record-change trigger backlog**: When BC has a large batch of record changes (e.g., year-end closing creates thousands of entries), the "When a record is changed" trigger can queue up thousands of flow runs simultaneously, potentially exhausting daily limits. Fix: `Add a condition early in the flow to filter irrelevant records; consider using business events instead of record-change triggers for controlled event emission.` [src7]
- **Approval flow orphaning**: If the flow owner loses their Power Automate license, in-flight approval flows stop processing — approvals are never completed or rejected. Fix: `Assign flow ownership to a shared service account; use "Run as" settings for solution flows.` [src8]
- **V2 to V3 migration gap**: Flows still using deprecated V2 triggers/actions will eventually stop working. Microsoft has not announced a hard cutoff date but recommends immediate migration. Fix: `Audit all flows for V2 usage; recreate triggers and actions with V3 equivalents. V2 and V3 have different trigger IDs — in-place upgrade is not possible.` [src4]

## Anti-Patterns

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

```text
// BAD -- Using an Apply to each loop with Create record (V3) for 5,000 records
// This will take hours and likely hit the 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, flow runs for 8+ hours with retries
```

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

```text
// 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 with up to 100 operations per batch
// Process 5,000 records in ~50 batch requests instead of 5,000 individual connector calls
// Falls under BC API limits (6,000/5min) instead of connector limits (300/60s)
```

### Wrong: Hardcoding environment and company names in every action

```text
// BAD -- Every action has "Production" and "CRONUS" typed directly
// When you copy flow to sandbox or different company, you must edit every action
Trigger: When a record is created (V3)
  Environment: "Production"
  Company: "Cronus International Ltd."
Action: Get record (V3)
  Environment: "Production"
  Company: "Cronus International Ltd."
// 15 actions x 2 fields = 30 manual edits to change environment
```

### Correct: Use Power Automate environment variables

```text
// GOOD -- Define environment variables, reference in every action
// Changing environment = update 2 variable values, not 30 action fields
Environment Variable: "BC_Environment" = "Production"
Environment Variable: "BC_Company" = "Cronus International Ltd."
Trigger: When a record is created (V3)
  Environment: @{variables('BC_Environment')}
  Company: @{variables('BC_Company')}
// To switch to sandbox: update variables only
```

### Wrong: No error handling on approval flows

```text
// BAD -- Approval flow 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
// If approver is on vacation: flow hangs for 30 days then fails
// Purchase order stuck in "Pending Approval" indefinitely
```

### Correct: Approval with timeout, escalation, and error handling

```text
// GOOD -- Add timeout, escalation path, and run-after error handling
Trigger: When a purchase document approval is requested (V3)
Action: Start and wait for an approval
  - Timeout: P3D (3 days)
Condition: If timed out --> reassign to backup approver
Condition: If approved --> Update record
Condition: If rejected --> Send rejection notification
Configure run after: If failed --> Send alert to IT admin
// No approval stuck forever; clear escalation path
```

## Common Pitfalls

- **Assuming the connector is free with M365**: The BC connector is Premium tier. Users with standard M365 E3/E5 licenses can only use Standard connectors. Deploying a BC approval flow to 50 users means 50 Power Automate Premium licenses or a per-flow plan. [src1, src8]
- **Ignoring the "When a record is modified" trigger granularity**: This trigger fires on ANY field modification to the record — not specific fields. A flow watching for "Status = Approved" will also fire when someone changes the phone number. Always add an early condition to check the specific field that matters. [src4]
- **Forgetting that trigger outputs are limited**: Record-change triggers return only the System ID, Environment Name, and Company ID — NOT the full record data. You must add a "Get record (V3)" action to retrieve the actual field values. [src1, src5]
- **Not handling pagination in Find Records**: The default $top is 1,000 records. If your table has 5,000 records and you need all of them, you must implement pagination using $skip in a Do Until loop — the connector does not auto-paginate. [src1]
- **Using personal accounts for shared flows**: When an employee who created the flow leaves the company, their connection is deactivated and ALL flows using it stop. Use a shared service account or solution-aware flows with connection references. [src2]
- **Testing only in sandbox with default company**: Sandbox environments have different names and may have different companies. A flow hardcoded to "Sandbox" will fail in "Production". Always use environment variables. [src4]

## Diagnostic Commands

```bash
# Check Power Automate flow run history
# Navigate to: https://make.powerautomate.com > My flows > [flow name] > 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
# Review: connector API call counts, throttled requests per environment

# 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
# If 401: token/credentials issue; if 404: wrong environment name

# Check BC user permissions for the connection account
# In BC: Search for "Effective Permissions" page
# Verify the service account has required permission sets (e.g., D365 BUS FULL ACCESS)

# Monitor Power Platform API request consumption
# Navigate to: https://admin.powerplatform.microsoft.com > Resources > Capacity > Add-ons
# Check: "Power Platform requests" usage vs. allocated

# 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 triggers/actions deprecated | Recreate all V2 triggers/actions with V3 equivalents; IDs differ [src4] |
| V2 (deprecated) | 2022 | Deprecated | N/A | Microsoft recommends immediate migration to V3; no hard cutoff date announced yet |
| V1 (removed) | 2019 | Removed | All triggers/actions removed | N/A — V1 flows stopped working |

### Deprecation Policy

Microsoft follows a "announce, deprecate, remove" cycle for Power Automate connectors. V2 triggers and actions were deprecated in February 2024 with V3 replacements. Microsoft has not historically provided a fixed timeline for removal of deprecated connector versions, but flows on deprecated versions stop receiving updates and may break without notice. [src1, src4]

## 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) | Business Central API v2.0 with OData $batch |
| Low-volume record-change notifications to Teams, email, SharePoint | S2S/unattended integration requiring managed identity | Direct API with Entra ID service principal |
| User-initiated instant flows from within BC pages | Complex multi-table transactional operations | AL code extensions with custom API pages |
| 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 other Power Platform apps (Power Apps, Copilot Studio) | Custom complex business logic (field validation, cascading updates) | BC AL extensions with business events |
| Non-developer business users building their own automations | Mission-critical event-driven architecture | Direct API + Azure Functions + Event Grid |

## Important Caveats

- **Premium connector cost**: The Business Central connector is Premium, requiring Power Automate Premium licensing ($15/user/month or $100/flow/month). This cost is IN ADDITION TO the Business Central license. Budget for both.
- **No service principal support**: Unlike the direct BC API which supports S2S auth, the connector requires a delegated user. This is a fundamental architectural limitation — every flow runs as a specific user with that user's permissions.
- **Business events trigger is Preview**: The "When a business event occurs (V3)" trigger is the most powerful for custom scenarios but is NOT GA. Microsoft may change, delay, or remove Preview features. Do not build production-critical workflows on it.
- **Trigger latency**: Record-change triggers are not instant — they poll on a platform-managed schedule. Expect 1-5 minute latency between the BC event and the flow trigger firing. 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 per-user limit. The connector is the bottleneck, not the API.
- **Information currency**: Connector capabilities, triggers, and actions are updated with each Power Platform release (typically quarterly). Always verify against the current connector documentation at learn.microsoft.com.

## Related Units
<!-- Generated from related_kos frontmatter -->

- [Business Central API v2.0 — OData REST capabilities and rate limits](/business/erp-integration/business-central-api-v2/2026)
- [Dynamics 365 Dataverse Web API capabilities](/business/erp-integration/dynamics-365-rest-api/2026)
