Skip to main content

Products and Inventory

Use Catalog & Inventory to maintain the products a store sells and the stock behind them. Every page uses the store selected in the portal unless the page explicitly says it is organization-wide.

Choose the right page​

PageUse it forPage access
ProductsProduct names, barcodes, SKUs, prices, costs, categories, age restrictions, EBT eligibility, status, and preferred suppliersProduct read access for the selected store
InventoryOn-hand quantities, par and reorder thresholds, receiving, adjustments, history, and location stockInventory read access
TransfersStock movements between storesTransfer read access
Serialized InventoryIndividual serial numbers and their sale or return statusSerial read access
Purchase OrdersSupplier drafts, ordered quantities, and shipment receivingPurchase-order read access
PromotionsScheduled campaign mechanics and product or store scopeOrganization promotion read access
BundlesSellable kits or multi-packs and the component stock they consumeProduct read access
Bottle DepositsProduct deposit rules, collected and returned amounts, and the ledgerProduct read access

For stock counts, transfers, and serial numbers, continue with Inventory, Transfers, and Serialized Stock. For supplier orders and catalog offers, continue with Purchasing, Promotions, Bundles, and Bottle Deposits.

Manage Products​

Open Catalog & Inventory > Products. The list belongs to the selected store and can be searched by product name or barcode. Select a row to open Product Details.

Product read access lets you review and Export the catalog. Additional access controls the editing tools:

  • Product write access enables Add Product, Import, Edit, inline bulk price changes, bulk EBT changes, and bulk age restrictions.
  • Product administrator access enables Delete.
  • Organization category read access makes the Category selector available.
  • Product write plus organization supplier read access enables Adjust Vendor Costs & Prices.
  • Organization product write access enables product-image management while editing a product.

Add a product​

  1. Select the correct store, then open Products.
  2. Select Add Product.
  3. Enter Name and Barcode. Select Look Up if you want to check the UPC lookup source; select Apply on a useful suggestion.
  4. Optionally enter SKU, Description, and choose Default supplier for reorders. The catalog SKU is your product identifier, separate from its UPC/barcode and from a supplier's SKU. That supplier link is used for low-stock reorder suggestions and supplier purchase-order drafts.
  5. Enter Price, Cost, and Product Type.
  6. If your role can read organization categories, choose Category. The server resolves tax from category policy. Setting or changing an always-tax-exempt override also requires store tax write access; product write access alone does not authorize a tax exemption.
  7. Set the product's active status, age restrictions, and EBT Eligible setting as needed. New products default to Inherit Category Default. This setting follows the category's age policy, including later category changes; No Restriction, 18+, and 21+ are explicit product overrides.
  8. Select Create.

The server validates that price and cost are nonnegative before changing the catalog or its payment product. A zero-priced product is permitted. On the Android register, the tax-rate field is a read-only display of the server's effective store/category policy; it is not a required save input.

Register catalog sync returns each product's sale availability and any unavailable reason. Tiles, scans, add-item actions, and upsell suggestions use that server result rather than reconstructing eligibility from cached product fields. After a catalog-cache upgrade, refresh is required before products without an availability result can be added. Catalog card-price labels also come from the server; they are display values, not basket quotes. The checkout quote still revalidates current products, tax, discounts, deposits, and final tender amounts.

The store must have a connected Gateway location before its product catalog can load. If the portal shows Gateway location not connected, contact your Peak support team to finish the store connection.

The server validates amounts before changing the catalog or Gateway product. Selling prices must be exact minor units of the selected store's currency: for example, USD has two decimal places, JPY has none, and KWD has three. Costs and supported deposit amounts may retain four decimal places, but amounts that would overflow or require database rounding are rejected. Zero price or cost is not rejected merely because it is zero; sale availability and checkout policy remain server-owned.

The Retail portal blocks negative price/cost and checks selling-price precision against the selected store's currency before product creation, editing, or opening-stock submission. Costs are not restricted to cents. If the client lacks store-currency metadata, it leaves currency validation to the server instead of assuming USD; server validation remains authoritative for every write.

Create a product with opening stock​

The Inventory page's Create product and receive action submits one server operation for the product and its opening stock. The server records the operation identity before creating the product, then completes the stock receipt against that same product. Peak Mobile uses the same operation when an opening quantity is supplied while adding a product.

If delivery is interrupted, resume the original request instead of creating another product or entering the opening stock as a second adjustment. The original request identity is retained for recovery, including after reopening the client. A pending response means the server has not yet confirmed both effects; it is not evidence that the product or stock receipt failed. Other products and inventory operations remain available while that request is pending.

Opening-stock admission reserves the product's barcode and operation identity together, so competing creates cannot leave a second pending opening for the same barcode. Recovery retains the original authenticated operator subject as well as the merchant user identity in its stock audit.

