Skip to main content

Getting started with quotes

Quotes can be created during finishing a configuration. A finish completes a configuration and avoids unintentional modification. As described in Checkout, we support a broad variety of checkout options. In addition to these options, it’s possible to create quotes which can be managed in a dedicated quotes overview including price calculation, state management, mail notifications, quote PDF creation etc.

Quote Hubs

Every quote is created in a dedicated Quote Hub which is defined during the checkout process. This means a quote hub combines quotes from various configurators of your company. All quotes within the same quote hub are managed consistently. For example, they share a unified ascending numbering system or use a pre-defined quote PDF per default. In order to be able to create quotes, you have to fully set-up a quote hub for your company (distributor).

Number sequence

When a quote is created during the checkout, then we assign a unique quote number to it which cannot be changed afterwards. This quote number can be used for the customer communication and uniquely identifies a quote within the same quote hub. It’s ensure that two quotes do never have the same quote number at any circumstances. The format of this number can only be defined until the first quote has been created, because otherwise a subsequent change of the quote format could result in conflicts with existing quotes.

States

A quote can be in different states which describe the current progress and status:

  • Request
  • Processing
  • Sent
  • Lost
  • Canceled
  • Won

Quote PDF

To enable the creation of a quote PDF, it’s required to specify the PDF asset which should be used. This PDF asset must be located in a published asset bundle. You can use a pre-defined quote template during the creation of the PDF asset. After a quote has been published, it’s possible to create a PDF summarizing all details of the quote. The context of every PDF is provided via the Quote JSON and is applied to the PDF. With this, it's possible to enrich every quote PDF with data.

Quote JSON

