← Google Cloud Dynamic Python Web AppExamplesLegal NoticePrivacy

StackToIT Migration Intelligence Workspace

FOR REVIEW — generated by StackToIT Assess. Architect review required before any decision.

Partially executable migration package · For review only · Not approved.

Technical details: run, versions, digest and evidence freshness

Assessment

Assessment
gcp-candidates/terraform-dynamic-python-webapp/infra (assessment format 0.24.0)
Assessment timestamp
Generated 2026-11-07 04:24 UTC by stacktoit 0.6.0-13076-ga19ea28c64 (a19ea28c64)
Run
6f8f72b2-1c34-4cfc-8483-344c41245364 · source digest sha256:19bfed642d5789ccada81b91d5c36e33175dcafd66dc46b1644ffa105d020000
Source snapshot
partly decided only at plan time · google not locked; google-beta not locked; http not locked; random not locked; time not locked
STACKIT target profile
Stable network model: the experimental STACKIT VPC resources are not used (STACKIT_STABLE)
STACKIT provider version
0.121.0
Knowledge base version
0.394.0
Evidence freshness
Not assessed — Evidence freshness as one measure is not assessed in this build. Dated evidence is shown where it is used: each STACKIT support option and each assurance row states when it was verified (verified_at, and recheck_after for support), in support_suitability and assurance. The date beside a readiness dimension is the assessment date, not a retrieval date.

Staleness: Not assessed — This build has no change detection, so there has been no re-check since the assessment was made (Generated 2026-11-07 04:24 UTC). The source may have changed since.

Source checks: Built-in source checks passed — OpenTofu validation of the source did not run (LOCK_FILE)

Run status: COMPLETE (report published). Source: partly decided only at plan time. Draft: GENERATED. The report was written whole; this is not a statement that the migration is ready.

Executive lens: the sections are in the order this reader usually wants, and Architecture and Engineering Evidence are put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Architect lens: the sections are in the order this reader usually wants, and Costs is put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Platform lens: the sections are in the order this reader usually wants, and Costs is put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Security lens: the sections are in the order this reader usually wants, and Costs and Migration Plan are put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Application owner lens: the sections are in the order this reader usually wants, and Engineering Evidence is put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Programme lens: the sections are in the order this reader usually wants, and Engineering Evidence is put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

FinOps lens: the sections are in the order this reader usually wants, and Architecture and Engineering Evidence are put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Engineering lens: the sections are in the order this reader usually wants, and Costs is put aside. Nothing is removed from the page: choose All to show every section in the order of the navigation, or follow a link into a section that is put aside.

Costs

Priced and unpriced coverage, and the inputs a cost estimate needs. The figures are an initial infrastructure cost estimate under explicit assumptions (the assumptions below), under one labelled scenario (the labelled standard month of 730 hours, the same on both sides); they are not a bill.

Financial comparison: NOT AVAILABLE — no price source for 5 lines; 6 of 8 STACKIT lines have no price; 13 source resources are outside the model and can carry a charge; priced but outside the comparison (STACKIT, target only, no source line stands against them: 1 line, 72.70 EUR; STACKIT, priced lines of units that are not compared: 1 line, 91.97 EUR); the subtotal of one side is not a comparison and no saving is stated

Not included in any total or comparison: traffic and usage that no assumption states, support, licences, operations and the one-off cost of the migration (what it costs to run both estates during the cutover is stated apart, as a one-off item); a scenario of what owning the estate costs, on either side, is not provided by this build.

  1. Stage 1, coverage and uncertainties: 2 of 22 lines priced (source 0 of 14, STACKIT 2 of 8); the lines that have no price say why in the table of causes and the three coverage indicators below.
  2. Stage 2, run-rate of the comparable services: not available, because no billable source resource is priced on both sides.
  3. Stage 3, cost scenarios beyond the list prices (data egress, migration effort, operations): not provided by this build. Parallel running is stated apart: While both estates run (the cutover), per month of overlap: source no figure (no line of its estate is priced) and STACKIT 164.67 EUR, each in its own currency; no length of overlap is assumed (parallel_run_months in the assumption file states one); priced part only, so a lower bound (STACKIT: 2 of 8 lines priced). A one-off cost of the migration: in no total, comparison or saving.
How these costs are read

An initial infrastructure cost estimate under explicit assumptions (the scenario and the assumption file this model names), not a bill: list prices (net, no discount, no Spot, no savings plan, no private price) times quantities the source or the assumption file states. A total is FULL only when every line of its scope is priced; a line that cannot be priced says why and is never filled in, and an unknown quantity is neither 0 nor 1. A savings percentage is given only for the same scope, in one currency (or with an exchange rate that names its source and date), with every line of both sides priced. No usage, traffic, request or egress cost is computed unless the assumption file states the use of one month: a line priced on a stated use is an assumption and says so, and without it the line has its price and no amount. No support, licence, operations or migration labour cost is computed. The one one-off item the model states is what both estates cost while they run side by side during the cutover (parallel_run_months of the assumption file): it is stated apart and is in no total, comparison or saving.

Why lines are not priced

Different causes have different next actions: a refresh of the price cache fixes only the one marked CACHE_MISSING.

DiagnosticLinesFamilies (lines)Next action
CACHE_MISSING5google_secret_manager_secret 4, google_pubsub_topic 1fill the price cache once, online: `stacktoit prices refresh` (the commands for each missing price family are in the price source statement); the assessment itself stays offline.
TARGET_NOT_CHOSEN4PostgreSQL Flex 2, RabbitMQ 1, SKE 1state the choice in the assumption file (--assumptions FILE) or as the answer cost.target_choice of the inputs file (--inputs FILE): variable target_choice, with the subject and an example value that each line names, or answer the request that changes the draft; the line is then priced on your value and says so. A refresh does not help.
AMBIGUOUS1Secrets Manager 1each line says what chooses between the prices: state it where the line names the variable (os, tenancy, licence), in the assumption file or as the answer cost.<variable> of the inputs file; where the vendor defines no choice (a tier of a service) the line stays unpriced until it does. A refresh does not help.
USAGE_NOT_STATED1Object Storage 1state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.<variable> of the inputs file (--inputs FILE), in the variable and unit the line names (data_transfer, usage_quantity, volume_size, log_ingestion; assumptions-template.yaml lists them); the line is then priced on your figure and says so. A line that names none (the storage of a broker, the I/O requests of an Aurora cluster) has no input for it in this build. Without a figure the line has its price and no amount, and is in no total.

Price source: the lines that need gcp/PubSub/global, gcp/SecretManager/global are not priced.

Price family (as stacktoit prices status names it)WhyRungs triedCommand
gcp/PubSub/globalthe price cache holds no record of it1 price cache: the cache at the default location holds no record of it (the cache was last filled 2026-11-02); 2 release snapshot: none in this build; 3 auto-fetch: no program to fetch with: stacktoit-prices was not found next to this binary or on PATH; 4 UNPRICEDstacktoit prices refresh --provider gcp --region global --offer PubSub
gcp/SecretManager/globalthe price cache holds no record of it1 price cache: the cache at the default location holds no record of it (the cache was last filled 2026-11-02); 2 release snapshot: none in this build; 3 auto-fetch: no program to fetch with: stacktoit-prices was not found next to this binary or on PATH; 4 UNPRICEDstacktoit prices refresh --provider gcp --region global --offer SecretManager

A run fetches a missing price family by itself unless it is offline; what is named above could not be fetched or found, and the commands fill it by hand. Add --price-cache DIR to the command and to assess when you use a cache directory of your own.

Four classes of line

Every line below is one of four classes, so that a known figure is not read as an estimate or an assumption, and a line that is not computed is not read as zero.

