---
title: "Product suppliers"
source: https://support.storeconnect.com/articles/product-suppliers
type: article
format: markdown
site: StoreConnect Support — product and developer documentation for StoreConnect
site_index: https://storeconnect.com/llms.txt
docs_index: https://support.storeconnect.com/llms.txt
note: Append .md to any page or article URL on this site to get its Markdown form.
---
# Product suppliers

A supplier is an **Account** with the **Is Supplier** checkbox selected. Linking a supplier to a product records what you pay for that product, the quantities you have to buy it in, and what it costs you once it reaches your warehouse.

Use this process when you want to compare sourcing options for the same product, calculate margin from real cost data, or give your buying team the numbers they need to reorder.

:::warning
Purchase price and landed cost are buy-side commercial data. Neither field syncs to your website, so they cannot be rendered on a storefront page or in a customer-facing account area, and you should not try to expose them by another route. See [Cost data cannot reach the storefront](#cost-data-cannot-reach-the-storefront).
:::

## Before you start

-   Create an **Account** for each supplier, with **Is Supplier** selected. See [Add a supplier list to POS](add-a-supplier-list).
-   Create the products you want to link suppliers to.

## How supplier data is structured

Two records hold supplier information, and they do different jobs.

-   **Account** — the supplier company itself, its contacts, and its address. The **Is Supplier** checkbox makes it a supplier, and **Supplier Notes** holds internal notes that only POS staff see.
-   **Supplier Account** (`s_c__Product_Supplier__c`) — one record per product-and-supplier pair. This is where the commercial terms live.

Because **Supplier Account** is a join record, one product can have many suppliers and one supplier can supply many products. That is what makes second-sourcing and price comparison possible.

## Link a supplier to a product

1.  Go to the **Supplier Accounts** list.
2.  Click **New**.
3.  In the **Account** field, select the supplier.
4.  In the **Product** field, select the product this supplier provides.
5.  Enter the commercial terms in the fields described below.
6.  Click **Save**.

The product now shows this supplier in its **Suppliers** related list.

The packaged Account layout has no matching related list, so to see every product one supplier provides, either add the related list to your Account layout or report over **Supplier Accounts** grouped by **Account**.

## Supplier Account fields

| Field | API name | What it records |
|-------|----------|-----------------|
| **Account** | `s_c__Account_Id__c` | The supplier Account. Required. |
| **Product** | `s_c__Product_Id__c` | The product being supplied. |
| **Purchase Price** | `s_c__Purchase_Price__c` | The unit cost price of this item from this supplier. This is the price on the supplier's invoice, before freight and other charges. |
| **Landed Cost** | `s_c__Landed_Cost__c` | The total cost per unit including shipping and other costs, blended across all previous orders from this supplier. |
| **Minimum Order Quantity** | `s_c__Minimum_Order_Quantity__c` | The smallest quantity this supplier will accept on an order. |
| **Units Of Measure** | `s_c__Units_Of_Measure__c` | The quantity multiple you have to order in. A value of `50` means you order in multiples of 50. |
| **Supplier Phone** | `s_c__Supplier_Phone__c` | The supplier's phone number, pulled through from the Account. Read-only. |

For the full field list, see the [Supplier Account object reference](product-supplier-object-reference).

### Purchase price and landed cost are different numbers

**Purchase Price** is what the supplier charges per unit. **Landed Cost** is what the unit actually costs you once freight, duty, and handling are included.

**Landed Cost** is a blended figure, averaged across all your previous orders from that supplier, rather than the cost of the most recent shipment. A single expensive air-freighted order raises it, and it comes back down as cheaper sea-freighted orders arrive. Treat it as a running average for margin and valuation, and use the invoice figure when you are checking one specific shipment.

:::warning
StoreConnect does not calculate, blend, or update either field. Both are values you enter and maintain, so the blended figure is only as current as you keep it. There is no freight or duty field to feed it from either, which means you have to work the blend out yourself and enter the result. Maintain it on a schedule, or push it in with a Flow or an integration from your accounting system.
:::

#### Example: a pan with freight and duty included

A supplier invoices $12.00 per unit for a cast iron pan, and freight, duty, and handling across your order history have averaged $3.40 per unit:

-   **Purchase Price** — `12.00`
-   **Landed Cost** — `15.40`

### Minimum order quantity and order multiples work together

**Minimum Order Quantity** is a floor. **Units Of Measure** is a step. A supplier with a minimum of 100 and a unit of measure of 50 will accept 100, 150, or 200 units, but not 120.

Both fields describe what *you* have to buy. Neither is enforced on customer orders, and there is no equivalent minimum quantity for customers buying from your store.

## Ways to use supplier data

### Compare sourcing options

Create a **Supplier Account** record for each supplier that can provide a product, then compare their **Landed Cost** rather than their **Purchase Price**. A supplier with a higher invoice price but local warehousing is often cheaper delivered, and only landed cost shows that.

Where you have a preferred and a backup supplier, record both. When the preferred supplier is out of stock, your buying team already has the alternative and its terms.

### Track margin

Margin needs a cost figure and a sell figure, and StoreConnect stores both. Three separate fields hold a cost, and they are not interchangeable:

| Field | Where it lives | What it is for |
|-------|----------------|----------------|
| **Cost Price** (`s_c__Cost_Price__c`) | Product | The product's own cost, used for reporting. Inventory valuation is derived from it, so this is the one to keep accurate. |
| **Purchase Price** and **Landed Cost** | Supplier Account | What one supplier charges you. A buying reference you maintain per supplier, not a valuation input. |
| **Unit Cost** (`s_c__Unit_Cost__c`) | Manual Stock Adjustment Item | What stock was valued at on one receipt, stamped at the time. Your cost history. |

For sell price, use the **Unit Price** on the Price Book Entry for the product. See [Price books](price-books).

Cost and sell price sit on different objects, so the margin calculation belongs on the Price Book Entry, which can reach the product's cost through its relationship. A **Formula** field returning **Currency** with `UnitPrice - Product2.s_c__Cost_Price__c` gives you margin per entry, and reporting on that field grouped by product shows where margin is thin.

Products with no **Cost Price** produce a blank margin rather than a full-price one, which is the safe behavior. Treat those rows as a data-quality list rather than a result.

To see margin by supplier, report over **Supplier Accounts** with **Landed Cost** as a column. The supplier link lives on the Product Supplier record rather than on the price book entry, so that is a second report rather than a grouping on the first.

Landed cost is the better basis for this than purchase price. Margin calculated on the invoice price alone ignores freight, and freight is where margin on low-value, high-bulk products usually disappears.

### When a supplier changes prices

Suppliers raise prices, add fuel surcharges, and change freight terms. Nothing updates the cost fields for you, so a price change is always a deliberate edit.

1.  Open the **Supplier Account** record for that product and supplier.
2.  Update **Purchase Price** to the new invoice price.
3.  Recalculate **Landed Cost** and enter the new figure, or leave it until the next shipment arrives and you know the real freight cost.
4.  Check the sell price still gives you the margin you need. See [Price books](price-books).

Where a supplier raises prices across a whole range, update the records in bulk with Data Loader rather than one at a time. The **Supplier Account** object (`s_c__Product_Supplier__c`) is an ordinary custom object, so a filtered export, an edit in a spreadsheet, and a re-import is the fastest route.

Keep the old figure if you need the history. These fields hold only the current value, so where you need to see what a product cost you over time, the receipt records are the audit trail: each **Manual Stock Adjustment Item** stamps its own **Unit Cost**. See [Receive stock from a supplier](receive-stock-from-a-supplier).

### Consignment stock

Consignment means holding a supplier's stock and paying only for what you sell. StoreConnect has no consignment flag, but the existing records model it well enough to run on, provided you separate consigned stock on the right axis.

Separate it **by stock location, not by supplier**. A **Stock Level** is unique per product and stock location, and it carries no supplier field, so location is the only axis you can actually segregate stock and its valuation on. Supplier does not work as the dividing line for two reasons:

-   A product can have many **Supplier Account** records, so "the supplier of this stock" is ambiguous for anything you dual-source.
-   The same product can be both consigned and owned outright, and one stock level cannot represent both.

Use one stock location per consignor. That leaves the supplier as the naming and reporting axis while location does the segregation work.

1.  Create a **Stock Location** for the consignor, named so it is obvious whose stock it holds. See [Stock locations](stock-locations).
2.  Create the product and a **Supplier Account** record for the consigning supplier.
3.  Set **Purchase Price** to the amount you owe the supplier per unit sold, and **Landed Cost** to that amount plus any freight you absorb.
4.  Receive the consigned stock into that location, so the receipt carries the supplier and the unit cost. See [Receive stock from a supplier](receive-stock-from-a-supplier).
5.  Report on sales of those products, and on the receipts into that location, to work out what to remit each period.

:::warning
Stock locations take part in fulfillment, and three settings decide whether a new one starts filling online orders. They sit on three different records, which is easy to get wrong:

-   **Online Fulfillment Options** on the **Stock Location**, which sets the delivery types it serves.
-   **Fulfill Online Orders** on each **Stock Level**, which is what actually decides whether that product at that location can serve the web store.
-   **Priority** on the **Store Stock Location**, the record linking the location to a store, which decides the order locations are drawn from.

Set all three deliberately when you add a consignment location, or consigned stock may start filling orders you intended to fill from stock you own. See [Manage stock levels](managing-stock-levels).
:::

The distinction consignment needs and StoreConnect does not model directly is ownership: consigned stock appears in your inventory valuation alongside stock you own. Separating it by location is what lets you subtract it again, so decide the location structure before you receive the first consignment.

### Link a supplier to an individual asset

Serialized items are held as **Asset** records, and the Asset object has no supplier field. Where you need to know which supplier a specific serial number came from, add the field yourself. Because StoreConnect runs on Salesforce, this is ordinary configuration rather than a product change.

1.  In Salesforce Setup, open **Object Manager** and select **Asset**.
2.  Create a new field of type **Lookup Relationship** to **Account**, named `Supplier`.
3.  Add a lookup filter on the field so it only offers supplier accounts: **Is Supplier** (`s_c__Supplier__c`) equals `True`. This stops staff picking a customer by mistake.
4.  Add the field to the Asset page layout.
5.  Populate it as you receive each unit.

Reports, list views, and roll-ups work on the new field straight away, so you can report warranty claims or fleet cost by supplier with no further setup.

To read the field on a POS device, name it in a **POS Layout Field**, **POS Layout Filter**, or the layout's **Sort**, then create a **Custom Data Mapping** with **Object API Name** `Asset` and **Field API Name** `Supplier__c`, and resync. A read-only mapping is enough unless the POS needs to write the value back. See [POS layouts](pos-layouts) and [Custom data fields in Liquid](liquid-custom-data-fields).

:::note
There is no Asset drop in Liquid, so you cannot read the field as `asset.supplier` in a theme template. Asset does sync to the site database, so query it instead. Test the query in your own org before you build a page on it, since what a query returns depends on your sync configuration. See [Liquid query](liquid-query).
:::

### Cost a rental fleet

Rental products are held as **Asset** records with serial numbers, and each rental charges per term unit for the number of terms booked. See [Configure rental products](how-to-configure-rental-products).

Out of the box the supplier link for a rental item sits on the product rather than the individual unit. Create a **Supplier Account** record for the rental product, and its **Landed Cost** gives you the delivered cost of one unit of the fleet. Compare that against the rental revenue the product earns to work out how long a unit takes to pay for itself, and which lines are worth restocking.

Where you need the acquisition cost of one specific serial number, record it when you receive the unit. The **Unit Cost** on a manual stock adjustment item captures what that receipt cost. See [Receive stock from a supplier](receive-stock-from-a-supplier). To track which supplier each individual unit came from, add a supplier field to the Asset object. See [Link a supplier to an individual asset](#link-a-supplier-to-an-individual-asset).

Rentals and special orders both appear in the **Pickups** section of the POS register, and the suppliers list is useful next to it: when a customer returns a rental asset damaged, staff need the supplier's contact details to arrange a repair or replacement.

## Read supplier data in Liquid

The **Supplier Account** object is queryable from a template, but the commercial terms are not. Only some of its columns sync to the site database, so a query returns the join and nothing you pay.


```liquid

{%- query 's_c__Product_Supplier__c' as links, s_c__product_id__c: product.id %}

{%- for link in links %}
  {%- query 'account' as accounts, sfid: link.s_c__account_id__c %}
  {%- for a in accounts %}{{ a.name }}{%- endfor %}
{%- endfor %}
```


The join record's own `name` is an auto-number like `SupplierAccount-000001`, not the supplier's name, which is why the second query is needed. Cache the result if you render it on a product page.

These are the fields a template can read:

| Field | Notes |
|-------|-------|
| `sfid` | The record id |
| `name` | The record name, an auto-number such as `SupplierAccount-000001` |
| `s_c__sc_id__c` | StoreConnect external id |
| `s_c__account_id__c` | The supplier Account |
| `s_c__product_id__c` | The product |
| `custom_data` | Any fields you expose with a [Custom Data Mapping](custom-data-mapping-object-reference) |
| `createddate`, `lastmodifieddate`, `systemmodstamp` | Record timestamps |

There is no ProductSupplier drop, so rows come back as generic records rather than with named attributes. Use this to show which supplier or brand provides a product, where that is useful to customers.

## Cost data cannot reach the storefront

**Purchase Price**, **Landed Cost**, **Minimum Order Quantity**, **Units Of Measure**, and **Supplier Phone** do not sync to the site database. No column exists for them, so no query and no drop can return them. This is a property of the sync schema rather than a convention you could work around, and you should not try to route around it by copying those values onto a product with a custom data mapping.

:::note
The StoreConnect administrator and sync permission sets grant field-level access to the cost fields in Salesforce, and the package sends them in its outbound sync payload. Neither is evidence that the values reach your website: with no destination column on the site side, they land nowhere. Do not read the permission set as a sign the data is exposed.
:::

Two supplier-related values are available to themes, and both are safe to display:

| Liquid | Salesforce field | Notes |
|--------|------------------|-------|
| `product.supplier_code` | `Product2.s_c__Supplier_Code__c` | The supplier's own code for the product. Useful for parts lookups. |
| `account.supplier_notes` | `Account.s_c__Supplier_Notes__c` | Internal notes, intended for POS staff. Exposed on the Account drop, so keep them free of anything you would not show a customer. |

Where you want to give business customers sourcing information, use signals that carry no cost data: stock availability, backorder status, and lead times. See [Backorders](backorders) and [Quote requests](quote-requests).

Once you have supplier records in place, your product records show where each item comes from and what it costs you, and you can reorder against real terms rather than from memory.

---

## Follow StoreConnect

- [Email Newsletter](https://storeconnect.com/c/lp-newsletter)
- [LinkedIn Newsletter](https://www.linkedin.com/build-relation/newsletter-follow?entityUrn=7444956928444862464)
- [YouTube](https://www.youtube.com/channel/UCngKdP2x8l1wcbAKW3tvU8g)
- [LinkedIn](https://www.linkedin.com/company/storeconnect)
- [X / Twitter](https://x.com/storeconnecthq)

## Popular Links

- [Partners](https://storeconnect.com/partners)
- [Become a Partner](https://storeconnect.com/become-a-partner)
- [News](https://storeconnect.com/articles/news)
- [Events](https://storeconnect.com/articles/events)
- [Live Events](https://storeconnect.com/live-events)
- [Feature Comparison](https://storeconnect.com/how-we-compare)
- [Download a free trial](https://appexchange.salesforce.com/appxListingDetail?listingId=a0N3A00000FMkeKUAT)
- [Book a Demo](https://storeconnect.com/contact)

## Documentation

- [Help documentation](https://support.storeconnect.com/help-documentation)
- [AI agents](https://support.storeconnect.com/ai)
- [Videos & tutorials](https://support.storeconnect.com/videos-tutorials)
- [Developer reference](https://support.storeconnect.com/developer-reference)
- [Release notes](https://support.storeconnect.com/release-notes)
- [Troubleshooting](https://support.storeconnect.com/troubleshooting)
- [Trust Center](https://trust.getstoreconnect.com/)
- [Status Page](https://status.storeconnect.com/)

## Contact

- info@getstoreconnect.com
- US +1 415 745 3230
- AUS +61 2 8365 2308

100 S Ashley Dr, Suite 600-2461
Tampa FL 33602-600 USA

Level 22, Sydney Place
180 George Street
Sydney, NSW, 2000, AUS

## Machine-readable

- [Site index for agents](https://storeconnect.com/llms.txt): curated map of the StoreConnect site in llms.txt format
- [Documentation index for agents](https://support.storeconnect.com/llms.txt): full technical and product documentation map

Every page and article on this site has a Markdown rendering: append `.md` to its URL.

Continue in Markdown: [Help documentation](https://support.storeconnect.com/help-documentation.md) · [Developer reference](https://support.storeconnect.com/developer-reference.md) · [Videos & tutorials](https://support.storeconnect.com/videos-tutorials.md) · [Release notes](https://support.storeconnect.com/release-notes.md)

---

StoreConnect Support — https://support.storeconnect.com/articles/product-suppliers