User Guide
A practical guide to the Products section for product information specialists — how the data is organized, where it comes from, and how to use each page to get wines published correctly across our storefronts.
The big picture
A wine flows through Trellis in a few stages. Facts about the physical wine (alcohol, weight) come in from our purchasing system, live on a single shared SKU, then get combined with per-store marketing data and pushed out to each Shopify storefront. Shipping systems stay in sync along the way.
Two layers of data: SKUs vs Product Data
This is the most important concept in the whole section. There are two records behind every wine on a storefront:
- The SKU — one shared record per physical wine, used by every store. It holds the facts that never change between stores.
- The Product — one record per store that sells that wine. It holds the store-specific marketing and pricing. Several products (one per store) all point at the same SKU.
Knowing which record owns a field tells you where to edit it:
| Field | Lives on | Edit it on… |
|---|---|---|
| Wine attributes — bottle size, vintage, weight, alcohol %, wine type, varietal, blend, winemaker, production details | SKU (same everywhere) | the Product Data Job editor (SKU-marked cells), the SKUs page, or Precoro |
| Region hierarchy (country → vineyard) | SKU (a property of the wine) | the Product Data Job editor (SKU-marked cells) |
| Reviews (critic, score, text) | SKU — one shared set, but each review has per-store "show in" toggles | the Review Content cell in the Product Data Job editor |
| Score, display score, product scores | Derived — not stored; computed per store from the reviews shown there | read-only (edit the reviews instead) |
| Title, description, short description | Product (per store) | the Product Data Job editor |
| Cost (of goods) | SKU — the same wherever the wine sells; kept as a cost history | a cost-line modal — the Cost cell in the Product Data Job editor, or the SKUs page's Edit modal (Cost section) or Add form |
| Price, compare-at price, web price | Product (per store) | the Product Data Job editor |
| Shopify status, handle, tags | Product (per store) | the Product Data Job editor |
A wine's facts — alcohol, weight, varietal, region — are the same no matter who sells it, so they live once on the SKU; editing one fixes every store at once. You still edit most of them right in the Product Data Job editor — those cells are marked as SKU fields (a tag icon) so you know the change applies everywhere. Reviews are shared too, but each review carries per-store "show in" toggles, so a store only displays the reviews you picked for it — and the Score / Display Score summaries are computed from just those (never typed in). Cost of goods is the same wherever a wine sells, so it lives on the SKU too (a change updates every store). Cost is kept as a history: each time you set it you add a full cost line (PO price, currency, landed cost, source, notes), and the wine's cost is always the latest line's landed cost — click the Cost cell in the editor, or the SKU's Cost Detail link, to add a line or see the full history. Only the genuinely per-store things — the display title, description, retail price/compare/web price, and Shopify status/handle/tags — live on each store's Product.
Where the data comes from (automatic syncs)
Two outside systems keep parts of the catalog in sync automatically, so you don't hand-enter them:
Precoro → SKU (alcohol, weight, BOL & received dates)
Precoro is our purchasing system. As receipts are processed, Trellis reads each line item's alcohol % and weight, plus the receipt's BOL Date (most recent Bill of Lading) and its received date (the receipt date, recorded with the store it came from), and writes them onto the matching SKU — matched by SKU code (and its parent/original codes). This happens continuously in the background, and can also be triggered for a store from the admin tools. The most recent BOL and received dates are kept (they only advance forward); weight only moves forward to Linnworks (see below).
SKU → Linnworks (name, weight)
Linnworks is our shipping/inventory system. Each SKU can be linked to a Linnworks inventory item; once linked, the SKU's name and weight are pushed there. Linking happens via the “Add To Linnworks” action on the SKUs page or the Bulk Add To Linnworks page. Linking never overwrites an existing Linnworks item — it links to a matching one if it exists, otherwise creates a new one. When Precoro changes a SKU's weight, that new weight is pushed onward to Linnworks too.
When Precoro and Linnworks disagree on a weight, Trellis records the original Linnworks weight before overwriting it and flags the SKU, so a discrepancy can be reviewed later rather than silently lost.
The pages
SKUs /products/skus
The shared baseline catalog. Search and filter SKUs, create new ones (name and vintage are required; bottle size defaults to 750mL when left blank), edit the SKU-owned wine attributes, see every store product linked to a SKU, link a SKU to Linnworks, and start a merge/migration. A SKU is active, disabled, or merged (absorbed into another SKU but kept for history). The list also shows the SKU's BOL Date and Last Received date (with the store) from Precoro.
Product Data /products/data
A searchable, read-oriented index of every per-store product. Search by title or SKU, filter by status (DRAFT / ACTIVE / ARCHIVED), and open a product to see its full edit history. Products linked to Shopify show a quick link out to the Shopify admin page.
Product Data Jobs /products/data-jobs
Where the actual data-entry work happens, organized into jobs. A job targets one store and a set of products; you fill in their data in a spreadsheet-style editor, then publish the finished rows to Shopify. Each job tracks three independent areas so different people can see at a glance what's left:
- Data Complete / Needs Data — wine attributes, region, description.
- Buying Complete / Needs Buying — price, compare-at, cost.
- Warehouse Complete / Needs Warehouse — weight & alcohol on the SKU.
When you create a job you first pick the store, give it a name, optionally assign it to someone and set a due date, then add products either by searching SKUs one at a time or by uploading a CSV. Search matches the SKU code or wine name; tick SKU code only to match just the code and skip the fuzzy name search (it stays on as you keep adding SKUs until you untick it). The Upload button first shows which columns the file may contain: a required SKU column, plus optional Price, Cost, Compare Price, and Web Price columns (all matched case-insensitively; any other column is ignored). When you add each product, price/compare/web price are saved onto the product for that store, and cost onto the shared SKU (so it's the same everywhere the wine sells). A CSV drops you straight into a list with one row per uploaded SKU: each shows the existing product for that store to add, the option to copy a new one from another store's product, or to create a fresh one — and codes not yet in the catalog get an inline Add New SKU. Picked or created products land in the Selected tab; save the job to start entering data.
New products start as DRAFT, so when you upload them to Shopify they arrive unpublished — nothing goes live until you set the product's Status to ACTIVE in the editor. You can change the status at any time.
The editor also helps you work faster: prefill a new product by copying wine data from the same SKU at another store, copy from a similar SKU (the ⧉ button on a row finds another wine — a different vintage, say — and copies its varietal, region, winemaker and the rest, letting you untick anything first; reviews come too when it's the same vintage), auto-populate attributes from the title with AI, and draft a store-styled description. Many cells show a small square in their lower-right corner — drag it down to copy that value into the rows below. Dragging the one on Country is special: it copies the whole region together (Country, Region, Sub Region, Appellation, Sub Appellation and Vineyard), since those levels only make sense as a set. If a SKU you need doesn't exist yet, you can add it inline while picking products. Each row also has two history buttons on the far right — PROD for that product's data history and SKU for the linked SKU's history — each opening a full change log of every field edit with its old and new value, who changed it, and when. Finished jobs can be archived; the list defaults to active jobs with a link to view archived.
Assigning & scheduling jobs. On the jobs list, each job has an Assigned to dropdown and a Due date you can set right there (the due date sits just under the assignee). Use the Assigned to filter at the top to narrow the list to one person — or click Assigned to me for a one-tap view of your own jobs. A dedicated Due column shows each deadline and is sortable (click the header to float the soonest to the top); a job that's past due and not yet finished shows its date in red.
Downloading a job. Every job on the list has a CSV link — it downloads one row per product in the job, with a header row. You get the same columns the editor shows for that store, so it reads like the grid: the SKU code and wine name, whether that SKU is in Linnworks, the three statuses plus the upload status, a direct Shopify admin link for products that have been uploaded, all the product data, and all the SKU data (weight, alcohol, region, varietal and the rest). Reviews come through as readable lines, and the score fields as they're calculated for that store. Handy for checking a job over in a spreadsheet, or sending it to someone who doesn't use Trellis.
Finding which job a wine is in. The jobs list has a Find SKU box that answers "which job has this wine in it?" — it searches the rows inside every job, not the job names. Type a SKU code (1013373) for a direct lookup — a base code also finds its disgorgements, so 1006939 turns up 1006939-003 — or type a wine name (krug grande cuvee) for a fuzzy search that tolerates typos and accents. Matching jobs list the SKUs that matched underneath the job name. Only active jobs are searched; tick Search all jobs to include archived ones. If a wine is in the catalog but no job has it yet, the search says so explicitly rather than just coming up empty — so you can tell "no such SKU" apart from "nobody's worked on it yet".
Inbound /products/inbound
A shared, spreadsheet-style queue of wine that's been ordered and is on its way to the warehouse — visibility for both the buying team and the warehouse team. Each row belongs to one store and one SKU, and carries a transit status: Ordered → In Transit → Arrived, plus an optional PO status (On Water / Needs Pro Forma). Filter the sheet by store, transit status, rows that still need a photo, and the Needs LW Link flag.
The last row is always blank: search a SKU by code or name right in the row, then pick its store to add it. Every cell edits in place and saves as you go — order details (source, PO#, ordered qty, cost, price, currency, reorder), receiving details (delivered, date, received qty, exceptions, location) and free-form multi-line Notes. The SKU code, label name and unit come from the linked SKU record. The Product Data column shows a badge per store that already has product data for that SKU, each with that store's most recent upload date (or new if none do yet). Two admin flags round it out: Photo Taken (Last Bottle only) and Needs LW Link — whether the SKU's Linnworks record still needs linking to Shopify — both filterable from the toolbar. Drag the ⋮ handle to reorder rows like a playlist.
You can also bulk-seed the queue with Import CSV: a dialog lets you pick which store to import for and shows the columns the file may contain (a required Universal SKU, plus optional Price, Currency, PO, quantities, delivery state and more). It creates one inbound row per line under the chosen store, matching each Universal SKU to the catalog (a delivered box marks the row Arrived). It's re-runnable. Rows whose SKU isn't in the catalog aren't dropped — they land in an Unmatched SKUs section at the bottom of the page, where Add SKU creates the SKU (prefilled from the row) and turns it into a real inbound row.
Tick the checkbox on any rows and a bar appears to run a group action. Today that's Create Product Data Job: it turns the selected SKUs into a new data job so their per-store product data can be filled in. A job targets one store, so the selected rows must all be for the same store; you're asked for a job name and assignee, and a link to the new job appears when it's created.
Bulk SKU Matching /products/skus/match
Upload a CSV of raw wine names and let Trellis match each to an existing SKU using fuzzy search. Review the suggestions, accept a match, pick a different SKU, or create a new one — and optionally prefill the new product from another store's product. Each confirmed row becomes a product ready to drop into a data job.
Merge SKUs /products/skus/merge
Consolidate duplicate SKUs. Search for the duplicates, choose one as the parent, and merge the rest into it. The children become merged (kept for history, hidden from new use) and point at the parent. Use this when the same physical wine was entered more than once.
SKU Migrations /products/skus/migrations
Move a store's products from an old SKU onto the correct SKU, and merge the old one underneath it. Pick the legacy SKU and the products to move, name the destination SKU (existing or auto-created from the legacy's attributes), and the job relinks each product and tracks its push to Shopify (with retry on failure). Use this when products were linked to the wrong SKU code.
Bulk Add To Linnworks /products/bulk-add-linnworks
Link many SKUs to Linnworks at once. Upload a single-column CSV of SKU codes (up to 100); the job runs in the background and shows live progress. Drill into results to see each row's outcome: Linked existing, Created new, Not in catalog, or Failed (with retry).
A typical workflow
Bringing a new wine to a storefront usually looks like this:
- Make sure the SKU exists. Search the SKUs page; if it's not there, create it (or it gets created during Bulk SKU Matching). Alcohol & weight will fill in from Precoro as receipts process.
- Create a Product Data Job for the store, and add the products (search & pick, Bulk SKU Matching, or quick-add a SKU inline).
- Fill in the data in the job editor — wine attributes & region (Data), pricing (Buying); weight/alcohol (Warehouse) comes from the SKU. Use prefill / AI helpers to speed it up.
- Publish to Shopify once Data & Buying are complete. The SKU's shared attributes are overlaid automatically at publish time.
- Link to Linnworks (per-SKU button or the bulk page) so shipping has the right name & weight.
Status cheat sheet
| Where | Status | Means |
|---|---|---|
| SKU | active · disabled · merged | In use · hidden from new products · absorbed into a parent SKU |
| Product | DRAFT · ACTIVE · ARCHIVED | Its publish state on Shopify |
| Data Job section | Needs … / … Complete | Data / Buying / Warehouse area is unfinished vs. done for every row |
| Bulk Linnworks row | Linked · Created · Not in catalog · Failed | How that SKU resolved against Linnworks |
Questions or something out of date? Let the engineering team know — this guide is kept in step with the app as features change.