ClassLinesMeaning
KNOWN0list price × a quantity read from the source or the draft; nothing else assumed
ESTIMATE2a list price with an assumption the model states: the hours of the scenario (730 h in the standard month) on a per-hour rate
ASSUMPTION0a quantity or a class is assumed (an operating system, a tenancy, a performance class); the assumption is named on the line
OUT_OF_MODEL20not computed: not zero and not free; the line says what is missing

22 cost lines in all: 14 of the source, 8 of the target. The same lines and totals are in financial/cost-model.json, financial/priced-resources.csv and financial/cost-coverage.md.

Coverage: how much of the estate the model can price

Billable coverage: which source resources can carry a price. Most source resources carry no charge of their own (a security group rule, an IAM role, a route), so the share of source resources that have a line is not the share of the estate that is priced. Of the 33 source resources, 20 are or may be billed. The source resources of the cost model are the managed resources of the source that no count or for_each of 0 switches off; the resources scanned of the first screen also count the switched-off ones, so its figure can be larger.

Source resourcesCountMeaning
With a price rule7Of a type this build prices: the model has a line for them (a line can still lack a price or a quantity: see the next tables).
No charge of its own13Of a type the source cloud bills nothing for (a firewall or security group rule, an IAM role): there is nothing to price, and they are not out of the model.
Out of the model13May be billed, and this build has no price rule for the type, or does not classify it: its cost is not computed, never zero and never free.

Out of the model, by type: google_cloudbuild_trigger (3), google_secret_manager_secret_iam_binding (2), google_storage_bucket_iam_member (2), google_cloud_run_service_iam_policy (1), google_firebase_hosting_site (1), google_firebase_project (1), google_project_service (1), google_sql_database (1), google_sql_user (1).

Price coverage: which lines have a price. Of the 22 lines of the model, both sides.

LinesCountMeaning
Price found2The line carries a price record (a rate from a price list), whether or not its quantity is known.
No price20No rate: the reason is each of the rows below.
PRICE_NOT_FOUND9The key names a price and the price list in force has none (or the region is not stated): never free.
PRICE_SOURCE_ABSENT5No price source was available for the line (no cache, no snapshot, no fetch).
TARGET_NOT_CHOSEN4The target design does not choose what the price needs.
AMBIGUOUS1More than one price fits and none is picked.
QUANTITY_UNKNOWN1

Lines with a price found, by side: source 0 of 14, target 2 of 8. Of the lines without a price, by diagnostic: CACHE_MISSING (5), TARGET_NOT_CHOSEN (4), AMBIGUOUS (1), USAGE_NOT_STATED (1) (a refresh of the price cache fixes only CACHE_MISSING).

Usage coverage: which priced lines have a quantity. Of the 2 lines that have a price.

Priced linesCountMeaning
Quantity known2The line has an amount; 0 of them rest on a quantity the assumption file states.
Quantity unknown0QUANTITY_UNKNOWN: the price is known, the quantity (a usage, a traffic, a size the source does not state) is not; neither zero nor one.

A subtotal is the sum of the list prices of the lines that are priced, for the resources this build prices. It is not the cost of running the estate: usage and traffic that no assumption states, support, licences, operation and the effort of the migration are not in it. A difference between the source and the target subtotal is the difference of those list prices over the same resources, in one currency; it is not the saving, or the cost, of the migration.

Estimated monthly cost for the resources that could be compared (730 h, list prices)

A saving or an increase is stated only over the source resources that both sides price in full (0 resources); the other resources are listed under cost groups with why they are not computed, and are in no figure here.

Not in this sum: 20 source resources (0 with a price known and the quantity unknown, 20 not computed): google_cloudbuild_trigger (3), google_secret_manager_secret (2), google_secret_manager_secret_iam_binding (2), google_storage_bucket_iam_member (2), google_cloud_run_service_iam_policy (1), google_cloud_run_v2_job (1), 9 more kinds. They are not zero and not free. 13 more resources carry no charge of their own and are nothing to compute.

No line is summed: the computed subtotal is empty. A line of the class OUT_OF_MODEL is not computed, is in no sum and is never filled in as zero.

No source unit is priced on both sides: there is no computed subtotal.

This is the computed subset of 0 of 33 source resources, not the estate's whole cost. The resources outside it (price known with the quantity unknown, or out of the model) are in no total, saving or percentage of this comparison. A difference between the source and the target subtotal is the difference of those list prices over the same resources, in one currency; it is not the saving, or the cost, of the migration.

Source against target over the computed units: NOT COMPARED; saving of the target not given (no source unit is priced on both sides, so there is no computed subtotal to compare).

Outside this comparison: STACKIT, target only, no source line stands against them: 1 line, 72.70 EUR; STACKIT, priced lines of units that are not compared: 1 line, 91.97 EUR. The target-only lines are in the priced part of the STACKIT total, and no saving includes them.

A difference stated here is a difference over the compared part only, not a saving of the estate. What the compared part leaves out: priced but outside the comparison (STACKIT, target only, no source line stands against them: 1 line, 72.70 EUR; STACKIT, priced lines of units that are not compared: 1 line, 91.97 EUR); without a price: 14 source lines (9 PRICE_NOT_FOUND, 5 PRICE_SOURCE_ABSENT), 6 STACKIT lines (1 AMBIGUOUS, 1 QUANTITY_UNKNOWN, 4 TARGET_NOT_CHOSEN); reasons: 5 no cache · 4 target not chosen · 1 ambiguous · 1 use not stated; 20 of 20 billable source resources not compared; usage and traffic that no assumption states, support, licences, operations and the one-off costs of the migration are in no figure (the cost of both estates running side by side during the cutover is stated apart, as a one-off item).

Technical mapping

Beside the prices, what each side of a computed pair states about its size and performance. A fact a side does not state is shown as not stated, never filled in. A pair whose cost is only partly known (a component with no price) is listed too, with how many of its components are priced under its name; it is in no computed subtotal. The same table is financial/mapping.csv.

