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.

Deliveries

EventRouteQtyFrom account BuyerProofStatusTransfer
One job per sale, opened automatically when the sale lands, with the exact tickets allocated — not "two from this position" but which two. A job that cannot be built says why instead of being built on the wrong seats, and it cannot be marked delivered while it is blocked.

Mobile means the holding account transfers to the buyer's email, and the proof is a screenshot taken inside that account. E-ticket means handing over a file or barcode that already exists. The two share nothing, which is why the route is decided by the position's transfer mode rather than guessed at delivery time.

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.

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.

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.

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.

Connected mailboxes

MailboxHostFolderStatusLast scan
Without a mailbox here, "Scan mailbox" has nothing to read. Add your catchall Gmail (or any IMAP inbox) and the scan pulls order confirmations straight out of it. The password is sealed in the vault, never written in clear, and used read-only.

Gmail needs an App Password. Google refuses your normal password over IMAP: turn on 2-step verification, then Google Account → Security → App passwords → generate one, and paste the 16-character code here. The connection is proved with a real login before it counts as working.

AYCD Inbox — live OTP & order mail

The real AYCD integration, not a file. AYCD Inbox holds the mail for all your accounts — the codes and confirmations that are not on one master Gmail. Paste your Inbox API key (AYCD dashboard → Developer, it starts with Inbox-) and the dashboard pulls a one-time code for any account’s mailbox on demand, through AYCD’s cloud — no master inbox needed.

One operational note, stated plainly: a request only returns while your AYCD Inbox app is open and logged in — it holds the mailbox connections and does the fetching; the cloud is just the broker. If a code never arrives, that is almost always AYCD Inbox being closed, and the message says so.

Scan AYCD for order & sale email

This scrapes the mailboxes AYCD holds for your accounts — one targeted task per sender, through the Inbox API above — and feeds the orders and Viagogo sales into the same drafts and ledger the Gmail scan uses. It only returns while your AYCD Inbox app is open and logged in; if it is closed, the scan says so per mailbox rather than looking empty.

Fallback — paste an export instead. AYCD Toolbox can also export an Inventory (Inbox → Inventory → File → Export → CSV or JSON); paste it below and the orders land in the same review list. Columns are matched by meaning, so the exact header names do not matter; anything it cannot place is listed.
Nothing pasted yet.

Scan

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

Senders not recognised

When a scan skips mail because the sender is not a known ticketing site, the domains show here. Nothing is ever auto-accepted — a wrong figure entering the books quietly is worse than a missed one. If a domain really is an order sender, map it to the right provider and every future scan will read it.

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 StatusAccount

Connect Viagogo & StubHub directly

Authorise once with your own StubHub/Viagogo developer app (OAuth login) and the dashboard pulls your own seller listings and sales directly. StubHub.com and Viagogo are one platform, so one app serves both; StubHub Ireland is a separate connection.
Prefer not to register a developer app? You can instead connect by email — the dashboard reads the sale, payout, transfer and dispute messages Viagogo and StubHub send. Slower to react than a direct sync, and nothing to refresh, but the direct connection above is the one to reach for first.

Official seller API — optional

Watching for sales —
A sale is only worth catching in the seconds after it lands. This checks every connected marketplace on a timer and runs the same chain a manual entry does — pull the other listings, open the fulfilment job, send the notification — so it happens whether or not anyone is at the screen. Untested connections are skipped rather than retried into a wall of errors.
How partner access works — most brokers do not need this
Where the credentials come from. StubHub and viagogo run the same seller API on two hosts, and access is granted per partner rather than self-serve: write to api.support@stubhub.com or affiliates@viagogo.com describing your selling volume, and they issue a client id and client secret. Paste them above. The token endpoint is already known, so there is nothing else to configure.

Sandbox first. A new connection starts in sandbox and read-only. Writing to a live seller account cannot be undone, so listing stays switched off until you turn it on deliberately, per site.

Where the secret lives. Encrypted with the key held in VAULT_KEY, which is never written to disk. Only the site, the environment and the last test result are stored in clear — someone reading the data directory learns nothing worth stealing.

Ticketing accounts

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

