Tutorial · 2026

SAP BTP Cost Modeling and Governance: dev/test/prod Monthly Costs

Subaccount/Entitlement/Plan cost semantics, a worked dev/test/prod monthly estimate for CF, HANA Cloud, Destination, Connectivity, BTP FinOps tooling, and Azure cross-cloud billing.

intermediate 15 min read Updated Nov 8, 2026

We run SAP workloads on our own Azure subscriptions and cite everything like a paper — see our RISE cost guide for the same method. This guide does the same for SAP Business Technology Platform (BTP) costs. One ground rule up front: SAP does not publish a general unit-price list for BTP service plans. We verified this on 2026-11-08 — the official SAP HANA Cloud pricing page exposes only “Request a demo / Try now” entry points and no price table, and the platform guide itself redirects customers to “your account executive” for prices (source, hereafter Platform Guide, p. 113–117). Everything that is public we state with its source; every per-unit rate that is contract-confidential we mark needs in-account verification — we never invent a price.

Cost Semantics: Subaccount, Directory, Entitlement, Plan

The Platform Guide’s “Basic Platform Concepts” chapter (p. ~126) gives the definitions that actually determine where money lands (source):

  • Service plan — “the representation of the costs and benefits for a given variant of a particular service.” Plans are T-shirt sizes of one service; the plan you pick selects the meter and the rate card.
  • Entitlement — “your right to provision and consume a resource.” An entitlement is granted to the global account by contract, then assigned downward.
  • Quota — “the numeric quantity of a service plan” (e.g. “3 instances”, “100 GB memory”) distributed from the global account down to subaccounts and directories.
  • Subaccount — the lowest level where services are provisioned and consumed; the natural home for a dev/test/prod environment.
  • Directory — grouping only. The guide is explicit: “Since directories are only a way of grouping subaccounts, you can’t consume a service at directory level” (same PDF). Directories still matter for cost reporting: they become roll-up nodes in the Costs and Usage tooling and in the usage APIs.

The account hierarchy can be 7 levels deep including the global account and subaccounts (at most 5 directory levels), and SAP’s own recommended pattern is: “create a directory for each department, and within each directory, you group subaccounts for development, testing, and production” (Platform Guide p. 123–124); our Entra SSO subaccount guide sets these subaccounts up. Labels on subaccounts exist precisely “for filtering” in cost views (p. 125) — use them as your cross-charge keys.

The single most important billing fact: consolidation happens at global-account level. SAP’s Managing Cost best practices says billing happens on the global-account level, urges consolidating subscriptions into one global account “to reduce TCO,” and warns to know which global account your contract provisions into.

Commercial Models: Where the Money Moves

Two models exist for enterprise accounts (Platform Guide p. 113–117):

  1. Consumption-based, in three flavors: SAP BTP Enterprise Agreement (BTPEA), Cloud Platform Enterprise Agreement (CPEA), and Pay-As-You-Go. BTPEA/CPEA = prepaid annual commitment in cloud credits; you get a monthly balance statement; billed annually in advance; overages are billed in arrears at list price; credits are not transferable between global accounts, and you cannot mix more than one consumption flavor in one global account.
  2. Subscription-based: “you use these services at a fixed cost, irrespective of consumption” — right for established use cases and known quantities.

The two models can share one global account (hybrid), which the best-practices guide flags as an overage trap: usage not covered by your subscription is charged pay-per-use — “avoid unintended overage billing.” Two governance rules come straight from that guide: “Only provide the minimal required set of entitlements and quota to subaccounts”, and “for services with unlimited quota, usage can potentially increase beyond the planned or budgeted volume.”

Metering Mechanics for the Four Services in Scope

SAP BTP Application Runtime (Cloud Foundry). Creating the CF org is free: “the action of creating a Cloud Foundry org is free. However, when you run applications in it, you pay for the runtime memory that they use” (Platform Guide, Service plans & metering section for CF Runtime). Plan semantics: standard creates the org; the MEMORY plan carries the billable runtime-memory quota. Under consumption, “a default runtime memory quota of 200 GB is automatically assigned to all subaccounts, and the billing is based on the actual runtime memory usage.” The legal metric is GB Memory: total hourly usage of CF runtime memory across all spaces in the global account over a calendar month, divided by 730 hours and rounded up to the next full GB (Platform Guide, billing-metric table). Critically, billable consumption is the full reserved memory per running app instance, regardless of actual use (default 1024 MB per instance, 1 instance) — while a stopped application reserves nothing and produces zero billable consumption. Your monthly formula is therefore:

