> ## Documentation Index
> Fetch the complete documentation index at: https://docs.chift.eu/llms.txt
> Use this file to discover all available pages before exploring further.

# Dynamics 365 Business Central

export const OverviewLegend = ({showTitle = true}) => <blockquote>
    {showTitle && <p>
        <strong>Overview legend 🧭</strong>
      </p>}
    <table>
      <thead>
        <tr>
          <th>Column</th>
          <th>Value</th>
          <th>Meaning</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>Geography</td>
          <td>🇫🇷 FR · 🇧🇪 BE · …</td>
          <td>Countries where the connector is officially supported.</td>
        </tr>
        <tr>
          <td rowSpan={3}>Software type</td>
          <td>SaaS</td>
          <td>Through API.</td>
        </tr>
        <tr>
          <td>On-premise (local agent)</td>
          <td>
            Software running locally — installation of a local agent is
            required.
          </td>
        </tr>
        <tr>
          <td>On-premise (API)</td>
          <td>Software running locally — API available.</td>
        </tr>
        <tr>
          <td rowSpan={2}>Status</td>
          <td>🔵 Live</td>
          <td>Connector is generally available and production-ready.</td>
        </tr>
        <tr>
          <td>🟣 Beta</td>
          <td>
            Connector is in beta — usable in production but may still evolve.
          </td>
        </tr>
        <tr>
          <td>Multi folder</td>
          <td>✅ Yes / ❌ No</td>
          <td>
            Connection to multiple accounting folders at the same time (see{' '}
            <a href="/developer-guides/api-guides/accounting/folders">
              accounting folders guide
            </a>
            ).
          </td>
        </tr>
        <tr>
          <td>Rate limits</td>
          <td>✅ No / ❌ Yes</td>
          <td>Whether the target software sets rate limits on API calls.</td>
        </tr>
        <tr>
          <td rowSpan={3}>API keys</td>
          <td>❎ No</td>
          <td>
            No API keys required (OAuth2 client secret and client ID). No
            requirements to activate the connector — you can create a
            connection.
          </td>
        </tr>
        <tr>
          <td>🔑</td>
          <td>
            Keys are required to activate the connector. Chift cannot act as
            intermediary to obtain them; we can still assist with steps to get
            keys directly from the software provider.
          </td>
        </tr>
        <tr>
          <td>🔑 ☑️ via Chift</td>
          <td>
            Keys are required to activate the connector. You can go through
            Chift to get the keys (intermediary or partnership keys). An
            approval process may still apply, but you do not need to request
            keys from the vendor on your own.
          </td>
        </tr>
        <tr>
          <td rowSpan={3}>Approval / certification process</td>
          <td>⚡ Instant</td>
          <td>
            No keys required, or Chift can encode their keys for you when
            requested. Activation is instantaneous.
          </td>
        </tr>
        <tr>
          <td>🟢 Approval — [Duration]</td>
          <td>
            Approval will be granted. The vendor may require information or app
            configuration in a developer portal before issuing keys.
          </td>
        </tr>
        <tr>
          <td>🟠 Approval — [Duration]</td>
          <td>
            Approval is not guaranteed — often due to integration strategy; the
            vendor may do a deeper assessment (competitors, partnership
            requirements, and similar).
          </td>
        </tr>
        <tr>
          <td rowSpan={2}>Activation time</td>
          <td>⚡ Instant</td>
          <td>
            If no keys are required, or Chift has keys ready to share with you.
          </td>
        </tr>
        <tr>
          <td>Time</td>
          <td>
            Estimated time to get the connector activated in production as a
            result of the approval or certification process (e.g. ⏱️ 2 days, 1
            week).
          </td>
        </tr>
        <tr>
          <td rowSpan={3}>Extra fees — software editor</td>
          <td>❎ No</td>
          <td>No fees charged by the software editor.</td>
        </tr>
        <tr>
          <td>💰 🕹️</td>
          <td>Fees associated with obtaining a testing account.</td>
        </tr>
        <tr>
          <td>💰 🔑</td>
          <td>Fees charged to get API keys.</td>
        </tr>
        <tr>
          <td rowSpan={2}>Extra fees — end user</td>
          <td>❎ No</td>
          <td>The end user does not pay extra to get integrated.</td>
        </tr>
        <tr>
          <td>💰 Yes</td>
          <td>The end user must pay extra to get integrated.</td>
        </tr>
        <tr>
          <td>Comments on costs</td>
          <td>—</td>
          <td>Additional notes on fees or pricing when relevant.</td>
        </tr>
        <tr>
          <td rowSpan={4}>Sandbox account</td>
          <td>✅ via Chift</td>
          <td>Chift can provide you with a sandbox.</td>
        </tr>
        <tr>
          <td>🟠 Only through integrator</td>
          <td>Only the software's integrator can provide a sandbox.</td>
        </tr>
        <tr>
          <td>✅ Self-service</td>
          <td>You can create your own sandbox.</td>
        </tr>
        <tr>
          <td>✅ Trial account</td>
          <td>It is possible to create a trial account.</td>
        </tr>
      </tbody>
    </table>
  </blockquote>;

