Problem: weekly pricing was updated by hand. Solution: fully automated supplier price synchronization, running itself on a schedule.
the problem
Every week, someone logged in to SiteOne Canada, downloaded a price-list spreadsheet, and keyed updated prices into Shopify one by one. With 1,000 SKUs in the catalog, this took hours, introduced errors, and was the first thing to slip when things got busy.
the approach
Playwright triggers SiteOne Canada's normal Excel price-list download (no scraping). openpyxl parses the .xlsx and extracts SKU and retail-price columns. A Shopify GraphQL client compares incoming prices against the live catalog and sends only the changed variants as batched mutations. GitHub Actions runs the pipeline daily, stores the sync report as a workflow artifact, and costs $0.
how it happened
Playwright authenticates with SiteOne Canada and triggers its standard Excel price-list download (no scraping)
openpyxl parses the .xlsx, extracting SKU and retail-price columns from the raw row data
A Shopify GraphQL query fetches current variant prices; only the delta set is sent as mutations, not the full catalog
Bulk GraphQL mutations update changed prices with rate-limit-aware batching to avoid Shopify API throttles
GitHub Actions stores sync_report.json and sync.log as workflow artifacts, giving every run a searchable audit trail
built with
next up