Data Connections

Connecting a FOCUS data source

Overview

DigiUsher can read billing data from any source: datacenter costs, SaaS tools, internal chargebacks, or another expense. The data must be a CSV file in the FOCUS format. FOCUS is the open billing-data standard of the FinOps Foundation. You upload the CSV files to an S3 bucket, in one folder for each month. DigiUsher then reads them on a schedule.

Common use cases:

  • Datacenter costs, such as colocation, power, networking, and hardware amortization.
  • SaaS tools, such as Datadog, Snowflake, and New Relic, or any other vendor that gives you billing data.
  • Internal chargebacks, such as shared services, platform teams, and cost allocation.
  • Multi-cloud consolidation, for the providers that DigiUsher does not support directly.

One guide, three catalog tiles

The tiles FOCUS Import, Custom Cost, and Private Datacenter in Connectors > Add Source all use the S3 import of this page. Only their labels in the catalog are different. Select the label that describes your data best.


What You'll Need

ItemDetails
S3 bucketAny AWS region (no region restriction)
IAM roleCross-account role granting DigiUsher read access
Billing dataFOCUS-formatted CSV files organized in monthly folders

Data Format

Folder Structure

Put the files in one folder for each month. The folder name uses the format YYYY-MM:

s3://your-bucket/billing-exports/
├── 2025-01/
│   ├── expenses.csv
│   └── additional.csv.gz
├── 2025-02/
│   └── expenses.csv
└── 2025-03/
    └── expenses.csv.gz
  • You can put more than one file in a month folder. DigiUsher merges them when it reads them.
  • DigiUsher accepts the formats .csv and .csv.gz, which is gzip-compressed.
  • Every row of a file must have a ChargePeriodStart date in the month of the folder name.

Column Specification

Your CSV files must follow the FOCUS specification. The full column reference gives the necessary columns, the optional columns, the permitted enum values, and the data types. You can read it in the FOCUS Any Column Specification sheet, and in this page:

Example CSV

This is a small example with the necessary columns:

BilledCost,BillingAccountId,BillingCurrency,BillingPeriodStart,BillingPeriodEnd,ChargeCategory,ChargeFrequency,ChargePeriodStart,ChargePeriodEnd,EffectiveCost,ListCost,Provider,ResourceId,ServiceCategory,ServiceName
150.00,acct-001,USD,2025-03-01T00:00:00Z,2025-03-31T23:59:59Z,Usage,Recurring,2025-03-01T00:00:00Z,2025-03-02T00:00:00Z,150.00,180.00,Equinix,cab-42,Networking,Colocation
0.50,acct-001,USD,2025-03-01T00:00:00Z,2025-03-31T23:59:59Z,Usage,Usage-based,2025-03-01T00:00:00Z,2025-03-02T00:00:00Z,0.50,,Internal,,Compute,Shared GPU Cluster
-25.00,acct-001,USD,2025-03-01T00:00:00Z,2025-03-31T23:59:59Z,Credit,One-Time,2025-03-01T00:00:00Z,2025-03-31T23:59:59Z,-25.00,,Vendor,,Others,Promotional Credit

Amounts can be negative

Write a credit, a discount, and a refund as a negative amount in BilledCost and in EffectiveCost.


S3 Setup

Create or Choose an S3 Bucket

You can use an S3 bucket that exists, or create a new bucket. Every AWS region works.

  1. Go to S3 → Create bucket.
  2. Enter a globally unique name, for example acme-corp-focus-billing.
  3. Select your region.
  4. Keep Block all public access enabled. This is the default.
  5. Create the bucket.

Upload Your Billing Data

Put your CSV files in monthly folders under one prefix:

# Example: upload March 2025 data
aws s3 cp expenses.csv s3://acme-corp-focus-billing/billing-exports/2025-03/expenses.csv

Important

CAUTION: Every row of a file must have a ChargePeriodStart date in the month of the folder name. A file in 2025-03/ must contain only rows with a ChargePeriodStart in March 2025. DigiUsher rejects a file with a date from another month.

Create an IAM Role