BTP_CF_month = ceil( Σ(instances × reserved_MB/1024 × hours_running) / 730 ) × rate_CF(€/GB·month)
rate_CF: contract-specific → needs in-account verification

SAP HANA Cloud. Instances are sized in Capacity Units (CU); the metric shows up as “SAP HANA Cloud capacity units” in the official FinOps sample (SAP-samples README). SAP exposes sizing tooling — the Capacity Unit Estimator — but per-CU rates are quote-based: the public pricing page contains no unit prices (checked 2026-11-08) → needs in-account verification. Two verified non-price facts: the free-tier license page (cited via the SAP-samples README) says the free-tier database will be stopped every night, and HANA instance memory consumed in trial is capped by the trial’s “8 GB of instance memory” limit (Platform Guide p. 110).

SAP Destination service. Plans are entitlement objects, e.g. a lite plan appears in the FinOps sample’s entitlement template (README); typical production uses standard. No public EUR/USD-per-plan list exists → needs in-account verification (subaccount → Entitlements → service destination, and the SAP BTP Service Description Guide referenced by the Billing tab docs below).

SAP Connectivity service / Cloud Connector. The Cloud Connector docs describe it as an on-premise reverse-invocation proxy with low TCO (our Destinations & Cloud Connector guide covers the deployment); no public price table is published for Connectivity plans → needs in-account verification. Verified structural fact: a trial account is limited to 2 configured on-premise systems with Cloud Connector (Platform Guide p. 110) — a real budget line when a pilot graduates to production.

Three Environments, One Month: The Honest Estimate Table

Setup assumed (our own pattern): one global account, one directory prod-lab, three subaccounts (dev, test, prod) with labels, a CF Application Runtime org in each, one HANA Cloud instance in test + prod, Destination instances in all three, one Cloud Connector per on-prem system (dev/test share, prod dedicated), plus the Azure side: an integration worker VM. BTP rates are contract variables; usage quantities are what you control. Every row shows its source and confidence.

# Line item (service / plan) Environment & usage assumption Monthly amount (formula / number) Source Confidence
1 Application Runtime MEMORY (CF GB Memory) dev: 2 apps × 512 MB × 10 days running ceil(244 GB·h / 730) = 1 GB × rate_CF [Platform Guide, GB Memory metric] High on metric; rate: needs in-account verification
2 Application Runtime MEMORY test: 4 apps × 1024 MB × 24×7 ceil(688 GB·h / 730) = 1 GB × rate_CF same same
3 Application Runtime MEMORY prod: 6 apps × 1024 MB × 24×30 ceil(4381 GB·h / 730) = 7 GB × rate_CF same same
4 HANA Cloud instance dev: none (use free tier / shared HDI; free-tier DB stops nightly) €0 if free tier suffices [HANA license free-tier] + [trial: 8 GB instance mem] High (mechanism)
5 HANA Cloud instance test: smallest edition, stopped nights/weekends (~120 h/mo) 120 h × CU-size × rate_CU-hour [SAP-samples README: “HANA Cloud capacity units” metric]; estimator Medium; rate: needs in-account verification
6 HANA Cloud instance prod: 256 GB-equivalent, 24×7 CU-months × rate_CU same as #5 same
7 Destination lite ×2, standard ×1 dev/test lite, prod standard 3 × rate_dest(plan) plan names: [SAP-samples README entitlements]; rates not public Medium on plans; rate: needs in-account verification
8 Connectivity + Cloud Connector 1 on-prem system mapped for dev/test, 2 for prod 3 systems × rate_conn CC role: [connectivity docs]; no public rates; trial cap = 2 systems [Platform Guide p.110] Medium; rate: needs in-account verification
9 Azure integration VM Standard_M832is_16_v3, Linux, East US, pay-as-you-go prod: 24×7 163.856 $/h × 730 h = $119,614.88/mo Azure Retail Prices API, retrieved 2026-11-08 High — public list price
10 Azure same VM, 1-year reservation prod alternative $834,816/yr ≈ $69,568/mo (−41.8%) same High

Reading the table: the only fully public number on either cloud is the Azure meter (row 9/10) — exactly why a cross-cloud report needs two differently-shaped data sources. The BTP side collapses to “sum your GB-Memory + CU + per-plan units, multiply by contract rates, then check the credit balance.” The Platform Guide’s 730-hour rounding (row 1–3) also shows the gotcha: two 512 MB dev apps rounded to the same 1 GB billable as you’d fear — rounding is up to the next full GB per month across the whole global account.

