From 27c62b426cff25b62e9ae23fb7f77aeb1c11794c Mon Sep 17 00:00:00 2001 From: Reshma Bidikar Date: Thu, 29 Jan 2026 13:31:45 +0530 Subject: [PATCH 1/8] Aviate-catalog doc --- userguide/aviate/aviate-pricing-hub.adoc | 6 +- .../aviate/includes/aviate-catalog-guide.adoc | 58 +++++++++++++++++++ 2 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 userguide/aviate/includes/aviate-catalog-guide.adoc diff --git a/userguide/aviate/aviate-pricing-hub.adoc b/userguide/aviate/aviate-pricing-hub.adoc index ef2ef1b95..09881a423 100644 --- a/userguide/aviate/aviate-pricing-hub.adoc +++ b/userguide/aviate/aviate-pricing-hub.adoc @@ -1,9 +1,9 @@ -= Aviate Pricing Hub += Aviate Catalog Guide == Introduction -The Aviate Pricing Hub allows creating individual catalog entries such as plans, products, and pricelists. Thus, you can create such entries without the need to manage entire catalog versions. -The Pricing Hub UI internally uses the https://apidocs.killbill.io/aviate-catalog[Aviate Catalog APIs]. +The Aviate Catalog UI allows creating individual catalog entries such as plans, products, and pricelists. Thus, you can create such entries without the need to manage entire catalog versions. +The Aviate Catalog UI internally uses the https://apidocs.killbill.io/aviate-catalog[Aviate Catalog APIs]. == Products diff --git a/userguide/aviate/includes/aviate-catalog-guide.adoc b/userguide/aviate/includes/aviate-catalog-guide.adoc new file mode 100644 index 000000000..87c4d8abd --- /dev/null +++ b/userguide/aviate/includes/aviate-catalog-guide.adoc @@ -0,0 +1,58 @@ += Aviate Catalog Guide + +== Introduction + +The Aviate Catalog UI allows creating individual catalog entries such as plans, products, and pricelists. Thus, you can create such entries without the need to manage entire catalog versions. +The Aviate Catalog UI internally uses the https://apidocs.killbill.io/aviate-catalog[Aviate Catalog APIs]. + +== Products + +The Products screen provides information about the available products. It can be used to create products/plans/pricelists. It can also be used to edit existing plans/products and retire plans/products. + +=== Create Product,Plan, Pricelist + +The Create Product, Plan, Pricelist screen can be used to create a product, plan, and pricelist. + +You can refer to https://killbill.storylane.io/share/elbar7il3dvs[this demo]. + +The above demo creates a new product called `netflix` with a `netflix-basic-monthly` plan that is priced at `$10` per month. + +This UI internally uses the https://apidocs.killbill.io/aviate-catalog#create-plan-product-pricelist[Create Plan, Product, Pricelist API]. + +=== Add New Plan + +Once a product is created, you can add new plans at any time. + +You can refer to https://killbill.storylane.io/share/h0mwfwocymqr[this demo] + +The above demo creates a new plan called `netflix-premium-monthly` corresponding to the `netflix` product. It has a `DISCOUNT` and `EVERGREEN` phase. + +The UI internally uses the https://apidocs.killbill.io/aviate-catalog#create-plan[Create Plan API]. + +=== Edit Plan + +The Aviate Catalog UI allows modifying plan prices after a plan is created. Note that only plan prices can be modified, other plan attributes like duration of the phases, etc. are not allowed to be changed. + +You can refer to https://killbill.storylane.io/share/4unxvpnzucbe[this demo]. + +The above demo modifies the prices of the `netflix-basic-monthly` plan. + +The UI internally uses the https://apidocs.killbill.io/aviate-catalog#modify-plan[Modify Plan API]. + +=== Retire Plan + +The Aviate Catalog UI allows retiring a plan. When a plan is retired, it is no longer possible to create new subscriptions corresponding to the plan. + +//TODO - Add the demo once the UI bug is fixed +// You can refer to [this demo]. + +The UI internally uses the https://apidocs.killbill.io/aviate-catalog#retire-plan[Retire Plan API]. + +=== Creating Usage Plans + +The Aviate Catalog UI also allows creating usage plans. So you can define a billing meter (which encapsulates how usages are aggregated), define blocks/tiers in the usage plan, and add usage based prices corresponding to these blocks. + +You can refer to https://killbill.storylane.io/share/wst70zfovkue[this demo]. + + +image::../assets/img/aviate/pricing-hub-guide/usage-pricing.png[] From 61a330c09625dd69fab85de5c2b527e93d776a6d Mon Sep 17 00:00:00 2001 From: Reshma Bidikar Date: Thu, 29 Jan 2026 15:11:31 +0530 Subject: [PATCH 2/8] added left nav and moved the document to the right directory --- html5/_main_toc.html.slim | 4 ++-- userguide/aviate/{includes => }/aviate-catalog-guide.adoc | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename userguide/aviate/{includes => }/aviate-catalog-guide.adoc (100%) diff --git a/html5/_main_toc.html.slim b/html5/_main_toc.html.slim index a8e61533c..52896d092 100644 --- a/html5/_main_toc.html.slim +++ b/html5/_main_toc.html.slim @@ -354,8 +354,8 @@ nav.sidebar-nav a.nav-link href="/latest/aviate-changelog.html" | Aviate Changelog li.bd-sidenav-active - a.nav-link href="/latest/aviate-pricing-hub.html" - | Aviate Pricing Hub Guide + a.nav-link href="/latest/aviate-catalog-guide.html" + | Aviate Catalog Guide li.bd-sidenav-active a.nav-link href="/latest/how-to-install-the-aviate-plugin.html" | Plugin Installation diff --git a/userguide/aviate/includes/aviate-catalog-guide.adoc b/userguide/aviate/aviate-catalog-guide.adoc similarity index 100% rename from userguide/aviate/includes/aviate-catalog-guide.adoc rename to userguide/aviate/aviate-catalog-guide.adoc From f4cca8675a9d38840233d9e006c15923dcccf19a Mon Sep 17 00:00:00 2001 From: Reshma Bidikar Date: Thu, 29 Jan 2026 15:21:15 +0530 Subject: [PATCH 3/8] embed demos, other minor corrections --- userguide/aviate/aviate-catalog-guide.adoc | 49 +++++++++++++++++++--- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/userguide/aviate/aviate-catalog-guide.adoc b/userguide/aviate/aviate-catalog-guide.adoc index 87c4d8abd..d40badb4b 100644 --- a/userguide/aviate/aviate-catalog-guide.adoc +++ b/userguide/aviate/aviate-catalog-guide.adoc @@ -2,7 +2,7 @@ == Introduction -The Aviate Catalog UI allows creating individual catalog entries such as plans, products, and pricelists. Thus, you can create such entries without the need to manage entire catalog versions. +The http://aviate.killbill.io[Aviate Catalog UI] allows creating individual catalog entries such as plans, products, and pricelists. Thus, you can create such entries without the need to manage entire catalog versions. The Aviate Catalog UI internally uses the https://apidocs.killbill.io/aviate-catalog[Aviate Catalog APIs]. == Products @@ -13,7 +13,16 @@ The Products screen provides information about the available products. It can be The Create Product, Plan, Pricelist screen can be used to create a product, plan, and pricelist. -You can refer to https://killbill.storylane.io/share/elbar7il3dvs[this demo]. +You can refer to the following demo: + +++++ +
+ +
+ +
+
+++++ The above demo creates a new product called `netflix` with a `netflix-basic-monthly` plan that is priced at `$10` per month. @@ -23,7 +32,16 @@ This UI internally uses the https://apidocs.killbill.io/aviate-catalog#create-pl Once a product is created, you can add new plans at any time. -You can refer to https://killbill.storylane.io/share/h0mwfwocymqr[this demo] +You can refer to the following demo: + +++++ +
+ +
+ +
+
+++++ The above demo creates a new plan called `netflix-premium-monthly` corresponding to the `netflix` product. It has a `DISCOUNT` and `EVERGREEN` phase. @@ -33,7 +51,16 @@ The UI internally uses the https://apidocs.killbill.io/aviate-catalog#create-pla The Aviate Catalog UI allows modifying plan prices after a plan is created. Note that only plan prices can be modified, other plan attributes like duration of the phases, etc. are not allowed to be changed. -You can refer to https://killbill.storylane.io/share/4unxvpnzucbe[this demo]. +You can refer to the following demo: + +++++ +
+ +
+ +
+
+++++ The above demo modifies the prices of the `netflix-basic-monthly` plan. @@ -52,7 +79,17 @@ The UI internally uses the https://apidocs.killbill.io/aviate-catalog#retire-pla The Aviate Catalog UI also allows creating usage plans. So you can define a billing meter (which encapsulates how usages are aggregated), define blocks/tiers in the usage plan, and add usage based prices corresponding to these blocks. -You can refer to https://killbill.storylane.io/share/wst70zfovkue[this demo]. +You can refer to the following demo: + +++++ +
+ +
+ +
+
+++++ +//TODO Delete Plan/Product -image::../assets/img/aviate/pricing-hub-guide/usage-pricing.png[] +//TODO Duplicate Plan/Product From be0ce1117716caf8a6cd1b67eaaa3b5f8c18f379 Mon Sep 17 00:00:00 2001 From: Reshma Bidikar Date: Tue, 3 Feb 2026 18:12:42 +0530 Subject: [PATCH 4/8] additional sections --- userguide/aviate/aviate-catalog-guide.adoc | 30 +++++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/userguide/aviate/aviate-catalog-guide.adoc b/userguide/aviate/aviate-catalog-guide.adoc index d40badb4b..6e4d90672 100644 --- a/userguide/aviate/aviate-catalog-guide.adoc +++ b/userguide/aviate/aviate-catalog-guide.adoc @@ -66,15 +66,37 @@ The above demo modifies the prices of the `netflix-basic-monthly` plan. The UI internally uses the https://apidocs.killbill.io/aviate-catalog#modify-plan[Modify Plan API]. -=== Retire Plan +=== Archive Plan -The Aviate Catalog UI allows retiring a plan. When a plan is retired, it is no longer possible to create new subscriptions corresponding to the plan. +The Aviate Catalog UI allows archiving a plan. When a plan is archived, it is no longer possible to create new subscriptions corresponding to the plan. Existing subscriptions continue to work. -//TODO - Add the demo once the UI bug is fixed -// You can refer to [this demo]. +You can refer to the following demo: + +++++ +
+ +
+ +
+
+++++ + +The above demo archives the `Netflix Usage Monthly` plan. The UI internally uses the https://apidocs.killbill.io/aviate-catalog#retire-plan[Retire Plan API]. +=== Delete Plan + +The Aviate Catalog UI allows deleting a plan permanently. Note that deleting a plan hard deletes it from the database and will affect existing subscriptions. This operation should only typically be performed on plans created erroneously to which there are no subscriptions. + +//You can refer to the following demo: + +//The above demo deletes the `temp` plan. + +The UI internally uses the https://apidocs.killbill.io/aviate-catalog#delete-plan[Delete Plan API]. + + + === Creating Usage Plans The Aviate Catalog UI also allows creating usage plans. So you can define a billing meter (which encapsulates how usages are aggregated), define blocks/tiers in the usage plan, and add usage based prices corresponding to these blocks. From 9b1f2756b26dbc34ebcf5ad3a3dce10c24b6c0b6 Mon Sep 17 00:00:00 2001 From: Reshma Bidikar Date: Tue, 3 Feb 2026 18:25:35 +0530 Subject: [PATCH 5/8] minor re-structuring --- userguide/aviate/aviate-catalog-guide.adoc | 34 ++++++++++++++-------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/userguide/aviate/aviate-catalog-guide.adoc b/userguide/aviate/aviate-catalog-guide.adoc index 6e4d90672..15e674e81 100644 --- a/userguide/aviate/aviate-catalog-guide.adoc +++ b/userguide/aviate/aviate-catalog-guide.adoc @@ -2,14 +2,11 @@ == Introduction -The http://aviate.killbill.io[Aviate Catalog UI] allows creating individual catalog entries such as plans, products, and pricelists. Thus, you can create such entries without the need to manage entire catalog versions. -The Aviate Catalog UI internally uses the https://apidocs.killbill.io/aviate-catalog[Aviate Catalog APIs]. +The http://aviate.killbill.io[Aviate Catalog UI] allows you to create individual catalog entries such as products, plans, and pricelists. +This means you don’t need to manage entire catalog versions. +Internally, the UI uses the https://apidocs.killbill.io/aviate-catalog[Aviate Catalog APIs]. -== Products - -The Products screen provides information about the available products. It can be used to create products/plans/pricelists. It can also be used to edit existing plans/products and retire plans/products. - -=== Create Product,Plan, Pricelist +== Create Product,Plan, Pricelist The Create Product, Plan, Pricelist screen can be used to create a product, plan, and pricelist. @@ -28,7 +25,7 @@ The above demo creates a new product called `netflix` with a `netflix-basic-mont This UI internally uses the https://apidocs.killbill.io/aviate-catalog#create-plan-product-pricelist[Create Plan, Product, Pricelist API]. -=== Add New Plan +== Add New Plan Once a product is created, you can add new plans at any time. @@ -47,7 +44,7 @@ The above demo creates a new plan called `netflix-premium-monthly` corresponding The UI internally uses the https://apidocs.killbill.io/aviate-catalog#create-plan[Create Plan API]. -=== Edit Plan +== Edit Plan The Aviate Catalog UI allows modifying plan prices after a plan is created. Note that only plan prices can be modified, other plan attributes like duration of the phases, etc. are not allowed to be changed. @@ -66,7 +63,7 @@ The above demo modifies the prices of the `netflix-basic-monthly` plan. The UI internally uses the https://apidocs.killbill.io/aviate-catalog#modify-plan[Modify Plan API]. -=== Archive Plan +== Archive Plan The Aviate Catalog UI allows archiving a plan. When a plan is archived, it is no longer possible to create new subscriptions corresponding to the plan. Existing subscriptions continue to work. @@ -85,7 +82,7 @@ The above demo archives the `Netflix Usage Monthly` plan. The UI internally uses the https://apidocs.killbill.io/aviate-catalog#retire-plan[Retire Plan API]. -=== Delete Plan +== Delete Plan The Aviate Catalog UI allows deleting a plan permanently. Note that deleting a plan hard deletes it from the database and will affect existing subscriptions. This operation should only typically be performed on plans created erroneously to which there are no subscriptions. @@ -97,7 +94,7 @@ The UI internally uses the https://apidocs.killbill.io/aviate-catalog#delete-pla -=== Creating Usage Plans +== Creating Usage Plans The Aviate Catalog UI also allows creating usage plans. So you can define a billing meter (which encapsulates how usages are aggregated), define blocks/tiers in the usage plan, and add usage based prices corresponding to these blocks. @@ -115,3 +112,16 @@ You can refer to the following demo: //TODO Delete Plan/Product //TODO Duplicate Plan/Product + +== Conclusion + +You now know how to: + +* Create products, plans, and pricelists +* Add new plans +* Edit plan prices +* Archive or delete plans +* Build usage-based plans + + + From a5cb119ef3d7d44270afdb8d17a6998a2052b537 Mon Sep 17 00:00:00 2001 From: Reshma Bidikar Date: Wed, 4 Feb 2026 11:46:08 +0530 Subject: [PATCH 6/8] Additional demos/doc enhancements --- userguide/aviate/aviate-catalog-guide.adoc | 102 +++++++++++++++------ 1 file changed, 76 insertions(+), 26 deletions(-) diff --git a/userguide/aviate/aviate-catalog-guide.adoc b/userguide/aviate/aviate-catalog-guide.adoc index 15e674e81..2c09374b9 100644 --- a/userguide/aviate/aviate-catalog-guide.adoc +++ b/userguide/aviate/aviate-catalog-guide.adoc @@ -8,9 +8,16 @@ Internally, the UI uses the https://apidocs.killbill.io/aviate-catalog[Aviate Ca == Create Product,Plan, Pricelist -The Create Product, Plan, Pricelist screen can be used to create a product, plan, and pricelist. +To create a product, plan, and pricelist: -You can refer to the following demo: +. Open the *Create Product, Plan, Pricelist* screen. +. Enter the product name (e.g., `netflix`). +. Define a plan (e.g., `netflix-basic-monthly`). +. Set the price (e.g., `$10` per month). +. Save your entries. + + +Demo: ++++
@@ -21,15 +28,19 @@ You can refer to the following demo:
++++ -The above demo creates a new product called `netflix` with a `netflix-basic-monthly` plan that is priced at `$10` per month. - -This UI internally uses the https://apidocs.killbill.io/aviate-catalog#create-plan-product-pricelist[Create Plan, Product, Pricelist API]. +API Used: https://apidocs.killbill.io/aviate-catalog#create-plan-product-pricelist[Create Plan, Product, Pricelist API]. == Add New Plan -Once a product is created, you can add new plans at any time. +Once a product exists, you can add additional plans: + +. Select the product (e.g., `netflix`). +. Create a new plan (e.g., `netflix-premium-monthly`). +. Configure phases such as `DISCOUNT` or `EVERGREEN`. +. Save the plan. -You can refer to the following demo: + +Demo: ++++
@@ -40,15 +51,19 @@ You can refer to the following demo:
++++ -The above demo creates a new plan called `netflix-premium-monthly` corresponding to the `netflix` product. It has a `DISCOUNT` and `EVERGREEN` phase. - -The UI internally uses the https://apidocs.killbill.io/aviate-catalog#create-plan[Create Plan API]. +API used: https://apidocs.killbill.io/aviate-catalog#create-plan[Create Plan API]. == Edit Plan -The Aviate Catalog UI allows modifying plan prices after a plan is created. Note that only plan prices can be modified, other plan attributes like duration of the phases, etc. are not allowed to be changed. +You can update *plan prices* after creation. +Other attributes (like phase duration) cannot be changed. + +. Select the plan (e.g., `netflix-basic-monthly`). +. Adjust the price. +. Save changes. -You can refer to the following demo: + +Demo: ++++
@@ -59,15 +74,19 @@ You can refer to the following demo:
++++ -The above demo modifies the prices of the `netflix-basic-monthly` plan. - -The UI internally uses the https://apidocs.killbill.io/aviate-catalog#modify-plan[Modify Plan API]. +API used: https://apidocs.killbill.io/aviate-catalog#modify-plan[Modify Plan API]. == Archive Plan -The Aviate Catalog UI allows archiving a plan. When a plan is archived, it is no longer possible to create new subscriptions corresponding to the plan. Existing subscriptions continue to work. +You can archive an existing plan. Archiving prevents creating new subscriptions corresponding to the plan. +Existing subscriptions remain active. + +. Select the plan (e.g., `Netflix Usage Monthly`). +. Choose *Archive*. +. Confirm the action. + -You can refer to the following demo: +Demo: ++++
@@ -78,27 +97,55 @@ You can refer to the following demo:
++++ -The above demo archives the `Netflix Usage Monthly` plan. - -The UI internally uses the https://apidocs.killbill.io/aviate-catalog#retire-plan[Retire Plan API]. +API used: https://apidocs.killbill.io/aviate-catalog#retire-plan[Retire Plan API]. == Delete Plan -The Aviate Catalog UI allows deleting a plan permanently. Note that deleting a plan hard deletes it from the database and will affect existing subscriptions. This operation should only typically be performed on plans created erroneously to which there are no subscriptions. +You can delete an existing plan permanently. Deleting permanently removes a plan from the database. +Use this only for plans created erroneously that do not have active subscriptions. + +. Select the plan. +. Choose *Delete*. +. Confirm deletion. + -//You can refer to the following demo: +//Demo: -//The above demo deletes the `temp` plan. +API used: https://apidocs.killbill.io/aviate-catalog#delete-plan[Delete Plan API]. -The UI internally uses the https://apidocs.killbill.io/aviate-catalog#delete-plan[Delete Plan API]. +== Duplicate Plan + +You can create a new plan based on an existing plan. + +. Select the plan +. Choose *Duplicate* +. Make changes to the plan as desired +. Save the new plan. + +Demo: + +++++ +
+ +
+ +
+
+++++ == Creating Usage Plans -The Aviate Catalog UI also allows creating usage plans. So you can define a billing meter (which encapsulates how usages are aggregated), define blocks/tiers in the usage plan, and add usage based prices corresponding to these blocks. +Usage plans allow billing based on consumption: -You can refer to the following demo: +. Define a *billing meter* (how usage is tracked). +. Configure *blocks/tiers*. +. Assign usage-based prices to each block. +. Save the plan. + + +Demo: ++++
@@ -109,6 +156,8 @@ You can refer to the following demo:
++++ +API used: https://apidocs.killbill.io/aviate-catalog#create-plan[Create Plan API]. + //TODO Delete Plan/Product //TODO Duplicate Plan/Product @@ -121,6 +170,7 @@ You now know how to: * Add new plans * Edit plan prices * Archive or delete plans +* Duplicate plans * Build usage-based plans From 3924ad2b68c5f343d7fd84af6c88a696b48e0d1a Mon Sep 17 00:00:00 2001 From: Reshma Bidikar Date: Fri, 6 Feb 2026 18:40:56 +0530 Subject: [PATCH 7/8] Getting Started - First Draft --- html5/_main_toc.html.slim | 3 + .../img/aviate/cloudsprout-plans-products.png | Bin 0 -> 61005 bytes userguide/aviate/aviate_getting_started.adoc | 249 ++++++++++++++++++ 3 files changed, 252 insertions(+) create mode 100644 userguide/assets/img/aviate/cloudsprout-plans-products.png create mode 100644 userguide/aviate/aviate_getting_started.adoc diff --git a/html5/_main_toc.html.slim b/html5/_main_toc.html.slim index 52896d092..6b17cc830 100644 --- a/html5/_main_toc.html.slim +++ b/html5/_main_toc.html.slim @@ -353,6 +353,9 @@ nav.sidebar-nav li.bd-sidenav-active a.nav-link href="/latest/aviate-changelog.html" | Aviate Changelog + li.bd-sidenav-active + a.nav-link href="/latest/aviate-getting-started.html" + | Getting Started With Aviate li.bd-sidenav-active a.nav-link href="/latest/aviate-catalog-guide.html" | Aviate Catalog Guide diff --git a/userguide/assets/img/aviate/cloudsprout-plans-products.png b/userguide/assets/img/aviate/cloudsprout-plans-products.png new file mode 100644 index 0000000000000000000000000000000000000000..82779a0ffe097f206d8d061fc37a64d23823537e GIT binary patch literal 61005 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 e3%T3m1O9AZ$Iw<Xx$RjeMnhPyP>#19Xc3 literal 0 HcmV?d00001 diff --git a/userguide/aviate/aviate_getting_started.adoc b/userguide/aviate/aviate_getting_started.adoc new file mode 100644 index 000000000..16a12361b --- /dev/null +++ b/userguide/aviate/aviate_getting_started.adoc @@ -0,0 +1,249 @@ += Getting Started with Aviate and Kaui + +== TL;DR + +In this guide, you will: + +* Use *Aviate* to configure your billing environment. +* Switch to *Kaui* to create your first customer and subscription. +* Generate and view an invoice. +* Understand the role of *Kill Bill*, *Aviate*, and *Kaui*. +* End up with a fully working fictive SaaS company set up for demos. + +The example company used throughout this guide is *CloudSprout*, a fictional SaaS business operating in the UK and France. + +--- + +== Concepts Overview + +Before starting, it helps to understand how the pieces fit together. + +* *Kill Bill* is the billing engine. It manages accounts, subscriptions, invoices, payments, and taxes. +* *Aviate* is the Enterprise control and management plane. You use it to configure catalogs, taxes, invoice templates, and tenant settings, as well as proactively monitor the health of the billing engine. +* *Kaui* is the billing operations UI. You use it for day-to-day actions such as creating customers, managing subscriptions, and reviewing invoices. + +In short: + +* Use *Aviate* to *set things up*. +* Use *Kaui* to *run billing operations*. + +--- + +== Step 1: Start in Aviate (Get Started) + +When you first log into Aviate, you land on the *Get Started* screen. + +This checklist guides you through the minimum required setup to bill customers. + +You should complete all steps in order. + +=== Configure company settings + +This step defines who you are as a business. + +For the purpose of this guide, use the following fictive company: + +* Company name: *CloudSprout* +* Business type: B2B SaaS +* Operating countries: + ** United Kingdom (GBP) + ** France (EUR) + +This information is later reused on invoices and customer communications. + +The following demo shows how you can configure the company settings via Aviate. +++++ +
+ +
+ +
+
+++++ + +--- + +=== Configure the catalog + +The catalog defines what you sell. + +For CloudSprout, create a simple catalog with: + +* A small number of subscription plans (for example Starter, Team, Business). +* Optional add-ons (for example Extra Storage). + +| Plan | GBP | EUR | Notes | +| ----------- | ----------- | ----------- | ----------------- | +| 🌱 Starter | £9 / month | €10 / month | Monthly only | +| 🌿 Team | £29 / month | €32 / month | Monthly or annual | +| 🌳 Business | £79 / month | €89 / month | Annual only | + +| Add-on | GBP | EUR | Billing | +| ---------------- | --- | --- | ------- | +| Extra Storage | £5 | €6 | Monthly | +| Priority Support | £15 | €18 | Monthly | + +The following demo shows how you can create the `CloudSprout Starter` plan via Aviate. +++++ +
+ +
+ +
+
+++++ + +You can similarly create the other plans/products defined above: + +image::https://github.com/killbill/killbill-docs/raw/v3/userguide/assets/img/aviate/cloudsprout-plans-products.png[align=center] + +This step only defines products and plans. No customers are created yet. + +--- + +=== Configure taxes + +Taxes are configured in Aviate and applied automatically by Kill Bill. + +For the demo setup: + +* Create a tax code for the UK (VAT) with a 20% rate. +* Create a tax code for France (VAT) with a 20% rate. +* Set a valid start date. + +Once saved, tax codes can be associated with products. + +The following demo explains how you can configure the above tax codes: + +++++ +
+ +
+ +
+
+++++ + +--- + +== Step 2: Switch to Kaui (Billing Operations) + +After completing the Aviate checklist, the next steps happen in Kaui. + +From Aviate, use the *Billing Operations (Kaui)* links to open Kaui in a new tab. + +The following demo illustrates how you can switch to Kaui: +++++ +
+ +
+ +
+
+++++ + +--- + +=== Create your first customer + +In Kaui: + +. Navigate to *Accounts*. +. Create a new account. +. Select the appropriate currency (EUR or GBP). +. Save the account. + +--- + +The following demo illustrates the account creation process in Kaui: + + +++++ +
+ +
+ +
+
+++++ + +At this point, you have a customer but no billing activity yet. + +=== Create a subscription + +Next, attach a subscription to the customer. + +. Open the customer account. +. Create a new subscription. +. Select one of the catalog plans you created in Aviate. +. Optionally add an add-on. +. Confirm the start date. + +Kill Bill immediately generates billing events based on the catalog rules. + +The following demo guides you through the subscription creation process in Kaui: + +++++ +
+ +
+ +
+
+++++ + +--- + +=== View the invoice + +Once the subscription is active: + +. Navigate to *Invoices* in Kaui. +. Open the newly generated invoice. +. Review: + +* Currency +* Line items +* Tax calculation +* Total amount + +This invoice uses the configuration, colors, and the logo defined earlier in Aviate. + +The following demo illustrates verifying the generated invoice: +++++ +
+ +
+ +
+
+++++ + +--- + +== What You Have Achieved + +By following this guide, you have: + +* Configured a complete billing environment using *Aviate*. +* Created a customer and subscription using *Kaui*. +* Generated a real invoice powered by *Kill Bill*. +* Understood the separation of concerns between: + ** *Kill Bill* (engine) + ** *Aviate* (configuration) + ** *Kaui* (operations) + +You now have a fully working fictive SaaS company ready for demos or experimentation. + +--- + +== Next Steps + +From here, you can: + +* Add more products or plans. +* Experiment with upgrades, downgrades, and add-ons. +* Explore payments and refunds. +* Integrate Kill Bill APIs into your own application. + +This same flow applies to production environments. Only the data changes. From 91fec4670b253d35c0fd23db23aa394c37a3b5e9 Mon Sep 17 00:00:00 2001 From: Reshma Bidikar Date: Mon, 9 Feb 2026 11:59:40 +0530 Subject: [PATCH 8/8] Changes as per review comments --- userguide/aviate/aviate-catalog-guide.adoc | 24 +++++++++++++------- userguide/aviate/aviate_getting_started.adoc | 20 ++++++++-------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/userguide/aviate/aviate-catalog-guide.adoc b/userguide/aviate/aviate-catalog-guide.adoc index 2c09374b9..ffbf8035f 100644 --- a/userguide/aviate/aviate-catalog-guide.adoc +++ b/userguide/aviate/aviate-catalog-guide.adoc @@ -2,8 +2,8 @@ == Introduction -The http://aviate.killbill.io[Aviate Catalog UI] allows you to create individual catalog entries such as products, plans, and pricelists. -This means you don’t need to manage entire catalog versions. +The https://aviate.killbill.io[Aviate Catalog UI] allows you to create individual catalog entries such as products, plans, and pricelists. +This provides much finer granularity than the Kill Bill open-source model, which requires creating a new catalog version for any change. As a result, this approach is more dynamic and scales significantly better when managing a large number of catalog entries. Internally, the UI uses the https://apidocs.killbill.io/aviate-catalog[Aviate Catalog APIs]. == Create Product,Plan, Pricelist @@ -53,10 +53,13 @@ Demo: API used: https://apidocs.killbill.io/aviate-catalog#create-plan[Create Plan API]. +[[edit_plan]] == Edit Plan -You can update *plan prices* after creation. -Other attributes (like phase duration) cannot be changed. +The edit plan feature allows you to update plan prices after a plan is created. Note that Other attributes (like *phase duration*) cannot be changed. + +[NOTE] +Editing a plan creates a new version of the plan. Existing subscriptions continue to use the old plan. See https://docs.killbill.io/latest/userguide_subscription#_catalog_versions[docs]. . Select the plan (e.g., `netflix-basic-monthly`). . Adjust the price. @@ -79,7 +82,7 @@ API used: https://apidocs.killbill.io/aviate-catalog#modify-plan[Modify Plan API == Archive Plan You can archive an existing plan. Archiving prevents creating new subscriptions corresponding to the plan. -Existing subscriptions remain active. +The plan remains active for existing subscriptions. . Select the plan (e.g., `Netflix Usage Monthly`). . Choose *Archive*. @@ -102,7 +105,8 @@ API used: https://apidocs.killbill.io/aviate-catalog#retire-plan[Retire Plan API == Delete Plan You can delete an existing plan permanently. Deleting permanently removes a plan from the database. -Use this only for plans created erroneously that do not have active subscriptions. + +WARNING: Deleting a plan could break the system if there are active subscriptions. Use this only for plans created erroneously that do not have active subscriptions. . Select the plan. . Choose *Delete*. @@ -117,6 +121,10 @@ API used: https://apidocs.killbill.io/aviate-catalog#delete-plan[Delete Plan API You can create a new plan based on an existing plan. +[NOTE] +The *Duplicate Plan* feature is a time-saving convenience that lets you quickly create a new plan. When duplicating, all plan attributes can be edited and on saving,a new plan is created. +By contrast, the <> feature is limited to updating prices only, and each change automatically generates a new version of the plan. + . Select the plan . Choose *Duplicate* . Make changes to the plan as desired @@ -137,9 +145,9 @@ Demo: == Creating Usage Plans -Usage plans allow billing based on consumption: +Usage plans allow billing based on consumption. See https://docs.killbill.io/latest/userguide_subscription#components-catalog-usage[docs]. -. Define a *billing meter* (how usage is tracked). +. Define a https://apidocs.killbill.io/aviate-metering#billingmeter[billing meter] (how usage is tracked). . Configure *blocks/tiers*. . Assign usage-based prices to each block. . Save the plan. diff --git a/userguide/aviate/aviate_getting_started.adoc b/userguide/aviate/aviate_getting_started.adoc index 16a12361b..3879cee36 100644 --- a/userguide/aviate/aviate_getting_started.adoc +++ b/userguide/aviate/aviate_getting_started.adoc @@ -12,7 +12,7 @@ In this guide, you will: The example company used throughout this guide is *CloudSprout*, a fictional SaaS business operating in the UK and France. ---- +'''' == Concepts Overview @@ -27,7 +27,7 @@ In short: * Use *Aviate* to *set things up*. * Use *Kaui* to *run billing operations*. ---- +'''' == Step 1: Start in Aviate (Get Started) @@ -61,7 +61,7 @@ The following demo shows how you can configure the company settings via Aviate. ++++ ---- +'''' === Configure the catalog @@ -99,7 +99,7 @@ image::https://github.com/killbill/killbill-docs/raw/v3/userguide/assets/img/avi This step only defines products and plans. No customers are created yet. ---- +'''' === Configure taxes @@ -124,7 +124,7 @@ The following demo explains how you can configure the above tax codes: ++++ ---- +'''' == Step 2: Switch to Kaui (Billing Operations) @@ -142,7 +142,7 @@ The following demo illustrates how you can switch to Kaui: ++++ ---- +'''' === Create your first customer @@ -153,7 +153,7 @@ In Kaui: . Select the appropriate currency (EUR or GBP). . Save the account. ---- +'''' The following demo illustrates the account creation process in Kaui: @@ -192,7 +192,7 @@ The following demo guides you through the subscription creation process in Kaui: ++++ ---- +'''' === View the invoice @@ -219,7 +219,7 @@ The following demo illustrates verifying the generated invoice: ++++ ---- +'''' == What You Have Achieved @@ -235,7 +235,7 @@ By following this guide, you have: You now have a fully working fictive SaaS company ready for demos or experimentation. ---- +'''' == Next Steps