Guide to Using Journal Entries and Expenses with Apideck's Microsoft Business Central Connector

Introduction

Microsoft Dynamics 365 Business Central (BC) does not provide dedicated "Journal Entry" or "Expense" objects via its API. Instead, it relies on General Journal Batches and General Journal Lines to record transactions before posting. Apideck's unified Accounting API abstracts these complexities by offering Journal Entries and Expenses as high-level resources, even though under the hood both are implemented with general journals in BC. This combined guide will explain how to manage journal entries and expenses in BC through Apideck, covering initial setup, creation of entries, updating drafts, posting (approval), and retrieval – for both resources. We'll also highlight the unique considerations and differences between journal entries and expenses in this context.

Common Background

In Business Central, all journal lines exist within a batch, and posting operates at the batch level, not per line. When you post a journal, all lines in that batch are transferred into the General Ledger as permanent entries (where they can no longer be modified). Until posting, journal lines are essentially in a draft state – they can be added, edited, or removed freely as they have no effect on account balances. Because BC enforces double-entry balancing, every journal or expense entry must have equal total debits and credits before it can be posted. If multiple unrelated entries share a batch, posting will commit all lines in that batch at once, so it's critical to isolate entries into their own batches (or ensure only one entry's lines are present when posting) to avoid unintended postings.

Apideck's Unified Model

Apideck provides a simplified interface for these operations. A Journal Entry in Apideck represents a set of one or more BC general journal lines grouped by a common document number. An Expense in Apideck is similarly a grouping of journal lines (often two or more) that represent a money-out transaction – typically a payment from a cash/bank account offset by one or more expense accounts. In Apideck's connector configuration for Business Central, you will designate which journal batch to use for each resource (one batch for journal entries and another for expenses, ideally). With that setup, Apideck's API calls will create lines in the specified batch, manage their posting, and retrieve data either from the open batch (for drafts) or from posted ledger entries, all while presenting a unified JSON model to the developer.

In the sections below, we separate the guidance for Journal Entries and Expenses, as their usage and fields differ slightly. Both sections assume you have already connected Apideck to Business Central and have configured the appropriate journal batches in the Apideck dashboard.

I. Journal Entries

Problem Overview

In Business Central, there is no standalone "Journal Entry" resource. Instead, BC uses General Journal Batches and General Journal Lines to record transactions before they are posted. All journal lines reside in a batch, and posting is performed at the batch level (not per individual line). When a batch is posted, its lines become General Ledger Entries in BC. This architecture poses challenges for integration:

  • No direct Journal Entry object: We can't create or post a single entry via a simple API call in BC as you might in other accounting systems. We must interact with journal batches and lines.
  • Batch-level posting: If multiple entries share a batch, posting will commit all lines in that batch at once. This makes it critical to isolate entries to avoid unintended postings.
  • Draft vs Posted state: Journal lines in an open batch represent unposted (draft) entries that can still be modified. Once posted, those transactions move to the ledger and become read-only.

Apideck's connector abstracts these complexities by providing a unified Journal Entry model. It uses BC's journal batches and lines under the hood, but presents a cleaner interface to developers.

Initial Setup

Before using journal entry operations, some one-time setup is required:

  1. Choose or create a journal batch in BC: In Business Central's Finance > General Journals page, either select an existing General Journal Batch or create a new one for Apideck integration (for example, a batch named "JEINT"). Using a dedicated batch is recommended to isolate Apideck's journal entries, but it is not mandatory.
General Journals in Business Central
General Journals in Business Central
  1. Configure the Expenses journal batch in Apideck: Go to the Apideck dashboard, open the Business Central connector configuration, then navigate to Configurable Resources. Select Journal Entries and set the Default Journal Batch Name field to match the name of the journal batch you chose in BC (e.g., "JEINT"). This tells Apideck exactly where to create the journal lines for Expense records.
Configuring Journal Entries Batch in Apideck
Configuring Journal Entries Batch in Apideck