All 5 pairs
PairSideResourcevCPURAMCPU modelDiskIOPSThroughputHigh availability
google_cloud_run_v2_job.migrate
not mapped; target stackit_ske_cluster.containers.node_pool.workloads
SOURCE: 0 components priced, 5 not priced: run cpu time (google_cloud_run_v2_job.migrate) PRICE_NOT_FOUND; run memory time (google_cloud_run_v2_job.migrate) PRICE_NOT_FOUND; run cpu time (google_cloud_run_v2_service.server) PRICE_NOT_FOUND; run memory time (google_cloud_run_v2_service.server) PRICE_NOT_FOUND; run requests (google_cloud_run_v2_service.server) PRICE_NOT_FOUND. TARGET: 1 component priced, 1 not priced: node pool hours (stackit_ske_cluster.containers.node_pool.workloads) TARGET_NOT_CHOSEN; the priced component alone sums to 72.70 EUR. These sums cover the priced components only: a partial figure, not the cost of this resource, and in no computed subtotal, comparison or saving.
Sourcenot mappednot mappednot mappednot mappednot mappednot mappednot mappednot mapped
Targetnot mappednot mappednot mappednot mappednot mappednot mappednot mappednot mapped
google_cloud_run_v2_service.server
not mapped; target stackit_ske_cluster.containers.node_pool.workloads
SOURCE: 0 components priced, 5 not priced: run cpu time (google_cloud_run_v2_job.migrate) PRICE_NOT_FOUND; run memory time (google_cloud_run_v2_job.migrate) PRICE_NOT_FOUND; run cpu time (google_cloud_run_v2_service.server) PRICE_NOT_FOUND; run memory time (google_cloud_run_v2_service.server) PRICE_NOT_FOUND; run requests (google_cloud_run_v2_service.server) PRICE_NOT_FOUND. TARGET: 1 component priced, 1 not priced: node pool hours (stackit_ske_cluster.containers.node_pool.workloads) TARGET_NOT_CHOSEN; the priced component alone sums to 72.70 EUR. These sums cover the priced components only: a partial figure, not the cost of this resource, and in no computed subtotal, comparison or saving.
Sourcenot mappednot mappednot mappednot mappednot mappednot mappednot mappednot mapped
Targetnot mappednot mappednot mappednot mappednot mappednot mappednot mappednot mapped
google_cloud_run_v2_job.migrate
not mapped; target stackit_ske_cluster.containers
SOURCE: 0 components priced, 5 not priced: run cpu time (google_cloud_run_v2_job.migrate) PRICE_NOT_FOUND; run memory time (google_cloud_run_v2_job.migrate) PRICE_NOT_FOUND; run cpu time (google_cloud_run_v2_service.server) PRICE_NOT_FOUND; run memory time (google_cloud_run_v2_service.server) PRICE_NOT_FOUND; run requests (google_cloud_run_v2_service.server) PRICE_NOT_FOUND. TARGET: 1 component priced, 1 not priced: node pool hours (stackit_ske_cluster.containers.node_pool.workloads) TARGET_NOT_CHOSEN; the priced component alone sums to 72.70 EUR. These sums cover the priced components only: a partial figure, not the cost of this resource, and in no computed subtotal, comparison or saving.
Sourcenot mappednot mappednot mappednot mappednot mappednot mappednot mappednot mapped
Targetnot mappednot mappednot mappednot mappednot mappednot mappednot mappednot mapped
google_cloud_run_v2_service.server
not mapped; target stackit_ske_cluster.containers
SOURCE: 0 components priced, 5 not priced: run cpu time (google_cloud_run_v2_job.migrate) PRICE_NOT_FOUND; run memory time (google_cloud_run_v2_job.migrate) PRICE_NOT_FOUND; run cpu time (google_cloud_run_v2_service.server) PRICE_NOT_FOUND; run memory time (google_cloud_run_v2_service.server) PRICE_NOT_FOUND; run requests (google_cloud_run_v2_service.server) PRICE_NOT_FOUND. TARGET: 1 component priced, 1 not priced: node pool hours (stackit_ske_cluster.containers.node_pool.workloads) TARGET_NOT_CHOSEN; the priced component alone sums to 72.70 EUR. These sums cover the priced components only: a partial figure, not the cost of this resource, and in no computed subtotal, comparison or saving.
Sourcenot mappednot mappednot mappednot mappednot mappednot mappednot mappednot mapped
Targetnot mappednot mappednot mappednot mappednot mappednot mappednot mappednot mapped
google_sql_database_instance.postgres
not mapped; target stackit_postgresflex_instance.postgres
SOURCE: 0 components priced, 3 not priced: storage capacity (billed per GB) (google_sql_database_instance.postgres.storage) PRICE_NOT_FOUND; sql ram hours (google_sql_database_instance.postgres) PRICE_NOT_FOUND; sql vcpu hours (google_sql_database_instance.postgres) PRICE_NOT_FOUND. TARGET: 1 component priced, 2 not priced: storage capacity (billed per GB) (stackit_postgresflex_instance.postgres) TARGET_NOT_CHOSEN; storage class fee (billed per disk) (stackit_postgresflex_instance.postgres) TARGET_NOT_CHOSEN; the priced component alone sums to 91.97 EUR. These sums cover the priced components only: a partial figure, not the cost of this resource, and in no computed subtotal, comparison or saving.
Sourcenot mappednot mappednot mappednot mappednot mappednot mappednot mappednot mapped
Targetnot mappednot mappednot mappednot mappednot mappednot mappednot mappednot mapped

A machine type is one of the types of the catalogue with at least the vCPUs and memory of the source (a burstable source may be offered shared types); a storage class is the one the draft names (the customer's answer or the variable's default), shown with the catalogue's own IOPS and throughput. This table states sizes; it is not a statement about the performance of the target against the source (no benchmark was run, and a CPU model that a side does not state is shown as not stated).

Assumptions

Totals

The state of an estate row is the estate's: PARTIAL while any line of any source resource the model knows is not priced, a resource outside the modelled part included; the computed subtotal of the equal-scope comparison has a state of its own. Its amount is the modelled infrastructure subtotal (3 of 33 source resources): the sum of the lines that are priced; N is the number of source resources with a priced line and M all the source resources the model knows (a source resource is a Terraform resource; one migration unit can stand for several). A resource with no priced line (a load balancer, a bucket, a quantity the source does not state) is not in it, and the lines of a counted resource that are not priced are counted beside the amount and never filled in; so it is not the cost of the estate.

Totals of the modelled part and of each service, for the source and for the target (12)
ScopeSideStateAmountPriced linesLines not priced
estate (33 source resources), priced part: modelled infrastructure subtotal (3 of 33 source resources)SOURCENONEnone014
9 PRICE NOT FOUND, 5 PRICE SOURCE ABSENT
estate (33 source resources), priced part: modelled infrastructure subtotal (3 of 33 source resources)TARGETPARTIAL164.67 EUR26
1 AMBIGUOUS, 1 QUANTITY UNKNOWN, 4 TARGET NOT CHOSEN
service containersTARGETPARTIAL72.70 EUR11
1 TARGET NOT CHOSEN
service databaseSOURCENONEnone03
3 PRICE NOT FOUND
service databaseTARGETPARTIAL91.97 EUR12
2 TARGET NOT CHOSEN
service messagingSOURCENONEnone01
1 PRICE SOURCE ABSENT
service messagingTARGETNONEnone01
1 TARGET NOT CHOSEN
service object_storageSOURCENONEnone01
1 PRICE NOT FOUND
service platformTARGETNONEnone01
1 AMBIGUOUS
service secretsSOURCENONEnone04
4 PRICE SOURCE ABSENT
service serverlessSOURCENONEnone05
5 PRICE NOT FOUND
service storageTARGETNONEnone01
1 QUANTITY UNKNOWN

FULL: every line of the scope is priced. PARTIAL: the priced lines are summed and the others are counted, never filled in. NONE: no line of the scope has an amount. An unknown quantity is neither zero nor one, and a line without a price is never free.

Cost groups

Every source unit is in one of three groups. Computed: every line of it, on both sides, has an amount; only these lines make the computed subtotals, so the source and the target subtotal cover the same units and may be compared. Quantity unknown: the price of each open line is known and its quantity is not; the quantity that is needed is named. Not computed: a unit of a type out of the model (no quantity driver; the coverage table counts those apart, by type), a unit the partial draft refuses for a missing input (the coverage table counts those apart as refused), a unit with no line on one side, or a line without a price record; listed by resource with the reason, never zero and never free. It holds every unit counted as out of the model or as refused and the units priced on one side only, so its count is the larger.

Computed (0 items)

Price known, quantity unknown (0)

None.

Not computed (18)

Not computed, and not zero: each resource with why.

