pkr2gotrack · design
Page 01 · v2

Glossary & data model

The source of truth for what track captures. Two entities, one capture grammar, one extensible tag system, and connections that let us learn from history.

One golden idea: "New session" and "log an event" are the same card — they differ only in which fields are primary and what they write to. Second idea: everything we capture should be groupable (tags + connections) so details auto-populate from what's already known.
1 · Entities 2 · Field states 3 · Tag system 4 · Connections & memory 5 · Session fields 6 · Money model 7 · Event fields 8 · Event catalog 9 · Mirrors 10 · Gates 11 · Media library 12 · Mental-game pulse 13 · Clock & target stack 14 · Derived metrics 15 · Still open 16 · Term glossary

1 The two entities

EntityCapturesOne-liner
SessionWhat the tournament is & how it endedThe container: title, venue/operator, format, money/chip config, structure, payouts, result — plus connections & tags.
EventWhat happened at one instantA timestamped row: money, a chip/field snapshot, a hand, a pulse, a note, media, visibility, tags.

A session has many events. Live metrics ($/hr, stack-in-BB, ICM equity) are derived (§14) — never stored. Two satellite concepts hang off both: Media (§11) and Connections (§4).

2 Field kinds & the three states

Kinds: text select tags datetime money chips count number level hand media rating toggle ref meta.

StateMeaningExamples
CapturedTyped / picked by the player.title, buy-in, your chips, players left, a hand.
Auto-generatedSystem fills it, stays editable & pins on edit (GR5), or a mirror applies it (GR6), or it's recalled from history/connections (§4).fee = 20%·buy-in, entry = now, currency = your default, finish place from a payout, venue defaults recalled.
DerivedComputed on the fly, never stored.net, ROI, $/hr, stack-in-BB, ICM equity, counts.

3 Tag system new

One extensible type:value tag system, used on sessions, events, and media. Adding a capability or category never needs a schema change — just a new namespace or value. This replaces the old confusing formatTags + free tags split.

NamespaceUsed onExamplesPurpose
game_type:sessiongame_type:mtt · game_type:cashmirrors the format field (see note)
format:sessionformat:freezeout · :rebuy · :reentry · :pko · :mystery · :last-longer · :addon · :turbocapabilities — these gate fields & event types (§10)
series: / custom:sessionseries:WSOP-C · custom:vegas-trip-26free grouping (trips, festivals, your own filing)
event:eventevent:key · event:cooler · event:bad-beatflag notable moments for later review
mind: / variance:event / sessionmind:disciplined · mind:out-of-plan · mind:tilted · mind:focused · variance:cooleredmood as typed tags — replaces numeric ratings (§12)
media:mediamedia:chips · media:receipt · media:handclassify photos for analysis (§11)
Why this replaces the old triad: format stays a real first-class field because MTT vs Cash changes the whole schema. But the old formatTags (Re-entry/Rebuy/PKO…) were just capabilities — they become format:* tags. And the old free tags become series:/custom:. One system, fully extensible, nothing special-cased.

4 Connections & entity memory new

Every session can connect to canonical pkr2go entities. All nullable — but even when null, we still remember and group so details auto-populate next time.

FieldKindLinks toNotes
venuetextwhat the player types ("The Tote, Collingwood")
venueIdrefpkr2go venue directorynullable; matched/confirmed when we recognise the venue
operatortextthe league/series operator running it
operatorIdrefpkr2go operator directorynullable; matched when known
pkr2goEventIdrefpkr2go tournament/eventnullable; the actual scorekept event, if this session is a pkr2go game

Why it matters — mass data & auto-populate

New venue = silently remembered. When a player types a venue/operator we don't recognise, we auto-save it to their history behind the scenes (a soft entity). Next time it autocompletes and carries its learned defaults; if it later matches a canonical pkr2go entity, we link the id — no re-entry, no duplicate.

5 Session fields

= auto-generated (editable + pins). "Shows" = main card, behind More, or gated by a format: tag (§10). Money fields use the §6 convention.

