From d751750a2792790d84413bc00e05b61f45f342e2 Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Fri, 23 Aug 2024 17:38:06 -0400 Subject: [PATCH 01/20] Initial draft --- specification/appendix/appendix.mdpp | 1 + .../appendix/commitment_discounts.md | 274 ++++++++++++++++++ 2 files changed, 275 insertions(+) create mode 100644 specification/appendix/commitment_discounts.md diff --git a/specification/appendix/appendix.mdpp b/specification/appendix/appendix.mdpp index 510b27ceb..5415ef856 100644 --- a/specification/appendix/appendix.mdpp +++ b/specification/appendix/appendix.mdpp @@ -2,5 +2,6 @@ *This section is non-normative.* +!INCLUDE "commitment_discounts.md",1 !INCLUDE "grouping_constructs_for_resources_and_or_services.md",1 !INCLUDE "origination_of_cost_data.md",1 diff --git a/specification/appendix/commitment_discounts.md b/specification/appendix/commitment_discounts.md new file mode 100644 index 000000000..10a0de4e1 --- /dev/null +++ b/specification/appendix/commitment_discounts.md @@ -0,0 +1,274 @@ +# Commitment Discounts + +A commitment discount is a billing discount that offers reduced rates on preselected SKUs in exchange for an obligated usage or spend amount over a predefined term. Within cost and usage datasets, commitment discounts typically consist of a set of purchases and usage records. + +## Purchases + +While customers are bound to the term of a commitment discount, cloud-service providers, or CSPs, offer various payment options before and/or during the term: + +* In-Advance - The commitment discount is paid in full before the term begins +* Monthly - The commitment discount is paid monthly over the term. +* Hybrid (In-Advance & Monthly) - Half of the commitment discount is paid in-advance and half is paid monthly over the term. + +For example, if a customer buys a spend-based commitment discount for 1 year, with a $1.00 hourly commitment, and pays with the hybrid option, their purchase schedule is: + +* In-Advance: $4,380 (24 hours \* 365 days \* $1.00 \* 0.5) +* Monthly: $182.50 (24 hours \* 365 days \* $1.00 / 12 months) + +## Usage + +Commitment discounts follow a "use-it-or-lose-it" model where the amortization of a commitment discount's purchase applies evenly over each charge period (typically hourly) over the term. + +For example, if a customer buys a spend-based commitment with a $1.00 hourly commitment in January (31 days), only $1.00 is eligible for amortization for each hourly charge period. This means that if I have eligible resources running during this charge period, some or all of the $1.00 allocated to the charge period will be also be allocated to one or more resources. Conversely, if I don't have eligible resources running during this charge period, the $1.00 allocated to the charge period is wasted. + +## Commitment Discounts in FOCUS + +Within the FOCUS specification, the following examples demonstrate how a commitment discount would appear across various payment and amortization scenarios. + +### Purchase Rows + +All commitment discount purchases appear with a positive `BilledCost`, `PricingCategory:Committed`, and the commitment discount's id as both the `ResourceId` and `CommitmentDiscountId` value. In-advance purchases appear as a single record also with `ChargeCategory:Purchase`, `ChargeFrequency:One-Time`, and the commitment discount's entire purchased quantity, `CommitmentDiscountPurchasedQuantity`, and units, `CommitmentDiscountUnit` for the term. + +Monthly purchases are spread across all corresponding charge periods of the term also with `ChargeCateogry:Purchase`, `ChargeFrequency:One-Time`, and the commitment discount's purchase quantity, `CommitmentDiscountPurchasedQuantity`, and units, `CommitmentDiscountUnit` for the charge period. + +Using the same example as above, various purchase for a one-year, spend-based commitment discount with a $1.00 hourly commitment purchased on Jan 1, 2023 can be seen as: + +#### In-Advance + +The entire commitment is billed _once_ during the first charge period of the term for $8,670 (24 hours \* 365 days \* $1.00). + +```json +[ + { + "BillingPeriodStartDate": "2023-01-01 00:00:00Z", + "BillingPeriodEndDate": "2023-02-01 00:00:00Z", + "ChargePeriodStartDate": "2023-01-01 00:00:00Z", + "ChargePeriodEndDate": "2024-01-01 00:00:00Z", + "ChargeCategory": "Purchase", + "ChargeFrequency": "One-Time", + "PricingCategory": "Committed", + "ResourceId": "", + "BilledCost": 8760.00, + "EffectiveCost": 0.00, + "CommitmentDiscountId": "", + "CommitmentDiscountPurchasedQuantity": 8760.00, + "CommitmentDiscountUnit": "USD" + } +] +``` + +#### Monthly + +The commitment is billed across all 8,760 charge periods of the term with $1.00 allocated to each charge period over the term. + +```json +[ + { + "BillingPeriodStartDate": "2023-01-01 00:00:00Z", + "BillingPeriodEndDate": "2023-02-01 00:00:00Z", + "ChargePeriodStartDate": "2023-01-01 00:00:00Z", + "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "ChargeCategory": "Purchase", + "ChargeFrequency": "Recurring", + "PricingCategory": "Committed", + "ResourceId": "", + "BilledCost": 1.00, + "EffectiveCost": 0.00, + "CommitmentDiscountId": "", + "CommitmentDiscountPurchasedQuantity": 1.00, + "CommitmentDiscountUnit": "USD" + }, + + /* ... more recurring purchase records ... */ +] +``` + +#### Hybrid (In-Advance & Monthly) + +Half of the commitment is billed _once_ during the first charge period of the term _and_ the other half is billed across each charge period over the term. Amortized costs incur half of the amount (i.e. $0.50) from the in-advance purchase and the other half from monthly purchase. + +```json +[ + { + "BillingPeriodStartDate": "2023-01-01 00:00:00Z", + "BillingPeriodEndDate": "2023-02-01 00:00:00Z", + "ChargePeriodStartDate": "2023-01-01 00:00:00Z", + "ChargePeriodEndDate": "2024-01-01 00:00:00Z", + "ChargeCategory": "Purchase", + "ChargeFrequency": "One-Time", + "PricingCategory": "Committed", + "ResourceId": "", + "BilledCost": 1.00, + "EffectiveCost": 0.00, + "CommitmentDiscountId": "", + "CommitmentDiscountPurchasedQuantity": 4380.00, + "CommitmentDiscountUnit": "USD" + }, + { + "BillingPeriodStartDate": "2023-01-01 00:00:00Z", + "BillingPeriodEndDate": "2023-02-01 00:00:00Z", + "ChargePeriodStartDate": "2023-01-01 00:00:00Z", + "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "ChargeCategory": "Purchase", + "ChargeFrequency": "Recurring", + "PricingCategory": "Committed", + "ResourceId": "", + "BilledCost": 0.50, + "EffectiveCost": 0.00, + "CommitmentDiscountId": "", + "CommitmentDiscountPurchasedQuantity": 0.50, + "CommitmentDiscountUnit": "USD" + }, + + /* ... more recurring purchase records ... */ +] +``` + +### Usage Rows + +Amortization of commitment discounts occur the same way no matter how a purchase(s) are made. The same fixed usage-based or spend-based amount is applied evenly across all charge periods to eligible resources. Continuing with the same one-year, spend-based commitment discount with a $1.00 hourly commitment as above, there are 4 possible types of scenarios that can occur with eligible resource(s) during a charge period: + +* Scenario 1: 1 resource runs for $1.00 (100% utilization) +* Scenario 2: No eligible resources run (0% utilization) +* Scenario 3: 1 resource runs for $0.75 (75% utilization) +* Scenario 4: 1 resource runs for over the $1.00 hourly commitment (100% utilization + overage) + +#### Scenario 1: 1 resource runs for $1.00 (100% utilization) + +In this scenario, one eligible resource runs for the full hour and costs $1.00. + +```json +[ + { + "BillingPeriodStartDate": "2023-01-01 00:00:00Z", + "BillingPeriodEndDate": "2023-02-01 00:00:00Z", + "ChargePeriodStartDate": "2023-01-01 00:00:00Z", + "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "ChargeCategory": "Usage", + "ChargeFrequency": "Usage-Based", + "PricingCategory": "Committed", + "ResourceId": "", + "ConsumedQuantity": 1, + "ConsumedUnit": "Hour" + "BilledCost": 0.00, + "EffectiveCost": 1.00, + "CommitmentDiscountId": "", + "CommitmentDiscountStatus": "Used", + "CommitmentDiscountConsumedQuantity": 1.00, + "CommitmentDiscountUnit": "USD" + } +] +``` + +#### Scenario 2: No eligible resources run (0% utilization) + +In this scenario, the entire, eligible amount was unused and remained allocated to the commitment discount. + +```json +[ + { + "BillingPeriodStartDate": "2023-01-01 00:00:00Z", + "BillingPeriodEndDate": "2023-02-01 00:00:00Z", + "ChargePeriodStartDate": "2023-01-01 00:00:00Z", + "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "ChargeCategory": "Usage", + "ChargeFrequency": "Usage-Based", + "PricingCategory": "Committed", + "ResourceId": "", + "ConsumedQuantity": null, + "ConsumedUnit": null, + "BilledCost": 0.00, + "EffectiveCost": 1.00, + "CommitmentDiscountId": "", + "CommitmentDiscountStatus": "Unused", + "CommitmentDiscountConsumedQuantity": 1.00, + "CommitmentDiscountUnit": "USD" + } +] +``` + +#### Scenario 3: 1 resource runs for $0.75 (75% utilization) + +In this scenario, one eligible resource runs for the full hour, costs $0.75, and leaves $0.25 as unused. + +```json +[ + { + "BillingPeriodStartDate": "2023-01-01 00:00:00Z", + "BillingPeriodEndDate": "2023-02-01 00:00:00Z", + "ChargePeriodStartDate": "2023-01-01 00:00:00Z", + "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "ChargeCategory": "Usage", + "ChargeFrequency": "Usage-Based", + "PricingCategory": "Committed", + "ResourceId": "", + "ConsumedQuantity": 1, + "ConsumedUnit": "Hour", + "BilledCost": 0.00, + "EffectiveCost": 0.75, + "CommitmentDiscountId": "", + "CommitmentDiscountStatus": "Used", + "CommitmentDiscountConsumedQuantity": 0.75, + "CommitmentDiscountUnit": "USD" + }, + { + "BillingPeriodStartDate": "2023-01-01 00:00:00Z", + "BillingPeriodEndDate": "2023-02-01 00:00:00Z", + "ChargePeriodStartDate": "2023-01-01 00:00:00Z", + "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "ChargeCategory": "Usage", + "ChargeFrequency": "Usage-Based", + "PricingCategory": "Committed", + "ResourceId": "", + "ConsumedQuantity": null, + "ConsumedUnit": null, + "BilledCost": 0.00, + "EffectiveCost": 0.25, + "CommitmentDiscountId": "", + "CommitmentDiscountStatus": "Unused", + "CommitmentDiscountConsumedQuantity": 0.25, + "CommitmentDiscountUnit": "USD" + } +] +``` + +#### Scenario 4: 1 resource runs for over the $1.00 hourly commitment (100% utilization + overage) + +In this scenario, one eligible resource runs for the full hour and costs $1.50. $1.00 was amortized from the commitment discount, and $0.50 was charge as standard, on-demand spend. + +```json +[ + { + "BillingPeriodStartDate": "2023-01-01 00:00:00Z", + "BillingPeriodEndDate": "2023-02-01 00:00:00Z", + "ChargePeriodStartDate": "2023-01-01 00:00:00Z", + "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "ChargeCategory": "Usage", + "ChargeFrequency": "Usage-Based", + "PricingCategory": "Committed", + "ResourceId": "", + "ConsumedQuantity": 1, + "ConsumedUnit": "Hour", + "BilledCost": 0.00, + "EffectiveCost": 1.00, + "CommitmentDiscountId": "", + "CommitmentDiscountStatus": "Used", + "CommitmentDiscountConsumedQuantity": 1.00, + "CommitmentDiscountUnit": "USD" + }, + { + "BillingPeriodStartDate": "2023-01-01 00:00:00Z", + "BillingPeriodEndDate": "2023-02-01 00:00:00Z", + "ChargePeriodStartDate": "2023-01-01 00:00:00Z", + "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "ChargeCategory": "Usage", + "ChargeFrequency": "Usage-Based", + "PricingCategory": "Standard", + "ResourceId": "", + "ConsumedQuantity": 1, + "ConsumedUnit": "Hour", + "BilledCost": 0.50, + "EffectiveCost": 0.00 + } +] +``` From 943efd7cc068763c94441d025ddb9e060893a8f9 Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Fri, 23 Aug 2024 23:06:24 -0400 Subject: [PATCH 02/20] Update commitment_discounts.md --- .../appendix/commitment_discounts.md | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/specification/appendix/commitment_discounts.md b/specification/appendix/commitment_discounts.md index 10a0de4e1..e595e3e3c 100644 --- a/specification/appendix/commitment_discounts.md +++ b/specification/appendix/commitment_discounts.md @@ -1,25 +1,25 @@ # Commitment Discounts -A commitment discount is a billing discount that offers reduced rates on preselected SKUs in exchange for an obligated usage or spend amount over a predefined term. Within cost and usage datasets, commitment discounts typically consist of a set of purchases and usage records. +A commitment discount is a billing discount that offers reduced rates on preselected SKUs in exchange for an obligated usage or spend amount over a predefined term. Commitment discounts typically consist of a set of purchase and usage records within cost and usage datasets. -## Purchases +## Purchasing While customers are bound to the term of a commitment discount, cloud-service providers, or CSPs, offer various payment options before and/or during the term: -* In-Advance - The commitment discount is paid in full before the term begins -* Monthly - The commitment discount is paid monthly over the term. -* Hybrid (In-Advance & Monthly) - Half of the commitment discount is paid in-advance and half is paid monthly over the term. +* *Upfront* - The commitment discount is paid in full before the term begins +* *Monthly* - The commitment discount is paid monthly over the term. +* *Hybrid* (1/2 Upfront & 1/2 Monthly) - Half of the commitment discount is paid in advance and half is paid monthly over the term. -For example, if a customer buys a spend-based commitment discount for 1 year, with a $1.00 hourly commitment, and pays with the hybrid option, their purchase schedule is: +For example, if a customer buys a spend-based commitment discount for 1 year, with a $1.00 hourly commitment, and pays with the hybrid option, the commitment discount's payment consists of both: -* In-Advance: $4,380 (24 hours \* 365 days \* $1.00 \* 0.5) -* Monthly: $182.50 (24 hours \* 365 days \* $1.00 / 12 months) +1. *Upfront* - $4,380 (`24 hours * 365 days * $1.00 * 0.5`) +2. *Monthly* - $182.50 (`24 hours * 365 days * $1.00 / 12 months`) ## Usage -Commitment discounts follow a "use-it-or-lose-it" model where the amortization of a commitment discount's purchase applies evenly over each charge period (typically hourly) over the term. +Commitment discounts follow a "use-it-or-lose-it" model where the amortization of a commitment discount's purchase applies evenly over each charge period of eligible resources over the term. -For example, if a customer buys a spend-based commitment with a $1.00 hourly commitment in January (31 days), only $1.00 is eligible for amortization for each hourly charge period. This means that if I have eligible resources running during this charge period, some or all of the $1.00 allocated to the charge period will be also be allocated to one or more resources. Conversely, if I don't have eligible resources running during this charge period, the $1.00 allocated to the charge period is wasted. +For example, if a customer buys a spend-based commitment with a $1.00 hourly commitment in January (31 days), only $1.00 is eligible for amortization for each hourly charge period. This means that if a customer have eligible resources running during this charge period, some or all of the $1.00 that is allocated to the charge period will be also be allocated to some or all of these resources. Conversely, if a customer does not have eligible resources running during this charge period, the $1.00 allocated to the charge period is wasted. ## Commitment Discounts in FOCUS @@ -27,15 +27,15 @@ Within the FOCUS specification, the following examples demonstrate how a commitm ### Purchase Rows -All commitment discount purchases appear with a positive `BilledCost`, `PricingCategory:Committed`, and the commitment discount's id as both the `ResourceId` and `CommitmentDiscountId` value. In-advance purchases appear as a single record also with `ChargeCategory:Purchase`, `ChargeFrequency:One-Time`, and the commitment discount's entire purchased quantity, `CommitmentDiscountPurchasedQuantity`, and units, `CommitmentDiscountUnit` for the term. +All commitment discount purchases appear with a positive `BilledCost`, `PricingCategory` as "Committed", and the commitment discount's id populating both the `ResourceId` and `CommitmentDiscountId` value. Upfront purchases appear as a single record also with `ChargeCategory` as "Purchase", `ChargeFrequency` as "One-Time", and the total quantity and units for commitment discount's term as `CommitmentDiscountPurchasedQuantity` and `CommitmentDiscountUnit`, respectively. -Monthly purchases are spread across all corresponding charge periods of the term also with `ChargeCateogry:Purchase`, `ChargeFrequency:One-Time`, and the commitment discount's purchase quantity, `CommitmentDiscountPurchasedQuantity`, and units, `CommitmentDiscountUnit` for the charge period. +Monthly purchases are allocated across all corresponding charge periods of the term when `ChargeCateogry` is "Purchase", `ChargeFrequency` is "One-Time". and the commitment discount's purchase quantity, `CommitmentDiscountPurchasedQuantity`, and units, `CommitmentDiscountUnit` are reflected only for that charge period. -Using the same example as above, various purchase for a one-year, spend-based commitment discount with a $1.00 hourly commitment purchased on Jan 1, 2023 can be seen as: +Using the same commitment discount example as above, a one-year, spend-based commitment discount with a $1.00 hourly commitment purchased on Jan 1, 2023, various purchase options can occur: -#### In-Advance +#### Scenario #1: Upfront -The entire commitment is billed _once_ during the first charge period of the term for $8,670 (24 hours \* 365 days \* $1.00). +The entire commitment is billed _once_ during the first charge period of the term for $8,670 (derived as `24 hours * 365 days * $1.00`). ```json [ @@ -57,7 +57,7 @@ The entire commitment is billed _once_ during the first charge period of the ter ] ``` -#### Monthly +#### Scenario #2: Monthly The commitment is billed across all 8,760 charge periods of the term with $1.00 allocated to each charge period over the term. @@ -83,9 +83,9 @@ The commitment is billed across all 8,760 charge periods of the term with $1.00 ] ``` -#### Hybrid (In-Advance & Monthly) +#### Scenario #3: Hybrid (1/2 Upfront & 1/2 Monthly) -Half of the commitment is billed _once_ during the first charge period of the term _and_ the other half is billed across each charge period over the term. Amortized costs incur half of the amount (i.e. $0.50) from the in-advance purchase and the other half from monthly purchase. +Half of the commitment is billed _once_ during the first charge period of the term for $4,380 (derived as `24 hours * 182.5 days * $1.00`), and the other half is billed across each charge period over the term, derived as (`$1.00 * 8,760 hours * 0.5`). Amortized costs incur half of the amount (i.e. $0.50) from the upfront purchase and the other half from the monthly purchase. ```json [ @@ -98,7 +98,7 @@ Half of the commitment is billed _once_ during the first charge period of the te "ChargeFrequency": "One-Time", "PricingCategory": "Committed", "ResourceId": "", - "BilledCost": 1.00, + "BilledCost": 4380.00, "EffectiveCost": 0.00, "CommitmentDiscountId": "", "CommitmentDiscountPurchasedQuantity": 4380.00, @@ -126,16 +126,16 @@ Half of the commitment is billed _once_ during the first charge period of the te ### Usage Rows -Amortization of commitment discounts occur the same way no matter how a purchase(s) are made. The same fixed usage-based or spend-based amount is applied evenly across all charge periods to eligible resources. Continuing with the same one-year, spend-based commitment discount with a $1.00 hourly commitment as above, there are 4 possible types of scenarios that can occur with eligible resource(s) during a charge period: +Amortization of commitment discounts occur the same way regardless of how one or more purchases are made. The same usage-based or spend-based amount is applied evenly across all charge periods and potentially allocated to eligible resources. Continuing with the same commitment discount example, a one-year, spend-based commitment discount with a $1.00 hourly commitment, 4 types of scenarios can occur during a charge period: -* Scenario 1: 1 resource runs for $1.00 (100% utilization) -* Scenario 2: No eligible resources run (0% utilization) -* Scenario 3: 1 resource runs for $0.75 (75% utilization) -* Scenario 4: 1 resource runs for over the $1.00 hourly commitment (100% utilization + overage) +* Scenario #1: Eligible resource(s) runs for $1.00 (100% utilization) +* Scenario #2: No eligible resources run (0% utilization) +* Scenario #3: Eligible resource(s) runs for $0.75 (75% utilization) +* Scenario #4: Eligible resource(s) runs for over the $1.00 hourly commitment (100% utilization + overage) -#### Scenario 1: 1 resource runs for $1.00 (100% utilization) +#### Scenario #1: Eligible resource(s) runs for $1.00 (100% utilization) -In this scenario, one eligible resource runs for the full hour and costs $1.00. +In this scenario, one eligible resource runs for the full hour, so one row allocated to the resource is produced. ```json [ @@ -160,9 +160,9 @@ In this scenario, one eligible resource runs for the full hour and costs $1.00. ] ``` -#### Scenario 2: No eligible resources run (0% utilization) +#### Scenario #2: No eligible resources run (0% utilization) -In this scenario, the entire, eligible amount was unused and remained allocated to the commitment discount. +In this scenario, the entire, eligible amount was unused, so one unused row, allocated to the commitment discount, was produced. ```json [ @@ -187,9 +187,9 @@ In this scenario, the entire, eligible amount was unused and remained allocated ] ``` -#### Scenario 3: 1 resource runs for $0.75 (75% utilization) +#### Scenario #3: Eligible resource(s) runs for $0.75 (75% utilization) -In this scenario, one eligible resource runs for the full hour, costs $0.75, and leaves $0.25 as unused. +In this scenario, one eligible resource runs for the full hour. One row shows $0.75 to a resource, and the other shows that $0.25 remained unused. ```json [ @@ -232,9 +232,9 @@ In this scenario, one eligible resource runs for the full hour, costs $0.75, and ] ``` -#### Scenario 4: 1 resource runs for over the $1.00 hourly commitment (100% utilization + overage) +#### Scenario #4: Eligible resource(s) runs for over the $1.00 hourly commitment (100% utilization + overage) -In this scenario, one eligible resource runs for the full hour and costs $1.50. $1.00 was amortized from the commitment discount, and $0.50 was charge as standard, on-demand spend. +In this scenario, one eligible resource runs for the full hour and costs $1.50. One row shows that $1.00 was amortized from the commitment discount, and the other shows that $0.50 was charged as standard, on-demand spend. ```json [ From f21c015c978745fabb8bfadf149d8c89cd954344 Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Mon, 26 Aug 2024 20:39:29 -0400 Subject: [PATCH 03/20] Incorporated a few suggestions from Shawn Alpay --- specification/appendix/commitment_discounts.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/specification/appendix/commitment_discounts.md b/specification/appendix/commitment_discounts.md index e595e3e3c..363cacda8 100644 --- a/specification/appendix/commitment_discounts.md +++ b/specification/appendix/commitment_discounts.md @@ -1,19 +1,19 @@ # Commitment Discounts -A commitment discount is a billing discount that offers reduced rates on preselected SKUs in exchange for an obligated usage or spend amount over a predefined term. Commitment discounts typically consist of a set of purchase and usage records within cost and usage datasets. +A commitment discount is a billing discount model that offers reduced rates on preselected SKUs in exchange for an obligated usage or spend amount over a predefined term. Commitment discounts typically consist of a set of purchase and usage records within cost and usage datasets. ## Purchasing While customers are bound to the term of a commitment discount, cloud-service providers, or CSPs, offer various payment options before and/or during the term: -* *Upfront* - The commitment discount is paid in full before the term begins -* *Monthly* - The commitment discount is paid monthly over the term. -* *Hybrid* (1/2 Upfront & 1/2 Monthly) - Half of the commitment discount is paid in advance and half is paid monthly over the term. +* *Upfront* - The commitment discount is paid in full before the term begins. +* *Recurring* - The commitment discount is paid on a repeated basis, typically over each billing period of the term. +* *Hybrid* - Some of the commitment discount is paid before the term begins, and the rest is paid repeatedly over the term. For example, if a customer buys a spend-based commitment discount for 1 year, with a $1.00 hourly commitment, and pays with the hybrid option, the commitment discount's payment consists of both: 1. *Upfront* - $4,380 (`24 hours * 365 days * $1.00 * 0.5`) -2. *Monthly* - $182.50 (`24 hours * 365 days * $1.00 / 12 months`) +2. *Recurring* - $182.50 (`24 hours * 365 days * $1.00 / 12 months`) ## Usage @@ -29,7 +29,7 @@ Within the FOCUS specification, the following examples demonstrate how a commitm All commitment discount purchases appear with a positive `BilledCost`, `PricingCategory` as "Committed", and the commitment discount's id populating both the `ResourceId` and `CommitmentDiscountId` value. Upfront purchases appear as a single record also with `ChargeCategory` as "Purchase", `ChargeFrequency` as "One-Time", and the total quantity and units for commitment discount's term as `CommitmentDiscountPurchasedQuantity` and `CommitmentDiscountUnit`, respectively. -Monthly purchases are allocated across all corresponding charge periods of the term when `ChargeCateogry` is "Purchase", `ChargeFrequency` is "One-Time". and the commitment discount's purchase quantity, `CommitmentDiscountPurchasedQuantity`, and units, `CommitmentDiscountUnit` are reflected only for that charge period. +Recurring purchases are allocated across all corresponding charge periods of the term when `ChargeCateogry` is "Purchase", `ChargeFrequency` is "One-Time". and the commitment discount's purchase quantity, `CommitmentDiscountPurchasedQuantity`, and units, `CommitmentDiscountUnit` are reflected only for that charge period. Using the same commitment discount example as above, a one-year, spend-based commitment discount with a $1.00 hourly commitment purchased on Jan 1, 2023, various purchase options can occur: @@ -57,7 +57,7 @@ The entire commitment is billed _once_ during the first charge period of the ter ] ``` -#### Scenario #2: Monthly +#### Scenario #2: Recurring The commitment is billed across all 8,760 charge periods of the term with $1.00 allocated to each charge period over the term. @@ -83,9 +83,9 @@ The commitment is billed across all 8,760 charge periods of the term with $1.00 ] ``` -#### Scenario #3: Hybrid (1/2 Upfront & 1/2 Monthly) +#### Scenario #3: Hybrid -Half of the commitment is billed _once_ during the first charge period of the term for $4,380 (derived as `24 hours * 182.5 days * $1.00`), and the other half is billed across each charge period over the term, derived as (`$1.00 * 8,760 hours * 0.5`). Amortized costs incur half of the amount (i.e. $0.50) from the upfront purchase and the other half from the monthly purchase. +Half of the commitment is billed _once_ during the first charge period of the term for $4,380 (derived as `24 hours * 182.5 days * $1.00`), and the other half is billed across each charge period over the term, derived as (`$1.00 * 8,760 hours * 0.5`). Amortized costs incur half of the amount (i.e. $0.50) from the upfront purchase and the other half from the recurring purchase. ```json [ From e864bb57770d1ce4eba66df81bcb2847b052044d Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Mon, 26 Aug 2024 20:48:21 -0400 Subject: [PATCH 04/20] Ignore MD031: Fenced code blocks should be surrounded by blank lines (blanks-around-fences) --- specification/markdownlnt.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/specification/markdownlnt.cfg b/specification/markdownlnt.cfg index 1a2f234b2..6b2fae3d7 100644 --- a/specification/markdownlnt.cfg +++ b/specification/markdownlnt.cfg @@ -2,6 +2,7 @@ "plugins" : { "MD033" : { "enabled" : false }, "MD013" : { "enabled" : false }, + "MD031" : { "enabled" : false }, "MD041" : { "enabled" : false }, "additional_paths": "../custom_linter_rules/rule_md_990.py" } From 3fec018fea1b5e4bde4a44acb1917c4378d3fdd8 Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Thu, 29 Aug 2024 11:20:44 -0400 Subject: [PATCH 05/20] Grammar fixes, calling out when Consumed{Quantity,Unit} are null, and a section on units for usage/spend commitments --- specification/appendix/commitment_discounts.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/specification/appendix/commitment_discounts.md b/specification/appendix/commitment_discounts.md index 363cacda8..f6a6cf50c 100644 --- a/specification/appendix/commitment_discounts.md +++ b/specification/appendix/commitment_discounts.md @@ -2,6 +2,10 @@ A commitment discount is a billing discount model that offers reduced rates on preselected SKUs in exchange for an obligated usage or spend amount over a predefined term. Commitment discounts typically consist of a set of purchase and usage records within cost and usage datasets. +Usage-based commitment discounts obligate a customer to a total quantity of time of a preselected term, typically measured in "Hours". In some cases, usage-based commitment discounts allow similar resources of different size classifications to relatively benefit from commitment discount rates. This is typically known as "size flexibility", and is determined by multiplying the number of actual hours consumed by a resource by its predetermined normalization factor to derive the number of "Normalized Hours" consumed. + +Spend-based commitment discounts obligate a customer to total monetary quantity over a preselected term, typically denoted by the invoice's selected billing currency (ex: "USD"). + ## Purchasing While customers are bound to the term of a commitment discount, cloud-service providers, or CSPs, offer various payment options before and/or during the term: @@ -19,17 +23,17 @@ For example, if a customer buys a spend-based commitment discount for 1 year, wi Commitment discounts follow a "use-it-or-lose-it" model where the amortization of a commitment discount's purchase applies evenly over each charge period of eligible resources over the term. -For example, if a customer buys a spend-based commitment with a $1.00 hourly commitment in January (31 days), only $1.00 is eligible for amortization for each hourly charge period. This means that if a customer have eligible resources running during this charge period, some or all of the $1.00 that is allocated to the charge period will be also be allocated to some or all of these resources. Conversely, if a customer does not have eligible resources running during this charge period, the $1.00 allocated to the charge period is wasted. +For example, if a customer buys a spend-based commitment with a $1.00 hourly commitment in January (31 days), only $1.00 is eligible for consumption for each hourly charge period. This means that if a customer has eligible resources running during this charge period, some or all of the $1.00 that is allocated to the charge period will also be allocated to some or all of these resources. Conversely, if a customer does not have eligible resources running during this charge period, the $1.00 allocated to the charge period is wasted. ## Commitment Discounts in FOCUS -Within the FOCUS specification, the following examples demonstrate how a commitment discount would appear across various payment and amortization scenarios. +Within the FOCUS specification, the following examples demonstrate how a commitment discount would appear across various payment and usage scenarios. ### Purchase Rows All commitment discount purchases appear with a positive `BilledCost`, `PricingCategory` as "Committed", and the commitment discount's id populating both the `ResourceId` and `CommitmentDiscountId` value. Upfront purchases appear as a single record also with `ChargeCategory` as "Purchase", `ChargeFrequency` as "One-Time", and the total quantity and units for commitment discount's term as `CommitmentDiscountPurchasedQuantity` and `CommitmentDiscountUnit`, respectively. -Recurring purchases are allocated across all corresponding charge periods of the term when `ChargeCateogry` is "Purchase", `ChargeFrequency` is "One-Time". and the commitment discount's purchase quantity, `CommitmentDiscountPurchasedQuantity`, and units, `CommitmentDiscountUnit` are reflected only for that charge period. +Recurring purchases are allocated across all corresponding charge periods of the term when `ChargeCategory` is "Purchase", `ChargeFrequency` is "One-Time". and the commitment discount's purchase quantity, `CommitmentDiscountPurchasedQuantity`, and units, `CommitmentDiscountUnit` are reflected only for that charge period. Using the same commitment discount example as above, a one-year, spend-based commitment discount with a $1.00 hourly commitment purchased on Jan 1, 2023, various purchase options can occur: @@ -79,7 +83,7 @@ The commitment is billed across all 8,760 charge periods of the term with $1.00 "CommitmentDiscountUnit": "USD" }, - /* ... more recurring purchase records ... */ + /* ... 743 more recurring purchase records for the billing period ... */ ] ``` @@ -120,7 +124,7 @@ Half of the commitment is billed _once_ during the first charge period of the te "CommitmentDiscountUnit": "USD" }, - /* ... more recurring purchase records ... */ + /* ... 743 more recurring purchase records for the billing period ... */ ] ``` @@ -149,7 +153,7 @@ In this scenario, one eligible resource runs for the full hour, so one row alloc "PricingCategory": "Committed", "ResourceId": "", "ConsumedQuantity": 1, - "ConsumedUnit": "Hour" + "ConsumedUnit": "Hour", "BilledCost": 0.00, "EffectiveCost": 1.00, "CommitmentDiscountId": "", @@ -162,7 +166,7 @@ In this scenario, one eligible resource runs for the full hour, so one row alloc #### Scenario #2: No eligible resources run (0% utilization) -In this scenario, the entire, eligible amount was unused, so one unused row, allocated to the commitment discount, was produced. +In this scenario, the entire, eligible amount was unused, so one unused row, allocated to the commitment discount, was produced. Most notably, ConsumedQuantity and ConsumedUnit are null while CommitmentDiscountConsumedQuantity is not because $1 was still drawn down by the commitment discount even though it was not consumed by a resource. ```json [ From 788c90cf3e7e2c36dbf8ce6ed9cf7bdee8875e30 Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Thu, 29 Aug 2024 13:21:21 -0400 Subject: [PATCH 06/20] Update specification/appendix/commitment_discounts.md Co-authored-by: Shawn Alpay <77511110+salpaysenturus@users.noreply.github.com> --- specification/appendix/commitment_discounts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specification/appendix/commitment_discounts.md b/specification/appendix/commitment_discounts.md index f6a6cf50c..708856864 100644 --- a/specification/appendix/commitment_discounts.md +++ b/specification/appendix/commitment_discounts.md @@ -33,7 +33,7 @@ Within the FOCUS specification, the following examples demonstrate how a commitm All commitment discount purchases appear with a positive `BilledCost`, `PricingCategory` as "Committed", and the commitment discount's id populating both the `ResourceId` and `CommitmentDiscountId` value. Upfront purchases appear as a single record also with `ChargeCategory` as "Purchase", `ChargeFrequency` as "One-Time", and the total quantity and units for commitment discount's term as `CommitmentDiscountPurchasedQuantity` and `CommitmentDiscountUnit`, respectively. -Recurring purchases are allocated across all corresponding charge periods of the term when `ChargeCategory` is "Purchase", `ChargeFrequency` is "One-Time". and the commitment discount's purchase quantity, `CommitmentDiscountPurchasedQuantity`, and units, `CommitmentDiscountUnit` are reflected only for that charge period. +Recurring purchases are allocated across all corresponding charge periods of the term when `ChargeCategory` is "Purchase", `ChargeFrequency` is "One-Time", and `CommitmentDiscountPurchasedQuantity` and `CommitmentDiscountUnit` are reflected only for that charge period. Using the same commitment discount example as above, a one-year, spend-based commitment discount with a $1.00 hourly commitment purchased on Jan 1, 2023, various purchase options can occur: From 93199b7ec0c7c244fa4cd2b8b98be766cba18909 Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Thu, 29 Aug 2024 13:24:50 -0400 Subject: [PATCH 07/20] Specify that 1 resource is being modeled --- specification/appendix/commitment_discounts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specification/appendix/commitment_discounts.md b/specification/appendix/commitment_discounts.md index 708856864..3cf7b632b 100644 --- a/specification/appendix/commitment_discounts.md +++ b/specification/appendix/commitment_discounts.md @@ -130,7 +130,7 @@ Half of the commitment is billed _once_ during the first charge period of the te ### Usage Rows -Amortization of commitment discounts occur the same way regardless of how one or more purchases are made. The same usage-based or spend-based amount is applied evenly across all charge periods and potentially allocated to eligible resources. Continuing with the same commitment discount example, a one-year, spend-based commitment discount with a $1.00 hourly commitment, 4 types of scenarios can occur during a charge period: +Amortization of commitment discounts occur the same way regardless of how one or more purchases are made. The same usage-based or spend-based amount is applied evenly across all charge periods and potentially allocated to eligible resources. Continuing with the same commitment discount example, a one-year, spend-based commitment discount with a $1.00 hourly commitment, and 1 resource, 4 types of scenarios can occur during a charge period: * Scenario #1: Eligible resource(s) runs for $1.00 (100% utilization) * Scenario #2: No eligible resources run (0% utilization) From f43ee82324a0952da654799595ce71e02553d359 Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Fri, 30 Aug 2024 15:21:21 -0400 Subject: [PATCH 08/20] Size flexibility Appendix --- specification/appendix/appendix.mdpp | 3 +- .../commitment_discounts.md | 0 .../commitment_discounts/size_flexibility.md | 200 ++++++++++++++++++ 3 files changed, 202 insertions(+), 1 deletion(-) rename specification/appendix/{ => commitment_discounts}/commitment_discounts.md (100%) create mode 100644 specification/appendix/commitment_discounts/size_flexibility.md diff --git a/specification/appendix/appendix.mdpp b/specification/appendix/appendix.mdpp index 5415ef856..9ee6066aa 100644 --- a/specification/appendix/appendix.mdpp +++ b/specification/appendix/appendix.mdpp @@ -2,6 +2,7 @@ *This section is non-normative.* -!INCLUDE "commitment_discounts.md",1 +!INCLUDE "commitment_discounts/commitment_discounts.md",1 +!INCLUDE "commitment_discounts/size_flexibility.md",1 !INCLUDE "grouping_constructs_for_resources_and_or_services.md",1 !INCLUDE "origination_of_cost_data.md",1 diff --git a/specification/appendix/commitment_discounts.md b/specification/appendix/commitment_discounts/commitment_discounts.md similarity index 100% rename from specification/appendix/commitment_discounts.md rename to specification/appendix/commitment_discounts/commitment_discounts.md diff --git a/specification/appendix/commitment_discounts/size_flexibility.md b/specification/appendix/commitment_discounts/size_flexibility.md new file mode 100644 index 000000000..1bfaa06a4 --- /dev/null +++ b/specification/appendix/commitment_discounts/size_flexibility.md @@ -0,0 +1,200 @@ +# Size Flexibility + +A usage-based commitment discount obligates a customer to a usage amount for one or more related SKUs in return for reduced rates. For example, when a customer purchases a usage-based commitment discount to cover a specific database SKU, this commitment will cover every hour over the term where at least one instance of this SKU is running. It can also cover eligible resources wholly, where 1 hour is covered by 1 resource, or partially, where 1 committed hour can be split across multiple resources or 1 resource can be fully covered with unused commitment discount costs. These latter two examples are commonly known as *size-flexibility*. + +Since providers have different rules for when size-flexibility is or is not enabled, the following, made-up SKU pricing attributes will be used in each example below, and each example will be categorized under size-flexibility enabled or disabled sections. + +## SKUs & Rates + +| ProviderName | Service | SkuId | ListUnitPrice | CommittedUnitPrice | NormalizationFactor | +| ------------ | ------- | --------- | -------------- | -------------------| ------------------- | +| TinyCloud | Compute | VM_Small | $0.50 | $0.25 | 1 | +| TinyCloud | Compute | VM_Medium | $1.00 | $0.50 | 2 | +| TinyCloud | Compute | VM_Large | $2.00 | $1.00 | 4 | +| TinyCloud | Compute | VM_XLarge | $4.00 | $2.00 | 8 | + +The above, made-up SKU pricing attributes show that this provider, *TinyCloud*, only has 1 service that offers 4 virtual machine SKUs with various list rates, committed rates, and normalization factors. Each SKU's normalization factor classifies its relative size to its committed rate. Usage-based commitment discounts with size-flexibility can fully cover any combination of 1 or more SKUs where the sum of their normalization factor equals the normalization factor of the commitment discount. + +### Scenarios *without* size-flexibility + +#### Scenario #1: 100% utilization with matching resources + +Purchase: 1 commitment discount purchased for 1 year (2023) for 1 VM_Large. +Usage: 1 VM_Large resource runs from 2023-01-01 00:00:00 to 2023-01-01 01:00:00. + +The commitment discount covers the first charge period for 1 VM_Large resource (i.e. ) resulting in a $1 amortized cost. + +```json +[ + { + "BillingPeriodStartDate": "2023-01-01 00:00:00Z", + "BillingPeriodEndDate": "2023-02-01 00:00:00Z", + "ChargePeriodStartDate": "2023-01-01 00:00:00Z", + "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "ChargeCategory": "Usage", + "ChargeFrequency": "Usage-Based", + "PricingCategory": "Committed", + "ResourceId": "", + "PricingQuantity": 1, + "BilledCost": 0.00, + "EffectiveCost": 1.00, + "ConsumedUnit": 1, + "ConsumedUnit": "Hour", + "SkuId": "VM_Large", + "CommitmentDiscountId": "", + "CommitmentDiscountStatus": "Used", + "CommitmentDiscountQuantity": 1, + "CommitmentDiscountUnit": "Hour" + } +] +``` + +#### Scenario #2: 0% utilization with a non-matching resource + +Purchase: 1 commitment discount purchased for 1 year (2023) for 1 VM_Large. +Usage: 1 VM_Medium resource runs from 2023-01-01 00:00:00 to 2023-01-01 01:00:00. + +The VM_Large commitment discount is unused because no VM_Large resources are running. Additionally, 1 hour of on-demand usage was incurred by the running VM_Medium resource. These charges result in a $2 amortized cost. + +```json +[ + { + "BillingPeriodStartDate": "2023-01-01 00:00:00Z", + "BillingPeriodEndDate": "2023-02-01 00:00:00Z", + "ChargePeriodStartDate": "2023-01-01 00:00:00Z", + "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "ChargeCategory": "Usage", + "ChargeFrequency": "Usage-Based", + "PricingCategory": "Committed", + "ResourceId": "", + "PricingQuantity": 1, + "BilledCost": 0.00, + "EffectiveCost": 1.00, + "ConsumedUnit": 1, + "ConsumedUnit": "Hour", + "SkuId": "VM_Large", + "CommitmentDiscountId": "", + "CommitmentDiscountStatus": "Unused", + "CommitmentDiscountQuantity": 1, + "CommitmentDiscountUnit": "Hour" + }, + { + "BillingPeriodStartDate": "2023-01-01 00:00:00Z", + "BillingPeriodEndDate": "2023-02-01 00:00:00Z", + "ChargePeriodStartDate": "2023-01-01 00:00:00Z", + "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "ChargeCategory": "Usage", + "ChargeFrequency": "Usage-Based", + "PricingCategory": "Standard", + "ResourceId": "", + "PricingQuantity": 1, + "BilledCost": 1.00, + "EffectiveCost": 0.00, + "ConsumedUnit": 1, + "ConsumedUnit": "Hour", + "SkuId": "VM_Medium" + } +] +``` + +### Scenarios *with* size-flexibility + +#### Scenario #1: 100% utilization with 2 VM_medium resources + +Purchase: 1 commitment discount purchased for 1 year (2023) for 1 VM_XLarge with a normalization factor of 8. +Usage: 2 VM_Medium resources run from 2023-01-01 00:00:00 to 2023-01-01 01:00:00 with a normalization factor of 4 for each resource. + +1 commitment discount for a VM_XLarge has a normalization factor of 8, and 2 VM_Medium resources have a normalization factor of 4, each. Therefore, with size flexibility, 1 VM_XLarge commitment discount can fully cover 2 VM_Medium resources resulting in a $2 amortized cost. + +```json +[ + { + "BillingPeriodStartDate": "2023-01-01 00:00:00Z", + "BillingPeriodEndDate": "2023-02-01 00:00:00Z", + "ChargePeriodStartDate": "2023-01-01 00:00:00Z", + "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "ChargeCategory": "Usage", + "ChargeFrequency": "Usage-Based", + "PricingCategory": "Committed", + "ResourceId": "", + "PricingQuantity": 1, + "BilledCost": 0.00, + "EffectiveCost": 1.00, + "ConsumedUnit": 1, + "ConsumedUnit": "Hour", + "SkuId": "VM_Medium", + "CommitmentDiscountId": "", + "CommitmentDiscountStatus": "Used", + "CommitmentDiscountQuantity": 1, + "CommitmentDiscountUnit": "Normalized Hour" + }, + { + "BillingPeriodStartDate": "2023-01-01 00:00:00Z", + "BillingPeriodEndDate": "2023-02-01 00:00:00Z", + "ChargePeriodStartDate": "2023-01-01 00:00:00Z", + "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "ChargeCategory": "Usage", + "ChargeFrequency": "Usage-Based", + "PricingCategory": "Committed", + "ResourceId": "", + "PricingQuantity": 1, + "BilledCost": 0.00, + "EffectiveCost": 1.00, + "ConsumedUnit": 1, + "ConsumedUnit": "Hour", + "SkuId": "VM_Medium", + "CommitmentDiscountId": "", + "CommitmentDiscountStatus": "Used", + "CommitmentDiscountQuantity": 1, + "CommitmentDiscountUnit": "Normalized Hour" + } +] +``` + +#### Scenario #2: 100% utilization with 1 VM_Large resource + +Purchase: 1 commitment discount purchased for 1 year (2023) for 1 VM_Small with a normalization factor of 1. +Usage: 1 VM_Large resource runs from 2023-01-01 00:00:00 to 2023-01-01 01:00:00 with a normalization factor of 4. + +The VM_Small commitment discount was fully utilized but still only covered 25% of the VM_Large resource, so the rest of the VM incurred an on-demand cost of $1.50, and the amortized cost for this resource is $1.75. + +```json +[ + { + "BillingPeriodStartDate": "2023-01-01 00:00:00Z", + "BillingPeriodEndDate": "2023-02-01 00:00:00Z", + "ChargePeriodStartDate": "2023-01-01 00:00:00Z", + "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "ChargeCategory": "Usage", + "ChargeFrequency": "Usage-Based", + "PricingCategory": "Committed", + "ResourceId": "", + "PricingQuantity": 0.25, + "BilledCost": 0.00, + "EffectiveCost": 0.25, + "ConsumedUnit": 1, + "ConsumedUnit": "Hour", + "SkuId": "VM_Large", + "CommitmentDiscountId": "", + "CommitmentDiscountStatus": "Used", + "CommitmentDiscountQuantity": 1, + "CommitmentDiscountUnit": "Normalized Hour" + }, + { + "BillingPeriodStartDate": "2023-01-01 00:00:00Z", + "BillingPeriodEndDate": "2023-02-01 00:00:00Z", + "ChargePeriodStartDate": "2023-01-01 00:00:00Z", + "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "ChargeCategory": "Usage", + "ChargeFrequency": "Usage-Based", + "PricingCategory": "Standard", + "ResourceId": "", + "PricingQuantity": 0.75, + "BilledCost": 1.50, + "EffectiveCost": 0.00, + "ConsumedUnit": 1, + "ConsumedUnit": "Hour", + "SkuId": "VM_Large" + } +] +``` From e4bd7448a6dbde4800fea5651f682e1e586d4a2f Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Tue, 3 Sep 2024 07:20:06 -0400 Subject: [PATCH 09/20] Update commitment_discounts.md Co-authored-by: Irena Jurica --- specification/appendix/commitment_discounts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specification/appendix/commitment_discounts.md b/specification/appendix/commitment_discounts.md index 3cf7b632b..c1da44c8e 100644 --- a/specification/appendix/commitment_discounts.md +++ b/specification/appendix/commitment_discounts.md @@ -33,7 +33,7 @@ Within the FOCUS specification, the following examples demonstrate how a commitm All commitment discount purchases appear with a positive `BilledCost`, `PricingCategory` as "Committed", and the commitment discount's id populating both the `ResourceId` and `CommitmentDiscountId` value. Upfront purchases appear as a single record also with `ChargeCategory` as "Purchase", `ChargeFrequency` as "One-Time", and the total quantity and units for commitment discount's term as `CommitmentDiscountPurchasedQuantity` and `CommitmentDiscountUnit`, respectively. -Recurring purchases are allocated across all corresponding charge periods of the term when `ChargeCategory` is "Purchase", `ChargeFrequency` is "One-Time", and `CommitmentDiscountPurchasedQuantity` and `CommitmentDiscountUnit` are reflected only for that charge period. +Recurring purchases are allocated across all corresponding charge periods of the term when `ChargeCategory` is "Purchase", `ChargeFrequency` is "Recurring", and `CommitmentDiscountPurchasedQuantity` and `CommitmentDiscountUnit` are reflected only for that charge period. Using the same commitment discount example as above, a one-year, spend-based commitment discount with a $1.00 hourly commitment purchased on Jan 1, 2023, various purchase options can occur: From 167f67a672f59a4139d98f20d2604a52b04ea467 Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Tue, 3 Sep 2024 10:36:08 -0400 Subject: [PATCH 10/20] Fix DateTime format --- .../appendix/commitment_discounts.md | 80 +++++++++---------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/specification/appendix/commitment_discounts.md b/specification/appendix/commitment_discounts.md index 3cf7b632b..4a574bd30 100644 --- a/specification/appendix/commitment_discounts.md +++ b/specification/appendix/commitment_discounts.md @@ -44,10 +44,10 @@ The entire commitment is billed _once_ during the first charge period of the ter ```json [ { - "BillingPeriodStartDate": "2023-01-01 00:00:00Z", - "BillingPeriodEndDate": "2023-02-01 00:00:00Z", - "ChargePeriodStartDate": "2023-01-01 00:00:00Z", - "ChargePeriodEndDate": "2024-01-01 00:00:00Z", + "BillingPeriodStartDate": "2023-01-01T00:00:00Z", + "BillingPeriodEndDate": "2023-02-01T00:00:00Z", + "ChargePeriodStartDate": "2023-01-01T00:00:00Z", + "ChargePeriodEndDate": "2024-01-01T00:00:00Z", "ChargeCategory": "Purchase", "ChargeFrequency": "One-Time", "PricingCategory": "Committed", @@ -68,10 +68,10 @@ The commitment is billed across all 8,760 charge periods of the term with $1.00 ```json [ { - "BillingPeriodStartDate": "2023-01-01 00:00:00Z", - "BillingPeriodEndDate": "2023-02-01 00:00:00Z", - "ChargePeriodStartDate": "2023-01-01 00:00:00Z", - "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "BillingPeriodStartDate": "2023-01-01T00:00:00Z", + "BillingPeriodEndDate": "2023-02-01T00:00:00Z", + "ChargePeriodStartDate": "2023-01-01T00:00:00Z", + "ChargePeriodEndDate": "2023-01-01T01:00:00Z", "ChargeCategory": "Purchase", "ChargeFrequency": "Recurring", "PricingCategory": "Committed", @@ -94,10 +94,10 @@ Half of the commitment is billed _once_ during the first charge period of the te ```json [ { - "BillingPeriodStartDate": "2023-01-01 00:00:00Z", - "BillingPeriodEndDate": "2023-02-01 00:00:00Z", - "ChargePeriodStartDate": "2023-01-01 00:00:00Z", - "ChargePeriodEndDate": "2024-01-01 00:00:00Z", + "BillingPeriodStartDate": "2023-01-01T00:00:00Z", + "BillingPeriodEndDate": "2023-02-01T00:00:00Z", + "ChargePeriodStartDate": "2023-01-01T00:00:00Z", + "ChargePeriodEndDate": "2024-01-01T00:00:00Z", "ChargeCategory": "Purchase", "ChargeFrequency": "One-Time", "PricingCategory": "Committed", @@ -109,10 +109,10 @@ Half of the commitment is billed _once_ during the first charge period of the te "CommitmentDiscountUnit": "USD" }, { - "BillingPeriodStartDate": "2023-01-01 00:00:00Z", - "BillingPeriodEndDate": "2023-02-01 00:00:00Z", - "ChargePeriodStartDate": "2023-01-01 00:00:00Z", - "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "BillingPeriodStartDate": "2023-01-01T00:00:00Z", + "BillingPeriodEndDate": "2023-02-01T00:00:00Z", + "ChargePeriodStartDate": "2023-01-01T00:00:00Z", + "ChargePeriodEndDate": "2023-01-01T01:00:00Z", "ChargeCategory": "Purchase", "ChargeFrequency": "Recurring", "PricingCategory": "Committed", @@ -144,10 +144,10 @@ In this scenario, one eligible resource runs for the full hour, so one row alloc ```json [ { - "BillingPeriodStartDate": "2023-01-01 00:00:00Z", - "BillingPeriodEndDate": "2023-02-01 00:00:00Z", - "ChargePeriodStartDate": "2023-01-01 00:00:00Z", - "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "BillingPeriodStartDate": "2023-01-01T00:00:00Z", + "BillingPeriodEndDate": "2023-02-01T00:00:00Z", + "ChargePeriodStartDate": "2023-01-01T00:00:00Z", + "ChargePeriodEndDate": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -171,10 +171,10 @@ In this scenario, the entire, eligible amount was unused, so one unused row, all ```json [ { - "BillingPeriodStartDate": "2023-01-01 00:00:00Z", - "BillingPeriodEndDate": "2023-02-01 00:00:00Z", - "ChargePeriodStartDate": "2023-01-01 00:00:00Z", - "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "BillingPeriodStartDate": "2023-01-01T00:00:00Z", + "BillingPeriodEndDate": "2023-02-01T00:00:00Z", + "ChargePeriodStartDate": "2023-01-01T00:00:00Z", + "ChargePeriodEndDate": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -198,10 +198,10 @@ In this scenario, one eligible resource runs for the full hour. One row shows $0 ```json [ { - "BillingPeriodStartDate": "2023-01-01 00:00:00Z", - "BillingPeriodEndDate": "2023-02-01 00:00:00Z", - "ChargePeriodStartDate": "2023-01-01 00:00:00Z", - "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "BillingPeriodStartDate": "2023-01-01T00:00:00Z", + "BillingPeriodEndDate": "2023-02-01T00:00:00Z", + "ChargePeriodStartDate": "2023-01-01T00:00:00Z", + "ChargePeriodEndDate": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -216,10 +216,10 @@ In this scenario, one eligible resource runs for the full hour. One row shows $0 "CommitmentDiscountUnit": "USD" }, { - "BillingPeriodStartDate": "2023-01-01 00:00:00Z", - "BillingPeriodEndDate": "2023-02-01 00:00:00Z", - "ChargePeriodStartDate": "2023-01-01 00:00:00Z", - "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "BillingPeriodStartDate": "2023-01-01T00:00:00Z", + "BillingPeriodEndDate": "2023-02-01T00:00:00Z", + "ChargePeriodStartDate": "2023-01-01T00:00:00Z", + "ChargePeriodEndDate": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -243,10 +243,10 @@ In this scenario, one eligible resource runs for the full hour and costs $1.50. ```json [ { - "BillingPeriodStartDate": "2023-01-01 00:00:00Z", - "BillingPeriodEndDate": "2023-02-01 00:00:00Z", - "ChargePeriodStartDate": "2023-01-01 00:00:00Z", - "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "BillingPeriodStartDate": "2023-01-01T00:00:00Z", + "BillingPeriodEndDate": "2023-02-01T00:00:00Z", + "ChargePeriodStartDate": "2023-01-01T00:00:00Z", + "ChargePeriodEndDate": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -261,10 +261,10 @@ In this scenario, one eligible resource runs for the full hour and costs $1.50. "CommitmentDiscountUnit": "USD" }, { - "BillingPeriodStartDate": "2023-01-01 00:00:00Z", - "BillingPeriodEndDate": "2023-02-01 00:00:00Z", - "ChargePeriodStartDate": "2023-01-01 00:00:00Z", - "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "BillingPeriodStartDate": "2023-01-01T00:00:00Z", + "BillingPeriodEndDate": "2023-02-01T00:00:00Z", + "ChargePeriodStartDate": "2023-01-01T00:00:00Z", + "ChargePeriodEndDate": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Standard", From 8af4400895173ace597aabb8ce80245e18afa6b8 Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Tue, 3 Sep 2024 10:39:18 -0400 Subject: [PATCH 11/20] Fix DateTime format --- .../commitment_discounts/size_flexibility.md | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/specification/appendix/commitment_discounts/size_flexibility.md b/specification/appendix/commitment_discounts/size_flexibility.md index 1bfaa06a4..01037a08a 100644 --- a/specification/appendix/commitment_discounts/size_flexibility.md +++ b/specification/appendix/commitment_discounts/size_flexibility.md @@ -20,17 +20,17 @@ The above, made-up SKU pricing attributes show that this provider, *TinyCloud*, #### Scenario #1: 100% utilization with matching resources Purchase: 1 commitment discount purchased for 1 year (2023) for 1 VM_Large. -Usage: 1 VM_Large resource runs from 2023-01-01 00:00:00 to 2023-01-01 01:00:00. +Usage: 1 VM_Large resource runs from 2023-01-01T00:00:00 to 2023-01-01T01:00:00. The commitment discount covers the first charge period for 1 VM_Large resource (i.e. ) resulting in a $1 amortized cost. ```json [ { - "BillingPeriodStartDate": "2023-01-01 00:00:00Z", - "BillingPeriodEndDate": "2023-02-01 00:00:00Z", - "ChargePeriodStartDate": "2023-01-01 00:00:00Z", - "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "BillingPeriodStartDate": "2023-01-01T00:00:00Z", + "BillingPeriodEndDate": "2023-02-01T00:00:00Z", + "ChargePeriodStartDate": "2023-01-01T00:00:00Z", + "ChargePeriodEndDate": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -52,17 +52,17 @@ The commitment discount covers the first charge period for 1 VM_Large resource ( #### Scenario #2: 0% utilization with a non-matching resource Purchase: 1 commitment discount purchased for 1 year (2023) for 1 VM_Large. -Usage: 1 VM_Medium resource runs from 2023-01-01 00:00:00 to 2023-01-01 01:00:00. +Usage: 1 VM_Medium resource runs from 2023-01-01T00:00:00 to 2023-01-01T01:00:00. The VM_Large commitment discount is unused because no VM_Large resources are running. Additionally, 1 hour of on-demand usage was incurred by the running VM_Medium resource. These charges result in a $2 amortized cost. ```json [ { - "BillingPeriodStartDate": "2023-01-01 00:00:00Z", - "BillingPeriodEndDate": "2023-02-01 00:00:00Z", - "ChargePeriodStartDate": "2023-01-01 00:00:00Z", - "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "BillingPeriodStartDate": "2023-01-01T00:00:00Z", + "BillingPeriodEndDate": "2023-02-01T00:00:00Z", + "ChargePeriodStartDate": "2023-01-01T00:00:00Z", + "ChargePeriodEndDate": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -79,10 +79,10 @@ The VM_Large commitment discount is unused because no VM_Large resources are run "CommitmentDiscountUnit": "Hour" }, { - "BillingPeriodStartDate": "2023-01-01 00:00:00Z", - "BillingPeriodEndDate": "2023-02-01 00:00:00Z", - "ChargePeriodStartDate": "2023-01-01 00:00:00Z", - "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "BillingPeriodStartDate": "2023-01-01T00:00:00Z", + "BillingPeriodEndDate": "2023-02-01T00:00:00Z", + "ChargePeriodStartDate": "2023-01-01T00:00:00Z", + "ChargePeriodEndDate": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Standard", @@ -102,17 +102,17 @@ The VM_Large commitment discount is unused because no VM_Large resources are run #### Scenario #1: 100% utilization with 2 VM_medium resources Purchase: 1 commitment discount purchased for 1 year (2023) for 1 VM_XLarge with a normalization factor of 8. -Usage: 2 VM_Medium resources run from 2023-01-01 00:00:00 to 2023-01-01 01:00:00 with a normalization factor of 4 for each resource. +Usage: 2 VM_Medium resources run from 2023-01-01T00:00:00 to 2023-01-01T01:00:00 with a normalization factor of 4 for each resource. 1 commitment discount for a VM_XLarge has a normalization factor of 8, and 2 VM_Medium resources have a normalization factor of 4, each. Therefore, with size flexibility, 1 VM_XLarge commitment discount can fully cover 2 VM_Medium resources resulting in a $2 amortized cost. ```json [ { - "BillingPeriodStartDate": "2023-01-01 00:00:00Z", - "BillingPeriodEndDate": "2023-02-01 00:00:00Z", - "ChargePeriodStartDate": "2023-01-01 00:00:00Z", - "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "BillingPeriodStartDate": "2023-01-01T00:00:00Z", + "BillingPeriodEndDate": "2023-02-01T00:00:00Z", + "ChargePeriodStartDate": "2023-01-01T00:00:00Z", + "ChargePeriodEndDate": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -129,10 +129,10 @@ Usage: 2 VM_Medium resources run from 2023-01-01 00:00:00 to 2023-01-01 01:00:00 "CommitmentDiscountUnit": "Normalized Hour" }, { - "BillingPeriodStartDate": "2023-01-01 00:00:00Z", - "BillingPeriodEndDate": "2023-02-01 00:00:00Z", - "ChargePeriodStartDate": "2023-01-01 00:00:00Z", - "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "BillingPeriodStartDate": "2023-01-01T00:00:00Z", + "BillingPeriodEndDate": "2023-02-01T00:00:00Z", + "ChargePeriodStartDate": "2023-01-01T00:00:00Z", + "ChargePeriodEndDate": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -154,17 +154,17 @@ Usage: 2 VM_Medium resources run from 2023-01-01 00:00:00 to 2023-01-01 01:00:00 #### Scenario #2: 100% utilization with 1 VM_Large resource Purchase: 1 commitment discount purchased for 1 year (2023) for 1 VM_Small with a normalization factor of 1. -Usage: 1 VM_Large resource runs from 2023-01-01 00:00:00 to 2023-01-01 01:00:00 with a normalization factor of 4. +Usage: 1 VM_Large resource runs from 2023-01-01T00:00:00 to 2023-01-01T01:00:00 with a normalization factor of 4. The VM_Small commitment discount was fully utilized but still only covered 25% of the VM_Large resource, so the rest of the VM incurred an on-demand cost of $1.50, and the amortized cost for this resource is $1.75. ```json [ { - "BillingPeriodStartDate": "2023-01-01 00:00:00Z", - "BillingPeriodEndDate": "2023-02-01 00:00:00Z", - "ChargePeriodStartDate": "2023-01-01 00:00:00Z", - "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "BillingPeriodStartDate": "2023-01-01T00:00:00Z", + "BillingPeriodEndDate": "2023-02-01T00:00:00Z", + "ChargePeriodStartDate": "2023-01-01T00:00:00Z", + "ChargePeriodEndDate": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -181,10 +181,10 @@ The VM_Small commitment discount was fully utilized but still only covered 25% o "CommitmentDiscountUnit": "Normalized Hour" }, { - "BillingPeriodStartDate": "2023-01-01 00:00:00Z", - "BillingPeriodEndDate": "2023-02-01 00:00:00Z", - "ChargePeriodStartDate": "2023-01-01 00:00:00Z", - "ChargePeriodEndDate": "2023-01-01 01:00:00Z", + "BillingPeriodStartDate": "2023-01-01T00:00:00Z", + "BillingPeriodEndDate": "2023-02-01T00:00:00Z", + "ChargePeriodStartDate": "2023-01-01T00:00:00Z", + "ChargePeriodEndDate": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Standard", From 4b2ebb0dcf05b83b938fe78c36138ef2dac9560a Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Tue, 3 Sep 2024 18:55:46 -0400 Subject: [PATCH 12/20] Adding editorial changes from Michael --- .../commitment_discounts/size_flexibility.md | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/specification/appendix/commitment_discounts/size_flexibility.md b/specification/appendix/commitment_discounts/size_flexibility.md index 01037a08a..09bf1ece3 100644 --- a/specification/appendix/commitment_discounts/size_flexibility.md +++ b/specification/appendix/commitment_discounts/size_flexibility.md @@ -1,19 +1,19 @@ -# Size Flexibility +# Size-Flexibility -A usage-based commitment discount obligates a customer to a usage amount for one or more related SKUs in return for reduced rates. For example, when a customer purchases a usage-based commitment discount to cover a specific database SKU, this commitment will cover every hour over the term where at least one instance of this SKU is running. It can also cover eligible resources wholly, where 1 hour is covered by 1 resource, or partially, where 1 committed hour can be split across multiple resources or 1 resource can be fully covered with unused commitment discount costs. These latter two examples are commonly known as *size-flexibility*. +A usage-based commitment discount obligates a customer to a usage amount for one or more related SKUs in return for reduced rates. For example, a usage-based commitment discount is purchased to cover a specific database SKU, this commitment will cover every hour over the term where at least one instance of this SKU is running. It can also cover eligible resources wholly, where 1 hour is covered by 1 resource, or partially, where 1 committed hour can be split across multiple resources or 1 resource can be fully covered with unused commitment discount costs. These latter two examples are commonly known as *size-flexibility*. -Since providers have different rules for when size-flexibility is or is not enabled, the following, made-up SKU pricing attributes will be used in each example below, and each example will be categorized under size-flexibility enabled or disabled sections. +Since providers have different rules for when size-flexibility is or is not enabled, the following, fictitious SKU pricing attributes will be used in each example below, and each example will be categorized under size-flexibility enabled or disabled sections. ## SKUs & Rates -| ProviderName | Service | SkuId | ListUnitPrice | CommittedUnitPrice | NormalizationFactor | -| ------------ | ------- | --------- | -------------- | -------------------| ------------------- | -| TinyCloud | Compute | VM_Small | $0.50 | $0.25 | 1 | -| TinyCloud | Compute | VM_Medium | $1.00 | $0.50 | 2 | -| TinyCloud | Compute | VM_Large | $2.00 | $1.00 | 4 | -| TinyCloud | Compute | VM_XLarge | $4.00 | $2.00 | 8 | +| ProviderName | Service | SkuId | ListUnitPrice | x_CommittedUnitPrice | x_NormalizationFactor | +| ------------ | ------- | --------- | -------------- | ---------------------| --------------------- | +| TinyCloud | Compute | VM_Small | $0.50 | $0.25 | 1 | +| TinyCloud | Compute | VM_Medium | $1.00 | $0.50 | 2 | +| TinyCloud | Compute | VM_Large | $2.00 | $1.00 | 4 | +| TinyCloud | Compute | VM_XLarge | $4.00 | $2.00 | 8 | -The above, made-up SKU pricing attributes show that this provider, *TinyCloud*, only has 1 service that offers 4 virtual machine SKUs with various list rates, committed rates, and normalization factors. Each SKU's normalization factor classifies its relative size to its committed rate. Usage-based commitment discounts with size-flexibility can fully cover any combination of 1 or more SKUs where the sum of their normalization factor equals the normalization factor of the commitment discount. +The above, fictitious SKU pricing attributes show that this provider, *TinyCloud*, only has 1 service that offers 4 virtual machine SKUs with various list rates, committed rates, and normalization factors. Each SKU's normalization factor classifies its relative size to its committed rate. Usage-based commitment discounts with size-flexibility can fully cover any combination of 1 or more SKUs where the sum of their normalization factor equals the normalization factor of the commitment discount. ### Scenarios *without* size-flexibility @@ -104,7 +104,7 @@ The VM_Large commitment discount is unused because no VM_Large resources are run Purchase: 1 commitment discount purchased for 1 year (2023) for 1 VM_XLarge with a normalization factor of 8. Usage: 2 VM_Medium resources run from 2023-01-01T00:00:00 to 2023-01-01T01:00:00 with a normalization factor of 4 for each resource. -1 commitment discount for a VM_XLarge has a normalization factor of 8, and 2 VM_Medium resources have a normalization factor of 4, each. Therefore, with size flexibility, 1 VM_XLarge commitment discount can fully cover 2 VM_Medium resources resulting in a $2 amortized cost. +1 commitment discount for a VM_XLarge has a normalization factor of 8, and 2 VM_Medium resources have a normalization factor of 4, each. Therefore, with size-flexibility, 1 VM_XLarge commitment discount can fully cover 2 VM_Medium resources resulting in a $2 amortized cost. ```json [ From a0d27bc456b3c9d372591c739de1f7d592f9b10c Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Wed, 11 Sep 2024 07:59:45 -0400 Subject: [PATCH 13/20] Small term/wording updates based on the evolution of pr: https://github.com/FinOps-Open-Cost-and-Usage-Spec/FOCUS_Spec/pull/400 --- .../appendix/commitment_discounts.md | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/specification/appendix/commitment_discounts.md b/specification/appendix/commitment_discounts.md index 8d95e98c8..11781fdae 100644 --- a/specification/appendix/commitment_discounts.md +++ b/specification/appendix/commitment_discounts.md @@ -2,9 +2,9 @@ A commitment discount is a billing discount model that offers reduced rates on preselected SKUs in exchange for an obligated usage or spend amount over a predefined term. Commitment discounts typically consist of a set of purchase and usage records within cost and usage datasets. -Usage-based commitment discounts obligate a customer to a total quantity of time of a preselected term, typically measured in "Hours". In some cases, usage-based commitment discounts allow similar resources of different size classifications to relatively benefit from commitment discount rates. This is typically known as "size flexibility", and is determined by multiplying the number of actual hours consumed by a resource by its predetermined normalization factor to derive the number of "Normalized Hours" consumed. +Usage-based commitment discounts obligate a customer to a predetermined amount of usage over a preselected term, typically measured in "Hours". In some cases, usage-based commitment discounts allow similar resources of different size classifications to relatively benefit from commitment discount rates. This is typically known as "commitment flexibility", and can be derived by multiplying the number of actual hours consumed by a resource by its predetermined *normalization factor* or *ratio* to derive the number of normalized hours consumed. -Spend-based commitment discounts obligate a customer to total monetary quantity over a preselected term, typically denoted by the invoice's selected billing currency (ex: "USD"). +Spend-based commitment discounts obligate a customer to a predetermined amount of spend over a preselected term, typically denoted by the invoice's selected billing currency (ex: "USD"). ## Purchasing @@ -31,9 +31,9 @@ Within the FOCUS specification, the following examples demonstrate how a commitm ### Purchase Rows -All commitment discount purchases appear with a positive `BilledCost`, `PricingCategory` as "Committed", and the commitment discount's id populating both the `ResourceId` and `CommitmentDiscountId` value. Upfront purchases appear as a single record also with `ChargeCategory` as "Purchase", `ChargeFrequency` as "One-Time", and the total quantity and units for commitment discount's term as `CommitmentDiscountPurchasedQuantity` and `CommitmentDiscountUnit`, respectively. +All commitment discount purchases appear with a positive `BilledCost`, `PricingCategory` as "Committed", and the commitment discount's id populating both the `ResourceId` and `CommitmentDiscountId` value. Upfront purchases appear as a single record also with `ChargeCategory` as "Purchase", `ChargeFrequency` as "One-Time", and the total quantity and units for commitment discount's term as `CommitmentDiscountQuantity` and `CommitmentDiscountUnit`, respectively. -Recurring purchases are allocated across all corresponding charge periods of the term when `ChargeCategory` is "Purchase", `ChargeFrequency` is "Recurring", and `CommitmentDiscountPurchasedQuantity` and `CommitmentDiscountUnit` are reflected only for that charge period. +Recurring purchases are allocated across all corresponding charge periods of the term when `ChargeCategory` is "Purchase", `ChargeFrequency` is "Recurring", and `CommitmentDiscountQuantity` and `CommitmentDiscountUnit` are reflected only for that charge period. Using the same commitment discount example as above, a one-year, spend-based commitment discount with a $1.00 hourly commitment purchased on Jan 1, 2023, various purchase options can occur: @@ -55,7 +55,7 @@ The entire commitment is billed _once_ during the first charge period of the ter "BilledCost": 8760.00, "EffectiveCost": 0.00, "CommitmentDiscountId": "", - "CommitmentDiscountPurchasedQuantity": 8760.00, + "CommitmentDiscountQuantity": 8760.00, "CommitmentDiscountUnit": "USD" } ] @@ -79,7 +79,7 @@ The commitment is billed across all 8,760 charge periods of the term with $1.00 "BilledCost": 1.00, "EffectiveCost": 0.00, "CommitmentDiscountId": "", - "CommitmentDiscountPurchasedQuantity": 1.00, + "CommitmentDiscountQuantity": 1.00, "CommitmentDiscountUnit": "USD" }, @@ -89,7 +89,7 @@ The commitment is billed across all 8,760 charge periods of the term with $1.00 #### Scenario #3: Hybrid -Half of the commitment is billed _once_ during the first charge period of the term for $4,380 (derived as `24 hours * 182.5 days * $1.00`), and the other half is billed across each charge period over the term, derived as (`$1.00 * 8,760 hours * 0.5`). Amortized costs incur half of the amount (i.e. $0.50) from the upfront purchase and the other half from the recurring purchase. +With a 50/50 split, half of the commitment is billed _once_ during the first charge period of the term for $4,380 (derived as `24 hours * 182.5 days * $1.00`), and the other half is billed across each charge period over the term, derived as (`$1.00 * 8,760 hours * 0.5`). Amortized costs incur half of the amount (i.e. $0.50) from the upfront purchase and the other half from the recurring purchase. ```json [ @@ -105,7 +105,7 @@ Half of the commitment is billed _once_ during the first charge period of the te "BilledCost": 4380.00, "EffectiveCost": 0.00, "CommitmentDiscountId": "", - "CommitmentDiscountPurchasedQuantity": 4380.00, + "CommitmentDiscountQuantity": 4380.00, "CommitmentDiscountUnit": "USD" }, { @@ -120,7 +120,7 @@ Half of the commitment is billed _once_ during the first charge period of the te "BilledCost": 0.50, "EffectiveCost": 0.00, "CommitmentDiscountId": "", - "CommitmentDiscountPurchasedQuantity": 0.50, + "CommitmentDiscountQuantity": 0.50, "CommitmentDiscountUnit": "USD" }, @@ -158,7 +158,7 @@ In this scenario, one eligible resource runs for the full hour, so one row alloc "EffectiveCost": 1.00, "CommitmentDiscountId": "", "CommitmentDiscountStatus": "Used", - "CommitmentDiscountConsumedQuantity": 1.00, + "CommitmentDiscountQuantity": 1.00, "CommitmentDiscountUnit": "USD" } ] @@ -166,7 +166,7 @@ In this scenario, one eligible resource runs for the full hour, so one row alloc #### Scenario #2: No eligible resources run (0% utilization) -In this scenario, the entire, eligible amount was unused, so one unused row, allocated to the commitment discount, was produced. Most notably, ConsumedQuantity and ConsumedUnit are null while CommitmentDiscountConsumedQuantity is not because $1 was still drawn down by the commitment discount even though it was not consumed by a resource. +In this scenario, the entire, eligible amount was unused, so one unused row, allocated to the commitment discount, was produced. Most notably, ConsumedQuantity and ConsumedUnit are null while CommitmentDiscountQuantity is not because $1 was still drawn down by the commitment discount even though it was not consumed by a resource. ```json [ @@ -185,7 +185,7 @@ In this scenario, the entire, eligible amount was unused, so one unused row, all "EffectiveCost": 1.00, "CommitmentDiscountId": "", "CommitmentDiscountStatus": "Unused", - "CommitmentDiscountConsumedQuantity": 1.00, + "CommitmentDiscountQuantity": 1.00, "CommitmentDiscountUnit": "USD" } ] @@ -212,7 +212,7 @@ In this scenario, one eligible resource runs for the full hour. One row shows $0 "EffectiveCost": 0.75, "CommitmentDiscountId": "", "CommitmentDiscountStatus": "Used", - "CommitmentDiscountConsumedQuantity": 0.75, + "CommitmentDiscountQuantity": 0.75, "CommitmentDiscountUnit": "USD" }, { @@ -230,7 +230,7 @@ In this scenario, one eligible resource runs for the full hour. One row shows $0 "EffectiveCost": 0.25, "CommitmentDiscountId": "", "CommitmentDiscountStatus": "Unused", - "CommitmentDiscountConsumedQuantity": 0.25, + "CommitmentDiscountQuantity": 0.25, "CommitmentDiscountUnit": "USD" } ] @@ -257,7 +257,7 @@ In this scenario, one eligible resource runs for the full hour and costs $1.50. "EffectiveCost": 1.00, "CommitmentDiscountId": "", "CommitmentDiscountStatus": "Used", - "CommitmentDiscountConsumedQuantity": 1.00, + "CommitmentDiscountQuantity": 1.00, "CommitmentDiscountUnit": "USD" }, { From 10d065c9a07e2c2cb137e5d423014c5140dbe051 Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Wed, 11 Sep 2024 08:17:32 -0400 Subject: [PATCH 14/20] Small term/wording updates based on the evolution of pr: https://github.com/FinOps-Open-Cost-and-Usage-Spec/FOCUS_Spec/pull/400 --- ..._flexibility.md => commitment_flexibility.md} | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) rename specification/appendix/commitment_discounts/{size_flexibility.md => commitment_flexibility.md} (86%) diff --git a/specification/appendix/commitment_discounts/size_flexibility.md b/specification/appendix/commitment_discounts/commitment_flexibility.md similarity index 86% rename from specification/appendix/commitment_discounts/size_flexibility.md rename to specification/appendix/commitment_discounts/commitment_flexibility.md index 09bf1ece3..86f1a40d5 100644 --- a/specification/appendix/commitment_discounts/size_flexibility.md +++ b/specification/appendix/commitment_discounts/commitment_flexibility.md @@ -1,8 +1,10 @@ -# Size-Flexibility +# Commitment Flexibility -A usage-based commitment discount obligates a customer to a usage amount for one or more related SKUs in return for reduced rates. For example, a usage-based commitment discount is purchased to cover a specific database SKU, this commitment will cover every hour over the term where at least one instance of this SKU is running. It can also cover eligible resources wholly, where 1 hour is covered by 1 resource, or partially, where 1 committed hour can be split across multiple resources or 1 resource can be fully covered with unused commitment discount costs. These latter two examples are commonly known as *size-flexibility*. +A usage-based commitment discount obligates a customer to a usage amount for one or more related SKUs in return for reduced rates. For example, a usage-based commitment discount is purchased to cover a specific database SKU, this commitment will cover every hour over the term where at least one instance of this SKU is running. It can also cover eligible resources wholly, where 1 hour is covered by 1 resource, or partially, where 1 committed hour can be split across multiple resources or 1 resource can be fully covered with unused commitment discount costs. These latter two examples are commonly known as *commitment flexibility*. -Since providers have different rules for when size-flexibility is or is not enabled, the following, fictitious SKU pricing attributes will be used in each example below, and each example will be categorized under size-flexibility enabled or disabled sections. +When mixing usage-based commitment discounts with and without commitment flexibility with `CommitmentDiscountQuantity` measured by time, it is important to differentiate the `CommitmentDiscountUnit` for each type of commitment discount. In each scenario below, commitment discounts *without* commitment flexibility applied use "Hour" as a `CommitmentDiscountUnit`, and conversely commitment discounts *with* commitment flexibility use "Normalized Hour" as a `CommitmentDiscountUnit`. + +Since providers have different rules for when commitment flexibility is or is not enabled, the following, fictitious SKU pricing attributes will be used in each example below, and each example will be categorized under commitment flexibility enabled or disabled sections. ## SKUs & Rates @@ -13,9 +15,9 @@ Since providers have different rules for when size-flexibility is or is not enab | TinyCloud | Compute | VM_Large | $2.00 | $1.00 | 4 | | TinyCloud | Compute | VM_XLarge | $4.00 | $2.00 | 8 | -The above, fictitious SKU pricing attributes show that this provider, *TinyCloud*, only has 1 service that offers 4 virtual machine SKUs with various list rates, committed rates, and normalization factors. Each SKU's normalization factor classifies its relative size to its committed rate. Usage-based commitment discounts with size-flexibility can fully cover any combination of 1 or more SKUs where the sum of their normalization factor equals the normalization factor of the commitment discount. +The above, fictitious SKU pricing attributes show that this provider, *TinyCloud*, only has 1 service that offers 4 virtual machine SKUs with various list rates, committed rates, and normalization factors. Each SKU's normalization factor classifies its relative size to its committed rate. Usage-based commitment discounts with commitment flexibility can fully cover any combination of 1 or more SKUs where the sum of their normalization factor equals the normalization factor of the commitment discount. -### Scenarios *without* size-flexibility +### Scenarios *without* commitment flexibility #### Scenario #1: 100% utilization with matching resources @@ -97,14 +99,14 @@ The VM_Large commitment discount is unused because no VM_Large resources are run ] ``` -### Scenarios *with* size-flexibility +### Scenarios *with* commitment flexibility #### Scenario #1: 100% utilization with 2 VM_medium resources Purchase: 1 commitment discount purchased for 1 year (2023) for 1 VM_XLarge with a normalization factor of 8. Usage: 2 VM_Medium resources run from 2023-01-01T00:00:00 to 2023-01-01T01:00:00 with a normalization factor of 4 for each resource. -1 commitment discount for a VM_XLarge has a normalization factor of 8, and 2 VM_Medium resources have a normalization factor of 4, each. Therefore, with size-flexibility, 1 VM_XLarge commitment discount can fully cover 2 VM_Medium resources resulting in a $2 amortized cost. +1 commitment discount for a VM_XLarge has a normalization factor of 8, and 2 VM_Medium resources have a normalization factor of 4, each. With commitment flexibility, 1 VM_XLarge commitment discount can fully cover 2 VM_Medium resources resulting in a $2 amortized cost. ```json [ From 821d926c0e2bbea4ee193a5f96d200c3f23d82fd Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Mon, 16 Sep 2024 07:51:21 -0400 Subject: [PATCH 15/20] Rearrange property in JSON block --- specification/appendix/commitment_discounts.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/specification/appendix/commitment_discounts.md b/specification/appendix/commitment_discounts.md index 11781fdae..9e52e5bf9 100644 --- a/specification/appendix/commitment_discounts.md +++ b/specification/appendix/commitment_discounts.md @@ -157,8 +157,8 @@ In this scenario, one eligible resource runs for the full hour, so one row alloc "BilledCost": 0.00, "EffectiveCost": 1.00, "CommitmentDiscountId": "", - "CommitmentDiscountStatus": "Used", "CommitmentDiscountQuantity": 1.00, + "CommitmentDiscountStatus": "Used", "CommitmentDiscountUnit": "USD" } ] @@ -184,8 +184,8 @@ In this scenario, the entire, eligible amount was unused, so one unused row, all "BilledCost": 0.00, "EffectiveCost": 1.00, "CommitmentDiscountId": "", - "CommitmentDiscountStatus": "Unused", "CommitmentDiscountQuantity": 1.00, + "CommitmentDiscountStatus": "Unused", "CommitmentDiscountUnit": "USD" } ] @@ -211,8 +211,8 @@ In this scenario, one eligible resource runs for the full hour. One row shows $0 "BilledCost": 0.00, "EffectiveCost": 0.75, "CommitmentDiscountId": "", - "CommitmentDiscountStatus": "Used", "CommitmentDiscountQuantity": 0.75, + "CommitmentDiscountStatus": "Used", "CommitmentDiscountUnit": "USD" }, { @@ -229,8 +229,8 @@ In this scenario, one eligible resource runs for the full hour. One row shows $0 "BilledCost": 0.00, "EffectiveCost": 0.25, "CommitmentDiscountId": "", - "CommitmentDiscountStatus": "Unused", "CommitmentDiscountQuantity": 0.25, + "CommitmentDiscountStatus": "Unused", "CommitmentDiscountUnit": "USD" } ] @@ -256,8 +256,8 @@ In this scenario, one eligible resource runs for the full hour and costs $1.50. "BilledCost": 0.00, "EffectiveCost": 1.00, "CommitmentDiscountId": "", - "CommitmentDiscountStatus": "Used", "CommitmentDiscountQuantity": 1.00, + "CommitmentDiscountStatus": "Used", "CommitmentDiscountUnit": "USD" }, { From 4e57192d5bee2ec4efb6e811a682a1a26eebbc6c Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Mon, 16 Sep 2024 07:55:11 -0400 Subject: [PATCH 16/20] Minor fixes --- .../commitment_flexibility.md | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/specification/appendix/commitment_discounts/commitment_flexibility.md b/specification/appendix/commitment_discounts/commitment_flexibility.md index 86f1a40d5..ea91e0517 100644 --- a/specification/appendix/commitment_discounts/commitment_flexibility.md +++ b/specification/appendix/commitment_discounts/commitment_flexibility.md @@ -37,15 +37,15 @@ The commitment discount covers the first charge period for 1 VM_Large resource ( "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", "ResourceId": "", - "PricingQuantity": 1, + "PricingQuantity": 1.00, "BilledCost": 0.00, "EffectiveCost": 1.00, - "ConsumedUnit": 1, + "ConsumedQuantity": 1.00, "ConsumedUnit": "Hour", "SkuId": "VM_Large", "CommitmentDiscountId": "", + "CommitmentDiscountQuantity": 1.00, "CommitmentDiscountStatus": "Used", - "CommitmentDiscountQuantity": 1, "CommitmentDiscountUnit": "Hour" } ] @@ -69,15 +69,15 @@ The VM_Large commitment discount is unused because no VM_Large resources are run "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", "ResourceId": "", - "PricingQuantity": 1, + "PricingQuantity": 1.00, "BilledCost": 0.00, "EffectiveCost": 1.00, - "ConsumedUnit": 1, + "ConsumedQuantity": 1.00, "ConsumedUnit": "Hour", "SkuId": "VM_Large", "CommitmentDiscountId": "", + "CommitmentDiscountQuantity": 1.00, "CommitmentDiscountStatus": "Unused", - "CommitmentDiscountQuantity": 1, "CommitmentDiscountUnit": "Hour" }, { @@ -89,10 +89,10 @@ The VM_Large commitment discount is unused because no VM_Large resources are run "ChargeFrequency": "Usage-Based", "PricingCategory": "Standard", "ResourceId": "", - "PricingQuantity": 1, + "PricingQuantity": 1.00, "BilledCost": 1.00, "EffectiveCost": 0.00, - "ConsumedUnit": 1, + "ConsumedQuantity": 1.00, "ConsumedUnit": "Hour", "SkuId": "VM_Medium" } @@ -119,15 +119,15 @@ Usage: 2 VM_Medium resources run from 2023-01-01T00:00:00 to 2023-01-01T01:00:00 "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", "ResourceId": "", - "PricingQuantity": 1, + "PricingQuantity": 1.00, "BilledCost": 0.00, "EffectiveCost": 1.00, - "ConsumedUnit": 1, + "ConsumedQuantity": 1.00, "ConsumedUnit": "Hour", "SkuId": "VM_Medium", "CommitmentDiscountId": "", + "CommitmentDiscountQuantity": 1.00, "CommitmentDiscountStatus": "Used", - "CommitmentDiscountQuantity": 1, "CommitmentDiscountUnit": "Normalized Hour" }, { @@ -139,15 +139,15 @@ Usage: 2 VM_Medium resources run from 2023-01-01T00:00:00 to 2023-01-01T01:00:00 "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", "ResourceId": "", - "PricingQuantity": 1, + "PricingQuantity": 1.00, "BilledCost": 0.00, "EffectiveCost": 1.00, - "ConsumedUnit": 1, + "ConsumedQuantity": 1.00, "ConsumedUnit": "Hour", "SkuId": "VM_Medium", "CommitmentDiscountId": "", + "CommitmentDiscountQuantity": 1.00, "CommitmentDiscountStatus": "Used", - "CommitmentDiscountQuantity": 1, "CommitmentDiscountUnit": "Normalized Hour" } ] @@ -174,12 +174,12 @@ The VM_Small commitment discount was fully utilized but still only covered 25% o "PricingQuantity": 0.25, "BilledCost": 0.00, "EffectiveCost": 0.25, - "ConsumedUnit": 1, + "ConsumedQuantity": 1.00, "ConsumedUnit": "Hour", "SkuId": "VM_Large", "CommitmentDiscountId": "", + "CommitmentDiscountQuantity": 1.00, "CommitmentDiscountStatus": "Used", - "CommitmentDiscountQuantity": 1, "CommitmentDiscountUnit": "Normalized Hour" }, { @@ -194,7 +194,7 @@ The VM_Small commitment discount was fully utilized but still only covered 25% o "PricingQuantity": 0.75, "BilledCost": 1.50, "EffectiveCost": 0.00, - "ConsumedUnit": 1, + "ConsumedQuantity": 1.00, "ConsumedUnit": "Hour", "SkuId": "VM_Large" } From 7be3840463961861d0b34b1e16007af7ed40f9ce Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Mon, 30 Sep 2024 15:07:08 -0400 Subject: [PATCH 17/20] Adding 'Commitment Discount Visibility' to v1.1 Release Planning --- RELEASE-PLANNING.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/RELEASE-PLANNING.md b/RELEASE-PLANNING.md index 34b21361f..2063999ad 100644 --- a/RELEASE-PLANNING.md +++ b/RELEASE-PLANNING.md @@ -22,6 +22,10 @@ This section outlines the planned release schedule and key milestones for the FO
  • Move beyond the highest-level service categorization to a sub-categorization for services while adding flexibility for providers to share their native categorizations within FOCUS.
  • + Commitment Discount Visibility +
      +
    • Provide deeper visibility into how various commitment discount purchases are amortized across eligible resources.
    • +
    Capacity Reservation
    • Ability to represent on-demand capacity reservations within FOCUS datasets. From 9fc11ab742dd336f3a0e208a5c0dea6b7d4f8a34 Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Wed, 30 Oct 2024 12:42:48 -0400 Subject: [PATCH 18/20] Rebasing against working_draft --- .../appendix/commitment_discounts.md | 278 ------------------ .../commitment_discounts.md | 86 +++--- 2 files changed, 43 insertions(+), 321 deletions(-) delete mode 100644 specification/appendix/commitment_discounts.md diff --git a/specification/appendix/commitment_discounts.md b/specification/appendix/commitment_discounts.md deleted file mode 100644 index 243502a74..000000000 --- a/specification/appendix/commitment_discounts.md +++ /dev/null @@ -1,278 +0,0 @@ -# Commitment Discounts - -A [*commitment discount*](#glossary:commitment-discount) is a billing discount model that offers reduced rates on preselected [*SKUs*](#glossary:sku) in exchange for an obligated usage or spend amount over a predefined [*term*](#glossary:term). *Commitment discounts* typically consist of purchase and usage records within cost and usage datasets. - -Usage-based *commitment discounts* obligate a customer to a predetermined amount of usage over a preselected *term*. In some cases, usage-based *commitment discounts* also feature [*commitment discount flexibility*](#glossary:commitment-discount-flexibility) which may expand the types of [*resources*](#glossary:resource) that a *commitment discount* can cover. It is important to note when mixing *commitment discounts* with and without *commitment discount flexibility*, the [CommitmentDiscountUnit](#commitmentdiscountunit) should reflect this difference. - -Spend-based commitment discounts obligate a customer to a predetermined amount of spend over a preselected *term*. In the usage examples below, each [*row*](#glossary:row) measures the monetary amount of the hourly commit consumed by the *commitment discount*, so the CommitmentDiscountUnit chosen is "USD", or the [*billing currency*](#glossary:billing-currency). - -## Purchasing - -While customers are bound to the *term* of a *commitment discounts*, providers offer some or all of the following payment options before and/or during the *term*: - -* *All Upfront* - The *commitment discounts* is paid in full before the *term* begins. -* *No Upfront* - The *commitment discounts* is paid on a repeated basis, typically over each [*billing period*](#glossary:billing-period) of the *term*. -* *Partial Upfront* - Some of the *commitment discounts* is paid before the *term* begins, and the rest is paid repeatedly over the *term*. - -For example, if a customer buys a 1-year, spend-based *commitment discount* with a $1.00 hourly commit and pays with the partial option, the *commitment discount's* payment consists of a one-time purchase in the beginning of the *term* *and* monthly recurring purchases with the following totals: - -1. *One-Time* - $4,380 (`24 hours * 365 days * $1.00 * 0.5`) -2. *Recurring* - $182.50 (`24 hours * 365 days * $1.00 / 12 months`) - -## Usage - -Commitment discounts follow a "use-it-or-lose-it" model where the [*amortization*](#glossary:amortization) of a *commitment discount's* purchase applies evenly to eligible *resources* over each [*charge period*](#glossary:charge-period) of the *term*. - -For example, if a customer buys a spend-based *commitment discount* with a $1.00 hourly commit in January (31 days), only $1.00 is eligible for consumption for each hourly *charge period*. If a customer has eligible *resources* running during this *charge period*, an amount of up to $1.00 will be allocated to these *resources*. Conversely, if a customer does have eligible *resources* running that fully take advantage of this $1.00 during this *charge period*, then some or all of this amount will go to waste. - -## Commitment Discounts in FOCUS - -Within the FOCUS specification, the following examples demonstrate how a *commitment discount* appears across various payment and usage scenarios. - -### Purchase *Rows* - -All *commitment discount* purchases appear with a positive [BilledCost](#billedcost), [PricingCategory](#pricingcategory) as "Standard", and with the *commitment discount's* id populating both the [ResourceId](#resourceid) and [CommitmentDiscountId](#commitmentdiscountid) value. One-time purchases appear as a single record with [ChargeCategory](#chargecategory) as "Purchase", [ChargeFrequency](#chargefrequency) as "One-Time", and the total quantity and units for *commitment discount's* *term* reflected as [CommitmentDiscountQuantity](#commitmentdiscountquantity) and CommitmentDiscountUnit, respectively. - -Recurring purchases are allocated across all corresponding *charge periods* of the *term* when ChargeCategory is "Purchase", ChargeFrequency is "Recurring", and CommitmentDiscountQuantity and CommitmentDiscountUnit are reflected only for that *charge period*. - -Using the same *commitment discount* example as above with a one-year, spend-based *commitment discount* with a $1.00 hourly commit purchased on Jan 1, 2023, various purchase options are available: - -#### Scenario #1: All Upfront - -The entire *commitment discount* is billed _once_ during the first *charge period* of the *term* for $8,670 (derived as `24 hours * 365 days * $1.00`). - -```json -[ - { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2024-01-01T00:00:00Z", - "ChargeCategory": "Purchase", - "ChargeFrequency": "One-Time", - "PricingCategory": "Standard", - "ResourceId": "", - "BilledCost": 8760.00, - "EffectiveCost": 0.00, - "CommitmentDiscountId": "", - "CommitmentDiscountQuantity": 8760.00, - "CommitmentDiscountUnit": "USD" - } -] -``` - -#### Scenario #2: No Upfront - -The *commitment discount* is billed across all 8,760 (`24 hours * 365 days`) *charge periods* of the *term* with $1.00 allocated to each *charge period* over the *term*. - -```json -[ - { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", - "ChargeCategory": "Purchase", - "ChargeFrequency": "Recurring", - "PricingCategory": "Standard", - "ResourceId": "", - "BilledCost": 1.00, - "EffectiveCost": 0.00, - "CommitmentDiscountId": "", - "CommitmentDiscountQuantity": 1.00, - "CommitmentDiscountUnit": "USD" - }, - - /* ... 8,759 more recurring purchase records for the *term* ... */ -] -``` - -#### Scenario #3: Partial Upfront - -With a 50/50 split, half of the commitment is billed _once_ during the first *charge period* of the *term* for $4,380 (derived as `24 hours * 182.5 days * $1.00`), and the other half is billed across each *charge period* over the term, derived as (`$1.00 * 8,760 hours * 0.5`). Amortized costs incur half of the amount (i.e. $0.50) from the one-time purchase and the other half from the recurring purchase. - -```json -[ - { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2024-01-01T00:00:00Z", - "ChargeCategory": "Purchase", - "ChargeFrequency": "One-Time", - "PricingCategory": "Standard", - "ResourceId": "", - "BilledCost": 4380.00, - "EffectiveCost": 0.00, - "CommitmentDiscountId": "", - "CommitmentDiscountQuantity": 4380.00, - "CommitmentDiscountUnit": "USD" - }, - { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", - "ChargeCategory": "Purchase", - "ChargeFrequency": "Recurring", - "PricingCategory": "Standard", - "ResourceId": "", - "BilledCost": 0.50, - "EffectiveCost": 0.00, - "CommitmentDiscountId": "", - "CommitmentDiscountQuantity": 0.50, - "CommitmentDiscountUnit": "USD" - }, - - /* ... 8,759 more recurring purchase records for the *term* ... */ -] -``` - -### Usage *Rows* - -*Amortization* of *commitment discounts* occur similarly regardless of how *commitment discount* purchases are made. The same usage-based or spend-based amount is applied evenly across all *charge periods* and potentially allocated to eligible *resources*. Continuing with the same *commitment discount* example, a one-year, spend-based *commitment discount* with a $1.00 hourly commit and 1 *resource* (for simplicity) yields 4 types of scenarios that can occur during a *charge period*: - -* Scenario #1: An eligible *resource* fully consumes the allocated amount (100% utilization) -* Scenario #2: No eligible *resource* consumes the allocated amount (0% utilization) -* Scenario #3: An eligible *resource* partially consumes the allocated amount (75% utilization) -* Scenario #4: An eligible *resource* fully consumes the $1.00 hourly commit with an overage (100% utilization + overage) - -#### Scenario #1: An eligible *resource* fully consumes the allocated amount (100% utilization) - -In this scenario, one eligible *resource* runs for the full hour and consumes $1.00, so one *row* allocated to the *resource* is produced. - -```json -[ - { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", - "ChargeCategory": "Usage", - "ChargeFrequency": "Usage-Based", - "PricingCategory": "Committed", - "ResourceId": "", - "ConsumedQuantity": 1, - "ConsumedUnit": "Hour", - "BilledCost": 0.00, - "EffectiveCost": 1.00, - "CommitmentDiscountId": "", - "CommitmentDiscountQuantity": 1.00, - "CommitmentDiscountStatus": "Used", - "CommitmentDiscountUnit": "USD" - } -] -``` - -#### Scenario #2: No eligible *resource* consumes the allocated amount (0% utilization) - -In this situation, the full eligible, $1.00 amount remained unutilized and results in 1 unused *row*. In this scenario, it is important to note that while CommitmentDiscountQuantity is not because $1 was still drawn down by the *commitment discount* even though, no *resource* was allocated, so [ConsumedQuantity](#consumedquantity) and [ConsumedUnit](#consumedunit) are null. - -```json -[ - { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", - "ChargeCategory": "Usage", - "ChargeFrequency": "Usage-Based", - "PricingCategory": "Committed", - "ResourceId": "", - "ConsumedQuantity": null, - "ConsumedUnit": null, - "BilledCost": 0.00, - "EffectiveCost": 1.00, - "CommitmentDiscountId": "", - "CommitmentDiscountQuantity": 1.00, - "CommitmentDiscountStatus": "Unused", - "CommitmentDiscountUnit": "USD" - } -] -``` - -#### Scenario #3: An eligible *resource* partially consumes the allocated amount (75% utilization) - -In this scenario, one eligible *resource* runs for the full hour and consumes $0.75 of the $1.00 allocation. One *row* shows $0.75 to a *resource*, and the other *row* shows that $0.25 was unused. - -```json -[ - { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", - "ChargeCategory": "Usage", - "ChargeFrequency": "Usage-Based", - "PricingCategory": "Committed", - "ResourceId": "", - "ConsumedQuantity": 1, - "ConsumedUnit": "Hour", - "BilledCost": 0.00, - "EffectiveCost": 0.75, - "CommitmentDiscountId": "", - "CommitmentDiscountQuantity": 0.75, - "CommitmentDiscountStatus": "Used", - "CommitmentDiscountUnit": "USD" - }, - { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", - "ChargeCategory": "Usage", - "ChargeFrequency": "Usage-Based", - "PricingCategory": "Committed", - "ResourceId": "", - "ConsumedQuantity": null, - "ConsumedUnit": null, - "BilledCost": 0.00, - "EffectiveCost": 0.25, - "CommitmentDiscountId": "", - "CommitmentDiscountQuantity": 0.25, - "CommitmentDiscountStatus": "Unused", - "CommitmentDiscountUnit": "USD" - } -] -``` - -#### Scenario #4: An eligible *resource* fully consumes the $1.00 hourly commit with an overage (100% utilization + overage) - -In this scenario, one eligible *resource* runs for the full hour and is charged $1.50. One *row* shows that $1.00 was *amortized* from the *commitment discount*, and the other shows that $0.50 was charged as standard, on-demand spend. - -```json -[ - { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", - "ChargeCategory": "Usage", - "ChargeFrequency": "Usage-Based", - "PricingCategory": "Committed", - "ResourceId": "", - "ConsumedQuantity": 1, - "ConsumedUnit": "Hour", - "BilledCost": 0.00, - "EffectiveCost": 1.00, - "CommitmentDiscountId": "", - "CommitmentDiscountQuantity": 1.00, - "CommitmentDiscountStatus": "Used", - "CommitmentDiscountUnit": "USD" - }, - { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", - "ChargeCategory": "Usage", - "ChargeFrequency": "Usage-Based", - "PricingCategory": "Standard", - "ResourceId": "", - "ConsumedQuantity": 1, - "ConsumedUnit": "Hour", - "BilledCost": 0.50, - "EffectiveCost": 0.00 - } -] -``` diff --git a/specification/appendix/commitment_discounts/commitment_discounts.md b/specification/appendix/commitment_discounts/commitment_discounts.md index 9e52e5bf9..243502a74 100644 --- a/specification/appendix/commitment_discounts/commitment_discounts.md +++ b/specification/appendix/commitment_discounts/commitment_discounts.md @@ -1,45 +1,45 @@ # Commitment Discounts -A commitment discount is a billing discount model that offers reduced rates on preselected SKUs in exchange for an obligated usage or spend amount over a predefined term. Commitment discounts typically consist of a set of purchase and usage records within cost and usage datasets. +A [*commitment discount*](#glossary:commitment-discount) is a billing discount model that offers reduced rates on preselected [*SKUs*](#glossary:sku) in exchange for an obligated usage or spend amount over a predefined [*term*](#glossary:term). *Commitment discounts* typically consist of purchase and usage records within cost and usage datasets. -Usage-based commitment discounts obligate a customer to a predetermined amount of usage over a preselected term, typically measured in "Hours". In some cases, usage-based commitment discounts allow similar resources of different size classifications to relatively benefit from commitment discount rates. This is typically known as "commitment flexibility", and can be derived by multiplying the number of actual hours consumed by a resource by its predetermined *normalization factor* or *ratio* to derive the number of normalized hours consumed. +Usage-based *commitment discounts* obligate a customer to a predetermined amount of usage over a preselected *term*. In some cases, usage-based *commitment discounts* also feature [*commitment discount flexibility*](#glossary:commitment-discount-flexibility) which may expand the types of [*resources*](#glossary:resource) that a *commitment discount* can cover. It is important to note when mixing *commitment discounts* with and without *commitment discount flexibility*, the [CommitmentDiscountUnit](#commitmentdiscountunit) should reflect this difference. -Spend-based commitment discounts obligate a customer to a predetermined amount of spend over a preselected term, typically denoted by the invoice's selected billing currency (ex: "USD"). +Spend-based commitment discounts obligate a customer to a predetermined amount of spend over a preselected *term*. In the usage examples below, each [*row*](#glossary:row) measures the monetary amount of the hourly commit consumed by the *commitment discount*, so the CommitmentDiscountUnit chosen is "USD", or the [*billing currency*](#glossary:billing-currency). ## Purchasing -While customers are bound to the term of a commitment discount, cloud-service providers, or CSPs, offer various payment options before and/or during the term: +While customers are bound to the *term* of a *commitment discounts*, providers offer some or all of the following payment options before and/or during the *term*: -* *Upfront* - The commitment discount is paid in full before the term begins. -* *Recurring* - The commitment discount is paid on a repeated basis, typically over each billing period of the term. -* *Hybrid* - Some of the commitment discount is paid before the term begins, and the rest is paid repeatedly over the term. +* *All Upfront* - The *commitment discounts* is paid in full before the *term* begins. +* *No Upfront* - The *commitment discounts* is paid on a repeated basis, typically over each [*billing period*](#glossary:billing-period) of the *term*. +* *Partial Upfront* - Some of the *commitment discounts* is paid before the *term* begins, and the rest is paid repeatedly over the *term*. -For example, if a customer buys a spend-based commitment discount for 1 year, with a $1.00 hourly commitment, and pays with the hybrid option, the commitment discount's payment consists of both: +For example, if a customer buys a 1-year, spend-based *commitment discount* with a $1.00 hourly commit and pays with the partial option, the *commitment discount's* payment consists of a one-time purchase in the beginning of the *term* *and* monthly recurring purchases with the following totals: -1. *Upfront* - $4,380 (`24 hours * 365 days * $1.00 * 0.5`) -2. *Recurring* - $182.50 (`24 hours * 365 days * $1.00 / 12 months`) +1. *One-Time* - $4,380 (`24 hours * 365 days * $1.00 * 0.5`) +2. *Recurring* - $182.50 (`24 hours * 365 days * $1.00 / 12 months`) ## Usage -Commitment discounts follow a "use-it-or-lose-it" model where the amortization of a commitment discount's purchase applies evenly over each charge period of eligible resources over the term. +Commitment discounts follow a "use-it-or-lose-it" model where the [*amortization*](#glossary:amortization) of a *commitment discount's* purchase applies evenly to eligible *resources* over each [*charge period*](#glossary:charge-period) of the *term*. -For example, if a customer buys a spend-based commitment with a $1.00 hourly commitment in January (31 days), only $1.00 is eligible for consumption for each hourly charge period. This means that if a customer has eligible resources running during this charge period, some or all of the $1.00 that is allocated to the charge period will also be allocated to some or all of these resources. Conversely, if a customer does not have eligible resources running during this charge period, the $1.00 allocated to the charge period is wasted. +For example, if a customer buys a spend-based *commitment discount* with a $1.00 hourly commit in January (31 days), only $1.00 is eligible for consumption for each hourly *charge period*. If a customer has eligible *resources* running during this *charge period*, an amount of up to $1.00 will be allocated to these *resources*. Conversely, if a customer does have eligible *resources* running that fully take advantage of this $1.00 during this *charge period*, then some or all of this amount will go to waste. ## Commitment Discounts in FOCUS -Within the FOCUS specification, the following examples demonstrate how a commitment discount would appear across various payment and usage scenarios. +Within the FOCUS specification, the following examples demonstrate how a *commitment discount* appears across various payment and usage scenarios. -### Purchase Rows +### Purchase *Rows* -All commitment discount purchases appear with a positive `BilledCost`, `PricingCategory` as "Committed", and the commitment discount's id populating both the `ResourceId` and `CommitmentDiscountId` value. Upfront purchases appear as a single record also with `ChargeCategory` as "Purchase", `ChargeFrequency` as "One-Time", and the total quantity and units for commitment discount's term as `CommitmentDiscountQuantity` and `CommitmentDiscountUnit`, respectively. +All *commitment discount* purchases appear with a positive [BilledCost](#billedcost), [PricingCategory](#pricingcategory) as "Standard", and with the *commitment discount's* id populating both the [ResourceId](#resourceid) and [CommitmentDiscountId](#commitmentdiscountid) value. One-time purchases appear as a single record with [ChargeCategory](#chargecategory) as "Purchase", [ChargeFrequency](#chargefrequency) as "One-Time", and the total quantity and units for *commitment discount's* *term* reflected as [CommitmentDiscountQuantity](#commitmentdiscountquantity) and CommitmentDiscountUnit, respectively. -Recurring purchases are allocated across all corresponding charge periods of the term when `ChargeCategory` is "Purchase", `ChargeFrequency` is "Recurring", and `CommitmentDiscountQuantity` and `CommitmentDiscountUnit` are reflected only for that charge period. +Recurring purchases are allocated across all corresponding *charge periods* of the *term* when ChargeCategory is "Purchase", ChargeFrequency is "Recurring", and CommitmentDiscountQuantity and CommitmentDiscountUnit are reflected only for that *charge period*. -Using the same commitment discount example as above, a one-year, spend-based commitment discount with a $1.00 hourly commitment purchased on Jan 1, 2023, various purchase options can occur: +Using the same *commitment discount* example as above with a one-year, spend-based *commitment discount* with a $1.00 hourly commit purchased on Jan 1, 2023, various purchase options are available: -#### Scenario #1: Upfront +#### Scenario #1: All Upfront -The entire commitment is billed _once_ during the first charge period of the term for $8,670 (derived as `24 hours * 365 days * $1.00`). +The entire *commitment discount* is billed _once_ during the first *charge period* of the *term* for $8,670 (derived as `24 hours * 365 days * $1.00`). ```json [ @@ -50,7 +50,7 @@ The entire commitment is billed _once_ during the first charge period of the ter "ChargePeriodEndDate": "2024-01-01T00:00:00Z", "ChargeCategory": "Purchase", "ChargeFrequency": "One-Time", - "PricingCategory": "Committed", + "PricingCategory": "Standard", "ResourceId": "", "BilledCost": 8760.00, "EffectiveCost": 0.00, @@ -61,9 +61,9 @@ The entire commitment is billed _once_ during the first charge period of the ter ] ``` -#### Scenario #2: Recurring +#### Scenario #2: No Upfront -The commitment is billed across all 8,760 charge periods of the term with $1.00 allocated to each charge period over the term. +The *commitment discount* is billed across all 8,760 (`24 hours * 365 days`) *charge periods* of the *term* with $1.00 allocated to each *charge period* over the *term*. ```json [ @@ -74,7 +74,7 @@ The commitment is billed across all 8,760 charge periods of the term with $1.00 "ChargePeriodEndDate": "2023-01-01T01:00:00Z", "ChargeCategory": "Purchase", "ChargeFrequency": "Recurring", - "PricingCategory": "Committed", + "PricingCategory": "Standard", "ResourceId": "", "BilledCost": 1.00, "EffectiveCost": 0.00, @@ -83,13 +83,13 @@ The commitment is billed across all 8,760 charge periods of the term with $1.00 "CommitmentDiscountUnit": "USD" }, - /* ... 743 more recurring purchase records for the billing period ... */ + /* ... 8,759 more recurring purchase records for the *term* ... */ ] ``` -#### Scenario #3: Hybrid +#### Scenario #3: Partial Upfront -With a 50/50 split, half of the commitment is billed _once_ during the first charge period of the term for $4,380 (derived as `24 hours * 182.5 days * $1.00`), and the other half is billed across each charge period over the term, derived as (`$1.00 * 8,760 hours * 0.5`). Amortized costs incur half of the amount (i.e. $0.50) from the upfront purchase and the other half from the recurring purchase. +With a 50/50 split, half of the commitment is billed _once_ during the first *charge period* of the *term* for $4,380 (derived as `24 hours * 182.5 days * $1.00`), and the other half is billed across each *charge period* over the term, derived as (`$1.00 * 8,760 hours * 0.5`). Amortized costs incur half of the amount (i.e. $0.50) from the one-time purchase and the other half from the recurring purchase. ```json [ @@ -100,7 +100,7 @@ With a 50/50 split, half of the commitment is billed _once_ during the first cha "ChargePeriodEndDate": "2024-01-01T00:00:00Z", "ChargeCategory": "Purchase", "ChargeFrequency": "One-Time", - "PricingCategory": "Committed", + "PricingCategory": "Standard", "ResourceId": "", "BilledCost": 4380.00, "EffectiveCost": 0.00, @@ -115,7 +115,7 @@ With a 50/50 split, half of the commitment is billed _once_ during the first cha "ChargePeriodEndDate": "2023-01-01T01:00:00Z", "ChargeCategory": "Purchase", "ChargeFrequency": "Recurring", - "PricingCategory": "Committed", + "PricingCategory": "Standard", "ResourceId": "", "BilledCost": 0.50, "EffectiveCost": 0.00, @@ -124,22 +124,22 @@ With a 50/50 split, half of the commitment is billed _once_ during the first cha "CommitmentDiscountUnit": "USD" }, - /* ... 743 more recurring purchase records for the billing period ... */ + /* ... 8,759 more recurring purchase records for the *term* ... */ ] ``` -### Usage Rows +### Usage *Rows* -Amortization of commitment discounts occur the same way regardless of how one or more purchases are made. The same usage-based or spend-based amount is applied evenly across all charge periods and potentially allocated to eligible resources. Continuing with the same commitment discount example, a one-year, spend-based commitment discount with a $1.00 hourly commitment, and 1 resource, 4 types of scenarios can occur during a charge period: +*Amortization* of *commitment discounts* occur similarly regardless of how *commitment discount* purchases are made. The same usage-based or spend-based amount is applied evenly across all *charge periods* and potentially allocated to eligible *resources*. Continuing with the same *commitment discount* example, a one-year, spend-based *commitment discount* with a $1.00 hourly commit and 1 *resource* (for simplicity) yields 4 types of scenarios that can occur during a *charge period*: -* Scenario #1: Eligible resource(s) runs for $1.00 (100% utilization) -* Scenario #2: No eligible resources run (0% utilization) -* Scenario #3: Eligible resource(s) runs for $0.75 (75% utilization) -* Scenario #4: Eligible resource(s) runs for over the $1.00 hourly commitment (100% utilization + overage) +* Scenario #1: An eligible *resource* fully consumes the allocated amount (100% utilization) +* Scenario #2: No eligible *resource* consumes the allocated amount (0% utilization) +* Scenario #3: An eligible *resource* partially consumes the allocated amount (75% utilization) +* Scenario #4: An eligible *resource* fully consumes the $1.00 hourly commit with an overage (100% utilization + overage) -#### Scenario #1: Eligible resource(s) runs for $1.00 (100% utilization) +#### Scenario #1: An eligible *resource* fully consumes the allocated amount (100% utilization) -In this scenario, one eligible resource runs for the full hour, so one row allocated to the resource is produced. +In this scenario, one eligible *resource* runs for the full hour and consumes $1.00, so one *row* allocated to the *resource* is produced. ```json [ @@ -164,9 +164,9 @@ In this scenario, one eligible resource runs for the full hour, so one row alloc ] ``` -#### Scenario #2: No eligible resources run (0% utilization) +#### Scenario #2: No eligible *resource* consumes the allocated amount (0% utilization) -In this scenario, the entire, eligible amount was unused, so one unused row, allocated to the commitment discount, was produced. Most notably, ConsumedQuantity and ConsumedUnit are null while CommitmentDiscountQuantity is not because $1 was still drawn down by the commitment discount even though it was not consumed by a resource. +In this situation, the full eligible, $1.00 amount remained unutilized and results in 1 unused *row*. In this scenario, it is important to note that while CommitmentDiscountQuantity is not because $1 was still drawn down by the *commitment discount* even though, no *resource* was allocated, so [ConsumedQuantity](#consumedquantity) and [ConsumedUnit](#consumedunit) are null. ```json [ @@ -191,9 +191,9 @@ In this scenario, the entire, eligible amount was unused, so one unused row, all ] ``` -#### Scenario #3: Eligible resource(s) runs for $0.75 (75% utilization) +#### Scenario #3: An eligible *resource* partially consumes the allocated amount (75% utilization) -In this scenario, one eligible resource runs for the full hour. One row shows $0.75 to a resource, and the other shows that $0.25 remained unused. +In this scenario, one eligible *resource* runs for the full hour and consumes $0.75 of the $1.00 allocation. One *row* shows $0.75 to a *resource*, and the other *row* shows that $0.25 was unused. ```json [ @@ -236,9 +236,9 @@ In this scenario, one eligible resource runs for the full hour. One row shows $0 ] ``` -#### Scenario #4: Eligible resource(s) runs for over the $1.00 hourly commitment (100% utilization + overage) +#### Scenario #4: An eligible *resource* fully consumes the $1.00 hourly commit with an overage (100% utilization + overage) -In this scenario, one eligible resource runs for the full hour and costs $1.50. One row shows that $1.00 was amortized from the commitment discount, and the other shows that $0.50 was charged as standard, on-demand spend. +In this scenario, one eligible *resource* runs for the full hour and is charged $1.50. One *row* shows that $1.00 was *amortized* from the *commitment discount*, and the other shows that $0.50 was charged as standard, on-demand spend. ```json [ From 74fe05d654aeff9ca28a34b8eff83263e0a11291 Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Wed, 30 Oct 2024 12:46:27 -0400 Subject: [PATCH 19/20] Bug fix: '{Billing,Charge}Period{Start,End}Date' should be '{Billing,Charge}Period{Start,End}' --- .../commitment_discounts.md | 82 +++++++++---------- .../commitment_flexibility.md | 56 ++++++------- 2 files changed, 69 insertions(+), 69 deletions(-) diff --git a/specification/appendix/commitment_discounts/commitment_discounts.md b/specification/appendix/commitment_discounts/commitment_discounts.md index 243502a74..c37b82097 100644 --- a/specification/appendix/commitment_discounts/commitment_discounts.md +++ b/specification/appendix/commitment_discounts/commitment_discounts.md @@ -43,11 +43,11 @@ The entire *commitment discount* is billed _once_ during the first *charge perio ```json [ - { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2024-01-01T00:00:00Z", + { + "BillingPeriodStart": "2023-01-01T00:00:00Z", + "BillingPeriodEnd": "2023-02-01T00:00:00Z", + "ChargePeriodStart": "2023-01-01T00:00:00Z", + "ChargePeriodEnd": "2024-01-01T00:00:00Z", "ChargeCategory": "Purchase", "ChargeFrequency": "One-Time", "PricingCategory": "Standard", @@ -68,10 +68,10 @@ The *commitment discount* is billed across all 8,760 (`24 hours * 365 days`) *ch ```json [ { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", + "BillingPeriodStart": "2023-01-01T00:00:00Z", + "BillingPeriodEnd": "2023-02-01T00:00:00Z", + "ChargePeriodStart": "2023-01-01T00:00:00Z", + "ChargePeriodEnd": "2023-01-01T01:00:00Z", "ChargeCategory": "Purchase", "ChargeFrequency": "Recurring", "PricingCategory": "Standard", @@ -94,10 +94,10 @@ With a 50/50 split, half of the commitment is billed _once_ during the first *ch ```json [ { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2024-01-01T00:00:00Z", + "BillingPeriodStart": "2023-01-01T00:00:00Z", + "BillingPeriodEnd": "2023-02-01T00:00:00Z", + "ChargePeriodStart": "2023-01-01T00:00:00Z", + "ChargePeriodEnd": "2024-01-01T00:00:00Z", "ChargeCategory": "Purchase", "ChargeFrequency": "One-Time", "PricingCategory": "Standard", @@ -109,10 +109,10 @@ With a 50/50 split, half of the commitment is billed _once_ during the first *ch "CommitmentDiscountUnit": "USD" }, { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", + "BillingPeriodStart": "2023-01-01T00:00:00Z", + "BillingPeriodEnd": "2023-02-01T00:00:00Z", + "ChargePeriodStart": "2023-01-01T00:00:00Z", + "ChargePeriodEnd": "2023-01-01T01:00:00Z", "ChargeCategory": "Purchase", "ChargeFrequency": "Recurring", "PricingCategory": "Standard", @@ -144,10 +144,10 @@ In this scenario, one eligible *resource* runs for the full hour and consumes &d ```json [ { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", + "BillingPeriodStart": "2023-01-01T00:00:00Z", + "BillingPeriodEnd": "2023-02-01T00:00:00Z", + "ChargePeriodStart": "2023-01-01T00:00:00Z", + "ChargePeriodEnd": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -171,10 +171,10 @@ In this situation, the full eligible, $1.00 amount remained unutilized an ```json [ { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", + "BillingPeriodStart": "2023-01-01T00:00:00Z", + "BillingPeriodEnd": "2023-02-01T00:00:00Z", + "ChargePeriodStart": "2023-01-01T00:00:00Z", + "ChargePeriodEnd": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -198,10 +198,10 @@ In this scenario, one eligible *resource* runs for the full hour and consumes &d ```json [ { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", + "BillingPeriodStart": "2023-01-01T00:00:00Z", + "BillingPeriodEnd": "2023-02-01T00:00:00Z", + "ChargePeriodStart": "2023-01-01T00:00:00Z", + "ChargePeriodEnd": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -216,10 +216,10 @@ In this scenario, one eligible *resource* runs for the full hour and consumes &d "CommitmentDiscountUnit": "USD" }, { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", + "BillingPeriodStart": "2023-01-01T00:00:00Z", + "BillingPeriodEnd": "2023-02-01T00:00:00Z", + "ChargePeriodStart": "2023-01-01T00:00:00Z", + "ChargePeriodEnd": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -243,10 +243,10 @@ In this scenario, one eligible *resource* runs for the full hour and is charged ```json [ { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", + "BillingPeriodStart": "2023-01-01T00:00:00Z", + "BillingPeriodEnd": "2023-02-01T00:00:00Z", + "ChargePeriodStart": "2023-01-01T00:00:00Z", + "ChargePeriodEnd": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -261,10 +261,10 @@ In this scenario, one eligible *resource* runs for the full hour and is charged "CommitmentDiscountUnit": "USD" }, { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", + "BillingPeriodStart": "2023-01-01T00:00:00Z", + "BillingPeriodEnd": "2023-02-01T00:00:00Z", + "ChargePeriodStart": "2023-01-01T00:00:00Z", + "ChargePeriodEnd": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Standard", diff --git a/specification/appendix/commitment_discounts/commitment_flexibility.md b/specification/appendix/commitment_discounts/commitment_flexibility.md index ea91e0517..3015fa7a4 100644 --- a/specification/appendix/commitment_discounts/commitment_flexibility.md +++ b/specification/appendix/commitment_discounts/commitment_flexibility.md @@ -29,10 +29,10 @@ The commitment discount covers the first charge period for 1 VM_Large resource ( ```json [ { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", + "BillingPeriodStart": "2023-01-01T00:00:00Z", + "BillingPeriodEnd": "2023-02-01T00:00:00Z", + "ChargePeriodStart": "2023-01-01T00:00:00Z", + "ChargePeriodEnd": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -61,10 +61,10 @@ The VM_Large commitment discount is unused because no VM_Large resources are run ```json [ { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", + "BillingPeriodStart": "2023-01-01T00:00:00Z", + "BillingPeriodEnd": "2023-02-01T00:00:00Z", + "ChargePeriodStart": "2023-01-01T00:00:00Z", + "ChargePeriodEnd": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -81,10 +81,10 @@ The VM_Large commitment discount is unused because no VM_Large resources are run "CommitmentDiscountUnit": "Hour" }, { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", + "BillingPeriodStart": "2023-01-01T00:00:00Z", + "BillingPeriodEnd": "2023-02-01T00:00:00Z", + "ChargePeriodStart": "2023-01-01T00:00:00Z", + "ChargePeriodEnd": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Standard", @@ -111,10 +111,10 @@ Usage: 2 VM_Medium resources run from 2023-01-01T00:00:00 to 2023-01-01T01:00:00 ```json [ { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", + "BillingPeriodStart": "2023-01-01T00:00:00Z", + "BillingPeriodEnd": "2023-02-01T00:00:00Z", + "ChargePeriodStart": "2023-01-01T00:00:00Z", + "ChargePeriodEnd": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -131,10 +131,10 @@ Usage: 2 VM_Medium resources run from 2023-01-01T00:00:00 to 2023-01-01T01:00:00 "CommitmentDiscountUnit": "Normalized Hour" }, { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", + "BillingPeriodStart": "2023-01-01T00:00:00Z", + "BillingPeriodEnd": "2023-02-01T00:00:00Z", + "ChargePeriodStart": "2023-01-01T00:00:00Z", + "ChargePeriodEnd": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -163,10 +163,10 @@ The VM_Small commitment discount was fully utilized but still only covered 25% o ```json [ { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", + "BillingPeriodStart": "2023-01-01T00:00:00Z", + "BillingPeriodEnd": "2023-02-01T00:00:00Z", + "ChargePeriodStart": "2023-01-01T00:00:00Z", + "ChargePeriodEnd": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Committed", @@ -183,10 +183,10 @@ The VM_Small commitment discount was fully utilized but still only covered 25% o "CommitmentDiscountUnit": "Normalized Hour" }, { - "BillingPeriodStartDate": "2023-01-01T00:00:00Z", - "BillingPeriodEndDate": "2023-02-01T00:00:00Z", - "ChargePeriodStartDate": "2023-01-01T00:00:00Z", - "ChargePeriodEndDate": "2023-01-01T01:00:00Z", + "BillingPeriodStart": "2023-01-01T00:00:00Z", + "BillingPeriodEnd": "2023-02-01T00:00:00Z", + "ChargePeriodStart": "2023-01-01T00:00:00Z", + "ChargePeriodEnd": "2023-01-01T01:00:00Z", "ChargeCategory": "Usage", "ChargeFrequency": "Usage-Based", "PricingCategory": "Standard", From bf482363f04883c89e5e70f6bfc2cc94c0b6c359 Mon Sep 17 00:00:00 2001 From: Christopher Harris Date: Tue, 4 Feb 2025 08:26:44 -0500 Subject: [PATCH 20/20] Update commitment_flexibility.md --- .../commitment_flexibility.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/specification/appendix/commitment_discounts/commitment_flexibility.md b/specification/appendix/commitment_discounts/commitment_flexibility.md index 3015fa7a4..7b6fa0dba 100644 --- a/specification/appendix/commitment_discounts/commitment_flexibility.md +++ b/specification/appendix/commitment_discounts/commitment_flexibility.md @@ -8,12 +8,12 @@ Since providers have different rules for when commitment flexibility is or is no ## SKUs & Rates -| ProviderName | Service | SkuId | ListUnitPrice | x_CommittedUnitPrice | x_NormalizationFactor | -| ------------ | ------- | --------- | -------------- | ---------------------| --------------------- | -| TinyCloud | Compute | VM_Small | $0.50 | $0.25 | 1 | -| TinyCloud | Compute | VM_Medium | $1.00 | $0.50 | 2 | -| TinyCloud | Compute | VM_Large | $2.00 | $1.00 | 4 | -| TinyCloud | Compute | VM_XLarge | $4.00 | $2.00 | 8 | +| ProviderName | Service | SkuId | ListUnitPrice | x_CommitmentDiscountUnitPrice | x_NormalizationFactor | +| ------------ | ------- | --------- | -------------- | ------------------------------| --------------------- | +| TinyCloud | Compute | VM_Small | $0.50 | $0.25 | 1 | +| TinyCloud | Compute | VM_Medium | $1.00 | $0.50 | 2 | +| TinyCloud | Compute | VM_Large | $2.00 | $1.00 | 4 | +| TinyCloud | Compute | VM_XLarge | $4.00 | $2.00 | 8 | The above, fictitious SKU pricing attributes show that this provider, *TinyCloud*, only has 1 service that offers 4 virtual machine SKUs with various list rates, committed rates, and normalization factors. Each SKU's normalization factor classifies its relative size to its committed rate. Usage-based commitment discounts with commitment flexibility can fully cover any combination of 1 or more SKUs where the sum of their normalization factor equals the normalization factor of the commitment discount. @@ -91,7 +91,7 @@ The VM_Large commitment discount is unused because no VM_Large resources are run "ResourceId": "", "PricingQuantity": 1.00, "BilledCost": 1.00, - "EffectiveCost": 0.00, + "EffectiveCost": 1.00, "ConsumedQuantity": 1.00, "ConsumedUnit": "Hour", "SkuId": "VM_Medium" @@ -193,7 +193,7 @@ The VM_Small commitment discount was fully utilized but still only covered 25% o "ResourceId": "", "PricingQuantity": 0.75, "BilledCost": 1.50, - "EffectiveCost": 0.00, + "EffectiveCost": 1.50, "ConsumedQuantity": 1.00, "ConsumedUnit": "Hour", "SkuId": "VM_Large"