Source unitsWhy it is not computed
google_cloud_run_service_iam_policy.server_noauthno quantity driver for google_cloud_run_service_iam_policy in this build: its cost is not computed (it is not zero)
no SOURCE line: the model does not compute the cost of the source
no TARGET line: the draft has no priced component for it
google_cloud_run_v2_job.migrate, google_cloud_run_v2_service.serverSOURCE: 0 components priced, 5 not priced: run cpu time (google_cloud_run_v2_job.migrate) PRICE_NOT_FOUND; run memory time (google_cloud_run_v2_job.migrate) PRICE_NOT_FOUND; run cpu time (google_cloud_run_v2_service.server) PRICE_NOT_FOUND; run memory time (google_cloud_run_v2_service.server) PRICE_NOT_FOUND; run requests (google_cloud_run_v2_service.server) PRICE_NOT_FOUND. TARGET: 1 component priced, 1 not priced: node pool hours (stackit_ske_cluster.containers.node_pool.workloads) TARGET_NOT_CHOSEN; the priced component alone sums to 72.70 EUR. These sums cover the priced components only: a partial figure, not the cost of this resource, and in no computed subtotal, comparison or saving.
source:google_cloud_run_v2_job.migrate:run_cpu_time: PRICE_NOT_FOUND: GCP region not known: location comes from a variable's default, which is not a fact of the source: choose region in the assumption file (--assumptions FILE) or as the answer cost.region of the inputs file (--inputs FILE); second cause, open once this one is closed: the quantity is not known: the time the tasks of a job run per month is a measurement of use (the billable instance time of Cloud Run); the source does not state it; to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.usage_quantity of the inputs file (--inputs FILE): variable usage_quantity, unit instance-hour, subject google_cloud_run_v2_job.migrate.instance_time
source:google_cloud_run_v2_job.migrate:run_memory_time: PRICE_NOT_FOUND: the same reason as source:google_cloud_run_v2_job.migrate:run_cpu_time
source:google_cloud_run_v2_service.server:run_cpu_time: PRICE_NOT_FOUND: GCP region not known: location comes from a variable's default, which is not a fact of the source: choose region in the assumption file (--assumptions FILE) or as the answer cost.region of the inputs file (--inputs FILE); second cause, open once this one is closed: the quantity is not known: the time the instances of a service are billed per month is a measurement of use (the billable instance time of Cloud Run); the source does not state it; to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.usage_quantity of the inputs file (--inputs FILE): variable usage_quantity, unit instance-hour, subject google_cloud_run_v2_service.server.instance_time
source:google_cloud_run_v2_service.server:run_memory_time: PRICE_NOT_FOUND: the same reason as source:google_cloud_run_v2_service.server:run_cpu_time
source:google_cloud_run_v2_service.server:run_requests: PRICE_NOT_FOUND: GCP region not known: location comes from a variable's default, which is not a fact of the source: choose region in the assumption file (--assumptions FILE) or as the answer cost.region of the inputs file (--inputs FILE); second cause, open once this one is closed: the quantity is not known: the requests a service serves per month are a measurement of use; the source does not state them; to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.usage_quantity of the inputs file (--inputs FILE): variable usage_quantity, unit request, subject google_cloud_run_v2_service.server.requests; the free allowance of the account (Cloud Run free tier) is not subtracted: the price shown is the first paid tier
target:stackit_ske_cluster.containers.node_pool.workloads:node_pool_hours: TARGET_NOT_CHOSEN: NOT_ASSESSED: the draft does not choose the server flavor (node_pools.machine_type is var.containers_machine_type): no SKU is named; to name the SKU of this line, state the value of node_pools.machine_type in the assumption file (--assumptions FILE) or as the answer cost.target_choice of the inputs file (--inputs FILE): variable target_choice, subject stackit_ske_cluster.containers.node_pool.workloads, value a server flavor such as "g2i.4"
target:stackit_ske_cluster.containers:cluster_hours: TARGET_ONLY: priced at 72.70 EUR and counted in the priced part of the STACKIT total, but the source side holds no line of its family to stand against: outside the comparison, in no saving
google_cloudbuild_trigger.activategcbno quantity driver for google_cloudbuild_trigger in this build: its cost is not computed (it is not zero)
no SOURCE line: the model does not compute the cost of the source
no TARGET line: the draft has no priced component for it
google_cloudbuild_trigger.initno quantity driver for google_cloudbuild_trigger in this build: its cost is not computed (it is not zero)
no SOURCE line: the model does not compute the cost of the source
no TARGET line: the draft has no priced component for it
google_cloudbuild_trigger.placeholderno quantity driver for google_cloudbuild_trigger in this build: its cost is not computed (it is not zero)
no SOURCE line: the model does not compute the cost of the source
no TARGET line: the draft has no priced component for it
google_firebase_hosting_site.clientno quantity driver for google_firebase_hosting_site in this build: its cost is not computed (it is not zero)
no SOURCE line: the model does not compute the cost of the source
no TARGET line: the draft has no priced component for it
google_firebase_project.defaultno quantity driver for google_firebase_project in this build: its cost is not computed (it is not zero)
no SOURCE line: the model does not compute the cost of the source
no TARGET line: the draft has no priced component for it
google_pubsub_topic.fauxsource:google_pubsub_topic.faux.data:pubsub_data: PRICE_SOURCE_ABSENT: the price cache holds no Google Cloud PubSub catalog for global: its lines cannot be priced (run `stacktoit prices refresh --provider gcp --region global --offer PubSub`, with your API key in STACKTOIT_GCP_BILLING_API_KEY); second cause, open once this one is closed: the quantity is not known: the data a topic delivers per month is a measurement of use; the source does not state it; to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.data_transfer of the inputs file (--inputs FILE): variable data_transfer, unit GiB, subject google_pubsub_topic.faux.data; the price shown is the first paid tier of the message delivery SKU; subscriptions' own delivery and retained storage are not in the line
target:stackit_rabbitmq_instance.messaging:service_plan_hours: TARGET_NOT_CHOSEN: NOT_ASSESSED: the draft does not choose the rabbitmq plan (plan_name is var.rabbitmq_plan_name): no SKU is named; to name the SKU of this line, state the value of plan_name in the assumption file (--assumptions FILE) or as the answer cost.target_choice of the inputs file (--inputs FILE): variable target_choice, subject stackit_rabbitmq_instance.messaging (or the source unit it stands for), value a plan of the catalogue such as "stackit-rabbitmq-2.4.10-single"
google_secret_manager_secret.django_admin_password, google_secret_manager_secret.django_settingssource:google_secret_manager_secret.django_admin_password:secret_access: PRICE_SOURCE_ABSENT: the price cache holds no Google Cloud SecretManager catalog for global: its lines cannot be priced (run `stacktoit prices refresh --provider gcp --region global --offer SecretManager`, with your API key in STACKTOIT_GCP_BILLING_API_KEY); second cause, open once this one is closed: the quantity is not known: the access operations of a secret per month are a measurement of use; the source does not state them; to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.usage_quantity of the inputs file (--inputs FILE): variable usage_quantity, unit operation, subject google_secret_manager_secret.django_admin_password.operations; rotation notifications are billed apart and are not in the line
source:google_secret_manager_secret.django_admin_password:secret_versions: PRICE_SOURCE_ABSENT: the price cache holds no Google Cloud SecretManager catalog for global: its lines cannot be priced (run `stacktoit prices refresh --provider gcp --region global --offer SecretManager`, with your API key in STACKTOIT_GCP_BILLING_API_KEY); second cause, open once this one is closed: the quantity is not known: the active versions of a secret per month, times the locations it is replicated to, are a measurement of use; the source does not state them (the secret has 1 replica locations); to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.usage_quantity of the inputs file (--inputs FILE): variable usage_quantity, unit version, subject google_secret_manager_secret.django_admin_password.versions; the free allowance of the account is not subtracted: the price shown is the first paid tier; the line counts version-locations
source:google_secret_manager_secret.django_settings:secret_access: PRICE_SOURCE_ABSENT: the price cache holds no Google Cloud SecretManager catalog for global: its lines cannot be priced (run `stacktoit prices refresh --provider gcp --region global --offer SecretManager`, with your API key in STACKTOIT_GCP_BILLING_API_KEY); second cause, open once this one is closed: the quantity is not known: the access operations of a secret per month are a measurement of use; the source does not state them; to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.usage_quantity of the inputs file (--inputs FILE): variable usage_quantity, unit operation, subject google_secret_manager_secret.django_settings.operations; rotation notifications are billed apart and are not in the line
source:google_secret_manager_secret.django_settings:secret_versions: PRICE_SOURCE_ABSENT: the price cache holds no Google Cloud SecretManager catalog for global: its lines cannot be priced (run `stacktoit prices refresh --provider gcp --region global --offer SecretManager`, with your API key in STACKTOIT_GCP_BILLING_API_KEY); second cause, open once this one is closed: the quantity is not known: the active versions of a secret per month, times the locations it is replicated to, are a measurement of use; the source does not state them (the secret has 1 replica locations); to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.usage_quantity of the inputs file (--inputs FILE): variable usage_quantity, unit version, subject google_secret_manager_secret.django_settings.versions; the free allowance of the account is not subtracted: the price shown is the first paid tier; the line counts version-locations
target:stackit_secretsmanager_instance.migrated_secrets:list_price: AMBIGUOUS: 5 public SKUs match the Secrets Manager version hour (Secrets Manager-100-EU01, Secrets Manager-100k-EU01, Secrets Manager-10k-EU01, Secrets Manager-1M-EU01, Secrets Manager-1k-EU01): none is picked; the tier is read as the number of secret versions of the instance, which the draft does not state, and which the price list (1.0.44, page Security) and the documentation of the service (FAQ, 2026-11-02: "You pay per secret version") do not define: no tier is assumed
google_secret_manager_secret_iam_binding.django_admin_passwordno quantity driver for google_secret_manager_secret_iam_binding in this build: its cost is not computed (it is not zero)
no SOURCE line: the model does not compute the cost of the source
no TARGET line: the draft has no priced component for it
google_secret_manager_secret_iam_binding.django_settingsno quantity driver for google_secret_manager_secret_iam_binding in this build: its cost is not computed (it is not zero)
no SOURCE line: the model does not compute the cost of the source
no TARGET line: the draft has no priced component for it
google_sql_database.databaseno quantity driver for google_sql_database in this build: its cost is not computed (it is not zero)
no SOURCE line: the model does not compute the cost of the source
no TARGET line: the draft has no priced component for it
google_sql_database_instance.postgresSOURCE: 0 components priced, 3 not priced: storage capacity (billed per GB) (google_sql_database_instance.postgres.storage) PRICE_NOT_FOUND; sql ram hours (google_sql_database_instance.postgres) PRICE_NOT_FOUND; sql vcpu hours (google_sql_database_instance.postgres) PRICE_NOT_FOUND. TARGET: 1 component priced, 2 not priced: storage capacity (billed per GB) (stackit_postgresflex_instance.postgres) TARGET_NOT_CHOSEN; storage class fee (billed per disk) (stackit_postgresflex_instance.postgres) TARGET_NOT_CHOSEN; the priced component alone sums to 91.97 EUR. These sums cover the priced components only: a partial figure, not the cost of this resource, and in no computed subtotal, comparison or saving.
source:google_sql_database_instance.postgres.storage:db_storage: PRICE_NOT_FOUND: GCP region not known: region comes from a variable's default, which is not a fact of the source: choose region in the assumption file (--assumptions FILE) or as the answer cost.region of the inputs file (--inputs FILE); second cause, open once this one is closed: the quantity is not known: settings.disk_size is not stated: the instance starts at the size Cloud SQL chooses and grows with disk_autoresize; no committed-use discount is applied: the line is the list price; backups, the IPv4 address and network egress are billed apart and are not in the lines
source:google_sql_database_instance.postgres:sql_ram_hours: PRICE_NOT_FOUND: GCP region not known: region comes from a variable's default, which is not a fact of the source: choose region in the assumption file (--assumptions FILE) or as the answer cost.region of the inputs file (--inputs FILE); no committed-use discount is applied: the line is the list price; backups, the IPv4 address and network egress are billed apart and are not in the lines
source:google_sql_database_instance.postgres:sql_vcpu_hours: PRICE_NOT_FOUND: the same reason as source:google_sql_database_instance.postgres:sql_ram_hours
target:stackit_postgresflex_instance.postgres:db_storage: TARGET_NOT_CHOSEN: NOT_ASSESSED: the draft does not choose the PostgreSQL Flex storage class (storage.class is var.postgresflex_storage_class): no SKU is named; to name the SKU of this line, state the value of storage.class in the assumption file (--assumptions FILE) or as the answer cost.target_choice of the inputs file (--inputs FILE): variable target_choice, subject stackit_postgresflex_instance.postgres.storage_class, value a storage class such as "premium-perf6-stackit", or answer the request target.postgres.storage of the run (review/inputs.yaml), which also changes the draft
target:stackit_postgresflex_instance.postgres:db_storage_perf_class: TARGET_NOT_CHOSEN: the same reason as target:stackit_postgresflex_instance.postgres:db_storage
google_sql_user.djangono quantity driver for google_sql_user in this build: its cost is not computed (it is not zero)
no SOURCE line: the model does not compute the cost of the source
no TARGET line: the draft has no priced component for it
google_storage_bucket.mediasource:google_storage_bucket.media.storage:bucket_storage: PRICE_NOT_FOUND: GCP region not known: location comes from a variable's default, which is not a fact of the source: choose region in the assumption file (--assumptions FILE) or as the answer cost.region of the inputs file (--inputs FILE); second cause, open once this one is closed: the quantity is not known: the data a bucket holds per month is a measurement of use; the source does not state it; to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.volume_size of the inputs file (--inputs FILE): variable volume_size, unit GiB, subject google_storage_bucket.media.storage; the line is the storage of the bucket's default class; operations, retrieval, early-deletion and data transfer charges are billed apart and are not in it
target:stackit_objectstorage_bucket.media:list_price: QUANTITY_UNKNOWN: the list price of ST-0010801 is known (0.00003697772 EUR per Gigabyte Hours); the quantity is the gigabyte-hours the bucket holds, a measurement of use the draft does not state, so it is not multiplied; to price it, state the average gigabytes one bucket holds in the assumption file (--assumptions FILE) or as the answer cost.volume_size of the inputs file (--inputs FILE): variable volume_size, unit GB, subject stackit_objectstorage_bucket.media (or the source unit it stands for; another data unit converts); without it the line stays unpriced
google_storage_bucket_iam_member.automationno quantity driver for google_storage_bucket_iam_member in this build: its cost is not computed (it is not zero)
no SOURCE line: the model does not compute the cost of the source
no TARGET line: the draft has no priced component for it
google_storage_bucket_iam_member.serverno quantity driver for google_storage_bucket_iam_member in this build: its cost is not computed (it is not zero)
no SOURCE line: the model does not compute the cost of the source
no TARGET line: the draft has no priced component for it
module.project_services.google_project_service.project_servicesno quantity driver for google_project_service in this build: its cost is not computed (it is not zero)
no SOURCE line: the model does not compute the cost of the source
no TARGET line: the draft has no priced component for it

