# Objects / Products

# Products

**Object**
## BarcodePromotionPrice

| Fields | Type | Description |
| --- | --- | --- |
| outlet | [Outlet!](/documentation/Objects/Outlets#Outlet) | The outlet for the promotional price |
| price | *Float* | The price for the barcode |



**Object**
## FutureCost

| Fields | Type | Description |
| --- | --- | --- |
| id | [ID!](/documentation/Types/UUID#UUID) | The ID of the cost change |
| cost | *Float!* | The cost including tax |
| effectiveTime | [DateTime!](/documentation/Types/Date-Time#DateTime) | The time the cost will become active |
| outlet | [Outlet](/documentation/Objects/Outlets#Outlet) | The outlet the cost will apply to (if null, it's the global cost) |
| user | [User](/documentation/Objects/User#User) | The user who set the cost |
| item | [HasPriceClassificationUnion!](/documentation/Unions/Has-Price-Classification-Union#HasPriceClassificationUnion) | The item this cost is for |



**Object**
## FuturePrice

### Implements
*List of interfaces this object implements*

- [PrintableInterface](/documentation/Interfaces/Printable-Interface#PrintableInterface)

| Fields | Type | Description |
| --- | --- | --- |
| id | [ID!](/documentation/Types/UUID#UUID) | The ID of the price change |
| quantity | *Float!* | The quantity for the price |
| price | *Float* | The price including tax, if null, the price will be removed |
| priceEx | *Float* | The price excluding tax, if null, the price will be removed |
| priceSet | [PriceSet](/documentation/Objects/Price-Set#PriceSet) | The price set this price belongs to |
| user | [User](/documentation/Objects/User#User) | The user who set the price |
| effectiveTime | [DateTime!](/documentation/Types/Date-Time#DateTime) | The time the price will become active |
| item | [HasPriceClassificationUnion!](/documentation/Unions/Has-Price-Classification-Union#HasPriceClassificationUnion) | The item this price is for |



**Object**
## ProductAlternateName

| Fields | Type | Description |
| --- | --- | --- |
| hostConnection | [HostConnection!](/documentation/Objects/Host#HostConnection) | The host connection that is created the alternate name |
| quantity | *Float* | The quantity associated to the alternate name |
| name | *String* | The alternate name |



**Object**
## ProductBackorder

| Fields | Type | Description |
| --- | --- | --- |
| id | [ID!](/documentation/Types/UUID#UUID) | The ID of the backorder |
| outlet | [Outlet!](/documentation/Objects/Outlets#Outlet) | The Outlet the backorder is for |
| customer | [Customer!](/documentation/Objects/Customers#Customer) | The Customer who has requested the product |
| product | [Product!](/documentation/Objects/Products#Product) | The Product which is on backorder |
| quantity | *Float!* | The quantity of the product the customer would like |
| recurringPeriod | [TimePeriod](/documentation/Types/Time-Period#TimePeriod) | The recurring period this product should be reordered on |
| nextDueDate | [DateTime](/documentation/Types/Date-Time#DateTime) | The next time this product is due for ordering |
| onOrder | [Order](/documentation/Objects/Orders#Order) | The order this backorder is currently on |
| notes | *String!* | The notes regarding this backorder |
| createdAt | [DateTime!](/documentation/Types/Date-Time#DateTime) | The time this backorder was created |
| updatedAt | [DateTime!](/documentation/Types/Date-Time#DateTime) | The last time this backorder was updated |



**Object**
## ProductBarcode

| Fields | Type | Description |
| --- | --- | --- |
| product | [Product!](/documentation/Objects/Products#Product) | The product associated to this barcode |
| quantity | *Float!* | The quantity for this barcode |
| code | *String!* | The barcode |
| template | [BarcodeTemplate](/documentation/Objects/Barcode-Template#BarcodeTemplate) | The barcode template (if applicable) |
| lastSoldAt | [DateTime](/documentation/Types/Date-Time#DateTime) | The timestamp of the last time this barcode was used in a sale |
| lastStocktakedAt | [DateTime](/documentation/Types/Date-Time#DateTime) | The timestamp of the last time this barcode was used in a stocktake |
| hostDeletedAt | [DateTime](/documentation/Types/Date-Time#DateTime) | The timestamp of when the host file deleted this barcode |
| promotionPrice | *Float* | The approximate promotional price of this barcode quantity, this is not necessarily what will be used when scanned in the POS and may be higher than the everyday price. It only uses "simple" promotions (single criteria or mix criteria, exact quantity, price override) and is an expensive calculation so use sparingly. This field does not send in Webhooks except for approved applications |
| outletPromotionPrices | [[BarcodePromotionPrice!]!](/documentation/Objects/Products#BarcodePromotionPrice) | The approximate promotional price per outlet, uses the same rules as above but is designed for each Outlet. This field does not send in Webhooks except for approved applications |



**Object**
## ProductCompetitorPrice

| Fields | Type | Description |
| --- | --- | --- |
| competitor | *String!* | The name of the competitor for the competition pricing |
| price | *Float!* | The name of the price for the competition pricing |
| quantity | *Float!* | The name of the quantity for the competition pricing |
| updatedAt | [DateTime!](/documentation/Types/Date-Time#DateTime) | The last time the competition price was updated |



**Object**
## ProductCost

| Fields | Type | Description |
| --- | --- | --- |
| outlet | [Outlet!](/documentation/Objects/Outlets#Outlet) | The outlet this cost is for |
| lastCost | *Float!* | The last case cost for this outlet |
| averageCost | *Float!* | The average case cost for this outlet |
| cost | *Float!* | The current case cost for the outlet (affected by Vendor settings) |



**Object**
## ProductHostDeletion

| Fields | Type | Description |
| --- | --- | --- |
| hostConnection | [HostConnection!](/documentation/Objects/Host#HostConnection) | The host that has deleted this product |
| deletedAt | [DateTime!](/documentation/Types/Date-Time#DateTime) | The timestamp for when the host deleted the product |



**Object**
## ProductInclude

| Fields | Type | Description |
| --- | --- | --- |
| product | [Product!](/documentation/Objects/Products#Product) | The product that is included |
| quantity | *Float!* | The quantity of the product that is included |
| addPrice | *Float* | The price to add additional quantity of this product (only set if the parent's type is "PACKAGE") |
| removePrice | *Float* | The price to remove quantity of this product (only set if the parent's type is "PACKAGE") |



**Object**
## ProductInventory

| Fields | Type | Description |
| --- | --- | --- |
| outlet | [Outlet!](/documentation/Objects/Outlets#Outlet) | The outlet this inventory is for |
| quantity | *Float!* | The number of items this product has in stock (made from singleLevel + caseLevel * caseQuantity) |
| singleLevel | *Float!* | The amount of singles this product has in stock |
| caseLevel | *Float!* | The amount of cases this product has in stock |
| reorderLevel | *Float!* | The number of items to trigger reorder for this product (made from reorderLevelSingles + reorderLevelCases * caseQuantity) |
| reorderLevelSingles | *Float!* | The number of singles to trigger reorder for this product |
| reorderLevelCases | *Float!* | The number of cases to trigger reorder for this product |
| reorderAmount | *Float!* | The amount of items to reorder when reorder level is triggered (made from reorderAmountSingles + reorderAmountCases * caseQuantity) |
| reorderAmountSingles | *Float!* | The amount of singles to reorder when reorder level is triggered |
| reorderAmountCases | *Float!* | The amount of cases to reorder when reorder level is triggered |
| reorderLimit | *Float* | The maximum amount of items to reorder at any point (note, this is a soft limit) (made from reorderLimitSingles + reorderLimitCases * caseQuantity) |
| reorderLimitSingles | *Float* | The maximum number of singles to reorder at any point |
| reorderLimitCases | *Float* | The maximum number of cases to reorder at any point |
| reorderRounding | [InventoryReorderRoundingTypeEnum!](/documentation/Enums/Inventory-Reorder-Rounding-Type-Enum#InventoryReorderRoundingTypeEnum) | The way the items should be rounded when dynamically reordering |
| maxQuantity | *Float* | The maximum quantity to have on hand at any one time (not just within one order) (made from maxQuantitySingles + maxQuantityCases * caseQuantity) |
| maxQuantitySingles | *Float* | The maximum number of singles to have on hand at any one time |
| maxQuantityCases | *Float* | The maximum number of cases to have on hand at any one time |
| onOrder | *Float!* | The number of items that are currently on order (this is not sent for webhooks) |



**Object**
## ProductItemsSold

| Fields | Type | Description |
| --- | --- | --- |
| outlet | [Outlet!](/documentation/Objects/Outlets#Outlet) | The outlet these sales belong to |
| quantity | *Float!* | The total number of items that were sold |
| singles | *Float!* | The number of single items that were sold (the total quantity without any cases) |
| cases | *Float!* | The number of cases that were sold |
| periodFrom | [DateTime!](/documentation/Types/Date-Time#DateTime) | The time this query was run from (typically the provided period, however may be later if the product or outlet was created later) |
| periodTo | [DateTime!](/documentation/Types/Date-Time#DateTime) | The time this query was run to (typically the provided period) |



**Object**
## ProductLoyalty

| Fields | Type | Description |
| --- | --- | --- |
| outlet | [Outlet!](/documentation/Objects/Outlets#Outlet) | The outlet this loyalty is for |
| quantity | *Float!* | The quantity to trigger this loyalty level |
| loyaltyValue | *Float* | The earn rate per dollar at this level |
| redeemValue | *Float* | The redeem rate per dollar at this level |



**Object**
## ProductPrice

| Fields | Type | Description |
| --- | --- | --- |
| quantity | *Float!* | The quantity for the price |
| price | *Float!* | The price including tax |
| priceEx | *Float!* | The price excluding tax |
| decimalPlaceLength | *Int!* | The amount of decimal places to show (when including tax) |
| priceSet | [PriceSet](/documentation/Objects/Price-Set#PriceSet) | The price set this price belongs to |



**Object**
## ProductRecommendedPrice

| Fields | Type | Description |
| --- | --- | --- |
| quantity | *Float!* | The quantity for the price |
| price | *Float!* | The price including tax |
| priceEx | *Float!* | The price excluding tax |
| isMaximum | *Boolean!* | Whether this price has been marked as a maximum price (sell price should not go above this) |
| connection | [HostConnection!](/documentation/Objects/Host#HostConnection) | The host connection that has specified this price |



**Object**
## ProductSupplierCost

| Fields | Type | Description |
| --- | --- | --- |
| outlet | [Outlet!](/documentation/Objects/Outlets#Outlet) | The outlet that the supplier cost relates to |
| cost | *Float* | The cost for the supplier cost. If null, the replacement cost should be inherited from either global cost or last cost depending on settings |



**Object**
## ProductSupplier

| Fields | Type | Description |
| --- | --- | --- |
| supplier | [Supplier!](/documentation/Objects/Suppliers#Supplier) | The supplier for the product |
| code | *String!* | The supplier's code for this product |
| costs | [[ProductSupplierCost!]!](/documentation/Objects/Products#ProductSupplierCost) | The costs that are associated with the supplier |
| minimumOrderQuantity | *Int!* | The supplier's minimum order quantity for this product |



**Object**
## Product

### Implements
*List of interfaces this object implements*

- [SellableInterface](/documentation/Interfaces/Sellable-Interface#SellableInterface)
- [LoyaltyInterface](/documentation/Interfaces/Loyalty-Interface#LoyaltyInterface)
- [ReportFilterInterface](/documentation/Interfaces/Report-Filter-Interface#ReportFilterInterface)
- [SaleActionAffectingInterface](/documentation/Interfaces/Sale-Action-Affecting-Interface#SaleActionAffectingInterface)
- [HostAppliableInterface](/documentation/Interfaces/Host-Appliable-Interface#HostAppliableInterface)
- [PrintableInterface](/documentation/Interfaces/Printable-Interface#PrintableInterface)

| Fields | Type | Description |
| --- | --- | --- |
| id | [ID!](/documentation/Types/UUID#UUID) | The ID of the product |
| name | *String!* | The name of the product |
| mdbId | *Int* | The ID of the product this is mapped to in the master database or null if not connected |
| type | [ProductTypeEnum!](/documentation/Enums/Product-Type-Enum#ProductTypeEnum) | The type of product this is |
| active Deprecated | *Boolean!* | Whether the product is active or not Use `status` instead as this is no longer a simple boolean |
| status | [ProductStatusEnum!](/documentation/Enums/Product-Status-Enum#ProductStatusEnum) | The current status of the product |
| useScales | *Boolean!* | Whether the product should attempt to read weight from the configured scales. |
| useBarcodeTemplates | *Boolean!* | Whether this product can have barcodes with barcode templates |
| usePriceLabel Deprecated | *Boolean* | usePriceLabels has been superseded by useBarcodeTemplates (this will now always return false) usePriceLabels has been superseded by useBarcodeTemplates (this will now always return false) |
| requestQuantity | *Boolean!* | Whether the product should ask to specify quantity when added to a sale. |
| requestPrice | *Boolean!* | Whether this product should request a price rather than using predefined points. |
| description | *String* | A long HTML description for the product. |
| category | [Category](/documentation/Objects/Classifications#Category) | The category of the product |
| brand | [Brand](/documentation/Objects/Classifications#Brand) | The brand of the product |
| family | [Family](/documentation/Objects/Classifications#Family) | The family of the product |
| tags | [[Tag]!](/documentation/Objects/Classifications#Tag) | The tags of the product |
| suppliers | [[ProductSupplier]!](/documentation/Objects/Products#ProductSupplier) | The suppliers of the product |
| coreSupplier | [Supplier](/documentation/Objects/Suppliers#Supplier) | The "main" supplier that this item is purchased from. |
| lastSupplier | [Supplier](/documentation/Objects/Suppliers#Supplier) | The last supplier that this item was purchased from. |
| minimumOrderQuantity | *Int!* | The minimum order quantity for the product, if supplier is not supplied the value will be zero (or attempt to resolve the supplier from the query, such as from within orders) |
| orderNotes | *String* | Notes to display when ordering this product |
| invoiceNotes | *String* | Notes to display when receiving this product on an order |
| taxRate | [TaxRate](/documentation/Objects/Tax-Rate#TaxRate) | The tax rate that applies to this product, null means No Tax (0%) |
| costTaxRate | [TaxRate](/documentation/Objects/Tax-Rate#TaxRate) | The tax rate that applied to this product's costs, null means No Tax (0%) |
| inheritingCostTaxRate | *Boolean!* | Whether the cost tax rate is inheriting the tax rate |
| lastCost | *Float!* | The last "local" cost (as controlled by the Vendor settings), if outlet is specified it uses that outlet's cost, otherwise it uses the global cost (or attempts to resolve the last cost from the query, such as from within orders) |
| averageCost | *Float!* | The average "local" cost (as controlled by the Vendor settings), if outlet is specified it uses that outlet's cost, otherwise it uses the global cost |
| globalLastCost | *Float!* | The global last cost |
| globalAverageCost | *Float!* | The global average cost |
| cost | *Float!* | The current "local" case cost (as controlled by the Vendor settings), if outlet is specified it uses that outlet's cost, otherwise it uses the global cost |
| globalCost | *Float!* | The current global case cost (affected by Vendor settings) |
| costs | [[ProductCost]!](/documentation/Objects/Products#ProductCost) | A list of case costs for every outlet |
| replacementCost | *Float* | The replacement cost for the product, if either of the arguments are not supplied the value will be null (or attempts to resolve the supplier and outlet from the query, such as from within orders) |
| costPercentage | *Boolean!* | Whether the cost is a percentage of the sell price, if so, the percentage uses the "cost" field |
| caseQuantity | *Float!* | The number of products that come in a case |
| trackInventory | *Boolean!* | Whether inventory should be tracked for this product or not |
| inventory | [[ProductInventory]](/documentation/Objects/Products#ProductInventory) | Each Outlet's stock holdings for the product |
| inventoryLog | [ProductInventoryLogConnection](#ProductInventoryLogConnection) | Inventory Log Connection |
| ticketInformation Deprecated | [JSON](/documentation/Types/JSON#JSON) | Customisable additional information to include on each product (deprecated) We've changed the way this data is stored, this is here purely for backwards compatibility purposes. The `additionalFields` field should be used instead. |
| additionalFields | [[AdditionalValue]](/documentation/Objects/Additional-Value#AdditionalValue) | Customisable additional information to include on each product |
| image | *String* | The main image for the product |
| alternateImages | *[String]!* | A list of additional images for the product |
| tempProduct | *Boolean!* | Whether this product has been created temporarily due to external invoices - these are typically short lived products |
| createdAt | [DateTime!](/documentation/Types/Date-Time#DateTime) | The time this product was created |
| updatedAt | [DateTime!](/documentation/Types/Date-Time#DateTime) | The time this product was last updated |
| prices | [[ProductPrice]](/documentation/Objects/Products#ProductPrice) | The prices for the product, this is null if requestPrice is true |
| recommendedPrices | [[ProductRecommendedPrice!]!](/documentation/Objects/Products#ProductRecommendedPrice) | The recommended prices for the product from the connected host files |
| barcodes | [[ProductBarcode]](/documentation/Objects/Products#ProductBarcode) | A list of barcodes for the product |
| preventManualDiscounts | *Boolean!* | Whether this product can have a manual discount applied |
| ignorePriceHostChanges | *Boolean* | Whether this product can receive price changes from a host file. |
| ignoreBarcodeHostChanges | *Boolean* | Whether this product can receive barcode changes from a host file. |
| loyalty | [[ProductLoyalty]](/documentation/Objects/Products#ProductLoyalty) | The loyalty associated with this product (does not show classification loyalty levels) |
| revisions | [ProductRevisionConnection](#ProductRevisionConnection) | The revisions for the product |
| lastOrderedDate | [Date](/documentation/Types/Date#Date) | The date this product was last ordered |
| lastSentDate | [DateTime](/documentation/Types/Date-Time#DateTime) | The date this product was last sent on an order |
| lastReceivedDate | [Date](/documentation/Types/Date#Date) | The date this product was last received |
| lastReceivedBaseCost | *Float* | The base cost this product was last received. If the outlet argument is specified, it is for that outlet, otherwise it will return it for all outlets (or attempts to resolve the last cost from the query, such as from within orders) |
| contains | [[ProductInclude]](/documentation/Objects/Products#ProductInclude) | The products that are included in the product when added to the sell screen |
| parents | [[ID]](/documentation/Types/UUID#UUID) | A list of UUIDs of parent products |
| metcashMSC | *String* | The Metcash classification for the product |
| itemsSoldForPeriod | [[ProductItemsSold!]!](/documentation/Objects/Products#ProductItemsSold) | The number of items sold for the provided period (periodStart defaults to one week ago, can specify null to get sales for all time). It uses a complex calculation so use sparingly. You may be better to use the Reporting API to get the information you require. This field does not send in webhooks. We suggest using the same arguments for all products otherwise this may result in extra sales being retrieved when less where expected. |
| buyingPeriods | [[BuyingPeriod!]!](/documentation/Objects/Buying-Periods#BuyingPeriod) | Retrieve the current and future buy periods for this product |
| competitorPrices | [[ProductCompetitorPrice!]!](/documentation/Objects/Products#ProductCompetitorPrice) | A list of competition prices for the product |
| alternateNames | [[ProductAlternateName!]!](/documentation/Objects/Products#ProductAlternateName) | The list of alternate names provided by host connections |
| hostDeletions | [[ProductHostDeletion]!](/documentation/Objects/Products#ProductHostDeletion) | List of host connections that have marked the product as deleted |
| deletedAt | [DateTime](/documentation/Types/Date-Time#DateTime) | The time this product was deleted (or null if not deleted) |

## ProductInventoryLogConnection
#### Object  —  [ConnectionType](/documentation/General/Connections) of [InventoryLog](/documentation/Objects/Inventory-Log#InventoryLog)

### Sortable Fields
*Fields from [InventoryLog](/documentation/Objects/Inventory-Log#InventoryLog) that can be used to sort the connection items*

- timestamp

| Arguments | Type | Description |
| --- | --- | --- |
| type | [[InventoryLogChangeTypeEnum]](/documentation/Enums/Inventory-Log-Change-Type-Enum#InventoryLogChangeTypeEnum) | The type of change that occurred to look for |
| users | [[ID]](/documentation/Types/UUID#UUID) | A list of users that made modifications to filter by |
| outlet | [ID](/documentation/Types/UUID#UUID) | An outlet to filter the results by |
| start | [DateTime](/documentation/Types/Date-Time#DateTime) | Get any log that occurred after this parameter (inclusive) |
| end | [DateTime](/documentation/Types/Date-Time#DateTime) | Get any log that occurred before this parameter (inclusive) |

## ProductRevisionConnection
#### Object  —  [ConnectionType](/documentation/General/Connections) of [Revision](/documentation/Objects/Revision#Revision)

### Sortable Fields
*Fields from [Revision](/documentation/Objects/Revision#Revision) that can be used to sort the connection items*

- timestamp