This account isn't on the admin list for this dashboard. If you think this is wrong, check the ADMIN_EMAILS set in worker.js.
Portfolio Analysis/Overview
AD
Workspace / Overview
Portfolio Analysis at a glance
Adoption, engagement and data coverage, without scrolling through every operational report.
All-time totals unless a figure says otherwise
Visitor journey
Independent observed actions, not a forced funnel —
the buckets overlap and do not sum.
Most-used features
Member tab opens · all time
A count here is a tab being opened, nothing more.
It does not mean an analysis was run, a portfolio imported or anything
completed inside the tab. Programmatic switches count the same as
clicks, which is why Holdings leads.
Data quality watchlist
Manual review first; routine quality-gate
rejections are not incidents
Security master coverage
Auto-learned, shared corpus
Engagement at a glance
Each figure carries its own window and unit
Recently recorded activity
Member tab opens, newest first
Product & Growth / Users & Advisors
Accounts
Every signup, and the advisor view of the same accounts. Activated means at least one client AND one statement on file; an account that has a client but has imported nothing shows as No statement, which is a set-up that stalled rather than one that never began. Portfolios counts statement dates on file, not imports.
Advisor activity
Email▾
Name▾
Firm▾
Type▾
Activated▾
Signed up▾
Last active▾
Signed in▾
Clients▾
Portfolios▾
Other assets▾
Plans▾
Tabs▾
Counts only — the data behind these tables carries no client name,
portfolio value or holding. An account's panel can open its stored
portfolio or its report, which do show them (for an adviser, the client
list too), and every such opening writes a row to the Administrator
actions log.
Activated means at least one client and one statement on file —
Active has both, No statement has a client and nothing
imported, Not started has neither.
Portfolios is statement dates on file, not imports.
Tabs is tab opens (and the Compare screen), the only feature use recorded against an account's email.
Signups
Email▾
First seen▾
Type▾
Tier▾
Verified▾
Last active▾
Product & Growth / Product Analytics
Product analytics
Two kinds of record, reported separately: signed-out visitors counted per browser, and members counted per account. One person can appear in both, for example before and after signing up — the sign-up stores the browser's visitor id with the account, which is what the demo-to-sign-up figures are built from.
Daily activity — last 30 days
Tool access — signed-out visitors
Demo and free-tab usage by signed-out visitors, counted per browser.
Signed-in use is in the member table beside it; the same person can
appear in both, for example before and after signing up.
Feature▾
Opens▾
Visitors▾
Tool access — members
Feature▾
Uses▾
Users▾
Product & Growth / Growth & Promotions
Growth & promotions
Campaign attribution and one-time discount codes. Codes are generated on the server and can be revoked but never unmade.
Discount coupons
Generated here, given to one person, good once. The code is random — a
chosen code is a guessable one. Note is for who it went to; a list
of codes with no record of that is unusable within a week.
New code — copy it now
Code
% off
Plan
Expires
For
State
Redeemed by
Created
Email campaigns
Visitors who arrived on a tagged link — xraymyportfolio.com/?c=your-tag —
credited to the FIRST campaign that reached them. A browser that clears its
storage arrives again as a new visitor, so treat these as a floor.
Campaign
Visitors
Ran demo
Loaded own
Signed up
Signup rate
Data Operations / Data Quality
Data quality
Two separate queues. Unknown funds are real holdings with no look-through; unresolved securities are filing constituents OpenFIGI could not identify.
Unknown funds — needs holdings data
Funds/ETFs a real portfolio held that the app had no look-through data for — the demand side, versus the security-master panels below which show what's actually been learned.
Status reflects the shared corpus, not merely whether a resolve was cached:
In corpus = learned and served ·
Resolved, not yet published = resolve worked, will publish next time someone holds it (no action needed) ·
Rejected = the quality gate refused it, reason shown ·
Needs review = no automated path works, so this is the list worth a manual HOLDINGS_DB entry.
Symbol▾
Description
Times seen▾
First seen▾
Last seen▾
Status▾
Unresolved securities
Individual holdings the auto-resolve pipeline identified inside a fund's SEC filing but couldn't identify via OpenFIGI at all (as opposed to identified-but-not-yet-sector-classified, which self-heals on its own) — the genuine residual tail worth a periodic look.
Identifier▾
Name▾
Found in▾
Times seen▾
Last seen▾
Data Operations / Security Master
Security master
The shared, auto-learned corpus. A rejection is the quality gate working, not an outage.
Security master — auto-learning
When a fund nobody has seen before turns up in a portfolio, it is resolved from SEC filings once,
checked by a quality gate, then stored so every later visitor gets it instantly instead of
re-resolving. This is where you confirm that loop is actually running: what it has learned, when,
and what the gate rejected.
An empty table here is normal until someone uploads a portfolio holding an unrecognised fund.
Publish activity — last 30 days
Green = accepted into the shared corpus · Red = rejected by the quality gate
Recently learned funds
Fund look-through added to the shared corpus. "Capped" means the fund had more holdings than the 250 the pipeline stores, so coverage is deliberately partial and honest rather than inflated.
Symbol
Holdings
Coverage
As of
Learned
Rejected by the quality gate
Resolutions refused because they'd have polluted the shared corpus — e.g. too few holdings identified, or a master-feeder fund whose filing lists only its parent. These are never served to anyone. Rejections here are the gate working, not a fault.
Symbol
Reason
Holdings
When
Recently learned companies
Companies the app had never seen before, discovered inside a fund's holdings and classified automatically. These become available to every user.
Company
Ticker
Sector
Themes
Style
Learned
Data Operations / Event Logs
Event logs
Administrator actions, member tab opens and security-master publishing events — kept apart because they are different kinds of record.
Administrator actions
Opening a stored portfolio, opening an account's report, changing an
account's type, name, firm, plan or plan date, deleting an account (and a by-hand Stripe confirmation before a deletion), turning the payment switch on or off, and administrator one-time-code attempts, accepted or refused.
Not recorded: the accounts list, an account's profile and tab history,
who used a given tab, discount codes, and edits to a phone number or
how-heard answer. An account change is logged after it is saved, so a
failed log write leaves the change with no row. An adviser's report
opened before a client is chosen gets a row naming no client, though
their client list was shown. The privacy policy promises this record exists,
so it is the one page that has to be able to show it.
Reading it is not itself recorded.
Recent activity
Email▾
Feature▾
When▾
Cron & system notes
What the scheduled jobs write about themselves — the macro
baseline refresh and the trailing-returns refresh. They are kept out of
every member figure in this console, which is why they need a panel of
their own: a feed that fails behind a working fallback is invisible
otherwise, because the baked constants cover for it perfectly.
A run that got everything writes nothing here.
Job
What it reported
When
Security-master event log
Raw append-only record of every publish attempt. Failures are persisted here rather than logged to a console, because a Worker's console output isn't durable.
When
Outcome
Symbol
Detail
Administration / Payments
Payments
Whether payments are enforced. While it is off, every signed-in account has the whole product.
Reading the switch…
Administration / Settings
Settings
Reserved.
Nothing here yet
Reserved for administration features that have not been
agreed yet. Appearing in this navigation is not approval of any feature.
Two capabilities already exist in the backend with no
screen: PATCH /api/admin/user accepts plan and
planUntil (the manual entitlement override built so the 60-day
dates can be honoured by hand), and delete-user writes an
admin_audit row that nothing ever reads back. Both are
privileged workflows, which the handoff puts in Phase 3.