in the last hour.
Net sales today
Ad spend
ROAS
Orders
AOV
CM3 net profit
AI spend yday
As of
resolved
expected
For you
·
·
recovers automatically · nothing to do
Last run: in · finished · current run died without finishing
No activity recorded yet.
P&L
· updated
Snapshot is stale — these numbers may not reflect the last hour.
Net sales
Orders
AOV
Ad spend
Google · Meta
ROAS
COGS est 30%
CM3 net profit
Sessions store · all channels
Conv. rate store sessions
Checkout completion Shopify
Checkouts started
Abandoned
Ad clicks
Orders / click paid only
Last days
/day avg · vs prior d
Ad spend
ROAS
CM3 net profit
Orders
AOV
Meta ad spend is not included — ROAS and CM3 above are against Google spend only, so they read better than reality.
Meta spend is counted for but NOT for — those brands' ROAS and CM3 are against Google spend only and read better than reality.
Meta spend
net sales
ad spend
ROAS
CM3
orders
Sessions and Conv. rate are Shopify's own site-wide numbers (ShopifyQL, all channels) and match the Shopify dashboard. Ad clicks / Orders per click below are paid-only — ad efficiency, not store performance. Estimates: COGS 30% of net sales, payment fees 5%. CM3 = net sales − COGS − fees − ad spend; shipping and fulfilment not deducted.
| Brand | Net sales | Ad spend | ROAS | COGS | CM3 | Orders | AOV | Sessions | Conv. |
|---|---|---|---|---|---|---|---|---|---|
Inventory deposits
Deposits paid to the supplier per warehouse batch — every unit sold makes its per-unit deposit refundable. Outstanding = accrued by sales − already refunded. · report — STALE (daily 06:40 UTC cron may have failed)
Mapping problems — these rows may be wrong
Deposits paid
Outstanding claim
Still locked in stock
Left to sell
until purchase inventory is sold through
Sold last 30d
Est. sell-out
at the 30d pace
No deposits recorded yet. Add them via
python3 execution/inventory_tracker.py --add-deposit SKU=UNITS@PER_UNIT_USD
(e.g. --add-deposit DBAD2-WK370001=185@12.50), refunds received via
--add-refund SKU=AMOUNT — or paste the amounts into the chat and I'll record them.
| ERP SKU | Product | Deposited | Sold | Left to sell | Sold 30d | Sell-out ≈ | Outstanding | Locked |
|---|---|---|---|---|---|---|---|---|
| unmapped units unknown sold through |
| ERP SKU | Product | Brands | Snapshot | Sold since | Remaining | /day | Cover |
|---|---|---|---|---|---|---|---|
| ⛔ oversold 🕓 stale |
Refund accrual counts units sold since each SKU's first deposit date, FIFO across batches,
capped at the deposited units. Stock is snapshot-based — a restock or new deposit batch is
invisible until recorded (--add SKU=QTY /
--add-deposit SKU=UNITS@PER_UNIT).
Bestsellers
What is actually selling, per brand. Read-only — nothing here changes anything. · sources — STALE
sales (UTC, rolling) · ads (account timezone, includes today)
| # | Product | 30d net | Units | 6d | Ad cost | ROAS | Gross margin | After ads |
|---|---|---|---|---|---|---|---|---|
Excluded non-merchandise item(s) worth — service SKUs like Shipping Insurance, kept out of the ranking and every denominator.
A dedicated asset group would give this product its own creative surface inside its existing campaign. It cannot change that campaign's budget, bid strategy or target ROAS — those are campaign-level and this feature cannot touch them. It does change how the campaign splits the budget it already has.
No product has met the bar this cycle.
The bar: top-20 by 30-day net sales · at least 1.5% of brand net · at least 60 ad-attributed conversions · ROAS at least 1.5× the brand blend · sustained rather than a spike · at least 10 distinct visual sessions · 45 days of stock · in season · not already covered. Every gate is evaluated; an un-judgeable one is reported as such and never counted as a pass.
An asterisk on ad cost means the spend comes from a campaign that serves more than this country — Germany's ads run in DAT, which also covers Austria — so it is that campaign's cost, not purely 's. The bar below stays brand-wide: its thresholds are calibrated on brand volume, and re-using them per country would manufacture candidates out of smaller numbers.
This is not /collections/bestseller. That page ranks by units, is capped, excludes 25 woven-bag handles and is deliberately shuffled to hide sales rank from competitors. This one ranks by 30-day net sales and hides nothing.
API costs
Anthropic + OpenAI spend. Provider invoices where connected; our own per-call ledger for which workflow spent it. · snapshot — STALE
Yesterday
Last 7 days
Last 30 days
Today so far
last 30 days
Workflow and model attribution come from our own per-call ledger
(/var/log/ai_costs.jsonl), so they cover only calls our
scripts make — a provider invoice may be higher. Connect the admin keys above to see billed dollars.
Product Quality
Factory-defect complaints per product, flag at ≥3 complaints and ≥1.5% of 180d units (min 20 units), or ≥6 complaints
Flagged now
Complaints 7d
| Product | Brand | Complaints | Units 180d | Rate | Defects | State | |
|---|---|---|---|---|---|---|---|
|
· ticket
Supplier message — copy & forward (WhatsApp/Discord) |
|||||||
| No products above watching. The nightly scan keeps this current. | |||||||
Support
Georgie → Gorgias · · up since
Tickets 24h
distinct tickets touched
Escalated
needed a human
Failure rate 1h
abandoned 24h
AI cost today
avg s / ticket
AI cost · last 14 days
Tickets by brand · 7 days
Actions · 24 hours
Top intents · 7 days
Awaiting reply
Replied
Hidden
Total handled
Today
By platform
By brand
Sentiment
Latest
· · ·
Supplier pricing
Last ask No negotiations logged yet
Follow-up to send
Asks the supplier has gone quiet on. The message sets a deadline on purpose — “any update?” invites another silence.
Waiting on the supplier
Next to optimise
Computed from supplier cost × . Catalog median markup ×. Products already asked about are excluded.
Message to the supplier
Cost-lever products only, quoted by ERP SKU. Reprice items are deliberately left out — they are our pricing decision, not the factory's.
Full history and analysis: · cost sheet
Reputation
Trustpilot · reviews across brands
Loox reviews
Products with no reviews yet are included — the nightly combine regenerates every product's review text, so shipping it whole re-reviewed products that were already covered. Deliberate top-up batches (raising covered products toward their review target) also appear here, labeled as topped up.
Downloaded — reviews in your Downloads folder
Unzip, then open each brand's Loox admin above and import its CSV. Press “I uploaded them” when done — that restarts the -day clock and stops the same reviews being handed to you twice.
Read once a day from the public profile. Below 3.5 or a drop of 0.2+ raises an item on Today.
Issues
What the automation owns — deduped, with state that survives a reload. Anything only you can move is on Today under “For you”.
ack expired
—
Playbook:
Checks
Press a button, a Claude session inspects the system and reports back here.
· every h · · s
No report yet — press “Check now”.
Feeds
Every GMC feed from build to what Google actually shows a shopper.
Cannot verify is not a pass. Those checks did not run or could not see their target, so nothing is claimed about them either way — they hold the all-clear back on purpose.
—
No health percentage is shown here on purpose. Feeds fail as a few hundred products in one market, which any total-based ratio rounds away — counts of verified claims, or nothing.
Automations
Every scheduled job, when it last wrote to its log, and whether that's late.
| Source | Reached you | Handled quietly | Critical | Occurrences | Last |
|---|---|---|---|---|---|
“Reached you” counts escalate-tier incidents only. “Handled quietly” is the auto-fix / aggregate / upstream work the board deliberately never shows — it is a success measure, not a backlog.
owner-routing exception(s) recorded via “Not mine” — the weekly review lists them for promotion into proper rules.
| Job | Schedule | Last run | Status | |
|---|---|---|---|---|
Product Import
Paste URLs from anywhere — newlines, commas, spaces, spreadsheet paste, inline prose. Individual product URLs or entire Shopify collection URLs (e.g. /collections/dresses) both work — collection URLs auto-expand into one row per product.
→ Product Imports • status = Pending
Analytics
Imports submitted per day + products published (draft → active) per brand per day.
Imports submitted per day
Products launched (draft → active) per brand
Sourced from each brand's Shopify published_at field.
Loading…
Launch count is based on Shopify's published_at field for each store.
Catalog
Active-product breakdown by type, season, and (ZEYA only) jewelry vs fashion. Sourced from each store's Shopify.
Loading…
By product type
By season
Season is inferred from title + tags keywords (e.g. "wool/fur/knit" → Winter). Rough bucket, good for volume-planning.
Product ROAS
Shopify sales × Google Ads spend × COGS. Products losing money surface at the top.
| Product | Brand | Units | Net sales | Ad spend | Ad ROAS | COGS | Cost | Net profit | Actions |
|---|---|---|---|---|---|---|---|---|---|
|
Sold out
|
no feed |
How it works
The full reference lives in the ClaudeCode Wiki — open the Notion article →
The flow
- You paste product URLs (AliExpress or competitor Shopify stores) on the Product Import page.
- You pick one or more target brands (SOERA, ZEYA, SOKYND, OLANE).
- Each URL becomes a Pending row in Airtable “Product Imports”.
- Every 15 min, a cron job on the VPS picks them up, scrapes the source, generates unique AI content per brand, and creates a draft product in each store’s Shopify admin.
- You review drafts in Product Imports (this app) or directly in Shopify, then publish.
Loox reviews — automatic
- As soon as a Shopify draft is created, a background job generates Loox reviews for that product — no manual step.
- AliExpress sources: real 4–5★ reviews with photos are scraped from the source URL, plus AI top-ups to reach ~20–25 reviews per product.
- Competitor Shopify sources: AI-generated reviews only (no photos, since those sources have no public review data).
- Rating mix: 70% 5★, 25% 4★, 5% 3★. Dates spread across the last 7–90 days.
- Reviews appear on Loox the morning after the import (nightly
loox_daily.shbatches + uploads via Playwright). - Failures are posted to #loox-reviews on Discord; the Shopify draft is never blocked by a Loox hiccup.
Multi-brand rules
- Source is scraped once per URL; content is regenerated uniquely per brand. Titles and descriptions differ across brands — not copies.
- Title generator enforces a luxury brand blacklist (~90 trademarked names like Celine, Chanel, Dior, Tiffany, Stella, Vera, Kate) to avoid legal/PPC conflicts.
- First-name uniqueness per brand — the AI fetches existing products for that vendor and avoids reusing names.
Status lifecycle
A row stuck on Error can be re-queued by flipping status back to Pending in Airtable.
Pricing (fixed per product type)
Compare-at price is randomized per product at 20 / 25 / 30% off to look like a natural sale.
What gets set on every draft
- Category — Shopify Standard Taxonomy (Dresses, Coats & Jackets, Clothing Tops…), mapped from the product type
- Fit Active Segment metafield = 3 (required by the SOERA theme)
- Age group = Adults / Target gender = Female (Shopify Taxonomy metaobjects)
- Images — full gallery from source (Apify + direct HTML fallback); variant images are assigned by AI color detection for multi-color products
- Inventory = 10,000 per variant
- Status = Draft (never live until you publish)
Supported URL types
- AliExpress — any product URL (Apify scrapes; falls back to direct HTML if Apify returns too few images)
- Shopify stores — any product URL from any public Shopify store (no API key needed)
- Shopify collections — paste a collection URL like
competitor.com/collections/dressesand the pipeline auto-expands it into one Pending row per product. Target brands selected on the submit form carry through to every expanded row.
Troubleshooting
- Re-submitted a URL with a new brand
- No longer rejected as duplicate. Submit reports cloned: N — the new brand(s) are cloned from the existing draft and queue for the next cron tick. Skipped only when every requested brand already exists on the row.
- Submit stuck on “queued…” for a brand
- The cron runs every 10 min. If it stays “queued” for much longer, the row may be in Error. Check the table and look for a red error message.
- Wrong images / too few images
- Some AliExpress products are geo-restricted — Apify returns only 1 image and the HTML fallback may also fail. Ping @Paul to handle manually.
Product Imports
of most recent — mirrored from Airtable
No records yet
Head to
AI Assistant Degraded · retry in min
Diagnose errors · retry rows · clear caches · escalate to Paul. Writes get a 30-second undo window.
🔧 tool call
Ask about a failed import, or tap one below.
Enter to send · Shift+Enter for newline. All actions logged; writes echo to Discord.