- Wrap barcode generation in try-catch to prevent 500 on invalid GTIN - Move barcode preview above GTIN input field - Add input mask (X XXXXXX XXXXXX) and strip non-digits before save/render - Only render barcode when >= 8 digits present - shopify:sync now updates price alongside inventory Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Log clear hint for 403 (IP whitelist), 401, 429, 5xx. Commands exit with failure and print error when API returns no data. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Migration: shopify_variant_id on products_sizes, shopify_order_id on products_sales - ShopifyService: paginated REST client (2024-10 API) - shopify:map — one-time command to link variants by SKU - shopify:sync — reconciliation command (Shopify is master) - VerifyShopifyWebhook middleware: HMAC-SHA256 verification - ShopifyWebhookController: idempotent orders/paid handler, FIFO inventory deduction - Webhook route: POST /api/webhooks/shopify/orders-paid Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>