# Sage 100 Connector

## Overview

Setting up the connection requires a supported Sage 100 version. From there it takes two things:
you configure access inside your Sage 100, and you give us three details that we store on the
Workist side.

**[Prerequisite for your Sage 100](#supported-sage-100-versions)**

Sage 100 by Sage GmbH (Germany, Austria, Switzerland), version 9.0.8 and above, plus a
**3rd Party Gateway** licence.

**[To be set up in your Sage 100](/en/docs/data-exchange/connectors/sage-100-installation.md)**

| Step | Where |
| --- | --- |
| Connect the Sage Connectivity Gateway | Sage Server Manager → **Externe API** |
| Install the Workist API extension | AppDesigner (metadata import) |
| Apply permissions and Workist fields | AppDesigner or SQL Server Management Studio |
| Enable the databases for the API | Sage 100 Administrator |
| Add the Workist client ID as a user and grant permissions | Sage 100 Administrator |
| Restart the application server | Sage Server Manager |

The complete step-by-step guide with downloads, client ID, permissions and troubleshooting is at
[Sage 100 – Installation](/en/docs/data-exchange/connectors/sage-100-installation.md).

**[Details Workist needs from you](#details-for-the-workist-configuration)**

| Detail | Where you find it |
| --- | --- |
| **EntitlementID** | Sage Server Manager → **Externe API** → *your server* → **Konfiguration** |
| **DataSet** | Sage 100 Administrator |
| **Document type** | Sage 100 Materials Management |
| **Version of the Workist API extension** | File version of the Workist DLLs, last digit |

Version 9 of the extension adds the price check, open quotes, orders based on a quote and the ERP
features of the agents — see [Features from version 9](#features-from-version-9-of-the-extension).

## Supported Sage 100 versions

The connector works with **Sage 100 by Sage GmbH** — the edition for Germany, Austria and
Switzerland. These versions are supported:

| Sage 100 version | Supported |
| --- | --- |
| 9.0.11 | yes |
| 9.0.10 | yes |
| 9.0.9 | yes |
| 9.0.8 | yes |
| 9.0.7 and older | no |

The [Workist API extension](/en/docs/data-exchange/connectors/sage-100-installation.md#downloads) contains a separate package for each of these versions.
Only the package matching your Sage 100 version is installed — the packages are not
interchangeable. Your Sage 100 partner can tell you which version you are running.

If your Sage 100 runs on an older version, an update to at least 9.0.8 is a prerequisite for the
connection. If your version is not listed here, talk to us — we will check whether a matching
package is available.

:::note Permissions script
From version 9.0.9 onwards, the metadata import creates permissions. With version 9 of the
extension, run the supplied SQL script on every Sage 100 version anyway — see
[Installation, step 4](/en/docs/data-exchange/connectors/sage-100-installation.md#step-4-apply-the-permissions).
:::

:::warning Other products named "Sage 100"
In other markets, Sage sells separate products under the same name — for example Sage 100 in the
US (formerly Sage MAS 90 and MAS 200) or Sage 100 Comptabilité and Gestion Commerciale in France.
These have a different data model and their own version numbering. The Workist Sage 100 connector
is **not** compatible with them.
:::

## Setup in your Sage 100

For Workist to read data from your Sage 100 and create documents in it, additional API endpoints
are installed in Sage 100. The setup is usually carried out by your IT or your Sage 100 partner,
mostly together with Workist. Plan a maintenance window for it: at the end, the application
server has to be restarted.

All steps, the downloads and troubleshooting are at
[Sage 100 – Installation](/en/docs/data-exchange/connectors/sage-100-installation.md).

## Details for the Workist configuration

For Workist to reach your Sage 100 we need three details from you. All three come from your
Sage 100 — there is nothing for you to set up on the interface itself. On top of that comes the
version of the installed Workist API extension.

| Detail | Where you find it | What it does |
| --- | --- | --- |
| **EntitlementID** | Server Manager → **Externe API** → *your server* → **Konfiguration** | Identifies your installation in the Connectivity Gateway |
| **DataSet** | Sage 100 Administrator, status bar or login dialog | Database name, ";" and client number, e.g. `WAWI_DB;1` — determines database and client |
| **Document type** | Sage 100 Materials Management | Determines which document type Workist creates |
| **Version of the extension** | File version of the Workist DLLs, last digit | Determines which fields and features Workist uses |

### EntitlementID

The EntitlementID identifies your Sage 100 installation to the Connectivity Gateway. It is created
when the 3rd Party Gateway is licensed and can be viewed in the Sage 100 Server Manager under
**Externe API** → *your server* → **Konfiguration**. It cannot be changed there — it is set when
the connection is established, see
[Installation, step 1](/en/docs/data-exchange/connectors/sage-100-installation.md#step-1-connect-the-connectivity-gateway). The
same dialog is where you set which application server requests are forwarded to, and configure a
proxy if needed.

### DataSet

The DataSet determines which database and which client of your Sage 100 Workist reads from and
writes to. It consists of the database name, a semicolon and the client number — for example
`WAWI_DB;1`. Write the database name exactly as it appears in Sage 100, without spaces.

You find the database name and client number here:

- **Status bar** — at the very bottom of the main window of the open Sage 100
- **Login dialog** — when you select the client, the client number appears directly before the
  company name
- **Sage 100 Administrator** — in the left tree under **Mandanten** (clients)

A connection works in exactly one client. That client's database must be enabled in the Sage 100
Administrator with the option **Für API freigeben** (enable for API) — see
[Installation, step 6](/en/docs/data-exchange/connectors/sage-100-installation.md#step-6-enable-the-databases). Workist creates a
separate connection for the test and the production database.

### Document type

You decide which document type Workist creates — usually your sales or order processing team.
Technically it is addressed through a key. Only **sales** initial document types can be created;
purchase documents such as an order to a supplier are not possible. In standard Sage 100 these
are:

| Key | Document type |
| --- | --- |
| `VFR` | Invoice |
| `VLL` | Delivery note |
| `VPA` | Quote |
| `VPM` | Sample document |
| `VSD` | Direct invoice |
| `VSL` | Immediate invoice |
| `VSS` | Immediate order |
| `VVA` | Order confirmation |

What counts is which document types are configured in your Sage 100 — initial document types you
have created yourself, with their own key, can be used as well. If you do not specify a document
type, Workist creates **immediate orders** (`VSS`).

You can also create a document type of your own — for example with the key `VVK` and the name
"Workist-Bestellung" — so that documents from Workist are recognisable in Sage 100 at a glance.
What is stored in Workist is always the **key**, not the name. If the key does not exist in the
client, Sage 100 rejects the document with a message that the value is not valid for the document
type key field (*Belegtyp-Kennzeichen*).

Instead of creating an order confirmation directly, a preliminary document without effect can
also be worthwhile: your order processing team checks it and then converts it into an order
confirmation. If you change the document type later, check on the next transferred document that
the change has taken effect.

One connection creates exactly one document type. If, say, orders and requests for quotation
should arrive as different document types, Workist sets up separate connections, each with its
own channels.

Sage publishes the full overview in its document API documentation:

<a href="https://sagegmbh.atlassian.net/wiki/spaces/S1/pages/2633039875/4.4.+Beleg+API" target="_blank" rel="noopener noreferrer">Document API – Sage documentation ↗</a>

### Version of the Workist API extension

The last digit of the file version of the Workist DLLs shows which version of the extension is
installed – see
[Installation, step 9](/en/docs/data-exchange/connectors/sage-100-installation.md#step-9-restart-the-application-server).
Workist stores it in the
connection (*Sage 100 API Version*: version 5, 7 or 9). Without a value, Workist works as with
version 5.

| Version | What Workist additionally uses |
| --- | --- |
| 5 | Base scope: reading master data, creating sales documents |
| 7 | The delivery terms from the document (Incoterm) are passed to the document |
| 9 | All [features from version 9](#features-from-version-9-of-the-extension) |

Workist does not read the version from your Sage 100 itself. Let us know after an update of the
extension so we can adjust the version in the connection.

:::note Delivery terms from version 7
With version 7, Workist passes the delivery terms from the document into the **Lieferbedingung**
(delivery terms) field of the document. Sage 100 only accepts delivery terms that exist in your
client there. Check this on a test document before the version is switched.
:::

### Quote document type

To match orders against [open quotes](#open-quotes), Workist reads the quotes of one document type,
`VPA` (quote) by default. If you use a key of your own for quotes, Workist stores it instead
(*Sage 100 Offer Document Type*). Requires version 9 of the extension.

## Features from version 9 of the extension

With version 9 of the [Workist API extension](/en/docs/data-exchange/connectors/sage-100-installation.md#downloads), Workist also
reads prices, price lists, stock levels and sales documents from your Sage 100. In Workist, the following
features are only available when the connection is set to version 9. With older versions, the
related settings are greyed out.

| Feature | Setting in the connection | Default |
| --- | --- | --- |
| [Price check against Sage pricing](#price-check-against-sage-pricing) | *Check order prices against Sage 100*, *Compare against* | off |
| [Prices without a customer](#prices-without-a-customer) | *Standard price list* | none |
| [Open quotes](#open-quotes) | *Sage 100 Offer Document Type*, *Ignore expired offers* | `VPA`, expired ignored |
| [Orders based on a quote](#orders-based-on-a-quote) | Quote number field in the channel | – |
| [Note text as document memo](#note-text-as-document-memo) | *Note Text* field in the channel | – |
| [Documents as drafts](#documents-as-drafts) | *Save documents in Sage 100 as drafts* | off |
| [ERP features of the agents](#erp-features-of-the-agents) | *Allow agentic writes* (for writing only) | writing off |

### Price check against Sage pricing

For every order line, Workist asks for the price Sage 100 determines for this customer, article,
quantity and unit of measure — with your price lists, quantity breaks and customer discounts.
Workist checks the ordered unit price against this price. If someone changes the quantity, unit,
article or customer in the Workbench, Workist asks for the price again.

- **Compare against** sets what is compared: the unit price before discount (default) or the net
  price after the customer discount.
- The unit price check must be switched on in the channel.
- If Sage 100 cannot price a line, for example because the article is missing, Workist checks that
  line without a target price.

### Prices without a customer

Sage 100 only determines a customer price with a customer number. If no customer is known, Workist
takes the price from the connection's **standard price list** (*Standard price list*). You can
choose from the active price lists of your Sage 100 that are valid today. Lists with gross prices
are marked in the selection: their prices include VAT.

- The price applies to the article's sales unit and takes quantity breaks into account.
- Workist uses it when no customer is known: for unrecognised callers of the voice agent, in Worki
  and the inbox agent without a customer, and for the price check of an order without a customer
  number. The agent gives it as a general price, not as the customer's price.
- Without a standard price list, Workist gives no price without a customer.

### Open quotes

With the master data update, Workist reads all open quotes of the
[quote document type](#quote-document-type), across all customers. Each article line becomes an
entry for [quote matching](/en/docs/channel-configuration/document-processing/matching.md):

- Quote number as document year and number, e.g. `2026-30006`
- Customer, quote date and, if set, **Angebot gültig bis** (valid until)
- Line number from Sage 100, article, description, quantity and unit of measure

A quote is open as long as Sage 100 does not mark it as taken over and nothing has been created from
it. Workist does not read quotes with the quote status **Übernahme in Vorgang** (taken over into
the transaction) or **Angebot im erfüllten Vorgang** (quote in a completed transaction). With
*Ignore expired offers* (on by default), Workist also leaves out quotes whose validity has passed.
A quote without a validity date is valid from the quote date. Workist cannot recognise rejected
quotes, because Sage 100 does not provide this status through the interface.

Workist only reads the quotes if a quote master data list is set up in a channel of the
connection.

### Orders based on a quote

If the **quote number** field is set up in the channel and an order names an open quote from
Sage 100, Workist creates the document with a reference to this quote. Sage 100 then keeps the
quote and the order in the same transaction (*Vorgang*) and sets the quote to **Angenommen**
(accepted).

- The lines come from the order, not from the quote.
- If the lines name different quotes or the quote is no longer open, Workist creates the document
  without a reference.
- Sage 100 enters the quote in the order's **Beleg zu** field.

### Note text as document memo

If the header field *Note Text* is set up in the channel, Workist puts its content into the
**Memo** of the document.

### Documents as drafts

With *Save documents in Sage 100 as drafts*, Workist creates documents **parked** instead of
saved. Parked documents get a number from the number range for parked documents and are completed
by your staff in Sage 100. The setting applies to every document Workist creates in Sage 100 —
from orders as well as from agents.

### ERP features of the agents

With version 9, [Worki](/en/docs/agents/worki.md), [inbox agents](/en/docs/agents/inbox-agents.md) and
[voice agents](/en/docs/agents/voice-agents.md) access your Sage 100 live:

| Feature | What the agent provides | Worki | Inbox agent | Voice agent |
| --- | --- | --- | --- | --- |
| Price | The customer's net price after discount, with quantity breaks | yes | yes | yes |
| Availability | Stock across all warehouses | yes | yes | yes |
| Delivery date | Delivery date of an order | yes | yes | – |
| Ship date | Date of the first follow-up document of an order, usually the delivery note | yes | – | – |
| Open quotes and documents | Open quotes and open documents of a document type, for one or all customers | yes | – | – |
| Order status | An order with the documents created from it | yes | – | – |
| Read a document | Any sales document with its lines and the documents of the same transaction | yes | – | – |
| Create a document | A sales document directly in Sage 100 | yes | – | – |
| Convert a quote into an order | An order with the quote's lines and prices, in the quote's transaction | yes | – | – |
| Create a customer | A customer directly in Sage 100, with the next free customer number of a number range | yes | – | – |

- **Writing is off by default.** Worki only creates documents, quote conversions and customers if
  *Allow agentic writes* is switched on in the connection, and only after the user has confirmed.
  Otherwise Worki answers that writing is switched off.
- **Without a customer, the standard price list applies.** The voice agent gives an unrecognised
  caller the price from the [standard price list](#prices-without-a-customer), as a general price.
  If none is set, it gives no price.
- **Availability is the stock level.** The interface provides neither reservations nor incoming
  goods. Stock in blocked warehouses is counted.
- **Open** means for documents: no follow-up document has been created from it yet. Workist does
  not recognise partial deliveries.
- Document types are addressed by their key. The agent sees which keys exist in your client from
  the documents it reads.

#### Setup in the agents

:::info Add-ons
Worki, inbox agents and voice agents are each licensed separately. Your contact at Workist
activates them — see [Availability](/en/docs/agents.md#availability).
:::

| Agent | How to connect it to your Sage 100 | Licence |
| --- | --- | --- |
| [Inbox agent](/en/docs/agents/inbox-agents.md) | In the agent under **Integrations** → **ERP**, choose Sage 100 and, if there are several, the connection. Under **Skills**, switch on price request, availability and delivery date. | Inbox agents |
| [Worki](/en/docs/agents/worki.md) | Hold the conversation in the [project of an inbox agent](/en/docs/agents/worki.md#inbox-agent-projects) that is connected to Sage 100. Worki then uses its connection, including the features for reading and creating documents. | Worki (chat agents) |
| [Voice agent](/en/docs/agents/voice-agents.md) | Under **Tools**, in the ERP Live Connection category, choose Sage 100 and the connection, and switch on the Article price and Article availability tools. | Voice agents |

For Worki to write to Sage 100, *Allow agentic writes* must also be switched on in the Sage 100
connection.

## What Workist touches in your Sage 100

What matters for a rollout is less the interface itself than the data model behind it: which
tables Workist reads, where it writes, and what the installation changes in your data.

### Data read

Workist reads in order to resolve details from the incoming document against your system —
customer, article, delivery address, project. From version 9 of the extension, Workist also reads
prices, stock levels and sales documents.

| Area | Sage 100 tables | Why Workist reads it |
| --- | --- | --- |
| Customer master | Customer master (Sage record `recKundenstamm`) | Customer recognition |
| Delivery addresses | `KHKAdressen`, `KHKAdressenverweise`, `KHKKontokorrent` | Resolving the delivery address |
| Contacts | `KHKAnsprechpartner` plus the same address tables | Contact on the document |
| Articles | `KHKArtikel`, `KHKArtikelVarianten` (plus `KHKArtikelgruppen`, `KHKVariantenAnzeigeTexte` and others) | Article recognition, units of measure |
| Projects | `KHKProjekte` | Framework contracts |
| Sales documents (from version 9) | `KHKVKBelege`, `KHKVKBelegePositionen` | Open quotes, orders based on a quote, agents |
| Prices (from version 9) | Sage 100 pricing | Price check, agents |
| Price lists (from version 9) | Price lists | Choice of the standard price list, prices without a customer |
| Stock levels (from version 9) | Storage location stock and warehouses | Agents |

All read access is client-scoped — the queries filter on the client of the DataSet
being addressed.

### Data written

Workist does **not** write to your tables via SQL. Documents are created through Sage 100
document entry, customers through the customer master. Your number ranges, pricing,
tax logic and validations therefore all still apply.

| What Workist creates | Via | Result in Sage 100 |
| --- | --- | --- |
| Sales document with items | Document entry | Document in `KHKVKBelege` / `KHKVKBelegePositionen`, saved or parked |
| Order from a quote (from version 9) | Document entry | Document in the quote's transaction |
| Customer (from version 9, by Worki) | Customer master | Record in the customer master |

Existing documents are **not** changed or deleted — creation is the only operation. When Workist
creates an order with a reference to a quote, Sage 100 itself sets the quote to **Angenommen**
(accepted).

### Additional fields in your tables

The installation adds two user-defined fields. They are created by the supplied
`…-UpdateUserFields-Workist.sql` script and serve traceability.

| Field | Label in Sage 100 | Type | Tables |
| --- | --- | --- | --- |
| `USER_WorkistBearbeiter` | Edited by in Workist | varchar(200) | `KHKVKBelege`, `KHKArchivVKBelege`, `tKHKPrintBelegKopfVK` |
| `USER_WorkistReferenz` | Workist reference | varchar(200) | `KHKVKBelege`, `KHKArchivVKBelege`, `tKHKPrintBelegKopfVK` |

The fields are additionally registered in `USysClassFields` for the `VKBeleg` class so that they
are available inside Sage 100.

:::warning Not included in the metadata import
These two fields are **not** created by the metadata import. The `…-UpdateUserFields-Workist.sql`
script from the package's `SKRIPTE` folder has to be run against the affected databases — see
[Installation, step 5](/en/docs/data-exchange/connectors/sage-100-installation.md#step-5-create-the-workist-fields).
:::

## Field reference

Which fields Workist writes to the sales document in detail, and which master data fields it reads
from your Sage 100, is documented in the
[Sage 100 field reference](/en/docs/data-exchange/connectors/sage-100-fields.md).