export const ConnectorCardIframe = ({api = 'accounting', connectors}) => {
  const [theme, setTheme] = React.useState('light');
  React.useEffect(() => {
    const checkTheme = () => {
      const isDark = document.documentElement.classList.contains('dark');
      setTheme(isDark ? 'dark' : 'light');
    };
    checkTheme();
    const observer = new MutationObserver(checkTheme);
    observer.observe(document.documentElement, {
      attributes: true,
      attributeFilter: ['class']
    });
    return () => observer.disconnect();
  }, []);
  const queryParams = new URLSearchParams({
    api,
    theme,
    ...connectors ? {
      connectors
    } : {}
  });
  const iframeUrl = `https://chift-coverage-matrix.s3.eu-west-3.amazonaws.com/connector-card.html?${queryParams.toString()}`;
  return <iframe src={iframeUrl} title={`Chift connector information - ${api}`} style={{
    display: 'block',
    width: '100%',
    height: '480px',
    margin: 0,
    padding: 0,
    border: 'none'
  }} />;
};

export const CoverageIframe = ({api = 'accounting', connectors}) => {
  const [theme, setTheme] = React.useState('light');
  const [isFullscreen, setIsFullscreen] = React.useState(false);
  const [currentIframeUrl, setCurrentIframeUrl] = React.useState(null);
  const iframeRef = React.useRef(null);
  React.useEffect(() => {
    const checkTheme = () => {
      const isDark = document.documentElement.classList.contains('dark');
      setTheme(isDark ? 'dark' : 'light');
    };
    checkTheme();
    const observer = new MutationObserver(checkTheme);
    observer.observe(document.documentElement, {
      attributes: true,
      attributeFilter: ['class']
    });
    return () => observer.disconnect();
  }, []);
  React.useEffect(() => {
    const handleFullscreenChange = () => {
      setIsFullscreen(!!document.fullscreenElement);
    };
    document.addEventListener('fullscreenchange', handleFullscreenChange);
    return () => document.removeEventListener('fullscreenchange', handleFullscreenChange);
  }, []);
  React.useEffect(() => {
    const handleMessage = event => {
      if (!event.origin.includes('chift-coverage-matrix.s3.eu-west-3.amazonaws.com')) return;
      if (event.data?.type === 'urlChange' && event.data?.url) {
        setCurrentIframeUrl(event.data.url);
      }
    };
    window.addEventListener('message', handleMessage);
    return () => window.removeEventListener('message', handleMessage);
  }, []);
  const queryParams = new URLSearchParams({
    api,
    theme,
    ...connectors ? {
      connectors
    } : {}
  });
  const iframeUrl = `https://chift-coverage-matrix.s3.eu-west-3.amazonaws.com/coverage.html?${queryParams.toString()}`;
  const openUrl = currentIframeUrl || iframeUrl;
  const toggleFullscreen = () => {
    if (!document.fullscreenElement) {
      iframeRef.current?.requestFullscreen();
    } else {
      document.exitFullscreen();
    }
  };
  const isDark = theme === 'dark';
  const buttonStyle = {
    display: 'inline-flex',
    alignItems: 'center',
    gap: '8px',
    padding: '4px 12px',
    fontSize: '14px',
    fontWeight: '500',
    color: isDark ? '#d4d4d4' : '#374151',
    backgroundColor: 'transparent',
    border: `1px solid ${isDark ? '#404040' : '#e5e7eb'}`,
    borderRadius: '12px',
    cursor: 'pointer',
    textDecoration: 'none',
    transition: 'all 0.15s ease'
  };
  const hoverBg = isDark ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.03)';
  const hoverBorder = isDark ? '#525252' : '#d1d5db';
  const defaultBg = 'transparent';
  const defaultBorder = isDark ? '#404040' : '#e5e7eb';
  return <>
  <div style={{
    display: 'flex',
    justifyContent: 'flex-end',
    gap: '12px',
    marginBottom: '8px'
  }}>
    <button onClick={toggleFullscreen} style={buttonStyle} onMouseEnter={e => {
    e.target.style.backgroundColor = hoverBg;
    e.target.style.borderColor = hoverBorder;
  }} onMouseLeave={e => {
    e.target.style.backgroundColor = defaultBg;
    e.target.style.borderColor = defaultBorder;
  }}>
      <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
        {isFullscreen ? <>
            <polyline points="4 14 10 14 10 20"></polyline>
            <polyline points="20 10 14 10 14 4"></polyline>
            <line x1="14" y1="10" x2="21" y2="3"></line>
            <line x1="3" y1="21" x2="10" y2="14"></line>
          </> : <>
            <polyline points="15 3 21 3 21 9"></polyline>
            <polyline points="9 21 3 21 3 15"></polyline>
            <line x1="21" y1="3" x2="14" y2="10"></line>
            <line x1="3" y1="21" x2="10" y2="14"></line>
          </>}
      </svg>
      {isFullscreen ? 'Exit Fullscreen' : 'Fullscreen'}
    </button>
    <a href={iframeUrl} target="_blank" rel="noopener noreferrer" style={buttonStyle} onMouseEnter={e => {
    e.target.style.backgroundColor = hoverBg;
    e.target.style.borderColor = hoverBorder;
  }} onMouseLeave={e => {
    e.target.style.backgroundColor = defaultBg;
    e.target.style.borderColor = defaultBorder;
  }}>
      <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
        <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path>
        <polyline points="15 3 21 3 21 9"></polyline>
        <line x1="10" y1="14" x2="21" y2="3"></line>
      </svg>
      Open in new tab
    </a>
  </div>
  <iframe ref={iframeRef} src={iframeUrl} title={`Chift Coverage Matrix - ${api}`} style={{
    height: 'max(500px, 80vh)'
  }} className="w-full" allowFullScreen />
  <blockquote>
    <p>
      <strong>Matrix Legend 🧭</strong>
    </p>
    <table>
      <thead>
        <tr>
          <th>Status</th>
          <th>Meaning</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>✅ Implemented</td>
          <td>Endpoint is implemented and available.</td>
        </tr>
        <tr>
          <td>❌ Not supported</td>
          <td>
            Endpoint is not supported by the target software (connector
            limitation). Cannot be implemented.
          </td>
        </tr>
        <tr>
          <td>💬 On request</td>
          <td>
            Endpoint is not implemented but feasibility is validated. Can be
            implemented on request — contact your Chift point of contact to
            discuss scope and timing.
          </td>
        </tr>
        <tr>
          <td>🔎 To be analyzed</td>
          <td>
            Endpoint is not implemented and feasibility has not yet been fully
            assessed. Analysis is pending.
          </td>
        </tr>
      </tbody>
    </table>
  </blockquote>