FieldKindAuto?Default / sourceShows
id · createdAtgeneratedsystem
titletextalways
venue · operator + idstext · reftyped; ids matched from directory (§4)always
pkr2goEventIdreflinked if it's a pkr2go game (§4)More
formatselectMTT (Cash later) — see calloutalways
tagstagsthe §3 type:value set (incl. format:* capabilities)always
currencyselect= your profile defaultMore
tourneyStart · entryTimedatetimepaired; entry = now, tourneyStart = entryentry always
endedAt · netHoursdatetime · numberset on end; netHours = entry→end − overnightresult
buyinmoneyheadline in-play amount (what folks see)always
buyinFeemoney= 20%·buyininline, faint
buyinBountymoney= 50%·buyin (the KO split, see §6); else 0tag format:pko/mystery
buyinCostmoneyderived= buyin + buyinFeeinline, faint
reentry · reentryFee · reentryBounty · reentryCostmoneydefault to the buyin set; cost derivedtag format:reentry
rebuy · rebuyFee · rebuyCostmoneyrebuy = buyin; cost derivedtag format:rebuy
addon · addonFee · addonCostmoneyaddon = buyin; cost derivedtag format:addon
lastLongerBuyinmoneyflat side-pool entry (no prizepool/fee split)tag format:last-longer
startingChipschipsalways
rebuyChips · reentryChips · addonChipschipsrebuy/reentry chips = startingby tag
reentriesCount · rebuysCount · addonsCountcountyour own counts — from your events, editable (§14)result
gtd · structure · payoutsnumber · metaguarantee; blind ladder; prize ladderMore
finishPlace · entrantscountmirrors from payout/bust & field snapshot (§9)result
statusselectplanned · setup · live · busted · cashed · endedalways
pulse (start/end)ratingA-game · energy · focus snapshot (§12)More
format vs tags: format = the structural class (MTT now; Cash later changes the schema — blinds/sessions instead of buy-ins/places). Everything that used to be a "format tag" (re-entry, rebuy, PKO…) is now a format:* tag from §3. Cleaner and extensible.

6 Money model — one naming convention reworked

No more guessing "cost vs fee". For every entry action X ∈ {buyin, reentry, rebuy, addon}, the same four parts:

PartAlways means
Xthe headline in-play amount — what folks see / quote
Xfeethe fee / rake (auto = 20%·X, editable)
Xbountythe bounty split inside X for KO formats (auto = 50%·X → 50/50; 0 otherwise). Prize-pool part = X − Xbounty. Informational — it's already inside X, not added on top.
Xcost (derived)= X + Xfee — total cash out of pocket per bullet

Worked examples

Same rule for re-entry/rebuy/add-on. So: buyin + buyinFee = buyinCost, and bounty is a clearly-labelled split, never a mystery extra. Open to your naming — if you prefer buyinRake over buyinFee, say so and it's a one-line change here.

Cost basis — how the entry was paid new

A seat won in a satellite costs what you paid for the ticket, not the seat's face value — get this wrong and ROI is fiction. Every entry / re-entry carries:

FieldMeaning
entrySourcecash · ticket · sat-won — read from a won-ticket / seat-draw upload (§11)
ticketFace · cashPaidface value vs what you actually paid; invested = cashPaid drives ROI & bankroll

Worked: a $10,000 seat won from a $1,100 satellite → ticketFace 10,000 · cashPaid 1,100 · invested 1,100. A $1,975 cash means ROI +79.5% on the real outlay, not −80% on the face.

Currency & FX — one home-currency bankroll new

Sessions can be in any currency; the bankroll rolls them into your home currency at a rate captured per session, so the consolidated figure is auditable.

FieldMeaning
currencythe session's native currency (default = your profile home)
fxRate native → home rate, auto at end-time, editable & pins (§2). Stored, not recomputed.
netHome (derived)= net · fxRate — what lands on the home-currency roll; native & home both kept

Worked: WSOP net +US$21,500 at fxRate 1.52 → netHome +A$32,680. The ledger shows the rate so the AUD roll reconciles.

7 Event fields

