Introduction
Aviate Quotes and Orders provide a structured sales workflow for enterprise billing. Quotes allow your sales team to build proposals with detailed product line items, structured pricing, and configurable characteristics. Once a customer agrees, a quote converts to an order, which in turn creates a contract and activates the underlying Kill Bill subscriptions.
When You Need This
Picture an enterprise sales cycle: a rep builds a proposal with three product lines — a platform license, an API add-on, and a premium support package. The customer negotiates, the rep revises the quote twice, and the deal finally closes. In many billing systems, the rep hands off a PDF to an ops team who manually creates three separate subscriptions, hoping the pricing matches what was promised.
With Quotes & Orders, the entire flow stays connected. The rep creates a quote with all three line items, each with its own pricing and product characteristics (region, support tier, usage limits). When the customer signs, one click converts the quote into an order, which automatically provisions the subscriptions and creates the contract. Every revision is versioned, every related party (buyer, legal, technical contact) is tracked, and if the customer needs to cancel a line item later, a cancellation order handles it cleanly.
Key capabilities include:
-
Structured pricing on quote line items (recurring, one-time, and usage components)
-
Quote versioning — revise and reissue quotes without losing history
-
Related parties — associate contacts (buyer, approver, technical lead) with each quote
-
Characteristic selection — choose specific values for configurable product attributes at the order level
-
Cancellation orders — create cancellation orders for existing subscriptions
Getting Started with Quotes & Orders
Installing the Plugin
Install the Aviate plugin as described in the How to Install the Aviate Plugin guide.
Enabling Quotes & Orders
To enable the enhanced quote functionality, start Kill Bill with the following system property:
com.killbill.billing.plugin.aviate.enableQuoteApis=true
Using Quote APIs
Full API documentation is available at our API documentation.
Creating a Quote
Basic Quote
curl -X POST "${KB_URL}/plugins/aviate-plugin/v1/quotes" \
-H "Authorization: Bearer ${ID_TOKEN}" \
-H "X-Killbill-ApiKey: ${API_KEY}" \
-H "X-Killbill-ApiSecret: ${API_SECRET}" \
-H "Content-Type: application/json" \
-d '{
"description": "Acme Corp -- Q1 2026 Renewal",
"accountId": "a1b2c3d4-...",
"validUntil": "2026-03-31",
"quoteItems": [
{
"productOfferingId": "po-001",
"quantity": 5,
"priceOverrides": [
{
"priceType": "RECURRING",
"amount": 89.00,
"currency": "USD",
"billingPeriod": "MONTHLY"
}
]
}
],
"relatedParties": [
{
"name": "Jane Smith",
"role": "BUYER",
"email": "jane@acme.com"
},
{
"name": "Bob Johnson",
"role": "APPROVER",
"email": "bob@acme.com"
}
]
}'
Quote with Characteristic Selections
When a product has configurable characteristics (defined in the Product Specification), you can choose specific values at the quote level:
curl -X POST "${KB_URL}/plugins/aviate-plugin/v1/quotes" \
-H "Authorization: Bearer ${ID_TOKEN}" \
-H "X-Killbill-ApiKey: ${API_KEY}" \
-H "X-Killbill-ApiSecret: ${API_SECRET}" \
-H "Content-Type: application/json" \
-d '{
"description": "Custom Configuration Quote",
"accountId": "a1b2c3d4-...",
"quoteItems": [
{
"productOfferingId": "po-001",
"quantity": 1,
"characteristics": {
"region": "eu-west-1",
"support_tier": "premium",
"max_users": 500
}
}
]
}'
The system validates the selected values against the allowed values defined in the Product Specification. Invalid selections are rejected with a descriptive error.
Quote Lifecycle
Quotes follow a managed workflow:
| State | Transitions | Description |
|---|---|---|
|
→ |
Initial state. Quote can be edited. |
|
→ |
Submitted for internal review. |
|
→ |
Ready to be sent to the customer and converted. |
|
→ |
Sent back for revision. Can be edited and resubmitted. |
|
(terminal) |
Converted to an order. A contract has been created. |
|
(terminal) |
Quote was abandoned. |
Quote Versioning
Each time you revise and resubmit a quote, a new version is created. All versions are retained for audit purposes:
# Get all versions of a quote
curl "${KB_URL}/plugins/aviate-plugin/v1/quotes/q-001/versions" \
-H "Authorization: Bearer ${ID_TOKEN}" \
-H "X-Killbill-ApiKey: ${API_KEY}" \
-H "X-Killbill-ApiSecret: ${API_SECRET}"
Response:
[
{ "version": 1, "status": "REJECTED", "createdAt": "2026-02-01T10:00:00Z" },
{ "version": 2, "status": "APPROVED", "createdAt": "2026-02-05T14:30:00Z" }
]
This provides a full audit trail of how the quote evolved during the sales process.
Related Parties
Associate people and their roles with each quote:
| Role | Description |
|---|---|
|
The customer contact making the purchasing decision. |
|
An internal approver who must sign off on the quote. |
|
A technical contact for provisioning and configuration questions. |
|
The contact who receives invoices and payment notifications. |
# Add a related party to an existing quote
curl -X POST "${KB_URL}/plugins/aviate-plugin/v1/quotes/q-001/relatedParties" \
-H "Authorization: Bearer ${ID_TOKEN}" \
-H "X-Killbill-ApiKey: ${API_KEY}" \
-H "X-Killbill-ApiSecret: ${API_SECRET}" \
-H "Content-Type: application/json" \
-d '{
"name": "Alice Chen",
"role": "TECHNICAL_CONTACT",
"email": "alice@acme.com",
"phone": "+1-555-0123"
}'
Converting a Quote to an Order
Once a quote is approved, convert it to an order:
curl -X POST "${KB_URL}/plugins/aviate-plugin/v1/orders" \
-H "Authorization: Bearer ${ID_TOKEN}" \
-H "X-Killbill-ApiKey: ${API_KEY}" \
-H "X-Killbill-ApiSecret: ${API_SECRET}" \
-H "Content-Type: application/json" \
-d '{ "quoteId": "q-001" }'
This creates:
-
An order that records the customer’s commitment
-
A contract with a billing schedule derived from the quote terms
-
The underlying Kill Bill subscriptions at the specified start date
Cancellation Orders
To cancel an existing subscription through the order system, create a cancellation order:
curl -X POST "${KB_URL}/plugins/aviate-plugin/v1/cancelProductOrders" \
-H "Authorization: Bearer ${ID_TOKEN}" \
-H "X-Killbill-ApiKey: ${API_KEY}" \
-H "X-Killbill-ApiSecret: ${API_SECRET}" \
-H "Content-Type: application/json" \
-d '{
"accountId": "a1b2c3d4-...",
"subscriptionId": "s1s2s3s4-...",
"cancellationDate": "2026-06-30",
"reason": "Customer downgrading to free tier",
"cancellationPolicy": "END_OF_TERM"
}'
Cancellation Policies
| Policy | Description |
|---|---|
|
Cancel right now. Prorated credits are applied. |
|
Cancel at the end of the current billing period. |
|
Cancel on the date specified in |
Cancellation orders are fully auditable and produce the same state-transition tracking as regular orders.