Costs & Usage, “CCT”, and Cost Planning in 2026

There is no official SAP product named “Cloud Cost Tracker” as of 2026-11-08. What practitioners say “CCT” usually means is a stack of three official layers, verified in monitoring docs and the Platform Guide (p. 2476 ff):

  1. Cockpit “Costs and Usage” (global-account level): Overview cards show estimated cost so far this month, a forecasted month-end total, previous/highest/lowest months and cost recommendations; Billing shows billable charges aggregated “per pricing structure and legally billable metric of each service, as mentioned in the SAP BTP Service Description Guide” (consumption GAs; subscription GAs show prepaid); Usage shows raw non-aggregated data; Budgets lets you set limits with automatic e-mail alerts to all global account admins when spending exceeds a threshold. Filters include services, subaccounts, directories, billing month, labels and metrics — the cross-charge primitive. Note: the forecast indicator is not available for Pay-As-You-Go.
  2. Usage Analytics pages at subaccount/directory level: actual (not billed) usage, refreshed every 24 h, shown only where metered consumption > 0; directory views need User Management enabled.
  3. SAP Usage Data Management service (UAS) / Resource Consumption APIs: https://uas-reporting.cfapps.<landscape-domain>/reports/v1 with GET /cloudCreditsDetails, /monthlyDirectoryUsage, /monthlyUsage, /subaccountUsage, and /monthlySubaccountsCost (“monthly cost reporting data for all subaccounts for the CPEA consumption-based commercial model”) — Platform Guide p. 2771–2776.

On top sits the community tool many call the BTP cost tracker: SAP-samples btp-resource-consumption-monitor, “Monitors the CPEA credit consumption of your global account and alerts on increased usage” (v2.2, deployable to CF or Kyma). Its capabilities are effectively a Cost-Planning product: billing verification, cost breakdown along the account hierarchy, cross-charging via up to 10 Managed Tags (defaults “Line of Business” / “Cost Center”) plus Custom Tags, forecasting (Time-Linear for metrics like HANA capacity units and CF GB memory), an optional SAP Analytics Cloud dashboard, and Technical Allocation that distributes a global-account CF bill to spaces by GB-Memory usage (their worked example: $100 for 2 GB split 0.5/0.9/0.6 → $25/$45/$30). It reads UAS every 3 h (new data ~06:00 UTC) via a service key of plan reporting-ga-admin. Its own disclaimer is worth repeating to your CFO: results are indicative, not billing documents, and it is not covered by SAP Support. For the contract side (CPEA credit dynamics, non-SAP analysis), see the labeled third-party reads redresscompliance and atonement licensing.

Pulling the Numbers: CLI and API Code

Provision-and-entitle governance via btp CLI (commands per Platform Guide p. 2703 ff):

btp login --url https://<cli-api>.<landscape>.com
# full entitlement + quota view for the global account:
btp list accounts/entitlement --global-account <GA-GUID>
# give the dev subaccount the minimum, not the menu:
btp assign accounts/entitlement --subaccount <DEV-SUBACCT> \
  --service-name destination --plan lite --amount 1
# CF runtime memory quota comes from the MEMORY plan; create env + org:
btp create accounts/environment-instance --subaccount <DEV-SUBACCT> \
  --environment cloudfoundry --plan trial    # or standard; see btp list accounts/available-environment
cf api https://api.<region>.hana.ondemand.com && cf auth
cf marketplace -s <service>        # plan names + descriptions, e.g. hana
cf create-service <SERVICE> <PLAN> <instance>   # docs p.161: cf create-service SERVICE PLAN SERVICE_INSTANCE

Machine-readable BTP cost/usage export (UAS, CPEA GAs):

TOKEN=$(curl -s -X POST https://<auth-url>/oauth/token \
  -d "grant_type=client_credentials&client_id=<key>&client_secret=<secret>" | jq -r .access_token)
curl -s -H "Authorization: Bearer $TOKEN" \
  "https://uas-reporting.cfapps.<landscape>.com/reports/v1/monthlySubaccountsCost?fromMonth=2026-09&toMonth=2026-11" \
  | jq '[.subaccountsCostReports[] | {subaccount:.subaccountDisplayName, cost:.totalCost, currency:.currency}]'