No charge of its own (13)

Nothing to price, and not out of the model: the source cloud bills nothing for a resource of these types of its own.

Source unitsWhy there is nothing to price
google_project_iam_member.automation_permissionsNO_CHARGE: google_project_iam_member has no charge of its own (see the billable coverage): there is nothing to price, it is billed, if at all, through the resource it belongs to or configures, and it is not out of the model (Google Cloud, Identity and Access Management pricing (read 2026-11-05): "All use of Identity and Access Management API is free of charge")
google_project_iam_member.client_permissionsNO_CHARGE: google_project_iam_member has no charge of its own (see the billable coverage): there is nothing to price, it is billed, if at all, through the resource it belongs to or configures, and it is not out of the model (Google Cloud, Identity and Access Management pricing (read 2026-11-05): "All use of Identity and Access Management API is free of charge")
google_project_iam_member.init_permissionsNO_CHARGE: google_project_iam_member has no charge of its own (see the billable coverage): there is nothing to price, it is billed, if at all, through the resource it belongs to or configures, and it is not out of the model (Google Cloud, Identity and Access Management pricing (read 2026-11-05): "All use of Identity and Access Management API is free of charge")
google_project_iam_member.server_permissionsNO_CHARGE: google_project_iam_member has no charge of its own (see the billable coverage): there is nothing to price, it is billed, if at all, through the resource it belongs to or configures, and it is not out of the model (Google Cloud, Identity and Access Management pricing (read 2026-11-05): "All use of Identity and Access Management API is free of charge")
google_service_account.automationNO_CHARGE: google_service_account has no charge of its own (see the billable coverage): there is nothing to price, it is billed, if at all, through the resource it belongs to or configures, and it is not out of the model (Google Cloud, Identity and Access Management pricing (read 2026-11-05): "All use of Identity and Access Management API is free of charge")
google_service_account.clientNO_CHARGE: google_service_account has no charge of its own (see the billable coverage): there is nothing to price, it is billed, if at all, through the resource it belongs to or configures, and it is not out of the model (Google Cloud, Identity and Access Management pricing (read 2026-11-05): "All use of Identity and Access Management API is free of charge")
google_service_account.initNO_CHARGE: google_service_account has no charge of its own (see the billable coverage): there is nothing to price, it is billed, if at all, through the resource it belongs to or configures, and it is not out of the model (Google Cloud, Identity and Access Management pricing (read 2026-11-05): "All use of Identity and Access Management API is free of charge")
google_service_account.serverNO_CHARGE: google_service_account has no charge of its own (see the billable coverage): there is nothing to price, it is billed, if at all, through the resource it belongs to or configures, and it is not out of the model (Google Cloud, Identity and Access Management pricing (read 2026-11-05): "All use of Identity and Access Management API is free of charge")
random_id.suffixNO_CHARGE: random_id is a Terraform helper: it creates nothing in a cloud, so there is no resource to bill and nothing to price, and it is not out of the model
random_password.database_user_passwordNO_CHARGE: random_password is a Terraform helper: it creates nothing in a cloud, so there is no resource to bill and nothing to price, and it is not out of the model
random_password.django_admin_passwordNO_CHARGE: random_password is a Terraform helper: it creates nothing in a cloud, so there is no resource to bill and nothing to price, and it is not out of the model
random_password.django_secret_keyNO_CHARGE: random_password is a Terraform helper: it creates nothing in a cloud, so there is no resource to bill and nothing to price, and it is not out of the model
time_sleep.init_permissions_propagationNO_CHARGE: time_sleep is a Terraform helper: it creates nothing in a cloud, so there is no resource to bill and nothing to price, and it is not out of the model

