The Excel formula `I_EOL_GLTXN_POST` uploads financial transaction lines into Exact Online's general ledger. Per data element the data is taken from a specific cell or a range. All ranges need to be either a single cell (a constant) or have the same size, one for each financial transaction line. Financial transactions are grouped in transactions to the level the data allows combining them. The formula supports both memorandum entries and journals with a predefined contra account, such as sales transactions. Uploads are processed in XML batches for speed and to minimize API consumption. It is possible to process thousands of lines in one run, including across multiple Exact Online companies. To prevent accidental duplicate bookings, the formula only uploads data when `process` is set to `TRUE`. In practice this is often controlled through a separate worksheet cell that acts as an execution switch. When the upload has completed, the formula result indicates how much data has been processed. Parameters: - `process`: whether to actually execute the upload. - `divisionR`: range with Exact Online division codes. - `finYearR`: range with Exact Online financial years. - `finPeriodR`: range with Exact Online financial periods. - `journalCodeR`: range with Exact Online journal codes. - `entryNrR`: range with Exact Online entry number. - `finDateR`: range with financial dates. - `glActCodeR`: range with general ledger account codes. - `glActCodeIntR`: range with general ledger intermediate account codes. - `descR`: range with descriptions. - `noteR`: range with notes. - `costCentreR`: range with cost centres. - `costUnitR`: range with cost units. - `assetR`: range with asset codes. - `projectR`: range with project codes. - `qtyR`: range with quantities. - `actR`: range with account codes for customers, suppliers and others. - `ourRefR`: range with our reference values. - `debitAmtR`: range with debit amounts. - `creditAmtR`: range with credit amounts. - `accountCodeInHeader`: whether to include account code in the transaction header, creating at least one transaction per customer / supplier / other. Returns: indicator of success. ## Behaviour Each parameter that becomes part of the transaction line accepts either: - a fixed single value, or - an Excel range. When a range is used, all ranges that contribute line-level values must have identical dimensions. The number of rows in those ranges determines how many transaction lines are generated. For each generated line, the formula takes the value from the same row and column position in each participating range. Fixed values are reused for all generated lines. Many fields are optional. Which fields are required depends on the journal configuration and Exact Online validation rules. ## Grouping The formula first converts the input into a flat list of candidate transaction lines. It then groups those lines into Exact Online transactions based on the common header-level values available in the input. This makes it possible to: - upload a single transaction with multiple lines; - upload multiple transactions in one formula call; - upload transactions into multiple divisions in one run. When `accountCodeInHeader` is set to `TRUE`, the relation account is moved from the line level to the transaction header. This is typically needed for sales journals and can cause the formula to create at least one separate transaction per customer, supplier or other relation. ## Usage notes The following usage notes provide further guidance: - Set `process` to `FALSE` while designing or validating the worksheet. - Switch `process` to `TRUE` only when the data is ready for upload. - For sales and purchase style journals in Exact Online's mixed ledger, usually only one side of the entry needs to be provided. The other side is derived automatically from the journal settings. - If an incorrect batch was posted, the entries can usually be removed efficiently in Exact Online by selecting the relevant division, journal and period. ## Examples ### Example 1 - memorandum entry with two lines This example creates one memorandum transaction with two lines in division `102673`. Input ranges: - `divisionR`: `102673` - `finYearR`: `2026` - `finPeriodR`: `4` - `journalCodeR`: `MEM` - `entryNrR`: empty - `finDateR`: `2026-04-15` - `glActCodeR`: range with values: - `8000` - `1230` - `descR`: range with values: - `Land`: `NL` - `debitAmtR`: range with values: - `25` - `0` - `creditAmtR`: range with values: - `0` - `25` - `accountCodeInHeader`: `FALSE` Result: - one Exact Online transaction; - two lines; - line 1 debits G/L account `8000` for `25`; - line 2 credits G/L account `1230` for `25`. ### Example 2 - same header values, multiple generated lines Assume the following columns in Excel: | Row | G/L Account | Description | Amount | |-----|-------------|---------------------|--------| | 1 | 8000 | Land | 25 | | 2 | 1230 | Change land value | -25 | You can map them as: - `divisionR`: single fixed value `102673` - `glActCodeR`: 2-row range containing `8000`, `1230` - `descR`: 2-row range containing `Land`, `Change land value` - amount mapped into `debitAmtR` and `creditAmtR` according to sign This generates two Exact Online transaction lines. Because `divisionR` is a fixed value, that value is reused on both lines. ### Example 3 - sales journal with account in header For a sales journal, the customer account often needs to be stored in the transaction header instead of on each line. In that case: - set `accountCodeInHeader` to `TRUE`; - provide the customer code through `actR`; - provide only the sales-side line values; - let the contra posting be derived from the journal settings in Exact Online. Typical setup: - `divisionR`: `102673` - `finYearR`: `2026` - `finPeriodR`: `4` - `journalCodeR`: `VRK` - `finDateR`: `2026-04-15` - `actR`: `CUST001` - `glActCodeR`: `8000` - `descR`: `Consulting services April` - `debitAmtR`: `0` - `creditAmtR`: `1500` - `accountCodeInHeader`: `TRUE` Result: - one sales transaction for customer `CUST001`; - the customer account is set on the header; - the journal determines the contra entry automatically. ### Example 4 - controlled execution from a worksheet cell A common pattern is to place `FALSE` in a control cell such as `B1` while preparing the data, and use that cell as the `process` parameter: - `B1=FALSE`: evaluate without posting. - `B1=TRUE`: execute the upload during recalculation. This reduces the risk of accidentally uploading the same data multiple times during editing.