2026 · automation

My Rain Price Sync

scroll
1,000SKUs / run

Problem: weekly pricing was updated by hand. Solution: fully automated supplier price synchronization, running itself on a schedule.

PythonPlaywrightopenpyxlShopify GraphQLGitHub Actions

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

the process

01

Playwright authenticates with SiteOne Canada and triggers its standard Excel price-list download (no scraping)

02

openpyxl parses the .xlsx, extracting SKU and retail-price columns from the raw row data

03

A Shopify GraphQL query fetches current variant prices; only the delta set is sent as mutations, not the full catalog

04

Bulk GraphQL mutations update changed prices with rate-limit-aware batching to avoid Shopify API throttles

05

GitHub Actions stores sync_report.json and sync.log as workflow artifacts, giving every run a searchable audit trail

what came of it

The script runs every day and updates 1,000 SKUs in minutes. Audit logs are stored as GitHub Actions artifacts, giving every run a searchable record of exactly which SKUs changed and why. Total hosting cost: $0.

built with

PythonPlaywrightopenpyxlShopify GraphQLGitHub Actions
want to work together? →

next up

02Ferni Finance