With this setup, Apideck will use the specified batch for journal entry operations. While reusing an existing batch is supported, isolating a batch for integration purposes is still best practice to prevent conflicts with manual entries or unintended postings.

Adding Journal Entries (Create)

When you add a journal entry via Apideck, you are creating one or more General Journal Lines in the configured BC journal batch. The entry can be created in either draft or posted status, depending on what you specify in the payload.

Key aspects to understand:

  • Unified journal entry model: Apideck provides a Journal Entry model that maps your request to BC's journal lines. Each line in your payload becomes a BC journal line, grouped together under the same document number. The schema supports a wide range of fields such as amounts, debit/credit types, ledger accounts, tax details, and tracking categories.
  • Status control: If you create the entry with status: draft, the lines remain in the batch and are editable. If you set status: posted (or approved), Apideck will attempt to both create and immediately post those lines into the general ledger.
  • Document Number as ID: The journal entry ID returned by Apideck for created entries in this connector is essentially the document number you provided. In BC, that number will appear as the Document Number on each journal line. It's how Apideck groups lines together into one logical entry. For example, if you set "number": "G00028", all lines of this entry will have Document No. G00028 in BC, and Apideck will return "id": "G00028" for the created entry.
  • No Immediate Ledger Impact: After creation, the entry is in draft status by default (unless you explicitly set it to posted, which we'll cover later). Draft means the lines exist in the journal batch but are not yet applied to the ledger – in BC they are unposted journal lines, which have no effect on account balances
  • Balancing requirement: Business Central enforces balancing (debits equal credits) when posting. Draft entries can exist in an unbalanced state, but posting will fail if they don't balance. This validation happens at posting time.
  • Rollback behavior: Apideck ensures operations are atomic. If an error occurs during creation, no partial lines remain in the batch. Similarly, if posting fails (for example, because of validation errors in BC), the connector will roll back the lines that were inserted for that entry so you don't end up with orphaned data.

The result of a successful add is a journal entry in Apideck's unified format with its own id. The entry will either remain in draft or transition to posted, depending on the status you se

Below is an example of a JSON payload to create a draft journal entry with two line items via Apideck's Accounting API:

{
  "number": "G00028",
  "status": "draft",
  "posted_at": "2025-08-05",
  "line_items": [
    {
      "description": "Scotia Bank Account desc",
      "total_amount": -2.12,
      "type": "credit",
      "ledger_account": {
        "id": "ef7238b0-a468-f011-8eed-7c1e52dd9cc8"
      },
      "tax_rate": {
        "code": "LABOR"
      },
      "tracking_categories": [
        {
          "id": "e997fc8b-ba2b-f011-9af4-6045bdc89d67",
          "parent_id": "d697fc8b-ba2b-f011-9af4-6045bdc89d67"
        },
        {
          "id": "ed97fc8b-ba2b-f011-9af4-6045bdc89d67",
          "parent_id": "d797fc8b-ba2b-f011-9af4-6045bdc89d67"
        }
      ]
    },
    {
      "description": "Rent / Leases",
      "total_amount": 2.12,
      "type": "debit",
      "ledger_account": {
        "id": "135a0486-ba2b-f011-9af4-6045bdc89d67"
      },
      "tax_rate": {
        "code": "NONTAXABLE"
      },
      "tracking_categories": [
        {
          "id": "e997fc8b-ba2b-f011-9af4-6045bdc89d67",
          "parent_id": "d697fc8b-ba2b-f011-9af4-6045bdc89d67"
        },
        {
          "id": "ec97fc8b-ba2b-f011-9af4-6045bdc89d67",
          "parent_id": "d797fc8b-ba2b-f011-9af4-6045bdc89d67"
        }
      ]
    }
  ]
}

After a successful creation, Apideck will respond with the created Journal Entry resource (with an id likely equal to "G00028" and status: "draft"). In BC's General Journal, you would see a new set of lines under the batch (e.g., DEFAULT batch) with Document No. G00028.

Journal lines in Business Central showing Document No. G00028
Journal lines in Business Central showing Document No. G00028

Updating a Journal Entry (Update)

You can update a draft journal entry via PATCH /accounting/journal-entries/{id}. This allows you to change fields or even modify the line items (e.g., adjust amounts, descriptions, add or remove lines) before posting. Under the hood, updating a journal entry in this connector means adjusting the corresponding journal lines in the BC batch.

Because the BC API doesn't have a concept of an "entry" object to update (only individual journal lines), Apideck's connector will handle updates by ensuring the BC journal lines match the updated data. Depending on what changes, the connector might:

  • Delete the existing lines (with the given document number) from the batch.
  • Re-create new lines in the batch with the updated values.

This approach ensures the whole entry is updated consistently. However, it also means that the internal identifiers of the journal lines can change upon update. For example, BC assigns each journal line a unique id (GUID) and line number when created. If Apideck deletes and reinserts lines, those will get new IDs/line numbers. From the Apideck API perspective, you mostly interact with the journal entry as a whole (using the entry's number/ID), so this detail usually doesn't affect the API usage – just be aware that if you fetched the raw BC journal line IDs at any point (perhaps via a Proxy or for debugging), they could change after an update.

Similar to creation, Apideck employs a rollback on update errors. If something fails during the update process, the connector will attempt to revert to the previous state so that you don't end up with a half-updated set of lines. In practice, you either get a fully successful update or the original entry remains intact (if the update failed).

Note: You cannot update a journal entry that has already been posted (status final). If you attempt to do so, the API will return an error. Once posted, entries are read-only (as they are now ledger entries in BC).

Posting (Approving) a Journal Entry

"Posting" a journal entry means moving it from the journal batch into the general ledger in Business Central. In Apideck's unified model, this is typically indicated by the status field on the Journal Entry. The common statuses are:

  • draft – not yet posted (journal lines in the batch, editable).
  • posted – posted to the ledger (finalized).

To post a journal entry via Apideck, you have two options:

  • Create the entry with a posted status: You can POST /accounting/journal-entries and set "status": "posted" (or "approved") in the payload. This indicates you want to create and immediately post the entry.
  • Update an existing draft entry to posted: You can PATCH /accounting/journal-entries/{id} for a draft entry, setting "status": "posted".

In both cases, Apideck's connector will interpret this as a signal to perform the posting action in Business Central. The connector will first ensure all the journal lines for that entry are up to date in the batch, then call Business Central's post operation on the batch. (Under the hood, BC requires a separate call to post a journal – you insert lines via one API call, then you must call a POST action on the journal itself to post. This is not done line-by-line, but for the whole batch. Apideck abstracts this for you.)

What happens when posting:

  • Business Central will attempt to post all lines in the configured batch. In practice, if you have used a dedicated batch for Apideck operations, this will typically correspond to all lines of the single journal entry you are posting (since ideally each entry uses a unique document number and you post entries one at a time). If the batch contains other unposted lines with different document numbers, BC's default behavior is to post them as well in one go.
  • BC will create General Ledger Entries from those journal lines. Each line in the journal batch, upon posting, generates one or more ledger entries (one per affected account per line, essentially).
  • Once posting is successful, the journal lines are cleared out of the batch.
  • The Apideck Journal Entry's status will now be "posted". The id (document number) remains the same, so you can query it as a posted entry.

Important note:

Not all integrations built on Apideck will choose to post journal entries automatically. In some scenarios, the integrator may decide to only create entries in draft status and leave the actual posting step to the end users inside Business Central. This allows the finance team to review, adjust, and then manually post the journals in BC's UI. The Apideck connector fully supports this workflow: if you do not send "status": "posted", the entry will remain in the batch as draft until a user posts it directly in Business Central.

Manual posting workflow in Business Central
Manual posting workflow in Business Central

Retrieving Journal Entries (Get One / Get All)

Apideck provides endpoints to fetch journal entries, either individually or in list. However, because of the dual nature of journal entries in Business Central (draft vs posted), it's important to use the status filter when reading them:

  • Get All Journal Entries: GET /accounting/journal-entries – This returns a list of journal entries. By default, it may include both draft and posted entries from the unified API perspective. To narrow down:
    • Use query parameter status=draft to retrieve unposted journal entries. Under the hood, the Apideck connector will fetch the journal lines from the configured BC journal batch (the one we set up) and group lines by document number to construct each Journal Entry object. Only entries that are still in the batch (not posted yet) will appear here.
    • Use status=posted (or status=approved) to retrieve posted journal entries. The connector will fetch data from Business Central's General Ledger (likely using BC's General Ledger Entries or a similar endpoint) and convert those into Journal Entry objects in the response. These represent entries that have been posted to accounts. They will include whatever info is available from the ledger (amounts, accounts, date, etc., usually read-only data).
  • Get One Journal Entry: GET /accounting/journal-entries/{id} retrieves a single journal entry by its identifier (usually the document number, e.g. G00028).
    • The connector first looks for the entry in the configured journal batch (unposted lines).
    • If it's not found there, it automatically looks in the General Ledger Entries (posted entries).
    • The returned entry will indicate its current status (draft or posted) so you know whether it's still in the batch or already finalized in the ledger.

II. Expenses

Problem Overview

In Business Central, there is no standalone Expense resource. Instead, BC uses General Journal Batches and General Journal Lines to capture transactions before they are posted. All lines reside within a batch, and posting is always performed at the batch level (not on individual lines). Once a batch is posted, its lines become General Ledger Entries in BC.

This poses challenges when working with Expenses:

  • No direct Expense object: Business Central does not expose an Expense entity. To bridge this gap, Apideck represents Expenses by creating journal lines in the configured journal batch for draft entries, and by reading from general ledger entries once they are posted.
  • Double-entry requirement: Every transaction in BC must balance with debits and credits. This means an Apideck expense, which might appear as a single entry in other systems, will be composed of multiple journal lines in BC. In practice, each expense line item will become a journal line (e.g. debiting an expense account), and the specified account_id (such as a cash or bank account) will generate an additional line to offset it (e.g. crediting the bank). The connector must handle this automatically to keep the journal balanced.
  • Batch-level posting: If multiple expenses or other entries share the same batch, posting will commit all lines in that batch together. To prevent unintended postings, it's recommended to isolate Expenses in their own batch.
  • Draft vs Posted state: When an Expense is in draft, its journal lines remain editable inside the journal batch. Once it is posted, those lines disappear from the batch and reappear as read-only ledger entries in BC.

Apideck's connector abstracts these mechanics by exposing a unified Expense model. Draft Expenses map to journal lines, and posted Expenses map to ledger entries, so the developer always interacts with a consistent resource while Apideck manages BC's underlying journal behavior.

Initial Setup

Before using expenses operations, some one-time setup is required:

  1. Choose or create a Journal Batch in BC: Go to Finance > General Journals in BC and either use an existing batch or create a new one (for example, EXPENSES). While reusing an existing batch is possible, a dedicated batch is recommended for integration purposes.
General Journals in Business Central for Expenses
General Journals in Business Central for Expenses
  1. Configure the Expenses journal batch in Apideck: Go to the Apideck dashboard, open the Business Central connector configuration, then navigate to Configurable Resources. Select Expenses and set the Expenses Journal Batch Name field to match the name of the journal batch you chose in BC (e.g., "EXPENSES"). This tells Apideck exactly where to create the journal lines for Expense records.
Configuring Expenses Journal Batch in Apideck
Configuring Expenses Journal Batch in Apideck

With this setup, all Expense operations will consistently target the configured journal batch in Business Central.

Adding Expenses (Create)

When you create an expense via Apideck (POST /accounting/expenses), Apideck will translate your request into one or more General Journal Lines in the configured BC journal batch. Although you are creating what appears to be a single "expense" record, under the hood it will typically result in two or more journal lines in Business Central (to satisfy the double-entry accounting requirement). Key aspects of this process include:

  • Unified expense model: Apideck provides an Expense model that allows you to specify the expense details in a single payload. You'll include fields like transaction_date (the date of the expense), an account_id (the ledger account from which the expense is paid, e.g. a bank or cash account), and one or multiple line_items for the expense breakdown (each with its own amount, description, and expense category account). For example, you might have an expense paid from a cash account (specified in account_id) that covers two line items: one for Travel expense and one for Meals. Each line item will map to a BC account (like Travel Expense GL and Meals Expense GL respectively).
  • Status control: If you create the entry with status: draft, the lines remain in the batch and are editable. If you set status: posted (or approved), Apideck will attempt to both create and immediately post those lines into the general ledger.
  • Document Number as ID: The identifier (id) returned for the created expense will typically correspond to the Document Number used in BC's journal for that entry. If you provide a number in the payload, Apideck will use that as the Document No. in BC. In Business Central's General Journal page, you will see the new lines all labeled with that Document No., effectively grouping them as one expense entry. For example, if Apideck returns "id": "EXP-1001" for the expense, you should find journal lines in BC's chosen batch with Document No. EXP-1001 on each line.
  • No immediate ledger impact: After a successful create call, the expense resides in BC as unposted journal lines. At this point, it has no effect on account balances in the general ledger. You can still retrieve it via Apideck (it will show status: draft or equivalent) and even modify it if needed (see Update section). Business Central has simply stored it in the journal batch as a pending entry.
  • Balancing requirement: Business Central enforces balancing (debits equal credits) when posting. Draft entries can exist in an unbalanced state, but posting will fail if they don't balance. This validation happens at posting time.
  • Rollback behavior: Apideck ensures operations are atomic. If an error occurs during creation, no partial lines remain in the batch. Similarly, if posting fails (for example, because of validation errors in BC), the connector will roll back the lines that were inserted for that entry so you don't end up with orphaned data.

The result of a successful add is a journal entry in Apideck's unified format with its own id. The entry will either remain in draft or transition to posted, depending on the status you se

Below is an example of a JSON payload to create a draft journal entry with two line items via Apideck's Accounting API:

{
  "number": "EXP004",
  "status": "draft",
  "transaction_date": "2025-08-05",
  "account_id": "ef7238b0-a468-f011-8eed-7c1e52dd9cc8",
  "type": "expense",
  "tax_rate": {
    "code": "LABOR"
  },
  "total_amount": 2.22,
  "line_items": [
    {
      "id": "bfdbaaf0-a176-f011-8eef-6045bdb143e7",
      "tracking_categories": [
        {
          "id": "e997fc8b-ba2b-f011-9af4-6045bdc89d67",
          "parent_id": "d697fc8b-ba2b-f011-9af4-6045bdc89d67"
        },
        {
          "id": "ec97fc8b-ba2b-f011-9af4-6045bdc89d67",
          "parent_id": "d797fc8b-ba2b-f011-9af4-6045bdc89d67"
        }
      ],
      "account_id": "135a0486-ba2b-f011-9af4-6045bdc89d67",
      "tax_rate": {
        "code": "NONTAXABLE"
      },
      "description": "Rent / Leases",
      "total_amount": 2.22
    }
  ],
  "reference": "ef7238b0-a468-f011-8eed-7c1e52dd9c",
  "custom_fields": []
}

After a successful creation, Apideck will respond with the created Expense resource (with an id likely equal to "EXP004" and status: "draft"). In BC's General Journal, you would see a new set of lines under the batch with Document No. EXP004.

Journal lines in Business Central showing Document No. EXP004
Journal lines in Business Central showing Document No. EXP004

Updating a Journal Entry (Update)

You can modify an unposted expense by calling PATCH /accounting/expenses/{id}. This allows you to correct details or alter the breakdown of the expense before it's posted to the ledger. Under the hood, updating an expense in BC means adjusting the corresponding journal lines in the batch.

Because Business Central doesn't treat the collection of journal lines as a single mutable object, the Apideck connector handles updates by effectively reconciling differences and re-writing the journal lines for that expense. In practice, when you send an update:

  • The connector will locate the journal lines in the configured batch that belong to the expense (identified by the Document No. or ID).
  • It may delete or void the existing lines for that expense in the batch.
  • It will then insert new journal lines reflecting the updated data (similar to how it created them in the first place, using the same Document No.).

This strategy ensures the entire expense entry is updated consistently in BC's journals. However, one side effect is that internal line identifiers (BC's GUIDs for each line) will likely change after an update. From Apideck's perspective this is not an issue – the expense is still identified by the same id (Document No.), and when you fetch the expense you'll get the latest data.

