TIXMAFIA

Overview

Where the money is right now: what you paid, what is still unsold, what you earned, and what has not reached the bank yet.

By event

EventDateTickets SoldCostNet ProfitROI

Inventory & P&L

Each row is a batch of tickets. Every sale is summed, cost is allocated per ticket including buying fees, and quantity listed is checked against quantity left. Click a row to open its listings and sales.

Positions

EventSectionQty Cost/eaExposureGross FeesNetProfit MarginROIStatus

Import from CSV

Paste an export from any marketplace or ticketing site. Column names are matched across common variants and languages, one file can hold many events, and unusable rows are reported rather than dropped silently.

Cashflow & payouts

When capital actually unlocks. Marketplaces pay after the event, not after the sale — a ticket sold in August can be money you cannot touch until October.

Expected payouts

Expected dateEventMarketplace QtyNetCumulative

Repricer

Standing rules that run on their own: sit a set amount below the section floor, never below your cost guard, on a schedule. Any error or implausible reading freezes the listing instead of repricing blind.

Listings

ListingSectionPrice FloorΔRuleStatus

Bulk rules

A single flat floor across listings bought at different prices is what makes bulk repricing dangerous — far above cost on the cheap ones, below cost on the expensive ones. The relative modes work the floor out from each listing’s own cost, and a listing with no cost recorded is skipped rather than given a guess.

Activity

Sales Tracker

Repeated snapshots of an event's public market. Comparing them shows how much quantity left, from which sections, and how the floor moved. We say exits, not sales: a listing that disappears may simply have been pulled.

Tracked events

EventDateMarketplaceQty on market ExitsFloor nowΔ floor Last snapshot

Sales feed

SeenSectionPrice QtyValueNote
No marketplace publishes other people's sales — the official API returns only your own. Every tracker on the market, including the ones you pay for, infers sales by polling the public board and diffing it. That is exactly why two of them show identical sales at identical prices: same public data, same inference.

The precision is in the classification, so this splits what others merge:
Reported — read from an actual sales record, not a board that changed. A seller account with invoice-level access sees real transactions, and nothing inferred outranks them. Capture an invoice page with the companion and tell it whether the rows are your own sales or the whole event's.
Confirmed — the listing is still up with fewer tickets. Sellers almost never hand-edit a quantity downward, so this is as close to a receipt as the public board gets.
Likely — the whole listing is gone. Sold out, pulled or expired look identical from outside, so it is counted separately rather than folded into one flattering total.
A seat that reappears at another price is a reprice and is dropped entirely. Matching on section + row + price — or the marketplace's listing id when the page exposes one — is what keeps two same-priced listings in one section from being confused.

Fulfillment

Transfer queue. The split plan is computed for you — flows that refuse to leave a single ticket last get a valid plan automatically — and the transfer OTP is read from your own mailbox instead of being typed in.

Transfer queue

CreatedPlatformQtySplit plan RecipientOTPStatus

How the OTP is fetched

Set IMAP_HOST, IMAP_USER and IMAP_PASS in the environment, using a dedicated app password you can revoke on its own. The mailbox is opened read-only, only recent messages from expected sender domains are scanned, and a number counts as a code only when a word like "code" or "OTP" sits next to it — an order reference is never mistaken for an OTP. Nothing is deleted, moved or marked as read.

Official seller API

StubHub and Viagogo publish the same seller API on two hosts, so one client drives both: pull your listings and sales, push price and quantity changes. This is the stable route — no page scraping, no breakage when a layout changes.

Connections

SiteEndpointModeStatus Last pull

Operations

BackupWhenSize

Getting access

Access is granted per partner, not self-serve. Email api.support@stubhub.com (or affiliates@viagogo.com) describing the tool and your rough volume; they issue a client id, a client secret and the token URL.

Then set these in the environment and restart: STUBHUB_CLIENT_ID, STUBHUB_CLIENT_SECRET, STUBHUB_TOKEN_URL — and the VIAGOGO_ equivalents. MARKETPLACE_SANDBOX=0 switches to production; MARKETPLACE_WRITES=1 allows pushing changes.

Both default to the safe side. The client starts in sandbox and read-only, because a wrong write against a live seller account cannot be undone. Watch a few pulls land correctly before you let it write.

Why ExternalId matters

Their API lets a listing carry our identifier. Every listing pushed from here carries its position id, which turns reconciliation from guessing by event name into an exact join — and makes a repeated create idempotent instead of a duplicate. A full pull is treated as complete; an incremental one never is, because a delta shows only what changed and treating it as the whole picture would deactivate everything else.

Endpoint probe

Found a seller-portal endpoint that returns something useful? Open it while signed in, paste the response here, and this works out what it contains — which arrays are records, what each field means, and whether the set is sales or listings.

Paste a response

Before you paste

Strip anything personal first — buyer names, addresses, payment details. Nothing here needs them, and what does not get pasted cannot leak.

Rows imported this way land as reported sales, the same tier as invoice data, because they come from a record rather than from a board that changed. If the analysis says listings rather than sales, that is the tell: an offer has a price but no date, a trade has both.

Alerts

Only things that cost or make money: over-exposure, a ticket that will not open, stock unsold as the date closes, a payout that has not landed. Each condition fires once and then goes quiet until it changes or its cooldown passes.

Inbox

SeverityWhatWhere When

Where alerts get sent

Critical alerts go out the moment they fire — over-exposure and a ticket that will not open are both losing money while you read this. Everything else waits for one daily digest, because a channel you mute is worth nothing.
WhenWhatResultDetail

Thresholds

Muted

Cross-listing

One pool of tickets, several marketplaces. When a sale lands, exposure elsewhere has to come down fast — a double sell costs a penalty, a refund and a strike. Reductions are ordered by net yield, so what stays live is what actually pays best.

