Snowflake Data Sharing gives your Snowflake account read-only SQL access to aDocumentation Index
Fetch the complete documentation index at: https://docs.vantage.sh/llms.txt
Use this file to discover all available pages before exploring further.
daily_costs table containing the same processed cost data you see in Vantage Cost Reports, delivered via Secure Data Sharing.
This feature is built for data engineering teams and FinOps practitioners who already operate in warehouse-native workflows. Once enabled, you can query Vantage cost data alongside your own datasets, power your BI tools without building ingestion pipelines, and join cost data with revenue, usage, or organizational metadata directly in SQL.
daily_costs contains rows from every provider you have connected to Vantage—AWS, Azure, GCP, Snowflake, AI providers, and so on—distinguished by the provider column. The schema is normalized so that the same column set works across all providers. Where the meaning of a column varies by provider, Discovering Your Data below shows you how to introspect what’s actually in your table.
How It Works
Vantage stores your processed cost data as an Apache Iceberg table in Vantage-owned AWS infrastructure. A managed Snowflake catalog integration in the Vantage Snowflake account makes that table queryable, and a Secure Data Share exposes it to your Snowflake account. Key properties of this architecture:- No data is copied into your Snowflake account. The Secure Data Share gives your account queryable access to data that lives in the Vantage-managed Iceberg table.
- Data refreshes whenever the Vantage ETL completes for a billing period. This typically tracks the same cadence you see in the Vantage console for that provider. See the provider data refresh documentation for details.
- The share lives in the same cloud region as your Snowflake account, so your queries do not incur cross-region or internet egress on Vantage’s side.
Cost Considerations
You pay Snowflake for the compute used to run your queries (warehouse credits). Vantage does not charge per query. Because the Secure Data Share lives in the same cloud region as your Snowflake account, you do not incur cross-region or internet egress on Vantage’s side when you query the data. For guidance on sizing the warehouse you point at the share, see Snowflake’s warehouse considerations.Get Access
Open the Snowflake Export integration
Provide your Snowflake details
ORGNAME.ACCOUNTNAME) and select the Region where your Snowflake account is hosted from the dropdown.Connect the Share in Snowflake
After Vantage confirms your share is ready, run the following in Snowflake to mount the data. Replace the placeholders with the values Vantage provided.Verify the inbound share
Create a database from the share
VANTAGE_DB. See Snowflake’s CREATE DATABASE … FROM SHARE reference for full syntax.ACME123.VANTAGE_AWS_US_EAST_1.VANTAGE_SHARE_ACME).VANTAGE database from the Snowflake integration, use a different name to avoid a collision.Confirm the schema and table
<YOUR_NAMESPACE>.DAILY_COSTS. Queries can reference either case.The daily_costs Table
daily_costs is the table exposed through Snowflake Data Sharing. It contains one row per resource per day, after Vantage’s ETL has processed it and merged any Virtual Tags you’ve configured. The numbers match what you see in Cost Reports for the same filters.
Schema
| Column | Type | Description |
|---|---|---|
provider | VARCHAR | Identifies which connected provider the row came from, lowercase (e.g., aws, azure, gcp, anthropic, datadog). Always populated. |
service_name | VARCHAR | The service the row belongs to (e.g., AmazonEC2, claude-sonnet-4, Datadog Infrastructure). Values are scoped per provider. |
region_id | VARCHAR | Provider region identifier where the resource ran. May be empty for SaaS providers without a region concept. |
resource_id | VARCHAR | Provider-native resource identifier (e.g., AWS ARN, Azure resource ID, GCP resource path). This is the raw identifier, not a friendly display name. May be empty for providers that do not expose a per-resource identity. |
service_category | VARCHAR | Vantage’s normalized service category (e.g., Compute, Storage, AI and Machine Learning). Values are scoped per provider. See Discovering Your Data to see what’s in your table. |
service_subcategory | VARCHAR | Vantage’s normalized service subcategory. Values are scoped per provider. |
consumed_unit | VARCHAR | Unit of measurement for consumed_quantity. Varies by provider (e.g., Hrs, GB-Mo, Tokens, Requests). |
charge_period_start | DATE | Day the charge applies to. |
charge_period_end | DATE | Exclusive upper bound: always charge_period_start + 1 day. |
billed_cost | NUMBER(26,10) | Cost without amortizing upfront commitments. Closest to AWS “Unblended”. |
amortized_cost | NUMBER(26,10) | Cost with upfront commitments (RIs, Savings Plans) spread across their term. |
consumed_quantity | NUMBER(26,10) | Amount of consumed_unit consumed. |
billing_account_id | VARCHAR | Top-level billing account (e.g., AWS payer/management account, GCP billing account, Azure billing account). May be empty for providers without a multi-account hierarchy. |
sub_account_id | VARCHAR | Sub-account, project, or workspace within billing_account_id (e.g., AWS linked account, GCP project, Azure subscription). |
charge_category | VARCHAR | Classifies the row as Usage, Discounted, Undiscounted, Tax, Refund, or Credit. See charge_category values below. |
tags | VARCHAR | JSON-encoded resource tags plus any Vantage Virtual Tags. Default is '{}'. May be empty for providers that do not support tagging. |
billed_cost and amortized_cost can each be NULL on rows where that view doesn’t apply. Always use SUM() (which ignores NULL) and pick one column or the other. Never add them together, because some rows populate both with the same value and would be double-counted.import_token column. This is an internal Vantage identifier used for data loading and is not meaningful for querying. You can safely ignore it.Date Semantics
Rows are daily.charge_period_start is the day the charge applies to, and charge_period_end is always exactly one day later (exclusive). To select a date range, filter on charge_period_start only:
charge_period_end instead, keep in mind that it’s already a day ahead, which makes it easy to accidentally drop the first or last day of your range. Using charge_period_start on both sides avoids this issue. Every example on this page follows this logic.
charge_category Values
charge_category is a normalized category that does not depend on the upstream provider’s vocabulary. Rows fall into one of:
| Value | Meaning |
|---|---|
Usage | Standard usage charges. The default for rows that do not match any specific bucket. |
Discounted | Discounted usage rows (e.g., RI- or Savings-Plan-covered usage). |
Undiscounted | Usage at on-demand rates with no commitment applied. |
Tax | Tax line items. |
Refund | Refund line items. |
Credit | Credit line items. |
Tags
Thetags column stores resource tags as a JSON-encoded string with a default of '{}'. Use Snowflake’s PARSE_JSON and the : accessor to read tag values. Rule-based Virtual Tags are merged into this column.
daily_costs. Those allocations are computed separately inside Vantage and do not yet flow into the export. Standard Virtual Tags that map tag values directly (e.g., renaming or consolidating tag keys) are included.Query Cookbook
The examples below all targetVANTAGE_DB.<your_namespace>.daily_costs. Replace the database name and namespace with your own values.
Most examples use SUM(amortized_cost) with charge_category IN ('Usage', 'Discounted') to match the default view in Cost Reports. To match a different toggle combination (for example, on-demand rates without amortization), see Matching Cost Report Toggles below.
Discovering Your Data
Because the schema is normalized but the values are scoped per provider, the fastest way to understand what’s in your table is to introspect it. The five queries below take you from “what providers do I have?” to “what categories and units does each provider report?” Run them in order the first time you connect.Which providers are in the table?
What services does a specific provider expose?
provider value from the previous query. The set of service_name values is the same as what you’d see in Vantage’s filter dropdowns for that provider.How does Vantage categorize a provider's services?
service_category and service_subcategory are Vantage’s normalized rollups (e.g., Compute, Storage, AI and Machine Learning). The exact values depend on the provider. Running this for each of your providers tells you which buckets you can group by.What units of consumption does a provider report?
Hrs, GB-Mo, and Requests. AI providers often report Tokens. Pair consumed_unit and consumed_quantity if you want to compute usage-based metrics.What date range and row counts do you have?
last_day lags the others, its data may not have finished loading yet. See Provider Data Refresh for the expected cadence.Total Cost for a Date Range
The simplest possible query: total amortized cost over a fixed window, matching the default Cost Report view.Billed vs. Amortized: Which Column to Use
billed_cost is what you were billed for in the period. It closely corresponds to AWS “Unblended” cost. amortized_cost spreads upfront commitments (Reserved Instances, Savings Plans) across their term. It closely corresponds to AWS “Amortized” cost.
Pick one consistently for any given report. Either column is NULL for rows where the alternative view does not apply, so always use SUM().
Matching Cost Report Toggles
In Cost Reports, you control what’s included via toggles. In SQL, you reproduce the same view by choosing whichcharge_category values to include and whether to use billed_cost or amortized_cost.
Discounted and Undiscounted are mutually exclusive. You can use one or the other, but never both. Discounted includes commitment-covered usage (the default in Cost Reports). Undiscounted shows on-demand rates instead.
The four base combinations that match the Cost Report discount and amortization toggles:
| Discounts | Amortization | SQL |
|---|---|---|
| On (default) | On (default) | charge_category IN ('Usage', 'Discounted') + SUM(amortized_cost) |
| On | Off | charge_category IN ('Usage', 'Discounted') + SUM(billed_cost) |
| Off | On | charge_category IN ('Usage', 'Undiscounted') + SUM(amortized_cost) |
| Off | Off | charge_category IN ('Usage', 'Undiscounted') + SUM(billed_cost) |
IN (...) list:
| Toggle | Add to charge_category IN (...) |
|---|---|
| Include Tax | 'Tax' |
| Include Refunds | 'Refund' |
| Include Credits | 'Credit' |
charge_category:
Cost by Service
Cost by Account, Sub-Account, or Region
billing_account_id is the top-level billing account (AWS payer/management account, GCP billing account, Azure billing account). sub_account_id is the sub-account within it (AWS linked account, GCP project, Azure subscription).
Top Resources by Spend
Multi-Cloud Filtering and Grouping
Filtering and Grouping by Tag
Thetags column is a JSON-encoded string. Use PARSE_JSON and the : accessor to read individual values. See Snowflake’s Querying semi-structured data for the full syntax, including how to read keys with special characters via PARSE_JSON(tags)['my-key'].
Daily and Monthly Trends
UseDATE_TRUNC and DATEADD to bucket time series.
Month-over-Month Change
Use Snowflake’s window functions (in particularLAG) to compute month-over-month deltas. NULLIF(..., 0) avoids division by zero.
Service Category Rollups
Group byservice_category and service_subcategory to see the Compute, Storage, Networking, etc. mix.
Joining with Your Own Data
A common pattern is to compute a unit cost by dividing Vantage cost data by a customer-side metric (revenue, number of customers, requests, etc.). The example below assumes a customer-side tableMY_DB.PUBLIC.monthly_revenue(month DATE, revenue NUMBER).
Materializing a View for BI Tools
Wrap frequently-used aggregates in a Snowflake view (or a dynamic table) so that BI dashboards can hit a stable interface without re-aggregating on every load. The example below exposes bothbilled_cost and amortized_cost so the BI tool can choose between them, and includes all charge_category values so users can filter further on top. Adjust the columns and WHERE clause to match how your team uses the data.
Query Efficiency and Table Metadata
daily_costs is an Iceberg table partitioned by charge_period_start. Filtering on charge_period_start in your WHERE clause allows Snowflake to skip partitions that don’t match, which significantly reduces the amount of data scanned and the warehouse credits consumed.
To see how the table is partitioned, run:
Troubleshooting
I don't see the share in my Snowflake account
I don't see the share in my Snowflake account
My query returns zero rows
My query returns zero rows
- The role you’re using has been granted access:
GRANT IMPORTED PRIVILEGES ON DATABASE VANTAGE_DB TO ROLE <your_role>; - You’re using the right schema name. Vantage assigns the schema name when provisioning. Run
SHOW SCHEMAS IN DATABASE VANTAGE_DB;to confirm. - Your date filter falls inside the loaded range. Run the date range and row counts introspection query to see what’s actually there.
My totals don't match the Vantage console
My totals don't match the Vantage console
- You’re missing the default toggle filters. Cost Reports defaults to
charge_category IN ('Usage', 'Discounted')andSUM(amortized_cost). See Matching Cost Report Toggles. - You opted into the 2-day cost delay in Vantage. That delay is not applied to the share. Add
WHERE charge_period_start < DATEADD(day, -2, CURRENT_DATE())to match. - You’re using allocation-based Virtual Tags. Cost allocation tags (Business Metrics-Based, Cost-Based, Percent-Based) are not currently included in
daily_costs. Standard Virtual Tags are. - You added
billed_costandamortized_costtogether. They overlap on most rows. Pick one.
A provider's data looks stale or is missing recent days
A provider's data looks stale or is missing recent days
last_day. If one provider lags the others, its ETL has not yet caught up. Check Provider Data Refresh for the expected cadence per provider.My queries are slow or expensive
My queries are slow or expensive
daily_costs is partitioned by charge_period_start. Always include a charge_period_start filter in your WHERE clause to allow Snowflake to skip partitions that don’t match. Without it, every query scans the entire table. See Query Efficiency and Table Metadata for more.Frequently Asked Questions
How fresh is the data?
How fresh is the data?
Is data copied into my Snowflake account?
Is data copied into my Snowflake account?
Will my historical data be backfilled?
Will my historical data be backfilled?
How do I revoke access?
How do I revoke access?
DROP DATABASE VANTAGE_DB;. To have Vantage stop publishing into the share, contact support@vantage.sh.What happens to Virtual Tags?
What happens to Virtual Tags?
How does this relate to the Generate Cost Data Export API?
How does this relate to the Generate Cost Data Export API?
Is there a way to only make certain data available?
Is there a way to only make certain data available?
How does this work for MSPs with managed accounts?
How does this work for MSPs with managed accounts?
What happens if my data changes or is reprocessed?
What happens if my data changes or is reprocessed?
What permissions and access controls are in place?
What permissions and access controls are in place?
GRANT IMPORTED PRIVILEGES ON DATABASE … TO ROLE …).I opted into the 2-day cost delay in Vantage. Is that reflected in Snowflake?
I opted into the 2-day cost delay in Vantage. Is that reflected in Snowflake?