Just like on creation, Apideck maintains an all-or-nothing approach on updates. If any part of the update fails (e.g., due to an invalid account_id, an unbalanced set of line items, or a Business Central validation error), the connector will attempt to roll back to the previous state. You won't end up with half-updated data in the journal. The update either succeeds fully (and the expense's journal lines are replaced with the new version) or an error is returned and the original lines remain intact.

Important: You cannot update an expense that has already been posted to the ledger. Once posted (i.e., the journal lines have become permanent ledger entries), the entry is effectively read-only.

Posting (Approving) an Expense

"Posting" an expense means moving it from the journal batch into the general ledger in Business Central. In Apideck's unified model, this is indicated by the status field on the Expense. The common statuses are:

  • draft – not yet posted (journal lines in the batch, editable).
  • posted – posted to the ledger (finalized).

To post an expense via Apideck, you have two options:

  • Create the expense with a posted status: You can POST /accounting/expenses and set "status": "posted" (or "approved") in the payload. This indicates you want to create and immediately post the expense.
  • Update an existing draft expense to posted: You can PATCH /accounting/expenses/{id} for a draft expense, setting "status": "posted".

In both cases, Apideck's connector will interpret this as a signal to perform the posting action in Business Central. The connector will first ensure all the journal lines for that expense are up to date in the batch, then call Business Central's post operation on the batch. (Under the hood, BC requires a separate call to post a journal – you insert lines via one API call, then you must call a POST action on the journal itself to post. This is not done line-by-line, but for the whole batch. Apideck abstracts this for you.)

