Welcome back
Live overview of your UK operation. Click a card to drill in.
Orders
Synced from Shopify, Amazon, and eBay. Profitability is computed locally from your supplier costs + fees + VAT + postage cost (where set).
Courier Issues
Late, lost, and damaged parcels — auto-detected from Evri tracking, or flagged manually from an order's Fulfilment tab. Resolve an issue here or from the order itself.
Import / Export
All bulk CSV ingest and export tools in one place. Each card describes its expected CSV layout before you pick a file.
Imports
-FBA suffix on the Listing SKU marks the row as FBA.order_id, tracking_number. Optional: carrier.205-1234567-1234567, H12345678901234567, Evri — carrier auto-detected from tracking format if omitted.SKU, Product Packaging, Made From SKU, % Used, Label, Labour (mins). Matches by SKU; "Made From SKU" is resolved to a product ID automatically.Bulk delete
Exports
Courier Integration
Generate and test shipping labels and manage API credentials.
Label Generator
Delivery Address
Parcel Details
API Credentials
Live status of courier API credentials stored in /home/chubby/app/.env on the server.
| Name | SKU | Supplier | Cost | Total shipped cost | Weight | Ship method | Website price | Margin | eBay price | Margin | Amazon MF price | Margin | Amazon FBA price | Margin | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Feldy Golden Food Balls for Wild… | FELDGB6 | Feldy Fare | $1.56 | $5.66 | 600g | Royal Mail Tracked 48 | $2.99 | 8.1% | $7.99 | -0.7% | $7.99 | -7.4% | $8.99 | -35.5% | |
| Feldy Golden Food Balls for Wild… | FELDYGB40 | Feldy Fare | $7.35 | $12.04 | 5000g | Amazon Shipping | $13.99 | 32.4% | $19.99 | 12.0% | $19.99 | 8.0% | $20.99 | -21.9% | |
| Feldy Premium Fat Balls for Wild… | FELDPBALLS40 | Feldy Fare | $6.72 | $11.29 | 5000g | Amazon Shipping | $12.99 | 32.9% | $19.99 | 16.5% | $19.99 | 12.5% | $20.99 | -17.5% | |
| Feldy 25 High Protein Chicken Gr…Z | FELD25BALL | Feldy Fare | $8.50 | $12.12 | 5000g | Amazon Shipping | $12.99 | 32.0% | $18.99 | 23.1% | $18.99 | 16.7% | $18.99 | -14.1% | |
| Feldy Chicken Pecker Treat Balls…Z | FELDCPGAR | Feldy Fare | $2.52 | $6.35 | 600g | Royal Mail Tracked 48 | $4.99 | 29.0% | $8.99 | 16.3% | $8.99 | 8.2% | — | N/A | |
| Feldy Chicken Pecker Balls - 6 P…Z | FELDBALLS6 | Feldy Fare | $2.20 | $6.03 | 600g | Royal Mail Tracked 48 | $4.49 | 28.7% | $7.75 | 9.1% | $7.75 | 0.5% | $7.99 | -32.8% | |
| Feldy Hanging Chicken Pecker Blo…Z | FELDY125 | Feldy Fare | $4.50 | $8.34 | 1250g | Royal Mail Tracked 48 | $6.99 | 23.6% | $9.99 | 3.4% | $9.99 | -4.4% | $10.99 | -24.0% | |
| Feldy Chicken Pecker Treat Balls…Z | FELDCPSEA | Feldy Fare | $2.40 | $6.23 | 600g | Royal Mail Tracked 48 | $4.99 | 30.3% | $8.99 | 17.6% | $8.99 | 9.5% | — | N/A | |
| Feldy Hanging Chicken Pecker Blo…Z | FELD125-SEA | Feldy Fare | $4.50 | $8.33 | 1250g | Royal Mail Tracked 48 | $6.75 | 22.0% | $10.99 | 11.1% | $10.99 | 3.6% | $11.49 | -19.3% | |
| Feldy Chicken Pecker Treat Balls…Z | FELDCPBERR | Feldy Fare | $2.40 | $6.23 | 600g | Royal Mail Tracked 48 | $4.99 | 30.3% | $8.99 | 17.6% | $8.99 | 9.5% | — | N/A | |
| Feldy Hanging Chicken Pecker Blo…Z | FELD125-GAR | Feldy Fare | $4.50 | $8.33 | 1250g | Royal Mail Tracked 48 | $6.75 | 22.0% | $10.99 | 11.1% | $10.99 | 3.6% | $11.49 | -19.3% | |
| Feldy Game Keeper Hanging Holdin…Z | FELDYGAME6 | Feldy Fare | $11.30 | $14.87 | 6000g | Amazon Shipping | $17.99 | 34.5% | $22.99 | 22.2% | $22.99 | 16.1% | $26.99 | 1.2% | |
| Feldy Hanging Chicken Pecker Blo…Z | FELDY3500 | Feldy Fare | $7.50 | $11.07 | 6000g | Amazon Shipping | $11.99 | 34.2% | $18.99 | 28.6% | $18.99 | 22.2% | $18.99 | -12.9% | |
| Feldy 25 Premium Fat Balls For B… | FELDPBALLS25 | Feldy Fare | $4.58 | $9.12 | 5000g | Amazon Shipping | $8.99 | 29.1% | $14.99 | 11.3% | $14.99 | 6.7% | $15.99 | -32.4% | |
| Feldy Golden Chicken Pecker Ball…Z | FELDBALLS40 | Feldy Fare | $10.70 | $13.92 | 5000g | Amazon Shipping | $15.99 | 32.9% | $19.99 | 17.2% | $19.99 | 10.9% | — | N/A | |
| Feldy Golden Food Balls for Wild…Z | FELDBALLS150 | Feldy Fare | $28.15 | $31.37 | 13000g | Amazon Shipping | $38.99 | 27.6% | $41.99 | 12.2% | $41.99 | 6.7% | $43.99 | -9.2% | |
| Feldy Premium Fat Balls for Wild…Z | FELDPBALLS150 | Feldy Fare | $21.00 | $24.22 | 13000g | Amazon Shipping | $28.99 | 27.7% | $32.99 | 13.5% | $32.99 | 7.8% | $34.99 | -12.3% | |
| Feldy Hanging Chicken Pecker Blo…Z | FELDPECK6 | Feldy Fare | $11.30 | $14.52 | 6000g | Amazon Shipping | $16.99 | 33.2% | $22.99 | 23.7% | $22.99 | 17.6% | $23.99 | -7.5% | |
| Feldy Chicken Treat Seed Block 1…Z | FELDCT1 | Feldy Fare | $5.25 | $9.09 | 1000g | Royal Mail Tracked 48 | $7.99 | 23.6% | $11.99 | 11.1% | $11.99 | 3.8% | $12.49 | -17.2% | |
| Feldy Chicken Grazer Block 1.25K…Z | FELDGB-125 | Feldy Fare | $4.30 | $8.14 | 1250g | Royal Mail Tracked 48 | $6.75 | 23.7% | $10.99 | 12.9% | $10.99 | 5.3% | $11.49 | -17.6% | |
| Feldy Afternoon Delight Fruit Tr…Z | FELD-ADFRUIT | Feldy Fare | $7.80 | $11.23 | 2200g | Amazon Shipping | $12.99 | 36.9% | $16.99 | 20.8% | $16.99 | 14.2% | — | N/A | |
| Feldy Afternoon Delight Veggie T…Z | FELD-ADVEG | Feldy Fare | $7.50 | $10.93 | 2200g | Amazon Shipping | $12.99 | 38.6% | $16.99 | 22.5% | $16.99 | 16.0% | — | N/A |
Type in a product or load one from the Products tab, then play with the selling price, quantity and discounts to see how profit and margin respond.
Product details
Set fee structures for each sales channel. All margin calculations across the app update instantly when you change these.
Amazon
Each product picks its Amazon category in the Edit modal (Pet Supplies by default). FBA fulfilment fees are still auto-calculated per product weight — see the FBA fee schedule below.
eBay
Chubby AUS (Website)
AUS Wholesale
Confirm these fee assumptions once real wholesale orders are flowing — currently mirrors the Chubby AUS website's payment processing rate as a starting point.
Amazon FBA fee schedule
Drop a supplier PDF invoice. Each line item is matched to a product (by supplier SKU, your SKU, or fuzzy name match). Cost differences are flagged so you can mark them permanent (updates the cost; click through to update selling price) or temporary (saved as a sale cost with optional sale website price; profit numbers re-run automatically).
Each courier has its own rules and surcharges. Edit any value, then click Save rates — every product's profit/margin updates instantly.
Postcode zones & rate cards
Override the default carrier rate for specific postcode areas (Highlands, Islands, Northern Ireland, Channel Islands, etc.). The orders tab uses this to compute accurate per-order postage; the Shopify checkout endpoint (coming in Phase 2) will use the same data so checkout quotes match what we actually pay.
Zones
Each zone is a named group of postcode prefixes, scoped to a specific carrier (or carrier-agnostic for the catch-all default). Prefixes accept single codes (BT, IV1) or numeric ranges (IV1-39, AB31-AB38). The same postcode can belong to different zones for different carriers — e.g. PO30 is "Isle of Wight" for DPD but bundled into "Isle of Man" for EVRI. A postcode that matches no zone for the chosen carrier falls into the default zone.
Rate overrides per zone
Each row: for a given zone + carrier + weight band, what does it actually cost us? Surcharge adds to the carrier's base computed rate (e.g. EVRI's +$2.20 to Highlands). Flat replaces the base rate entirely (e.g. DPD's $10.23 to Highlands).
Free shipping thresholds (per zone)
For each zone, the order-value threshold above which the customer pays nothing for shipping. Leave blank or 0 if no free-shipping offer applies in that zone. Note: this is the customer-facing price, not what we pay the carrier — we still pay our cost.
Delivery method mappings
Zero-cost (or fixed-cost) delivery types — Local Delivery, Collection, Click & Collect, etc. Each row maps a friendly label to one or more Shopify shipping codes / keywords (comma-separated) and a cost. Orders whose shippingLine title or code contain any of the listed keywords resolve automatically. You can also set a delivery type manually per order from the Order Actions bar.
Per-unit cost lists for the packaging types you can pick on each product. Product packaging is what holds the product (tubs, bags). Shipping packaging is what wraps it for despatch (mailers, boxes). Edit any value and click Save packaging.
Master lists used by the product Edit modal's dropdowns. Click any section header to collapse / expand — the state persists between visits.
Renaming an entry updates every product that uses it and remembers the old name as an alias for future Storefeeder imports.
Master list of Harmonised (HS) codes. The product Edit modal shows these as a dropdown labelled code — description; only the code is saved on each product.
The product Edit modal lets you tag each product into any of these. Click ↻ Ask Claude to refresh to paste a prompt into Cowork chat — Claude will pull the latest list from Shopify via MCP. (Direct Admin-API sync is on the roadmap once OAuth install is wired up.)
Smart (rule-based) collections are hidden — Shopify auto-populates them from rules, so manual product assignment is rejected. Only custom collections appear here.
The chip-picker in each product's Website panel uses this list — keeps tag spellings consistent and stops accidental duplicates. One-time setup: click ⇄ Connect to Shopify, approve the install on Shopify (you'll see the scopes being requested), then come back here and click ↻ Refresh from Shopify. After that, push-back happens per-product via the ↑ Push to Shopify button on the product's Website panel — no chat-paste involved.
External services the app talks to.
cloudinary_cloud_name / cloudinary_api_key / cloudinary_api_secret in config.json. Free tier covers ~25 GB storage + 25 GB monthly bandwidth.Every Shopify store this app talks to — the original UK retail store plus any others (e.g. wholesale). Orders from every connected store flow into one Orders tab, tagged by which store they came from. The same Partner app is reused across stores — just click Connect separately for each.
Template used by the Generate with Claude button on the product Edit modal. Use {PRODUCT_CONTEXT} as the placeholder for the live product fields. Saves on blur.
The HTML wrapper Storefeeder uses when generating eBay listings. Storefeeder substitutes the tokens server-side (so leave them as {{title}} etc. — don't try to fill them in here). This copy is here so the Optimise for eBay button can read the surrounding visual style and generate descriptions that fit. Saves on blur.
Supported tokens (from Storefeeder): {{title}}, {{subtitle}}, {{description}}, {{productdescription}}, {{sku}}, {{rrp}}, {{price}}, {{amountsaved}}, {{percentagesaved}}, {{ean}}, {{upc}}, {{weight}}, {{brand}}, {{imageurl0}}, {{imageurl1}}, …
Text overlays applied to your eBay product images via Cloudinary URL transformations — no uploads, no extra cost. Active badges auto-apply to every eBay image. Toggle the Active checkbox to turn a badge on/off without deleting it.
The editable pill lists behind the Courier Issues page — Issue type, Issue status, and Claim status. (Stop & Return is a fixed 4-state field, not editable here.)
What kind of courier problem this is — shown as a coloured pill on the order's Fulfilment tab and on the Courier Issues grid. Starts with Late, Lost, Damaged — add more any time.
Where an issue is up to in being worked — e.g. Customer contacted, Courier contacted, Resent, Claim made. Also shown as a coloured pill.
Where an actual claim (with the courier or insurance) is up to — starts with In Progress, Paid. Also shown as a coloured pill.
When you click Export changes, the CSV uses these column names. Match them to whatever Storefeeder's import expects. Leave a row blank to skip that field on export.
Ask anything about the business — product data, orders, courier issues, marketing ideas, website/menu structure. Claude can pull live data to answer, and can propose product edits (single or bulk) for you to review and apply below — it never saves anything on its own. Results include everything (variations, archived, discontinued) unless you ask to narrow it down. Examples: "products missing a weight", "how many orders did we ship last week", "put all Fallen Fruits products on a 10% sale", "suggest a new collection structure for the website".
Pick exactly the columns you want and export to CSV. Save a column set as a template to re-run it later. Templates are stored on the server so they survive across devices.
h.webMargin(p) h.margin(p,'ebay') h.ebayMultibuyBeatsSingle(p)
People who can sign in to the app. Everyone has full access. Deactivating a user kicks them out immediately (sessions dropped) and stops them logging back in until reactivated. To rotate a password, click Reset password.
DEPLOYMENT_RUNBOOK.md "Email setup".