Source against target, by scope

ScopeComparabilitySaving or increaseWhy
estate (33 source resources), priced part: modelled infrastructure subtotal (3 of 33 source resources)TARGET ONLYnot givenTARGET_ONLY: the source has no priced component. Outside this comparison: STACKIT, target only, no source line stands against them: 1 line, 72.70 EUR. The target-only lines are in the priced part of the STACKIT total, and no saving includes them.
service containersTARGET ONLYnot givenTARGET_ONLY: there is no source total. Outside this comparison: STACKIT, target only, no source line stands against them: 1 line, 72.70 EUR. The target-only lines are in the priced part of the STACKIT total, and no saving includes them.
service databaseTARGET ONLYnot givenTARGET_ONLY: the source has no priced component
service messagingCOMPARABLEnot givenNONE: neither side has a priced component
service object_storageSOURCE ONLYnot givenSOURCE_ONLY: there is no target total
service platformTARGET ONLYnot givenTARGET_ONLY: there is no source total
service secretsSOURCE ONLYnot givenSOURCE_ONLY: there is no target total
service serverlessSOURCE ONLYnot givenSOURCE_ONLY: there is no target total
service storageTARGET ONLYnot givenTARGET_ONLY: there is no source total

A difference between the source and the target subtotal is the difference of those list prices over the same resources, in one currency; it is not the saving, or the cost, of the migration.

A difference stated here is a difference over the compared part only, not a saving of the estate. What the compared part leaves out: priced but outside the comparison (STACKIT, target only, no source line stands against them: 1 line, 72.70 EUR; STACKIT, priced lines of units that are not compared: 1 line, 91.97 EUR); without a price: 14 source lines (9 PRICE_NOT_FOUND, 5 PRICE_SOURCE_ABSENT), 6 STACKIT lines (1 AMBIGUOUS, 1 QUANTITY_UNKNOWN, 4 TARGET_NOT_CHOSEN); reasons: 5 no cache · 4 target not chosen · 1 ambiguous · 1 use not stated; 20 of 20 billable source resources not compared; usage and traffic that no assumption states, support, licences, operations and the one-off costs of the migration are in no figure (the cost of both estates running side by side during the cutover is stated apart, as a one-off item).

While both estates run

While both estates run (the cutover), per month of overlap: source no figure (no line of its estate is priced) and STACKIT 164.67 EUR, each in its own currency; no length of overlap is assumed (parallel_run_months in the assumption file states one); priced part only, so a lower bound (STACKIT: 2 of 8 lines priced). A one-off cost of the migration: in no total, comparison or saving.

EstateStatePer month of overlapLines
sourceNONEno figure0 of 14 priced
STACKITPARTIAL164.67 EUR2 of 8 priced

Both estates run while the migration is cut over. These are the monthly list-price subtotals of the priced lines of each side, each in the currency of its own side (no exchange rate is applied), so they are a lower bound: a line without a price is not in them. The cost of both estates running is a one-off cost of the migration: it is in no total, no comparison and no saving, and it is not the difference between the two estates.

Lines

