TANITARDevelopers
Dashboard guide

Shop

Write, publish, restock and retire shop listings from Dashboard → Shop, and handle orders, fulfilment and reversal.

Your shop sells awards, codes and manually delivered items to your players, priced in your own currencies. Dashboard → Shop is where you write the catalog: listings with a price, what they deliver, their stock, a per-player limit and an optional scheduled discount. You then publish, revise, restock or retire them. Players see published listings in the Shop tab of /player.

Every price, discount and availability figure on the page is read back from the service. The page never computes what a buyer pays.

Shop catalog administration

The catalog

The Catalog section lists your listings with their status, effective price, any running discount and availability. Filter by Filter status, Filter category and Filter group key, then select Filter. Refresh catalog reads it again.

A listing moves through three statuses:

StatusAvailable actions
draftRevise, Publish, Load units into (code pools only)
publishedRevise, Retire, Load units into (code pools only)
retiredNone. A retired listing cannot be revised, published or restocked; orders already settled against it are unaffected

Author a listing

  1. Select Author a listing. The Author a Shop listing dialog opens.

  2. Describe it: Listing key (lowercase words joined by hyphens, for example gold-skin-pack; it cannot change later), Title, Description, Category, Media URL, and optionally a Group key and Group order to arrange listings together in the player's shop.

  3. Pricing: pick one of your published currencies in Currency and enter a Price as a whole number of that currency's smallest unit.

  4. Fulfillment and stock: choose what a purchase delivers and how many there are.

    FulfillmentDelivers
    awardA published award definition, chosen in Award definition
    codeA code from the listing's code pool
    manualSomething your team delivers by hand
    Stock policyMeaning
    unlimitedNo stock limit
    countedA counter set in Units left
    code-poolOne unit per loaded code; stock by loading codes
  5. Purchase limit (optional): tick Limit purchases per Player, then set Purchases per Player and a Window of day, week or total. Without a limit a player may buy as often as stock allows.

  6. Scheduled discount (optional): tick Schedule a discount, choose a Discount kind (percentage off, or an absolute reduction in the listing's currency), and set Discount starts and optionally Discount ends. Whether a discount is running is decided by the service at read time.

  7. Select Create draft. The listing appears as draft.

Publish

Select Publish on a draft and confirm. Publishing puts the listing on sale for every player of your tenant at the price and discount window it currently carries.

Revise

Select Revise to open the listing with its current values. Everything you save becomes the listing's new shape. A published listing re-runs every publish rule and is announced to buyers under a new revision.

For a counted listing, Units left replaces the counter; it does not add to it. Units that sell while the dialog is open are never put back. If you leave Units left as it was, saving keeps every sale made in the meantime. If you change it and a unit sold since you opened the listing, the save is refused, the dialog stays open with everything else you typed, and Units left is refilled with the count the listing holds now. Set the figure again and save.

Load codes into a code pool

  1. Select Load units into on a code-pool listing.
  2. Paste the codes into Units, one per line: at most 500 per load, each up to 256 characters.
  3. Select Load units. The Restock outcome shows what was accepted.

Each code is encrypted before it is stored, and no catalog or order read ever returns it.

Retire

Select Retire, optionally give a Reason, and confirm. Retirement is terminal.

Orders, fulfilment and reversal

A player's checkout is one all-or-nothing operation that never charges twice. The Order queue section of Dashboard → Shop shows the latest 100 matching orders, newest first. Filter by Filter order status, Filter listing key and Filter player id, then select Filter orders. Refresh orders reads the queue again. Each action needs org:admin and its own scope on the key behind the dashboard, so that no single permission can both edit the catalog and move value back:

ActionOffered onScope
Claim a manual order to work onawaiting-fulfillmentshop:fulfill
Complete a claimed manual order, with an optional Delivery notein-progressshop:fulfill
Reverse an order and refund the playersettled, awaiting-fulfillment, in-progress, fulfilledshop:reverse
Disclose code sold with an order (break-glass)settled orders that delivered a codeshop:disclose-code
  • Complete records the order as fulfilled and notifies the buyer. If the order had already been completed with a different note, the dialog says so and shows the note the service holds rather than yours. The queue then shows who completed it.
  • Reverse asks for a Reason code (uppercase letters, digits and _), a Reason, and, for an order that delivered a code, a tick on The delivered codes cannot be recovered. You enter no amount: the service refunds exactly what the order's own debit took, and the dialog shows that refund, the ledger operation and what happened to each line. Stock is not restored; load units again if they should be sold. Reversed and cancelled orders show their full reversal record in the queue.
  • Disclose code is a break-glass action. You must give a Reason for this disclosure. Every disclosure writes an audit record with your reason, the order and the credential that read it, and disclosing again writes another. The codes are shown once, in the dialog only, and are cleared when you select Close and clear. The dialog cites the audit record's id so you can quote it in the support conversation. shop:disclose-code is granted on its own and no other Shop scope implies it, so if the dashboard key does not hold it the action is removed after the first attempt until you reload the page.

The dashboard acts through one shared credential, so claims, completions, reversals and disclosures are all recorded against that credential, not against you as an individual operator.

The same actions are available through the Shop API:

TaskRouteScope
Read ordersGET /v1/shop/ordersshop:read
Claim a manual order to work onPOST /v1/shop/orders/:orderId/claimshop:fulfill
Record a manual order as fulfilledPOST /v1/shop/orders/:orderId/fulfillmentshop:fulfill
Reverse an order and refund the playerPOST /v1/shop/orders/:orderId/reversalshop:reverse
Disclose a code sold with an orderPOST /v1/shop/orders/:orderId/code-disclosuresshop:disclose-code

See Orders and Reversal. Players get an inbox notification, and your webhook endpoints an event, at each step of the order lifecycle.

What can go wrong

What you seeWhyWhat to do
You have read-only access in the dashboard.Your dashboard role is org:memberAsk an admin
A notice starting Shop administration requires followed by a scopeThe key behind the dashboard does not hold shop:mutateContact Tanitar; controls stay disabled until the next successful read
No currency offered in CurrencyA listing can only be priced in a published currencyPublish one under Dashboard → Economy
No award offered in Award definitionOnly published award definitions can be soldPublish one under Dashboard → Rewards
The Shop service could not be reached.The service did not answerCheck your connection and select Refresh catalog
A listing cannot be revised or restockedIt is retiredAuthor a new listing
A notice that claiming and completing require shop:fulfillThe dashboard key does not hold shop:fulfillContact Tanitar; claim and complete stay disabled until the next successful read
A notice that reversing requires shop:reverseThe dashboard key does not hold shop:reverseContact Tanitar; reverse stays disabled until the next successful read
A notice that the dashboard key does not hold shop:disclose-codeThat scope is granted on its ownContact Tanitar; Disclose code is removed until you reload the page
SHOP_CODE_LOSS_UNACKNOWLEDGED when reversingThe order delivered a code and the loss was not acknowledgedTick The delivered codes cannot be recovered
SHOP_ORDER_NOT_REVERSIBLE or SHOP_ORDER_TRANSITION_CONFLICTThe order changed state, for example the player cancelled itThe queue is refreshed; read the order's new status
SHOP_CODE_UNAVAILABLE when disclosingThe order no longer holds a code, for example it was reversedNothing to disclose

On this page