Reporting tables
Every table and column in the Parquet files Roiva builds for Power BI and data warehouses: what a row is, and what each column means.
Answered from these docs only, by a model that cannot see your account. Check the pages it cites.
Generated from what Roiva ships, on every deploy.
Roiva's figures as flat, typed tables, for Power BI or a data warehouse to read without an API client: initiatives, approved value with its formula version and inputs, costs, approvals, budgets against spend, portfolio decisions, locked months and AI spend. Roiva's figures in Power BI and your data warehouse covers connecting.
How they're built
Once an Owner or Admin turns them on under Organization Settings → Reporting Tables, Roiva builds a snapshot every night: every table below, read at one moment, as a Parquet file each. Every row carries the snapshot's snapshot_id. A table is always whole, so a row deleted in Roiva is simply absent from the next snapshot; there's nothing to reconcile incrementally.
Before a snapshot can be read, Roiva rebuilds every figure in reported_totals from the reported_value and costs rows it's about to publish and compares them, to the cent, with what its own reports compute. If any differs, the snapshot isn't published and Roiva is alerted.
What the figures follow
- Approved value only.
reported_valueholds entries approved by a person or by the account's auto-approve setting, which is what every Roiva report counts. Drafts, entries awaiting review and disputed entries aren't in it;approval_decisionsrecords what was decided about them. - Every cost counts. A cost has no approval step, so
costsholds every cost entry. - An entry belongs to the period its
period_startfalls in, in whole UTC days, as in every Roiva report. A twelve-month entry starting in January counts in Q1 and in no other quarter. An entry with no period counts in all-time figures only. - No sample data. Sample initiatives, and everything recorded against them, are left out of every table.
- Money is integer cents beside a currency. People are an id and a name, never an email address. Times are UTC.
- Value adds up in dollars. An entry keeps the currency its source gave it, and
reported_value.usd_amount_centsis its value in US dollars, at the European Central Bank's average rate over its period. That is the column the totals add. It is empty, and the entry in no total, while it waits on its rate. - So does cost.
costs.usd_amount_centsis each cost in US dollars, added the same way. A cost whose period's rates aren't all published yet counts at the latest ECB rate, markedusd_rate_provisional, so a known cost is never left out; a later snapshot carries the period's average, and the month can't be locked until it does. A cost in a currency the ECB doesn't publish has no dollar figure and is in no total.
Reading them
The newest snapshot's manifest is at https://roiva.ai/api/v1/reporting/latest, and each table at https://roiva.ai/api/v1/reporting/latest/<table>.parquet, with a reporting token as a Bearer token or as the password in Basic authentication. The schema itself is public, at /api/v1/reporting/schema.json. Snapshots are kept for 14 days, and the newest until a newer one replaces it; the Read API reference lists the endpoints.
Roiva can also deliver each build to an Amazon S3 bucket you own, writing through a role you create that can only add files to one folder. Each build gets its own folder, roiva/v1/snapshots/<snapshot_id>/, holding one Parquet file per table and a manifest.json written after them, and nothing already in the bucket is replaced.
What changes, and what doesn't
The files follow version v1 of this schema. Within a version, tables and columns are only added, and an added column may be empty. Removing, renaming or retyping a column would be a new version, published beside this one.
Columns marked free text hold what a person wrote in their own words, such as a note on a figure or the reason for a decision, and can name people or customers.
snapshot
One row: the snapshot itself. When the tables were built, for which account, and what they leave out. Join any table to it on snapshot_id.
| Column | Type | What it means |
|---|---|---|
| snapshot_id | stringalways present | The snapshot this row belongs to. Every table in one snapshot describes the same moment. |
| schema_version | stringalways present | The version of this schema the files follow. |
| generated_at | timestamp (UTC)always present | The moment every table in the snapshot describes, in UTC. |
| as_of | datealways present | The day the snapshot describes, in UTC. "To date" figures run through it. |
| account_id | int64always present | The account's id in Roiva. |
| account_name | stringalways present | The account's name. |
| fiscal_year_start_month | int64always present | The month the account's fiscal year starts, 1 to 12. Fiscal quarters and years in reported_totals follow it. |
| sample_initiatives_excluded | int64always present | How many sample initiatives the account holds. Their figures are invented for a demonstration, so no table includes them. |
initiatives
One row per initiative, sample initiatives excluded. The account's AI initiatives: where each stands, who owns it, and its business case. The planned figures are the business case, which can change. What was signed off is in budgets.
| Column | Type | What it means |
|---|---|---|
| snapshot_id | stringalways present | The snapshot this row belongs to. Every table in one snapshot describes the same moment. |
| initiative_id | int64always present | The initiative's id in Roiva. Every other table joins on it. |
| title | stringalways present | The initiative's name. |
| stage | stringalways present | Where it is in its lifecycle: identified, reviewing, implementing, live, paused, completed, rejected, dismissed. |
| previous_stage | stringmay be empty | The stage it was in before it was paused, for a paused initiative. |
| category | stringalways present | The kind of work it does. |
| module_kind | stringmay be empty | The Roiva module it belongs to. |
| department | stringmay be empty | The department it serves. |
| business_unit | stringmay be empty | The business unit it serves. |
| priority | int64may be empty | Its priority, 1 highest. |
| owner_id | int64may be empty | The person who owns it. |
| owner_name | stringmay be empty | The owner's name. |
| started_at | timestamp (UTC)may be empty | When work on it began. |
| went_live_at | timestamp (UTC)may be empty | When it went live. |
| closed_at | timestamp (UTC)may be empty | When it was completed or retired. |
| archived_at | timestamp (UTC)may be empty | When it was dismissed. |
| planned_capex_cents | int64 (cents)may be empty | The business case's one-off cost, in cents. |
| planned_opex_cents | int64 (cents)may be empty | The business case's running cost per value period, in cents. |
| planned_cost_savings_cents | int64 (cents)may be empty | The business case's cost savings per value period, in cents. |
| planned_revenue_uplift_cents | int64 (cents)may be empty | The business case's revenue uplift per value period, in cents. |
| planned_capacity_cents | int64 (cents)may be empty | The business case's freed capacity per value period, in cents: hours priced at what they cost. Not cash, and not in planned_value_cents. |
| planned_value_period | stringmay be empty | The period the planned per-period figures are stated for. |
| planned_value_cents | int64 (cents)always present | Planned cash value over the whole ROI horizon, in cents: the per-period cost savings and revenue at its margin, annualized, times the horizon. |
| roi_horizon_years | int64may be empty | The years the business case is measured over. |
| time_to_value_months | int64may be empty | The months the business case expected before value arrives. |
| description | stringmay be empty · free text | What the initiative is, as its team wrote it. |
| hypothesis | stringmay be empty · free text | What its team expects it to change, in their words. |
| created_at | timestamp (UTC)always present | When it was added to Roiva. |
| roiva_url | stringalways present | Its page in Roiva. |
reported_value
One row per approved value entry, sample initiatives excluded. The value the account's initiatives have returned, approved by a person or by the account's auto-approve setting. An entry belongs to the period its period_start falls in, as in every Roiva report, so a twelve-month entry starting in January counts in Q1 and in no other quarter. Cash value is the sum of usd_amount_cents over the cash types (revenue_gain, cost_savings, cost_avoidance, capacity_realized). Freed capacity is never added to it: for each initiative and period_month it is capacity less capacity_realized, floored at zero.
| Column | Type | What it means |
|---|---|---|
| snapshot_id | stringalways present | The snapshot this row belongs to. Every table in one snapshot describes the same moment. |
| value_entry_id | int64always present | The entry's id in Roiva. |
| initiative_id | int64always present | The initiative it belongs to. |
| amount_cents | int64 (cents)always present | The approved figure, in cents of currency. |
| currency | stringalways present | The currency of amount_cents. |
| usd_amount_cents | int64 (cents)may be empty | The approved figure in US dollars, in cents: amount_cents itself for a dollar entry, converted at usd_rate for another currency, and empty while the entry waits on the ECB's rate for its period. reported_totals add this column. |
| usd_rate | doublemay be empty | US dollars per unit of currency: the average of the European Central Bank's daily euro reference rates over usd_rate_from to usd_rate_through, crossed through the euro. Empty for a dollar entry. |
| usd_rate_from | datemay be empty | The first ECB day usd_rate averages. |
| usd_rate_through | datemay be empty | The last ECB day usd_rate averages. |
| entry_type | stringalways present | What kind of value it is: revenue_gain, cost_savings, cost_avoidance, capacity, capacity_realized. |
| period_start | timestamp (UTC)may be empty | When the period it covers begins. It decides which period the entry counts in. |
| period_end | timestamp (UTC)may be empty | When the period it covers ends. |
| period_month | datemay be empty | The first day of the month period_start falls in, in UTC. |
| is_estimated | booleanalways present | Whether whoever recorded it marked it an estimate. |
| confidence_score | doublemay be empty | The confidence recorded with it, 0 to 100. |
| source_type | stringalways present | How it reached Roiva: manual (typed in), assistant (drafted by the Roiva Assistant for the person in recorded_by_id), csv (imported), calculated (by a formula) or integration (synced from a connection). |
| provenance | stringalways present | Where the number came from, in the phrase an approver is shown. |
| connection_id | int64may be empty | The connection it was synced from. |
| platform | stringmay be empty | The platform that connection reads. |
| source_ref | stringmay be empty | The id the originating system knows it by. |
| formula_id | int64may be empty | The formula that calculated it. |
| formula_key | stringmay be empty | That formula's key, stable across its versions. |
| formula_name | stringmay be empty | That formula's name. |
| formula_version | int64may be empty | The formula version it was computed with, recorded when it was evaluated. A formula revised later keeps this row at the version that produced it. |
| formula_expression | stringmay be empty | The expression it was computed with, as recorded when it was evaluated. |
| input_snapshot | string (JSON)always present | The inputs frozen with the figure, as JSON with sorted keys. A formula entry holds one object per input, flattened in value_inputs; a synced entry holds what the sync counted. |
| input_snapshot_sha256 | stringalways present | SHA-256 of input_snapshot. Roiva computes the same digest for the same inputs, so a figure can be checked against the entry in Roiva. |
| vendor_price_effect_cents | int64 (cents)may be empty | Of a saving in AI spend, the part the provider's own price changes gave, in cents. Empty where the entry carries no such split. |
| own_changes_effect_cents | int64 (cents)may be empty | Of the same saving, the part the account's own choices earned, in cents. |
| notes | stringmay be empty · free text | What a person wrote about the figure, in their own words. |
| recorded_by_id | int64may be empty | The person who recorded it, or who had the Roiva Assistant draft it (source_type assistant). Empty when Roiva calculated or synced it. |
| recorded_by_name | stringmay be empty | Their name. |
| approved_at | timestamp (UTC)may be empty | When it was approved. |
| approved_by_id | int64may be empty | The person who approved it. Empty when the account's auto-approve did. |
| approved_by_name | stringmay be empty | Their name. |
| approval_source | stringalways present | auto when the account's auto-approve setting approved it, direct when a person did. |
| created_at | timestamp (UTC)always present | When it was recorded. |
| updated_at | timestamp (UTC)always present | When it last changed, or its month was locked or reopened. |
| roiva_url | stringalways present | Its page in Roiva, with its inputs and approval history. |
| basis | stringmay be empty | What it was compared with: measured (a baseline measured before go-live), reconstructed (one measured after go-live on work done without the AI), estimated (a benchmark or a judgment, or a figure its recorder marked an estimate) or none (no baseline: a count priced per unit, or a figure a person entered). |
value_inputs
One row per input of each approved formula entry. What each calculated figure was computed from, as frozen when it was evaluated. Join to reported_value on value_entry_id, and to metric_readings on observation_id.
| Column | Type | What it means |
|---|---|---|
| snapshot_id | stringalways present | The snapshot this row belongs to. Every table in one snapshot describes the same moment. |
| value_entry_id | int64always present | The approved entry these are the inputs of. |
| initiative_id | int64always present | The initiative the entry belongs to. |
| variable | stringalways present | The input's name in the formula's expression. |
| label | stringmay be empty | What the input is, in words. |
| value | doublemay be empty | The value the formula used. |
| source_type | stringmay be empty | Where the value came from: observation (a metric reading for the period), baseline (the reading before the initiative), assumption, period, or derived (computed from other inputs). |
| metric_key | stringmay be empty | The metric the value was read from. |
| observation_id | int64may be empty | The metric reading used. Its row is in metric_readings. |
| assumption_id | int64may be empty | The assumption used, for an assumption input. |
| assumption_key | stringmay be empty | That assumption's key. |
| assumption_scope | stringmay be empty | system for one of Roiva's defaults, account for the account's own figure. |
| requires_confirmation | booleanmay be empty | Whether the input was one of Roiva's defaults awaiting the account's confirmation when it was used. |
| assumption_effective_from | stringmay be empty | The date the assumption's figure took effect, as recorded. |
| observed_at | stringmay be empty | When the reading was taken, as recorded (a date or an ISO 8601 time). |
| input_period_start | stringmay be empty | The start of the period the value covers, as recorded. |
| input_period_end | stringmay be empty | The end of the period the value covers, as recorded. |
| expression | stringmay be empty | For a derived input, the expression that computed it. |
value_supporting_documents
One row per document an approved value entry cites. The evidence each approved figure cites: business cases, review decks, statements of work and contracts held on the initiative in Roiva. Join to reported_value on value_entry_id.
| Column | Type | What it means |
|---|---|---|
| snapshot_id | stringalways present | The snapshot this row belongs to. Every table in one snapshot describes the same moment. |
| value_entry_id | int64always present | The approved entry that cites it. |
| document_id | int64always present | The document's id in Roiva. |
| initiative_id | int64always present | The initiative the document is held on. |
| kind | stringalways present | What the document is: business_case, review_deck, sow, contract, other. |
| restricted | booleanalways present | Whether it is an SOW or a contract, which Roiva shows only to owners, admins and the initiative's approvers. |
| title | stringmay be empty | The document's title. Empty for a restricted document. |
| format | stringalways present | file for an uploaded file, link for a link to one held elsewhere. |
| cited_at | timestamp (UTC)always present | When the entry was made to cite it. |
| roiva_url | stringalways present | The citing entry's page in Roiva, where the document opens for those allowed to see it. |
metric_readings
One row per metric reading an approved formula entry used. The readings behind the reported figures. Join to value_inputs on observation_id.
| Column | Type | What it means |
|---|---|---|
| snapshot_id | stringalways present | The snapshot this row belongs to. Every table in one snapshot describes the same moment. |
| observation_id | int64always present | The reading's id in Roiva. |
| metric_key | stringalways present | The metric it is a reading of. |
| metric_name | stringmay be empty | The metric's name. |
| initiative_id | int64may be empty | The initiative it was recorded for. Empty for an account-wide reading. |
| role | stringalways present | reading for a period's figure, baseline for the figure before the initiative. |
| value | doublealways present | The reading. |
| currency | stringmay be empty | The currency of value for a money reading (a CRM's deals all in euros read in EUR); empty for a reading that isn't money. |
| period_start | timestamp (UTC)may be empty | When the period it covers begins. |
| period_end | timestamp (UTC)may be empty | When the period it covers ends. |
| observed_at | timestamp (UTC)may be empty | When it was observed. |
| sample_size | int64may be empty | How many records an average was taken over, where recorded. |
| is_estimated | booleanalways present | Whether it was marked an estimate. |
| source_type | stringalways present | How it reached Roiva: integration (synced from a connection), manual (typed in), assistant (recorded by the Roiva Assistant for the person in recorded_by_id), csv (imported), calculated (by a formula), system (a baseline Roiva estimated or calculated) or time_study (a time study's published mean). |
| connection_id | int64may be empty | The connection it was synced from. |
| dimensions | string (JSON)always present | The breakdown it belongs to, such as a line of business, as JSON with sorted keys. |
| notes | stringmay be empty · free text | What a person wrote about the reading, in their own words. |
| recorded_by_id | int64may be empty | The person who recorded it by hand, or who had the Roiva Assistant record it (source_type assistant). |
| recorded_by_name | stringmay be empty | Their name. |
| baseline_method | stringmay be empty | For a baseline, how the before-figure was measured: history, time_study, without_ai_sample, benchmark, estimate. Empty on a reading. |
| time_study_id | int64may be empty | For source_type time_study, the time study it is the published mean of. |
| valid_until | datemay be empty | For a time study's figure, the last day it stands: the study's last day plus its re-study interval. Months after it hold value calculated from it as due for re-study. |
costs
One row per cost entry, sample initiatives excluded. What the account's initiatives cost to build and run. An entry belongs to the period its period_start falls in, as value does. capex and opex split the same rows, so they add up to the total.
| Column | Type | What it means |
|---|---|---|
| snapshot_id | stringalways present | The snapshot this row belongs to. Every table in one snapshot describes the same moment. |
| cost_entry_id | int64always present | The entry's id in Roiva. |
| initiative_id | int64always present | The initiative it is booked to. |
| amount_cents | int64 (cents)always present | What it cost, in cents of currency. |
| currency | stringalways present | The currency of amount_cents. |
| usd_amount_cents | int64 (cents)may be empty | What it cost in US dollars, in cents: amount_cents itself for a dollar cost, converted at usd_rate for another currency. Empty, and in no total, when there is no rate: a currency the ECB doesn't publish, or a cost whose month was locked before it was converted. An undated cost takes the rate for the day it was booked. reported_totals add this column. |
| usd_rate | doublemay be empty | US dollars per unit of currency: the average of the European Central Bank's daily euro reference rates over usd_rate_from to usd_rate_through, crossed through the euro. Empty for a dollar cost. |
| usd_rate_from | datemay be empty | The first ECB day usd_rate averages. |
| usd_rate_through | datemay be empty | The last ECB day usd_rate averages. |
| usd_rate_provisional | booleanmay be empty | Whether usd_rate is the latest ECB rate rather than its period's average, because the period's rates weren't all published yet. A later snapshot carries the average, unless the month was locked before then. |
| cost_category | stringalways present | capex for a one-off cost to build, opex for a cost to run. |
| cost_type | stringalways present | What kind of cost it is, such as licenses, infrastructure or labor. |
| period_start | timestamp (UTC)may be empty | When the period it covers begins. It decides which period the entry counts in. |
| period_end | timestamp (UTC)may be empty | When the period it covers ends. |
| period_month | datemay be empty | The first day of the month period_start falls in, in UTC. |
| is_estimated | booleanalways present | Whether it was marked an estimate. |
| locked | booleanalways present | Whether a closed accounting period holds it, so it can no longer be changed. |
| vendor_id | int64may be empty | The vendor it was paid to, in Roiva's vendor list. |
| vendor_name | stringmay be empty | The vendor's name as recorded. |
| description | stringmay be empty · free text | What the cost was for, as recorded or synced. |
| notes | stringmay be empty · free text | What a person wrote about it, in their own words. |
| books_account_name | stringmay be empty | The general-ledger account it was booked to, for a cost from the books. |
| source_type | stringalways present | How it reached Roiva, such as manual, assistant (recorded by the Roiva Assistant), csv or integration. |
| connection_id | int64may be empty | The connection it was synced from. |
| platform | stringmay be empty | The platform that connection reads. |
| source_ref | stringmay be empty | The id the originating system knows it by. |
| implementation_id | int64may be empty | The implementation project it is attributed to, when it is one. |
| recurring_cost_id | int64may be empty | The recurring cost that wrote it, when it is one. |
| allocation_line_id | int64may be empty | The allocation line that split it from a shared bill, when it is one. |
| recorded_by_id | int64may be empty | The person who recorded it by hand, or who had the Roiva Assistant record it (source_type assistant). |
| recorded_by_name | stringmay be empty | Their name. |
| created_at | timestamp (UTC)always present | When it was recorded. |
| updated_at | timestamp (UTC)always present | When it last changed. |
| roiva_url | stringalways present | Its page in Roiva. |
approval_decisions
One row per approval decision, sample initiatives excluded. Who approved, rejected, disputed or sent back what, and when. A value entry's rows show how it came to be approved; join on subject_id where subject_kind is value_entry.
| Column | Type | What it means |
|---|---|---|
| snapshot_id | stringalways present | The snapshot this row belongs to. Every table in one snapshot describes the same moment. |
| approval_decision_id | int64always present | The decision's id in Roiva. |
| subject_kind | stringalways present | What was decided on: initiative, value_entry, budget, charter. |
| subject_id | int64always present | Its id: a value_entry_id, an initiative_id or a budget_id. |
| initiative_id | int64may be empty | The initiative it concerns. Empty once that initiative has been deleted. |
| subject_title | stringalways present | What it was called when the decision was taken. |
| item_label | stringmay be empty | The line decided on, for a value entry or a budget. |
| decision | stringalways present | The decision: approved, step_approved, rejected, disputed, sent_back. step_approved is one approver's sign-off in a chain that needs more. |
| resulting_state | stringmay be empty | The state it left the subject in. |
| step | int64may be empty | Which step of the approval chain this was. |
| total_steps | int64may be empty | How many steps the chain had. |
| source | stringalways present | How it was taken: direct, bulk, auto, backfill, assistant, import. auto is the account's auto-approve setting. |
| amount_cents | int64 (cents)may be empty | The amount decided on, in cents, for a value entry or a budget. |
| currency | stringmay be empty | The currency of amount_cents. |
| reason | stringmay be empty · free text | The reason the approver gave, in their own words. |
| decided_by_id | int64may be empty | The person who decided. Empty for the account's auto-approve. |
| decided_by_name | stringmay be empty | Their name. |
| decided_at | timestamp (UTC)always present | When the decision was taken. |
budgets
One row per budget version, sample initiatives excluded. What was signed off for each initiative, version by version: its one-off cost and its running cost. This is the approved budget, not the business case. How spend compares with it is in budget_vs_actual.
| Column | Type | What it means |
|---|---|---|
| snapshot_id | stringalways present | The snapshot this row belongs to. Every table in one snapshot describes the same moment. |
| budget_id | int64always present | The version's id in Roiva. |
| initiative_id | int64always present | The initiative it budgets. |
| status | stringalways present | pending, approved, rejected, withdrawn. Only approved versions are budgets. |
| source | stringalways present | How it arose: approval (set when the initiative was approved), revision or manual. |
| capex_cents | int64 (cents)always present | The one-off cost signed off, in cents: a total, not a rate. |
| opex_cents | int64 (cents)always present | The running cost signed off, in cents per opex_cadence. |
| opex_cadence | stringalways present | The period opex_cents is stated for: monthly, quarterly or annually. |
| currency | stringalways present | The currency of the amounts. |
| effective_from | datealways present | The version applies from the start of this date's month. |
| ends_on | datemay be empty | The last day it applies, when it has an end. |
| reason | stringmay be empty · free text | Why the version was set, in the words of whoever set it. |
| set_by_id | int64may be empty | The person who set it. |
| set_by_name | stringmay be empty | Their name. |
| decided_at | timestamp (UTC)may be empty | When it was approved, rejected or withdrawn. |
| decided_by_id | int64may be empty | The person who decided it. |
| decided_by_name | stringmay be empty | Their name. |
| decision_reason | stringmay be empty · free text | The reason given with the decision, in the decider's words. |
| approval_decision_id | int64may be empty | The approval_decisions row that decided it, when one did. |
| created_at | timestamp (UTC)always present | When the version was written. |
| roiva_url | stringalways present | The initiative's budget page in Roiva. |
budget_vs_actual
One row per budgeted initiative per as_of day: the snapshot's day, and the end of each of the last 8 complete fiscal quarters. How spend compares with the approved budget, computed as Roiva's budget pages and the Board Brief compute it. CapEx is a total against a total; OpEx is spend against the budget for the months elapsed. Only initiatives with an approved budget in effect on as_of have a row.
| Column | Type | What it means |
|---|---|---|
| snapshot_id | stringalways present | The snapshot this row belongs to. Every table in one snapshot describes the same moment. |
| as_of | datealways present | The day the comparison runs through. |
| initiative_id | int64always present | The initiative. |
| status | stringalways present | within or over, as Roiva shows it. Over when either the CapEx or the OpEx half is over. |
| budget_id | int64always present | The budget version in effect on as_of. |
| revised | booleanalways present | Whether the budget has been revised since it was first approved. |
| capex_budget_cents | int64 (cents)always present | CapEx signed off, in cents. |
| capex_actual_cents | int64 (cents)always present | CapEx spent since the budget began, in cents. |
| opex_budget_to_date_cents | int64 (cents)always present | OpEx budget for the months from the budget's start through as_of, in cents. |
| opex_actual_cents | int64 (cents)always present | OpEx spent over those months, in cents. |
| budget_to_date_cents | int64 (cents)always present | CapEx budget plus OpEx budget to date, in cents. |
| actual_to_date_cents | int64 (cents)always present | CapEx plus OpEx spent, in cents. |
| variance_cents | int64 (cents)always present | Budget to date less actual, in cents. Positive is under budget. |
| opex_budget_fiscal_year_cents | int64 (cents)always present | The OpEx budget for the whole fiscal year as_of falls in, in cents. |
| opex_budget_fiscal_ytd_cents | int64 (cents)always present | The part of it through as_of, in cents. |
| opex_actual_fiscal_ytd_cents | int64 (cents)always present | OpEx spent in the fiscal year through as_of, in cents. |
| spent_before_budget_cents | int64 (cents)always present | Spend dated before the budget began, reported apart rather than charged to it, in cents. |
| budget_monthly_run_rate_cents | int64 (cents)always present | The version's OpEx per month, in cents. |
| actual_monthly_run_rate_cents | int64 (cents)may be empty | Average OpEx per month over the recent complete months the budget covered, in cents. Empty before one has passed. |
portfolio_decisions
One row per portfolio decision, sample initiatives excluded. The account's decisions about its initiatives, with the figures each was taken on. The figures are all-time as of the decision, not the snapshot.
| Column | Type | What it means |
|---|---|---|
| snapshot_id | stringalways present | The snapshot this row belongs to. Every table in one snapshot describes the same moment. |
| portfolio_decision_id | int64always present | The decision's id in Roiva. |
| initiative_id | int64may be empty | The initiative decided on. Empty once that initiative has been deleted; the decision is kept. |
| subject_title | stringalways present | The initiative's name when it was decided. |
| outcome | stringalways present | continue, scale, fix, pause, retire. |
| stage_before | stringalways present | The initiative's stage before the decision. |
| stage_after | stringalways present | Its stage after. |
| rationale | stringalways present · free text | Why, in the words of whoever decided. |
| next_review_on | datemay be empty | When it is to be reviewed again. |
| cash_value_cents | int64 (cents)always present | Approved cash value to the decision, in cents. |
| freed_capacity_cents | int64 (cents)always present | Approved freed capacity to the decision, in cents. Not cash, and not in roi. |
| cost_to_date_cents | int64 (cents)always present | Cost to the decision, in cents. |
| planned_value_cents | int64 (cents)may be empty | The business case's value over its whole horizon, in cents, at the time. |
| planned_value_to_date_cents | int64 (cents)may be empty | The business case's value to the decision, in cents. |
| roi | doublemay be empty | Cash ROI at the decision: (cash value − cost) ÷ cost. Empty without both. |
| currency | stringalways present | The currency of the amounts. |
| decided_by_id | int64may be empty | The person who decided. |
| decided_by_name | stringmay be empty | Their name. |
| decided_at | timestamp (UTC)always present | When. |
| roiva_url | stringmay be empty | The initiative's decisions in Roiva. Empty once it has been deleted. |
accounting_periods
One row per month finance has opened for close. The account's accounting periods and whether each is locked. A month with no row has never been through close in Roiva.
| Column | Type | What it means |
|---|---|---|
| snapshot_id | stringalways present | The snapshot this row belongs to. Every table in one snapshot describes the same moment. |
| month | datealways present | The first day of the month. |
| status | stringalways present | open, in_review, locked, reopened. |
| locked | booleanalways present | Whether the month is locked now. |
| locked_at | timestamp (UTC)may be empty | When it was last locked. |
| locked_by_id | int64may be empty | Who locked it. |
| locked_by_name | stringmay be empty | Their name. |
| reopened_at | timestamp (UTC)may be empty | When it was last reopened. |
| reopened_by_id | int64may be empty | Who reopened it. |
| reopened_by_name | stringmay be empty | Their name. |
| reopen_reason | stringmay be empty · free text | Why it was reopened, in their words. |
ai_spend
One row per month per provider connection with a bill, one per month per AI vendor on the books and card feeds with a bill, plus one row per month for the card feeds together. AI spend as the providers billed it and as the books and cards paid AI vendors, before any initiative books it, and how much of it an initiative does. A provider row whose attribution is unlinked or unmapped, and an ai_vendor row whose attribution is unbooked, is spend no initiative carries. ai_billed_cents and ai_booked_cents on provider_bill and ai_vendor rows add up to the figures Finance > AI Spend shows, except that a sample initiative's booking is never counted here: the page counts one while the account has only sample data. Card rows are what corporate cards were charged, stated beside the other rows and never added to them: an AI vendor's charges are in its ai_vendor row too. Every amount is US dollars: a bill in another currency counts at its month's ECB rate (a bill on the books or cards at its day's), or the latest one while that month's rates are out, and one with no ECB rate is in no row. Card rows count charges made in US dollars.
| Column | Type | What it means |
|---|---|---|
| snapshot_id | stringalways present | The snapshot this row belongs to. Every table in one snapshot describes the same moment. |
| month | datealways present | The first day of the month. |
| source_kind | stringalways present | provider_bill for a provider's own bill, ai_vendor for an AI vendor's bills on the books and card feeds, card for the card feeds. |
| connection_id | int64may be empty | The provider connection. Empty on ai_vendor and card rows. |
| platform | stringmay be empty | The provider. Empty on ai_vendor and card rows. |
| connection_name | stringmay be empty | The connection's name in Roiva. Empty on ai_vendor and card rows. |
| vendor_name | stringmay be empty | The AI vendor, as Roiva names it: on its list of AI vendors, or as an Owner or Admin counted it. Empty on provider_bill and card rows. |
| billed_cents | int64 (cents)always present | What was billed, or charged to the cards, that month, in cents. The whole bill: for a cloud, data platform or GitHub connection, ai_billed_cents is the AI part of it. On an ai_vendor row, the vendor's bills on the books and cards, less any part its own connection bills. |
| currency | stringalways present | The currency of the amounts. |
| attribution | stringmay be empty | attributed when an initiative books the connection's bill or the vendor's bills; unlinked when no initiative links the connection; unmapped when it is linked but nothing maps its costs; unbooked when no initiative books the vendor's bills. Empty on card rows. |
| set_aside | booleanmay be empty | Whether an admin marked the connection, or the vendor on every connection carrying it, as belonging to no initiative. Its spend still counts as unattributed. Empty on card rows. |
| initiative_count | int64may be empty | How many initiatives take cost from the connection or the vendor's bills. Empty on card rows. |
| booked_cents | int64 (cents)may be empty | On a card row, the part of the charges already booked to an initiative, and on an ai_vendor row, of the vendor's bills, in cents. Empty on provider rows; ai_booked_cents is theirs. |
| ai_billed_cents | int64 (cents)may be empty | The AI part of billed_cents, in cents: all of a model provider's bill; a cloud, data platform or GitHub bill's AI services and the lines an initiative claims; all of an ai_vendor row's billed_cents. What Finance > AI Spend counts as billed. Empty on card rows. |
| ai_booked_cents | int64 (cents)may be empty | What of ai_billed_cents an initiative's links book, in cents: 0 when unlinked, unmapped or unbooked. ai_billed_cents less this is what Finance > AI Spend calls attached to nothing. Empty on card rows. |
reported_totals
One row per window, for the portfolio and for each initiative: all time, each fiscal quarter and each fiscal year from the first with value or cost. Approved cash value and freed capacity, kept apart, with cost, net cash value and cash ROI, exactly as Roiva's reports compute them, sample initiatives excluded. Freed capacity is in neither the net value nor the ROI. A figure built from reported_value and costs must equal the row for its window; Roiva checks that before publishing a snapshot.
| Column | Type | What it means |
|---|---|---|
| snapshot_id | stringalways present | The snapshot this row belongs to. Every table in one snapshot describes the same moment. |
| scope | stringalways present | portfolio for the whole account, initiative for one initiative. |
| initiative_id | int64may be empty | The initiative, for an initiative row. |
| window_kind | stringalways present | all_time, fiscal_quarter or fiscal_year. |
| window_key | stringalways present | The window's key: all, fy2026-q1, fy2026. |
| window_label | stringalways present | The window as Roiva names it. |
| from_date | datemay be empty | The window's first day. Empty for all time. |
| through_date | datemay be empty | The window's last day. Empty for all time. |
| window_complete | booleanalways present | Whether the window had ended when the snapshot was built. |
| cash_value_cents | int64 (cents)always present | Approved cash value in the window, in cents: the margin on revenue earned, costs that fell, losses and spend that didn't happen, and freed capacity shown to have become cash. |
| freed_capacity_cents | int64 (cents)always present | Approved freed capacity in the window, in cents: hours and output freed, priced at what they cost. Not cash, and in no other figure here; never add it to cash_value_cents. |
| cost_cents | int64 (cents)always present | Cost in the window, in cents. |
| net_value_cents | int64 (cents)always present | Cash value less cost, in cents. Freed capacity is not in it. |
| roi | doublemay be empty | Cash ROI: net value ÷ cost. Empty unless both cash value and cost are above zero, as in Roiva. |
| capex_cents | int64 (cents)may be empty | The CapEx part of cost_cents, in cents. Portfolio rows only. |
| opex_cents | int64 (cents)may be empty | The OpEx part of cost_cents, in cents. Portfolio rows only. |
| planned_value_to_date_cents | int64 (cents)may be empty | The business cases' value for the months of the window each initiative was live, in cents: the plan the approved value is set against. Portfolio rows only; leaves out a plan Roiva filled in that no one has confirmed. |
| planned_capacity_to_date_cents | int64 (cents)may be empty | The business cases' freed capacity for the months of the window each initiative was live, in cents. Portfolio rows only; leaves out a plan Roiva filled in that no one has confirmed. |
| planned_opex_to_date_cents | int64 (cents)may be empty | The business cases' running cost for the months of the window each initiative was under way, in cents. Portfolio rows only; leaves out a plan Roiva filled in that no one has confirmed. |
| planned_capex_cents | int64 (cents)may be empty | The business cases' one-off cost, in cents. Portfolio rows only; leaves out a plan Roiva filled in that no one has confirmed. |
| vendor_price_effect_cents | int64 (cents)may be empty | Of the approved value, the part AI providers' own price changes gave, in cents. Portfolio rows only; empty where no entry carries that split. |