</>;
};

<ConnectorCardIframe api="accounting" connectors="Dynamics 365 Business Central" />

<Accordion title="Overview Legend 🧭">
  <OverviewLegend showTitle={false} />
</Accordion>

## Introduction

Microsoft Dynamics 365 Business Central is a cloud-based enterprise resource planning (ERP) software designed for small to medium-sized businesses. It provides a comprehensive solution for managing financials, operations, sales, and customer service. It also offers features such as supply chain management, project management, and human resources management.

## Configure Microsoft Dynamics Business Central 365

**Prerequisite(s)**

* Obtain a Tenant Id, Client ID and secret by creating an Azure Application so that your end users can give access to their instance to your app
* Activate the Microsoft Dynamics Business Central 365 integration on the Chift platform

**Activation Process**

1. Sign in to the [Azure portal](https://portal.azure.com) with your credentials (as an admin). If you do not yet have an Azure account, you can sign up for a free account [here](https://signup.azure.com/).
2. You will see your tenant name in the right upper corner:
3. If you don't have a tenant, you can follow this link to [create your tenant.](https://learn.microsoft.com/en-us/entra/fundamentals/create-new-tenant)
4. You can now start registering your app; go to the portal and select "App registrations" (link [here](https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade))
5. Click on "New registration"
   * Give a name to your application
   * Select one of the "Multitenant" application depending on your need.
   * Proceed for registration
   * Under your application, right-click on "Manage" and then "Authentication" to configure the redirection url.
   * Click on "Add a platform" and select "Web" and enter the following redirect URI: "[https://chift.app/oauth2/redirect](https://chift.app/oauth2/redirect)"
   * Click on "Configure".
6. Once this is done, we now need to configure permissions for this application. Go under "API permissions" and click on "Add a permission".
   * Select "Dynamics 365 Business Central" and search for "Financials.ReadWrite.All" as well as "user\_impersonation" and "User.Read" under the "Delegated permissions". Click on "Add permissions" to confirm your choice.
   * As a last step, go to the "Certificates & secrets" tab and then "Client secrets" to add a new Client Secret.
     * Give a description to your secret and an expiration date depending on your use case.
     * Once this is confirmed, copy the value of your client secret to be able to use it in Chift. Under "Overview", copy as well the application client id and your tenant id to be able to use it in Chift.
7. As final check, we need to ensure that assignment is not set to required in 'Enterprise Application' tab.
   * Go to the 'Enterprise Application' tab in your portal
   * Toggle off the 'Assignment required?' setting - turn it to 'No'

## Test Microsoft Dynamics Business Central 365

To test the software integration, create a test account [here](https://www.microsoft.com/fr-fr/dynamics-365/products/business-central). Another alternative is to identify a beta tester in your client base.

## Connect Microsoft Dynamics Business Central 365

To activate a connection with Microsoft Dynamics Business Central 365, users will have to go through the following steps:

* French article: [Help Center - Microsoft Dynamics 365 Business Central FR](https://help.chift.app/articles/9709526268-dynamics-365-business-central?lang=fr)
* English article: [Help Center - Microsoft Dynamics 365 Business Central EN](https://help.chift.app/articles/9709526268-dynamics-365-business-central?lang=en)

See the following paragraph about the custom extension that might be needed for end-users.

## Extension

### Chift Extension for Dynamics 365 Business Central

Depending on your use case, a **custom Chift extension** may need to be installed for end users. This extension provides access to **additional data not available through Business Central’s standard API**. It **does not modify the native behavior of Business Central**, but **enhances its capabilities** by making more data and functionalities accessible.

### Use Cases Requiring the Extension

The extension is required for the following operations:

* Creating invoices
* Creating journal entries
* Creating financial entries
* Managing bank accounts
* Managing ledger accounts
* Deferral codes on sales/purchases invoices (in addition to the extension, a dedicated post connection needs to be enabled on connector level to handle deferral codes)

### Compatibility

* Available for **Business Central version 23 and above**.
* Supports both **new and existing customers**:
  * Existing customers can run the extension alongside their current setup **without altering existing connections**.
  * New customers can install the extension **before or after setting up the initial connector**.

### Mandatory Extension Setting

The connector includes a setting in the platform to make the Chift extension **mandatory for all new connections**, ensuring that each new connection takes advantage of the extended capabilities provided by the extension.

## Coverage

<CoverageIframe api="accounting" connectors="Dynamics 365 Business Central" />

## Technical limitations & specificities

### Post matching with financial entries

Matching after creating a financial entry only works if the matching is done **immediately after creation**, while the batch is still unposted. Once the batch is posted, matching is no longer possible through the standard flow.

As an alternative, you can use the `automated_matching_number` field directly on the financial entry endpoint when creating the entry — no separate matching call is then required.

## Specificities

<Tip>
  Depending on the vendor/customer payment configuration, invoice can go directly to paid when posted skipping the open/posted status. Explanation: [https://www.encorebusiness.com/blog/payment-methods-automatic-payment-in-dynamics-365-business-central/](https://www.encorebusiness.com/blog/payment-methods-automatic-payment-in-dynamics-365-business-central/)
</Tip>

**Invoice status correspondence**

| Chift  | Dynamics |
| ------ | -------- |
| Draft  | Draft    |
| Posted | Open     |
| Paid   | Paid     |

## Troubleshooting

### Specific errors for Business Central:

| Error Code                                 | Error description                                                                                                          | Resolution                                                                          |
| ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
| ERROR\_CONNECTOR\_OUTDATED\_EXTENSION      | The extension is installed but the endpoint or the provided body/params requires the extension to be updated.              | Update the extension through Business Central's interface.                          |
| ERROR\_ACCOUNT\_NUMBER\_CONFIGURATION      | Ledger accounts need the "Gen. Prod. Posting Group" configured to be used in accounting documents.                         | Configure the "Gen. Prod. Posting Group" on the ledger account in Business Central. |
| ERROR\_ACCOUNT\_NUMBER\_NOT\_GOOD\_SCOPE   | Summary ledger accounts cannot be used in bookings/invoices in Business Central.                                           | Use a detail (non-summary) ledger account.                                          |
| ERROR\_BUSINESSCENTRAL\_NOSERIES\_CONSUMED | The No. Series has been fully consumed and needs to be extended.                                                           | Update the No. Series settings in Business Central to extend the allowed range.     |
| ERROR\_CONNECTOR\_CONFIGURATION            | A deferral template must be set up to use deferral codes (start\_date and end\_date) in invoices.                          | Set up a deferral template in Business Central.                                     |
| ERROR\_CONNECTOR\_MISSING\_EXTENSION       | The Business Central Chift extension is required but not installed or outdated.                                            | Install or update the Chift extension for Business Central.                         |
| ERROR\_INVALID\_BODY                       | At least one input field of the body is invalid.                                                                           | Verify the provided fields and values are correct for Business Central.             |
| ERROR\_MULTIPLE\_VAT\_REGIMES\_USED        | You can only use VAT codes from the same VAT posting group in Business Central.                                            | Ensure all VAT codes in the request belong to the same VAT posting group.           |
| ERROR\_TAX\_CODE\_NOT\_CONFIGURED          | The VAT ledger accounts (payable/deductible) must be set up correctly in Business Central.                                 | Configure the VAT payable and deductible ledger accounts on the tax code.           |
| ERROR\_NO\_GL\_ACCOUNT\_CODE\_FOUND        | Cannot determine the ledger account number for the new bank account because no existing bank accounts exist for reference. | Create an initial bank account manually in Business Central first.                  |