In the Retail portal, a definitive input-validation rejection (HTTP 400 or 422) on a fresh first delivery happens before the server admits the operation. The form retains your details for correction and retires that rejected browser request, so submitting corrected details uses a new identity rather than offering an endless resume. Retryable validation responses, permission or in-progress conflicts, and any validation error after an earlier unknown delivery retain the original recovery request; they do not prove an admitted operation failed.

If the server confirms Product opening was not applied, it has retained a terminal failed receipt and released only that operation's barcode reservation. Correct the details and submit a new attempt. Resuming the old attempt returns its original failure, not a new create. A later input or permission error after an unknown delivery does not establish this terminal outcome: keep the original request identity and resume it. Scheduled recovery skips terminal failed receipts; it continues to recover unresolved product and stock effects.

Ordinary stock receipts, manual adjustments, lot receipts, transfer creation and receiving, and inventory count creation, entries, recounts, and closing retain an immutable retry receipt. Its identity includes both the merchant user and the verified authenticated operator. Retry the original request with the same operator and attempt key; a different support operator acting for the same merchant cannot reuse that key to change stock or retrieve the original response.

The Retail portal keeps the original server confirmation with its immutable request key until the matching live form accepts the receipt or you review the Confirmed server receipt and select Acknowledge receipt. Closing a dialog, changing its draft, or switching stores during delivery does not discard a late confirmation. Resuming a confirmed request returns that saved server response without sending another stock mutation; it never recalculates stock effects in the browser. Acknowledging an older receipt removes only its recovery record and does not clear a different current draft.

Overlapping delivery calls for the same operator, scope, immutable request, and attempt key share one in-flight request and its result. Acknowledging that result from one view does not turn another waiting view's successful result into a journal-cleanup failure. An explicitly selected new key remains a separate operation, even with identical details; missing browser storage without acknowledgment proof is still reported as a persistence failure.

For a deliberately separate identical stock change, select Start new attempt and confirm the duplicate-risk warning. Changed details and unrelated requests remain available; matching quantities alone are not treated as duplicates. If browser-journal persistence or acknowledgment fails after confirmation, the portal reports a confirmed receipt and retains its original recovery key rather than describing acceptance as unknown.

On Android, inventory mutations and recovery retain the original employee invocation through authentication waits and authentication retries. Changing employees stops the original dispatch or retry without clearing its encrypted pending body and key. The original employee can resume after returning; unrelated explicit inventory intent remains available.

Historical ordinary stock receipts created before authenticated operator identity was retained are an explicit exception: Peak returns their original committed response without changing stock or assigning the receipt to the current operator. These responses carry X-Inventory-Receipt-Provenance: legacy-operator-unknown. Their historical operator remains unknown; no new operator-owned retry receipt is created.

Update products​

  • Select Edit to change one product, then select Save.
  • Select product rows to edit cash prices inline. Select Save bulk price changes after all selected prices are valid.
  • With selected rows, use Mark EBT Eligible or Mark Not EBT Eligible.
  • Use Set age restriction for selected products to apply Inherit category default, No age restriction, 18+, or 21+ to selected rows. Set age restriction for all store products applies to the entire selected store, including inactive products and products on other pages; confirm the store and scope before applying. Other product fields are unchanged.
  • Use Import for a prepared bulk catalog file.
  • Use Delete only when a product should be removed from the selected store. This action requires product administrator access.

Support can make the same changes through an authorized, store-scoped merchant impersonation session. To reset a merchant's catalog to category defaults, launch Retail for that merchant and store with product write access, open Products, choose Set age restriction for all store products, select Inherit category default, then Confirm all store products. Repeat for each intended store; this does not update other stores automatically.

Clearing SKU in the editor removes the catalog SKU; leaving SKU out of an API update preserves its existing value. A deleted product's UPC can be used again by a newly imported product. Hiding a product from POS is not deletion and does not release its UPC.

Adjust vendor costs and prices​

Choose Adjust Vendor Costs & Prices, select the preferred vendor and an increase or decrease by percentage or fixed dollar amount, then select Review changes. The server calculates each new vendor cost and its margin-preserving cash retail price, rounded to two decimal places, and returns the margins shown in the review.

Select or exclude products before applying, in batches of up to 500. Row costs and prices are read-only; use Change adjustment to calculate a different adjustment. Products with missing or nonpositive vendor cost, retail no greater than cost, or invalid calculated results cannot be applied. Applying synchronizes the product cost with its preferred-vendor cost; dual-pricing card prices continue to follow the store's card price adjustment.

Confirmation sends only the selected product references and their preview versions, not editable costs or prices. The server recalculates and verifies the selected rows before writing. If the selected vendor, adjustment criteria, costs, or cash retail prices have changed since review, refresh and review again; a stale or invalid selection is rejected without applying that batch.

