Reporting and Analytics
SpendOne is the AI-based platform for indirect corporate spend. Reporting and analytics turn that captured spend data into operational dashboards, finance-ready exports, and savings evidence: the same numbers that back the savings model on spendone.com/en/calculator.
This guide covers the reporting surface from two angles: admins working in the UI, and integrators pulling data through the API. For the full schema, see the API reference.
What you can report on
- Operational stats: open purchase requests, pending approvals, ready-to-order POs, urgent accountant tasks.
- Spend slicing:
GET /reports/spendgroups by supplier, buyer, cost center, org unit, purchase category or product category, over a 3, 6 or 12 month window, on net or gross amounts. - Workflow performance: average approval response time, approval rate, rejected approvals, unassigned cases.
- Finance exports: CSV and FI exports of invoices and transaction events for downstream FI tools.
- Savings tracking: auditable record of approved POs, negotiated supplier terms, and Skonto (early payment discount) capture.
For admins
The dashboard landing screen is role-aware. One payload powers four different views, depending on which roles a user holds (Admin, Accountant, Approver, Buyer). You see only the panels relevant to your role set.
Admin overview
- Total spend month-to-date with currency breakdown.
- All orders / completed orders counts, each with the caller's unread comment count on the requests behind it.
- Pending approvals across the company, including unassigned approval requests.
- Total active suppliers.
Slicing spend
In the purchase orders and invoices lists, filter by:
- Supplier (name or supplier code)
- Cost center
- Status (ordered, disputed, completed, etc.)
- Date range
- Free-text search (matches PO code and supplier name)
There is no tagging feature. Arbitrary cohorts are expressed through the dimensions the objects already carry: supplier, buyer, cost center, org unit, purchase category and product category, each of them a group_by value on GET /reports/spend and a filter on the list endpoints. Legal entity is a filter there (entity, empty or ALL for consolidated), not a grouping key.
Exports
- CSV exports: configurable per profile (which fields, which order, which target system). Set up export profiles once under Settings → Accounting → CSV Export, then trigger downloads on demand.
- FI exports: create export jobs that bundle invoices and produce a downloadable file, whatever export method the tenant is on.
- Transaction events export: credit-card and reconciled transactions, async job with a download URL.
Savings tracking
The savings story sits on top of three signals already captured by the platform:
- Skonto fields on invoices (deadline + percent), tracked per invoice and surfaced in the additional-data panel.
- Negotiated unit prices on purchase requests vs. final invoiced amounts (variance is visible per case).
- Approved-vs-actual deltas on purchase orders, exposed via the dispute and reconciliation flows.
Feed these into your BI tool via the export endpoints below.
For integrators
All reporting endpoints are under /api/v1. Authentication and tenancy follow the standard rules described in the API reference.
There is no stats endpoint to integrate against
The dashboard landing screen's counters are served by a backend-for-frontend
endpoint that is not part of the integration surface, so they are not in the
reference and there is nothing to call. Everything the panels show is derivable
from the endpoints below: GET /reports/spend for the spend figures, and the
list endpoints with the filter each panel describes for the counts behind them.
A list's pagination.total is the count of the whole filtered set, so a count
costs one request with limit=1.
Slicing spend by supplier, cost center, category
GET /reports/spend is the aggregation endpoint. It groups server-side:
| Parameter | Values |
|---|---|
group_by | supplier, user, cost_center, org_unit, product_category, purchase_category |
lens | committed, invoiced |
window | 3m, 6m, 12m |
amount | net, gross |
| filters | entity, supplier, user, cost_center, org_unit |
GET /reports/subscriptions, GET /reports/transactions and GET /reports/my-scope cover the other report surfaces.
For anything the report endpoints do not group by, list the underlying objects and aggregate client-side:
| Method | Path | Filters that matter for slicing |
|---|---|---|
| GET | /invoices | limit, offset, search only. Filter richer criteria on /reports/spend |
| GET | /purchase-orders | supplier_code, supplier_name, status, sort_by, search |
| GET | /subscriptions | suppliers, statuses, contract_end_from / contract_end_to, and ~15 more |
Time-series
GET /reports/spend returns a series of monthly buckets, each carrying by_dimension totals, plus grand_totals. Bucket client-side only for a grouping the endpoint does not offer.
Exports
| Method | Path | Purpose |
|---|---|---|
| GET | /csv-export/profiles | List configured CSV export profiles |
| POST | /csv-export/profiles | Create a CSV export profile |
| GET | /csv-export/profiles/{code} | Get a profile |
| PUT | /csv-export/profiles/{code} | Update profile |
| DELETE | /csv-export/profiles/{code} | Delete profile |
| POST | /csv-export/profiles/{code}/duplicate | Duplicate an existing profile |
| GET | /csv-export/profiles/{code}/fields | List configured fields for a profile |
| POST | /csv-export/profiles/{code}/fields | Add a field |
| PUT | /csv-export/profiles/{code}/field-order | Reorder fields |
| GET | /csv-export/available-fields | All fields that can be added to a profile |
| POST | /csv-export/profiles/preview | Preview CSV output without writing it |
| GET | /csv-export/targets | Configured delivery targets (e.g. SFTP, S3) |
| POST | /csv-export/targets | Create a delivery target |
| GET | /csv-export/method | Currently selected export method |
| PUT | /csv-export/method | Switch export method |
| POST | /fi-export/jobs | Trigger a finance-tool export job |
| GET | /fi-export/jobs | List export runs across every method, filtered by export_method/status |
| GET | /fi-export/jobs/{job_code} | One export run with its per-invoice submissions |
| GET | /fi-export/jobs/{job_code}/download-url | Pre-signed download URL for the produced archive |
| POST | /transaction-events/export | Start a transaction-events export job |
| GET | /transaction-events/export/{job_code} | Poll job status |
| GET | /transaction-events/export/{job_code}/download | Download the produced file |
A typical integration sequence:
POST /csv-export/profiles: define which fields you want, in which order.POST /csv-export/profiles/preview: sanity-check the column layout.POST /fi-export/jobs(orPOST /transaction-events/exportfor card data): kick off the job.- Poll the job endpoint until status is terminal.
GET .../download-url(or.../download): pull the file.
Savings reporting
Savings are computed from primary records. There is no dedicated savings endpoint. The recommended path is:
- List invoices with
GET /invoices, then fetch each one withGET /invoices/{code}. The list item does not carry the discount fields. - The full invoice carries
early_payment_discount_percentage,early_payment_discount_amountandearly_payment_deadline(with tier-2 variants alongside). - Cross-reference with
GET /purchase-ordersto compare PO target price vs. invoiced amount. - Either export through a CSV profile or aggregate in your BI layer.
This keeps the savings number traceable down to the source invoice, which is both the evidence trail auditors expect and the trail surfaced in the audit log (see Audit Log and Compliance).