Skip to content

Invoices and Reconciliation: Match Provider Bills Against Synced Cost Data

The Invoices page puts provider invoices next to the cost data Xplorr synced, and explains the difference between them.

This matters because the two numbers are not supposed to be identical. Cost APIs report usage; invoices report what you were billed, including credits, tax, support, marketplace charges and commitment purchases that land on their own schedule. Reconciliation tells you whether a gap is one of those expected differences or a real problem.

ProviderInvoice sourceSetup
AWSInvoicing APIinvoicing:ListInvoiceSummaries plus the 12 digit payer account ID
AzureBilling REST APIA billing role (Billing account reader or Invoice manager) plus the billing account ID
GCPNo public invoice APIUpload invoices as CSV. A billing account ID adds the month’s budget as a hint.
Anything elseNoneUpload as CSV

Google Cloud has no public invoice API for most billing accounts, so GCP invoices are downloaded from the Google console and uploaded here. The Cloud Billing budget figure Xplorr can read is shown next to reconciliation as a hint and is never treated as an invoice.

A note on AWS: invoice PDFs are not exposed by the API, so AWS rows never carry a PDF link. Azure rows do.

A note on Azure: subtotal and tax are only broken out for Microsoft Customer Agreement accounts. Under other agreement types the billed amount is used as the subtotal.

Open Invoices > Setup. Each cloud account gets a card. Admins can:

  1. Enter the Payer account ID (AWS) or Billing account ID (Azure, or GCP for the budget hint).
  2. Click Save.
  3. Click Enable, which is available for providers with an invoice API.

Everything is off by default. Xplorr stores only these non secret settings here; your cloud credentials stay where they already are.

Three admin actions sit at the top of the page:

  • Sync fetches invoices from the provider, then reconciles in the same run.
  • Reconcile re-runs the comparison against invoices already on record.
  • Upload takes a CSV for providers without an API.

The period selector covers the last 12 months and starts at last month. The current month is deliberately not selectable, because an incomplete month cannot be reconciled meaningfully.

Automatically, invoice sync runs at 06:00 UTC on the 6th and on the 16th of each month, always for the previous month. The 6th catches invoices as providers issue them; the 16th picks up late cost data and invoice corrections once they settle.

Sync, reconcile and upload are limited to 10 requests per 15 minutes per user.

For each cloud account and billing month, Xplorr compares the invoice totals for that month against synced cost data for the same account and month, grouped by charge category.

It checks two bases:

  • Pre tax: invoice subtotal against platform cost excluding tax
  • With tax: invoice total against the full platform cost

A month counts as matched if it is within the threshold on either basis. The default threshold is 1 percent, and you can pass a different one when running reconciliation manually.

StatusMeaning
MatchedWithin the threshold on at least one basis
VarianceOutside the threshold on both bases
No invoiceCost data exists for the month but no invoice does
No cost dataAn invoice exists but no cost data was synced

When there is neither an invoice nor cost data, no result is recorded at all rather than a misleading zero.

An account is in scope for reconciliation if it has an enabled invoice integration or at least one invoice on record, so a single CSV upload is enough to bring an account in.

This is the part that saves the most time. Rather than leaving you with “the numbers differ by 4.2 percent”, Xplorr tests each charge category to see whether adding or removing it closes the gap, and flags the one that does.

Categories it tests, and why each commonly explains a difference:

CategoryTypical explanation
CreditThe invoice amount is gross of credits, or credits were applied on a different invoice
TaxTax is only comparable on the with tax basis
SupportSupport is often billed on a separate invoice or lags a month
MarketplaceMarketplace charges are usually invoiced separately by the seller of record
PurchaseCommitment upfront fees can land on a different invoice date than the usage they cover
FeeFees can be billed separately
AdjustmentAdjustments are applied by the provider after the invoice is issued

When nothing explains it, the result says so and suggests rerunning after the provider finalizes the bill, because recent months keep updating.

Other notes you may see: invoices in several currencies are summed without conversion, and a mismatch between invoice currency and cost data currency is called out rather than silently converted.

Use this for GCP and any provider without an API. One row per invoice, header row required.

invoice_id,billing_period_start,billing_period_end,issue_date,due_date,currency,subtotal,tax,total,status,invoice_type,pdf_url

Rules:

  • Required: invoice_id, billing_period_start as YYYY-MM-DD (or billing_period as YYYY-MM), and total
  • Defaults: billing_period_end becomes the end of the start month, tax becomes 0, subtotal becomes total minus tax, currency becomes USD, status becomes issued
  • Allowed statuses: issued, due, paid, overdue, void, credit_memo
  • currency must be a 3 letter code
  • pdf_url must be https. It is stored as a link only and is never fetched.
  • Maximum 1 MB and 1000 rows per upload
  • Column names are case insensitive, quoted fields are supported

Errors are reported per row with the spreadsheet line number, showing the first 10.

An uploaded invoice never overwrites one synced from a provider API. Those rows are reported as skipped instead.

Only uploaded invoices can be deleted. Invoices synced from a provider cannot be removed by hand.

The Invoices tab lists invoices with period, account, invoice number, dates, subtotal, tax, total, status and reconciliation status. Clicking a row opens the invoice with its line items and the month’s reconciliation.

The Reconciliation tab shows one card per account with the invoice subtotal, the platform cost pre tax, the difference and its percentage, the with tax comparison, the charge category breakdown, and the explanation notes.

“This month has not been reconciled yet”

Run Reconcile for that period, or wait for the scheduled run on the 6th or 16th.

AWS invoices are not syncing

Xplorr needs the 12 digit payer account ID. It uses the account’s external ID when that is a payer account, otherwise set it explicitly on the Setup tab.

Azure invoices are not syncing

The billing account ID is required, and the service principal needs a billing role. Reader on the subscription is not enough.

Everything shows “No invoice”

Either the integration is not enabled, or the provider has no API and needs a CSV upload.

A variance appeared that was not there last week

Cost data for recent months keeps updating as providers finalize bills. That is exactly why the second scheduled run exists on the 16th.

Can I export reconciliation results? Not from this page. Invoices and reconciliation are viewed in the console. Reports and Export covers cost data exports, and MSP statements have their own downloads.

What threshold should I use? Start at the 1 percent default. Tighten it once you understand which categories routinely explain your gaps.

Does reconciliation change my cost data? No. It only compares and records the result.

Who can sync, reconcile or upload? Admins. Anyone in the organization can read the page for accounts they have access to.