# Set up quotes

URL: https://docs.sparklayer.io/help/ordering/quoting

Set up the SparkLayer Quoting Engine so B2B customers can request quotes from their cart: turn it on, prepare your sales team, statuses, emails and groups.

> **Quick summary**
>
> - The Quoting Engine lets B2B customers submit their cart as a [quote](https://docs.sparklayer.io/help/glossary.md#quote) instead of checking out. Your sales team reviews, edits and discusses it, then the customer or a sales agent confirms it as an order.
> - Turn on **Quotes** at **Settings > Configurations > Quotes and invoices** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Quotes and invoices** in the Shopify app, then choose which groups can request quotes at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app.
> - Included on Pro and Enterprise, and a $49 per month add-on on Starter and Growth. It isn't on Basic, because reviewing quotes needs a sales agent or Sales administrator, and sales agents start on Starter. It also needs SparkLayer version 3.7 or above.
> - Quotes live in SparkLayer, not as Shopify draft orders. For reviewing, editing and completing quotes, see [Work on a quote](https://docs.sparklayer.io/help/ordering/work-on-a-quote.md).

## How it works

A customer submits their cart as a quote. Your team is emailed, a Sales administrator assigns it to a sales agent, and the agent and customer agree the details on the quote's timeline. The customer, or the agent for them, then confirms it and it becomes an order. Each step is in [How a quote becomes an order](https://docs.sparklayer.io/help/ordering/work-on-a-quote.md#how-a-quote-becomes-an-order).

| Use it for | How |
| --- | --- |
| **Negotiation** | Agree price or terms before an order is placed. |
| **Pre-orders** | Customers request a quote ahead of time. |
| **Sales-assisted orders** | Your team adds products to a quote that the customer can change before they finalise it. |
| **Price on application (POA)** | Customers add items to a quote before the price is set. |

Quote statuses control what customers can do at each stage, such as edit or complete the quote, and whether it's archived when it expires. Each quote's timeline records messages, internal notes and edits, and key events send [email notifications](#email-notifications-sent).

Try the [interactive demo](https://www.figma.com/proto/EImqog20F76HKgwXPGG6hG/SparkLayer-Quoting?page-id=0%3A1\&node-id=0-4591\&viewport=1497%2C630%2C0.15\&t=PxY0LmnWuGO5gszG-1\&scaling=min-zoom\&content-scaling=fixed\&starting-point-node-id=0%3A2882) of the Quoting Engine.

## Turn on the Quoting Engine

Before you start:

- **SparkLayer version 3.7 or above**: the [Core Script](https://docs.sparklayer.io/help/glossary.md#core-script) version in your theme. Check **Version for this store** at **Storefront > Widgets > Core script version** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/frontend/core)), or **SparkLayer Wholesale > Storefront > Widgets > Core script version** in the Shopify app. To upgrade, see [Frontend integration](https://docs.sparklayer.io/developers/frontend.md) or ask your developer.
- **The Pro or Enterprise plan, or the Quoting Engine add-on on Starter or Growth.** The add-on is $49 per month (see [Add-ons](https://docs.sparklayer.io/help/plans-and-features.md#add-ons)). Without either, **Quotes** shows a **Pro** badge and an **Unlock** button, which shows what Pro adds and starts a free 14-day trial. Or change plan at **Plan card** in the SparkLayer Dashboard, or **SparkLayer Wholesale > Plan** in the Shopify app. See [SparkLayer plans and pricing](https://www.sparklayer.io/pricing/).
- **A sales agent who can review quotes.** See [Set up your sales team for quoting](#set-up-your-sales-team-for-quoting).

1. Go to **Settings > Configurations > Quotes and invoices** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Quotes and invoices** in the Shopify app.
2. Turn on **Quotes** ("Customers request quotes from their cart and you reply with prices"). The **Quote statuses** row appears.
3. Click **Save**.
4. Set up your [quote statuses](#set-up-quote-statuses) and [purchase notifications](#choose-who-is-notified-about-quotes). Set up notifications before you launch quoting.
5. [Choose which customer groups can request quotes](#choose-which-customer-groups-can-request-quotes).

> **Request for Quote is replaced**
>
> If your store still offers the **Request for Quote** payment method, customers stop seeing it at checkout once you turn on **Quotes**.

## Set up your sales team for quoting

[Sales agents](https://docs.sparklayer.io/help/sales-ordering.md) review quotes by signing in on the customer's behalf. A sales agent is anyone in your business who places orders for customers. Their role at **Customers > Roles** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/roles)), or **SparkLayer Wholesale > Sales agents > Roles** in the Shopify app sets their access:

| Role | What they can do with quotes |
| --- | --- |
| **Sales administrator** | Everything a sales agent can do, plus assign quotes to sales agents and other higher-level tasks. |
| **Sales agent** | Review, edit, message and complete the quotes assigned to them. |

Without a sales team, set up one account with the **Sales administrator** role. Someone must be able to sign in on a customer's behalf to review their quotes. What they do day to day is in [Work on a quote](https://docs.sparklayer.io/help/ordering/work-on-a-quote.md).

## Set up quote statuses

Quote statuses group your quotes and set the rules for each stage. For example, stop customers editing a quote while you review it, or archive quotes when they expire.

There are 2 statuses to start with: **Quote Requested**, where every new quote starts (marked **Default**), and **Awaiting Customer**, for when a sales agent is waiting on the customer. See [What happens at each status](https://docs.sparklayer.io/help/ordering/work-on-a-quote.md#what-happens-at-each-status).

1. Go to **Settings > Configurations > Quotes and invoices** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Quotes and invoices** in the Shopify app.
2. Next to **Quote statuses**, click **Edit**. The **Quote statuses** window lists your statuses, with **Default** beside the one new quotes start in.
3. To add a status, enter it in **New status** (such as "Awaiting approval") and click **Add status**. To delete one, click **Remove**. You can't remove the default status.
4. Click **Done**.

**Status settings**

Each status also has these settings.

| Setting | What it does |
| --- | --- |
| **Quote Status Display Name** | The status customers see when viewing the quote in My Account. Up to 45 characters. |
| **Quote Status Handle (or ID)** | Identifies the status internally. Up to 45 characters. |
| **Set as default quote status for customers** | All new quotes start in this status. |
| **What status should the quote move to when an edit is made?** | The status a quote moves to automatically when the customer or a sales agent edits it. Choose **No change in status** to keep it the same. |
| **Allow customers to complete quote** | Customers can complete the quote and place their order. |
| **Allow customers to make edits to quote** | Customers can change the quote. |
| **Require an expiry date before changing to a new status** | A sales agent must set an expiry date before moving the quote out of this status. |
| **Archive quote once quote has expired** | After the expiry date, the quote is cancelled and can't be changed. Customers need to start a new quote. |

The last 4 settings are under **Actions allowed in this status**.

Statuses appear on quotes in My Account. Only sales agents assigned to a quote can change its status.

## Choose who is notified about quotes

Quote emails go to:

| Recipient | When |
| --- | --- |
| **The assigned sales agent** | Once a Sales administrator assigns them a quote, they get all its notifications, at their email address in [Sales rep setup](https://docs.sparklayer.io/help/sales-reps.md). |
| **Additional email addresses** | For quotes with no assigned sales agent, such as new quotes, if you've added addresses in **Purchase notifications**. |
| **Your store email (fallback)** | If no sales agent is assigned and no additional addresses are set up. |

To email extra addresses about unassigned quotes:

1. Go to **Settings > Configurations > Quotes and invoices** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Quotes and invoices** in the Shopify app.
2. Next to **Purchase notifications**, click **Edit**. Until you add someone, it says "No one is emailed when quotes and orders update."
3. In **Email addresses**, enter the addresses, separated with commas.
4. Click **Save**.

This covers new quotes, and quotes and orders that become unassigned.

**Where the fallback store email comes from**

It's your eCommerce platform's store email. On Shopify, it's the **Store email** at **Settings > General** ([open in the Shopify admin](https://admin.shopify.com/settings/general)), in your store profile, where your standard Shopify notifications usually go. For other platforms, see the [developer docs](https://docs.sparklayer.io/developers.md).

## Choose which customer groups can request quotes

1. Go to **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app and click the group's name. For every group, click **Edit** on the base customer group.
2. Under **Inherited rules**, click **+ Override** next to **Quoting engine** (on the base group, **+ Customize**), then **Configure**.
3. Tick **Allow quotes to be submitted**, then click **Save**.

Customers in the group then see **Request Quote** beside **Checkout** in their cart. Click **Reset** on the rule to hand it back to the base customer group. See [Customer groups](https://docs.sparklayer.io/help/customers/customer-groups.md#let-customers-request-quotes).

To make a group quote-only, also override its **Checkout access** rule so customers can't check out. See [Disable checkout](https://docs.sparklayer.io/help/customers/customer-groups.md#disable-checkout).

## Let customers open quotes from email links

To make links in quote emails open the quote or order details directly, turn on My Account quick links. See [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md).

## Change the quote text

Change this text without code at **Storefront > Options > Translation overrides** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Translation overrides** in the Shopify app. See [Change checkout text](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md#change-checkout-text) and [Languages and international](https://docs.sparklayer.io/help/storefront/languages-and-international.md).

| Key | Default text |
| --- | --- |
| `pdp.messaging.poa` | POA |
| `cart.request-quote` | Request Quote |
| `cart.edit-quote` | Edit Quote |
| `cart.checkout.confirm-btn.quote` | Submit Quote: `{total}` |
| `account.order-view.quote` | View & Download Quote |
| `account.order-view.edit-quote` | Edit Quote |
| `account.order-view.confirm-and-complete` | Confirm & Complete |
| `account.order-view.cancel-and-archive` | Cancel and archive. |
| `account.order-view.redirect-to-checkout` | You'll be redirected to the checkout to edit or complete your order. |
| `account.order-view.quote-not-required` | No longer require this quote? |

`cart.request-quote` is the button in the cart, and `cart.checkout.confirm-btn.quote` is the last button of the quote checkout, where `{total}` is replaced with the quote total. 

**Core Script code for your developer**

A developer can set the same text in your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting):

```javascript title="Core Script"
translations: {
  en: {
    "pdp.messaging.poa": "POA",
    "cart.request-quote": "Request Quote",
    "cart.edit-quote": "Edit Quote",
    "cart.checkout.confirm-btn.quote": "Submit Quote: {total}",
    "account.order-view.quote": "View & Download Quote",
    "account.order-view.edit-quote": "Edit Quote",
    "account.order-view.confirm-and-complete": "Confirm & Complete",
    "account.order-view.cancel-and-archive": "Cancel and archive.",
    "account.order-view.redirect-to-checkout": "You'll be redirected to the checkout to edit or complete your order.",
    "account.order-view.quote-not-required": "No longer require this quote?",
  },
},
```

The text of quote emails and the quote PDF comes from your [templates](https://docs.sparklayer.io/help/dashboard/settings.md#templates). See [Email notifications](#email-notifications-sent).

## Reference

### Features

**Every Quoting Engine feature**

| Area | What you can do |
| --- | --- |
| **Configuration** | Show or hide quoting for each customer group. Email your sales team when a new quote arrives. |
| **Workflow** | Assign a quote to a sales agent. Set a status on each quote, choose a default status, and set rules for each status: whether the customer can edit or complete the quote, whether they can download a PDF, and whether an expiry date is required. |
| **Ordering** | Add custom line items, custom shipping, unavailable or POA (price on application) products and out-of-stock products to a quote. Set the payment method on the quote, for the customer to use when they complete it. |
| **PDF** | Download the quote as a PDF, and theme and customise the PDF. |
| **Expiry** | Set quotes to expire after a date. |
| **Timeline and communications** | Send messages to the customer, save internal notes all sales agents can see, track changes to the quote, and send email notifications when the quote changes or a message arrives. |

For what each quote action does and what the timeline records, see [Work on a quote](https://docs.sparklayer.io/help/ordering/work-on-a-quote.md#reference).

### Limitations

| Item | Limitation |
| --- | --- |
| **Company users** | [Limited users](https://docs.sparklayer.io/help/customers/company-users.md) can't request quotes. |
| **Discounts** | You can't add discounts to a quote. |

**BigCommerce only:**

**Out-of-stock products:** on BigCommerce, you can't add out-of-stock products when a quote is created or edited.

## Email notifications

Change these emails with a template at **Settings > Templates** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/theme)), or **SparkLayer Wholesale > Settings > Templates** in the Shopify app: see [Settings](https://docs.sparklayer.io/help/dashboard/settings.md#templates). Turn on [My Account quick links](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md) so each email's link opens the quote directly.

**Quote management and communication emails** are sent on creation, assignment, messages and updates.

**New quote notification (sent to merchant)**

**Trigger:** Sent when an end-customer requests a new quote

**Recipient:** Sales administrator (and any emails added in **Purchase notifications**)

**Template**: `Emails/new-quote-notification-to-merchant`

> **Email Subject:**
>
> \[Company name] has requested a new quote \[#Pxxxx]
>
> **Email Copy:**
>
> \[Customer name] has requested a new quote \[#Pxxxx].
>
> To review, approve, or amend the details, please click the button below.
>
> **Button:** \[View requested quote]

**New quote assigned (sent to Sales Agent)**

**Trigger:** Sent when a quote is assigned to a Sales Agent

**Recipient:** Sales Agent

**Template**: `Emails/quote-assigned-notification-to-agent`

> **Email Subject:** \[Sales Admin name] has assigned you a quote for \[Company name] \[#Pxxxx]
>
> **Email Copy:** A quote for \[Customer name] has been assigned to you by \[Sales Admin name]. Assigned on \[Date] with Quote ID \[#Pxxxx].
>
> **Button:** \[View assigned quote]

**First response from Sales Agent to quote request (sent to end-customer)**

**Trigger:** Sent when a Sales Agent sends their first reply on a new quote

**Recipient:** End-customer

**Template**: `Emails/quote-request-responded-to-notification-to-customer`

> **Email Subject:** \[Sales Agent name] has responded to your quote request \[#Pxxxx]
>
> **Email Copy:** \[Sales Agent name] from \[Merchant name] has responded to your quote request \[#Pxxxx].
>
> **Customer Message:** xxxxx
>
> **Email Copy:** To access the full conversation in your account and reply, click below.
>
> **Button:** \[View quote and conversation]

**Subsequent quote update from Sales Agent (sent to end-customer)**

**Trigger:** Sent when a Sales Agent updates an existing quote (price, quantities, products, etc)

**Recipient:** End-customer

**Template**: `Emails/quote-updated-notification-to-customer`

> **Email Subject:** \[Sales Agent name] has updated your quote \[#Pxxxx]
>
> **Email Copy:** \[Sales Agent name] from \[Merchant name] has updated your quote \[#Pxxxx].
>
> **Customer Message:** xxxxx
>
> **Email Copy:** To access the full conversation in your account and reply, click below.
>
> **Button:** \[View quote and conversation]

**Quote sent to end-customer by Sales Agent**

**Trigger:** Sent when a Sales Agent creates a quote and sends it to the customer

**Recipient:** End-customer

**Template**: `Emails/quote-created-notification-to-customer`

> **Email Subject:** \[Sales Agent name] has sent a quote to review \[#Pxxxx]
>
> **Email Copy:** \[Sales Agent name] from \[Merchant name] has created a new quote for you to review \[#Pxxxx].
>
> **Customer Message:** xxxxx
>
> **Email Copy:** To access the full conversation in your account and reply, click below.
>
> **Button:** \[View quote and conversation]

**Timeline - message sent by Sales Agent to end-customer**

**Trigger:** Sent to a customer when a sales agent leaves a note

**Recipient:** End-customer

**Template**: `Emails/purchase-history-message-notification-to-customer`

> **Email Subject:** \[Sales Agent name] has sent you a message about your quote \[#Pxxxx]
>
> **Email Copy:** \[Sales Agent name] from \[Merchant name] has sent you a new message about your quote \[#Pxxxx].
>
> **Customer Message:** xxxxx
>
> **Email Copy:** To access the full conversation in your account and reply, click below.
>
> **Button:** \[View quote and conversation]

**Timeline - message sent by end-customer to Sales Agent**

**Trigger:** Sent to a Sales Agent when a customer leaves a note

**Recipient:** Sales Agent

**Template**: `Emails/purchase-history-message-notification-to-agent`

> **Email Subject:** \[Company name] has sent you a message about their quote \[#Pxxxx]
>
> **Email Copy:** \[Customer name] from \[Company name] has sent a new message about their quote \[#Pxxxx].
>
> **Customer Message:** xxxxxx
>
> **Email Copy:** To access the full conversation in your account and reply, click below.
>
> **Button:** \[View quote and conversation]

**Limited user approval flow emails** are sent when a [limited user](https://docs.sparklayer.io/help/glossary.md#limited-user) submits an order for approval, and when it's approved.

**Limited user order submitted for approval (sent to merchant)**

**Trigger:** Sent when a limited user (end-customer) submits an order created from a quote for approval

**Recipient:** Main company user (merchant) / approver

**Template**: `Emails/limited-user-purchase-review`

> **Email Subject:** \[Limited User name] has submitted a new order for your review \[#Pxxxx]
>
> **Email Copy:** \[Limited User name], a limited user on your account, has requested to place order \[#Pxxxx].
>
> As a main user, your approval is required before the order can be processed.
>
> To review and approve or amend the details, please click the button below:
>
> **Button:** \[Review Order]

**Limited user order approved (sent to end-customer)**

**Trigger:** Sent when a main company user (merchant) approves an order submitted by a limited user

**Recipient:** Limited user (end-customer)

**Template**: `Emails/limited-user-purchase-approved`

> **Email Subject:** Your order \[#Pxxxx] has been approved by \[Main User name]
>
> **Email Copy:** Your order \[#Pxxxx] for \[Company name] has been approved by \[Main User name] and will now be processed for shipment. For any questions, please contact \[Main User name].To access the full conversation in your account and reply, click below.
>
> **Button:** \[View Approved Order]

## FAQs

For problems with a quote itself, such as **Confirm & Complete** being greyed out, see [Troubleshooting](https://docs.sparklayer.io/help/ordering/work-on-a-quote.md#troubleshooting) in Work on a quote.

**Can I restrict which customer groups can request quotes?**

Yes. See [Choose which customer groups can request quotes](#choose-which-customer-groups-can-request-quotes).

**Do I need to have sales agents to use the Quoting Engine?**

You don't need a sales team, but someone must be able to sign in on a customer's behalf to review quotes. Give them the **Sales administrator** role: see [Sales rep setup](https://docs.sparklayer.io/help/sales-reps.md). This is why quotes aren't available on Basic: sales agents start on Starter.

**How do I edit the email notifications sent?**

With your templates (see [Email notifications](#email-notifications-sent)). For help, [contact our team](https://docs.sparklayer.io/help/support.md).

**Can I use "Request for Quote" as a payment method alongside this?**

No. Once you turn on **Quotes**, customers no longer see Request for Quote at checkout.

**Does the Quoting Engine create a draft order in Shopify?**

**Shopify only:**

No. Quotes live in SparkLayer. A confirmed quote becomes a regular Shopify order in your usual workflow.

We'd love to hear your feedback on the Quoting Engine. Email our product team at [product@sparklayer.io](mailto:product@sparklayer.io).
