Adzira Product Hub

Bulk URL imports · catalog analytics

⏳ Apify (upstream scraper) is degraded — imports are slow. Self-heal will retry automatically when it recovers. ⏳ Pipeline is backed up — oldest Pending row is min old.

/ systems green

Net sales today

Ad spend

ROAS

Orders

AOV

Refunds

CM3 net profit

Liquidity cards

AI spend yday

As of

Marketing calendar — coming up

Overnight resolved ·
My tasks

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.

Live feed what the system found · click any line

Nothing in the feed.

Turn on a lane above, or the system genuinely found nothing.

Checks & automations last full run step of
Nightly chain running
Systems of healthy · checked
Fixed without you last 24h · no action needed

Next major moment

·
+ Add campaign

~ = 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.

Reports

complete days only · · what happened, and what to do next

Refunds

by refund day · EUR · pulled nightly 06:20 UTC · →

→
No refunds recorded for this selection yet — the nightly pull fills history.

Chargebacks

disputes only (inquiries shown separately) · pulled nightly 06:40 UTC

Shipping

by order day · Shopify fulfilments + ParcelPanel · pulled nightly 05:40 UTC

Nothing pulled yet — run shipping_tracker.py --backfill once, then the nightly cron keeps it current.

Sheet P&L

Pao's book · · actual COGS & fees · not the live P&L

Loading…

Fixed Costs

one row per cost, not per month · EUR · CM3 after fixed costs, not net profit

Loading…

P&L

· updated

Snapshot is stale — these numbers may not reflect the last hour.

Restock

Sold-out products ranked by trailing net sales — every one is revenue currently switched off.

Floor: €50 net / 90 days. Suggested qty = trailing 60–90d units. Source links are the supplier's own listing where we have one.

No availability data for: — absence of measurement, not proof of stock.

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

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

·

Product Labels

Clarmix performance labels from Merchant Center (customLabel3) · snapshotted weekly, Sat 10:00 UTC

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.

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

Bestsellers

What is actually selling, per brand. Read-only — nothing here changes anything. · sources — STALE

sales (UTC, rolling) · ads (account timezone, includes today)

Dedicated asset group — standing bar
read-only · re-runs the image preflight live


          

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

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

ProductBrand Complaints Units 180d Rate DefectsState
No products above watching. The nightly scan keeps this current.

Support

Georgie → Gorgias · · up since

Supplier pricing

Reading cost maps and live sales…

Reputation

Trustpilot · reviews across brands

Reading Trustpilot…

Issues

What the automation owns — deduped, with state that survives a reload. Anything only you can move is on Today under “For you”.

No issues in this view.

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.

loading…

no decision queues reachable.

Partner Sheet

Dashboard de SEG — Meta purchases + ad links

Last 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.

loading…

No runs logged yet.

Ads Change Log

loading…

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.

STALE
Brand
Window

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

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.

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.

Chronic offenders last 30 days · ranked by what actually interrupted you
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.

🚀 Submitted URLs
✓ Draft Created ⏳ Pending 🔄 in flight 🔴 Error

→ Product Imports • status = Pending

Analytics

Imports submitted per day + products published (draft → active) per brand per day.

Imports (window)

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…

Jewelry
Fashion
Total active products

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

products that sell

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 sales or ad activity in this window.
No products match the current view / search / removed filter.

How it works

The full reference lives in the ClaudeCode Wiki — open the Notion article →

The flow

  1. You paste product URLs (AliExpress or competitor Shopify stores) on the Product Import page.
  2. You pick one or more target brands (SOERA, ZEYA, SOKYND, OLANE, SEAME).
  3. Each URL becomes a Pending row in Airtable “Product Imports”.
  4. 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.
  5. 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.sh batches + 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

Pending → Scraping → Scraped → Generating → Importing → Draft Created

A row stuck on Error can be re-queued by flipping status back to Pending in Airtable.

Pricing (fixed per product type)

Top / Blouse €34.99
Shorts / Set €34.99
Mini dress €39.99
Pants €39.99
Midi dress €44.99
Coat / Jacket €44.99
Maxi dress €49.99
Shoes €59.99

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/dresses and 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

Quick filter: Showing of

No records yet

Head to and queue some URLs.

""
Img Status Source SOERA ZEYA SOKYND OLANE Submitted
— End of history —
No conversations yet.

AI Assistant Degraded · retry in min

Diagnose errors · retry rows · clear caches · escalate to Paul. Writes get a 30-second undo window.

Queue

Ask about a failed import, or tap one below.

No errors right now 🎉 · Try “queue status” or paste a Shopify admin URL.

Enter to send · Shift+Enter for newline. All actions logged; writes echo to Discord.

🚫

Retry won't help

source:

Clone to

Pick a source brand whose Shopify product will seed the clone. The pipeline will create the target draft within ~3 min.