in the last hour.
Net sales today
Ad spend
ROAS
Orders
AOV
Refunds
CM3 net profit
Liquidity cards
AI spend yday
As of
Marketing calendar — coming up
resolved
expected
Nothing on your list.
Everything the system found is in the feed below — it is information, not work. Promote a row with "Make this a task" if one is yours.
NEW
Nothing in the feed.
Turn on a lane above, or the system genuinely found nothing.
Last run: in · finished · current run died without finishing
Next major moment
~ = date estimated · prep offsets: creatives D-21, campaigns live D-7 · supply cutoffs assume 12-day shipping · amber-tinted days = China factory blackout · brand chips = brands with a live feed in that market
Cash
Slash cards · USD · excludes Shopify payouts in flight and Wise
No reading is not a zero balance. Nothing below is current.
Available on cards
Card burn
Funded in 7d
Withdrawn 7d
| Business | Available | Burn / day | Cover | Last sweep |
|---|---|---|---|---|
The daily sweep pays the card from the primary account, so the balance is a pass-through, not a reserve — cover, not level, is what says whether the next charge lands. Two rails since : the cards carry Meta, tooling and the Google accounts still card-billed; SOERA + ZEYA Google bills by monthly invoice — the block below. The cover bands were measured on the old regime and are uncalibrated until — grey, with the hours shown, not green.
No reading is not a zero balance; the line is still being drawn on.
Outstanding
Projected peak
paying each invoice on its due date
Room to scale
Treasury reserve typed
| Cash due | Amount | Issue | Due | Pull reserve by | Status |
|---|---|---|---|---|---|
Must reach the cards
Ads projected
Top-ups observed
Runs short
Ad spend projected as a -day trailing mean with a weekday shape, band ±% from its own backtest. Tooling added at /day, measured from this account's own non-ad card spend — the fixed-costs register is NOT added, because only about a third of it is charged to these cards and the rest goes out on Wise or Chase. Inbound ran of net sales over days ( to ) — context only; across six complete months that figure runs 42–58% and nothing here divides by it.
| Card | Spend | Share | Charges | Last |
|---|---|---|---|---|
| Vendor | ||||||||
|---|---|---|---|---|---|---|---|---|
Settled charges only, ad platforms included. The daily sweep and transfers to our own accounts are movements, not spend, and are excluded. Recurring vendors also live on .
Reports
complete days only · · what happened, and what to do next
The read
Actions
done · cleared themselvesNothing needs you from this report.
—
Worth knowing
Areas to improve
Nothing above the thresholds for this brand in this period.
Money
CM3 = net − COGS − fees − ads| Brand | Net sales | vs prior | Orders | AOV | Ad spend | ROAS | CM3 | Refunds |
|---|---|---|---|---|---|---|---|---|
28 days to the end of the period · fleet net sales
Products
Performing well
—
Rising 7 vs 7 days, gross
—
Losing money Google spend only
Top sellers sold out
Geography
| Country | Net sales | vs prior | Share | Share before | Orders | Units |
|---|---|---|---|---|---|---|
Keyed by Google feed label, so a row here can cover more than one country and can spell one differently from the table above.
| Country | Cost | Conv. value | ROAS | Conversions |
|---|---|---|---|---|
Categories
| Category | Net sales | vs prior | Share | Share before | Units | Orders |
|---|---|---|---|---|---|---|
| Total | ||||||
Ad spend
| Brand | Spend | vs prior | Share | Net sales | ROAS | ROAS vs prior | Cost / order | Channels |
|---|---|---|---|---|---|---|---|---|
Quality issues
Factory-defect flags complaints ÷ 180-day units
Refund hotspots ≥3× the brand's per-product median
none above the bar this period
Feed & listing
Ad spend and ROAS
Not measured —
Customer Support
Received
Solved
Open now
Median to solve
Machine
Pao's book
real COGS and fees, typed by hand · a month is final once every brand is closed| Brand | State | Gross | COGS | Ads | Profit | Net ROAS | Hub diff |
|---|---|---|---|---|---|---|---|
Built from
Refunds
by refund day · EUR · pulled nightly 06:20 UTC · →
Refunded today
Yesterday to this hour
same-hour pace
Yesterday full day
Data as of
Every refund today
newest first · hover a row for the noteNone recorded yet today — check "Data as of" above before reading this as zero.
| Time | Brand | Order | EUR | By | Reason | Fulfillment | Country | Products |
|---|---|---|---|---|---|---|---|---|
Refunded
/day avg
% of net sales
refund day ÷ that day's sales
Refunds
/day
Disputifier chargeback alerts
of refunded EUR
Today partial
Who refunded
Why
Fulfillment when refunded
unshipped = cancellations/OOS (money we never needed to take) · delivered = the product disappointed
"delivered" needs a dated carrier scan before the refund — undated deliveries stay in "shipped".
Countries
Top refunded products · item refunds
exact — these items were named in the refund
none in this window
Top refunded products · money-only refunds
order-level attribution — the refund named no items, so it is split across the order by line value
none in this window
Chargebacks
disputes only (inquiries shown separately) · pulled nightly 06:40 UTC
Partial data
—
Filed rate 30d
Chargebacks
lost
Win rate
W / L · prevented excl.
fought · unfought — never contested
Dispute fees
seen on of
Open
under review · contestable
due in ≤3d, nothing sent
Bars: chargebacks filed each day, zero days included. Line: the trailing 30-day rate — the ratio card networks monitor, and the only one the bands apply to.
— 30-day rate - - - - · scale to
| Orders | CBs | Rate | Index | |
|---|---|---|---|---|
Thin cells (under 200 orders) are suppressed — a rate needs a denominator that can carry it.
| CBs | Amount | |
|---|---|---|
Deflected
refunded to stop them
Share of pressure
deflected + filed
Held
charged back anyway
Cost / deflection
$/mo, estate-wide
By network
·
■ deflected ■ filed. The refund is the price of the deflection — each one avoided a case that runs the order value plus an SGD 16.35 fee and, on Visa, a 3% chance of winning. Agents refunded a further alerts by hand (), not counted above.
| Order | Due | Days | Reason | Card | Amount |
|---|---|---|---|---|---|
| Reason | Total | Visa | Amex | MC | Won | Lost | Prevented | Win rate |
|---|---|---|---|---|---|---|---|---|
Top countries per reason: — .
| Card | Won | Lost | Win rate | Prevented | Open | Open € |
|---|---|---|---|---|---|---|
A win rate under 10% is a network not worth the evidence effort; open money on a network above 30% is the queue to work first.
Counts, not rates — these rank with sales volume. Read alongside the index table.
median · p90 d · max d · n=
The time between a customer paying and their bank filing the dispute. Half of all chargebacks arrive within of the order; within 120. A month's disputes keep landing for about four months after it ends — so a recent month always looks clean, and the cohort chart hatches anything under days as still maturing. Judge a cohort only once it has aged past that.
Filed dates come from the dispute-id clock (median 0-day error), not the event log, whose coverage varies 3.7× by cohort and would skew this curve.
| Agent | Messages | Disputes | per 1k | Index |
|---|---|---|---|---|
Below the volume floor but worth a look: — disputes on messages.
Agents under messages are hidden — too little volume for a rate to mean anything. Excluded from attribution:
Agent attribution unavailable
| Order | Ordered | Filed | Country | Card | Value | Status |
|---|---|---|---|---|---|---|
| ~ |
Shipping
by order day · Shopify fulfilments + ParcelPanel · pulled nightly 05:40 UTC
Order → delivery median
no prior window yet
Coverage
parcels measured
In flight
not delivered yet
At risk actionable
Cohorts provisional
complete ·
parcels
| Brand | Order→ship | Order→delivery | Parcels | In flight | At risk |
|---|---|---|---|---|---|
| Country | Order→delivery | Parcels |
|---|---|---|
| Order | Brand | State | Country | Tracking | ParcelPanel says | Days since ship |
|---|---|---|---|---|---|---|
| not asked yet |
| Outcome | Orders | Refund rate | Refunds € | Excluded € | Excess € |
|---|---|---|---|---|---|
Refunds € = everything not excluded; most carry no stated reason, so it is not "shipping's fault" by itself. The excess column is what shipping cost: (bucket rate − on-time baseline) × orders × mean refund. Excluded = out-of-stock, cancellation, Disputifier — real money with another owner. In-flight refunds below are a subset of the delivered rows here.
were issued before day on orders that then arrived. No parcel has ever landed before day 8.
Never got a parcel
orders older than days with no shippable fulfilment (not cancelled) · already refunded, · cancelled
Non-shippable records discarded
— SOERA's Shipping Insurance add-on, auto-fulfilled in seconds and never shipped.
Parcels with no tracking number
— these can never be measured to delivery. Alarms above .
Last pull
Sheet P&L
Pao's book · · actual COGS & fees · not the live P&L
Not synced yet
The sheet has never been pulled into ops.db on this instance — press Sync now above, then reload in ~2 minutes.
No tab for this month
The workbook has no tab for . Use ‹ › to move within the months it does have.
Gross
refunds ·
Net
gross − refunds
Ads
Google · Meta
COGS
Fees
as entered
Profit
Net ROAS
POAS
Copy failed — select and copy this:
| Day | Gross | Refunds | Net | COGS | COGS % | Meta | TikTok | Ads | Fees | Net ROAS | POAS | Profit | Profit % | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| partial quarantined | |||||||||||||||
Sheet's own Profit column for these days: · gap . Ratios are sums ÷ sums, never averages of daily ratios. Profit % is of net (the sheet divides by gross).
No months synced for this brand yet.
→ · gross · ROAS → · COGS → of net
| Month | Net | Profit | % | MoM | YoY | Hub | |
|---|---|---|---|---|---|---|---|
|
|
|||||||
Fixed Costs
one row per cost, not per month · EUR · CM3 after fixed costs, not net profit
Register is empty
No items yet on this instance — run fixcost_register.py --seed once, or add rows below.
Declared run-rate
AI / API metered
invoice tier · all providers covered
Unpriced
CM3 after fixed
no CM3 for this month — Sheet P&L has no complete days
Break-even sales
| Fixed costs | 100% |
| Brand | CM3 book | CM3 Shopify | Direct fixed | After direct · book | After direct · Shopify | Items |
|---|---|---|---|---|---|---|
General /month is never allocated to a brand; "after direct" deducts only the items that name the brand. Both CM3 bases are carried until the refunds definition is settled.
Deleted
Removed from every month. Nothing is destroyed — restore puts the row back with all its versions.
Restatements
Changes to months the Sheet P&L has already read. The figures it showed before are not what it shows now.
| When | Who | Item | Month | What |
|---|---|---|---|---|
P&L
· updated
Snapshot is stale — these numbers may not reflect the last hour.
Net sales
Orders
AOV
Ad spend
Google · Meta
ROAS
COGS
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
Refunds in net sales
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. CM3 = net sales − COGS − fees − ad spend; shipping and fulfilment not deducted.
| Brand | Net sales | Refunds | Ad spend | ROAS | COGS | CM3 | Orders | AOV | Sessions | Conv. |
|---|---|---|---|---|---|---|---|---|---|---|
Packaging
variable · per shipment, on gross orders| Brand | Components | Per order | Orders | Packaging |
|---|---|---|---|---|
| All brands |
A hangtag and a frosted bag go on each garment; one shipping bag holds two items, so a 6-item order takes 3 bags. Both ratios are measured from the order-size distribution — the average alone would say 1 bag an order and understate SOERA by 12%. Deducted inside CM3 beside COGS, fees, ads and the deposit fee.
Airwallex deposit fee
variable · charged on net sales after returns and payment fees| Brand | Airwallex | Rate | Net sales | Base | Deposit fee |
|---|---|---|---|---|---|
| All brands | SG3 · HK4 · HK3 |
SOERA 0.1%, every other brand 0.2% (Paul, 2026-09-06). Deducted inside CM3 beside COGS, payment fees and ad spend. Airwallex bills it through three accounts — SG3 for SOERA, HK4 for ZEYA and HK3 for SOKYND, OLANE and SEAME. HK4 and HK3 used to sit in Fixed Costs as flat rows and SG3 was missing entirely; all three are this percentage.
Restock
Sold-out products ranked by trailing net sales — every one is revenue currently switched off. · data h old — STALE
Floor: €50 net / 90 days. Suggested qty = trailing 60–90d units. Source links are the supplier's own listing where we have one.
Restock cases
sold-out products above the floor
60-day net they earned
before they went dark
Lost so far
days out × run-rate at sell-out
Longest out
days
oldest tracked sell-out
Suggested units
total reorder across all cases
| Product | Requested | Back in stock | Days to restock |
|---|---|---|---|
| restocked ✓ | · ordered |
Built from the perf snapshot's sold-out list × sales windows (restock_radar.py, daily 11:25). The daily feed posts the top open cases (max 5 new / 12 open per brand) to #supplier-tasks as one message each; DAYONE answers in the work sheet ↗work sheet and the Discord column shows what they did (hover for the answer). The WhatsApp button still copies the top items for a manual send.
Newsletter
·
Mode
Next send
Klaviyo
Revenue · 30 days
| Language | Campaigns | Recipients | Delivered | Clicks | Orders | Revenue | Rev / 1k | Unsub | Spam |
|---|---|---|---|---|---|---|---|---|---|
| Language | Editions | Recipients | Click rate before → now | Click index (0.25× · 1 · 4×) | Orders · index | Unsub before → now | Verdict |
|---|---|---|---|---|---|---|---|
| English (reference) | 1.00 by definition | — | |||||
|
|
| Sent | Lang | Campaign | Recipients | Click rate | English same send | Orders | Rev / 1k | Unsub | Status |
|---|---|---|---|---|---|---|---|---|---|
No upcoming slots yet — the hourly run plans the next two.
EN
DE
No Klaviyo data yet — refresh results once the Klaviyo key is set.
| Send date | Campaign | Recipients | Delivered | Opens | Clicks | Orders | Revenue | Rev / 1k | Unsub | Spam |
|---|---|---|---|---|---|---|---|---|---|---|
| auto |
| # | Product | Category | Units 30d | Net 90d | Featured | As hero | Last featured |
|---|---|---|---|---|---|---|---|
|
|
Activity
· ·
Product Labels
Clarmix performance labels from Merchant Center (customLabel3) · snapshotted weekly, Sat 10:00 UTC · snapshot — STALE (weekly sweep may have failed)
No Merchant Center access for this brand
The hub's service account has no user grant on this brand's Merchant Center (). Add the service-account email under GMC → Settings → People and access, and the next Saturday sweep picks it up.
No Clarmix labels on this brand
Merchant Center is reachable, but customLabel3 carries no clarmix_* values — Clarmix is likely not connected for this brand yet. The chart below shows only the unlabeled total.
Rising stars
At risk
Flickering
Reactivated
First snapshot captured — the evolution chart starts drawing when the second weekly snapshot lands.
total
No snapshots recorded for this brand yet — the weekly sweep (Sat 10:00 UTC) fills this in once the brand is reachable.
| Label | Count | Share | Δ vs prev snapshot |
|---|---|---|---|
| When | Product | Market | Move |
|---|---|---|---|
| → |
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 | 7d | 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
This month
Last 30 days
Today so far
last 30 days
Token usage × list price, so treat it as SHARE — the invoice has no per-key breakdown. Heavy cache reads are Claude Code's signature.
| Automation | Model | 30d cost | calls | last used |
|---|---|---|---|---|
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
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.
Daily COGS scan
Landed cost × ÷ selling price. p50 · p90 · · · ·
Supplier price rose (same SKU, same country)
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:
Google Ads Keywords
Nothing here is broken. The automation did the analysis and stopped, because the next step is a judgement call it should not make on its own. Verdicts write straight back to the sheet, so the harvester and the negative miner pick them up on their next run.
no decision queues reachable.
Partner Sheet
Dashboard de SEG — Meta purchases + ad linksLast 7 days
Purchases every other day at 06:40 UTC — finished days only (1-day delay rule), each run re-corrects the last 7 days as late conversions land. Ad links renew Thursdays 06:50 UTC (top ACTIVE ads by 7-day spend). "Sync now" runs both passes immediately.
No runs logged yet.
Ads Change Log
Nothing in the last two weeks.
Campaigns
What each Google Ads campaign spent and returned, on Google's own attribution in — the figures the Ads UI shows, not the euro numbers on the money pages.
Trend
Thin line is each day, heavy line a 7-day average. The shaded strip on the right is the last 3 days — conversions keep being attributed after the click, so the newest points always read low and are left out of the comparison above.
Where the money goes
What changed
Every campaign
click a column to sort| intentional |
The table is ENABLED campaigns only; the trend above is account-level and includes paused ones, so they do not tie exactly — ROAS is Google's own attribution and carries no margin: at roughly 30% COGS and 5% fees a 1.9× blended return is close to break-even after product cost.
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
Which products are actually making money — Shopify sales × Google Ads spend × COGS, per product.
Net sales Shopify
units · 7d vs prior 7d
Ad spend all channels
Blended ROAS
COGS
Net profit
after COGS and every ad channel
Losing money
Where Google product spend goes
Where net sales come from
| Product | Brand | 14d trend | Units | Net sales | Ad spend | ROAS | Margin | Net profit | Actions |
|---|---|---|---|---|---|---|---|---|---|
|
no img
Sold out
Removed
|
flat
|
no feed | |||||||
|
Verdict Google Ads impressions · clicks · CTR CPC · conv. · CVR Google-attributed revenue () Store orders · gross · refunds COGS · /unit · assumed 30% AOV/unit Top markets
no orders in window
Shopify id |
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, SEAME).
- 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.
What fixes it
Evidence
The same thing, measured over three windows
History
What the automation tried
Around the same time
Muted
Clone to
Pick a source brand whose Shopify product will seed the clone. The pipeline will create the target draft within ~3 min.
Action required ·