The following data representation format is used for several use cases:

  1. It represents the data usable as context in the quote PDF mentioned above.
  2. This data format is also used in workflows. For example, it can be used to access quote data when the state of a quote has been changed.
  3. In addition, it's also possible to define a custom format of the quote PDF file name via accessing properties of a quote.
{
"finish": {
"output": {
"myImageName": "",
"myImageUrl": "",
"myFile": ""
}
},
"hubName": "HUB",
"quoteNumber": "A20260214",
"version": "V1",
"state": "request",
"subject": "My subject",
"projectId": "project 1",
"assignee": {
"firstName": "John",
"lastName": "Doe",
"emailAddress": "john.doe@mail.com",
"fields": { "Age": 20, "Discount": 5, "DiscountString": "company-user-discount" }
},
"currency": "EUR",
"taxRule": "RevealSalesTax",
"customer": {
"firstName": "John",
"lastName": "Doe",
"companyName": "My Customer",
"addressLine1": "AddressLine1",
"addressLine2": "AddressLine2",
"city": "City",
"street": "Street",
"postalCode": "PostalCode",
"country": "Country",
"emailAddress": "john.doe@mail.com",
"phoneNumber": "+43 1 1234567"
},
"company": {
"name": "My company",
"city": "Neufelden",
"street": "Linzerstraße 4",
"postalCode": "4120",
"country": "Österreich",
"emailAddress": "my.company@service.com",
"phoneNumber": "+43 1 1234567",
"imageUrl": "https://picsum.photos/id/2/200",
"taxId": "ATU23423",
"bankDetails": {
"accountHolderName": "Acme",
"accountNumber": "324234",
"bankName": "Sparkasse",
"swift": "BC3234",
"bic": "BC3234",
"iban": "AT32304203402340"
}
},
"shipping": {
"firstName": "John",
"lastName": "Doe",
"companyName": "My Shipping Company GmbH",
"city": "Neufelden",
"street": "Linzerstraße 45",
"postalCode": "3234",
"country": "Österreich",
"emailAddress": "john.doe@mail.com",
"phoneNumber": "+43 1 12345678"
},
"quoteDate": 1775113431,
"discounts": [
{ "id": "0GBzmPASi92", "name": "Customer Discount", "type": "Absolute", "value": 300, "net": -300, "gross": -353.6723634847853 },
{ "id": "0GBzmPAX6vY", "name": "Summer Sale", "type": "Percent", "value": 1, "net": -119.95, "gross": -141.41 }
],
"markups": [
{ "id": "0GBzmPAX6vZ", "name": "Environment Markup", "type": "Percent", "value": 2, "net": 239.9, "gross": 282.82 },
{ "id": "0GBzmPAX6va", "name": "Economic Markup", "type": "Absolute", "value": 19, "net": 19, "gross": 22.39924968736974 }
],
"items": [
{ "type": "Section", "id": "0GBzmP9rJUe", "name": "Essential car parts" },
{
"type": "Item",
"id": "0GBzmPA6iES",
"name": "Battery",
"description": "Supplies the electrical power to start the engine and run electronics.",
"quantity": 1,
"unit": "pc.",
"netUnitPrice": 200,
"netUnitPriceFinal": 200,
"netTotalPrice": 200,
"netTotalPriceFinal": 200,
"netUnitDiscount": 0,
"netTotalDiscount": 0,
"grossUnitPrice": 240,
"grossUnitPriceFinal": 240,
"grossTotalPrice": 240,
"grossTotalPriceFinal": 240,
"grossUnitDiscount": 0,
"grossTotalDiscount": 0,
"discountPercent": 0,
"variableCostNet": 30,
"contributionMarginRatioThreshold": 40,
"tax": 20,
"isOptional": false,
"fields": { "Audio": "fallback-audio", "Labels": ["fallback-label"], "Numbers": [-1] }
},
{
"type": "Item",
"id": "0GBzmPAJua0",
"name": "Alternator",
"description": "Keeps the battery charged and powers the electrical system while the engine runs.",
"quantity": 1,
"unit": "pc.",
"netUnitPrice": 300,
"netUnitPriceFinal": 285,
"netTotalPrice": 300,
"netTotalPriceFinal": 285,
"netUnitDiscount": 15,
"netTotalDiscount": 15,
"grossUnitPrice": 330,
"grossUnitPriceFinal": 313.5,
"grossTotalPrice": 330,
"grossTotalPriceFinal": 313.5,
"grossUnitDiscount": 16.5,
"grossTotalDiscount": 16.5,
"discountPercent": 5,
"discountType": "Percent",
"variableCostNet": 50,
"contributionMarginRatioThreshold": 40,
"tax": 10,
"isOptional": false,
"fields": { "Audio": "fallback-audio", "Labels": ["fallback-label"], "Numbers": [-1] }
},
{
"type": "Item",
"id": "0GBzmPAM6yG",
"name": "Brake Pads",
"description": "The friction material that stops your car.",
"quantity": 4,
"unit": "pcs.",
"netUnitPrice": 100,
"netUnitPriceFinal": 100,
"netTotalPrice": 400,
"netTotalPriceFinal": 400,
"netUnitDiscount": 0,
"netTotalDiscount": 0,
"grossUnitPrice": 110,
"grossUnitPriceFinal": 110,
"grossTotalPrice": 440,
"grossTotalPriceFinal": 440,
"grossUnitDiscount": 0,
"grossTotalDiscount": 0,
"discountPercent": 0,
"variableCostNet": 20,
"contributionMarginRatioThreshold": 40,
"tax": 10,
"isOptional": false,
"fields": { "Audio": "fallback-audio", "Labels": ["fallback-label"], "Numbers": [-1] }
},
{
"type": "Item",
"id": "0GBzmPAM6yH",
"name": "Tires",
"description": "Your only contact point with the road.",
"quantity": 4,
"unit": "pcs.",
"netUnitPrice": 300,
"netUnitPriceFinal": 295,
"netTotalPrice": 1200,
"netTotalPriceFinal": 1180,
"netUnitDiscount": 5,
"netTotalDiscount": 20,
"grossUnitPrice": 315,
"grossUnitPriceFinal": 309.75,
"grossTotalPrice": 1260,
"grossTotalPriceFinal": 1239,
"grossUnitDiscount": 5.25,
"grossTotalDiscount": 21,
"discountPercent": 1.6666666666666667,
"discountType": "Absolute",
"variableCostNet": 20,
"contributionMarginRatioThreshold": 40,
"tax": 5,
"isOptional": false,
"fields": { "Audio": "fallback-audio", "Labels": ["fallback-label"], "Numbers": [-1] }
},
{
"type": "Item",
"id": "0GBzmPAM6yI",
"name": "Oil Filter",
"description": "Keeps oil clean. Running without one dirties engine oil fast, leading to engine wear and damage.",
"quantity": 1,
"unit": "pc.",
"netUnitPrice": 20,
"netUnitPriceFinal": 20,
"netTotalPrice": 20,
"netTotalPriceFinal": 20,
"netUnitDiscount": 0,
"netTotalDiscount": 0,
"grossUnitPrice": 24,
"grossUnitPriceFinal": 24,
"grossTotalPrice": 24,
"grossTotalPriceFinal": 24,
"grossUnitDiscount": 0,
"grossTotalDiscount": 0,
"discountPercent": 0,
"variableCostNet": 2,
"contributionMarginRatioThreshold": 40,
"tax": 20,
"isOptional": false,
"fields": { "Audio": "fallback-audio", "Labels": ["fallback-label"], "Numbers": [-1] }
},
{
"type": "Item",
"id": "0GBzmPAM6yJ",
"name": "Air Filter",
"description": "Prevents dirt and debris from entering the engine.",
"quantity": 1,
"unit": "pc.",
"netUnitPrice": 50,
"netUnitPriceFinal": 50,
"netTotalPrice": 50,
"netTotalPriceFinal": 50,
"netUnitDiscount": 0,
"netTotalDiscount": 0,
"grossUnitPrice": 52.5,
"grossUnitPriceFinal": 52.5,
"grossTotalPrice": 52.5,
"grossTotalPriceFinal": 52.5,
"grossUnitDiscount": 0,
"grossTotalDiscount": 0,
"discountPercent": 0,
"variableCostNet": 3,
"contributionMarginRatioThreshold": 40,
"tax": 5,
"isOptional": false,
"fields": { "Audio": "fallback-audio", "Labels": ["fallback-label"], "Numbers": [-1] }
},
{
"type": "Item",
"id": "0GBzmPAM6yK",
"name": "Spark Plugs",
"description": "Ignite the fuel-air mix in your engine. Bad plugs cause misfires, rough idle, and poor fuel economy.",
"quantity": 6,
"unit": "pcs.",
"netUnitPrice": 20,
"netUnitPriceFinal": 20,
"netTotalPrice": 120,
"netTotalPriceFinal": 120,
"netUnitDiscount": 0,
"netTotalDiscount": 0,
"grossUnitPrice": 24,
"grossUnitPriceFinal": 24,
"grossTotalPrice": 144,
"grossTotalPriceFinal": 144,
"grossUnitDiscount": 0,
"grossTotalDiscount": 0,
"discountPercent": 0,
"variableCostNet": 3,
"contributionMarginRatioThreshold": 40,
"tax": 20,
"isOptional": false,
"fields": { "Audio": "fallback-audio", "Labels": ["fallback-label"], "Numbers": [-1] }
},
{
"type": "Item",
"id": "0GBzmPAM6yL",
"name": "Motor",
"description": "The engine of your car.",
"quantity": 1,
"unit": "pc.",
"netUnitPrice": 9000,
"netUnitPriceFinal": 9000,
"netTotalPrice": 9000,
"netTotalPriceFinal": 9000,
"netUnitDiscount": 0,
"netTotalDiscount": 0,
"grossUnitPrice": 10800,
"grossUnitPriceFinal": 10800,
"grossTotalPrice": 10800,
"grossTotalPriceFinal": 10800,
"grossUnitDiscount": 0,
"grossTotalDiscount": 0,
"discountPercent": 0,
"variableCostNet": 1500,
"contributionMarginRatioThreshold": 40,
"tax": 20,
"isOptional": false,
"fields": { "Audio": "fallback-audio", "Labels": ["fallback-label"], "Numbers": [-1] }
},
{
"type": "Item",
"id": "0GBzmPAM6yM",
"name": "Radiator",
"description": "Keeps engine temperatures in check by cooling coolant.",
"quantity": 1,
"unit": "pc.",
"netUnitPrice": 100,
"netUnitPriceFinal": 100,
"netTotalPrice": 100,
"netTotalPriceFinal": 100,
"netUnitDiscount": 0,
"netTotalDiscount": 0,
"grossUnitPrice": 120,
"grossUnitPriceFinal": 120,
"grossTotalPrice": 120,
"grossTotalPriceFinal": 120,
"grossUnitDiscount": 0,
"grossTotalDiscount": 0,
"discountPercent": 0,
"variableCostNet": 20,
"contributionMarginRatioThreshold": 40,
"tax": 20,
"isOptional": false,
"fields": { "Audio": "fallback-audio", "Labels": ["fallback-label"], "Numbers": [-1] }
},
{
"type": "Item",
"id": "0GBzmPAOJMW",
"name": "Brake Rotors",
"description": "Brake Rotors.",
"quantity": 4,
"unit": "pcs.",
"netUnitPrice": 160,
"netUnitPriceFinal": 160,
"netTotalPrice": 640,
"netTotalPriceFinal": 640,
"netUnitDiscount": 0,
"netTotalDiscount": 0,
"grossUnitPrice": 192,
"grossUnitPriceFinal": 192,
"grossTotalPrice": 768,
"grossTotalPriceFinal": 768,
"grossUnitDiscount": 0,
"grossTotalDiscount": 0,
"discountPercent": 0,
"variableCostNet": 20,
"contributionMarginRatioThreshold": 40,
"tax": 20,
"isOptional": false,
"fields": { "Audio": "fallback-audio", "Labels": ["fallback-label"], "Numbers": [-1] }
},
{ "type": "Section", "id": "0GBzmPAOJMX", "name": "Accessories" },
{
"type": "Item",
"id": "0GBzmPAOJMY",
"name": "Rear wing",
"description": "On performance cars at high speed, a spoiler can add downforce to improve stability.",
"quantity": 1,
"unit": "pc.",
"netUnitPrice": 500,
"netUnitPriceFinal": 500,
"netTotalPrice": 500,
"netTotalPriceFinal": 500,
"netUnitDiscount": 0,
"netTotalDiscount": 0,
"grossUnitPrice": 550,
"grossUnitPriceFinal": 550,
"grossTotalPrice": 550,
"grossTotalPriceFinal": 550,
"grossUnitDiscount": 0,
"grossTotalDiscount": 0,
"discountPercent": 0,
"variableCostNet": 20,
"tax": 10,
"isOptional": true,
"fields": { "Audio": "fallback-audio", "Labels": ["fallback-label"], "Numbers": [-1] }
},
{
"type": "Item",
"id": "0GBzmPAOJMZ",
"name": "LED ambient interior lights",
"description": "LED ambient lights for your car.",
"quantity": 1,
"unit": "pc.",
"netUnitPrice": 100,
"netUnitPriceFinal": 100,
"netTotalPrice": 100,
"netTotalPriceFinal": 100,
"netUnitDiscount": 0,
"netTotalDiscount": 0,
"grossUnitPrice": 110,
"grossUnitPriceFinal": 110,
"grossTotalPrice": 110,
"grossTotalPriceFinal": 110,
"grossUnitDiscount": 0,
"grossTotalDiscount": 0,
"discountPercent": 0,
"variableCostNet": 20,
"tax": 10,
"isOptional": true,
"fields": { "Audio": "fallback-audio", "Labels": ["label1"], "Numbers": [1] }
}
],
"fields": {
"AgencyFee": 10,
"LeadTime": "30-45 Calendar Days",
"Comments": "",
"CreditTerms": "Net 30 Days",
"CreditDetails": "",
"FOB": "Londonderry, NH",
"Assembly": "Ships knocked down & unassembled. Hardware kits & assembly instructions included.",
"Freight": "Not included",
"CoverLetter": "No"
},
"netTotalPrice": 12030,
"netTotalPriceFinal": 11833.95,
"netTotalOptionalPrice": 600,
"netTotalOptionalPriceFinal": 600,
"grossTotalPrice": 14178.5,
"grossTotalPriceFinal": 13951.136886202585,
"grossTotalOptionalPrice": 660,
"grossTotalOptionalPriceFinal": 660,
"totalTax": 2117.1868862025844,
"totalTaxValues": [
{ "tax": 5, "value": 60.67427469779074 },
{ "tax": 10, "value": 67.58028970404335 },
{ "tax": 20, "value": 1988.9323218007503 }
]
}