What happens when posting:

  • Business Central will attempt to post all lines in the configured batch. In practice, if you have used a dedicated batch for Apideck operations, this will typically correspond to all lines of the single expense you are posting (since ideally each expense uses a unique document number and you post them one at a time). If the batch contains other unposted lines with different document numbers, BC's default behavior is to post them as well in one go.
  • BC will create General Ledger Entries from those journal lines. Each line in the journal batch, upon posting, generates one or more ledger entries (one per affected account per line, essentially).
  • Once posting is successful, the journal lines are cleared out of the batch.
  • The Apideck Expense's status will now be "posted". The id (document number) remains the same, so you can query it as a posted expense

Important note:

Not all integrations built on Apideck will choose to post journal entries automatically. In some scenarios, the integrator may decide to only create entries in draft status and leave the actual posting step to the end users inside Business Central. This allows the finance team to review, adjust, and then manually post the journals in BC's UI. The Apideck connector fully supports this workflow: if you do not send "status": "posted", the entry will remain in the batch as draft until a user posts it directly in Business Central.

Manual posting workflow in Business Central
Manual posting workflow in Business Central

Retrieving Expenses (Get One / Get All)

Apideck provides endpoints to fetch expenses, either individually or in list. Because of the dual nature of expenses in Business Central (draft vs posted), it's important to use the status filter when reading them:

  • Get All Expenses: GET /accounting/expenses – This returns a list of expenses.
    • Use query parameter status=draft to retrieve unposted expenses. Under the hood, the Apideck connector will fetch the journal lines from the configured BC journal batch and group them by Document No. to construct each Expense object. Since BC doesn't have a native Expense entity, what you see here is simply all the grouped lines currently in the batch that Apideck created for expenses.
    • Use status=posted (or status=approved) to retrieve posted expenses. The connector will fetch data from Business Central's General Ledger and convert those entries into unified Expense objects. Because BC automatically generates a wide variety of ledger entries (including cost-of-goods or inventory-related ones), Apideck applies a filter: it only groups ledger entries as Expenses if at least one line is an asset account (typically a bank or cash account) and not an inventory account. This approach helps exclude direct costs that Business Central might automatically generate, so the expense list reflects only real "outflow" type expenses.
  • Get One Expense: GET /accounting/expenses/{id} retrieves a single expense by its identifier (usually the Document No., e.g. EXP00042).
    • The connector first looks in the configured journal batch for unposted lines with that Document No. If found, it groups those into an Expense with status: draft.
    • If it's not found in the journal, it automatically looks in the General Ledger Entries (posted transactions).
    • The returned Expense indicates its current status (draft or posted), so you know whether it's still editable in the batch or already finalized in the ledger.