Azure side — public list price (no auth) and the monthly export job that feeds the merged report (Exports API, 2019-11-01):

curl -s "https://prices.azure.com/api/retail/prices?\$filter=armSkuName%20eq%20%27Standard_M832is_16_v3%27%20and%20armRegionName%20eq%20%27eastus%27%20and%20type%20eq%20%27Consumption%27%20and%20priceType%20eq%20%27Consumption%27" | jq '.Items[] | select productName | contains("Linux")'
# → 163.856 USD per 1 Hour, East US, Linux (retrieved 2026-11-08)

curl -s -X PUT \
  "https://management.azure.com/providers/Microsoft.Management/managementGroups/sap-lab/providers/Microsoft.CostManagement/exports/monthly-billing?api-version=2019-11-01" \
  -H "Authorization: Bearer $AZ_TOKEN" -H "Content-Type: application/json" -d '{
  "properties": {
    "schedule": {"status": "Active", "recurrence": "Monthly",
                 "recurrencePeriod": {"from": "2026-11-01T00:00:00Z", "to": "2027-11-01T00:00:00Z"}},
    "format": "Csv",
    "deliveryInfo": {"destination": {"resourceId": "/subscriptions/<S>/providers/Microsoft.Storage/storageAccounts/<acct>",
                                     "container": "cost", "rootFolderPath": "btp-merge/"}},
    "definition": {"type": "ActualCost", "timeframe": "MonthToDate",
      "dataSet": {"columns": ["Date","MeterId","InstanceId","PreTaxCost","ResourceLocation"],
        "aggregation": {"costSum": {"PreTaxCost": {"type": "Function","function": "Sum"}}},
        "grouping":  [{"type":"Dimension","name":"SubscriptionName"},{"type":"Tag","name":"Environment"}]}}}}'

(One-time: register the storage subscription with the Microsoft.CostManagementExports resource provider; updates need the latest eTag; handle 429/x-ms-ratelimit-microsoft.consumption-retry-after.) Then the merge is a trivial join — BTP monthly rows + Azure CSVs on (month, environment):

import pandas as pd
btp   = pd.read_json("btp_monthly_subaccounts.json")           # from /monthlySubaccountsCost
az    = pd.read_csv("cost/btp-merge/month.csv")                # Environment tag ↔ BTP label
rep   = (az.groupby("Environment")["PreTaxCost"].sum()
           .to_frame("azure_usd")
           .join(btp.groupby("label_environment")["totalCost"].sum().rename("btp_eur")))

Cross-Cloud FinOps: Merging Two Invoice Shapes

The granularity mismatch is the real work. BTP bills monthly, per global account, in contract currency, often from prepaid credits; Azure bills daily, per subscription, in the billing-account currency. To get one environment-level P&L: (1) normalize grain — Azure ActualCost/AmortizedCost exports at Daily granularity, BTP /monthlySubaccountsCost; roll Azure up to months; (2) join on labels ↔ tags: BTP subaccount labels (Platform Guide p. 125, and Costs-and-Usage’s label filter) map to Azure Environment tag (we used grouping {"type":"Tag","name":"Environment"} above); (3) normalize currency at a fixed monthly FX rate (the SAP-samples app has a built-in currency-conversion config for exactly this); (4) decide the accounting question — prepaid BTP credits are a commitment, so “cost of month M” on BTP is credits consumed, whereas Azure ActualCost shows invoice spend and AmortizedCost shows reservation amortization; pick one policy per line or cross-cloud reports silently lie.

