Skip to main content

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/spend groups 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:

  1. Skonto fields on invoices (deadline + percent), tracked per invoice and surfaced in the additional-data panel.
  2. Negotiated unit prices on purchase requests vs. final invoiced amounts (variance is visible per case).
  3. 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:

ParameterValues
group_bysupplier, user, cost_center, org_unit, product_category, purchase_category
lenscommitted, invoiced
window3m, 6m, 12m
amountnet, gross
filtersentity, 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:

MethodPathFilters that matter for slicing
GET/invoiceslimit, offset, search only. Filter richer criteria on /reports/spend
GET/purchase-orderssupplier_code, supplier_name, status, sort_by, search
GET/subscriptionssuppliers, 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​

MethodPathPurpose
GET/csv-export/profilesList configured CSV export profiles
POST/csv-export/profilesCreate 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}/duplicateDuplicate an existing profile
GET/csv-export/profiles/{code}/fieldsList configured fields for a profile
POST/csv-export/profiles/{code}/fieldsAdd a field
PUT/csv-export/profiles/{code}/field-orderReorder fields
GET/csv-export/available-fieldsAll fields that can be added to a profile
POST/csv-export/profiles/previewPreview CSV output without writing it
GET/csv-export/targetsConfigured delivery targets (e.g. SFTP, S3)
POST/csv-export/targetsCreate a delivery target
GET/csv-export/methodCurrently selected export method
PUT/csv-export/methodSwitch export method
POST/fi-export/jobsTrigger a finance-tool export job
GET/fi-export/jobsList 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-urlPre-signed download URL for the produced archive
POST/transaction-events/exportStart a transaction-events export job
GET/transaction-events/export/{job_code}Poll job status
GET/transaction-events/export/{job_code}/downloadDownload the produced file

A typical integration sequence:

  1. POST /csv-export/profiles: define which fields you want, in which order.
  2. POST /csv-export/profiles/preview: sanity-check the column layout.
  3. POST /fi-export/jobs (or POST /transaction-events/export for card data): kick off the job.
  4. Poll the job endpoint until status is terminal.
  5. 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:

  1. List invoices with GET /invoices, then fetch each one with GET /invoices/{code}. The list item does not carry the discount fields.
  2. The full invoice carries early_payment_discount_percentage, early_payment_discount_amount and early_payment_deadline (with tier-2 variants alongside).
  3. Cross-reference with GET /purchase-orders to compare PO target price vs. invoiced amount.
  4. 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).