Skip to content

Sales tracking

Tickong notices when one of your SkyBox listings sells by comparing your active inventory between ticks. There’s no webhook, no per-listing polling, no scraping — it’s a simple before/after diff.

Every tick, after Tickong has finished checking your inbox:

  1. Tickong asks SkyBox for your current active (AVAILABLE) inventory.
  2. Tickong asks SkyBox for sold inventory in a recent event window (14 days back, 730 days forward). This is the source of truth for what actually sold.
  3. It compares the AVAILABLE list to the snapshot from the previous tick. Anything that disappeared is a candidate sale.
  4. For each candidate, Tickong checks whether SkyBox’s sold list contains its inventory ID. If yes → real sale, recorded with the snapshot’s cost / list price / event details. If no → it was manually deleted or delisted; dropped silently, no sale row.
  5. The matching row on your Inventory tab is automatically marked sold (so it stops appearing as held). Tickong first tries to match by the SkyBox inventoryId it captured at auto-listing time. If that lookup fails (because the post-listing DB write didn’t happen, or because the listing was created on SkyBox outside Tickong), Tickong falls back to a fuzzy match on event date + section + row + quantity over held rows that still have no SkyBox id. If exactly one held row matches, Tickong marks it sold and back-links the SkyBox id onto it for next time. If multiple held rows share the same date/section/row/qty, Tickong refuses to guess and leaves them held — the operator marks the right one manually. Sold price = list price × quantity in both cases.
  6. The current state replaces the snapshot for the next tick.
  7. The same sold-inventory list also feeds a safety-net sweep that records any sale not already in your log. This catches sales the diff can’t see — listings you created on SkyBox outside Tickong, and listings that lived and died inside a single tick (listed and sold before the next snapshot ran). Same write path (sale recorded, inventory row auto-marked sold, webhook fired) and idempotent so re-runs don’t double-fire.
snapshot at last tick SkyBox now (this tick)
┌──────────┐ ┌──────────┐
│ inv 1001 │ ─┐ │ inv 1001 │
│ inv 1002 │ │ diff │ inv 1003 │
│ inv 1003 │ │ ─────▶ "1002 sold"
└──────────┘ │
│ → snapshot for next tick = {1001, 1003}

The very first tick after you enable SkyBox is a baseline only — no sales are recorded. Real detection starts on the second tick.

If you don’t want to wait two minutes for the first scan, click Scan now in the Sales tab.

SkyBox’s sold-inventory endpoint truncates older rows and lags slightly behind real time. The snapshot diff catches “between tick N and tick N+1, this listing disappeared” exactly. By cross-checking each diff disappearance against the sold endpoint, Tickong gets the best of both: fast detection of changes, plus authoritative confirmation that the listing was actually sold.

If you manually delete a listing from the SkyBox UI (you decided to keep the tickets, or you’re moving them to another marketplace), Tickong does not record a sale. SkyBox tombstones the row so it disappears from your active inventory and never appears in the sold list either — that’s the signal Tickong uses to tell deletes apart from sales.

A debug line is logged each tick listing how many disappearances were treated as deletions (visible in container logs if you tail them). Sales tab and Inventory tab stay untouched for those rows.

If SkyBox’s sold-inventory endpoint is unreachable on a given tick (network issue, 5xx), Tickong skips the entire sale-recording path for that tick rather than guess. The diff is read-only that tick; next tick retries. This trades a few minutes of detection delay for never recording a phantom sale.

Plug in a Discord, Slack, or generic webhook URL in Settings → Sale notifications and you’ll get pinged the instant a sale is detected. Tickong auto-detects the destination and shapes the payload accordingly:

  • Discord → styled embed with profit-coloured stripe, event title, seat block, cost/list/profit field.
  • Slack → header + 6-cell summary grid.
  • Anything else → generic JSON payload.

The webhook fires after the sale is durably committed to your workspace, so receiving the notification means the sale is in your Sales tab.

There’s a Test webhook button in Settings that fires a sample sale at your URL and reports back the receiver’s response.

ColumnWhat it is
Inventory IDThe SkyBox listing ID that disappeared
Sold atWhen Tickong noticed (typically within one tick of the actual sale)
Event / date / venue / city / stateFrom the snapshot
Section / row / quantityFrom the snapshot
CostPer-seat cost you paid (from the snapshot)
List priceThe SkyBox list price at the time of disappearance
PlatformIf Tickong saw the original purchase email, the platform name
Notion pageLink back to the Notion row, if Tickong saw the original purchase

Backfilled sales (from the Backfill from SkyBox button) use SkyBox’s lastUpdate field as a more accurate proxy for the actual sale time. SkyBox doesn’t expose a true sale timestamp, but lastUpdate reflects the last server-side modification — which approximates when the sale was finalised.

The dashboard’s Sales tab visualises everything Tickong has recorded:

  • Stat row — total sales, realised profit, average margin, sell-through.
  • Leaderboard — top events by Revenue / Profit / Margin / Volume / City.
  • Sales log — filterable, paginated table of every sale.

It draws from two sources, unioned at read time:

  1. SkyBox-detected sales — the snapshot diff above, plus the SkyBox backfill.
  2. Inventory-row sales — every ticket whose row on the Inventory tab is sold. This includes both your manual Mark sold actions (off-Vivid sales: StubHub, Viagogo, private buyer) AND the auto-marks that the SkyBox snapshot diff performs.

When a Vivid sale produces both a Sales-log row and an auto-marked Inventory row, the Inventory row is the one that drives the Sales tab — the Sales-log row stays as the audit trail of the disappearance. If you typed a manual sold price before SkyBox detected the disappearance, your price wins.

Two utility buttons:

  • Backfill from SkyBox — pulls your full historical sold inventory from SkyBox (5 years back to 5 years forward). Idempotent — existing rows are kept.
  • Scan now — runs the diff immediately. Use after first enabling SkyBox to set the baseline without waiting two minutes.
profit per sale = (list price − cost) × quantity

If the listing was created as a $9999 placeholder (because pricing was disabled and your default was $0), the profit math will be very wrong until you adjust it.

Roll-up across all sales:

avg margin % = (Σ revenue − Σ cost) / Σ cost × 100
sell-through % = sales / (sales + active inventory) × 100

Sell-through is a coarse proxy — accurate sell-through requires matching listings to events and accounting for time on market, which Tickong doesn’t currently model.