All 22 lines of the cost model
SideSubjectClassQuantityPrice recordAmountState
SOURCEgoogle_cloud_run_v2_job.migrate
run cpu time; source units google_cloud_run_v2_job.migrate
OUT_OF_MODEL
not computed, not zero: price not found
not known
UNKNOWN
no price record
none
nonePRICE NOT FOUND
GCP region not known: location comes from a variable's default, which is not a fact of the source: choose region in the assumption file (--assumptions FILE) or as the answer cost.region of the inputs file (--inputs FILE); second cause, open once this one is closed: the quantity is not known: the time the tasks of a job run per month is a measurement of use (the billable instance time of Cloud Run); the source does not state it; to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.usage_quantity of the inputs file (--inputs FILE): variable usage_quantity, unit instance-hour, subject google_cloud_run_v2_job.migrate.instance_time
SOURCEgoogle_cloud_run_v2_job.migrate
run memory time; source units google_cloud_run_v2_job.migrate
OUT_OF_MODEL
not computed, not zero: price not found
not known
UNKNOWN
no price record
none
nonePRICE NOT FOUND
GCP region not known: location comes from a variable's default, which is not a fact of the source: choose region in the assumption file (--assumptions FILE) or as the answer cost.region of the inputs file (--inputs FILE); second cause, open once this one is closed: the quantity is not known: the time the tasks of a job run per month is a measurement of use (the billable instance time of Cloud Run); the source does not state it; to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.usage_quantity of the inputs file (--inputs FILE): variable usage_quantity, unit instance-hour, subject google_cloud_run_v2_job.migrate.instance_time
SOURCEgoogle_cloud_run_v2_service.server
run requests; source units google_cloud_run_v2_service.server
OUT_OF_MODEL
not computed, not zero: price not found
not known
UNKNOWN
no price record
none
nonePRICE NOT FOUND
GCP region not known: location comes from a variable's default, which is not a fact of the source: choose region in the assumption file (--assumptions FILE) or as the answer cost.region of the inputs file (--inputs FILE); second cause, open once this one is closed: the quantity is not known: the requests a service serves per month are a measurement of use; the source does not state them; to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.usage_quantity of the inputs file (--inputs FILE): variable usage_quantity, unit request, subject google_cloud_run_v2_service.server.requests; the free allowance of the account (Cloud Run free tier) is not subtracted: the price shown is the first paid tier
SOURCEgoogle_cloud_run_v2_service.server
run cpu time; source units google_cloud_run_v2_service.server
OUT_OF_MODEL
not computed, not zero: price not found
not known
UNKNOWN
no price record
none
nonePRICE NOT FOUND
GCP region not known: location comes from a variable's default, which is not a fact of the source: choose region in the assumption file (--assumptions FILE) or as the answer cost.region of the inputs file (--inputs FILE); second cause, open once this one is closed: the quantity is not known: the time the instances of a service are billed per month is a measurement of use (the billable instance time of Cloud Run); the source does not state it; to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.usage_quantity of the inputs file (--inputs FILE): variable usage_quantity, unit instance-hour, subject google_cloud_run_v2_service.server.instance_time
SOURCEgoogle_cloud_run_v2_service.server
run memory time; source units google_cloud_run_v2_service.server
OUT_OF_MODEL
not computed, not zero: price not found
not known
UNKNOWN
no price record
none
nonePRICE NOT FOUND
GCP region not known: location comes from a variable's default, which is not a fact of the source: choose region in the assumption file (--assumptions FILE) or as the answer cost.region of the inputs file (--inputs FILE); second cause, open once this one is closed: the quantity is not known: the time the instances of a service are billed per month is a measurement of use (the billable instance time of Cloud Run); the source does not state it; to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.usage_quantity of the inputs file (--inputs FILE): variable usage_quantity, unit instance-hour, subject google_cloud_run_v2_service.server.instance_time
SOURCEgoogle_pubsub_topic.faux.data
pubsub data; source units google_pubsub_topic.faux
OUT_OF_MODEL
not computed, not zero: price source absent
not known
UNKNOWN
no price record
none
nonePRICE SOURCE ABSENT
CACHE_MISSING
the price cache holds no Google Cloud PubSub catalog for global: its lines cannot be priced (run `stacktoit prices refresh --provider gcp --region global --offer PubSub`, with your API key in STACKTOIT_GCP_BILLING_API_KEY); second cause, open once this one is closed: the quantity is not known: the data a topic delivers per month is a measurement of use; the source does not state it; to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.data_transfer of the inputs file (--inputs FILE): variable data_transfer, unit GiB, subject google_pubsub_topic.faux.data; the price shown is the first paid tier of the message delivery SKU; subscriptions' own delivery and retained storage are not in the line
SOURCEgoogle_secret_manager_secret.django_admin_password
secret versions; source units google_secret_manager_secret.django_admin_password
OUT_OF_MODEL
not computed, not zero: price source absent
not known
UNKNOWN
no price record
none
nonePRICE SOURCE ABSENT
CACHE_MISSING
the price cache holds no Google Cloud SecretManager catalog for global: its lines cannot be priced (run `stacktoit prices refresh --provider gcp --region global --offer SecretManager`, with your API key in STACKTOIT_GCP_BILLING_API_KEY); second cause, open once this one is closed: the quantity is not known: the active versions of a secret per month, times the locations it is replicated to, are a measurement of use; the source does not state them (the secret has 1 replica locations); to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.usage_quantity of the inputs file (--inputs FILE): variable usage_quantity, unit version, subject google_secret_manager_secret.django_admin_password.versions; the free allowance of the account is not subtracted: the price shown is the first paid tier; the line counts version-locations
SOURCEgoogle_secret_manager_secret.django_admin_password
secret access; source units google_secret_manager_secret.django_admin_password
OUT_OF_MODEL
not computed, not zero: price source absent
not known
UNKNOWN
no price record
none
nonePRICE SOURCE ABSENT
CACHE_MISSING
the price cache holds no Google Cloud SecretManager catalog for global: its lines cannot be priced (run `stacktoit prices refresh --provider gcp --region global --offer SecretManager`, with your API key in STACKTOIT_GCP_BILLING_API_KEY); second cause, open once this one is closed: the quantity is not known: the access operations of a secret per month are a measurement of use; the source does not state them; to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.usage_quantity of the inputs file (--inputs FILE): variable usage_quantity, unit operation, subject google_secret_manager_secret.django_admin_password.operations; rotation notifications are billed apart and are not in the line
SOURCEgoogle_secret_manager_secret.django_settings
secret versions; source units google_secret_manager_secret.django_settings
OUT_OF_MODEL
not computed, not zero: price source absent
not known
UNKNOWN
no price record
none
nonePRICE SOURCE ABSENT
CACHE_MISSING
the price cache holds no Google Cloud SecretManager catalog for global: its lines cannot be priced (run `stacktoit prices refresh --provider gcp --region global --offer SecretManager`, with your API key in STACKTOIT_GCP_BILLING_API_KEY); second cause, open once this one is closed: the quantity is not known: the active versions of a secret per month, times the locations it is replicated to, are a measurement of use; the source does not state them (the secret has 1 replica locations); to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.usage_quantity of the inputs file (--inputs FILE): variable usage_quantity, unit version, subject google_secret_manager_secret.django_settings.versions; the free allowance of the account is not subtracted: the price shown is the first paid tier; the line counts version-locations
SOURCEgoogle_secret_manager_secret.django_settings
secret access; source units google_secret_manager_secret.django_settings
OUT_OF_MODEL
not computed, not zero: price source absent
not known
UNKNOWN
no price record
none
nonePRICE SOURCE ABSENT
CACHE_MISSING
the price cache holds no Google Cloud SecretManager catalog for global: its lines cannot be priced (run `stacktoit prices refresh --provider gcp --region global --offer SecretManager`, with your API key in STACKTOIT_GCP_BILLING_API_KEY); second cause, open once this one is closed: the quantity is not known: the access operations of a secret per month are a measurement of use; the source does not state them; to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.usage_quantity of the inputs file (--inputs FILE): variable usage_quantity, unit operation, subject google_secret_manager_secret.django_settings.operations; rotation notifications are billed apart and are not in the line
SOURCEgoogle_sql_database_instance.postgres
sql vcpu hours; source units google_sql_database_instance.postgres
OUT_OF_MODEL
not computed, not zero: price not found
2 vCPU over 730 h
SOURCE KNOWN
no price record
none
nonePRICE NOT FOUND
GCP region not known: region comes from a variable's default, which is not a fact of the source: choose region in the assumption file (--assumptions FILE) or as the answer cost.region of the inputs file (--inputs FILE); no committed-use discount is applied: the line is the list price; backups, the IPv4 address and network egress are billed apart and are not in the lines
SOURCEgoogle_sql_database_instance.postgres
sql ram hours; source units google_sql_database_instance.postgres
OUT_OF_MODEL
not computed, not zero: price not found
4 GiB over 730 h
SOURCE KNOWN
no price record
none
nonePRICE NOT FOUND
GCP region not known: region comes from a variable's default, which is not a fact of the source: choose region in the assumption file (--assumptions FILE) or as the answer cost.region of the inputs file (--inputs FILE); no committed-use discount is applied: the line is the list price; backups, the IPv4 address and network egress are billed apart and are not in the lines
SOURCEgoogle_sql_database_instance.postgres.storage
db storage; source units google_sql_database_instance.postgres
OUT_OF_MODEL
not computed, not zero: price not found
not known
UNKNOWN
no price record
none
nonePRICE NOT FOUND
GCP region not known: region comes from a variable's default, which is not a fact of the source: choose region in the assumption file (--assumptions FILE) or as the answer cost.region of the inputs file (--inputs FILE); second cause, open once this one is closed: the quantity is not known: settings.disk_size is not stated: the instance starts at the size Cloud SQL chooses and grows with disk_autoresize; no committed-use discount is applied: the line is the list price; backups, the IPv4 address and network egress are billed apart and are not in the lines
SOURCEgoogle_storage_bucket.media.storage
bucket storage; source units google_storage_bucket.media
OUT_OF_MODEL
not computed, not zero: price not found
not known
UNKNOWN
no price record
none
nonePRICE NOT FOUND
GCP region not known: location comes from a variable's default, which is not a fact of the source: choose region in the assumption file (--assumptions FILE) or as the answer cost.region of the inputs file (--inputs FILE); second cause, open once this one is closed: the quantity is not known: the data a bucket holds per month is a measurement of use; the source does not state it; to price it, state the use of one month in the assumption file (--assumptions FILE) or as the answer cost.volume_size of the inputs file (--inputs FILE): variable volume_size, unit GiB, subject google_storage_bucket.media.storage; the line is the storage of the bucket's default class; operations, retrieval, early-deletion and data transfer charges are billed apart and are not in it
TARGETstackit_objectstorage_bucket.media
list price; source units google_storage_bucket.media
OUT_OF_MODEL
not computed, not zero: quantity unknown
not known
UNKNOWN
ST-0010801: list price 0.00003697772 EUR per Gigabyte Hours, not multiplied
list price only
noneQUANTITY UNKNOWN
USAGE_NOT_STATED
the list price of ST-0010801 is known (0.00003697772 EUR per Gigabyte Hours); the quantity is the gigabyte-hours the bucket holds, a measurement of use the draft does not state, so it is not multiplied; to price it, state the average gigabytes one bucket holds in the assumption file (--assumptions FILE) or as the answer cost.volume_size of the inputs file (--inputs FILE): variable volume_size, unit GB, subject stackit_objectstorage_bucket.media (or the source unit it stands for; another data unit converts); without it the line stays unpriced
TARGETstackit_postgresflex_instance.postgres
db instance hours; source units google_sql_database_instance.postgres
ESTIMATE
list price × a quantity read from the source or the draft × 730 h of the scenario (an assumption)
1 instance over 730 h
SOURCE KNOWN
ST-0025701: 0.12598444444 EUR per Hours (per hour)
PUBLIC LIST, valid from 2026-10-08
91.97 EURPRICED
list price ST-0025701 0.12598444444 EUR per hour applied to 730 hours
TARGETstackit_postgresflex_instance.postgres
db storage perf class; source units google_sql_database_instance.postgres
OUT_OF_MODEL
not computed, not zero: target not chosen
1 disk over 730 h
SOURCE KNOWN
no price record
none
noneTARGET NOT CHOSEN
TARGET_NOT_CHOSEN
NOT_ASSESSED: the draft does not choose the PostgreSQL Flex storage class (storage.class is var.postgresflex_storage_class): no SKU is named; to name the SKU of this line, state the value of storage.class in the assumption file (--assumptions FILE) or as the answer cost.target_choice of the inputs file (--inputs FILE): variable target_choice, subject stackit_postgresflex_instance.postgres.storage_class, value a storage class such as "premium-perf6-stackit", or answer the request target.postgres.storage of the run (review/inputs.yaml), which also changes the draft
TARGETstackit_postgresflex_instance.postgres
db storage; source units google_sql_database_instance.postgres
OUT_OF_MODEL
not computed, not zero: target not chosen
not known
UNKNOWN
no price record
none
noneTARGET NOT CHOSEN
TARGET_NOT_CHOSEN
NOT_ASSESSED: the draft does not choose the PostgreSQL Flex storage class (storage.class is var.postgresflex_storage_class): no SKU is named; to name the SKU of this line, state the value of storage.class in the assumption file (--assumptions FILE) or as the answer cost.target_choice of the inputs file (--inputs FILE): variable target_choice, subject stackit_postgresflex_instance.postgres.storage_class, value a storage class such as "premium-perf6-stackit", or answer the request target.postgres.storage of the run (review/inputs.yaml), which also changes the draft
TARGETstackit_rabbitmq_instance.messaging
service plan hours; source units google_pubsub_topic.faux
OUT_OF_MODEL
not computed, not zero: target not chosen
1 instance over 730 h
SOURCE KNOWN
no price record
none
noneTARGET NOT CHOSEN
TARGET_NOT_CHOSEN
NOT_ASSESSED: the draft does not choose the rabbitmq plan (plan_name is var.rabbitmq_plan_name): no SKU is named; to name the SKU of this line, state the value of plan_name in the assumption file (--assumptions FILE) or as the answer cost.target_choice of the inputs file (--inputs FILE): variable target_choice, subject stackit_rabbitmq_instance.messaging (or the source unit it stands for), value a plan of the catalogue such as "stackit-rabbitmq-2.4.10-single"
TARGETstackit_secretsmanager_instance.migrated_secrets
list price; source units google_secret_manager_secret.django_admin_password, google_secret_manager_secret.django_settings
OUT_OF_MODEL
not computed, not zero: ambiguous
not known
UNKNOWN
no price record
none
noneAMBIGUOUS
AMBIGUOUS
5 public SKUs match the Secrets Manager version hour (Secrets Manager-100-EU01, Secrets Manager-100k-EU01, Secrets Manager-10k-EU01, Secrets Manager-1M-EU01, Secrets Manager-1k-EU01): none is picked; the tier is read as the number of secret versions of the instance, which the draft does not state, and which the price list (1.0.44, page Security) and the documentation of the service (FAQ, 2026-11-02: "You pay per secret version") do not define: no tier is assumed
TARGETstackit_ske_cluster.containers
cluster hours; source units google_cloud_run_v2_job.migrate, google_cloud_run_v2_service.server
ESTIMATE
list price × a quantity read from the source or the draft × 730 h of the scenario (an assumption)
1 cluster over 730 h
SOURCE KNOWN
ST-0010701: 0.09959511998 EUR per Hours (per cluster/hour)
PUBLIC LIST, valid from 2026-10-08
72.70 EURPRICED
list price ST-0010701 0.09959511998 EUR per cluster/hour applied to 730 hours; the cluster hour only: the machines of its node pools are servers, and they are not in this line; TARGET ONLY: the source side holds no line of this family for google_cloud_run_v2_job.migrate, google_cloud_run_v2_service.server (the hour of an SKE cluster stands for a control plane: the source side prices one for an Amazon EKS cluster (aws_eks_cluster), and an ECS cluster has no charge of its own (the Fargate hours of a service and the EC2 hours of its capacity are other units of charge)), so no source amount stands against this one: it is counted in the priced part of the STACKIT total and kept out of the comparison, which states what it leaves out
TARGETstackit_ske_cluster.containers.node_pool.workloads
node pool hours; source units google_cloud_run_v2_job.migrate, google_cloud_run_v2_service.server
OUT_OF_MODEL
not computed, not zero: target not chosen
not known
UNKNOWN
no price record
none
noneTARGET NOT CHOSEN
TARGET_NOT_CHOSEN
NOT_ASSESSED: the draft does not choose the server flavor (node_pools.machine_type is var.containers_machine_type): no SKU is named; to name the SKU of this line, state the value of node_pools.machine_type in the assumption file (--assumptions FILE) or as the answer cost.target_choice of the inputs file (--inputs FILE): variable target_choice, subject stackit_ske_cluster.containers.node_pool.workloads, value a server flavor such as "g2i.4"

