GMS × Sparkart
Internal · Process Walkthrough

Holiday Sale Automation

How a holiday sale gets set up on a Global store today, and where a tool could do the work.

Manual today A tool could do this Depends on the app vendor TrackedStatus shown automatically on the sale dashboard
Sale planned
Asana project created
Automate
Asana · Google Sheet
Get sale details from the Asana parent task
Sale link, bucket links, start and end date/time, phrasing
Tracked
Could do: flag missing details and nudge the store manager in Asana, instead of us chasing

Starting with BFCM, a sale dashboard replaces the tracker sheet: sale details plus live asset, email and ad status, and the buttons for our review steps.

Discount setup
Runs at the same time as marketing
Sitewide or collection-based?
Sitewide
Use the store’s sitewide sale collection (already excludes media, POD, pre-sale)
Collection-based
“Up to __% off.” Store manager fills a sub-collection per 10% bucket
↻ Repeat per bucket
Vendor?
GetSale
Name the discount
SALE NAME - __% OFF
Vendor?
GetSale
Choose the collection
Vendor?
GetSale
Choose the discount depth
Vendor?
GetSale
Schedule start and end
Depends: no public API. It lists Shopify Flow support, so ask the developer (506) if Flow can create a sale. If not, our own tool could set sale and compare-at prices directly, the same thing GetSale does.

Save, then duplicate for the next bucket and swap the collection and depth. Discounts are never combined.

Why GetSale: strikethrough pricing sitewide, and real price changes for post-sale analysis. Shopify discounts only apply at cart.

Marketing
Runs at the same time as discounts
Global assigns asset task to?
Global’s creative team
Sparkart
Kevin assigns to Cade
Asana
Art folder shared
Public Dropbox or G-Drive link
Global
Artist management approves
Tracked
Store banners
Automate
Shopify
Duplicate the current theme
Could do: Shopify’s API can copy a theme. Needs theme write access, so test on one store first.
Automate
Shopify
Swap desktop and mobile banners
Link to the sale collection. Save, don’t publish.
Could do: pull the Desktop and Mobile files from the art folder (the campaign bot already does this for email heroes) and set the link from the sale details
Vendor?
Theme On Time
Schedule publish and revert
Depends: no API. Our own tool could replace it: publish the sale theme at start, the old theme at end.
Paid ads
Automate
Paid Ads Sheet
Request the ad
Copy comes from Global Marketing in Asana
Tracked
Could do: once assets are approved, fill the request row from the Asana Marketing task (store, copy, art link, dates)
Speakeasy · Meta
Speakeasy builds the ad
Sends us a preview link
Automate
Sparkart
Preview lands in front of us
Could do: send new preview links to the sale dashboard (with a Slack ping), not to the client
We clear it for the client?

No: edits go back to Speakeasy

Automate
Asana
Post preview link for approval
Could do: once we mark it cleared, post the link in Asana
Automate
Paid Ads Sheet
Mark approved
Speakeasy then schedules the ad
Could do: flip the ads sheet when Asana is approved (the tracker already reads both)
Email
Partly automated
Klaviyo
Draft the email
7 stores: the Campaign Bot drafts it. The rest: Kevin, sometimes Derrick, by hand.
Could do: move more stores onto the bot once Global approves them (Klaviyo keys already exist)
Partly automated
Asana
Post .eml for approval
The bot already posts it for its 7 stores. Manual for the rest.
Tracked
Could do: post it for every store, including hand-drafted emails
Klaviyo
Schedule once approved
Manual. The bot never sends or schedules, by design.
Sale launches
Automate
QA · Incognito
Launch check
  • Everything in the sale shows strikethrough pricing
  • Banners are live and linked correctly
Could do: check every product in the sale collection for a sale price, and the live theme’s banner link, then flag misses on the dashboard and in Slack

Usual miss: product has the sale tag but isn’t in the sub-collection that drives the discount.

Sale ends
Automate
QA · Incognito
End check
  • All discounts have stopped
  • Banners have reverted
Could do: same check in reverse
Proposed

Sale dashboard: mission control

One page per sale that replaces the tracker sheet. It reads every source live, shows where each store stands, and puts anything that needs us at the top with a button to act on it.

Sale dashboardConcept · example data

BFCM 2026 · Setup

Sale starts in 12 days
Details complete
18 / 26
Discounts scheduled
11 / 26
Banners scheduled
7 / 26
Ads live or approved
4 / 13
Needs us 4
DETH
Meta ad preview ready from Speakeasy
Not visible to Global until cleared
Send backClear for client
MAST
Banner theme built, unpublished
Desktop and mobile art pulled from the approved folder
Preview themeApprove schedule
STPI
Missing bucket links and end time
Store manager nudged in Asana 2 days ago
Nudge again
DETH
QA: 3 products in the sale show no sale price
Tagged for the sale but not in a bucket collection
See products
Every store
StoreDetailsDiscountsBannersEmailAdQA
DETHCompleteScheduledScheduledSent/ScheduledNeeds our review3 misses
MASTCompleteScheduledNeeds our reviewPreview ProvidedOut for ApprovalAfter launch
STPIMissing 2Waiting on detailsWaiting on assetWaiting On AssetNot StartedAfter launch

Statuses use the tracker’s existing vocabulary. Store rows and numbers are illustrative.

Reads live

  • Asana: sale details, asset and ad approvals
  • Klaviyo: email drafts and sends
  • Paid ads sheet: ad status and previews
  • Shopify: sale prices, banner themes, QA checks

Does the work

  • Nudges store managers for missing details
  • Builds banner themes and fills ad requests
  • Queues ad previews and themes for our review
  • Runs QA at launch and end, flags misses

Who sees what

  • Sparkart: everything, plus the action buttons
  • Global: sale details and status, via emailed login code
  • Ad previews reach Global only after we clear them
  • Starts with BFCM, no tracker sheet in parallel
Access

Keys: what we have vs. what we need

Most access already exists through the campaign bot and the sale tracker. The gap is Shopify: every store app is read-only today.

Readyhave it today Gapneeds new access Confirmneed to check or ask Not neededoutside the build
SystemHave todayNeeded forStatus
Shopify · themesNone. Store apps are read_products only (37 stores).Duplicate theme, swap banners, scheduled publish and revert, banner QA. Needs theme read/write plus file upload for the banner art. Each store approves the app update. Shopify’s docs say theme writes may also need an exemption, so test on one store first.Gap
Shopify · pricesNoneOnly if we replace GetSale: product write to set sale and compare-at prices.Gap
GetSaleNo APICreating and scheduling sales. Ask 506 whether its Shopify Flow support can create a sale.Ask vendor
Paid Ads sheetRead, through the tracker’s Google loginFilling ad request rows and marking ads approved. Check that login has edit rights on the sheet.Confirm
Shopify · productsread_products app on 37 storesQA: checking every sale product has a sale priceReady
AsanaBot account with Commenter access on the Marketing 2026 Plan boardReading sale details and approvals, nudging store managers, posting cleared ad previewsReady
KlaviyoA key per storeEmail status on the dashboard, and moving more stores onto the Campaign Bot (needs Global’s OK, not new keys)Ready
Drive · DropboxGoogle API key, Dropbox appPulling desktop and mobile banner art from approved foldersReady
Dashboard loginServer plus emailed-code login for Sparkart and Global emails (campaign bot)Hosting the sale dashboardReady
SlackWebhook and botPings for previews to review and QA missesReady
Theme On TimeNo APIReplaced by our own scheduled theme publishNot needed
Meta AdsNoneSpeakeasy still builds and schedules adsNot needed