> For the complete documentation index, see [llms.txt](https://help.tillit.cloud/tillit/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.tillit.cloud/tillit/knowledge-base/industry-configuration-guides/salad-dressing-factory.md).

# Salad Dressing Factory

This cookbook walks you through setting up TilliT for a **salad dressing and condiment manufacturing facility**. By the end, you will have a fully configured site with cooking kettles, holding tanks, a glass bottle line, bulk filling, and portion control lines, plus live machine data flowing in via a Kepware OPC-UA edge connection.

The setup is based on a real-world condiment and dressing factory that blends and cooks raw ingredients in kettles, holds finished product in tanks, and fills into glass jars, bulk containers, and individual portion-control cups for retail and foodservice customers. The plant operates on day and afternoon shifts and uses TilliT for quality checks, cook data capture, filling controls, and live equipment monitoring via edge integration.

{% hint style="info" %}
All names used in this guide are generic examples. Replace them with your own site, line, and product names.
{% endhint %}

## Prerequisites

Before you begin, ensure you have:

* A TilliT tenant provisioned for your organisation
* An administrator account with access to **Settings**
* The [Excel Add-in](/tillit/tools/excel-addin-v2.md) installed (recommended for bulk data loading)

For a general introduction to TilliT setup concepts, see [Introduction for New TilliT Customers](/tillit/readme-1/introduction-for-new-tillit-customers.md).

{% stepper %}
{% step %}

## Create the Site

A site represents the physical location of your factory.

**Go to Settings -> Asset Hierarchy -> Sites -> Create**

| Field         | Example Value          |
| ------------- | ---------------------- |
| Name          | Sauce & Dressing Plant |
| Timezone      | Denmark                |
| Location Code | SD                     |

For more detail, see [Site](/tillit/knowledge-base/setting-up-tillit/asset-hierarchy/site.md).
{% endstep %}

{% step %}

## Define Asset Classes

Asset classes group similar types of equipment. A salad dressing and condiment factory typically has the following asset classes:

| Asset Class   | Description                                                |
| ------------- | ---------------------------------------------------------- |
| Area          | Top-level groupings (Prepping & Cooking, Production, QA)   |
| Preppers      | Fruit and vegetable preparation equipment                  |
| Kettles       | Cooking and blending vessels                               |
| Tanks         | Heated holding tanks for finished product awaiting filling |
| Depalletisers | Empty jar or container unloading                           |
| Fillers       | Hot-fill machines (glass line, bulk, portion control)      |
| Cappers       | Lid or cap application machines                            |
| Labellers     | Primary and secondary label applicators                    |
| Packers       | Carton overpackers                                         |
| Palletisers   | Automated palletising                                      |

**Go to Settings -> Asset Hierarchy -> Asset Class -> Create**

Create one asset class for each type listed above. See [Asset Class](/tillit/knowledge-base/setting-up-tillit/asset-hierarchy/asset-class.md) for details.
{% endstep %}

{% step %}

## Build the Asset Hierarchy

Assets represent the individual machines and areas. In a condiment factory the hierarchy follows the production flow: preparation → cooking → holding → filling → packing.

```
Sauce & Dressing Plant
├── Prepping & Cooking (class: Area)
│   ├── Prep Area (class: Preppers)
│   ├── Kettle 1 (class: Kettles)
│   ├── Kettle 2 (class: Kettles)
│   ├── Kettle 3 (class: Kettles)
│   ├── Kettle 4 (class: Kettles)
│   ├── Holding Tank 1 (class: Tanks)
│   ├── Holding Tank 2 (class: Tanks)
│   ├── Holding Tank 3 (class: Tanks)
│   └── Holding Tank 4 (class: Tanks)
├── Production (class: Area)
│   ├── Glass Line (class: Area)
│   │   ├── Depalletiser (class: Depalletisers)
│   │   ├── Filler (class: Fillers)
│   │   ├── Capper (class: Cappers)
│   │   ├── Labeller (class: Labellers)
│   │   ├── Carton Overpacker (class: Packers)
│   │   └── Palletiser (class: Palletisers)
│   ├── Bulk Line (class: Fillers)      ← fills 2 kg – 10 kg containers
│   ├── Portion Control Line 1 (class: Fillers)  ← fills cups 13 mL – 45 mL
│   └── Portion Control Line 2 (class: Fillers)  ← fills cups 13 mL – 45 mL
└── QA (class: Area)                    ← shared quality assurance
```

### Key points

* **Kettles** cook and blend dressings, sauces, jams, and chutneys. Number kettles based on your actual equipment (e.g. Kettle 1 through Kettle 4).
* **Holding tanks** keep the cooked product hot and ready for filling. They are typically heated and agitated.
* **Glass Line** is the primary retail packaging line: jars are depalletised, hot-filled, capped, labelled, overpacked into cartons, and palletised.
* **Bulk Line** fills large containers (2 kg to 10 kg) for foodservice and industrial customers.
* **Portion Control Lines** fill individual cups (13 mL to 45 mL) for hospitality and airline catering.
* **QA** sits at the top level and is shared across all lines.
* Use **Display Order** to control the sequence assets appear in the UI (e.g. 100, 200, 300).

**Go to Settings -> Asset Hierarchy -> Assets -> Create**

Create each asset, assign it to the correct asset class, and set the parent asset for child equipment. See [Asset](/tillit/knowledge-base/setting-up-tillit/asset-hierarchy/assets.md) for details.

{% hint style="info" %}
For sites with many assets, use the [Excel Add-in](/tillit/tools/excel-addin-v2/entity-data-source.md) to create assets in bulk.
{% endhint %}
{% endstep %}

{% step %}

## Configure Shifts

Shift templates define the working hours for each area.

| Shift Template  | Start Time | Duration | Description                       |
| --------------- | ---------- | -------- | --------------------------------- |
| Day Shift       | 06:00      | 8 hours  | Standard morning shift            |
| Afternoon Shift | 14:00      | 8 hours  | Afternoon shift                   |
| Night Shift     | 22:00      | 8 hours  | Night shift (high-volume periods) |

Not every area runs the same schedule. Kettles may run a single extended cook shift while filling lines run two shifts.

### Creating shift schedules

Setting up shifts is a two-step process: first, you define the overall shift pattern (**Shift Template** and its **Items**); then, you link that pattern to your equipment using a **Shift Calendar**.

{% stepper %}
{% step %}

#### Create and Configure the Shift Template

1. Go to: **Settings -> Asset Hierarchy -> Shift Templates -> Create**.
2. Create the required shift templates.
3. Within each created template, go to: **Items**
4. Define the specific shift periods, including their start times and durations.

See [Creating a Shift Template](/tillit/knowledge-base/setting-up-tillit/asset-hierarchy/shifts/shift-patterns.md) for details.
{% endstep %}

{% step %}

#### Assign Shifts to Assets

Once your templates and items are ready, create calendars to map these schedules to the correct assets.

Since not every line runs the same schedule (e.g., Kettle and prep areas often run earlier shifts to have product ready in holding tanks before filling lines start), calendars ensure each asset accurately reflects its real-world operating schedule.

1. Go to: **Settings -> Asset Hierarchy -> Calendars -> Create**.
2. Add your **Shift Template** as a calendar Item.
3. Select the relevant asset and apply the template.
   {% endstep %}
   {% endstepper %}
   {% endstep %}

{% step %}

## Set Up Units of Measure

Before creating materials and process variables, define the units of measure your site will use.

| Unit  | Description                                       |
| ----- | ------------------------------------------------- |
| g     | Grams (fill weights, small quantities)            |
| kg    | Kilograms (ingredient weights, bulk containers)   |
| mL    | Millilitres (fill volumes, liquid ingredients)    |
| L     | Litres (large liquid volumes, holding tanks)      |
| °C    | Degrees Celsius (cook and fill temperatures)      |
| °Brix | Brix refractometer readings (sugar concentration) |
| %     | Percentage (acidity, viscosity tolerance)         |
| bar   | Pressure (capper, hot wash tunnel)                |
| kPa   | Pressure alternative unit                         |
| EA    | Each (individual items, jars, cups)               |
| CTN   | Cartons                                           |

**Go to Settings -> Configuration -> Unit of Measure -> Create**

See [Unit of Measure](/tillit/knowledge-base/setting-up-tillit/configuration/unit-of-measure-uom.md) for details.
{% endstep %}

{% step %}

## Create Material Groups

Material groups categorise your raw materials, semi-finished goods, and finished products. For a condiment factory:

| Group               | Description                                                   |
| ------------------- | ------------------------------------------------------------- |
| Raw Materials       | Fruits, vegetables, oils, vinegars, sugars, salt, spices      |
| Ingredients         | Flavourings, stabilisers, emulsifiers, preservatives, colours |
| Semi-Finished Goods | Cooked product ready for filling (bases, concentrates)        |
| Finished Goods      | Retail-packed glass jars (150 g – 300 mL)                     |
| Bulk                | Large foodservice containers (2 kg – 10 kg)                   |
| PCL Packaging       | Portion control cup packs (13 mL – 45 mL)                     |
| Glass               | Glass jars by size                                            |
| Caps                | Lids and caps by type                                         |
| Labels              | Primary, secondary, and carton labels                         |
| Cartons             | Outer cartons and outers                                      |
| Lids                | Press-on and screw lids for bulk containers                   |
| Plastic             | Plastic cups and lids for PCL lines                           |
| Rework              | Rework and returned product                                   |
| WIP                 | Work-in-progress material                                     |

**Go to Settings -> Material Definition -> Material Groups -> Create**

See [Material Group](/tillit/knowledge-base/setting-up-tillit/material-definition/material-group.md) for details.

{% hint style="info" %}
Separate Glass, Caps, Labels, and Cartons into their own groups to make it easier to track packaging consumption by type.
{% endhint %}
{% endstep %}

{% step %}

## Add Materials

Materials represent the specific items consumed or produced during manufacturing. A condiment factory can have hundreds of materials across groups.

#### Raw Materials (sample)

* **Produce** - fresh tomatoes, onions, capsicum, cucumbers, fruit pulp
* **Oils** - canola oil, olive oil, sunflower oil
* **Acids** - white vinegar, apple cider vinegar, citric acid
* **Sugar & Salt** - white sugar, sea salt, glucose syrup
* **Spices & Herbs** - black pepper, garlic, mixed herbs, chilli flakes

#### Ingredients

* **Emulsifiers** - xanthan gum, guar gum, lecithin
* **Preservatives** - potassium sorbate, sodium benzoate
* **Flavourings** - lemon juice concentrate, garlic extract, herb blends
* **Colours and modifiers** - caramel colour, paprika extract

#### Semi-Finished Goods

Cooked product held in tanks ready for filling, typically named by product type:

* **French Dressing Base**
* **Caesar Dressing Base**
* **Ranch Dressing Base**
* **Balsamic Vinaigrette Base**
* **BBQ Sauce Base**
* **Chilli Sauce Base**
* **Tomato Chutney Base**
* **Strawberry Jam Base**
* **Apricot Jam Base**

#### Finished Goods (sample)

By format and product:

* **Glass retail** - e.g. "French Dressing 300 mL", "Ranch Dressing 300 mL", "BBQ Sauce 300 mL", "Apricot Jam 300 g"
* **Bulk foodservice** - e.g. "Caesar Dressing 2 kg", "Tomato Relish 2 kg", "Caramelised Onion 10 kg"
* **Portion control cups** - e.g. "Ranch Dressing 25 mL x 60", "BBQ Sauce 25 mL x 60", "Apricot Jam 14 g Cup x 120"

**Go to Settings -> Material Definition -> Materials -> Create**

For bulk loading, use the [Excel Add-in](/tillit/tools/excel-addin-v2/entity-data-source.md) to import materials from a spreadsheet.

See [Material](/tillit/knowledge-base/setting-up-tillit/material-definition/material.md) for details.
{% endstep %}

{% step %}

## Define Attributes

Attributes store metadata against orders, materials, and assets. In condiment manufacturing, think of them as the product's digital "Product Specification Sheet" or identity card. They hold specific details that drive activity behaviour, store filling machine settings, and track label and packaging configurations per product. TilliT uses this information to automatically show or hide relevant fields based on that specific product type, as well as to help the Scheduler calculate changeover times.

### Order Number Attributes

These attach to individual work orders. When orders are loaded via the API, attribute values are sent in the payload (see [Step 14](#integrate-order-loading-from-erp)). Group them by purpose:

#### Product & Batch

| Attribute  | Data Type | Purpose                       |
| ---------- | --------- | ----------------------------- |
| Batch      | STRING    | Batch number for traceability |
| Run        | STRING    | Production run identifier     |
| Shelf Life | STRING    | Shelf life in days or months  |

#### Label & Coding

| Attribute                        | Data Type | Purpose                                          |
| -------------------------------- | --------- | ------------------------------------------------ |
| Label Date Coding - Format       | STRING    | Date code format printed on pack (e.g. DDMMYYYY) |
| Label Date Coding - Location     | STRING    | Position of date code on container               |
| Print Message Primary Label      | STRING    | Text to print on the primary label               |
| Print Message Inner Carton Label | STRING    | Text to print on the inner carton                |
| Print Message Outer Carton       | STRING    | Text to print on the outer carton label          |
| Product EAN Barcode              | STRING    | EAN/GTIN barcode for the product                 |
| Carton TUN Barcode               | STRING    | Traded unit barcode for the carton               |
| Carton Labeling Placement        | STRING    | Where carton labels are applied                  |
| Carton Dividers                  | STRING    | Whether carton dividers are required             |
| Carton Format                    | STRING    | Carton configuration (e.g. 6pk, 12pk, tray)      |

#### Holding Tank Settings

| Attribute                         | Data Type | Purpose                                |
| --------------------------------- | --------- | -------------------------------------- |
| Holding Tank Temperature - Target | NUMBER    | Target holding temperature (°C)        |
| Holding Tank Temperature - Min    | NUMBER    | Minimum holding temperature (°C)       |
| Holding Tank Temperature - Max    | NUMBER    | Maximum holding temperature (°C)       |
| Holding Tank Stirrer Function     | STRING    | Stirrer speed or mode for this product |

#### Filler Settings

| Attribute                        | Data Type | Purpose                                    |
| -------------------------------- | --------- | ------------------------------------------ |
| Fill Weight (g)                  | NUMBER    | Target fill weight in grams                |
| Fill Temperature Min             | STRING    | Minimum acceptable fill temperature        |
| Fill Temperature Max             | STRING    | Maximum acceptable fill temperature        |
| Filler Nozzles                   | STRING    | Number and configuration of filler nozzles |
| Filler Speed                     | STRING    | Filler speed setting                       |
| Forming Die Size (ml)            | STRING    | Die size for portion control lines         |
| Forming Die Size Number of Turns | STRING    | Adjustment turns for portion control die   |
| Filling Program                  | STRING    | Machine program number for this product    |

#### Capping & Sealing

| Attribute                              | Data Type | Purpose                                  |
| -------------------------------------- | --------- | ---------------------------------------- |
| Sealing/Capping - Description          | STRING    | Cap or lid type description              |
| Sealing/Capping - Integrity Test       | STRING    | Integrity test method (vacuum, pop test) |
| Sealing/Capping - Limits (bar/kPa) Min | NUMBER    | Minimum acceptable cap pressure          |
| Sealing/Capping - Limits (bar/kPa) Max | NUMBER    | Maximum acceptable cap pressure          |

#### Washing & Sterilisation

| Attribute                          | Data Type | Purpose                                    |
| ---------------------------------- | --------- | ------------------------------------------ |
| Hot Wash Tunnel Pressure           | STRING    | Hot wash tunnel pressure setting           |
| Wash Tunnel Settings - Temperature | NUMBER    | Hot wash tunnel temperature (°C)           |
| Cooling Tunnel Program             | STRING    | Cooling tunnel program setting             |
| Jar Prewarmer                      | STRING    | Jar pre-warm setting (on/off, temperature) |
| UV Steriliser                      | STRING    | UV steriliser enabled/mode                 |
| Crack Detection Unit               | STRING    | Crack detector setting                     |
| Cap Detection Unit                 | STRING    | Cap presence detector setting              |
| Break Detection Unit               | STRING    | Glass break detector setting               |
| Air Dryer                          | STRING    | Air dryer setting post-wash                |

#### Pallet Configuration

| Attribute                    | Data Type | Purpose                                      |
| ---------------------------- | --------- | -------------------------------------------- |
| Pallet Brand to Use          | STRING    | Pallet brand or type                         |
| Pallet Dividers              | STRING    | Whether pallet layer dividers are used       |
| Pallet Divider Location      | STRING    | Where dividers are placed on the pallet      |
| Pallet Wrap                  | STRING    | Pallet wrap type                             |
| Pallet ID Sheet Requirements | STRING    | Requirements for pallet identification sheet |

#### Bin Tracking (portion control lines)

| Attribute      | Data Type | Purpose                             |
| -------------- | --------- | ----------------------------------- |
| Bins           | NUMBER    | Number of bins (PCL cups per cycle) |
| Bin 0 - Bin 12 | STRING    | Individual bin assignment tracking  |
| Current Bin    | NUMBER    | Currently active bin index          |

#### Quality & Compliance

| Attribute                        | Data Type | Purpose                                               |
| -------------------------------- | --------- | ----------------------------------------------------- |
| Pre-Citrate Testing Required     | STRING    | Whether citrate testing is required before filling    |
| Cleaning / Allergen Instructions | STRING    | Specific cleaning or allergen changeover instructions |
| HasX-Ray                         | STRING    | Whether X-ray inspection is in use                    |
| Other Instruction 1              | STRING    | General instructions for operators                    |
| Other Instruction 2              | STRING    | Additional instructions for operators                 |

**Go to Settings -> Configuration -> Attributes -> Create**

See [Attribute](/tillit/knowledge-base/setting-up-tillit/configuration/copy-of-attribute.md) for details.

{% hint style="info" %}
You do not need to create all attributes manually before loading orders. When you use the order upsert API (see [Step 14](#integrate-order-loading-from-erp)), any attribute that does not already exist will be created automatically.
{% endhint %}
{% endstep %}

{% step %}

## Set Up Process Variables

Process variables define the measurements operators capture during cooking and filling. They enforce quality spec limits per product.

#### Cook Quality (Kettles)

| Process Variable                 | UoM   | Purpose                             |
| -------------------------------- | ----- | ----------------------------------- |
| Cook Limit                       | °C    | Maximum cook temperature            |
| Brix                             | °Brix | Sugar concentration (refractometer) |
| pH                               | --    | Acidity measurement                 |
| Total Titratable Acidity (T.T.A) | %     | Titratable acid content             |
| Viscosity                        | --    | Product viscosity check             |

#### Fill Quality (Glass Line & PCL)

| Process Variable         | UoM | Purpose                                  |
| ------------------------ | --- | ---------------------------------------- |
| Fill Weight              | g   | Weight of each filled container          |
| Fill Temperature         | °C  | Product temperature at the filler        |
| Holding Tank Temperature | °C  | Holding tank temperature at time of fill |

#### Machine Monitoring

| Process Variable                 | UoM | Purpose                                 |
| -------------------------------- | --- | --------------------------------------- |
| Super Heated Steam Temperature   | °C  | Steam steriliser temperature            |
| Cap Pressure                     | bar | Capper torque/pressure reading          |
| Pop Pressure                     | bar | Vacuum pop test result (seal integrity) |
| Hot Wash Tunnel Tank Temperature | °C  | Hot wash tunnel water temperature       |
| Hot Wash Tunnel Pressure         | bar | Hot wash tunnel pressure                |

**Go to Settings -> Configuration -> Process Variable -> Create**

See [Process Variable](/tillit/knowledge-base/setting-up-tillit/configuration/process-variable.md) for details.

{% hint style="info" %}
Process variables (such as `Brix` or `pH`) can reference specific order attributes to automatically pull target values directly from the current work order. This ensures that a single activity template can dynamically adapt and work for all products.
{% endhint %}
{% endstep %}

{% step %}

## Create Activity Classes

Activity classes group related activity templates in the UI. For a condiment factory:

| Activity Class    | Purpose                                                    |
| ----------------- | ---------------------------------------------------------- |
| Cook Checks       | Kettle startup, cook monitoring, pH and Brix testing       |
| Prep Checks       | Ingredient preparation and loading                         |
| Glass Line Checks | Filler startup, cap checks, label verification             |
| PCL Checks        | Portion control line startup, die setup, cup weight checks |
| Bulk Line Checks  | Bulk filler setup, container checks                        |
| QA Checks         | Finished product quality sign-offs                         |
| Data Capture      | Consumption logs, wash tunnel logs, reconciliation         |
| Cleaning          | CIP and sanitisation logs                                  |
| Safety            | Safety guard and equipment checks                          |
| Downtime          | Downtime reason capture                                    |

**Go to Settings -> Activity Template -> Activity Classes -> Create**

See [Activity Class](/tillit/knowledge-base/setting-up-tillit/activity-templates/activity-class.md) for details.
{% endstep %}

{% step %}

## Build Activity Templates

Activity templates are the digital forms that operators interact with. A condiment factory typically has templates covering every stage from ingredient preparation through to palletised finished goods.

### Core Activity Categories

#### Preparation & Cooking

| Activity                       | Triggered by | Purpose                                   |
| ------------------------------ | ------------ | ----------------------------------------- |
| Prep Startup Check             | Order start  | Verify prep area is clean and ready       |
| Ingredient Issuance            | Order start  | Record ingredients issued from store      |
| Kettle Startup Check           | Order start  | Confirm kettle condition and settings     |
| Cook Temperature Monitor       | Interval     | Record kettle temperature during cook     |
| Brix Check                     | Interval     | Record refractometer Brix reading         |
| pH Check                       | Interval     | Record pH measurement during cook         |
| Total Titratable Acidity Check | Interval     | Record T.T.A reading                      |
| Cook Completion Sign-off       | Order end    | Confirm cook meets spec, approve transfer |
| Ingredient Consumption         | Order end    | Record actual ingredient quantities used  |
| Transfer to Holding Tank       | Order end    | Record volume transferred and tank used   |

#### Holding Tank Monitoring

| Activity                         | Triggered by | Purpose                                            |
| -------------------------------- | ------------ | -------------------------------------------------- |
| Holding Tank Level & Temperature | Interval     | Monitor temperature and level in holding tanks     |
| Holding Tank Reconciliation      | Manual       | Reconcile tank contents against production records |

#### Glass Line

| Activity                     | Triggered by | Purpose                                           |
| ---------------------------- | ------------ | ------------------------------------------------- |
| Glass Line Startup Check     | Order start  | Line readiness: filler, capper, labeller settings |
| Label Verification           | Order start  | Confirm correct labels loaded for the product     |
| Jar & Cap Information Record | Order start  | Verify correct jar and cap sizes                  |
| Filler Settings Check        | Order start  | Confirm filler nozzles, speed, and program        |
| Wash Tunnel Check            | Order start  | Verify wash tunnel temperatures and pressures     |
| Fill Weight Check            | Interval     | Record fill weights against target                |
| Fill Temperature Check       | Interval     | Record product temperature at filler head         |
| Cap Pop Test                 | Interval     | Verify vacuum seal integrity                      |
| Cap Pressure Check           | Interval     | Record capper pressure readings                   |
| Label Quality Check          | Interval     | Check label placement and date coding             |
| Carton Check                 | Interval     | Verify correct carton and overpacker settings     |
| Glass Line End of Run        | Order end    | End-of-run reconciliation                         |
| Glass Line Downtime          | Event-based  | Record and categorise stoppages                   |

#### Bulk Line

| Activity                | Triggered by | Purpose                                    |
| ----------------------- | ------------ | ------------------------------------------ |
| Bulk Line Startup Check | Order start  | Confirm bulk filler and container settings |
| Bulk Fill Weight Check  | Interval     | Record container weights                   |
| Bulk Line End of Run    | Order end    | Reconcile filled containers                |

#### Portion Control Lines

| Activity                 | Triggered by | Purpose                                           |
| ------------------------ | ------------ | ------------------------------------------------- |
| PCL Startup Check        | Order start  | Die size, forming program, cup setup verification |
| PCL Cup Weight Check     | Interval     | Record individual cup fill weights                |
| PCL Seal Integrity Check | Interval     | Verify heat-seal quality                          |
| PCL End of Run           | Order end    | Record cup count and reconcile bins               |

#### Quality & Safety

| Activity            | Triggered by          | Purpose                                        |
| ------------------- | --------------------- | ---------------------------------------------- |
| QA Sign-off         | Order start / running | QA approval for starting or continuing a run   |
| Pre-Citrate Testing | Event-based           | Record pre-fill citrate test results           |
| X-Ray Check         | Shift start           | Verify X-ray inspection equipment is operating |
| Safety Guard Check  | Shift start           | Confirm all safety guards are in place         |

#### Cleaning

| Activity                      | Triggered by | Purpose                                             |
| ----------------------------- | ------------ | --------------------------------------------------- |
| Pre-Production Cleaning Check | Shift start  | Verify all equipment is clean before production     |
| Kettle CIP Log                | Event-based  | Record kettle clean-in-place cycle                  |
| Glass Line CIP Log            | Event-based  | Record filling line CIP                             |
| Allergen Changeover Check     | Event-based  | Record allergen cleaning between different products |
| End of Day Cleaning           | Shift end    | Confirm end-of-day cleaning completed               |

### Building an activity template

For each activity, you need to:

1. **Create the template** with a name and activity key
2. **Assign it to an activity class**
3. **Set the "Claimable By" field** to define who can see and claim the activity
4. **Configure the trigger** (when it fires)
5. **Build the form items** (the fields operators fill in)

**Go to Settings -> Activity Templates -> Activity Template -> Create**

See [Creating an Activity](/tillit/knowledge-base/setting-up-tillit/activity-templates/activity/creating-an-activity.md) for a complete walkthrough.

For understanding trigger types, see [When](/tillit/knowledge-base/setting-up-tillit/activity-templates/activity/when.md) and [Where](/tillit/knowledge-base/setting-up-tillit/activity-templates/activity/where.md).

{% hint style="info" %}
Start with the most critical activities - cook sign-off, fill weight checks, and cap integrity - and expand once the team is comfortable.
{% endhint %}
{% endstep %}

{% step %}

## Configure Order Templates

Order templates define how a work order is executed across a bottling line. They specify which machines (child assets) within the bottling line (parent asset) participate in the order, as well as the operation type for each stage.

#### Preparation

| Order Template | Operation | Asset     |
| -------------- | --------- | --------- |
| Prep           | Prep      | Prep Area |

#### Cooking (one per kettle)

| Order Template | Operation | Asset    |
| -------------- | --------- | -------- |
| Kettle 1       | Cook      | Kettle 1 |
| Kettle 2       | Cook      | Kettle 2 |
| Kettle 3       | Cook      | Kettle 3 |
| Kettle 4       | Cook      | Kettle 4 |

#### Glass Line

The Glass Line uses a parent asset with child operations cascaded from it:

| Order Template    | Operation | From Asset | To Asset          |
| ----------------- | --------- | ---------- | ----------------- |
| Depalletiser      | Depal     | Glass Line | Depalletiser      |
| Filler            | Fill      | Glass Line | Filler            |
| Capper            | Cap       | Glass Line | Capper            |
| Labeller          | Label     | Glass Line | Labeller          |
| Carton Overpacker | Pack      | Glass Line | Carton Overpacker |
| Palletiser        | Pallet    | Glass Line | Palletiser        |
| QA                | QA        | Glass Line | QA                |

#### Bulk Line

| Order Template | Operation | Asset     |
| -------------- | --------- | --------- |
| Bulk Line      | Fill      | Bulk Line |

#### Portion Control Lines

| Order Template         | Operation | Asset                  |
| ---------------------- | --------- | ---------------------- |
| Portion Control Line 1 | Fill      | Portion Control Line 1 |
| Portion Control Line 2 | Fill      | Portion Control Line 2 |

### Key points

* **Kettle orders** are created independently for each cook. Cooked product is transferred to a holding tank on order completion.
* **Glass Line orders** are created against the Glass Line parent asset and automatically cascade to child equipment (Depalletiser, Filler, Capper, etc.).
* **Bulk Line and PCL orders** are standalone fill operations.
* **QA** is shared and configured as a child template under Glass Line.

**Go to Settings -> Asset Hierarchy -> Order Templates -> Create**

See [Order Template](/tillit/knowledge-base/setting-up-tillit/asset-hierarchy/order-template.md) for details.
{% endstep %}

{% step %}

## Configure Edge Integration (Kepware OPC-UA)

TilliT Edge connects your factory equipment to TilliT Digital Operations in real time. This step walks through setting up a **Kepware KEPServerEX** demo environment with simulated tags, then connecting TilliT Edge to it via OPC-UA.

{% hint style="info" %}
This guide uses Kepware's built-in **Simulator** driver to generate fake data without real PLC hardware. It is ideal for training, demos, and pre-go-live testing. Swap the simulated addresses for real PLC addresses when connecting live equipment.
{% endhint %}

{% stepper %}
{% step %}

### Prerequisites

* **Kepware KEPServerEX** installed (v6.x or later) with the **Simulator** driver licensed
* Kepware's **OPC-UA Server** interface enabled (included by default)
* TilliT Edge Core software installed on a Windows machine on the same network as Kepware
* Firewall allows inbound TCP on port **49320** (Kepware OPC-UA default)
  {% endstep %}

{% step %}

### Create the Kepware Channel and Devices

Open **KEPServerEX Configuration**. In the left-hand project tree under **Connectivity**, create the following structure:

**Add Channel**

| Field          | Value          |
| -------------- | -------------- |
| Channel Name   | `SauceFactory` |
| Device Driver  | Simulator      |
| Communications | Leave defaults |

**Add Devices** under `SauceFactory`:

| Device Name      | Description                          |
| ---------------- | ------------------------------------ |
| `Kettles`        | Cooking kettle signals               |
| `HoldingTanks`   | Holding tank temperatures and levels |
| `GlassLine`      | Glass bottle line signals            |
| `BulkLine`       | Bulk filling line signals            |
| `PortionControl` | Portion control line signals         |

For each device, accept the Simulator driver defaults (Device ID = 1, scan rate = 100 ms).
{% endstep %}

{% step %}

### Create Simulated Tags

Add the following tags to each device. In Kepware's Simulator driver, **R** registers are read-only and auto-ramp continuously from 0 to 32,767 — ideal for simulating changing analog values without real hardware. **K** registers are read/write integers; individual bits (e.g. `K0000.0`) simulate boolean signals that can be toggled manually in the Quick Client.

#### Device: `Kettles`

| Tag Name              | Address   | Data Type | Notes                                                 |
| --------------------- | --------- | --------- | ----------------------------------------------------- |
| `Kettle1_Temperature` | `R0000`   | Word      | Ramps 0–32767; apply scale ×0.003 in TilliT → 0–98 °C |
| `Kettle1_Status`      | `K0000.0` | Boolean   | True = running                                        |
| `Kettle2_Temperature` | `R0001`   | Word      | Same scaling                                          |
| `Kettle2_Status`      | `K0000.1` | Boolean   | True = running                                        |
| `Kettle3_Temperature` | `R0002`   | Word      |                                                       |
| `Kettle3_Status`      | `K0000.2` | Boolean   |                                                       |
| `Kettle4_Temperature` | `R0003`   | Word      |                                                       |
| `Kettle4_Status`      | `K0000.3` | Boolean   |                                                       |

#### Device: `HoldingTanks`

| Tag Name            | Address | Data Type | Notes                  |
| ------------------- | ------- | --------- | ---------------------- |
| `Tank1_Temperature` | `R0010` | Word      | Scale ×0.003 → 0–98 °C |
| `Tank1_Level`       | `R0011` | Word      | Scale ×0.003 → 0–98 %  |
| `Tank2_Temperature` | `R0012` | Word      |                        |
| `Tank2_Level`       | `R0013` | Word      |                        |
| `Tank3_Temperature` | `R0014` | Word      |                        |
| `Tank3_Level`       | `R0015` | Word      |                        |
| `Tank4_Temperature` | `R0016` | Word      |                        |
| `Tank4_Level`       | `R0017` | Word      |                        |

#### Device: `GlassLine`

| Tag Name                    | Address   | Data Type | Notes                       |
| --------------------------- | --------- | --------- | --------------------------- |
| `GlassLine_Status`          | `K0001.0` | Boolean   | True = running              |
| `GlassLine_ProductionCount` | `R0020`   | Word      | Auto-incrementing counter   |
| `Filler_FillWeight`         | `R0021`   | Word      | Scale ×0.01 → 0–327 g       |
| `Filler_FillTemperature`    | `R0022`   | Word      | Scale ×0.003 → 0–98 °C      |
| `Capper_CapPressure`        | `R0023`   | Word      | Scale ×0.00002 → 0–0.65 bar |

#### Device: `BulkLine`

| Tag Name                   | Address   | Data Type | Notes                     |
| -------------------------- | --------- | --------- | ------------------------- |
| `BulkLine_Status`          | `K0002.0` | Boolean   | True = running            |
| `BulkLine_ProductionCount` | `R0030`   | Word      | Auto-incrementing counter |

#### Device: `PortionControl`

| Tag Name        | Address   | Data Type | Notes                     |
| --------------- | --------- | --------- | ------------------------- |
| `PCL1_Status`   | `K0003.0` | Boolean   | True = running            |
| `PCL1_CupCount` | `R0040`   | Word      | Auto-incrementing counter |
| `PCL2_Status`   | `K0003.1` | Boolean   | True = running            |
| `PCL2_CupCount` | `R0041`   | Word      | Auto-incrementing counter |

After adding all tags, click **File → Save** in KEPServerEX. The runtime hot-deploys tag changes immediately.

{% hint style="info" %}
To verify tags are reading, open the **Quick Client** (Tools → Launch Quick Client) and browse to `SauceFactory`. R register values will be incrementing every scan cycle. Toggle K register bits to simulate equipment status changes.
{% endhint %}
{% endstep %}

{% step %}

### Confirm Kepware OPC-UA Server Settings

Go to **Tools → Options → Runtime Process** in KEPServerEX, then select **OPC-UA** from the left panel.

| Setting                        | Value                     |
| ------------------------------ | ------------------------- |
| Enable OPC-UA Server Interface | ✓ Checked                 |
| Endpoint Port                  | `49320`                   |
| Allow Anonymous Login          | ✓ Checked (demo purposes) |

Click **Apply**, then reinitialise the runtime if prompted (**Runtime → Reinitialize**).

The OPC-UA endpoint will be: `opc.tcp://<kepware-host-ip>:49320`

All tags are addressable via OPC-UA node IDs using this format:

```
ns=2;s=SauceFactory.<DeviceName>.<TagName>
```

For example, `Kettle1_Temperature` is:

```
ns=2;s=SauceFactory.Kettles.Kettle1_Temperature
```

{% endstep %}

{% step %}

### Create a TilliT Edge

**Go to Settings -> Edge -> Edges -> Create**

| Field       | Value                                    |
| ----------- | ---------------------------------------- |
| Name        | `Sauce Factory Edge`                     |
| Type        | Core                                     |
| Description | Edge agent for Kepware OPC-UA simulation |

Save, then install and start the TilliT Edge Core service on the Windows machine running Kepware. See [Edge](/tillit/knowledge-base/setting-up-tillit/edge/edge.md) for installation instructions.
{% endstep %}

{% step %}

### Create the OPC-UA Data Source

**Go to Settings -> Edge -> Data Sources -> Create**

| Field           | Value                                                                                   |
| --------------- | --------------------------------------------------------------------------------------- |
| Name            | `Kepware Simulator`                                                                     |
| Edge            | `Sauce Factory Edge`                                                                    |
| Datasource Type | OPC\_UA                                                                                 |
| Endpoint        | `<kepware-host-ip>:49320`                                                               |
| Option          | `{"securityMode":1,"securityPolicy":"http://opcfoundation.org/UA/SecurityPolicy#None"}` |

The `securityMode: 1` option disables encryption — appropriate for a local demo network. For production, use `securityMode: 3` with `Basic256Sha256` and trust the TilliT Edge certificate in Kepware's OPC-UA Security settings.

Press **Publish Configuration** and wait for the connected status to show a green checkmark (updates every 60 seconds).

See [Common Data Sources](/tillit/knowledge-base/setting-up-tillit/edge/common-data-sources.md) for details.
{% endstep %}

{% step %}

### Create Data Tags

**Go to Settings -> Edge -> Data Tags -> Create**

Map each Kepware tag to a TilliT asset and, where applicable, a process variable. The `scale` option in the **Options** field adjusts the raw 0–32,767 Word value to a physically meaningful range.

#### Kettle temperatures

| Name                 | Asset    | Source Address                                    | Data Type | Process Variable | Options           |
| -------------------- | -------- | ------------------------------------------------- | --------- | ---------------- | ----------------- |
| Kettle 1 Temperature | Kettle 1 | `ns=2;s=SauceFactory.Kettles.Kettle1_Temperature` | Number    | Cook Limit       | `{"scale":0.003}` |
| Kettle 2 Temperature | Kettle 2 | `ns=2;s=SauceFactory.Kettles.Kettle2_Temperature` | Number    | Cook Limit       | `{"scale":0.003}` |
| Kettle 3 Temperature | Kettle 3 | `ns=2;s=SauceFactory.Kettles.Kettle3_Temperature` | Number    | Cook Limit       | `{"scale":0.003}` |
| Kettle 4 Temperature | Kettle 4 | `ns=2;s=SauceFactory.Kettles.Kettle4_Temperature` | Number    | Cook Limit       | `{"scale":0.003}` |

#### Kettle status

| Name            | Asset    | Source Address                               | Data Type | Template                   |
| --------------- | -------- | -------------------------------------------- | --------- | -------------------------- |
| Kettle 1 Status | Kettle 1 | `ns=2;s=SauceFactory.Kettles.Kettle1_Status` | Boolean   | EQUIPMENT\_STATUS\_RUNNING |
| Kettle 2 Status | Kettle 2 | `ns=2;s=SauceFactory.Kettles.Kettle2_Status` | Boolean   | EQUIPMENT\_STATUS\_RUNNING |
| Kettle 3 Status | Kettle 3 | `ns=2;s=SauceFactory.Kettles.Kettle3_Status` | Boolean   | EQUIPMENT\_STATUS\_RUNNING |
| Kettle 4 Status | Kettle 4 | `ns=2;s=SauceFactory.Kettles.Kettle4_Status` | Boolean   | EQUIPMENT\_STATUS\_RUNNING |

#### Holding tank monitoring

| Name                       | Asset          | Source Address                                       | Data Type | Process Variable         | Options           |
| -------------------------- | -------------- | ---------------------------------------------------- | --------- | ------------------------ | ----------------- |
| Holding Tank 1 Temperature | Holding Tank 1 | `ns=2;s=SauceFactory.HoldingTanks.Tank1_Temperature` | Number    | Holding Tank Temperature | `{"scale":0.003}` |
| Holding Tank 1 Level       | Holding Tank 1 | `ns=2;s=SauceFactory.HoldingTanks.Tank1_Level`       | Number    | --                       | `{"scale":0.003}` |
| Holding Tank 2 Temperature | Holding Tank 2 | `ns=2;s=SauceFactory.HoldingTanks.Tank2_Temperature` | Number    | Holding Tank Temperature | `{"scale":0.003}` |
| Holding Tank 2 Level       | Holding Tank 2 | `ns=2;s=SauceFactory.HoldingTanks.Tank2_Level`       | Number    | --                       | `{"scale":0.003}` |
| Holding Tank 3 Temperature | Holding Tank 3 | `ns=2;s=SauceFactory.HoldingTanks.Tank3_Temperature` | Number    | Holding Tank Temperature | `{"scale":0.003}` |
| Holding Tank 3 Level       | Holding Tank 3 | `ns=2;s=SauceFactory.HoldingTanks.Tank3_Level`       | Number    | --                       | `{"scale":0.003}` |
| Holding Tank 4 Temperature | Holding Tank 4 | `ns=2;s=SauceFactory.HoldingTanks.Tank4_Temperature` | Number    | Holding Tank Temperature | `{"scale":0.003}` |
| Holding Tank 4 Level       | Holding Tank 4 | `ns=2;s=SauceFactory.HoldingTanks.Tank4_Level`       | Number    | --                       | `{"scale":0.003}` |

#### Glass Line

| Name                        | Asset  | Source Address                                            | Data Type | Template / PV              | Options             |
| --------------------------- | ------ | --------------------------------------------------------- | --------- | -------------------------- | ------------------- |
| Glass Line Status           | Filler | `ns=2;s=SauceFactory.GlassLine.GlassLine_Status`          | Boolean   | EQUIPMENT\_STATUS\_RUNNING | --                  |
| Glass Line Production Count | Filler | `ns=2;s=SauceFactory.GlassLine.GlassLine_ProductionCount` | Number    | COUNT\_TOTAL               | --                  |
| Fill Weight                 | Filler | `ns=2;s=SauceFactory.GlassLine.Filler_FillWeight`         | Number    | Fill Weight                | `{"scale":0.01}`    |
| Fill Temperature            | Filler | `ns=2;s=SauceFactory.GlassLine.Filler_FillTemperature`    | Number    | Fill Temperature           | `{"scale":0.003}`   |
| Cap Pressure                | Capper | `ns=2;s=SauceFactory.GlassLine.Capper_CapPressure`        | Number    | Cap Pressure               | `{"scale":0.00002}` |

#### Bulk Line and Portion Control Lines

| Name                       | Asset                  | Source Address                                          | Data Type | Template / PV              |
| -------------------------- | ---------------------- | ------------------------------------------------------- | --------- | -------------------------- |
| Bulk Line Status           | Bulk Line              | `ns=2;s=SauceFactory.BulkLine.BulkLine_Status`          | Boolean   | EQUIPMENT\_STATUS\_RUNNING |
| Bulk Line Production Count | Bulk Line              | `ns=2;s=SauceFactory.BulkLine.BulkLine_ProductionCount` | Number    | COUNT\_TOTAL               |
| PCL 1 Status               | Portion Control Line 1 | `ns=2;s=SauceFactory.PortionControl.PCL1_Status`        | Boolean   | EQUIPMENT\_STATUS\_RUNNING |
| PCL 1 Cup Count            | Portion Control Line 1 | `ns=2;s=SauceFactory.PortionControl.PCL1_CupCount`      | Number    | COUNT\_TOTAL               |
| PCL 2 Status               | Portion Control Line 2 | `ns=2;s=SauceFactory.PortionControl.PCL2_Status`        | Boolean   | EQUIPMENT\_STATUS\_RUNNING |
| PCL 2 Cup Count            | Portion Control Line 2 | `ns=2;s=SauceFactory.PortionControl.PCL2_CupCount`      | Number    | COUNT\_TOTAL               |

Press **Publish Configuration** after creating all tags. Tags with a green status indicator are reading successfully from Kepware.

See [Data Tags](/tillit/knowledge-base/setting-up-tillit/edge/data-tags.md) for details.
{% endstep %}

{% step %}

### Create Edge Triggers (Optional)

Edge triggers raise TilliT events automatically based on tag values. For a condiment factory, the most useful triggers are equipment stopped events and temperature alarms.

**Go to Settings -> Edge -> Triggers -> Create**

| Trigger            | Tag                  | Event Type        | Evaluation Script | Self Close |
| ------------------ | -------------------- | ----------------- | ----------------- | ---------- |
| Kettle 1 Stopped   | Kettle 1 Status      | Equipment Stopped | `value == false`  | Yes        |
| Kettle 2 Stopped   | Kettle 2 Status      | Equipment Stopped | `value == false`  | Yes        |
| Glass Line Stopped | Glass Line Status    | Equipment Stopped | `value == false`  | Yes        |
| Kettle Overtemp    | Kettle 1 Temperature | Custom Alert      | `value > 90`      | Yes        |

Set **Minimum Duration** to `1` minute on the equipment stopped triggers to avoid spurious events from brief signal interruptions.

See [Edge Triggers](/tillit/knowledge-base/setting-up-tillit/edge/edge-triggers.md) for details.
{% endstep %}
{% endstepper %}
{% endstep %}

{% step %}

## Integrate Order Loading from ERP

In most condiment factories, work orders originate in an ERP system (SAP, MYOB, Microsoft BC, etc.) and need to flow into TilliT automatically. Use the `POST:/core/order-instances/upsert` endpoint to load orders with all their attributes, tolerances, and components.

### Order Payload Structure

The upsert endpoint accepts an array of orders. Each order carries the core fields plus arrays for attributes, tolerances, and components. Below is an example glass line order for a retail dressing:

```json
[
  {
    "orderNumber": "WO-20260101-001",
    "orderDate": "2026-01-01",
    "dueDate": "2026-01-02",
    "scheduledStart": "2026-01-02T06:00:00",
    "scheduledEnd": "2026-01-02T14:00:00",
    "quantityTarget": 3600,
    "defaultRunRate": 60,
    "status": "NEW",
    "name": "French Dressing 300mL",
    "asset": "Glass Line",
    "material": {
      "externalId": "FG-FRENCH-300",
      "name": "French Dressing 300mL"
    },
    "attributes": [
      { "attributeName": "Batch", "value": "BT-20260102-001" },
      { "attributeName": "Shelf Life", "value": "365" },
      { "attributeName": "Label Date Coding - Format", "value": "DDMMYYYY" },
      { "attributeName": "Label Date Coding - Location", "value": "Cap" },
      { "attributeName": "Print Message Primary Label", "value": "Best Before: " },
      { "attributeName": "Print Message Outer Carton", "value": "French Dressing 12x300mL" },
      { "attributeName": "Product EAN Barcode", "value": "9300001000001" },
      { "attributeName": "Carton TUN Barcode", "value": "09300001000001" },
      { "attributeName": "Carton Format", "value": "12pk" },
      { "attributeName": "Carton Dividers", "value": "No" },
      { "attributeName": "Holding Tank Temperature - Target", "value": "75" },
      { "attributeName": "Holding Tank Temperature - Min", "value": "70" },
      { "attributeName": "Holding Tank Temperature - Max", "value": "80" },
      { "attributeName": "Holding Tank Stirrer Function", "value": "Low" },
      { "attributeName": "Fill Weight (g)", "value": "310" },
      { "attributeName": "Fill Temperature Min", "value": "70" },
      { "attributeName": "Fill Temperature Max", "value": "80" },
      { "attributeName": "Filler Speed", "value": "60" },
      { "attributeName": "Filling Program", "value": "P12" },
      { "attributeName": "Sealing/Capping - Description", "value": "Twist Cap 63mm" },
      { "attributeName": "Sealing/Capping - Integrity Test", "value": "Pop Test" },
      { "attributeName": "Sealing/Capping - Limits (bar/kPa) Min", "value": "0.2" },
      { "attributeName": "Sealing/Capping - Limits (bar/kPa) Max", "value": "0.5" },
      { "attributeName": "Wash Tunnel Settings - Temperature", "value": "85" },
      { "attributeName": "Jar Prewarmer", "value": "On" },
      { "attributeName": "UV Steriliser", "value": "On" },
      { "attributeName": "Crack Detection Unit", "value": "Active" },
      { "attributeName": "Pallet Brand to Use", "value": "Standard CHEP" },
      { "attributeName": "Pallet Wrap", "value": "Yes" },
      { "attributeName": "Cleaning / Allergen Instructions", "value": "Allergen free - standard rinse" }
    ],
    "tolerances": [
      { "processVariableName": "Fill Weight", "target": 310, "lowerLimit": 305, "upperLimit": 315 },
      { "processVariableName": "Fill Temperature", "target": 75, "lowerLimit": 70, "upperLimit": 80 },
      { "processVariableName": "Brix", "target": 18.0, "lowerLimit": 17.0, "upperLimit": 19.0 },
      { "processVariableName": "pH", "target": 3.8, "lowerLimit": 3.5, "upperLimit": 4.1 }
    ],
    "orderComponents": [
      { "componentExternalId": "SFG-FRENCH-BASE", "componentGroup": "Semi-Finished Goods", "componentName": "French Dressing Base", "target": 1100 },
      { "componentExternalId": "PKG-GLS-300-FRENCH", "componentGroup": "Glass", "componentName": "300mL Jar", "target": 3700 },
      { "componentExternalId": "PKG-CAP-63-TWIST", "componentGroup": "Caps", "componentName": "63mm Twist Cap", "target": 3700 },
      { "componentExternalId": "PKG-LAB-FRENCH-300", "componentGroup": "Labels", "componentName": "French Dressing 300mL Label", "target": 3700 },
      { "componentExternalId": "PKG-CTN-12PK-300", "componentGroup": "Cartons", "componentName": "12pk Outer Carton", "target": 310 }
    ]
  }
]
```

### Key points

* **`asset`** - set to the parent line name (e.g. `Glass Line`). If order templates are configured ([Step 12](#configure-order-templates)), the order will automatically cascade to child assets (Depalletiser, Filler, Capper, etc.).
* **`attributes`** - all values are strings, even for NUMBER types. TilliT converts them based on the attribute definition.
* **`tolerances`** - override default process variable limits for this specific product. Only include tolerances that differ from the defaults.
* **`orderComponents`** - the bill of materials. Include the semi-finished base plus packaging components.
* **Upsert behaviour** - if you send a work order that matches an existing combination of `orderNumber`, `operation`, and `asset`, TilliT will simply update the details instead of creating a duplicate. This allows you to safely re-send or refresh the full schedule whenever it changes.
* **Auto-creation** - materials, attributes, UoMs, and tolerances that do not already exist will be created automatically.

### Typical attribute categories in the payload

| Category         | Attributes                                                   | Purpose                                            |
| ---------------- | ------------------------------------------------------------ | -------------------------------------------------- |
| Traceability     | Batch, Run, Shelf Life                                       | Batch control and date management                  |
| Label & coding   | Label Date Coding, Print Messages, Barcodes, Carton Format   | Correct labelling and coding per SKU               |
| Holding tank     | Temperature Target/Min/Max, Stirrer Function                 | Product held at correct temperature before filling |
| Filler settings  | Fill Weight, Fill Temperature, Filler Speed, Filling Program | Machine configuration per product                  |
| Capper settings  | Sealing Description, Integrity Test, Pressure limits         | Cap application and seal verification              |
| Wash & sterilise | Wash Tunnel Temperature, Jar Prewarmer, UV Steriliser        | Hygiene and glass preparation                      |
| Detection        | Crack Detection, Cap Detection, Break Detection              | Online quality inspection                          |
| Pallet           | Pallet Brand, Pallet Wrap, Dividers                          | Palletising configuration                          |
| Cleaning         | Allergen Instructions                                        | Changeover cleaning requirements                   |

For the full API reference, see [Upload Production Schedule](https://help.tillit.cloud/api/developer-guides/guide-to-using-rest-api/examples/upload-production-schedule).
{% endstep %}

{% step %}

## Create Your First Work Order

With all master data in place, you can test by creating a work order manually:

1. Navigate to the line where you want to run the order (e.g. Glass Line)
2. Click **Create Order**
3. Select the material (finished good) to produce (e.g. French Dressing 300 mL)
4. Enter the quantity
5. Fill in the order number attributes (holding tank settings, filler program, label coding)
6. Start the order

When the order starts, TilliT will automatically trigger the configured activities (glass line startup check, label verification, filler settings check) and the order will flow through each machine according to the order template.

See [Create adhoc Order](/tillit/knowledge-base/everyday-usage/orders/create-adhoc-order.md) and [Start an Order](/tillit/getting-started/start-the-order-1.md) for details.
{% endstep %}

{% step %}

## Verify Live Edge Data

With an order running and the Kepware simulator active, confirm that edge data is flowing correctly end-to-end.

1. Open the **Glass Line** asset in TilliT
2. Confirm the **Equipment Status** indicator shows running (driven by `GlassLine_Status`)
3. Navigate to **Process Variables** and verify **Fill Weight** and **Fill Temperature** are updating every minute from the simulated Kepware tags
4. In Kepware's **Quick Client**, toggle `GlassLine_Status` (K0001.0) to `false` - TilliT should raise a Glass Line Stopped event within the trigger's minimum duration
5. Toggle the status back to `true` - the event should self-close
6. Check the **Production Count** on the Filler asset is incrementing as the R0020 register ramps

If any tags show a red status in **Settings -> Edge -> Data Tags**, press **Publish Configuration** on the data source and verify the Kepware OPC-UA server is reachable from the TilliT Edge host.

See [Data Tags](/tillit/knowledge-base/setting-up-tillit/edge/data-tags.md) for troubleshooting guidance.
{% endstep %}
{% endstepper %}

## Summary Checklist

Use this checklist to track your progress:

* [ ] Site created with correct timezone
* [ ] Asset classes defined (Area, Preppers, Kettles, Tanks, Depalletisers, Fillers, Cappers, Labellers, Packers, Palletisers)
* [ ] Assets created with correct parent-child hierarchy (Prepping & Cooking, Glass Line, Bulk Line, PCL lines, QA)
* [ ] Shift templates configured (Day Shift, Afternoon Shift)
* [ ] Units of measure defined (g, kg, mL, L, °C, °Brix, %, bar, EA, CTN)
* [ ] Material groups created (Raw Materials, Ingredients, Semi-Finished Goods, Finished Goods, Bulk, PCL Packaging, Glass, Caps, Labels, Cartons)
* [ ] Materials loaded (ingredients, bases, packaging, finished goods by format)
* [ ] Attributes defined (batch/label, holding tank, filler, capper, wash tunnel, pallet)
* [ ] Process variables configured (Brix, pH, T.T.A, Fill Weight, Fill Temperature, Cap Pressure)
* [ ] Activity classes created
* [ ] Activity templates built and triggers configured (cook, fill, cap, label, QA, cleaning)
* [ ] Order templates mapped (Prep, Kettle 1-4, Glass Line, Bulk Line, PCL 1, PCL 2)
* [ ] Kepware channel `SauceFactory` created with Simulator driver
* [ ] Simulated tags created for Kettles, HoldingTanks, GlassLine, BulkLine, PortionControl devices
* [ ] Kepware OPC-UA server enabled on port 49320
* [ ] TilliT Edge (Core) installed and running
* [ ] OPC-UA data source configured and connected (green status)
* [ ] Data tags created and publishing to correct assets and process variables
* [ ] Edge triggers configured (equipment stopped, overtemp)
* [ ] Order integration configured and payload tested
* [ ] First work order tested end-to-end with live edge data verified

## Related Articles

* [Planning Overview](/tillit/planning/overview.md)
* [Data Gathering Checklist](/tillit/planning/data-gathering/checklist.md)
* [Upload Production Schedule (API)](https://help.tillit.cloud/api/developer-guides/guide-to-using-rest-api/examples/upload-production-schedule)
* [Edge Overview](/tillit/knowledge-base/setting-up-tillit/edge.md)
* [Common Data Sources](/tillit/knowledge-base/setting-up-tillit/edge/common-data-sources.md)
* [Data Tags](/tillit/knowledge-base/setting-up-tillit/edge/data-tags.md)
* [Entity Data Source](/tillit/tools/excel-addin-v2/entity-data-source.md)
