# Paddle Catalog Sync Rollout

- [x] **Schema Prep**
  - [x] Add migration for `paddle_sync_status`, `paddle_synced_at`, and `paddle_snapshot` JSON on `packages`.
  - [x] Update `Package` model casts/fillable + ensure factory coverage.
- [ ] **Service Layer**
  - [x] Scaffold `PaddleCatalogService` (product/price CRUD, custom data mapping).
  - [ ] Add DTO helpers for Paddle product/price responses.
  - [ ] Extend `PaddleClient` tests/mocks for catalog endpoints.
- [x] **Sync Logic**
  - [x] Implement `SyncPackageToPaddle` job with create/update flows and metadata diffing.
  - [x] Create `PaddlePackagePull` job for optional remote-to-local reconciliation.
  - [x] Add `paddle:sync-packages` artisan command (`--dry-run`, `--package=`, `--pull`).
- [ ] **Admin UX**
  - [x] Enhance Filament PackageResource with sync status badges + last sync timestamp.
  - [ ] Add table/detail actions (“Sync to Paddle”, “Link existing Paddle entity”).
  - [ ] Surface last error/log context in the admin sidebar panel.
- [ ] **Ops & Observability**
  - [ ] Configure dedicated log channel/Slack hook for catalog sync outcomes.
  - [ ] Document failure recovery playbook (retry, unlink, support escalation).
- [ ] **Testing & QA**
  - [x] Unit tests for service + jobs using mocked Paddle API.
  - [x] Feature test covering artisan command flow.
  - [ ] Playwright smoke to confirm admin sync action displays status.
- [ ] **Rollout Checklist**
  - [ ] Seed Paddle sandbox catalog via MCP server using migrated data.
  - [ ] Verify legacy packages mapped to Paddle IDs before enabling auto-sync.
  - [ ] Announce workflow change to admin users (release notes + docs update).