Export products​

Select Export to download a CSV of all active products in the selected store. The export is not limited to the current page, search results, or selected rows. It uses the create-only import column names, including separate upc and sku columns and category_ref category identifiers. Qty contains current on-hand inventory, not historical opening quantities.

An export is a catalog snapshot, not a price-update file or an inventory report. Review the file before importing into another store: category and supplier references must belong to that store's organization, and Qty becomes opening inventory during a create-only import. Importing into the original store does not replace existing products; active UPC conflicts still require review.

Exported CSV files include catalog_csv_encoding=apostrophe-v1 to preserve spreadsheet-safe text. UPCs and SKUs are exported as text so spreadsheet editors do not remove leading zeros or convert scientific-looking identifiers. Keep that column when importing an export: Peak removes the export's escape apostrophe before validating and saving values, including SKUs and UPCs. Literal leading apostrophes are escaped separately and preserved. Ordinary template files without this marker keep their input text unchanged.

Import opening inventory​

The Products import template includes an optional Qty column. In create-only mode, a non-blank Qty value creates the selected store's inventory record with that signed whole-number opening on-hand quantity. Positive quantities record a receive in inventory history; negative quantities preserve an existing stock deficit as an adjustment, and zero creates the empty inventory level without a movement. Leaving Qty blank preserves the product-only import behavior; use the Inventory page to add stock later.

Qty must be between −2,147,483,647 and 2,147,483,647 so both the balance and its movement magnitude fit the supported inventory/reporting range. Out-of-range values are rejected before creating products or stock.

The import preview displays Qty alongside the catalog fields so you can confirm the opening quantity before saving.

The CSV and XLSX create-only templates also include optional SKU. SKU is stored and shown independently from the required UPC, and does not need to be unique. Use the Peak template's columns when transferring a vendor export; an arbitrary vendor file is not automatically mapped. Price-update mode remains UPC and selling price only.

Leaving category_ref blank uses the organization's General Merchandise category, matching product creation. Explicit category names and slugs retain the existing category-creation behavior; category identifiers must belong to the selected store's organization.

Catalog CSV and XLSX files support up to 250,000 rows and 30 MiB per upload. Preview checks the full file, then displays the first 1,000 rows and up to 1,000 error and warning details with full-file counts. Confirmation processes the full file, not just the preview sample.

The file uploads once during preview; confirmation sends small, signed batches of up to 50 rows. Keep the dialog open until it finishes. If interrupted, resume the pending batch or preview the original, unchanged file again; rows already imported are not created again and their opening inventory is not added twice. Preview batches expire after 24 hours, after which the unchanged file must be previewed again. Files with unusually large cell contents may need to be split even within the row and upload limits.

After a catalog import format update, an older preview may require you to preview the original file again. Fresh previews preserve separate SKUs and the chosen product identity for each row, so retrying a confirmed batch does not create another product or reapply opening stock. If a previously imported product was deliberately deleted, preview again before importing that row as a new product.

Tax-exempt create-only imports require tax-write authorization during preview. Only the same authenticated approving user may confirm or resume that signed preview, including support users acting for a merchant. Another user must preview the file with their own authority. Older tax-exempt previews without the approving identity must be previewed again; same-user retries retain the original product and opening-stock identities without requiring a new tax approval.

Set up organization Categories​

Categories is under the organization section, not the store catalog. The taxonomy is shared by every store in the organization. Category read access opens the page; changing categories requires both organization administrator and category write access.

Create the category structure before assigning products. A product's category path supplies its effective category policy, including tax treatment. Keep the structure consistent across stores so catalog searches and reports group products predictably.

New categories inherit age settings from their parent unless you choose an explicit no-restriction, 18+, or 21+ override. Renaming or moving a category preserves its existing per-age inheritance choices unless you deliberately change the age setting. Products using Inherit category default follow that category ancestry; an explicit no-restriction override does not bypass merchant or jurisdiction compliance policies.

Continue with stock and purchasing​

After creating products:

  1. Open Inventory to set par and reorder thresholds and receive starting stock. Open a product's inventory detail to browse Inventory History. The total entry count comes from the server; Previous history page and Next history page reach older events in pages of 20 without hiding rows after the first ten. Switching products or stores starts from the first page. If a page cannot load, the last successfully displayed page remains visible with an explicit error.
  2. Assign a Default supplier for reorders to products that should create supplier-specific low-stock drafts.
  3. Use Transfers for store-to-store movement instead of adjusting both stores manually.
  4. Use Serialized Inventory only for products configured to require serial tracking.
  5. Use Bundles when one sellable item must consume several component products.
  6. Add Bottle Deposits only to products that should collect a container deposit at checkout.