Enter an email and password on a row, hit Sign in, and it connects. The password is sealed with a key held in VAULT_KEY (set in the environment, never written to disk — lose it and the stored credentials are unreadable, which is the point), then handed to the real login flow. It is never shown in this table and never returned by any API response. Ticketmaster, the Eventim chain (TicketOne) and Vivaticket sit behind bot management that refuses a server login, so those sign-ins finish in your browser companion or by email import — the row says which, honestly, and only turns green on a real session. AXS uses a token, linked in its own panel below.

Accounts

ProviderCountryRegionLabelEmail ProxyConnectionStatus

AXS — refresh your orders & tickets

AccountTokenLast refresh
This one is a real API, not a scrape. api.axs.com answers JSON and is not behind a challenge, so with your account’s token the dashboard reads your own orders and tickets straight from AXS — /v1/users/orders and /v1/users/tickets, the same endpoints the AXS apps call. Each order becomes a position, its seats become tickets, and anything AXS reports as listed or sold updates your books.

Getting the token. Sign in at axs.com, open your browser’s devtools → Network, click any request to api.axs.com, and copy the Authorization header value (it starts with Bearer). Paste it here. The token is a credential and is sealed in the vault, never written in clear.

It expires. AXS tokens are short-lived, so a refresh that returns “token expired” is normal — paste a fresh one. That is the honest cost of not storing your password and not fighting their login.

Bulk import from CSV

One row per account. The provider column takes either the key (tm_uk) or the display name (Ticketmaster UK). region is your own sub-label (a desk, a city) and is kept — it is not the country, which comes from the provider. Anything unrecognised is reported by row rather than filed under a made-up id.

Reachability / diagnostics

Can this dashboard reach the site?

Checks are made from the server, through the proxy you pick.
SiteResultGuarded by HTTPms What it means
Not checked yet.
This is a measurement, not a promise. A site that answers ok or sign-in needed served a real page; one that answers challenge sent a JavaScript or CAPTCHA wall instead, and no amount of retrying from a server gets past it — that is the wall doing its job. Results change per proxy, which is the reason to test each one rather than assume.

What was found when this was built. Ticketmaster returns {"response":"block"} to its own sign-in endpoint from a datacenter IP, and served fine from a home connection — that difference is why residential proxies matter, and it is exactly what the column above measures. AXS sits behind a Cloudflare JavaScript challenge. The Eventim chain, TicketOne included, runs Akamai Bot Manager, whose sensor cookie comes from browser fingerprinting rather than headers. Vivaticket runs Imperva.

So sign-in is not automated here, and that is deliberate. Getting past any of those means defeating a commercial bot-management product: it breaks on their next release, it risks the accounts themselves, and a repricer that dies quietly on a match day is worse than none. The routes that do work are on this page — the per-row Sign in hands off to your browser companion, email import reads your own mailbox and needs nobody's permission, CSV always works, and the seller API on the Marketplaces page is a real integration rather than a workaround.

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.

Settings

Set once, then left alone.

Discord webhook

In Discord: channel settings → Integrations → Webhooks → New Webhook → Copy URL. Critical alerts arrive the moment they fire; everything else now lives only in the in-app Alerts tab rather than going to the channel. Only https is accepted — alert bodies name events, seats and amounts.
WhenWhatResultDetail

Proxy lists

One per line, in any of the three formats providers hand out. Duplicates are skipped quietly; a line that cannot be read is reported with its number rather than dropped, because a silently missing proxy looks fine until an account starts failing. Passwords are stored because routing needs them, but never shown back here.

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

Pick a whole group (it rotates through the working members when the account egresses) or a single proxy. No password here — add one through Sign in on the account row, so it goes straight into the encrypted vault rather than through this form.
Sign in
Link an AXS account by its token
Sign in at axs.com, open devtools → Network, click a request to api.axs.com, and copy its Authorization value. It is sealed in the vault and proved with one real call before it counts as linked.
Connect a mailbox
Advanced (host / port / folder)
Leave the folder blank and Gmail defaults to [Gmail]/All Mail, where filters and labels park order confirmations — scanning only INBOX is the usual reason a Gmail scan finds nothing. You can change the folder per mailbox later.
Gmail: turn on 2-step verification, then Google Account → Security → App passwords → generate, and paste the 16-character code. Stored encrypted, read-only.
Import tickets from a spreadsheet
Nothing pasted yet.
Face value and the buying account come from the file. Cost is what you paid and is never read from a face-value column — they are different numbers and one is the legal resale ceiling in several countries.

Add marketplace

Country notes