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

# Sage 100

# Connector Details

| Name | Value |
| :- | :- |
| Platform | Sage 100 |
| Auth Type | On-Premise |
| Direction | Read |
| Tap Metrics | Usage: (low) |

# Overview

Sage 100 (formerly MAS 90 / MAS 200) is on-premise ERP software for mid-market businesses, covering financials, inventory, sales order, and purchase order management. It is a distinct product from [Sage 300](https://docs.hotglue.com/connectors/sage300.md), [Sage 300 CRE](https://docs.hotglue.com/connectors/sage-300-cre.md), and [Sage 50 UK](https://docs.hotglue.com/connectors/sage-50.md).

The hotglue Sage 100 connector is an installed Windows program (`.exe`) that runs on the same machine as (or with network access to) Sage 100. While it is running, it reads data over the Sage ProvideX ODBC driver and syncs it to hotglue.

* **Read** can sync any table exposed by the Sage 100 ODBC database. Common header/detail objects (for example sales order history and invoice history) can also be joined into a single stream.
* **Write** is not supported. This connector is read-only.

# Tenant setup guide

Use the guide below to configure the Sage 100 connector.

## Initial credential configuration

Before installing the connector locally, gather the following:

* **Username and password**: Sage 100 credentials for the company. Create a dedicated integration user rather than using an active interactive login.
* **DSN**: Sage 100 data is accessed through the ProvideX ODBC driver. Sage installs a default DSN named `SOTAMAS90`. To confirm it is present and accessible:
  * On 64-bit Windows, open the **32-bit** ODBC administrator at `C:\Windows\SysWOW64\odbcad32.exe` (the ProvideX driver is 32-bit).
  * Open **System DSN** (or **User DSN**) and look for `SOTAMAS90`, or another DSN that uses the **MAS 90 4.0 ODBC Driver**.
  * Open the DSN and set the **Company** field to your Sage 100 company code. The connector connects with `DSN` / `UID` / `PWD` only, so the company must be configured on the DSN itself.
  * Use **Test Connection** on the Debug tab to verify the DSN before running the connector.
* **Company code**: The three-character (or company-specific) Sage 100 company code. Configure this in the ODBC DSN as described above.

Once you have these credentials, provide them to support. In return, you will get the connector file, which is an `exe` Windows program that you will run, and a connector password.

## Sample config

On first run, the connector creates `%APPDATA%\.hotglue\config.yml`. A typical config looks like:

```yml theme={null}
poll_frequency: 30 # poll frequency in seconds
hotglue:
  env_id: <Your env id>
  flow_id: <Your flow id>
  api_key: <Your public api key>
  tenant_id: <Your tenant id>
sage:
  dsn: SOTAMAS90
  uid: <Sage 100 username>
  pwd: <Sage 100 password>
  tables:
    AR_Customer:
      sync: true
      replication_key: "DateUpdated"
    AP_Vendor:
      sync: true
      replication_key: "DateUpdated"
    CI_Item:
      sync: true
      replication_key: "DateUpdated"
    AR_InvoiceHistory:
      sync: true
      replication_key: "DateUpdated"
      has_header_detail_pair: true
```

| Field | Required | Description |
| :- | :- | :- |
| `poll_frequency` | No | Seconds between read cycles for tables that do not set their own `poll_frequency`. Defaults to `30`. |
| `hotglue.env_id` | Yes | hotglue environment id. |
| `hotglue.flow_id` | Yes | hotglue flow id. |
| `hotglue.api_key` | Yes | hotglue public API key. |
| `hotglue.tenant_id` | Yes | Tenant id for this installation. |
| `sage.dsn` | Yes | ODBC DSN name. Usually `SOTAMAS90`. |
| `sage.uid` | Yes | Sage 100 username. |
| `sage.pwd` | Yes | Sage 100 password. |
| `sage.tables` | Yes | Map of Sage ODBC table / stream names to sync settings. |

### Table options

Each key under `tables` is a Sage 100 ODBC table name (for example `AR_Customer`), or one of the [header/detail stream names](#headerdetail-streams) below.

| Field | Required | Description |
| :- | :- | :- |
| `sync` | Yes | Set to `true` to include the table in read syncs. |
| `replication_key` | No | Column used for incremental reads (commonly `DateUpdated`). When set, only rows at or after the last synced value are pulled. |
| `overwrite` | No | When `true`, purges previously synced data for the table before uploading a new full/partial set. |
| `poll_frequency` | No | Per-table override for how often the table is synced, in seconds. |
| `has_header_detail_pair` | For joined streams | Set to `true` for streams that join `{table}Header` and `{table}Detail` into one result set. See [Header/detail streams](#headerdetail-streams). |

## Run the connector

Now you have all you need to run the connector.

1. Download the connector launcher file from support.

> [!NOTE]
>
> The Sage 100 connector is packaged as an `.exe` file. This connector is read-only.

2. Run the launcher `.exe` file. On first run it creates `%APPDATA%\.hotglue` and a starter `config.yml`.
3. Update `config.yml` with your hotglue and Sage credentials, then save the file.
4. If the connector opens a pop-up requesting your connector password, enter the password from support and click OK.

That's it. The connector is now running and ready to sync your Sage 100 data.

Config and logs live under `%APPDATA%\.hotglue` by default (`config.yml` and `hotglue-sage-connector.log`).

To start the connector automatically after reboot, copy the `.exe` into the Windows Startup folder (`Win+R` → `shell:startup`).

# Supported Objects

## Read

Read syncs any table you enable under `sage.tables`. You are not limited to a fixed catalog — the connector can query **any table** exposed by the Sage 100 ProvideX ODBC driver.

Configure reads with either:

1. **Standard table names** — the connector runs `SELECT * FROM {table}`
2. **Header/detail stream names** — with `has_header_detail_pair: true`, the connector joins `{table}Header` and `{table}Detail` into one stream

Field names in results use Sage 100 dictionary names (for example `CustomerNo`, `VendorNo`, `DateUpdated`).

### Common tables

| Table | Suggested `replication_key` | Description |
| :- | :- | :- |
| `AR_Customer` | `DateUpdated` | Customers |
| `AP_Vendor` | `DateUpdated` | Vendors |
| `CI_Item` | `DateUpdated` | Items / inventory master |
| `AR_OpenInvoice` | — | Open AR invoices |
| `AP_OpenInvoice` | — | Open AP invoices |
| `GL_Account` | — | General ledger accounts |

Use Sage's **File Layouts and Program Information** help to find additional table and field names. To sync any other table, use its Sage ODBC table name as the `tables` key.

### Header/detail streams

These streams require `has_header_detail_pair: true`. The connector joins the Header and Detail tables on the documented keys and returns a flattened row per detail line (with header columns included).

| Stream key | Joins | Join columns |
| :- | :- | :- |
| `SO_SalesOrderHistory` | `SO_SalesOrderHistoryHeader` + `SO_SalesOrderHistoryDetail` | `SalesOrderNo` |
| `PO_PurchaseOrder` | `PO_PurchaseOrderHeader` + `PO_PurchaseOrderDetail` | `PurchaseOrderNo` |
| `PO_PurchaseOrderHistory` | `PO_PurchaseOrderHistoryHeader` + `PO_PurchaseOrderHistoryDetail` | `PurchaseOrderNo` |
| `AR_InvoiceHistory` | `AR_InvoiceHistoryHeader` + `AR_InvoiceHistoryDetail` | `InvoiceNo`, `HeaderSeqNo` |
| `AP_InvoiceHistory` | `AP_InvoiceHistoryHeader` + `AP_InvoiceHistoryDetail` | `InvoiceNo`, `HeaderSeqNo` |

When `replication_key` is set on a header/detail stream (for example `DateUpdated`), the filter and ordering are applied on the **Header** table.

> [accordion] Example table config
>
> ```yml theme={null}
> tables:
>   AR_Customer:
>     sync: true
>     replication_key: "DateUpdated"
>   AP_Vendor:
>     sync: true
>     replication_key: "DateUpdated"
>   CI_Item:
>     sync: true
>     replication_key: "DateUpdated"
>     overwrite: true
>   AR_InvoiceHistory:
>     sync: true
>     replication_key: "DateUpdated"
>     has_header_detail_pair: true
>   PO_PurchaseOrder:
>     sync: true
>     replication_key: "DateUpdated"
>     has_header_detail_pair: true
> ```

> [!TIP]
>
> Prefer setting a `replication_key` (usually `DateUpdated`) so the connector can run incremental syncs instead of re-reading the full table on every cycle.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.