FieldKindNotes
id · sessionIdsystem
tsdatetimeabsolute instant. Default now. Tail field.
type · categoryone of §8; category derived from type
visibilitytogglepublic · friends · private. Default per type. (friends needs the friend graph — see §15)
moneymoneycost/income amount, session currency
breakKindtoggle auto from the break→resume gap: overnight if it crosses local midnight or > 4h, else short. Editable. (threshold tunable — §15)
payload.chipschipsyour stack after this event
payload.playersLeft · totalEntriescountpaired; totalEntries → entrants
payload.chipsInPlaycount two-way with entries: chipsInPlay ⇄ totalEntries·startingChips + rebuys·rebuyChips + addons·addonChips. Give one, get the other.
payload.levellevel{ num, sb, bb, ante }
payload.rebuys · addons · reentriescountsfield-wide counters (everyone) — feed chips-in-play
payload.lastLongerLeftcountplayers alive in the last-longer pool
payload.placecountfinishing place → finishPlace + status (§9)
handhand{ position, hole, board, action, result, potChips }
pulserating{ aGame, energy, focus } 1–5 (§12)
notetextshareable per visibility. Tail field.
privateNote newtextalways player-only, regardless of visibility — your candid read / mental-hand-history.
mediamedia[]attached photos — also live in the library (§11)
tagstagsevent:key, mind:tilt… (§3)
Universal tail (every event card ends with): Media · Time (now) · Note · Private note · Visibility · Tags.

8 Event catalog — what each one shows

The event types below, grouped into 16 card templates (some share a card — e.g. cashed / busted / payout). Key fields = the primary zone; the universal tail is implicit. Trigger: + the log sheet · footer a session action button · auto system. Lifecycle events can carry a place — there's no special "menu only" rule any more.

TypeCat.Key fields shownDefault vis.Auto-fill · gate · trigger
stackSnapshotstackYour chipspublicchips = latest stack · +
fieldSnapshotfieldPlayers left · Total entries · Level · Chips-in-play · Rebuys/Re-entries/Add-ons · LL leftpublicchips-in-play two-way (§7) · +
handhandPosition · Hole · Board · Action · Result · Pot chips (±)public+
pulse newmindA-game · Energy · Focus (1–5)privateoptional tilt:* tag · + / footer
rebuycostAmount · Chips afterpublicamount = rebuyCost; chips = latest + rebuyChips · gate format:rebuy · +
reentrycostAmount · Chips afterpublicamount = reentryCost; chips = starting · gate format:reentry · +
addoncostAmount · Chips afterpublicamount = addonCost · gate format:addon · +
tokecostAmountprivate+
foodcostAmountprivate+
lastLongerEntrycostAmountprivateamount = lastLongerBuyin · gate format:last-longer · +
otherCostcostAmountprivate+
payoutincomeAmount · Finishing placepublicplace → finishPlace + cashed · + / footer
bountyincomeAmountpublicgate format:pko/mystery · +
lastLongerPayoutincomeAmountpublicgate format:last-longer · +
breakbreakChipspublicbreakKind auto (§7) · footer
resumebreakpublicends a break · footer
bustedlifecyclePlacepublicplace → finishPlace + busted · footer
cashedlifecyclePlace · Amountpublicplace → finishPlace + cashed · footer
endedlifecycle(note)publicstamps endedAt, netHours · footer
notenoteNote textpublic+
Default visibility rule: money housekeeping (toke, food, otherCost, lastLongerEntry) and pulse default private; the rest of the journey defaults public. Always editable, now incl. friends.

9 Mirrors — events that write back to the session

Results auto-apply; config is only offered (never silent). [GR6]

TriggerWrites to sessionMode
payout/cashed.placefinishPlace + status = cashedauto
busted.placefinishPlace + status = bustedauto
fieldSnapshot.totalEntriesentrantsauto
your rebuy / reentry / addon eventsrebuysCount · reentriesCount · addonsCountauto
any entry-cost moneythe matching session cost (rebuy, …)offered when blank

10 Gates — format: tags unlock fields & event types

A format: tag (§3) is what makes the relevant fields/events appear. [GR7]