Create an IAM role that lets DigiUsher read from your bucket.

  1. Go to IAM → Roles → Create role.
  2. Select Another AWS account.
  3. Enter the Account ID 058264546051.
  4. Select Require external ID and enter an External ID of your choice. A UUID is a good value. You enter the same value in DigiUsher.
  5. Click Next. Do not attach a managed policy yet.
  6. Give the role a name, for example DigiUsherFocusRole.
  7. Create the role.

Attach S3 Read Policy

Give the role read-only access to your billing bucket.

  1. Go to IAM → Roles and select DigiUsherFocusRole.
  2. Click Add permissions → Create inline policy.
  3. Change to the JSON tab.
  4. Paste the policy JSON from the CLI tab. Replace the bucket name and the prefix with your own values.
  5. Give the policy the name DigiUsherFocusBillingAccess.

Note the Role ARN

  1. Go to IAM → Roles and select DigiUsherFocusRole.
  2. Copy the Role ARN, for example arn:aws:iam::123456789012:role/DigiUsherFocusRole.

Connect in DigiUsher

Go to Connectors > Add Source and select FOCUS Import, Custom Cost, or Private Datacenter. On the Configure step, enter the values in the table, then click Review. On the Connect step, click Connect source.

FieldRequiredWhere to Find
Display NameYesAny label you prefer (for example Datacenter Costs)
S3 Bucket NameYesYour S3 bucket name (for example acme-corp-focus-billing)
Bucket PrefixYesThe folder prefix that holds your YYYY-MM/ folders (for example billing-exports/)
IAM Role ARNYesIAM > Roles > DigiUsherFocusRole > ARN
External IDRecommendedThe value from the trust policy of the role. It protects against the confused deputy problem

How Ingestion Works

After the connection, DigiUsher does these four steps automatically:

  1. It finds the new files. It lists your S3 bucket at each import cycle.
  2. It checks each CSV file against the FOCUS schema: the necessary columns, the data types, and the enum values.
  3. It reads the valid data into the analytics engine of DigiUsher.
  4. It records the ETag of each file. It does not read a file again while the content of that file stays the same.

Sub-Account Mapping

If your CSV file has a SubAccountId column, DigiUsher creates a child data source for each different value. You can then divide the costs by department, team, or business unit. If the column is absent, all costs belong to the parent data source.

Lookback Window

The first import after the connection covers the current month and the 3 months before it. The daily import after that reads the current month and the 2 months before it again, and it finds the new files and the changed files. It does not read an older month folder. To read more history, write to support.


Setup Checklist

  • CSV files uploaded to the YYYY-MM/ folders under your prefix
  • Necessary columns present, and none of them empty. The column specification gives the list
  • BillingCurrency uses a valid ISO 4217 currency code
  • ChargePeriodStart dates in the month of the folder
  • IAM role created, with a trust policy for the DigiUsher account
  • S3 read policy (s3:ListBucket, s3:GetObject) attached to the role
  • Role ARN, bucket name, and prefix entered in DigiUsher

Troubleshooting

"No billing periods found"

  • Make sure that your folder names use the format YYYY-MM/, for example 2025-03/. The names 202503/ and March-2025/ do not work.
  • Make sure that the bucket prefix in DigiUsher points to the place of your folders.
  • Make sure that your data is inside the lookback window. Read Lookback Window.

"FOCUS CSV validation failed"

  • Make sure that all necessary columns are present. The column specification gives the list.
  • Make sure that the enum columns ChargeCategory, ChargeFrequency, and ServiceCategory use permitted values.
  • Make sure that BillingCurrency is a valid ISO 4217 code, for example USD, EUR, or GBP.

"Access Denied"

  • Make sure that the trust policy of the IAM role names the correct DigiUsher account ID (058264546051).
  • Make sure that the External ID in the trust policy matches the External ID in DigiUsher.
  • Make sure that the S3 policy gives s3:ListBucket on the bucket and s3:GetObject on the prefix.

Data not appearing after connection

  • The first import can take up to one hour. The time depends on the volume of the data.
  • Make sure that the files have the extension .csv or .csv.gz.
  • DigiUsher does not read a file again while its ETag stays the same. Upload a new file or a changed file.

Need Help?

If this page does not answer your question, write to DigiUsher support at support@digiusher.com. The team will help you.

On this page