Exposure by position

PositionAvailableListed Over byUnexposedChannels Tolerance

Action queue

PositionMarketplaceAction QtyNet/eaWhy Status
Marking a reduction done applies it to the listing here as well, so the books match what you just did on the marketplace. It does not reach out and change anything by itself.

Tickets & delivery

Seat-level tickets, a pre-flight check so a ticket that will not open is found days out instead of at the turnstile, and delivery links for static barcodes.

Delivery readiness
most urgent first

SeatBarcodeDays to event RiskReason
Open each ticket in the provider's own app and confirm the barcode actually renders, then mark it here. An app that refuses to show a code is a box-office visit when you find it a week early, and a lost sale when you find it at the gate.

Tickets

PositionSectionRow / seat BarcodeTypeStatusLast check

Delivery links

CreatedRecipientTickets ViewsExpiresStateLink

Rotating barcodes

Tickets marked dynamic cannot be put in a delivery link, and that is not a limitation worth working around: a rotating code regenerates every few seconds, so a captured frame is already dead by the time a buyer reaches the gate. Those go through the transfer queue, early enough that a broken app is still fixable.

Browser companion

A small extension that reads the ticket page you are already signed into and looking at, and sends it here. It runs only when you click Capture — no automated login, no proxy rotation, nothing running in the background.

Pairing

Rotating the token immediately disconnects any browser holding the old one. Do it if you ever paste it somewhere you shouldn't have.

Pending captures

EventDateSeatOrder BarcodeSourceCaptured
Captures arrive as drafts, never straight into the books. Cost is left at zero — a page listing your seats does not know what you paid for them, so fill it in on the position rather than letting a guess become a P&L number.

Install

1. Open chrome://extensions and turn on Developer mode.
2. Click Load unpacked and pick the companion folder inside this project.
3. Open the extension, expand Connection settings, paste the token above and the dashboard URL, then Save.
4. Go to a "my tickets" page on Ticketmaster, AXS, the Eventim chain, TicketOne, Vivaticket or See Tickets — or a marketplace event page on Viagogo, StubHub, Ticombo or Gigsberg — and hit Capture.

Retailer pages become inventory drafts; marketplace pages become Sales Tracker snapshots. On a marketplace, tell the extension whether the prices shown are gross or seller payout — comparing one against the other is how a tracker ends up lying to you.

Capture log

WhenSourceWhatRows

Email import

Every purchase leaves an order confirmation behind. This reads your mailbox, recognises which ticketing site sent each message, and extracts event, date, venue, section, quantity and price. Results are drafts you confirm — parsing free-form email is heuristic, and a wrong figure entering the books quietly is worse than one you have to check.

Scan

ProviderEventDateSection QtyTotalCost/ea OrderConfidence
No drafts. Run a scan.

Recognised senders

GroupProviderCountrySite Sender domainsVerified

Marketplaces

Where you sell. Commission and payout delay drive net revenue, profit and every payout date, so these are the two numbers worth getting right — check them against your real contracts, the defaults are only a starting point.

Resale marketplaces

MarketplaceRegionCommission % Flat feePayout days ConnectionAccount

How connections work

CSV works today: export from the marketplace, import on the Inventory page, export back when you need to push changes.

Browser session is the next step — you sign in yourself and the tool works inside that session. There is no automated mass login with proxy rotation and CAPTCHA solving here: that stack breaks every time a platform updates its bot detection, and a repricer that dies quietly on a match day is worse than none.

Official API is the best case where a partner programme exists and you are accepted into it.

Ticketing accounts

Where you buy — Ticketmaster, AXS, the Eventim chain and the rest. Kept apart from marketplaces on purpose: different lifecycles, different failure modes.

No passwords or session cookies are stored here, by design. Until a real integration exists, holding credentials would be pure risk. When one lands, secrets belong in an encrypted store keyed outside the application — never in a file beside your data.

Accounts

ProviderGroupCountryLabelEmail ProxyStatus

Tax & VAT

VAT on tickets varies by country and event type, and in most countries also by the organiser's legal nature, your contractual role, and sometimes the ticket price or the region. Country notes record those cases instead of flattening them into a number that would be wrong.

Reference data for software, not tax advice. Rates verified August 2026 — they move with annual budget laws, so re-check every January. Anything unverified stays blank and the export names the fallback it used. Have an accountant validate before filing.

Your role as seller

This is the single most consequential setting on this page. Reselling in your own name means VAT is due on the full sale price — there is no margin scheme for ticket resale, because the EU margin scheme covers second-hand goods and a ticket is a right of access. Acting as a disclosed agent, in the organiser's name, means VAT is due on your commission alone. The bookkeeping export follows whichever you pick.

Rates by country and event type

CountryStandardConcerts SportTheatreOther
Enter a number, or exempt, or leave blank for "to verify". Click a country to read its notes.

New position

Country and event type decide which VAT rate the bookkeeping export applies.

Listing

Sits undercut below the section floor, never dropping under the minimum. Set the minimum above your cost — that guard is what stops the bot dumping your inventory.

Track an event

Declaring it keeps comparisons honest: a payout figure and a gross figure are not the same number, and mixing them silently produces nonsense.

Manual market snapshot

One line per listing: section;price;quantity. Until a collector is connected this lets you start building history by hand.

New transfer

Add tickets

Barcodes come from the PDF or confirmation email the provider sent you — the email import fills them in automatically when it finds them. Apps with rotating codes never expose one; mark those dynamic and send them through the transfer queue.

Create delivery link

The link carries only the tickets you ticked — never anything else on the same account. Every opening is logged, and you can revoke it instantly.

Register ticketing account

No password field, by design — see the note on the Accounts page.

Add marketplace

Country notes