TagUnlocks
format:freezeout (default)baseline — nothing extra
format:reentryreentry money set + reentry event
format:rebuyrebuy money set + rebuyChips + rebuy event
format:addonaddon money set + addonChips + addon event
format:pko / :mysterybuyinBounty split + bounty event
format:last-longerlastLongerBuyin + LL events + lastLongerLeft
level has antethe ante input on the level field

11 Media library new

Photos go two ways: attached to an event and into a tagged, classified library we can batch-analyse later (OCR chips/levels, read receipts, auto-populate fields).

FieldKindNotes
id · playerId · keystorage object key (uploaded — not an ephemeral blob URL)
mediaTypeselectclassification: chips · field-screenshot · hand-screenshot · invoice · receipt · ticket · other
tagstagsmedia:* + any §3 tag
capturedAtdatetimewhen taken
sessionId · eventIdrefnullable — media can be standalone in the library or linked
classificationmetaauto (later)ML-suggested type + confidence
ocrText / extractedmetaauto (later)read values → prefill an event (chips, level, amount)
Why first-class: a chip photo isn't just a memory — it's data. Classifying & OCR-ing media is how we auto-populate the boring fields and run mass analysis across a player's whole history.

12 Mental-game pulse new

Decision: mood is captured as typed tags, not 1–5 numbers. A controlled vocabulary in the mind: / variance: namespaces — one tap, honest, and filterable like every other tag. Grounded in what coaches track (which "game" you played; tilt & its triggers) but easier to log and to query than sliders.

GroupColourTags
Discipline (good)greenmind:disciplined · mind:on-plan · mind:stuck-to-ranges
Leaksambermind:out-of-plan · mind:no-plan · mind:chickened-out · mind:overplayed · mind:spewy
Statered / bluemind:tilted · mind:rattled · mind:frustrated  /  mind:calm · mind:focused · mind:confident
Variancegreyvariance:ran-good · variance:ran-bad · variance:coolered

Sources: Tendler — The Mental Game of Poker · 888poker mental-game guide · vip-grinders session management.

13 The clock & target stack new

The two questions that actually drive late-bag play: "how long until I can stop?" and "do I even need to push?" track answers both — a countdown to the next break / end of day, and a target stack you set so the dashboard tells you whether to step on the gas or coast and rest. You enter the goal once; we do the math every hand.

The countdown

Derived from the blind structure (§14 derive) + the break schedule — no manual entry. Surfaced on the live dashboard as a single line.

FieldKindMeaning
levelEndsInduration time left in the current level — from level length × elapsed (or a manual levelUp event)
breakIn · breakAtduration · time countdown to the next scheduled break (e.g. break every 4 levels). The "how long until I can get up" answer.
bagIn · levelsToBagduration · count countdown to end of day / bag — when play stops and you bag chips for the next day. Multi-day only (gate format:multi-day).

Target stack — survival vs accumulation

You set a goal for the next milestone (end of day, the bubble, a pay jump). track compares it to your live stack and gives one verdict — the "be lazy when you don't have to push" signal. A deep stack near bag is worth protecting; ICM says survival often beats marginal accumulation.

FieldKindMeaning
targetStack · targetBBchips · numberyour goal for the milestone — entered as chips or big blinds (paired, §6-style: set one, the other derives from the BB at bag time).
targetKindtogglewhat the target is for: target:bag · target:bubble · target:pay-jump · target:chip-lead. A typed tag (§3).
stackVsTargetnumber latestStack ÷ targetStack — how far over / under the goal you sit right now.
paceverdict the one-word call (below) from stackVsTarget, time/levels left, and avg stack.

Theory: late-day survival vs accumulation is an ICM call — bagging a healthy stack often outweighs a marginal double near the end of a day. Sources: ICMIZER — ICM & bag-time decisions · PokerNews — bagging up in multi-day events.

14 Derived metrics — never stored, always computed

