> For the complete documentation index, see [llms.txt](https://docs.silkline.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.silkline.ai/demand.md).

# Demand

Work demand lines from your planning system, group them into requests and orders, and track how much of each need is covered

Demand is where a planner works with the parts and quantities a plan requires. Each line states one need: buy this quantity of this part by this date. Planners can group demand lines into requests and purchase orders. Silkline records the quantity linked to each request or order as *coverage*.

{% hint style="info" %}
Demand belongs to the **Plans** module, which is under active development and must be turned on by an administrator. See [Enabling Demand](#enabling-demand).
{% endhint %}

## Key concepts

<table><thead><tr><th width="191">Concept</th><th>Description</th></tr></thead><tbody><tr><td>Demand line</td><td>One procurement need: a quantity of a part wanted by a date. A planner can group it with other demand lines in a request or order.</td></tr><tr><td>Run</td><td>The planning pass that stated the line: an MRP run ingested from your planning system, a build plan run, or a manual run uploaded from a file. A run's lines appear together on its run page.</td></tr><tr><td>Coverage</td><td>The quantity of a demand line allocated to a request line or purchase line. One demand line can be split across several lines, and one request or purchase line can cover several demand lines.</td></tr><tr><td>Segment</td><td>A field that splits coverage, such as a <strong>Project</strong> configurable field or the built-in <strong>Need date</strong>. A request or purchase line counts toward demand only when every segment value matches. See <a href="/profile-and-settings/organization-settings/coverage-segmentation.md">Coverage Segmentation</a>.</td></tr></tbody></table>

## Enabling Demand

An administrator turns the module on under **Organization Settings** → **Plans** → **Enable Plans**. Until it is on, the Demand pages show **Demand Not Enabled**. Once on, **Demand** appears in the navigation, marked as beta. The same settings group holds **Coverage Segmentation** and **Demand Item Fields**, the custom fields available on demand lines.

## Where demand comes from

### Your planning system

A planning system integration can import purchasing requirements as demand lines and group them into demand runs. Imported lines can include the part, quantity, need date, buyer, suggested supplier, status, and custom fields. Each line's detail page links back to its record in the source system.

Manufacturo is currently the only supported planning system integration. See [Manufacturo](https://docs.silkline.ai/configuration/integrations/manufacturo) for connection and configuration details.

{% hint style="warning" %}
**A re-sync restates the line from the source.** Buyer, part, need date, pedigree, status, and supplier hint are overwritten on every pass, so a value cleared upstream clears in Silkline. The **Asserted Qty** a planner sets is preserved.
{% endhint %}

You cannot create or delete a demand line that an integration owns.

### Build plans

When BOMs and Build Plans is enabled alongside Plans, running a build plan creates a plan run whose lines land in the same table. A plan run's page links back to the build plan that produced it.

### Uploaded files

Choose **Upload demand** on the Demand page to load demand from a file. Silkline accepts CSV, XLS, and XLSX files. A spreadsheet in the upload format is read as written, and every line it holds appears in a preview. Nothing is written until you confirm.

* **Workbooks** - only the first sheet of an XLS or XLSX file is read. The preview names the other sheets in a warning.
* **Size** - an upload holds at most 5,000 lines. The preview says when a file has more, and the upload cannot be applied.

#### File format

**Download template** gives a CSV in the upload format. The header row is the first row, within the first 20 non-empty rows, that names **Part Number**, **Quantity**, and **Need Date**. Rows above it are ignored, and each row below it is one line. Column names match regardless of case, spaces, and punctuation.

| Column      | Required | Also accepted                                  | Notes                                                                                                                                                  |
| ----------- | -------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Part Number | Yes      | Part, Part No, Item Number                     |                                                                                                                                                        |
| Quantity    | Yes      | Qty                                            | A number greater than zero, with a period as the decimal separator. CSV values such as `1,5` or `1,250` produce a row error; correct them in the file. |
| Need Date   | Yes      | Need By Date, Need By, Due Date, Required Date | Write dates as `YYYY-MM-DD`. A date like `06/01/2026` reads month first, unless another date in the file only reads day first, like `25/06/2026`.      |
| Revision    | No       | Rev                                            |                                                                                                                                                        |
| Description | No       | Part Description                               | Describes a part that is not in your parts library.                                                                                                    |
| Supplier    | No       | Suppliers, Vendor                              | Separate several suppliers with a semicolon.                                                                                                           |
| Line ID     | No       |                                                | Identifies the line across versions of a run. See [Upload a new version of a run](#upload-a-new-version-of-a-run).                                     |

Add one column for each demand line custom field, named as the field. When a field shares a name with a standard column, the standard column is read. The preview shows a column for each custom field the file fills, with the value the upload writes.

* Columns with other names, and a second column for the same field, are not read. The preview lists them.
* Rows with no quantity and no need date, such as notes or section headings, produce no line. Total rows are skipped.

The upload also names the row when a CSV contains malformed quotes.

#### Read a file with AI

A spreadsheet whose header row is missing a required column is not read in the upload format, and the upload names the missing columns. Neither is a spreadsheet where no row has a part number with a quantity or need date. Choose **Read with AI** to have Silkline find the columns instead. AI reading also handles other layouts, such as a part number column with one quantity column per date. Check every line in the preview before you apply a file read with AI.

Under **Upload to**, choose **Create a new run** and name it, or **Update an existing run** to load a newer version of a manual run. A new run's name starts as the file name.

#### How parts and suppliers are matched

* **Part** - the part number is matched to your parts library as written, or as a part number and revision. For example, a line for revision **A** of `ACME-100` matches that revision in the library, whether the file gives the revision in its own column or as part of the part number. A line whose part is not in the library is saved as a custom part, described by the file's description.
* **Supplier** - the line's supplier hint is set only when the supplier names on the line match exactly one of your suppliers. Names match regardless of case, punctuation, and legal suffixes, so `Acme` matches `Acme Inc`. A line that names several suppliers, or a name that matches none or more than one, leaves the supplier blank. The preview still shows the names. When a new version of a run is uploaded, a line keeps the supplier it already has unless the file's names match exactly one supplier.

#### Create missing parts, suppliers, and options

When a file names parts, suppliers, or select-field values that Silkline does not have, the preview lists them under **Not in Silkline yet**, one entry per value however many rows use it. Create them from the preview before you apply the upload:

* **From a row** - choose **Create part**, **Create rev B**, **Create** next to a supplier name, or **Add "value" to Field** next to an unknown option. Every row that uses the value is matched to the new record.
* **In bulk** - choose **Review** for parts, suppliers, or field values, pick which to create, and confirm. Select a whole group at once, such as **New revisions** or one field's values.

Records are created when you confirm, for your whole organization, and stay even if you discard the upload. A part number already in your library is linked instead of created again. A new part takes the file's part number, revision, and description; a new supplier takes only its name. Rows that a new option makes valid are added instead of skipped.

Quick-create follows your permissions and settings:

* Creating parts needs the **Create Part** permission, creating suppliers needs **Create Supplier**, and adding options needs **Edit Configurable Field Definition**.
* When your organization manages parts or suppliers through an integration, create them in that system instead.
* When new suppliers require a contact or a country, create them on the Suppliers page.
* A field whose options are managed by a linked integration cannot get new options.

A value that matches more than one record, such as a supplier name shared by two suppliers, is listed but not created.

#### Rows with errors

The preview marks each row it cannot use and says why: a missing part number, a missing or non-positive quantity, a missing or unreadable need date, or a custom field value that does not fit its field. A new run skips those rows and adds the rest. A file with row errors cannot update a run: fix the rows and upload the file again.

The preview also lists the rows of the file that produced no line, such as notes or section headings, so you can check that no demand is missing.

#### Upload a new version of a run

Choose **Upload new version** from a manual run's action menu, or **Update an existing run** in the upload, and pick the run. Silkline matches each file row to a run line by its exact line identity:

* A **Line ID** identifies a line when the file provides one. Otherwise, the identity combines part number, need date, and supplier.
* A line with the same identity is updated in place when its values change.
* A line with a new identity is added when it does not require manual review.
* An open, uncovered line missing from the file is cancelled.
* A cancelled line that appears in the file again reopens.
* A closed line stays closed. Its values still update, and it is not cancelled.
* A line added to the run by hand is neither matched nor cancelled by an upload.
* Coverage stays attached to a matched line. A covered line cannot be cancelled by an upload.

The confirm button counts the adds, changes, and cancels before you apply them. Next to the cancel count, the preview shows how many rows of the file produced no line; hover it to see their row numbers. When the upload cancels lines, check **I understand N open lines will be cancelled** before you apply.

{% hint style="warning" %}
**Some updates require manual review.** An upload cannot update the run when a file row may refer to an existing open line but has a different identity, when file-order duplicate identities occur, or when a covered line would be cancelled. Update the run manually in these cases.
{% endhint %}

## Work your queue

**Demand** opens on six tabs. **All** shows every line in any status. Every other tab is a queue over open lines that empties as the work completes, with a count badge matching its scope. Each tab keeps its own filters, sort, and columns.

* **Unassigned** - open lines with no buyer. Distribute from here.
* **My Queue** - open lines assigned to you.
* **Not Covered** - open lines that no request or order covers.
* **Partially Covered** - open lines with part of the quantity still to buy.
* **Needs Sourcing** - open lines with no confirmed, unexpired quote naming the part. These need an RFQ before they can be ordered. Custom parts land here.

Lines sort by **Need Date** ascending by default, so the most urgent work is at the top. Group by Buyer, Part, Source, or any other dimension to carve the queue up, and save the arrangement as a view. Each group header shows its line count, such as **3 lines**. Grouping by Part gives each revision its own group, labeled with the part number and revision.

### Assign buyers

Select unassigned lines and choose **Assign buyers**. Silkline proposes a buyer per line from rules applied in priority order: **Category manager**, then **Supplier owner**, then **Last part buyer**, then **Chosen buyer**, a person you pick for whatever the rules did not match. Only **Category manager** is on by default. Review the proposals before applying them. A re-sync from your planning system restates the buyer from the source, so assignments made here hold only until the source names someone else.

### Correct a quantity

When the run's figure is wrong, set an **Asserted quantity** on the line rather than editing upstream. Coverage is measured against the asserted quantity, the **Coverage** cell marks it with a dotted underline, and a re-sync preserves it. An asserted quantity can be changed but not cleared once set.

A planner can edit three fields: **Asserted quantity**, **Need date**, and **Buyer**, inline on the line or with **Bulk edit** across a selection. Fields left blank in a bulk edit keep their existing values; the field reads **Mixed** where the selection disagrees. Need date and buyer can be cleared from the detail page. Custom fields are editable unless the field definition is read-only, as fields an integration populates are. Everything else follows the run.

Bulk actions can address every row matching your current filter, including pages you have not opened.

### Source parts that have no quote

The **Sourcing** column reads **Quoted** when a confirmed, unexpired quote names the part, and **Needs sourcing** when none does. It is read live from your quotes, so a quote lapsing moves a line on the day it expires. **Quoting Suppliers** lists who has quoted the part, dimming a quote whose break quantity exceeds the line's open quantity. **Last Supplier** shows the most recent open or closed order for the part; draft, review, approved, and cancelled orders do not count. Create a request from the line to run the RFQ.

## Create requests and orders from demand

Create a request or order from a demand line's detail page, a table selection, or all open lines in a demand run.

{% stepper %}
{% step %}

### Select the demand you want to buy

Tick lines on the table, or open a single line. The buttons are disabled for a line with no open quantity.
{% endstep %}

{% step %}

### Choose Create request or Create order

The takeover opens headed **New request from demand** or **New order from demand**, with a subtitle counting the request or purchase lines and the demand lines they came from.
{% endstep %}

{% step %}

### Review what was preloaded

Selected demand lines become one request or purchase line when they share a part, a pedigree, and every segment value, with need dates falling in the same **Need date** bin. Their open quantities add together, and the line takes the earliest date. The bin starts at **Day** and can be widened under [Coverage Segmentation](/profile-and-settings/organization-settings/coverage-segmentation.md#need-date). A request gets a description naming the runs, a header need date from the earliest line, and one part row per grouped line. An order gets one purchase line for each group and takes the supplier hint only when every demand line in the group agrees on one. Otherwise, the supplier stays blank. Cost and delivery stay blank because demand states a need, not terms.

Lines already fully covered, or closed or cancelled, are left out, and the takeover names each with its reason. **Add anyway** pulls them in at their full demanded quantity and rebuilds the form, so use it before you start editing.
{% endstep %}

{% step %}

### Edit and save the record as normal

The takeover hosts the ordinary create form. Requester, buyer, followers, tags, suppliers, and costs work exactly as on a hand-written request or order.
{% endstep %}

{% step %}

### Silkline writes the coverage

After the save, Silkline reads back the lines you kept and pegs coverage to them. A saved line covers a demand line when the part matches exactly and every segment value matches, including a need date on or before the demand's. The most urgent unclaimed demand is covered first, capped at what was planned. A line you dropped leaves its demand uncovered; a line you added covers nothing. The toast counts the demand lines covered and any created lines that matched no demand.
{% endstep %}
{% endstepper %}

You can create a request or order from up to **500 demand lines at a time**. Above that, narrow the selection and try again.

### Coverage transferred from a request

Linking an order to a request moves the request's coverage onto the order's lines automatically, apportioned in proportion to their quantities and capped at what each line buys. Only a line still buying the part the request asked for qualifies, and segment values must match. On the demand line, the coverage row moves from **On request** to **On order** with no action from you.

Coverage that no order line qualifies for stays on the request line. The order's **About this Order** still lists that demand under **Related Demand**, without the option to retract it there.

## Link existing supply

When a request or order for the part already exists, link it to the demand instead of creating a new one. This includes orders raised outside Silkline, such as purchase orders synced from an ERP. On a demand line's detail page, choose **Link existing** to open **Link existing supply**. The button is available with **Edit demand** permission when the line has open quantity.

The dialog lists the lines that can cover the demand:

* **Requests** - open requests that carry the same part.
* **Orders** - orders in Draft, Review, Approved, or Open that carry the same part, on lines that are not closed.
* **Custom parts** - a custom part matches by description.

A line is left out when this demand already covers it, when it has no quantity left, or when its other segment values, such as program or project, do not match the demand.

Each row shows the supply document with a link, the supplier, the state, the supply date, the quantity, the quantity allocated elsewhere, and the remaining quantity. A pill beside the date reads **On time**, **N days late**, or **Undated**. Lines dated more than 90 days before or 14 days after the demand's need date are hidden. Undated lines always show. Choose **Show all dates** to reveal the hidden lines.

<figure><img src="https://2684497859-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwPsevXC0g5kNMF7GTyPN%2Fuploads%2Fgit-blob-771a95607869b78450046abfdae028520638907e%2Flink-existing-supply.png?alt=media" alt="The Link existing supply dialog listing an on-time order line and an undated request line, with one row selected and the quantity set to the open demand"><figcaption><p>Pick a supply line and set the quantity to link</p></figcaption></figure>

Pick one line and set a quantity. The quantity starts at, and is capped at, the smaller of the demand's open quantity and what the supply line has left. Choose **Link supply** to record the coverage. It appears on the line's **Coverage** card, and the request or order itself is unchanged.

If someone else uses up the supply line or covers the demand first, Silkline refuses the action and writes nothing. Reopen the dialog to see the current quantities.

## Confirm what is covered

The **Coverage** cell shows covered against demanded quantity with a stacked bar. Select the bar to see the covered and open quantities, the status, and a chip linking to each covering request and order.

<table><thead><tr><th width="191">Coverage status</th><th>Meaning</th></tr></thead><tbody><tr><td><strong>Not covered</strong></td><td>No request or order covers this line yet.</td></tr><tr><td><strong>Partially covered</strong></td><td>Part of the quantity is covered; the rest still needs buying.</td></tr><tr><td><strong>Covered</strong></td><td>Requests or orders cover the full quantity.</td></tr><tr><td><strong>Over covered</strong></td><td>Coverage exceeds the demanded quantity; retract the excess. The bar shows the excess as its own segment.</td></tr></tbody></table>

The table and the line's **Coverage** card describe the same allocations at different grain. An allocation reports as its order line once one exists, because the order line is the one actually buying the demand.

<table><thead><tr><th width="191">Allocation</th><th width="160">Table bucket</th><th>Coverage card stage</th></tr></thead><tbody><tr><td>Request line, no order yet</td><td><strong>Open request</strong></td><td><strong>On request</strong></td></tr><tr><td>Purchase line, not fully received</td><td><strong>Open order</strong></td><td><strong>On order</strong></td></tr><tr><td>Purchase line, complete or over received</td><td><strong>Received</strong></td><td><strong>Received</strong></td></tr><tr><td>Purchase line cancelled</td><td>Still counted as covered</td><td><strong>Cancelled order</strong></td></tr></tbody></table>

Each card row names the covering record, the stage, the quantity, who created the covering record, and when the coverage was attached. Retracted rows sit under a **Retracted** heading with the quantity struck through.

**History** on a line opens **Line Activity**, which records the line's creation and every coverage attach and retraction. Field edits are not recorded.

## Undo coverage

Retraction takes an allocation back so it no longer counts. It is a correction, not a record of fulfilment: a received order keeps its allocation and reports delivery through the order line. Retract from the line's **Coverage** card with **Retract** on the row, or from the linked demand on a request's or order's detail page, which retracts every allocation tying that document to the line at once. The demand becomes open again and the allocation stays as history, excluded from covered quantity, the coverage bar, run rollups, and search.

## Close out demand

Status says whether the run still demands the line. It is distinct from coverage, which says whether the need has been met.

<table><thead><tr><th width="191">Status</th><th>Meaning</th></tr></thead><tbody><tr><td><strong>Open</strong></td><td>The run still demands this line.</td></tr><tr><td><strong>Closed</strong></td><td>The line is finished: the need was met, or a later run restated it.</td></tr><tr><td><strong>Cancelled</strong></td><td>The line was withdrawn and is no longer demanded.</td></tr></tbody></table>

Change status from the selector beside a line's title, with **Close lines** and **Cancel lines** on a table selection, or with **Close all lines** and **Cancel all lines** on a run. A closed line cannot move straight to cancelled, or the reverse: reopen it first. Changing status leaves coverage in place.

### Demand runs

A run's page gathers everything one planning pass asked for. Open it from the **Source** column on any line, or, for an uploaded run, from **Runs** on the Demand page. **Runs** lists every uploaded run, newest first, with its upload date, line count, and coverage status. A run page shows the run type, a coverage rollup, a progress banner with the share of open demand covered, and how many request and order lines are allocated to it. From the action bar, you can create a request or order, assign buyers, close lines, or cancel lines for all open demand in the run. On a manual run, **Upload new version** updates the run from a newer file. You can rename any run.

## Why does this line...

**...show a blank Coverage cell?** Coverage status applies to open lines only. Closing or cancelling a line blanks the cell. The coverage itself stays attached, and the status returns when the line is reopened.

**...read as covered when its order was cancelled?** A cancelled order keeps its quantity in the covered figure and shows a **Cancelled order** stage on the Coverage card. Retract the coverage to reopen the demand.

**...stay open after I created a request or order?** No saved line matched it. The toast names the likely causes: the part changed in the form, the need date falls after the demand needs it, or a segment value differs. The request or order is already saved at that point, so fix it there or retract the coverage and try again.

**...show a quantity the run did not ask for?** A planner set an **Asserted Qty**. Coverage is measured against it, and **Demanded Qty** shows whichever figure is in force.

**...lose the buyer I assigned?** A re-sync from your planning system restates buyer, part, need date, pedigree, status, and supplier hint from the source. Only the asserted quantity survives.

**...disagree between Ever Purchased From and Last Supplier?** The filter spans the whole purchase history; the column shows only the most recent purchase.

## Reference

### Columns worth knowing

Most columns are self-explanatory. These carry meaning that is not obvious from the header. Many are hidden by default and available from the column selector.

<table><thead><tr><th width="191">Column</th><th>What it shows</th></tr></thead><tbody><tr><td>Description</td><td>The part's description, or the line's custom part description when it has no linked part. Always included in CSV export.</td></tr><tr><td>Line No.</td><td>The source document's own name where it has one, otherwise the line's position within it.</td></tr><tr><td>Run Qty</td><td>The gross quantity the run asks for, in the part's consumption unit of measure.</td></tr><tr><td>Asserted Qty</td><td>The quantity a planner set, overriding the run.</td></tr><tr><td>Demanded Qty</td><td>The quantity coverage is measured against: asserted when set, otherwise run.</td></tr><tr><td>Open Qty</td><td>Demanded less covered, floored at zero. Zero for any line that is not open.</td></tr><tr><td>Supplier Hint</td><td>The supplier the source suggests. Advisory only: it does not commit the line. An order created from demand lines that all share one hint starts with that supplier.</td></tr><tr><td>Source</td><td>The run that stated the line, linking to the run page.</td></tr><tr><td>Sourcing</td><td><strong>Quoted</strong> or <strong>Needs sourcing</strong>, read live from your quotes.</td></tr><tr><td>Last Supplier</td><td>The supplier on the most recent open or closed order for the part.</td></tr><tr><td>Quoting Suppliers</td><td>Suppliers with a confirmed, unexpired quote for the part.</td></tr></tbody></table>

Segment columns are shown by default and marked with a branch icon carrying a **Manage segments** link. Each demand line custom field is its own column.

### Filters and search

**Search demand...** matches line number, part number, name, and description, custom part description, category, run name, and the numbers of covering requests and orders. Filters cover Status, Coverage, Quote Coverage, **Ever Purchased From**, **Quoting Suppliers**, **Supplier Hint**, Source, Buyer (with **Unassigned**), Part (with **Custom part**), Category, Inventory Type, Need Date (with **Due in next**), Created (with **Older than**), and every demand line custom field. Segmentation fields sort to the front.

### Permissions

<table><thead><tr><th width="256">To do this</th><th>You need</th></tr></thead><tbody><tr><td>See the Demand pages</td><td>The Plans module enabled for your organization.</td></tr><tr><td>Edit a line, change its status, run bulk actions, retract coverage, rename a run</td><td><strong>Edit demand</strong>.</td></tr><tr><td>Upload a file as a new manual run</td><td><strong>Create demand</strong>.</td></tr><tr><td>Upload a new version of a manual run</td><td><strong>Create demand</strong> and <strong>Edit demand</strong>.</td></tr><tr><td>Link existing supply to a line</td><td><strong>Edit demand</strong>.</td></tr><tr><td>Create a request from demand</td><td><strong>Edit demand</strong> and <strong>Create request</strong>.</td></tr><tr><td>Create an order from demand</td><td><strong>Edit demand</strong> and <strong>Create order</strong>.</td></tr><tr><td>Enable the Plans module and manage segmentation</td><td>Silkline administrator permissions.</td></tr></tbody></table>