Important note:

Because Business Central does not have a native Expense resource (just like it also does not have a native Journal Entry resource), Apideck reconstructs expenses from journal lines (if draft) or general ledger entries (if posted). Within each group of lines that share the same Document No., Apideck must map one line back to the root account_id. The rule is: the line that represents an asset account (typically the bank or cash account used for payment) becomes the Expense's account_id. All the other lines are considered line_items. This way, the Expense model always reflects the payment source (account_id) separately from the expense breakdown (line_items).

Alternatives to Expenses

While the Expenses resource is designed for straightforward cash or card purchases, Apideck also supports other approaches for recording outflows in Business Central. Depending on your needs, you may consider:

  • Journal Entries: You can bypass the Expenses resource and directly use Apideck's Journal Entries API to record costs. This provides maximum flexibility, since you control all debit and credit lines explicitly. However, it requires more detailed handling and is closer to BC's native journal structure.
  • Bills and Bill Payments: Another alternative is to use Bills (for recording amounts owed to suppliers) together with Bill Payments (for settling those bills). This approach offers richer supplier-facing functionality: you can mark the vendor, include due dates, and manage accounts payable workflows. The trade-off is that it requires more actions (creating a bill and then a payment) compared to a single Expense entry.

Choosing between these depends on your integration's needs:

  • Use Expenses for quick "already paid" transactions (cash or card).
  • Use Journal Entries if you want full accounting flexibility.
  • Use Bills and Bill Payments if you need to track vendor obligations and payment history.

Conclusion

Using Apideck's unified API for Business Central simplifies working with resources that BC does not natively expose, such as Journal Entries and Expenses. While BC relies on General Journal Batches and Lines, Apideck abstracts these into high-level models with consistent behaviors:

  • Both resources support draft vs posted states, reflecting unposted journal lines versus finalized ledger entries.
  • Both require a dedicated batch setup to isolate integration-created entries and avoid unintended postings.
  • Both handle atomic operations with rollback on errors, preventing partial data issues.

The difference lies mainly in purpose: Journal Entries give maximum flexibility by letting you define all debit and credit lines explicitly, whereas Expenses streamline the common "already paid" purchase use case by automatically generating balancing lines. Together, they cover a wide range of accounting integration needs.

By configuring batches correctly, understanding draft vs posted states, and leveraging Apideck's rollback and unified schema, developers can confidently integrate transactions into Business Central without dealing with its low-level journal mechanics. This approach allows you to focus on your product's logic while ensuring accurate, reliable financial data in BC.