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
| Item | Details |
|---|---|
| S3 bucket | Any AWS region (no region restriction) |
| IAM role | Cross-account role granting DigiUsher read access |
| Billing data | FOCUS-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
.csvand.csv.gz, which is gzip-compressed. - Every row of a file must have a
ChargePeriodStartdate 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 CreditAmounts 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.
- Go to S3 → Create bucket.
- Enter a globally unique name, for example
acme-corp-focus-billing. - Select your region.
- Keep Block all public access enabled. This is the default.
- 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.csvImportant
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.
- Go to IAM → Roles → Create role.
- Select Another AWS account.
- Enter the Account ID
058264546051. - 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.
- Click Next. Do not attach a managed policy yet.
- Give the role a name, for example
DigiUsherFocusRole. - Create the role.
Attach S3 Read Policy
Give the role read-only access to your billing bucket.
- Go to IAM → Roles and select
DigiUsherFocusRole. - Click Add permissions → Create inline policy.
- Change to the JSON tab.
- Paste the policy JSON from the CLI tab. Replace the bucket name and the prefix with your own values.
- Give the policy the name
DigiUsherFocusBillingAccess.
Note the Role ARN
- Go to IAM → Roles and select
DigiUsherFocusRole. - 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.
| Field | Required | Where to Find |
|---|---|---|
| Display Name | Yes | Any label you prefer (for example Datacenter Costs) |
| S3 Bucket Name | Yes | Your S3 bucket name (for example acme-corp-focus-billing) |
| Bucket Prefix | Yes | The folder prefix that holds your YYYY-MM/ folders (for example billing-exports/) |
| IAM Role ARN | Yes | IAM > Roles > DigiUsherFocusRole > ARN |
| External ID | Recommended | The 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:
- It finds the new files. It lists your S3 bucket at each import cycle.
- It checks each CSV file against the FOCUS schema: the necessary columns, the data types, and the enum values.
- It reads the valid data into the analytics engine of DigiUsher.
- 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
-
BillingCurrencyuses a valid ISO 4217 currency code -
ChargePeriodStartdates 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 example2025-03/. The names202503/andMarch-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, andServiceCategoryuse permitted values. - Make sure that
BillingCurrencyis a valid ISO 4217 code, for exampleUSD,EUR, orGBP.
"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:ListBucketon the bucket ands3:GetObjecton 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
.csvor.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.
DigiUsher Documentation