Runaway Costs: The Five Ways This Goes Wrong

  1. Deleting the app but not the instance/service keys. For CF apps, a stopped app bills nothing (memory reserved = 0, Platform Guide) — but a provisioned service instance keeps metering (a running HANA Cloud instance is the loud case). Sweep with cf services per subaccount monthly; decommission = delete instance, then remove entitlement assignment.
  2. Trial expiry. The 90-day trial auto-deletes; no sign-in for 30 days suspends the account, and suspended trial accounts are deleted; trial apps are stopped daily at region-midnight and limits are hard (4 GB app memory, 8 GB instance memory, 10 routes, 40 services, 2 Cloud Connector systems, no SLA) (Platform Guide p. 110–112). There is no data migration from trial to enterprise — treat trial as ephemeral, or start a free enterprise account on free-tier plans instead.
  3. Service-key leakage. A leaked UAS/destination/key-routine service key is both a security and a cost incident: keys authorize consumption against your quota. The SAP-samples app itself consumes via a reporting-ga-admin service key — scope such keys read-only where possible, rotate on a calendar, and alert on per-subaccount usage spikes (Costs and Usage → Budgets e-mail alerts; or the sample app’s Alert Notification integration).
  4. Credit cliff on consumption contracts. BTPEA/CPEA overages are billed in arrears at list price, credits don’t transfer between global accounts, and Pay-As-You-Go GAs get no forecast indicator — you can only see the burn, not the trend, in the cockpit Overview card. Budget alerts are the cheap mitigation.
  5. Unlimited quota + hybrid GA. “For services with unlimited quota, usage can potentially increase beyond the planned or budgeted volume,” and in a hybrid subscription+consumption global account, anything the subscription doesn’t cover flows to pay-per-use — the best-practices guide’s “unintended overage billing.” Cap quotas per subaccount at grant time; never hand * entitlements to dev.

FAQ

Q1. Is there an official tool called “Cloud Cost Tracker (CCT)” on BTP? A: No official product by that name exists as of 2026-11-08. Official = cockpit Costs and Usage (incl. Budgets) + Usage Analytics + the UAS Resource Consumption APIs; the community “BTP FinOps” tracker is the SAP-samples btp-resource-consumption-monitor, Apache-2.0, indicative-only.

Q2. Why can’t I find a price list for BTP plans, and what should I do? A: Because SAP sells BTP via CPEA/BTPEA credits or subscriptions, not public list rates; the HANA Cloud pricing page is demo-gated (verified 2026-11-08). Get the rates in writing from your contract, and inside your account read Entitlements + the service’s row in the SAP BTP Service Description Guide. Everything in this article marked “needs in-account verification” resolves there.

Q3. Should dev/test/prod be three subaccounts in one global account, or separate global accounts? A: Three subaccounts under one directory is the SAP-documented pattern (Platform Guide p. 123–124) and keeps one credit pool and one Costs-and-Usage view. Separate global accounts make sense only when you need separate bills — remember credits cannot move between global accounts.

Q4. My dev app is tiny — why was I charged a whole GB-month? A: The GB Memory metric aggregates all spaces of the global account per calendar month and rounds up to the next full GB (730-hour divisor). Small dev/test usage isn’t invisible; it rounds into the global bill. Label subaccounts and use Usage Analytics to see the contribution.

Q5. Does a stopped application stop the cost? A: Yes for the CF runtime memory of that app (stopped = zero reserved = zero billable, Platform Guide). No for provisioned service instances (HANA Cloud, Destination, xsuaa, custom plans), which meter by their own metrics — and no for Azure VMs, which bill compute until deallocated. Different clouds, different “stop” semantics; make “stopped vs deleted” a policy line in your runbook.

Q6. How do I catch runaway usage before the invoice? A: Layered: cockpit Budgets → e-mail alerts at thresholds (global-account admins); the FinOps sample app → 3-hourly UAS polling + forecast-delta alerts; for Azure, daily Cost Management exports or the Query API against the same storage account you merge into.

Sources

All URLs accessed and verified 2026-11-08. (1) SAP BTP Platform Guide PDF (help.sap.com) — cost semantics, commercial models p.113–117, hierarchy/labels p.123–126, CF metering & GB Memory, trial p.110–112, Costs and Usage p.2476 ff, UAS APIs p.2771 ff, btp CLI p.2703 ff. (2) SAP BTP Best Practices: Managing Cost. (3) Monitoring Usage and Consumption Costs in Your Global Account. (4) SAP-samples btp-resource-consumption-monitor README. (5) Cloud Connector documentation (SAP-docs mirror). (6) SAP HANA Database License incl. free tier. (7) SAP HANA Cloud Capacity Unit Estimator. (8) SAP HANA Cloud pricing page (no public unit prices). (9) SAP technology-platform pricing/FAQ page linked from Platform Guide p.114. (10) Azure Cost Management — Exports Create Or Update (REST, 2019-11-01). (11) Azure Retail Prices API — M832is_16_v3 East US USD rates retrieved 2026-11-08. (12) SAP Discovery Center: Job Scheduling service plans (browser JS required; linked from source 4). (13) Redress Compliance: SAP BTP pricing & consumption (third-party). (14) Atonement Licensing: SAP BTP Pricing 2026 (third-party).