Manage DressLikeMommy Shopify store. Use when: (1) Creating/editing product listings, (2) Checking inventory or orders, (3) Updating prices or collections, (4) SEO optimization, (5) Inventory monitoring & alerts, (6) Any task involving admin.shopify.com. Uses browser automation + Shopify CLI.
Manages the DressLikeMommy Shopify store end-to-end: product CRUD, pricing with safety rails, inventory monitoring, order management, and SEO. Every mutation is logged, verified, and reversible.
dresslikemommy-com (NOT dresslikemommy)admin.shopify.comprocedures/pricing.mdprocedures/product-listing.md (3-phase AI/Human split)procedures/size-chart-guide.md (extraction, conversion, HTML template)workspace/memory/shopify-audit.jsonl| Input | Source | Required | Example |
|---|---|---|---|
| product_id | User message or Shopify search | Varies | 8234567890123 |
| product_title | User message | Varies | "Red Heart Fleece Hoodie Set" |
| price | User or pricing procedure | For pricing ops | 34.99 |
| reason | User message or context | For price changes | "Competitor undercut by 15%" |
browser -- Navigate Shopify admin, fill forms, upload images (Claude_in_Chrome preferred)web_search -- Competitor pricing, SEO keyword researchexec -- Shopify CLI commands, curl API callswrite / edit -- Update audit log, knowledge filesmoltbot message send -- Telegram alerts for inventory/order notifications| Action | Tier | Rule |
|---|---|---|
| Read store data, audit, research, SEO audit | 0 | Just do it |
| Edit drafts, update SEO, fix data, add tags | 1 | Do it, report after |
| Price adjustments within +/-10% on live items | 1 | Do it, log + report after |
| Price adjustments beyond +/-10% | 2 | Confirm with Francisco |
| Publish products (Draft -> Active) | 2 | Confirm with Francisco |
| Delete products | 2 | Confirm with Francisco |
| Change store settings, theme, checkout | 2 | Confirm with Francisco |
Every Shopify API call or browser-automated action must follow this error protocol.
Retry strategy: exponential backoff with jitter
Attempt 1: wait 1s + random(0-500ms)
Attempt 2: wait 2s + random(0-1000ms)
Attempt 3: wait 4s + random(0-2000ms)
Max retries: 3
After 3 failures: log to audit, queue action for later, report to Francisco
1. Verify the product ID is correct (check for typos, stale IDs)
2. Search by product title in Shopify admin
3. Check if product was archived or deleted (search "All" status filter)
4. If truly missing: log to audit with context, report to Francisco
-- NEVER silently skip a missing product
1. Re-fetch the current product state from Shopify
2. Compare fetched state with intended changes
3. Merge non-conflicting fields
4. Re-apply the update with fresh data
5. If conflict persists after 1 retry: log and escalate to Francisco
1. Log the failure with timestamp and endpoint
2. DO NOT retry (credentials won't fix themselves)
3. Check: is the browser session still logged in?
4. If browser session expired: re-authenticate via browser
5. If API token issue: report to Francisco immediately
-- NEVER expose or log the actual credentials
1. Retry once after 5s wait
2. If second attempt also times out:
a. Log the failed operation with full context (product ID, intended changes)
b. Queue for later retry (write to workspace/memory/shopify-retry-queue.jsonl)
c. Report: "Shopify unreachable -- queued [action] for retry"
3. On next skill invocation: check retry queue first, process any pending items
1. If Shopify admin page doesn't load: retry navigation once
2. If element not found: check for Shopify UI updates (selectors may change)
3. If iframe blocks interaction: use JS property setter + dispatch events
4. If stuck > 2 minutes on one action: fall back to CLI/API approach
5. Follow TOOLS.md fallback chain: Claude_in_Chrome -> Control_Chrome -> osascript -> Peekaboo
Before ANY price modification on a live product:
abs(new_price - old_price) / old_price * 100Total Cost x 2 minimum
1. Record BEFORE state:
{product_id, product_title, old_price, old_compare_at_price, timestamp}
2. Apply the price change via Shopify admin or API
3. Read-back verification (MANDATORY):
- Re-fetch the product from Shopify
- Confirm new_price matches what was intended
- Confirm compare_at_price is still correct (if applicable)
- If mismatch detected: ROLLBACK immediately (set price back to old_price)
4. Log to audit:
{"action": "price_change", "product_id": "...", "product_title": "...",
"old_price": 34.99, "new_price": 31.99, "change_pct": -8.6,
"reason": "Competitor price drop on Amazon",
"tier": 1, "verified": true, "timestamp": "2026-03-31T14:22:00Z"}
If a wrong price is detected (by read-back or later audit):
input/change events (per TOOLS.md anti-patterns)Every product update produces a receipt:
{
"action": "product_update",
"product_id": "8234567890123",
"product_title": "Red Heart Fleece Hoodie Set",
"timestamp": "2026-03-31T14:30:00Z",
"changes": [
{ "field": "title", "before": "Red Heart Fleece Set", "after": "Red Heart Fleece Hoodie Set" },
{
"field": "tags",
"before": ["red", "fleece"],
"after": ["red", "fleece", "hoodie", "winter"]
},
{ "field": "price", "before": 34.99, "after": 31.99, "reason": "Seasonal sale" }
],
"verified": true,
"status": "success"
}
Follow procedures/product-listing.md Phase 3 (Create Draft):
admin.shopify.com/products/newprocedures/size-chart-guide.md: extract 1688 measurements, convert sizes, build HTML table with inline CSS, include "sizes run small" warning + "How to Measure" guide, show both inches & CMprocedures/size-chart-guide.md S4: US-friendly labels like 3T (100cm) for kids, M (US S) for adults. For sets: Option 1 = Mom Size, Option 2 = Child Size. Every variant needs SKU (DLM-[code]-[size]), price, weight.| Setting | Default | Configurable via |
|---|---|---|
| Low stock threshold | 5 units | User directive |
| OOS alert channel | Telegram (8438693397) | moltbot config |
| Check frequency | On-demand or scheduled | Scheduled task |
Out-of-Stock (immediate alert):
via Telegram:
"OOS Alert: [Product Title] -- [Variant] is out of stock.
BuckyDrop status: [available/unavailable/unknown]
Last sold: [date if known]
Action needed: [restock via BuckyDrop / mark unavailable / remove listing]"
Low Stock (batched alert):
via Telegram:
"Low Stock Report ([N] items):
- [Product] / [Variant]: [X] remaining
- [Product] / [Variant]: [X] remaining
Restock recommendations attached."
When sales velocity data is available from Shopify:
Product: [Title]
Current stock: [X] units
Avg daily sales: [Y] units/day [VERIFIED from Shopify orders API]
Days until OOS: [X/Y] days
Recommendation: Reorder [Z] units (30-day supply)
Lead time (BuckyDrop): ~7-14 days
Tag sales velocity data:
[VERIFIED] -- calculated from actual Shopify order data via API[ESTIMATED] -- calculated from limited data or extrapolated[UNVERIFIED] -- from memory or conversation, not confirmed against APIadmin.shopify.com/ordersweb_search (minimum 3 sources)File: workspace/memory/shopify-audit.jsonl
Every product mutation (create, update, delete, price change, status change) gets a JSONL entry:
{"timestamp": "2026-03-31T14:30:00Z", "action": "price_change", "product_id": "123", "product_title": "...", "changes": {...}, "reason": "...", "tier": 1, "verified": true, "operator": "fsuelsbot"}
| Field | Required | Description |
|---|---|---|
| timestamp | Yes | ISO 8601 UTC |
| action | Yes | create / update / delete / price_change / publish / archive |
| product_id | Yes | Shopify product ID |
| product_title | Yes | Human-readable name |
| changes | Yes | Object with before/after for each changed field |
| reason | For price changes | Why the change was made |
| tier | Yes | Permission tier used (0, 1, or 2) |
| verified | Yes | Was read-back verification performed? |
| operator | Yes | "fsuelsbot" or "francisco" (manual) |
All data claims in reports and alerts must be tagged:
[VERIFIED] -- data retrieved directly from Shopify API or admin in this session[ESTIMATED] -- calculated/derived from verified data with stated assumptions[UNVERIFIED] -- from memory, conversation, or external sources not confirmed against ShopifyIn addition to the main audit log, price changes are also tracked with full context:
{
"timestamp": "...",
"product_id": "...",
"old_price": 34.99,
"new_price": 31.99,
"change_pct": -8.57,
"reason": "...",
"margin_after": 45.2,
"approved_by": "tier1_auto",
"rollback_price": 34.99
}
The rollback_price field enables instant recovery if a price change needs to be undone.
| Failure | Detection | Response |
|---|---|---|
| Shopify API 429 | HTTP status code | Exponential backoff, 3 retries, then queue |
| Product not found (404) | HTTP status or empty search | Verify ID, search by title, report if missing |
| Conflict (409) | HTTP status | Re-fetch, merge, retry once |
| Auth failure (401/403) | HTTP status | Check session, report to Francisco |
| Network timeout | No response within 30s | Retry once, then queue for later |
| Price exceeds +/-10% | Pre-change calculation | Block, escalate to Tier 2 |
| Price below margin floor | Pre-change calculation | Block, report margin violation |
| Read-back mismatch | Post-flight comparison | Retry field, rollback if persistent |
| Browser element not found | Selector fails | Fall back through TOOLS.md chain |
| Audit log write fails | File write error | Retry, then log to /tmp as fallback |
DO NOT:
ALWAYS:
workspace/memory/shopify-audit.jsonl