Wulf Gaming

Wulf Purchasing

Sign in with your Wulf Gaming Google account to continue.

Sign in with Google
Wulf·Purchasing

Hi

–Total products
–Units available
–Products out of stock
–Last stock change

Catalog

Every product in Shopify, and what is on the shelf right now. Backfill brings in anything not here yet — all of it, whatever the product type.

Customers

Everyone Shopify holds, mirrored here so the rest of the portal can name and reach them.

Orders

Every Shopify order the portal holds, with what it was worth and who placed it.

Revenue

Net of refunds, excluding cancelled and test orders.

Channels

Where the money came in.

Product types

What is carrying the range. This is the one that decides what gets bought next.

Top products

By revenue in the selected range.

Customer value

Lifetime, not the selected range — a lifetime value measured over 30 days is not one.

Retention

Each row is everyone whose first order landed in that month, and how many of them came back later.

The mirror

These reports read a local copy of Shopify orders, refreshed nightly.

Launch allocations

Decide who gets a high-demand release: pick the launch’s products from the catalog, prioritise by customer tags, narrow by store and recent orders, and get one ranked list for everything on hand.

New launch

Nothing is saved or written to Shopify until you say so.
Every product in the launch, from the catalog. Each has its own quantity and limit, and they share one ranked list: with 24 boxes and 60 playmats, the top 24 get a box and the top 60 a playmat.
Points for each tag a customer carries. Highest total goes first; the tiebreak settles equal totals.
Points for buying products with these tags — event entries, league fees, store play. Counting per week rewards playing consistently: ten entries bought at once count once, one a week for ten weeks counts ten.
Leave the window empty and set “at least” to 0 to ignore orders entirely.

Result

Promo loop

Trailers and promo images, played in this order on every screen they are set for. Videos play muted, full length; images for the seconds set. Upload 16:9 — 4K is best, and 1080p screens play a lighter copy.

Screens

Each TV runs its own link. Open it in the display's browser, full screen. If a link gets out, give the screen a new one — the old one stops working.

What the screens show

The side panel and the ticker. Events come from each store's calendar.
A full-screen slide of the cards whose prices went up most, built from the price tracker and slotted into the loop. It sits next to the buylist QR, so a card going up points straight at selling it to you.
–Last fetched

BoardGameGeek

Board games carrying a bgg.id metafield get their rating, weight, player counts, mechanics and categories filled in from BoardGameGeek. Link a game below or set the id in Shopify; everything else arrives on its own. Runs every five minutes, and refreshes ratings weekly.

Product changes

Every mirrored field that moved, as the catalog sync saw it. Metafields are not here — they change far more often and would bury a price change; BoardGameGeek imports has the bgg.* half.

Decklist orders

Orders with at least one card added by the decklist search. Each gets the order tag decklist, plus one per game (decklist-pokemon, decklist-mtg, …), within five minutes of checkout. The cards themselves carry a hidden _decklist property customers never see.

Price changes

Every price that moved on a tracked product type, per variant. Imported rows came across from the old tracker’s metafields; everything else was recorded here. Click a product for its chart, its full history and its recent sales.

Product

Open in Shopify

BoardGameGeek imports

Every fetch, including the ones that found nothing to change. A week with no entries at all means the job is not running – which looks the same as a quiet week until you look here.

Store events

Each store’s upcoming events come from its Google Calendar, linked from the location’s custom.events_calendar metafield in Shopify (Settings › Locations). Every calendar below is checked live against Google. The website caches events for up to ten minutes, so a fix here can take that long to show there.

Backfills

The long imports, and where each has got to. They walk one page at a time and survive being interrupted; a paused one is waiting to be picked up, not broken.

Background jobs

Scheduled integrations, and what each last did.
–On Card Singles
–Waiting to assign
–Needs a look

Assign singles to the Card Singles profile

New singles are queued automatically by the Shopify webhook. Backfill is for the ones that existed before that webhook did.

Needs a look

These stopped retrying. Fix the cause, then put them back.
–Assigned, last 24h
–Assigned, last hour
–Last webhook
–Waiting

Recent activity

