{% extends "base.html" %} {% block title %}Analytics · foilstack{% endblock %} {% block status %}{{ position.distinct }} skus · {{ position.count }} cards · {{ position.market|money }} at market{% if threshold %} · {{ left_out.count }} under {{ threshold|money }} not counted{% endif %}{% endblock %} {% block screen %}

Analytics

position from your inventory · performance needs sales data
{# A control, not a caption. The threshold applies to this look at the screen; making it the account's is the separate button below, for the reason the listing screen's floor has two presses. #}
{# Which threshold is in force and whether it is the saved one. The same three facts the floor states, and stated for the same reason: a position reported under a number the seller never saved must not be able to pass for the one they set. #}
{% if threshold_override %} this view only Counting cards worth {{ threshold|money }} or more. {% if account_threshold %}Your saved threshold is {{ account_threshold|money }}. {% else %}You have not saved one, so this screen normally counts every card.{% endif %} {% elif threshold %} Counting cards worth {{ threshold|money }} or more — your saved threshold. Set it to $0.00 to count everything. {% else %} Counting every card. Raise the threshold to leave slow-moving bulk out of the value figures below. {% endif %}
Inventory value
{{ position.market|money }}
{{ position.count }} cards · {{ position.distinct }} skus
{# Named where it would have been counted. A figure that quietly drops part of an inventory is worse than one that counts it, so the screen always says what it left out and what that was worth. #} {% if left_out.count %}
{{ left_out.count }} card{{ '' if left_out.count == 1 else 's' }} under {{ threshold|money }} left out, worth {{ left_out.market|money }}
{% endif %}
Listed value
{{ listed_value|money }}
{{ unlisted_value|money }} not yet listed
{% if left_out.count %}
counted cards only
{% endif %}
Cost basis
{{ totals.cost|money if totals.cost else '—' }}
{% if totals.cost %}across {{ totals.distinct }} skus{% else %}no cost recorded on any row{% endif %}
{# Never filtered. What a position is worth is a forecast and the threshold is a judgement about that forecast; what it cost is not — the money left the bank for the cheap cards too. #} {% if left_out.count %}
every card you hold, including the {{ left_out.count }} not counted above
{% endif %}
Unrealised gain
{{ position.gain|money if position.gain is not none else '—' }}
{% if position.gain is not none %}at market, before fees{% else %}needs a cost basis{% endif %}
{% if left_out.count and position.gain is not none %}
counted value less the cost of everything held
{% endif %}
Inventory value by game {% if left_out.count %}{{ threshold|money }} and up{% endif %}
{% for b in by_game %}
{{ b.label }}
{{ b.value|money }}
{% else %}
nothing in inventory yet
{% endfor %}
Position
{# Both populations, side by side, so the threshold never leaves a question the screen will not answer. Everything held is always readable here even when the value figures above exclude part of it — the cards are still yours and the panel says so. #} {% if threshold %} {% endif %}
Cards on hand{{ totals.count }}
Distinct skus{{ totals.distinct }}
Counted at {{ threshold|money }} and up{{ position.count }}
Under {{ threshold|money }}{{ left_out.count }} · {{ left_out.market|money }}
Market value{% if threshold %} counted{% endif %}{{ position.market|money }}
Suggested list value{% if threshold %} counted{% endif %}{{ position.listed|money }}
Cost basis on hand{{ totals.cost|money if totals.cost else '—' }}
Unrealised gain{{ position.gain|money if position.gain is not none else '—' }}
Sell-through by channel demo data
TCGplayer
$3,910
eBay
$1,640
In person
$205

Placeholder. foilstack never sees a sale. The CSV leaves here and what happens next happens on a marketplace. Real numbers need order data read back in, which nothing does yet.

Realised {% if not sales.sold_all %}no sales recorded{% endif %}
{% if sales.sold_all %}
Cards sold{{ sales.sold_all }}{% if sales.sold_30d %} ({{ sales.sold_30d }} in 30d){% endif %}
Gross realised{{ sales.gross_all|money }}
Gross 30d{{ sales.gross_30d|money }}
Realised profit{{ sales.profit_all|money if sales.profit_all is not none else '—' }}
Sell-through{{ sales.sell_through ~ '%' if sales.sell_through is not none else '—' }}
Avg days to sell{{ sales.avg_days if sales.avg_days is not none else '—' }}

{% if sales.costed < sales.sold_all %} {{ sales.sold_all - sales.costed }} of {{ sales.sold_all }} sold cards have no cost recorded, so realised profit covers only part of them. {% endif %} Marketplace fees and shipping are not counted, because foilstack never sees them, so this is gross of both rather than a net figure dressed up as one.

{% else %}
Mark a card sold from its page and these become real numbers.

Sell-through, gross and days-to-sell are computed from your own sales. Marketplace fees and shipping never reach foilstack, so they are absent rather than estimated.

{% endif %}
{% endblock %} {% block scripts %} {% endblock %}