MetricMeaning
invested · returned · net · roi · perHourtotal in (cost + entry events); total out (income events); profit; ROI %; net ÷ netHours
reentriesCount · rebuysCount · addonsCountyour bullets — counted from your events (also stored on session, editable)
bountiesWon new$ & count from bounty events
bountyTargetsLeft new≈ playersLeft − 1 in a KO — how many bounties are still on the table
latestStack · stackInBB · avgStack · vsAvgchips; chips ÷ BB; total ÷ players left; you ÷ average
totalChipschips-in-play, explicit or from entries × starting (+ rebuys/add-ons) — two-way (§7)
currentLevel · playedHoursmanual level wins, else structure predictor; entry→end − overnight
levelEndsIn · breakIn · bagIn · stackVsTarget · pace newthe clock & target-stack signals — countdowns and the push/hold/coast verdict (§13)
prizepool · paidSpots · moneyStatusfrom payouts; ITM / bubble / from-the-money
liveEquity$ value of your seat — ICM ≤9 left, chip-chop for big fields
stackSeries · avgSeries · stackExtremes · strategyHintstrajectory; peak/low; tactical nudges
pulseAvg · pulseTrend newavg A-game/energy/focus this session & across sessions (§12)

15 What's still open — candidate fields decide

Surfaced by the review. Each is real for a serious bankroll tracker; none are in v1 unless you say so — flagged so we don't quietly balloon scope.

CandidateWhat it addsLean call
Staking / backingmarkup, % sold → personal vs investor ROI. Big for serious players (most are staked).likely v2 — touches every money metric
Satellite / ticket entry doneentry paid by a won ticket → cost basis differs from cash.in v1entrySource on the entry (§6)
Currency conversion doneroll USD/AUD/… sessions into one home-currency bankroll.in v1 — per-session fxRate (§6)
Multi-day bagsexplicit Day-N bagged chip count (now implicit via overnight break).nice-to-have; overnight break covers most
Table & seattable #, seat, draw — table-change events.low priority
Friend graphrequired to make friends visibility real (§7).blocks friends-visibility
Profile defaultshome currency, default visibility, home venue → feed the auto-fills.small, do early
breakKind thresholdconfirm the overnight rule (midnight-cross / >4h) (§7).one constant to set

16 Plain-English term glossary

TermMeaning
MTTMulti-Table Tournament — played across many tables, players merging as they bust.
Cash gameChips = cash, sit/leave any time. Structurally different from an MTT — hence format is a real field (v2).
Buy-in / fee / costBuy-in = headline in-play amount; fee = the house rake; cost = buy-in + fee (total out of pocket).
FreezeoutOne entry, one stack — bust and you're out. The default.
Re-entry / Rebuy / Add-onRe-entry = a brand-new entry after busting; rebuy = top up while seated; add-on = one-time top-up at a break.
Bag / Bag upEnd of a tournament day: you count your chips, seal them in a bag, and return with that exact stack next day. A "bag" is also the chip count you finished the day on.
Target stackA chip / big-blind goal you set for end of day (or another milestone). Hitting it early means you can fold and rest; missing it late means you need to push (§13).
Push / CoastPush = open up and gamble for chips while the clock runs out. Coast = you're already at goal, so fold up and protect the stack.
Bounty / PKO / MysteryA prize for a knockout. PKO = Progressive (part of the bounty grows your own head); Mystery = bounty drawn from a random pool. Typically a 50/50 split of the buy-in.
Last-longerA side bet: whoever survives longest wins the side pool (independent of the prizepool).
GTD / Structure / Level / SB·BB·anteGuaranteed prizepool; the blind ladder; one rung; the forced bets (small/big blind + ante).
Stack / BB / Average stackYour chips; your stack in big blinds (the real measure of room); total chips ÷ players left.
ITM / BubbleIn The Money; the last spot before the money.
ICM / Chip-chopIndependent Chip Model — chips→$ equity near the money; chip-chop = simpler proportional estimate for big fields.
A-game / B-game / C-gameTendler's framing for the level you played at — your best, average, and worst decision-making selves.
TiltEmotion-driven bad play (bad beat, ego, fatigue…). Tracked here as a tag with its trigger.
Staking / markupSelling a % of your action to investors, often at a markup. Splits results into personal vs investor ROI (§15).
TokeA tip to the dealer.
Overnight (break)A multi-day gap (Day 1 → bag → Day 2). Excluded from played hours.
Public / Friends / PrivateWho sees an event when you share. The flag is the decision — no cherry-picking.