Price sources

SideSourceStatusVersion and dateCurrency and basis
SOURCEgcp/PubSub/globalNOT AVAILABLE
the price cache holds no Google Cloud PubSub catalog for global: its lines cannot be priced (run `stacktoit prices refresh --provider gcp --region global --offer PubSub`, with your API key in STACKTOIT_GCP_BILLING_API_KEY)
1 price cache: the cache at the default location holds no record of it (the cache was last filled 2026-11-02)
2 release snapshot: none in this build
3 auto-fetch: no program to fetch with: stacktoit-prices was not found next to this binary or on PATH
net list price (On-Demand), catalog PubSub
SOURCEgcp/SecretManager/globalNOT AVAILABLE
the price cache holds no Google Cloud SecretManager catalog for global: its lines cannot be priced (run `stacktoit prices refresh --provider gcp --region global --offer SecretManager`, with your API key in STACKTOIT_GCP_BILLING_API_KEY)
1 price cache: the cache at the default location holds no record of it (the cache was last filled 2026-11-02)
2 release snapshot: none in this build
3 auto-fetch: no program to fetch with: stacktoit-prices was not found next to this binary or on PATH
net list price (On-Demand), catalog SecretManager
TARGETstackitUSED
supplied by the price cache

retrieved 2026-10-26T18:27:45Z
EUR net list price

What these figures are not