Queued and assigned variants, newest first. Anything here that is not a single means the allowlist is wrong.

Profile tag backfill

Adds the profile-complete tag to every customer whose account carries enough to reach them. Scanning changes nothing — read the numbers, then apply.
An address record existing is not enough on its own. Shop Pay and Login with Shop create addresses holding only country and ZIP.
These arrive with real names and real shipping addresses but relay emails at connectebay.com that cannot receive marketing. They pass every check above. Leave both off for the first scan to see how many there are.

Scan results

Nothing has been written yet.
–Customers scanned
–Meet the criteria
–Already tagged
–Will be tagged
Applying writes to Shopify. There is no bulk undo — removing the tag afterwards means another full pass.

Why the rest did not qualify

Recent runs

Every scan and every apply, newest first.
–Last customer webhook
–Tagged, last 24h
–Untagged, last 24h
–Waiting to write

Keep the tag correct automatically

Shopify tells us whenever a customer is created or edited. Each one is judged by the rules on the Backfill tab, and the profile-complete tag is added or removed to match.
–
Judges that customer against the rules above and does exactly what a webhook would. The quickest way to prove this is wired up without editing a real account.

Needs a look

These writes stopped retrying. Fix the cause, then put them back.

Webhook activity

Every tag this rule has moved, newest first.
–Changes, 24h
–From orders, 24h
–Still pairing
–Last change

All stock changes

Every change to available stock, for every product at every store, with the order that caused it. Orders are matched from the orders database: sales, and the restocks of cancellations and refunds. Anything else — a hand correction, a transfer — shows as unexplained: Shopify's API has no adjustment history to say who.

All stores

Revenue nets off refunds, the same measure as the Reports page, so these rows add up to it.

Store

Top sellers

By units sold in this store.

Staff access

Each person gets exactly the permissions you tick.

Price tracker

Records every price change on the tracked product types, and keeps the storefront’s price chart (custom.price_history) and recent sales (custom.transaction_history) up to date.

Refresh one product

Reads one product from Shopify now, imports its existing history if that has not happened yet, logs any price that moved, and rewrites both metafields. The safe way to try the whole path on a single product before turning the tracker on — a dry run shows what it would do without writing anything.

Tracked product types

One per line, spelled exactly as Shopify spells the product type. A type added here is picked up by the next morning read; a type removed stops being recorded but keeps its history.

Recent runs

Scheduled runs are the morning read, which records a point for every product. Queue runs publish what changed; one appears within five minutes of a price edit or a sale.

Sales channel updates

Why a product was taken off, or put back on, its marketplace sales channels — with the stock level and threshold behind each decision. Search by name, or paste a Shopify product ID.

Product

Open in Shopify

Sales channel rules

Each rule takes some product types off some sales channels when store stock reaches that product's in-store threshold. The threshold itself lives on the product, in the custom.instore_threshold metafield — a rule decides which channels, not when.
Rules are matched top to bottom and the first one that covers a product's type wins. A product no rule covers is left alone.

Safety settings

Two settings that decide how the rules are applied, rather than what they say. Both are saved with the rules.
This must match the In store Inventory Utility channel. That channel hides the add-to-cart button on the website from the same metafield. If it hides the button at “at or below” and this gates at “below”, there is a window where a marketplace still lists the product and the page it links to cannot be bought from.
If a scheduled or manual run would change more products than this, it stops and changes nothing — and the run detail lists what it would have done. This is what catches a threshold set wrong across the catalog before it pulls everything off five channels.
A dry run ignores it on purpose, so a preview always shows you the real number. Raise this before a first baseline run if the dry run says more products would change than the limit, then put it back.

Scripts

Automations that change the live Shopify store. A dry run reads everything and writes nothing — take one and read the action list before enabling anything.

Run history

Every execution, including the dry runs. Click a run to see what it decided about each product.

Run

–Products gated
–Waiting to be decided
–Gave up retrying
–Gate

Currently gated

Products the gate has taken off its marketplace channels because store stock reached their threshold. All of them are still on the Online Store, the till, and the in-store utility channel — the product page works, the buy button is what the theme hides.

Integrations

Checked live, every time you open this tab.