Dashboard
KPI
— Four calendar weeks, every day, in CAD. Units split a month's plan across its days; the three rates apply as they stand.
Reports
Report tables read the scraping platform's fact tables read-only (docs/DataSource.md §4 allowlist). No report is wired yet — this is the placeholder shell; each report endpoint is added under /api/reports/… as it's scoped.
| Report | Status |
|---|---|
| No reports configured yet. | |
Amazon Accounts
Disabled markets — oldest first
— Beyond roughly 60 days Amazon will not serve the missing days again — re-enabling does NOT backfill. Age is measured from the last change to whichever switch is off — the marketplace's own, or the account's when the whole account is switched off. Scopes that are not collecting for other reasons (quarantine, or a seller who does not participate) are not listed here: they are not forgotten switches.
| Account | Marketplace | Disabled for | Reason |
|---|
Accounts
— Open an account to see its marketplaces grouped by region, with every account-level fact attached to the account rather than repeated on each market. A market is collected only when the account is on, the marketplace switch is on, the seller participates, and the account is not quarantined — the cause shown is the FIRST unmet one, so clearing it may reveal another.
| Account | Collecting | Regions | Credentials | Account switch |
|---|
Region endpoints
—
One write here affects EVERY account in that region.
These are the hosts ADL sends requests to. Amazon publishes them; MD stores what Amazon
publishes and never derives one from a pattern — the Ads na host carries no
region suffix while eu/fe do, so any
{prefix}-{region} rule is wrong for exactly one row.
| API family | Region | Host | State |
|---|
Region endpoint — —
This changes where EVERY account in this region sends its requests. ADL checks that the host answers before storing it — an unreachable host is refused and nothing is written. ⚠️ "Answers" means it terminates TLS: Amazon replies 401/403 to an unauthenticated probe, which proves the host exists.
Unticking is how you stop using a live region — do not delete it: deleting one still in use would make its requests fail as an unknown region instead of as a deliberately disabled one.
Type the region key — to confirm:
Account — —
Create an Amazon account
The name is permanent. It becomes a folder in ADL's raw archive and a key in every fact table, so it cannot be renamed later — only letters, digits, underscore and hyphen. ADL verifies the credentials against Amazon before creating anything: if Amazon refuses them, nothing is created.
Marketplaces are added afterwards, one at a time — adding gets a per-marketplace answer from Amazon, while creating a batch lands them in mixed states you would then have to reconcile.
Add a marketplace — —
Amazon is asked first. If it reports that this seller does not sell in the marketplace, ADL refuses and nothing is written — unless you tick the override below.
⚠️ The row is created but collection stays OFF — the override records a belief, it does not start spending Amazon quota on a scope Amazon currently refuses. 🔴 It also cannot be undone: ADL has no endpoint to change or clear it afterwards.
Marketplace — —
Only what you actually change is sent.
Two fields are editable here. Identity (label, marketplace_id,
region) is immutable: the archive and every fact row key on
(account, marketplace), so changing it would orphan the history rather than rename it.
The collection switch and the participation state move through their own paths.
SQS block — —
Configured, not yet in force. ADL has not built SQS ingestion — a saved block does nothing today. It is stored, it is audited, and it will take effect when ADL builds the consumer.
Check and replace credentials — —
Checking saves nothing. Saving REPLACES the stored credentials. What you type here is never stored by MD, never logged, and never shown back — credential fields are write-only by permanent contract, so there is no "current value" to display and there will not be one. ADL verifies again on save, so a save can still be refused after a check passed (a credential can be revoked in between) — the save's answer is the one that counts.
Leaving the three Ads fields empty does NOT clear them; it keeps what is stored. Clearing is a deliberate, separate act.
Amazon DL
Throughput — completed vs failed per cycle
— One bar per cycle over the window. Green = completed, red = failed. The line is backlog (queued at cycle end) — a rising line means the daemon is falling behind.
Efficiency — cooldown waste per cycle
% of drain slots lost to 429 cooldown (skipped_cooldown / (executed + skipped_cooldown)). High & rising = quota-bound, not scheduler-bound.
Tasks now
Current op_tasks state snapshot.
| State | Count |
|---|---|
| Loading… | |
Rate-limit pressure
429 pressure per region (EU is usually tightest — 11 marketplaces share one quota). Plus failure modes in the last 6h.
| Region | Buckets | In cooldown | 429 (1h) |
|---|---|---|---|
| Loading… | |||
Timeliness — data freshness per report
Each date-bound report's newest completed day, with the lag it's expected to carry: today's Amazon data isn't queryable yet, so a lag of a few days is normal and healthy. "Status" is DL's own on-time verdict (lag vs. expected). Snapshot reports target "now" and carry no lag.
| Report | Newest date | Lag / expected | Status |
|---|---|---|---|
| Loading… | |||
Completion by day (last 7 days)
Per target-date completion. Done % / Achievable % count task ATTEMPTS (op_tasks rows), so a slot that was throttled (429) then recovered leaves both a failed and a completed row and reads low forever — they show retry churn, not data truth. Real % is the data-truth view: of the distinct slots (account×marketplace×report) attempted, how many NOW have data (joins the catalog), excluding structural ceilings (no Ads profile / no data). Real % is typically ~99% even when Achievable % dips to ~87% on maturity-refresh peak days — the dip is a counting artifact, the data is there. Failures split into structural (permanent ceiling) and recoverable (a retry could clear).
| Date | Tasks | Done | Failed (struct.) | Failed (recov.) | Pending | Done % | Achievable % | Real % |
|---|---|---|---|---|---|---|---|---|
| Loading… | ||||||||
MBI Data ingestion — our own sync health
Everything above is Amazon DL's health. This is ours: for each market, when did a refine last succeed, and did any fail? A failed refine writes no rows — so without this panel a broken sync looks exactly like a market with no sales. Unknown means the run predates outcome tracking, not that it's healthy.
| Market | State | Last success | Windows ok / empty / failed | Rows written | Last error |
|---|---|---|---|---|---|
| Loading… | |||||
Walmart DL
Cycles — completed vs failed per cycle
— One bar per scrape cycle over the window. Green = completed, red = failed, sized against the cycle's executed count.
Recent outcomes
How the most recent task attempts resolved — success vs incomplete-data vs rate-limited.
| Outcome | Count |
|---|---|
| Loading… | |
Refined output — rows per table
Rows the refine wrote to each own-DB table. A 0-row fact/snap table is flagged — nothing landed there this window.
| Table | Rows |
|---|---|
| Loading… | |
Contract drift
Whether the upstream Walmart data shape still matches what the refine expects. An unacknowledged breaking change means the refined output may be wrong until reviewed.
Amazon SR — SKU Report
Shelf
| Market | SKU | ASIN | What | Sellers | Buy box | Units 30d | Sales 30d | Last sale |
|---|
SKUs
— contains provisional (unsettled) days · Per-SKU monthly roll-up from the daily detail. Rates (ACoS/TACoS/CVR) are computed over the month (spend÷sales, not a mean of daily rates). Click a header to sort. Default hides inactive SKUs. Money in the marketplace's native currency.
| Pick an account · marketplace · month. |
—
—
—
Target plan
—
—
—
—
Search Terms
Problems
Search terms
— Pick one or more markets and press Load.
| Term | Market | Spend▼ | Change | Clicks | Orders | CPC | CVR | ACoS | Campaigns |
|---|
| Term | Attributed to | Market | Spend▼ | Clicks | Impr. | CTR | CPC | Orders | CVR | ACoS |
|---|---|---|---|---|---|---|---|---|---|---|
| Pick one or more markets and press Load. | ||||||||||
Amazon Inventory — Summary
SKUs
— Point-in-time FBA inventory at the latest snapshot in the month. Age buckets are the FBA on-hand split; Value = quantity × the month's ASP (Σsales÷Σunits). In-Transit / ERP-Unshipped are operator figures; WH columns are manual entry. Click a header to sort. Default hides inactive SKUs. The currency in force is stated above — native for one marketplace, converted for a mixed selection — never assumed.
| Pick an account · marketplace · month. |
Walmart Inventory — Summary
SKUs
— Point-in-time stock at the latest snapshot in the month, split across fulfilment ship nodes (click a SKU's ▸ to expand). Available / Input Qty are Σ over nodes. Supply-days is MD-computed (Available ÷ trailing-30d velocity) — Walmart supplies none; Value = Available × the month's ASP. Reserved is not populated by Walmart yet. Ship nodes shown are seller-visible. Click a header to sort. Money in the marketplace's native currency.
| Pick an account · marketplace · month. |
Walmart SR — SKU Report
SKUs
— contains provisional (unsettled) days · Per-SKU monthly roll-up from the daily detail, worst-first by health flag. Rates computed over the month (not a mean of daily rates). CVR is Walmart's own served value. Refund $ rate is dollar-based (no upstream units). Supply-days is derived from trailing-30d velocity. Click a header to sort, or a row for the SKU cockpit.
| Pick an account · marketplace · month. |
—
Product Catalog
Products — least complete first (E9)
| # | Name | Brand | Record | Lifecycle | Category | Linked | Completeness |
|---|
New product
Attributes
Category attributes (inherited from the classification tree) — classify this product to see its attribute form.
Variants
— The sellable members of this product family (size/colour/pack), each with its own GTIN. A listing can be pinned to a variant from the Linked listings row below.
| Milo SKU | Manuf SKU | Code | Name | GTIN | Type | Units/carton | Default | Listings |
|---|
Linked listings
| Channel | Account | Mkt | SKU | ASIN / WPID | Status | Variant | Role | ★ | Override |
|---|
Unlinked listing groups
— A (channel, SKU) group is a hint, never an identity — the same product sells under different SKUs across channels, so the click is the confirmation. Suggested member names the member this group looks like and the basis for it (our SKU · our mfg code · the channel’s barcode echo, weakest last); a contested key proposes nothing on purpose, because picking one would fold two products’ numbers together. “→ link” accepts a proposal and applies any FNSKU staged for that market; “→ attach…” places the group under a family as a NEW member.
| Channel | SKU | ASIN / WPID | Mkts | Accts | Leaves | Suggested member |
|---|
Multi-SKU channel ids — attribution
— green = data lands here; green ★ = a human pinned it; grey = not receiving data. Need attention rows have ≥2 active skus and no pin — refine can't choose, so their data drops; click a grey sku to pin it, ★ click = reset. Off-channel rows have no active sku at all (nothing to attribute) and are hidden unless you tick “Show off-channel” or search. Each sku shows its listing status.
| Mkt | Account | ASIN / WPID | SKUs in group |
|---|
Staged from the workbook
— Each row is one product-master row from All ORDERS - Handle Tech.xlsx, normalised and waiting for a family. Clean rows sort first on purpose — they build the family set fastest, and the harder rows then have families to attach to. The suggested family is a hint from the name stem: the machine never merges two products that are not related, but it does miss relations, so your job is only ever to merge, never to split.
| SKU | Product name | Markets | Defects | Suggested family |
|---|
Declared but not selling
— Each row is a family; the gaps under it are the markets it was declared for but is not selling in. The lead counts declared markets, not families — collapsing must never shrink the blast radius. Products being wound down (phasing_out / discontinued / eol) are excluded: they are not forgotten switches, and listing them would bury the ones that are. Products whose declaration was ALL or EU are absent entirely — they never declared a concrete market, so there is nothing to compare.
| Family | Declared | Gaps | Where |
|---|
Classification tree
— Products hang off a LEAF via their Category field. “+ child” adds a node under this row; “rename” relabels it; “move” re-homes the node and its whole subtree (choose a new parent, or “(top level)”); “delete” needs 0 products and 0 children (re-home first).
| Category | ID | Products | Children |
|---|
Add category
Move category
The whole subtree under this node moves with it. “(top level)” promotes it to a root.
Rename category
New product
Created as a draft — the editor opens next to set category, lifecycle, description and link listings.
Attach to a family
— A family is the PRODUCT ("Yard Sentinel"); the SKU is one sellable member of it (a market, a pack, a configuration). Search first — 41 Yard Sentinel SKUs belong to one family, not 41.
Promote to the catalog
— Promoting writes the sellable item, its declared markets and its physical spec. The FNSKU is not written — it needs a matching channel listing, and 27% of seller SKUs match nothing of ours; it stays staged until there is a leaf to attach it to.
Attributes
Attributes defined here apply to this category and its whole subtree (inherited; nearest wins). The tree groups; attributes are the data.
| Key | Label | Type | Unit | Values | Req |
|---|
Add attribute
Add variant
Code is unique within the family; GTIN is unique across all variants (the dedup basis).
Channel override
How this listing presents on its channel, overriding the core product. Presentation only — no price, stock or sales here (those are data, not catalog). Empty = falls back to core.
Access
Users
— Everyone who has signed in, plus pending invites. Click a row to manage that user's roles, overrides and effective permissions.
| User | Coarse role | Status | Effective perms |
|---|
Operations
— Named operations and the permission each one requires. Retire an operation to stop it being enforced; edit to re-point it at a different permission.
| Operation | Requires | Status | Description |
|---|
User
Add role
Grant or deny a permission
Invite user
Copy roles from…
Add operation
Edit operation
Planning — Annual Plan
Plans
— One row per annual plan. Click a row to open its cockpit. Units only — this plan carries no monetary amount.
| Year | Market | Title | Status | Lines | Annual units | Updated |
|---|---|---|---|---|---|---|
| Choose a year and press Load. | ||||||
Plan
— Per-line annual commitment and its twelve-month allocation. A line whose channel has no actuals source shows “no actuals source” — never 0% — because those are different facts and call for different responses.
| Channel | Region | SKU | ASIN | Annual | Measurability | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec |
|---|
Line annual
—
Leave it empty for not set — that is not the same as zero, and a plan cannot be approved while any line is unset.
Review and publish
— Publishing creates the next revision and swaps it in as the executing plan. Closed months are copied verbatim — nobody re-plans the past. The annual total is held; changing it requires an amendment instead.
| SKU | Annual | Measurability | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec |
|---|
New annual plan
Units only — this plan carries no monetary amount. It lands as a draft; nothing downstream changes until it is approved.
Approve plan
—
Approval creates the immutable baseline (revision 0) and puts the plan in force. Every line needs an annual figure and twelve months that sum to it; anything that does not is listed below rather than silently adjusted.
Operation Log
Recent operations
Every permission/operation administration action, newest first. Filter by domain or actor, then Refresh.
| Time | Actor | Domain | Action | Target | Detail |
|---|---|---|---|---|---|
| Loading… | |||||