# SparkLayer Docs > SparkLayer is a B2B eCommerce platform that adds wholesale ordering, customer-specific pricing, quoting, payment terms and self-service account features to existing online stores (Shopify, BigCommerce, Wix, WooCommerce, Magento) or to custom storefronts via its APIs, JavaScript SDK and the Ignite integration framework. This file lists every page of the SparkLayer documentation with a short summary. Each link points to a Markdown version of the page. The complete documentation in one file is at https://docs.sparklayer.io/llms-full.txt, or one file per section: - [Help Center](https://docs.sparklayer.io/llms/help.txt): Set up, configure and run SparkLayer on your store. - [Developers](https://docs.sparklayer.io/llms/developers.txt): APIs, JavaScript SDK, templates and integration guides. - [Ignite](https://docs.sparklayer.io/llms/ignite.txt): Build a SparkLayer integration for any commerce platform. - [Developers: guides and API index](https://docs.sparklayer.io/developers/llms.txt): Every developer and Ignite guide in full, the facts for calling the APIs and a list of every API operation. Start here to build an integration. - [API operations](https://docs.sparklayer.io/llms-api.txt): Every SparkLayer API operation in one compact list: method, path, summary, parameters and body fields, with links to the full reference and the OpenAPI specs. ## Using these docs - Every page has a Markdown version: add `.md` to its URL, or request the page with `Accept: text/markdown`. - Building on the APIs or SDK? Read https://docs.sparklayer.io/developers/llms.txt (developer guides in full plus every API operation) or the compact https://docs.sparklayer.io/llms-api.txt, and follow the facts below. - Search and read the docs from an AI assistant or agent with the MCP server at https://docs.sparklayer.io/mcp (tools: `search_docs`, `get_page`, `list_pages`, `list_operations`, `get_operation`, `get_openapi_spec`). - Help Center pages open with a "Quick summary" that answers the page's question; read it first. - Pages marked with platforms in brackets (for example "Shopify only") apply only to those eCommerce platforms. Everything else applies to every platform. - New to SparkLayer? Start with [How SparkLayer works](https://docs.sparklayer.io/help/get-started/how-sparklayer-works.md), then [Get started](https://docs.sparklayer.io/help/get-started.md). Terms are defined in the [Glossary](https://docs.sparklayer.io/help/glossary.md). - Dashboard locations are written as **Area > Screen** with a link to https://app.sparklayer.io. ## Facts for building integrations These apply to every call to the SparkLayer APIs. Use only what the docs and OpenAPI specs define. - **Base URLs:** Live `https://app.sparklayer.io`, test `https://test.app.sparklayer.io`. Each environment has its own data and its own API keys. - **Access:** API access needs the Pro or Enterprise plan. Create credentials (Site ID, Client ID, Client Secret) in the SparkLayer Dashboard at Settings > API. - **Access token:** `POST {base}/api/auth/token` with a `Site-Id` header and a JSON body (not form-encoded): `{"grant_type":"client_credentials","client_id":"…","client_secret":"…"}`. It returns `access_token`, valid for 3,600 seconds. There is no refresh token: cache the token and request a new one shortly before it expires. - **Every request:** `Authorization: Bearer ` and `Site-Id: `, plus `Content-Type: application/json` when there is a body. Set a `User-Agent` that names your integration. - **Errors:** RFC 7807 problem details: `title`, `status`, `detail` and an optional `errors[]` of `{ code, message, property }`. Some error responses have no body. Retry `5xx`, `429` (honouring `Retry-After`) and concurrent-update `409`s with exponential backoff; on `401`, get a new token once and retry; don't retry other `4xx` without changing the request. - **Pagination:** Most list endpoints return everything. `GET /api/v2/price-lists` pages with `page` and `page_size` (up to 250) until `pagination.current_page` equals `total_pages`. `GET /api/v1/purchases` uses `limit` (up to 500) and `offset`: stop when a page has fewer than `limit` results. - **Ground rules:** Use only endpoints, fields and SDK methods that the docs or OpenAPI specs define. Prefer `GET /api/v2/price-lists` over the deprecated v1. Products are matched by SKU. Keep credentials in environment variables or a secrets manager, never in code. - **Ignite:** With Ignite, SparkLayer calls endpoints that your service implements (the Ignite spec), and your service calls the SparkLayer APIs above for everything else. - **Read the docs as Markdown:** Add `.md` to any page URL. Index of every page: https://docs.sparklayer.io/llms.txt. Every API operation, compactly: https://docs.sparklayer.io/llms-api.txt. The developer guides in full: https://docs.sparklayer.io/developers/llms.txt. - **OpenAPI specs:** `core`, `ordering`, `pricing`, `purchasing`, `stock`, `files`, `sync-log`: https://docs.sparklayer.io/openapi/.yaml (also `.json`). Ignite: https://docs.sparklayer.io/openapi/ignite.yaml. - **MCP:** Search and read these docs from your assistant with the docs MCP server at https://docs.sparklayer.io/mcp. OpenAPI specs (index: https://docs.sparklayer.io/openapi/index.json; each is also published as `.json`): - Core API: https://docs.sparklayer.io/openapi/core.yaml - Ordering API: https://docs.sparklayer.io/openapi/ordering.yaml - Pricing API: https://docs.sparklayer.io/openapi/pricing.yaml - Purchasing API: https://docs.sparklayer.io/openapi/purchasing.yaml - Stock API: https://docs.sparklayer.io/openapi/stock.yaml - Files API: https://docs.sparklayer.io/openapi/files.yaml - Sync Logging API: https://docs.sparklayer.io/openapi/sync-log.yaml - Ignite endpoints: https://docs.sparklayer.io/openapi/ignite.yaml # Welcome to SparkLayer URL: https://docs.sparklayer.io/help SparkLayer adds B2B ordering, customer pricing and payment terms to Shopify, BigCommerce, Wix, WooCommerce and Magento. Start here to find your way around. > **Quick summary** > > - SparkLayer adds B2B (wholesale) ordering to your existing online store: trade prices, payment on account, quick ordering and a self-service account area for your business customers. > - It runs alongside your retail store on [Shopify, BigCommerce, Wix, WooCommerce and Magento](https://docs.sparklayer.io/help/platforms.md). > - New here? Answer 4 quick questions for [your own setup guide](https://docs.sparklayer.io/help/get-started/setup-guide.md), or follow [Get started](https://docs.sparklayer.io/help/get-started.md): 5 steps on the **Setup** checklist, from your first price list to your theme. Not on Shopify? Start with your [platform's install guide](#find-your-platform). > - Want a hand? On every plan, our team installs SparkLayer's storefront widgets for you, free, and paid plans include onboarding sessions. See [Contact support](https://docs.sparklayer.io/help/support.md). ## New to SparkLayer? Not sure where to start? Answer 4 quick questions and get [your own setup guide](https://docs.sparklayer.io/help/get-started/setup-guide.md): the guides that apply to your store, in the order you need them. Once SparkLayer is installed, the **Setup** checklist takes you through setup in order. You create a price list, assign it to a customer group and add your first buyer. Then you add SparkLayer to your theme and publish it. On platforms other than Shopify, install SparkLayer with [your platform's guide](#find-your-platform) first. If terms like price list or customer group are new to you, read **How SparkLayer works** first. It takes a few minutes. - [Get started](https://docs.sparklayer.io/help/get-started.md): Set up SparkLayer in 5 steps, from your first price list to your theme - [How SparkLayer works](https://docs.sparklayer.io/help/get-started/how-sparklayer-works.md): How it fits with your store, plus price lists, customer groups and the other essentials - [Launch checklist](https://docs.sparklayer.io/help/get-started/launching.md): Test your setup, invite your first customers and go live - [Get help setting up](https://docs.sparklayer.io/help/support.md): Free installation, onboarding sessions or a question for our team ## Find your platform Installing SparkLayer is the first setup step, and it's different on each platform. Your platform's guide covers installation, setup and limitations. Everything else in the Help Center works the same on every platform. - [Shopify](https://docs.sparklayer.io/help/platforms/shopify.md): Works with all Shopify plans. The free Basic plan is only on Shopify. - [BigCommerce](https://docs.sparklayer.io/help/platforms/bigcommerce.md): Works with BigCommerce Plus, Pro and Enterprise - [Wix](https://docs.sparklayer.io/help/platforms/wix.md): Works with Wix Editor and Wix Studio - [WooCommerce](https://docs.sparklayer.io/help/platforms/woocommerce.md): Early access. WooCommerce 9+, WordPress 6+ and PHP 8.2+ - [Magento](https://docs.sparklayer.io/help/platforms/magento.md): Magento 2.4.2+ and PHP 7.4+. Requires the Enterprise plan. ## Pulse for sales reps **Pulse** is SparkLayer's workspace for sales reps. It puts every account, order, quote and invoice in one place. It also shows who needs attention today, which customers are due to reorder and the tasks to work through. Pulse is in early access. [Explore Pulse](https://docs.sparklayer.io/help/pulse.md) ## What you can do with SparkLayer - [Customer-specific pricing](https://docs.sparklayer.io/help/pricing.md): Give each B2B customer their own prices and price lists. - [Self-service ordering](https://docs.sparklayer.io/help/storefront/interfaces.md): A B2B cart, checkout and account area on your existing store. - [B2B payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md): Net terms, payment on account, invoices and quotes. - [Order for customers](https://docs.sparklayer.io/help/sales-ordering.md): Let your sales reps place orders on behalf of customers. - [Pack sizes & quantity pricing](https://docs.sparklayer.io/help/pricing/quantity-pricing.md): Set pack sizing, quantity breaks and unit of measure pricing. - [Quick re-ordering](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md): Customers repeat past orders in a couple of clicks. - [Shopping lists](https://docs.sparklayer.io/help/ordering/shopping-lists.md): Customers save lists of the products they buy regularly. - [Pre-orders & back-orders](https://docs.sparklayer.io/help/storefront/stock-display.md): Control ordering when products are out of stock or coming soon. - [Company teams](https://docs.sparklayer.io/help/customers/company-users.md): Customers invite colleagues to order from one shared account. See [Plans and features](https://docs.sparklayer.io/help/plans-and-features.md) for what's included on each plan. ## Browse the Help Center - [Guides](https://docs.sparklayer.io/help/guides.md): Step-by-step walkthroughs for common goals, such as Net 30 terms or a key account's own prices - [Pricing](https://docs.sparklayer.io/help/pricing.md): Price lists, the price editor, quantity pricing and discounts - [Customers & companies](https://docs.sparklayer.io/help/customers.md): Customers and customer groups, plus companies, their locations and invites - [Sales reps](https://docs.sparklayer.io/help/sales-ordering.md): Order for customers, the Catalog, Counter mode and rep setup - [Ordering & checkout](https://docs.sparklayer.io/help/ordering.md): Cart and checkout, payment methods, invoices, quotes and shipping - [Storefront & products](https://docs.sparklayer.io/help/storefront.md): The interfaces your customers use, and how products display - [Forms](https://docs.sparklayer.io/help/forms.md): Trade account applications and other forms, with approval workflows - [Dashboard & settings](https://docs.sparklayer.io/help/dashboard.md): Find your way around SparkLayer, Orders, settings and your plan - [Integrations](https://docs.sparklayer.io/help/integrations.md): Connect ERPs, accounting software and other apps - [What's new](https://docs.sparklayer.io/help/whats-new.md): Monthly release notes ## Need help? - [Contact support](https://docs.sparklayer.io/help/support.md): Email or message our team, see how fast we reply, or request free installation - [Troubleshooting](https://docs.sparklayer.io/help/troubleshooting.md): Fixes for missing B2B prices, widgets not loading and checkout errors - [General FAQs](https://docs.sparklayer.io/help/faqs.md): Platforms, cost, setup time and whether you need a developer - [Glossary](https://docs.sparklayer.io/help/glossary.md): Every SparkLayer term in plain English ## Using an AI assistant? Every page has a **Copy for LLM** button and a Markdown version (add `.md` to the address). Paste either into ChatGPT, Claude or another assistant. AI tools can start from [/llms.txt](https://docs.sparklayer.io/llms.txt), which lists every page with a one-line summary and a link to its Markdown version, or search and read the docs through the MCP server at `https://docs.sparklayer.io/mcp`. Connecting an ERP, CRM or iPaaS through the SparkLayer API? See the [developer docs](https://docs.sparklayer.io/developers.md). --- # What's new URL: https://docs.sparklayer.io/help/whats-new Monthly SparkLayer release notes listing new B2B features and improvements by version, such as Pulse, Counter mode, Companies and the new My Cart. For earlier releases (June 2022 to September 2025), see the [release archive](https://docs.sparklayer.io/help/whats-new/archive.md). > **Get the latest SparkLayer version** > > New stores use the latest version automatically. If you've pinned one, choose the latest under **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 and click **Save version**. The [frontend integration guide](https://docs.sparklayer.io/developers/frontend.md) explains how the Core Script works. ## October 2026 ### Version 5.0 **New features** **Pulse, for your sales reps** Pulse is a workspace for sales reps in the SparkLayer widget. It shows who to contact today and why, their orders, quotes, carts and unpaid invoices, and how each account is trading. It's in early access on every paid plan with a sales agent seat. See [Pulse](https://docs.sparklayer.io/help/pulse.md) for what it does and to request access. ![Pulse – What's new](https://docs.sparklayer.io/images/help/whats-new/pulse-392419.webp) **A new look for My Cart, My Account and sales agent ordering** The SparkLayer widget has a new design. My Cart, My Account and the sales agent screens now share one look, so they feel like one product, and they're easier to read at a glance. ![The new My Cart – What's new](https://docs.sparklayer.io/images/help/whats-new/new-my-cart-ab237e.webp) - **My Cart** puts the search for products by name, SKU or barcode at the top, with the **Actions** menu beside it. Each line shows its stock, pack size, price per unit and RRP, and checkout runs in 4 clear steps: **Cart**, **Details**, **Review & Pay** and **Complete**. See [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md). - **My Account** opens on the customer's recent orders, with their payment and order status, then their shopping lists, payment terms, unpaid balance and credit limit. See [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md). - **Sales agent ordering** shows the accounts you opened last and your customers' recent orders, with a search by name, email or account number. In the cart, the **Ordering for** button shows whose order you're building: click it to switch customer. See [Order for a customer](https://docs.sparklayer.io/help/sales-ordering/order-for-a-customer.md). ![My Account – What's new](https://docs.sparklayer.io/images/help/whats-new/new-my-account-1885e1.webp) ![Sales agent ordering – What's new](https://docs.sparklayer.io/images/help/whats-new/new-sales-agent-ordering-84cce8.webp) **Catalog and Quick Order** Browse your whole range in pictures and add products straight to the order. Sales reps see it as the **Catalog** tab, and your customers as the **Quick Order** tab. It has search, a collection filter, grid, list and matrix views, and quantities that follow your pack sizes and volume breaks. It's in early access on the Starter plan and above. See [Catalog and Quick Order](https://docs.sparklayer.io/help/sales-ordering/catalog.md). ![Catalog – What's new](https://docs.sparklayer.io/images/help/whats-new/catalog-53a206.webp) **Counter mode** A full-screen till for sales reps serving customers face to face, at a trade counter, in a showroom or on a trade show stand. Pick who's buying, then scan or tap products, starting from what that account usually buys. You can see the account's credit position as you go, then check out on Net terms, send a card payment link or submit a quote. Open it with **Counter** on the **Catalog** tab. It's in early access on the Starter plan and above. See [Counter mode](https://docs.sparklayer.io/help/sales-ordering/counter-mode.md). ![Counter mode – What's new](https://docs.sparklayer.io/images/help/whats-new/counter-mode-22952d.webp) **Companies** Your Shopify B2B companies and locations, in SparkLayer and kept in sync both ways. Set each company's customer group, price list, pay later, people and sales agents in one place. Split a big company into [locations](https://docs.sparklayer.io/help/customers/company-locations.md), such as stores or regions, each with its own settings where it needs them. Companies are in early access. See [Companies](https://docs.sparklayer.io/help/customers/companies.md). ![Companies – What's new](https://docs.sparklayer.io/images/help/whats-new/companies-fc3f51.webp) **Payment method rules** Add a discount or surcharge to a payment method when an order meets your conditions, or hide the method altogether. Conditions can use the order's sub-total, its items, the customer's available credit or the shipping destination. For example, you could add a 2% surcharge to card payments under £500. You could also hide **Pay on Account** when a customer has less than £500 of credit left. Set the rules for each customer group. Payment method rules are for Shopify stores on the Growth plan and above, with Core Script 4.13.0 or later. See [Payment method rules](https://docs.sparklayer.io/help/ordering/payment-method-rules.md). ## September 2026 ### Version 4.10 **New features** **Dark mode is now universally enabled** In our latest version of SparkLayer, you can now enable dark mode on all the SparkLayer interfaces. Previously, this was limited to just the product pages - with our latest update dark mode now works in the [My Cart Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) and the [My Account Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md) to give a much more cohesive experience. To enable dark mode, see [Customising the design](https://docs.sparklayer.io/help/storefront/customising-design.md). ![Dark mode is now universally enabled – What's new](https://docs.sparklayer.io/images/help/whats-new/whats-new-67a179.webp) ## August 2026 ### Version 4.9 **New features** **Add to Favourites** Your B2B customers can now save products as they browse by clicking the heart icon on any product or collection page! ![Add to Favourites – What's new](https://docs.sparklayer.io/images/shared/product-display-9ca625.webp) Saved products live in a new [Favourites](https://docs.sparklayer.io/help/ordering/favourites.md) section in My Account, right alongside shopping lists, where customers can return to them any time and add them straight to the cart. It's a lightweight way to mark products for later - no quantities or variants to manage - and it's personal to each customer. ![Add to Favourites – What's new](https://docs.sparklayer.io/images/shared/favourites-23d846.webp) Learn more in [Favourites](https://docs.sparklayer.io/help/ordering/favourites.md). **Tax-inclusive price display** You can now show your B2B prices with tax included, clearly labelled "inc. tax", so buyers who think in gross terms see exactly what they expect. It's built for markets where gross pricing is the norm - common in Australia and across trade sectors selling to smaller businesses - and gives you far more flexibility in how you present pricing across different markets. Importantly, this changes presentation only. Your prices are still stored, uploaded, and transacted net, and the tax your buyer actually pays is still calculated by your store's checkout at the point of purchase. Only the figure shown on your storefront changes. - **Show the price your buyers expect** - display gross prices without changing how you upload or transact your pricing. - **Control it per price list** - turn it on for the price lists that need it and leave the rest showing net, so you can serve different markets from one store. - **Set your own rate per product** - supply a display tax rate per SKU, so reduced-rate and zero-rated products show correctly alongside standard-rate ones. - **Clearly labelled throughout** - gross prices and the "inc. tax" label appear across product pages, cart, checkout, and order history, so there's no ambiguity about what a buyer is seeing. You can turn on tax-inclusive display yourself: see [Show tax-inclusive prices](https://docs.sparklayer.io/help/pricing/pricing-display.md#show-tax-inclusive-prices). [Learn more about displaying RRP pricing](https://docs.sparklayer.io/help/pricing/pricing-display.md) **Improvements** - **My Account discount display** When an order is placed with discounts applied, you can now see the discount total breakdown when viewing the order in the My Account. - **A refreshed look across the dashboard** We've given several dashboard pages a visual update as part of standardising the experience - Price Editor, Product Sync, Discounts (including create and edit), and the Configurations pages all now share a cleaner, more consistent design. ## July 2026 ### Version 4.7 **New features** **Configure SparkLayer from the Dashboard - no code required** Settings that previously had to be added to your theme's core script using JavaScript and JSON can now be managed visually from the new Options page in your SparkLayer Dashboard. ![Configure SparkLayer from the Dashboard - no code required – What's new](https://docs.sparklayer.io/images/shared/storefront-options-cf1605.webp) Adjust general settings, translations, checkout fields, payment method order, My Account sections, custom slots, and analytics, then save as a draft and publish when you're ready. It works alongside your existing core script, so nothing you've already set up changes. Learn more in [Storefront options](https://docs.sparklayer.io/help/storefront/storefront-options.md) **Standard checkout fields** Customer Reference, PO Number, and Requested Shipping Date are now available as standard checkout fields. ![Standard checkout fields – What's new](https://docs.sparklayer.io/images/shared/cart-and-checkout-43a588.webp) Because each one uses a known field ID, it maps to a structured place in your orders - the native Shopify PO Number field, a dedicated shipping date field, and the order notes - so they integrate more cleanly with Shopify, appear in your theme and template editor, and can be searched and filtered. [Learn more about cart and checkout options](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md) **Improvements** - **Wix dashboard and onboarding experience** We've redesigned our Wix dashboard to make it even easier for merchants to get setup! From right within Wix, you can now view available features, sync health & analytics, manage customer groups, manage price lists, and a new 'Quick Setup' page to get merchants live super fast - **Upload Excel files to AI file upload** You can now upload Excel (.xlsx) files directly to AI file upload, alongside the existing CSV and PDF support. Customers and sales agents can turn a spreadsheet of products straight into an order, without converting it first. Learn more in [Intelligent Cart (AI)](https://docs.sparklayer.io/help/ordering/intelligent-cart.md) - **More accurate quantity detection in uploaded files** AI file upload is now better at identifying the correct quantities in the files customers upload, making order creation from documents quicker and more reliable. - **Duplicate forms in one click** You can now duplicate any form from within [SparkLayer Forms](https://app.sparklayer.io/forms) - **Hide the Intelligent Cart features** If you'd prefer not to use the [Intelligent Cart (AI)](https://docs.sparklayer.io/help/ordering/intelligent-cart.md) features within the SparkLayer Cart, you can now hide them at **Settings > Configurations** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations** in the Shopify app. See [Hide Intelligent Cart](https://docs.sparklayer.io/help/ordering/intelligent-cart.md#hide-intelligent-cart). ## June 2026 ### Version 4.6 **New features** **Shopping Lists just got a major upgrade** Managing shopping lists is now faster and far more flexible! Products can be saved to a list straight from any product page, and lists can be fully managed from within the My Account area - including previewing, adding, and editing their contents. Your B2B customers and sales agents can also export any list as a CSV, making it easier to share and reorder across teams. [Learn more about shopping lists](https://docs.sparklayer.io/help/ordering/shopping-lists.md) **Orders API - build and manage orders** > **The Orders API is in beta** > > To be invited, email [support@sparklayer.io](mailto:support@sparklayer.io). We've extended our Core API with a new Orders API, giving developers a programmatic way to build and manage orders. The new endpoints let API users create and manage shopping carts and turn them into SparkLayer orders in code - opening up use cases such as creating orders through external integrations, for example drop shipping. Any store with API access has this automatically. See the [API documentation](https://docs.sparklayer.io/developers/api/ordering/create-cart.md) and the [usage guide](https://docs.sparklayer.io/developers/api/ordering.md) to get started. **Fetch customer-specific pricing via the API** As part of the same release, a new endpoint lets API users fetch customer-specific pricing for products, so integrations can pull the exact prices a given customer sees. Learn more in the [API documentation](https://docs.sparklayer.io/developers/api/core/get-customer-specific-pricing.md). **Improvements** - **My Account / My Cart - Expand button moved to the user menu** The "Expand" button now lives in the user dropdown menu, freeing up space for more important actions within each page. - **Clearer impersonation view for sales agents** When viewing as a sales agent, you can now see exactly which customer you're impersonating on every page, making it easier to keep track when ordering on a customer's behalf. ## May 2026 ### Version 4.5 **New features** **Export Purchase History to CSV** You can now export orders (including quotes and any other purchase types) directly from the Activity view as a CSV file, ready for Excel or Google Sheets. Choose between an order-level summary or a full breakdown with every line item, and any filters you've applied carry through to the export. Available from the customer or sales agent view. Learn more in [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md). (Requires Spark-JS Version 4.4 and above) ![Export Purchase History to CSV – What's new](https://docs.sparklayer.io/images/help/whats-new/pika-1780500436153-1x-b06788.webp) **Reply Directly from Your Inbox** No more logging in just to reply to a message. You and your customers can now respond to order communications straight from your email inbox, with replies automatically captured in SparkLayer's Timeline. It works across all order types, making it effortless to keep conversations going - especially on mobile, when you're on the go. Learn more in [Timeline & communications](https://docs.sparklayer.io/help/customers/timeline.md). (Requires Version 4.3 and above) **Improvements** **Customer & Order Data in Forms** You can now pull customer and order data (including quotes and any other purchase types) directly into your SparkLayer forms. Great for cases like returns forms, where shoppers can select from their previous orders and items without re-entering details, and sales agents can request customer data to be updated. Learn more in [Account credit request form](https://docs.sparklayer.io/help/forms/account-credit-request-form.md). **Address improvements** Entering addresses just got easier - especially for international buyers. Address forms now adapt their layout and name ordering to the selected country, and offer address search and auto-fill. The result is faster, more accurate data entry wherever your customers are based. Learn more in [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md). (Requires Version 4.5 and above) **Improvements to Sales Agent Activity Filtering** Sales agents get the same export options across all their customers, and, similar to the customer view, they can now filter by the new purchase type and quote status filters. Making it easy to reconcile orders, forecast inventory, or plan pre-orders. (Requires Version 4.4 and above) > **Internal Customer API upgrades:** We've released V2 of our Customer API, now available to all Shopify stores (and in June we'll move the other platforms over). For customers who are already using the V1 Customers API, you can continue to use the V1 API for the next 6 months till the 1st of December 2026. The upgrade path is straightforward, and we’ll provide more information about the changes soon. ## April 2026 ### Version 4.4 **New features** **A better way to onboard customers.** SparkLayer Forms is a flexible way to capture, review, and manage B2B information at every stage of the customer lifecycle — from first enquiry through to ongoing account management or even a contact form for your site. It includes a workflow editor (on the Growth plan and above) that can tag customers automatically, make API calls to push new customers to your ERP, or even approve customers automatically when their tax ID is validated. See [Form workflow automations](https://docs.sparklayer.io/help/forms/workflows.md). Learn more in [Forms](https://docs.sparklayer.io/help/forms.md). **Catalogs** [B2B Catalogs](https://apps.shopify.com/sparklayer-b2b-catalogs) is a free SparkLayer app (for Shopify) that gives you control over which products are visible to different types of customers on your Shopify store. Whether you want to hide specific products from B2C customers, restrict certain items to B2B customers only, or show different product ranges to different customer groups - B2B Catalogs makes it easy to manage from your Shopify admin. ![Catalogs – What's new](https://docs.sparklayer.io/images/help/whats-new/20260415-044949-f663ef.webp) **Sales agents' roles.** Sales agent roles let you control what each sales agent can see and do in SparkLayer - so the right people have the right level of access. Instead of managing permissions individually, you can create reusable roles and assign them across your team. Available for anyone with sales agents. Learn more in [Sales agent ordering](https://docs.sparklayer.io/help/sales-reps/roles.md). ![Sales agents' roles. – What's new](https://docs.sparklayer.io/images/help/whats-new/whats-new-3aa228.webp) **Custom email domain** Improve brand recognition and deliverability with support for custom "from" email addresses (e.g. [store@mail.yourstore.com](mailto:you@yourstore.com)), helping ensure notifications match your brand. Available on Pro and Enterprise plans. Learn more in [Timeline & communications](https://docs.sparklayer.io/help/customers/timeline.md). ![Custom email domain – What's new](https://docs.sparklayer.io/images/help/whats-new/20260401-105203-fe967c.webp) **Improvements** - **Dashboard Customers and Sales Agent page** - New and improved visibility for customers, customers syncing and sales agents. - **Disable specific email templates -** Through a minor template change, it is possible to disable a email template and this could be actioned based on logic. Learn more in [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md). - **Package level invoicing for Xero/Quickbooks** - Invoices are now shown at package level rather than multiple invoices shown at the order level. - **Company Users** is now available for all plans. ## March 2026 ### Version 4.3 **Improvements** - **Shopify Company support -** SparkLayer will automatically place orders under the correct Shopify company when a customer is attached to one. Learn more in our full guide, [Shopify Companies](https://docs.sparklayer.io/help/platforms/shopify/companies.md) - **Multilingual Shopify Shipping support -** Support for multilingual shipping names when using Shopify shipping. ## February 2026 ### Version 4.1 **New features** **Payment Visibility within SparkLayer** Cut down on support admin by letting your customers check their financial standing themselves. ![Payment Visibility within SparkLayer – What's new](https://docs.sparklayer.io/images/shared/payment-methods-959870.webp) This new feature provides real-time account balances, payment statuses, and transaction histories directly in the My Account area. To read more see [Payment Methods](https://docs.sparklayer.io/help/ordering/payment-methods.md). ![Payment Visibility within SparkLayer – What's new](https://docs.sparklayer.io/images/shared/payment-methods-aa78f8.webp) The key elements: - Payment status is now visible within the order listing and the order details tab (Paid, Unpaid, Partially Paid) - Transactions are now visible within the timeline section of the order. - The balance shown in the Account section has now been updated based on payments. This feature can be enabled easily via the [SparkLayer Dashboard](https://app.sparklayer.io/configuration/settings/general). Compatible with Shopify, Xero, and QuickBooks Online. **Improvements** - **Speed, Polish, and Performance Upgrades** (Version 4+) - **Speed Boost:** Enjoy snappier loading for products, carts, and accounts thanks to smarter caching. - **Visual Polish:** A cleaner, more refined look across the interface with improved layouts, spacing, and typography. - **Better Shopping Flows:** More reliable cart updates, smoother reordering, and a simplified quantity selector. - **Accessibility & Fixes:** Upgraded screen reader support, better right-to-left (RTL) language layouts, and a solid round of bug squashing. - **Dashboard Price Lists and Customer Groups page** - New and updated design for the price lists and customer groups page, we'll be rolling out more pages in this design over the coming months. - **Improved Product Selection Dropdowns -** Invalid selections on Product Details Page dropdowns are now hidden rather than disabled, creating a cleaner interface for your customers. (Version 3.17.0+) ## January 2026 ### Version 3.15 **Improvements** - **Discounts - Exclude Specific Customers** Discounts can now exclude specific customers using email addresses or accounting IDs, giving more control over who can use each promotion. [Learn more about discounts](https://docs.sparklayer.io/help/pricing/discounts.md) - **Quotes - New Email Notifications** We’ve added three new quote emails that the customer will receive, to make it clearer when a quote has been created or updated: - First response from a Sales Agent to a quote request - Subsequent quote updates made by a Sales Agent - New quote created by a Sales Agent and sent to a customer See the [complete list of quoting emails and their triggers](https://docs.sparklayer.io/help/ordering/quoting.md#email-notifications-sent). ## December 2025 ### Version 3.14 **New features** **Xero and QuickBooks Online integrations announced** We announced SparkLayer's Xero and QuickBooks Online integrations. They're now live, on the Pro plan and above: see [Xero](https://docs.sparklayer.io/help/integrations/accountancy/xero.md) and [QuickBooks Online](https://docs.sparklayer.io/help/integrations/accountancy/quickbooks.md). ![Xero and QuickBooks Online integrations – What's new](https://docs.sparklayer.io/images/help/whats-new/20251212-105928-20ef78.webp) **Timeline & Communications** Timeline & Communications has expanded beyond Quotes and is now available across **all supported order types**. Messages, internal notes and order updates are brought together in one clear, chronological timeline, giving your team and customers a unified place to track communication and activity as orders progress. The result is a consistent, streamlined experience - whether you’re managing standard B2B orders, quotes, or draft orders created by Sales Agents. Learn more in [Timeline & communications](https://docs.sparklayer.io/help/customers/timeline.md)**.** ## November 2025 ### Version 3.14 **New features** **Dashboard Design Updates** We’ve refreshed the SparkLayer Dashboard with a streamlined sidebar that makes navigation simpler, faster, and more organised. ![Dashboard Design Updates – What's new](https://docs.sparklayer.io/images/shared/get-started-272f13.webp) - **Customer and Product Sync** now sit under **Integrations**, alongside platform connection, Partner Integrations, and Widgets. - **Discounts** is now grouped with **Pricing**, alongside price lists and Price Editor, reducing clutter and keeping pricing tools together. The result is a **cleaner layout** and **clearer structure** that lets you focus on what matters most - your store’s performance. **Improvements** - **Stock Display - Option to hide pre-order status** A new configuration within customer groups allows you to hide the “pre-order” stock status from customers. ## October 2025 ### Version 3.14 **New features** **Quote Status Improvements** You can now **filter quotes by individual status**, giving you greater granularity and control when managing quotes. Previously shown in a single view, quotes can now be broken down by stage for easier tracking and follow-up. ![Quote Status Improvements – What's new](https://docs.sparklayer.io/images/help/whats-new/20251105-144324-8344e6.webp) Custom statuses are automatically included, and a new chevron indicator shows when more filters are available to scroll through. Statuses have also been reordered to reflect logical quote progression for a smoother workflow. **Shipping Restrictions by State/Province** You can now limit shipping methods to specific **states or provinces** within the US, Australia and Canada, allowing more precise regional control. This makes it easier to tailor delivery options, manage exclusions, and align shipping availability with your operational areas. ![Shipping Restrictions by State/Province – What's new](https://docs.sparklayer.io/images/help/whats-new/20251028-152712-cb7733.webp) You can configure this directly under **Settings → Shipping Methods.** **Improvements** - **Quotes - CC Notifications to Child Company Users** Quote notifications sent to parent company users now CC child company users to keep both informed. - **AI Cart Import - Support for Multiple SKU Columns** AI Cart Import now supports files with multiple SKU columns (e.g. vendor SKU and product SKU) and auto-detects the correct one. - **Cart - Display Unit of Measure** Products with a single unit of measure now show it directly on the cart line item, without needing to hover. Looking for older updates? Browse releases from June 2022 to September 2025 in the [release archive](https://docs.sparklayer.io/help/whats-new/archive.md). --- # Release archive URL: https://docs.sparklayer.io/help/whats-new/archive SparkLayer release notes from June 2022 to September 2025, including the Quoting Engine launch, the BigCommerce integration and barcode support. SparkLayer release notes from June 2022 to September 2025, newest first. For the last 12 months of updates, see [What's new](https://docs.sparklayer.io/help/whats-new.md). ## September 2025 ### Version 3.12 **Improvements** - **Shopify - Languages: support for product data translations** SparkLayer now has the ability to sync product data translations and show product data in the customer's language. This is currently only supported for Shopify stores. Please contact us if you'd like us to enable it on your store. [Learn more about languages and custom text](https://docs.sparklayer.io/help/storefront/languages-and-international.md) - **Shopify - Number of Cart Lines Supported** Previously we had a limit of 250, we now support 350 line items or 500 line items (by request due to the performance of the Shopify APIs). - **BigCommerce - Support for Combined Order Limit Rules** You can now use both SparkLayer’s product minimum and maximum order limit rules alongside the native BigCommerce rules, giving greater order management flexibility. - **BigCommerce - Support for Custom Order Visible ID** You can now use a custom order ID instead of the standard BigCommerce-generated ID. This is useful for matching order numbers with back-office systems (e.g. ERP) to ensure consistency across platforms. - **BigCommerce - Discount Rules Based on Product Properties** Discount rules can now check additional BigCommerce product properties when determining if a discount should be applied, such as; categories, brand ID, condition, UPC and search keywords. - **Wix - Removal of RRP Field from Sync** The RRP field has been removed from syncing to prevent it from displaying on frontend widgets. A product resync will be required for the change to take effect. - **Barcodes - Available on Invoices, Quotes & Emails** You can now add barcodes on Invoices, Quote PDFs and emails. - **Sales Agent - “Submit Quote” button update** Sales Agents will now see a “Submit Quote” button instead of “Request Quote” during the quoting process, making the action clearer. - **SparkLayer Core Script - Enhanced Error Codes** Error codes have been added for custom SparkLayer Options hook issues, making it easier for you to identify and resolve the cause of errors more quickly. - **Activity Section - Quote Status Update** The Activity section now shows the “Quote Status” instead of “Quote”, with the column below displaying the actual status (e.g. _Awaiting merchant”_). - **ERP Integration updates - Cin7, Brightpearl, Linnworks & Unleashed** Our ERP integrations have been improved so you can now view connection status, last sync, and any issues via **Settings → Integrations → Partner Integrations**, making it easier to resolve data syncing problems. ## August 2025 ### Version 3.10 **Improvements** **Use custom order IDs** It's now possible to use a **custom order ID** instead of the standard order ID generated from Shopify. A typical use-case is customising the Order ID to match order numbers generated from a back-office system (e.g. an ERP), ensuring consistency across systems. ![Use custom order IDs – What's new](https://docs.sparklayer.io/images/shared/metafields-e314b4.webp) When the "Visible ID" is set, this will then take effect when the customer views their orders from the [My Account Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md). To enable this, please see [Shopify metafields & data mapping](https://docs.sparklayer.io/help/platforms/shopify/metafields.md). **Show a message at a cart line-item level** ![Show a message at a cart line-item level – What's new](https://docs.sparklayer.io/images/shared/custom-slots-de8752.webp) Extending upon our [Custom Slots ("Targets")](https://docs.sparklayer.io/help/storefront/interfaces/custom-slots.md) , you can now display a custom slot on a cart line-item level, such as a message that references the product name and ID ("slug"). This gives a powerful new way to add further customisation to the shopping cart for your B2B customers. ## July 2025 ### Version 3.10 **New features** **Discount Engine Improvements** ![Discount Engine Improvements – What's new](https://docs.sparklayer.io/images/help/whats-new/kn0yv9zxguvbursdd4omw-20250721-110750-57b425.webp) We're excited to announce a range of major improvements to the SparkLayer [Discount Engine](https://docs.sparklayer.io/help/pricing/discounts.md), including the ability to: - Set advanced requirements and rewards. [Learn more about discounts](https://docs.sparklayer.io/help/pricing/discounts.md) - More extensive "free products" promotions. [Learn more about discounts](https://docs.sparklayer.io/help/pricing/discounts.md) The updates now allow you to configure discounts that apply on more advanced criteria such as matching a specific "tag" or "vendor" (within Shopify), and the ability to set rewards that include multiple free products. These changes now position SparkLayer as having one of the most advanced B2B promotions engines available - we look forward to seeing how creative our customers will be using this! [Learn more about discounts](https://docs.sparklayer.io/help/pricing/discounts.md) **Improvements** - **Invoices - Option to display RRP** You can now choose to show the Recommended Retail Price (RRP) on SparkLayer [Invoices](https://docs.sparklayer.io/help/ordering/invoices.md), giving your customers greater visibility on pricing. - **Cart - Clearer messaging when stock is limited** Customers will now see clearer messaging if they try to add more items to their cart than are available in stock, helping reduce confusion during the ordering process. ## June 2025 ### Version 3.9 **New features** **Katana Integration** We're excited to announce our official integration with Katana, a leading inventory management solution! ![Katana Integration – What's new](https://docs.sparklayer.io/images/shared/tgn0yj2ee6vnbjszw86st-20250604-124134-bb1039.webp) If you're using Katana to manage your back-office operation, you can now integrate your B2B pricing and customer data directly with SparkLayer. Learn more in [Katana](https://docs.sparklayer.io/help/integrations/erps/katana.md) **Onboarding Landing Page** A great way to encourage your customers to use your new B2B store is to **explain the benefits**. To help you get started, you can use our ready-made "onboarding landing page" that gives a great overview of the features to your customers. [Learn more about launching SparkLayer](https://docs.sparklayer.io/help/get-started/launching.md) ![Onboarding Landing Page – What's new](https://docs.sparklayer.io/images/shared/launching-8eca09.webp) **Improvements** - **My Account - Tax Display** When a customer places an order, they can now see their full tax breakdown when viewing their order details within the [My Account Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md) - **Shopify - New Customer Accounts URL redirect** If you're using Shopify Customer Accounts, you can now configure which URL to send a customer to directly via your Shopify admin. In your Shopify admin, go to Settings, Checkout, and within [Configurations](https://admin.shopify.com/settings/checkout#checkoutprofiles), click "Customize" and you'll see a new field "Redirect Path" within the "B2B Customers Redirect" extension. - **Checkout – Support for Tax ID Requirements** Merchants can now collect the required tax ID details at checkout, ensuring orders to countries with strict import rules can be completed in Shopify. [Learn more about cart and checkout options](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md) - **CSV file upload** When importing a CSV file into the [My Cart Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md), products will be added to the cart in the same order as listed in the CSV file. - **New Languages** We now have support for Latvian on the [Frontend Interfaces](https://docs.sparklayer.io/help/storefront/interfaces.md) - **Duplicate Discounts** It's now possible to create multiple discounts with the same configurations, making setup faster for similar pricing rules. [Learn more about discounts](https://docs.sparklayer.io/help/pricing/discounts.md) - **Checkout - Option to disable** You can now fully disable the checkout process and only show the "Request Quote" option, ideal for quote-only workflows. [Learn more about customer groups](https://docs.sparklayer.io/help/customers/customer-groups.md) - **Sales Agent - Auto sign-in after Customer Creation** Sales agents are now automatically signed in as the customer after creating them, removing the need to search and impersonate separately. ## May 2025 ### Version 3.9 **New features** **SparkLayer Intelligent Cart** SparkLayer Intelligent Cart introduces a revolutionary new way for your B2B customers and sales teams to build orders quickly and effortlessly using the power of AI. The magic lies in its simplicity: files and emails containing order details (such as SKUs, barcodes, and quantities) can be uploaded or emailed directly to SparkLayer, instantly creating a shopping cart. In addition, live barcode scanning is supported, providing powerful, fast ways to build orders without manually browsing and searching for product. Learn how Intelligent Cart works in [Intelligent Cart (AI)](https://docs.sparklayer.io/help/ordering/intelligent-cart.md). ### Version 3.8 **New features** **Cart Search** We've just given our search tool a massive upgrade, making it even easier for your customers to add items to an order! The Search tool allows customers to **search by a range of criteria** including product name, product SKU, product variant name, SKU, and barcode. The tool also handles mis-spellings and "partial matching", ensuring results are delivered where possible and allowing for a more user-friendly search. To learn more about how it works and how to enable it, see [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md). ## April 2025 ### Version 3.7 **New features** **The SparkLayer Quoting Engine** We’re excited to announce the launch of the new [SparkLayer Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md) , designed to transform how your sales team and wholesale customers manage quotes. ![The SparkLayer Quoting Engine – What's new](https://docs.sparklayer.io/images/help/whats-new/6wzpfqy98oz0zjrjdicgl-20250412-131624-0fc46a.webp) Built to simplify the entire "quote-to-order" process, it helps reduce manual work, speed up order conversion, and create a better buying experience. With the [SparkLayer Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md), you can: - Let customers build and submit quote requests directly from your store - Enable your sales team to edit quotes, apply discounts, and set expiry dates - Keep all communication in one place with a shared conversation timeline - Seamlessly convert approved quotes into ready-to-process orders - Notify customers and sales teams automatically with emails and special workflows - ... and a lot more! Whether you’re handling high-volume B2B orders or need more control over pricing negotiations, the [SparkLayer Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md) brings everything into one streamlined flow, all designed to save time, reduce friction, and strengthen customer relationships. If you'd like to give it a try, head over to the [plan page in the SparkLayer Dashboard](https://app.sparklayer.io/settings/plan) where you can add it to an existing plan or as an exclusive addon. You can also learn more about how it works in [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md). **Improvements** - **Integration with Intuitive Shipping** We've released our new integration with shipping application, [Intuitive Shipping](https://docs.sparklayer.io/help/integrations/customer-experience/intuitive-shipping.md) making it even easier to connect SparkLayer to their dynamic shipping rate solution - **Pre-orders and stock display** We've improved how stock is shown in the [My Cart Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) when a product is on pre-order. If a customer orders more than is in active stock, it will now clearly show what stock is available and what is on pre-order ![Pre-orders and stock display – What's new](https://docs.sparklayer.io/images/help/whats-new/whats-new-4b0e53.webp) ## March 2025 ### Version 3.7 **New features** **SparkLayer Analytics** We're excited to announce a major advancement in how you can report on your B2B sales and performance! We’ve partnered with the leading analytics experts, Conjura, to add unparalleled operational and sales visibility to your SparkLayer account. ![SparkLayer Analytics – What's new](https://docs.sparklayer.io/images/help/whats-new/sparklayer-screen-42a38c.webp) Learn more about [SparkLayer analytics](https://www.sparklayer.io/analytics/), where you can also arrange a demo to see how it can fit your business needs. **Automatic metafield creation** Metafields are a powerful way to customise the functionality of your B2B store, allowing you to configure additional data such as [pack sizing](https://docs.sparklayer.io/help/storefront/quantity-rules.md), [rrp prices](https://docs.sparklayer.io/help/pricing/pricing-display.md), and much more. With our latest update, we've made it really easy to quickly add metafields to your Shopify store without needing to manually configure them within your Shopify admin. ![Automatic metafield creation – What's new](https://docs.sparklayer.io/images/help/whats-new/sparklayer-metafields-4a2782.webp) To get started, head over to the [SparkLayer Dashboard](https://app.sparklayer.io/configuration/integrations/platform) or learn more in [Metafields](https://docs.sparklayer.io/developers/data/metafields.md). **Improved Shopify B2B Login Page** We've greatly improved our free [Shopify B2B Registration & Login](https://docs.sparklayer.io/help/platforms/shopify/customisations/registration-and-login.md) template, making it really easy for you to add a login and signup form to your Shopify store. ![Improved Shopify B2B Login Page – What's new](https://docs.sparklayer.io/images/help/whats-new/sparklayer-screen-0d8c65.webp) The improvements include full control over the design and content, the ability to set different actions when a customer applies, and much more! Learn more in [Shopify B2B registration & login](https://docs.sparklayer.io/help/platforms/shopify/customisations/registration-and-login.md) **Improvements** - We've added the following additional [Custom Slots ("Targets")](https://docs.sparklayer.io/help/storefront/interfaces/custom-slots.md) - Cart Shipping Step - Cart Payment Step - Account > Purchase Summary Header - Account > Purchase Summary Footer - For our SDK, we've added a `onCartLoad`as an additional function that can be used when the cart is loaded. Read more in [SDK guide](https://docs.sparklayer.io/developers/javascript-sdk/guide). ### Version 3.6 **New features** **Sales Agents - Add custom item** We've released a major improvement to our [Sales Agent Ordering](https://docs.sparklayer.io/help/sales-ordering.md) tool that your sales team are going to love - the ability to add custom items to a B2B order! ![Sales Agents - Add custom item – What's new](https://docs.sparklayer.io/images/help/whats-new/sparklayer-screen-ecce87.webp) Our new "Add custom item" feature lets your sales agents add additional items to a customer's order that sit outside of your general product catalogue. Use-cases could include adding custom instructions or details specific to an order, additional products (that don't have a specific SKU), or any custom item that needs to be associated with an order. Items can be added at a specific cost or at a zero cost value. Learn more in [Sales agent ordering](https://docs.sparklayer.io/help/sales-ordering.md) **Improvements** - **My Account - Order details** When viewing an order from the [My Account Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md), products that have variants (e.g. colour, size) will show the full variant information (previously this wasn't visible). ## February 2025 ### Version 3.5 **New features** **SparkLayer Invoices** It's here... one of our most requested features of all time has arrived: _SparkLayer Invoices!_ The [SparkLayer Invoices](https://docs.sparklayer.io/help/ordering/invoices.md) feature allows you to automatically generate professional invoices that your customers can easily download, directly from their My Account. ![SparkLayer Invoices – What's new](https://docs.sparklayer.io/images/help/whats-new/vwiz0lwyo92ypypy7v2fu-20250215-114518-718676.webp) SparkLayer's invoicing feature **removes the need** for third-party invoicing tools or apps and offers a seamless way to manage and share invoices with your B2B customers. Once you've enabled invoices via the setting detailed above, the process for viewing and downloading invoices is simple for your customers: they view and download them from **My Account**. Interested in trying out SparkLayer Invoices? Learn more in [Invoices](https://docs.sparklayer.io/help/ordering/invoices.md). ### Version 3.3 **New features** **Shipping discounts** It's now possible to set shipping discounts when using SparkLayer [Discounts](https://docs.sparklayer.io/help/pricing/discounts.md)! This has been one of our most requested features for our Discount Engine, and it gives you the option to set a range of different shipping discount types. From percentage off and fixed discounts, through to setting a specific shipping cost when the discount is applied. ![Shipping discounts – What's new](https://docs.sparklayer.io/images/help/whats-new/sparklayer-screen-c10fd0.webp) Using this feature does require enabling the SparkLayer [shipping system](https://docs.sparklayer.io/help/ordering/shipping-rules.md) and you can learn more in [Discounts](https://docs.sparklayer.io/help/pricing/discounts.md). **Improvements** - **Sales Agents - Creating New Customers** For Sales Agents with "Administrator" privileges, when inviting a new customer via SparkLayer, it's now possible to disable the "Invite" email that is sent to the customer. This is available for all merchants using Shopify. Learn more in [Sales agent ordering](https://docs.sparklayer.io/help/sales-ordering.md) ### Version 3.2 **New features** **Show RRP prices only (for in-store shopping)** If you manage orders in physical locations with customers (e.g. in store), it's possible to enable a setting that sets the SparkLayer [Frontend Interfaces](https://docs.sparklayer.io/help/storefront/interfaces.md) to **only** show the RRP (MSRP) prices when browsing and adding items to an order. This is especially useful if you need to "obscure" your B2B prices from view and you only want to show the full retail prices. Use-cases could include: - In-store customer visits where an order needs to be placed and the customer must only be able to see the retail (RRP) prices - Sales teams who are placing orders on behalf of customers (e.g. on the road) and only the retail (RRP) prices must be seen Learn more about how this works in [How prices are shown](https://docs.sparklayer.io/help/pricing/pricing-display.md). ## January 2025 ### Version 3.1 **New features** **Sales agents - custom shipping methods** One of the most requested features for our [Sales Agent Ordering](https://docs.sparklayer.io/help/sales-ordering.md) tool is to allow sales agents to make changes to the shipping costs during the checkout. We've now released the ability for sales agents to set custom shipping prices for any orders they place on behalf of their customers. To learn more about how this works, see [Sales agent ordering](https://docs.sparklayer.io/help/sales-ordering.md). **Order searching and filtering by date** It's now possible for B2B customers to search and filter orders by date range within the [My Account Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md). This is a great way to quickly see orders based on specific criteria and time period, making it easier to keep track of order activity. ![Order searching and filtering by date – What's new](https://docs.sparklayer.io/images/help/whats-new/whats-new-54155f.webp) To see this in action, click "View All" within "Recent Activity" and you'll see the option to search and filter your orders. **Improvements** **Mobile layout improvements** We've made improvements to the [Cart & Checkout](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md) to better support smaller (mobile) devices. When a B2B customer is using SparkLayer on these devices, the interface will now show more line items and offer an easier way to navigate between checkout steps. ![Mobile layout improvements – What's new](https://docs.sparklayer.io/images/help/whats-new/whats-new-2dbb07.webp) **Shopify - improved handling of B2B prices** > **Please note** > > From 1st February 2025, this feature is enabled by default. If you started using SparkLayer before this date and you'd like to enable this on your Shopfy store, please [contact us](https://docs.sparklayer.io/help/support.md) and our team will action this for you. > > This is an optional feature and it is not mandatory to enable. We've improved how SparkLayer handles pricing in Shopify, removing the need for B2B pricing to be applied as a "discount". When a B2B customer now places an order, the price shown against a product will exactly match the B2B pricing you set via SparkLayer [Pricing](https://docs.sparklayer.io/help/pricing.md). To illustrate the difference, the screenshot below shows how pricing was calculated previously (using a discount against the line item product price) ![Shopify - improved handling of B2B prices – What's new](https://docs.sparklayer.io/images/help/whats-new/whats-new-322fa5.webp) With the latest change, the price shown will exactly match your B2B pricing without needing to apply a discount. ![Shopify - improved handling of B2B prices – What's new](https://docs.sparklayer.io/images/help/whats-new/whats-new-baca9d.webp) **Shopify - support for new customer accounts** If you're using [Shopify](https://docs.sparklayer.io/help/platforms/shopify.md) and you'd prefer to use Shopify's new "Customer Account" feature, SparkLayer is now fully compatible. This means that SparkLayer can now work with Shopify stores that use either new "Customer Accounts" or classic "Legacy Accounts". To learn more, read [Installing SparkLayer on Shopify](https://docs.sparklayer.io/help/platforms/shopify/install.md). ## December 2024 ### Version 2.1.0 **New features** **Change ownership status in the Dashboard** If you have multiple users invited to your [Dashboard](https://docs.sparklayer.io/help/dashboard.md), you can now easily transfer ownership to another user. This is especially useful if you're initially setting up SparkLayer and you want another user to manage the ongoing account management. ![Change ownership status in the Dashboard – What's new](https://docs.sparklayer.io/images/help/whats-new/whats-new-a8febb.webp) To learn more about how this works, head over to [Account settings](https://docs.sparklayer.io/help/dashboard/account.md). ## November 2024 ### Version 2.1.0 **New features** **Integrating Google Analytics with SparkLayer** If you're looking to track key events in Google Analytics (GA4) or Google Tag Manager (GTM) through SparkLayer, you can now set this up directly in your integration. This will help you capture valuable B2B events like "add to cart" "checkout," and "purchase" actions. Learn more in [Technical information](https://docs.sparklayer.io/developers/frontend/technical-information.md) **New Email Notifications for Company Users** We've now added the ability for Company Users to receive emails when "Limited Users" submit an order for a review. Email notifications are sent to both the "main" and "limited" Company Users at key stages of the order review process, without requiring them to be logged in. You can learn more about how this works in [Company users](https://docs.sparklayer.io/help/customers/company-users.md) ## October 2024 ### Version 2.0.8 **New features** **Product Matrix Interface** We've introduced a major update to our [Frontend Interfaces](https://docs.sparklayer.io/help/storefront/interfaces.md) that now lets you convert your product pages into a special "product matrix" table view, making it even easier for your customers to order products! If your products come in multiple variant types (e.g. colour and size), it's a great way to allow customers to quickly see all variants available and purchase them. To learn more about how this works, please see [Product matrix](https://docs.sparklayer.io/help/storefront/interfaces/product-matrix.md). **Order details** When viewing an order within the [My Account Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md), if an order has more than 10 unique items, a "View all" link will now show allowing the customer to see all items in one go. ![Order details – What's new](https://docs.sparklayer.io/images/help/whats-new/whats-new-ead74d.webp) ## September 2024 ### Version 2.0.2 **New features** **Custom checkout fields - support for new fields** If you need to collect additional data from your B2B customers during the checkout, our [custom checkout fields](https://docs.sparklayer.io/help/ordering/checkout-fields.md) now supports the ability to add drop-down menus ("select" menus). For example, you may want to give customers a list of options to choose from to include in their order and it's even possible to group the options with different headings. You can learn more about how this works in [Cart & checkout](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md). **Stock display improvements** > **Please note** > > This feature requires being on the latest version of SparkLayer. To benefit from our latest updates, please upgrade your [SparkLayer Core Script](https://docs.sparklayer.io/developers/frontend.md). It's possible to display [stock levels](https://docs.sparklayer.io/help/storefront/stock-display.md) to your B2B customers when they browse your store, giving them visibility of your inventory. Our latest update now gives you even more flexibility and has a number of major improvements. ![Stock display improvements – What's new](https://docs.sparklayer.io/images/help/whats-new/whats-new-1bdd8a.webp) Firstly, it's now possible to display stock levels on a per-customer group basis. For example, you may have some customer groups that you don't want to show inventory to or you may want to configure specific stock settings. You can also now hide and show the specific inventory count and just show a stock status (e.g. `In stock` versus `In stock [100 available].`) Beyond this, we've also simplified how you can manage max/low/last stock levels and you can learn more in [Customers](https://docs.sparklayer.io/help/customers.md). **Improvements** - **My Account Addresses** When adding or editing an address within the My Account area, the `First Name` and `Last Name` fields are now mandatory. ## August 2024 ### Version 1.36.16 **New features** **Line Item Tax Support** ![Line Item Tax Support – What's new](https://docs.sparklayer.io/images/help/whats-new/screenshot-2024-08-27-at-190553-b1a385.webp) If you sell products that have different tax requirements, you'll like our latest update! We've just released full support for "line item tax", ensuring your B2B customers see fully accurate tax calculations when checking out. This feature is ideal if you have more complex tax requirements for your catalogue (e.g. you're selling coffee, children's clothing, or products that have varying tax obligations). You can see a full overview of how it works in [How tax works at checkout](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md). **Improvements** - **Sales Agents within the SparkLayer Dashboard** Based on customer feedback, we've made it easier to access Sales Agents within the SparkLayer Dashboard. You'll see this in the main navigation when signing in, or you can [open Sales Agents in the SparkLayer Dashboard](https://app.sparklayer.io/sales-agents). ## July 2024 **New features** **B2B Discount Engine!** It's here... our most request feature EVER! The [SparkLayer Discount Engine](https://docs.sparklayer.io/help/pricing/discounts.md). Our new Discount Engine immediately unlocks a range of discount rules, with more to come in the future. Right now, you'll be able to set up: - **Order-level discounts:** eg, spend $1,000 and get 10% off, spend $2,000 and get 15% off - **Percentage and fixed discounts:** eg, 20% off an order total, $100 off an order total - **Coupon codes:** eg, enter code NEWCUSTOMER and get 5% off - **Scheduled discounts:** eg, start discount today and end it on a specific date and time - **Customer-specific discounts:** eg, only allow customer group ‘b2b-vip’ qualify for the discount You can see a full overview of what’s possible in [Discounts](https://docs.sparklayer.io/help/pricing/discounts.md). **Custom slots (add custom code)** Custom slots have arrived! You can now add custom code to a range of the SparkLayer [Frontend Interfaces](https://docs.sparklayer.io/help/storefront/interfaces.md) allowing you to customise the B2B experience for your customers. It's a great way to further enhance your B2B customer experience and use-cases could include displaying promotional messages, links to pages within your store, and much more! [Learn more about custom slots](https://docs.sparklayer.io/help/storefront/interfaces/custom-slots.md) **Improvements** - **Purchase history re-ordering** When viewing the Purchase History in the [My Account Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md), you can now add individual items directly to any order ## June 2024 **New features** **File uploads (checkout and product-level)** We're excited to announce the launch of one of our top 5 most requested features, file uploads! As of today, your B2B customers can now upload file attachments during the checkout process, allowing you to capture additional information such as Purchase Orders, custom files (e.g. for personalisation) and much more. And there's more! In addition to file uploads during the checkout, you can now configure product-level file uploads! Learn more in [Cart & checkout](https://docs.sparklayer.io/help/ordering/checkout-fields.md). **Stock location support ("inventory locations')** As brands scale their operations and build out more advanced inventory management processes, it’s very common to see multiple ‘locations’ where inventory is managed. This could be based on geographic location (eg by country) or by more niche use cases specific to a brand’s internal workflows, like routing stock based on what type of customer is ordering. ![Stock location support ("inventory locations') – What's new](https://docs.sparklayer.io/images/help/whats-new/whats-new-19c4c4.webp) Stock locations allow you to specify which stock (or "inventory") locations you want your B2B customers to use stock from. If your B2B store is set up with **multiple stock locations** (e.g. by geography), it's a great way to ensure your B2B customers are purchasing stock from the correct locations. Learn more in [Customers](https://docs.sparklayer.io/help/customers.md) ## May 2024 **New features** **New Customer Groups interface** We've just released a major improvement to the [Customers](https://docs.sparklayer.io/help/customers.md) area of the [SparkLayer Dashboard](https://app.sparklayer.io/customers/groups), making it easier to manage your B2B customer rules! We've completely reworked how your customer groups are displayed with a new and improved way to quickly manage all your customer groups settings from one place. The update also includes new visibility of "customer group inheritance", allowing you to see which rules are being used from another customer group. Head over to the new [Customer Groups area](https://app.sparklayer.io/customers/groups)! **Improvements** - **Price list improvements:** It's now possible to set up a price list to support a 100% discount against an automatic price source (e.g. your Shopify retail prices). This is useful if you have a requirement to allow specific B2B customers to purchase products at a zero-rated cost (e.g. $0.00) - **My account credit limits now support multi-currency** If you're store is set up to allow multiple currencies for your B2B customers and you're using [credit limits and account balances](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md), you can now configure these specific to the customer's currency (e.g. GBP, EUR, USD) ## April 2024 **New features** **Product Customisations** If you sell products that require "customisations" such as custom text or any other unique requirements, you'll like our latest update! We've just released the ability to support customised products via the SparkLayer JavaScript SDK. This allows your B2B customers to add customised text to products within their order and the information is sent through to your eCommerce platform when an order is placed. ![Product Customisations – Release archive](https://docs.sparklayer.io/images/shared/product-display-f2514f.webp) > **Please note** > > This is an advanced configuration of SparkLayer and will require a developer to implement on a store that requires this feature. Please refer to our JavaScript SDK for full details. **"Draft order" visibility in My Account** We've just released a major improvement to the [My Account Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md) that gives your B2B customers much better visibility on orders they place. Previously, if a customer placed an order via payment methods such as "Pay on Account" or "Pay by Invoice" these wouldn't show in the My Account until the order was marked as "Completed". Now, as soon as an order is placed, these will show with a new status "Awaiting Merchant". !["Draft order" visibility in My Account – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/archive-fa8204.webp) When you (the merchant) completes the order, these will then change to standard order statuses such as "Processing", "Shipped", etc. You can learn more about order status in [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md). **Improvements** - **Purchase numbers to support new order types** Inline with the "Draft order visibility in My Account" above, you can now set "Purchase numbers" to indicate orders that are currently in review. [Learn more about dashboard settings](https://docs.sparklayer.io/help/dashboard/settings.md) - **Support for Shopify web pixels** SparkLayer now supports the new [Shopify web pixel tracking system](https://admin.shopify.com/settings/customer_events). This will in time replace the need to use the [SparkLayer checkout script](https://app.sparklayer.io/configuration/frontend/checkout) when implementing SparkLayer on Shopify. - **Language support for Japanese** We've added Japanese as an option in our available [languages](https://docs.sparklayer.io/help/storefront/languages-and-international.md). ## March 2024 **New features** **Company Order Approvals** We're excited to announce a major update to our [Company Users](https://docs.sparklayer.io/help/customers/company-users.md) functionality: order approvals that let teams set role-based permissions! ![Company Order Approvals – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/archive-c4bc07.webp) Via our [Company Users](https://docs.sparklayer.io/help/customers/company-users.md) feature, B2B customers can invite colleagues and set powerful role-based controls on what they can and can’t do (e.g. some can add items to an order, whereas others can complete the order to be fulfilled). _Please note, this feature will be launched later in March._ **Sales agent order history** We've released a much requested improve to our [Sales Agent Ordering](https://docs.sparklayer.io/help/sales-ordering.md) feature. Sales Agents can now view recent order history pertaining to customer accounts they manage. When a sales agent logs in, they'll see this new section on the sales agent search interface. ![Sales agent order history – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/archive-4bfdbe.webp) **Sales Agent - Setting overwrites** It's now possible for Sales Agents (with "Administrator" access) to overwrite product settings such as pack sizing and min/max product quantities. When signed in as a customer, free form quantities can be entered to increment or decrement the line item level quantities. Learn more in [Sales agent ordering](https://docs.sparklayer.io/help/sales-ordering.md). **My Cart - CSV file upload** If your customers make use of the [CSV file upload feature](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md), they can now upload CSVs using a **barcode** as the primary identifier. This works in addition to use a SKU. ![My Cart - CSV file upload – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/archive-e919eb.webp) **Improvements** - **My Cart - show stock status** If you've configured SparkLayer to [show stock levels](https://docs.sparklayer.io/help/storefront/stock-display.md), the [My Cart Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) will automatically show the stock status for any items added. It's a great way to give customers more visibility of the specific inventory levels of items in their order. - **Product Card - Hide Prices** It's now possible to hide the total price from showing on the [Product Card Interface](https://docs.sparklayer.io/help/storefront/interfaces/product-card.md) if you'd prefer to keep this hidden. [Learn more about product display](https://docs.sparklayer.io/help/storefront/product-display.md) - Product Stock - Hide inventory count If you have [Stock Display](https://docs.sparklayer.io/help/storefront/stock-display.md) turned on, you can now selectively hide the specific inventory count from showing. [Learn more about stock display](https://docs.sparklayer.io/help/storefront/stock-display.md) - **Dashboard Price List - upload multiple CSV files** It's now possible to upload multiple CSV price lists at once when managing your B2B price lists. [Learn more.](https://docs.sparklayer.io/help/pricing/managing-pricing.md) - **Cin7 Core integration - multi-currency** We've upgraded our Cin7 Core integration to now better support stores that have a multi-currency setup. Please contact our support team to learn more. - **Loading interfaces** We've improved the loading interfaces that show when the [Frontend Interfaces](https://docs.sparklayer.io/help/storefront/interfaces.md) first load on a page, making for a smoother experience. ## February 2024 **New features** **Dashboard usability improvements** As part of our ongoing improvements to the [SparkLayer Dashboard](https://app.sparklayer.io/), we've released our first major update to make managing your B2B configurations even easier. For the [Price Lists](https://docs.sparklayer.io/help/pricing.md) and [Shipping](https://docs.sparklayer.io/help/ordering/shipping-rules.md) sections of the dashboard, you'll see a new and improved way to create and manage your settings with our new "slide out" feature. In the very near future, we'll be rolling out a brand new [Customer Groups](https://docs.sparklayer.io/help/customers/customer-groups.md) section that will bring some major improvements to how you manage your B2B customers. Stay tuned! **"Purchase status" improvements** Under the hood, we've made some major improvements to how SparkLayer handles "purchases" (essentially orders that can have different statuses). This will allow SparkLayer to handle purchase types such as orders that may require review (e.g. a Draft order), orders that may require approval, and a range of other statuses that may be relevant to your B2B operation. In next month's update, we'll be sharing how this works and what it will unlock for our customers! **Improvements** - **Frontend interfaces - "Cart" terminology** We've updated the terminology for "Order" to "Cart" to make it more obvious to customers that products are added to a shopping list. This change will apply to any buttons and titles used in the [Frontend Interfaces](https://docs.sparklayer.io/help/storefront/interfaces.md). This text can also be modified should you want to adjust to anything else. [Learn more about languages and custom text](https://docs.sparklayer.io/help/storefront/languages-and-international.md) - **Frontend Interfaces - Notifications** We've improved the display of notifications within the frontend interfaces for actions such as "success", "information", and "warning" messages, ensuring a more consistent look and feel. ## January 2024 **New features** **Purchase history reports** Our headline update this month is the release of our new My Account reporting tool that gives your B2B customers even easier (and faster!) ways to place B2B orders! The first report we've released is the new "Purchase history by time period" which gives customers a breakdown of all products they've purchased over a period of time (e.g. by quarter, by month, by week). The best part? In a matter of clicks, they can re-order an entire range of products and then proceed through the checkout to complete their order. It's a great way to allow your customers to more rapidly repeat-order and easily see products they've purchased from your store. [Learn more about the My Account interface](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md) **Custom payment method messaging** On the final step of the [My Cart Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md), Review & Pay, it's now possible to display a "custom payment messages" that let you add additional details about a payment method. ![Custom payment method messaging – Release archive](https://docs.sparklayer.io/images/shared/cart-and-checkout-455f26.webp) For example, if a customer is paying by "Pay by Invoice", you could add some additional text to inform them on how this process works. [Learn more about cart and checkout options](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md) **Improved messaging within the My Account and My Order** When your B2B customers haven't completed certain actions (e.g. placed an order, saved a shopping list), we've improved the messaging and how this looks to give a more consistent feel and experience. You'll see the same style of "empty state" messaging appear in both the [My Account Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md) and [My Cart Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md). ![Improved messaging within the My Account and My Order – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/archive-ef2b35.webp) **Improvements** - **Sales Agents - "Recently Access Accounts"** When a sales agent logs in, they can now see their most recently accessed accounts, making it easier to login as a customer (this works based on their browser session). - **Sales Agents - Search improvements** We've extended the sales agent customer search to now include additional data sources: the default billing postcode (Zip code), first line of address, and city - **Sales Agents - Customers created by sales agents** When a sales agent now creates a new customer on the fly, this will automatically assign any "b2b" tags assigned to the sales agent themselves. This now makes it easier to filter and segment by sales agent created customers within Shopify or BigCommerce. - **My Account - Order History "RRP" pricing** When viewing an order within the My Account area, if a product has [RRP pricing](https://docs.sparklayer.io/help/pricing/pricing-display.md) configured, you'll see this show next to the main B2B price. - **Price Lists - support for 4 decimal places** When setting up an automatic price list (e.g. 50% off your retail prices), you can now specify up to 4 decimal places (e.g. 24.1245%) - **Product Cards - selectively hide variant drop-downs** By default, the [Product Card Interface](https://docs.sparklayer.io/help/storefront/interfaces/product-card.md) will show any variants (such as colour and size) and allow the customer to change them. If you'd prefer, you can now hide specific variant groups you don't want to show, giving you more flexibility on what's shown to your customers. [Learn more about product display](https://docs.sparklayer.io/help/storefront/product-display.md) ## December 2023 **New features** **Barcode support** We're pleased to announce the launch of one of our most highly requested features, barcode support! If you're using barcodes within your eCommerce platform (e.g. Shopify), you can now display these to customers via our [Frontend Interfaces](https://docs.sparklayer.io/help/storefront/interfaces.md) and even allow customers to search by barcode in the [My Cart Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md). ![Barcode support – Release archive](https://docs.sparklayer.io/images/shared/my-cart-3e9c40.webp) You can also take this a step further and integrate SparkLayer with your barcode scanning system, to really automate the creation of B2B orders. To learn more about activating barcodes, read [How products are shown](https://docs.sparklayer.io/help/storefront/product-display.md). **Unit of measure pricing** SparkLayer now supports the option to configure your pricing with **units of measure**, allowing you to offer discounted prices based on specific purchasing quantities. It's a great way to allow customers to order in pre-defined units such as boxes, pallets, or cases. When setting these up, you can then specify how pricing works for these specific units, as well as handle units that 'fall outside' these. Learn more in [Quantity pricing & settings](https://docs.sparklayer.io/help/pricing/quantity-pricing.md) **Improvements** - **Quantity price display in the My Order widget** If you have [quantity pricing](https://docs.sparklayer.io/help/pricing/quantity-pricing.md) set up, customers can now see the details of how quantity pricing works directly from the [My Cart Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) - **My Order CSV Import** You can now overwrite the default column headers in the CSV file import available to customers in the [My Account Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md). This allows you to overwrite the default `sku` and `qty` that is currently available. Learn more in [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) - **Product percentage savings** If you're using [quantity pricing](https://docs.sparklayer.io/help/pricing/quantity-pricing.md), you can now customise how the "Savings" column handles percentage savings with the option to add additional decimal places (e.g. 33.12% off instead of 33% off) - **Messaging consistency** We've improved messaging within the [My Cart Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) so that any actions that add items to an order (e.g. a CSV file import, a shopping list), the customer will be shown a notification message informing them if any products cannot be added ## November 2023 **New features** **Custom shipping messages** A common use-case we see with our customers is shipping rates needing updating after an order is placed. Perhaps you need to perform your own checks on the order or negotiate the final shipping cost. Our latest update to our shipping system allows you to set "custom messages" against shipping rules, allowing you to give more visibility to your B2B customers should the shipping costs need amending. ![Custom shipping messages – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/archive-ef81c3.webp) You can learn more about how custom shipping messages work in [Shipping rules](https://docs.sparklayer.io/help/ordering/shipping-rules.md). **Product Page "All Variants" Mode** If your products come in multiple variant types (e.g. colour and size), you're going to like this update! You can now enable a special "All Variants" mode on the [Product Detail Interface](https://docs.sparklayer.io/help/storefront/interfaces/product-detail.md) that allows your B2B customers to see all available variants in one go. Learn more in [How products are shown](https://docs.sparklayer.io/help/storefront/product-display.md). **Order Limits by Quantity** Alongside the ability to set [order total limits](https://docs.sparklayer.io/help/customers.md) for your B2B customers, you can now set **order quantity limits**! For example, you may require customers to have a minimum of 100 items in their order before they can checkout, or they cannot purchase more than 1,000 items. ![Order Limits by Quantity – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/archive-4ee9ff.webp) Our latest update allows you to set order quantity limits for any of your [Customer Groups](https://docs.sparklayer.io/help/customers/customer-groups.md) and you can even combine order quantity and order total rules! [Learn more about customer groups](https://docs.sparklayer.io/help/customers/customer-groups.md) **Improvements** - **CSV Import - messaging** We've improved the feedback messaging customers see if not all items in a [CSV file import](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) can be added to an order, allowing them to scroll the list of affected products if the list is very long - **Price Lists - auto-assigning** If you're creating a price list for the first time, you can choose to 'auto-assign' the price list to your default B2B customer group - **Product widgets - RRP text styling** You can now additional text styling to the [RRP price](https://docs.sparklayer.io/help/pricing/pricing-display.md) such as adding a strike-through or customising the colour. You can now use new CSS variables `--spark-pricing-rrp-decoration `and `--spark-pricing-rrp-color` ## October 2023 **New features** **BigCommerce Integration** It's here... the SparkLayer & [BigCommerce](https://docs.sparklayer.io/help/platforms/bigcommerce.md) integration! Now BigCommerce merchants can integrate SparkLayer into their eCommerce stores and benefit from our feature-rich B2B solution. We're very excited to be part of the BigCommerce ecosystem and continue our mission to help brands grow their B2B businesses! Learn more in [BigCommerce](https://docs.sparklayer.io/help/platforms/bigcommerce.md). **Sales Agents Improvements** We’re pleased to announce a range of major updates to our Sales Agent tool, that now makes it an even more powerful tool for B2B sales teams to use. And for merchants looking at levelling-up their B2B processes, it’s now even easier to onboard their sales team and bring more automation to their B2B processes. Let’s dive into the new features! _1.Inline Price Editing_ Our built-in powerful B2B pricing engine lets customers see their exact B2B pricing rules when they login. However, what if a Sales Agent needs to make an ad-hoc change to a price or apply a discount to a range of products in one go? With our instant price editing feature, Sales Agents can now edit pricing “inline”, allowing them to edit prices in real-time before placing an order. Learn more in [Sales agent ordering](https://docs.sparklayer.io/help/sales-ordering.md) _2. Create new customers_ This new feature lets Sales Agents rapidly add a new customer and begin placing orders for them right away. It’s particularly useful if a Sales Agent is on the road meeting new customers, or at a trade show needing to place orders there and then with a customer. Learn more in [Sales agent ordering](https://docs.sparklayer.io/help/sales-ordering.md) _3. Place Sales Agent Orders_ Now, Sales Agents can not only add products to their personal orders but also complete the checkout process independently. Whether it's for buying a product for an upcoming customer demonstration or making a personal purchase at a preferential rate, this update now gives them the ability to do this! > **Please note** > > The above [Sales Agent Ordering](https://docs.sparklayer.io/help/sales-ordering.md) updates are available to all customers on the Growth, Pro, and Enterprise plans. **Improvements** - **Product widgets - Dark Mode** We've extended the available design customisations for customers using the [dark mode](https://docs.sparklayer.io/help/storefront/customising-design.md) look and feel for the SparkLayer product page widgets - **Shipping - Percentage of Net Total** You can now set shipping rates based on a percentage of the customer's order total, e.g. 20% - **Dashboard - Team Invitations** We've made inviting team members easier with a new, streamlined process for becoming part of a team. [Learn more about account settings](https://docs.sparklayer.io/help/dashboard/account.md) - **My Order - Product SKU search** We've updated the user interface for the SKU search on the [My Cart Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) to display a new icon (a plus symbol instead of a search icon) - **Error messages now have reference codes** If you ever encounter an error saying "Sorry, an unknown error has occurred", this will now include a reference code number. You can see the list of common error codes in [Troubleshooting](https://docs.sparklayer.io/help/troubleshooting.md)/ ## September 2023 **New features** **Shopify Onboarding Dashboard** If you're using your Shopify admin to keep tabs of your SparkLayer installation process, you'll like our latest update! We've now greatly improved the interface, making it easier to see the key onboarding steps, learn about available features, and quickly access the main [SparkLayer Dashboard](https://app.sparklayer.io/) to complete your onboarding process. **Restricting billing address modifications** By default, you can allow customers to [edit and manage addresses](https://docs.sparklayer.io/help/customers/account-and-addresses.md) via their My Account area. If you'd prefer to restrict them from editing their billing address, you can now enable this via the [Configurations area](https://app.sparklayer.io/configuration/settings/general) of the SparkLayer Dashboard. ![Restricting billing address modifications – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/archive-eb4ee4.webp) **Improvements** - **Product widgets - single variant products** If you have single variant products on your website, you can now display the full variant name in the [table-view mode](https://docs.sparklayer.io/help/storefront/product-display.md) - **CSS styling controls** We've now added the ability to customise the "Order Complete" checkmark icon colour that shows to customers once an order is placed - **Price Lists admin** If you now try to download a "manual price list" that hasn't had prices uploaded, you'll be prompted with a message (rather than downloading a blank file previously) ## August 2023 **New features** **Checkout address editing** We're pleased to announce one of our most requested features - checkout address editing! Customers can now add new addresses directly from the [My Cart Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md), making it even faster to choose shipping addresses and complete an order This new feature can also help streamline and compliment any drop-shipping activities your customers may be doing. To learn more about how it works, see [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md). **Set minimum and maximum order limits** To add more flexibility to your ordering rules, we've now released the ability to set both minimum and maximum order requirements for your customer groups. Based on the rules you set, you can now more easily restrict customers from being able to checkout until they meet the order requirements. To learn more, see [Customers](https://docs.sparklayer.io/help/customers.md). **Custom checkout message** On the final step of the [My Cart Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md), Review & Pay, it's now possible to display a "custom checkout message" that lets you inform customers of any special notes or information they need to be aware of. ![Custom checkout message – Release archive](https://docs.sparklayer.io/images/shared/cart-and-checkout-4650c1.webp) It's a great way to highlight information about shipping, payment, or anything else! [Learn more about cart and checkout options](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md). **Improvements** - **My Order - displaying RRP price** If you've set up [rrp pricing](https://docs.sparklayer.io/help/pricing/pricing-display.md) for your products, you can now display the RRP price within the [My Cart Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) - **My Order - selecting a payment method** If a customer has pre-selected a payment method (e.g. Pay by Invoice) and subsequently makes changes to their order, the payment method will now be pre-selected (rather than resetting back to the default payment method) - **Product widgets - handling for "Unavailable"** If all variants of a product are set as "Unavailable" (i.e. they have no B2B pricing set), the [Product Detail Interface](https://docs.sparklayer.io/help/storefront/interfaces/product-detail.md) and [Product Card Interface](https://docs.sparklayer.io/help/storefront/interfaces/product-card.md) will now hide the "Add to Order" button from showing to a customer - **Product cards - improved handling for variants** If your products have multiple levels of variants (e.g. colour and size), the [Product Card Interface](https://docs.sparklayer.io/help/storefront/interfaces/product-card.md) will now only show available variants based on availability and "disable" variants that cannot be added to an order - **My Account - "Financials" section** If you have [credit terms](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md) set up for your B2B customers but you'd prefer to hide the "Financials" section from the [My Account Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md), you can now do this via a new configuration. [Learn more about the My Account interface](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md) - **Dashboard - Shipping** You can now more easily edit and delete shipping rules directly from the [Shipping](https://docs.sparklayer.io/help/ordering/shipping-rules.md) area of the SparkLayer Dashboard ## July 2023 **New features** **Display custom fields within the My Account** Within the [My Account Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md), it's now possible to show "custom fields" allowing you to add additional information that you want your B2B customers to see. For example, you may want to include details of their sale agent contact, website address, or anything else! ![Display custom fields within the My Account – Release archive](https://docs.sparklayer.io/images/shared/my-accountarea-5631ae.webp) Setting custom fields for the My Details area works in a very similar way to the [custom checkout fields feature](https://docs.sparklayer.io/help/ordering/checkout-fields.md) and you can learn more in our [Account & addresses](https://docs.sparklayer.io/help/customers/account-and-addresses.md). **Upload invoices to an order** When viewing an order, in addition to the order details (such as products ordered, order status, address), it's now possible to attach an invoice against an order that the customer can subsequently download. ![Upload invoices to an order – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/order-3fd566.webp) Once the invoice has been uploaded, your customers can then view the invoice by viewing their order details within the [My Account Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md). ![Upload invoices to an order – Release archive](https://docs.sparklayer.io/images/shared/quickbooks-0dd422.webp) You can learn more about how to set this up in [Credit, net terms & invoicing](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md). **Improvements** - **Price lists - clearing prices** You can now "clear" price lists within the [SparkLayer Dashboard ](https://app.sparklayer.io/pricing)for any price lists that you've manually uploaded (via a CSV). This is especially useful if you want to remove existing price list data and re-upload it. - **My Order - uploading CSV data** Within the [My Cart Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md), you can now paste in CSV data to quickly populate an order. This works alongside the existing CSV file upload feature. Learn more in [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md). - **Product cards - display stock level and SKU** Within the [Product Card Interface](https://docs.sparklayer.io/help/storefront/interfaces/product-card.md), you can now optionally display a live stock level and SKU (product code). [Learn more about product display](https://docs.sparklayer.io/help/storefront/product-display.md) - **Checkout validation** You can now define more granular rules for validating whether a customer is allowed to proceed to checkout. Learn more in out JavaScript SDK. ## June 2023 **New features** **Integration with experience platform, Pack** ![Integration with experience platform, Pack – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/article-pack-794709.webp) Speed and performance have always been at the heart of how we’ve built SparkLayer: from how we manage the complexities of B2B pricing in a scalable way, through to ensuring that the end B2B customer gets the smoothest possible experience when placing orders online.Today, we're thrilled to announce our latest partnership that takes this a step further, as we launch our official integration with Pack! [Learn more about](https://www.sparklayer.io/blog/2023/05/18/sparklayer-pack-headless-shopify-b2b/) our partnership. **Configure net payment terms more easily** We've just made setting customer net payment terms even easier! If you're using the SparkLayer "Pay on Account" payment method, you can now set up specific net payment terms for a customer and have this automatically populate the payment terms in Shopify. ![Configure net payment terms more easily – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/2023-05-20-08-38-15-311953.webp) **Improvements** - **Address book - phone numbers** When adding an address in the My Account area, you can now optionally make customers specify a phone number. This will then be included in the customer's details if they proceed to place an order - **Address book - billing & shipping address** When adding an address in the My Account area, customers can now specify if they want the address to be their default Billing and/or default Shipping address. This is useful if they require different addresses when placing an order ## May 2023 **New features** **The new B2B Price Engine** ![The new B2B Price Engine – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/article-92a406.webp) We’re excited to announce the launch of one of our most anticipated updates, our new Price Engine that gives SparkLayer customers powerful new ways to automate and streamline their B2B pricing rules! ![The new B2B Price Engine – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/price-list-bfee2b.webp) Previously, SparkLayer gave customers the ability to manage pricing via CSV uploads and, for more complex integrations, automating pricing via the SparkLayer API. With the new Price Engine, SparkLayer customers can now: - Use pricing from their eCommerce platform (e.g. Shopify) to create automatic B2B pricing (e.g. set B2B prices to be 20% off Shopify prices) - Set up automatic pricing based off other price lists (e.g. 50% off your default price list) - Quickly download price lists to make edits and then easily re-upload - Edit pricing “inline" with our Price Editor Tool - Import manual prices more quickly, with a major performance boost Learn more in our [recent announcement](https://www.sparklayer.io/blog/2023/04/17/b2b-pricing-system/) or see how it works in [Pricing](https://docs.sparklayer.io/help/pricing.md). **Improvements** - **Product widgets** You can now optionally display the RRP prices anywhere on your storefront with our new RRP price widget - **Performance improvements** We've made a range of improvements under the hood to speed up the process of importing pricing into SparkLayer ## April 2023 **New features** **The new Price Editor** The **Price Editor** tool compliments the pricing import tool, allowing you to easily add and edit pricing in a more "ad hoc" manner. For example, perhaps you need to edit a single price for product and add a new one, and you'd prefer not to upload a new CSV file to do this. ![The new Price Editor – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/2023-04-03-08-32-12-2d4711.webp) The Price Editor tool works by letting you search for a product SKU and then edit and add pricing inline, allowing you to rapid modify your B2B pricing. Our team has been busily working on our major pricing engine update (coming soon!) and we've also released the following improvements. **Improvements** - **Languages** We've added support for Hebrew and Georgian to the SparkLayer Frontend. See all languages we support. - **SDK updates** If you're using our JavaScript SDK to build more custom interfaces, you can now reference the total weight of an order. This is useful if you want to hide/show messaging based on a customer's order contents reaching a certain weight threshold. - **Performance improvements** We've made a range of improvements under the hood to speed up the process of importing pricing into SparkLayer ## March 2023 **New features** **Checkout Custom Fields** Checkout Custom Fields give you the ability to capture additional information from the customer when they checkout. We've released two enhancements that give even more flexibility to how you set these up as well as new ways to display this data to customers. ![Checkout Custom Fields – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/archive-ebbc4e.webp) It's now possible to set validation rules within Checkout Custom Fields allowing you to apply restrictions to fields such as dates (for example, blocking customers from selecting a weekend). ![Checkout Custom Fields – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/archive-43a5f7.webp) **Improvements** - **Data Sync area** We've released a new area to the SparkLayer Dashboard called Data Sync that combines both product and customer data sent from Shopify. - **Payment methods** It's now possible to change the order that payment methods show during the checkout as well as set the default. - **Stock level key** You can now display the stock level key on desktop by using the CSS variable `--spark-pdp-stock-key-desktop: flex` - **Cart notification** You can optionally hide the progress bar by using the CSS variable `--spark-toast-animation-display: none` ## February 2023 **New features** **Company Users** It's here! One of our most anticipated product updates, Company Users, is now available! Company Users is a brand new tool that’s designed to improve the B2B purchasing and account management flow within an organisation. Sometimes referred to as "B2B account management", it allows companies to create teams of users (i.e. _Company Users_) that can share specific actions within their account. ![Company Users – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/article-b2b-company-users-21ad3e.webp) From placing orders and tracking their status, repeat ordering previous orders, through to creating shopping lists and sharing address books. What sets the SparkLayer Company Users tool apart is how simple it is to use. Inline with our approach to make the B2B experience self-service, customers themselves can create their own teams right from within their My Account area. There’s no need to request the store owner to manage this on their behalf, the customers themselves have full control over the process. Learn more about Company Users. **Improvements** - **Multi-currency support** We've made some major improvements to how SparkLayer works with Shopify Markets/multi-currency meaning you can manage this all within a single Shopify store. - **My Account Re-ordering** When viewing a completed order in the My Account area, it's now possible to re-order items on a product-by-product basis. - **The SparkLayer Dashboard** We've made a number of interface improvements including the ability to edit and delete customer groups. ## January 2023 **New features** **DEAR Systems Integration** We’re pleased to release our latest integration with DEAR Systems. DEAR Systems has long held the reputation as being the system of choice for established and fast-growing brands, providing a centralised location to manage inventory, orders, warehousing, fulfilment, accounting, and more. ![DEAR Systems Integration – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/dear-b031dd.webp) The SparkLayer integration works by connecting to the merchant's DEAR Systems account to access B2B data such as product pricing and price lists as well as synchronising B2B customer data. **Improvements** - **SparkLayer Quick Order** Customers will now see a running total of ‘lines’ and ‘items’ next to the sub-total. This makes it easier for them to see the size of their B2B order - **Dark mode** For merchants using a ‘dark’ theme, we’ve Improved support for dark mode on collection pages - Right-to-Left mode: SparkLayer now supports countries/languages that require “right-to-left” (or RTL) - **Language editing** We’ve made it easier to manage language updates with a simpler way to add text overwrites within your storefront - **Language translation support** We’ve added support for Romanian and Arabic. ## December 2022 **New features** **1-click Shopify B2B theme install** If you're using SparkLayer on Shopify, you may be aware of Shopify's latest theme, [Dawn](https://themes.shopify.com/themes/dawn/styles/default). With our new 1-click B2B theme install, any merchant using SparkLayer can now _instantly_ install our B2B-optimised version of the Shopify Dawn theme and get up and running with their B2B store in a matter of minutes. Best of all, **no code changes are required** to set this up. ![1-click Shopify B2B theme install – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/archive-9986ba.webp) It's a great way to test how SparkLayer works before installing it on a live Shopify theme or you could even use it as the basis for your next B2B store! To get started, go to the [SparkLayer Dashboard](https://app.sparklayer.io/configuration/frontend/core). **Improvements** - **Product page widget** The product page widget currently shows a special 'table' view for products that have variants (e.g. size, colour). You can now render the same 'table' view for single variant products by adapting the product widget code. - **Product settings** We've updated our documentation on product settings including how it's possible to set products (and variants) to not be "sellable" to B2B customers and even how to fully hide products (and variants) from showing with a special "display" setting. - **Tiered pricing** By default, if you have tiered pricing set up, the pricing will be applied across all variants of a product. You can now set this to only apply to specific variants via a new setting within the SparkLayer Dashboard. - **Pack sizing** The product detail page widget now supports a 'Pack price' that gives customers a cost for all products within a pack. - **Product widgets customisations** We've enabled additional design customisation settings including button and input styling. - **Line item limits** With Shopify's line item limit of \~ 250 items, we've now included special notifications within the SparkLayer Quick Order if customers exceed this limit - **Dashboard product data** You can now search by SKU within the Data look up tool in the SparkLayer Dashboard. - **Brightpearl integration** We've made improvements to the handling of customer address syncing for BrightPearl, including phone numbers and company names. ## November 2022 **New features** **Configure "custom dates" for backorder products** With support already for backordering/pre-ordering built into SparkLayer, we’re excited to announce our latest update, "custom dates" that can be set for backorder products."Custom dates" allow you to set an exact date when the product is expected to be available. It’s a great way to give the end customer better visibility of when to expect receipt of the products on order, and helps deliver an overall better customer experience. ![Configure "custom dates" for backorder products – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/backorder-due-date-pdp-3bb9c4.webp) Use-cases could include: - Setting a "due in" date of when you're expecting the product to be in stock - Setting an "estimated shipping" date of when you're expecting the product to ship **Improvements** - **Product page tiered pricing** If you're using tiered pricing, the information table shown to customers on a product page will now include pack sizing. For example, if your tiered pricing starts at 6 units, this will be shown as the first in the list. - **Product page widget** We've improved the interface of the product page widget to hide the initial variant dropdown if a product only has a single option within it. - **Product card variants** If a product has variants that don't have prices assigned, these will be shown last in the purchasing dropdown on the product card widget - **My account area** If you're using our account balance feature, you can now optionally hide any reference to 'credit' if you don't set a credit limit against a customer. - **CSV import** The SparkLayer Quick Order Interface now has improved messaging for customers using the CSV import tool, making it clearer when a product isn't able to be imported due to stock limitations. ## October 2022 **New features** **Custom Fields during the checkout** Our latest update includes the much anticipated 'custom fields' feature that allows you to add **additional** data capture fields during the checkout process. ![Custom Fields during the checkout – Release archive](https://docs.sparklayer.io/images/shared/cart-and-checkout-2c7bcf.webp) Use-cases could include: - A date capture field, e.g. "Shipping" or "Delivery" date - Purchase order number (PO number) - Additional Shipping requests Custom fields has support for the following types of data capture: Text entry fields, Select menus (i.e. drop downs), Date selection, Email, Phone, and more. **Improvements** - **Price lists deletion** You can now delete price lists directly from the SparkLayer price list admin - **Total quantity of items** The SparkLayer Quick Order Interface will now show the total units in a customer's order (i.e. total quantity) before checking out - **Customer credit and payment on account** If you have customer credit enabled, you can now allow customers to optionally be able to checkout using Payment on Account (previously this was blocked for customers who exceed their credit limit) - **We've partnered with Balance payments** to offer Buy Now and Pay Later for B2B merchants using Shopify. Learn more ## September 2022 **New features** **Quick Buy Mode** Our new Quick Buy Mode gives you a new way to display the SparkLayer product widget on your collection pages with an optimised 'table' view. ![Quick Buy Mode – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/archive-ed2f8a.webp) **Improvements** - **Back-order, minimum stock level** If you're using the backorder feature, it's now possible to set granular minimum stock levels at a product variant level giving you more flexibility on how many units you allow to be sold to customers. - **Product variant images** If you've product images within Shopify that are assigned to a product variant (e.g. colour), it's now possible to change the images shown to a customer when a variant is selected via SparkLayer. This is a manual change, if you would like this enabled please contact us - **Cart line item limit** We've increased the maximum line items available in a single order from 100 to 250, with customer-friendly messaging should customers exceed this. Languages: we've added support for new languages, Norwegian and Finnish ## August 2022 **New features** **B2B shipping rules** If you've set up SparkLayer on your B2C (DTC) website and need to create different shipping rules for your B2B customers, you can now do this via the SparkLayer shipping tool. ![B2B shipping rules – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/archive-082b30.webp) **Improvements** - **Address display** We've improved visibility of shipping addresses and customers can now see their selected address just before they complete their order. The address summary will show in the final order totals section of the SparkLayer Quick Order Interface - **CSV importing** We've made improvements to our CSV import tools, with handling for different currency formats. For customers uploading price lists in Euros for example, the import will now support comma formats for pricing (such as 19,99) - **Performance** We've released a big performance improvement to the frontend, with a more rapid login process. We've re-engineered how our user authentication works and merchants should now see a much quicker log in process when a B2B customer signs in. ## July 2022 **New features** **Show product settings** If you've configured your products to work with settings such as pack sizing or minimum and maximum quantities, you can now display this to customers anywhere where you show the SparkLayer product interface. Once enabled, this will show a new 'Qty rules apply' message that will show all associated product rules you've set up. ![Show product settings – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/archive-59e243.webp) ![Show product settings – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/archive-59002d.webp) **Show order notes from My account overview** If customers place an order and include a special note (e.g. PO number), this can now be viewed from the My account overview page ![Show order notes from My account overview – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/archive-725bf2.webp) **Improvements** - **Shopping list names** If a customer creates a new shopping list and uses the same name as an existing one, this will now fully overwrite it instead of creating a duplicate - **My account ship-to address** You can now show the shipping address for an order from the My account overview page. ## June 2022 **New features** **Show tiered pricing on product cards** If you're using tiered pricing, you can now display the discount summary within the product card widget. The product card will now _optionally_ display the cheapest price to the customer as well as the maximum discount they could receive. The customer can also mouse-over the widget to see a fully summary of the tiered pricing available. You can test out how it works [on our demo store](https://shopify-demo.sparklayer.io/pages/b2b-login-register) ![Show tiered pricing on product cards – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/archive-0a3f73.webp) **My Account order tracking information** If you supply shipping information against a customer's order within Shopify, this will now be shown within the SparkLayer My Account interface when viewing an order. The tracking information includes - A link to the shipping company's own tracking page - The specific tracking number for the customer's visibility ![My Account order tracking information – Release archive](https://docs.sparklayer.io/images/help/whats-new/archive/archive-3386a5.webp) **Improvements** - **Address searching** If B2B customers have large numbers of addresses saved against their address book, they can now use a special search box to more easily select their preferred address. - **Multi-currency support** For merchants using a custom ERP solution, we can now enable multi-currency on the same Shopify instance. This is currently restricted only to manual payments only (e.g. Payment by Invoice, Request for Quote) and does require technical investigation before enabling. - **JavaScript SDK** For merchants using our SKD, we've added some additional events including 'on cart update'. --- # Get started URL: https://docs.sparklayer.io/help/get-started Set up SparkLayer with the five-step Setup checklist: create a price list, assign it to a customer group, invite a buyer, then add SparkLayer to your theme. > **Quick summary** > > - Setup is 5 steps on the **Setup** checklist at **Home > Setup** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/)), or **SparkLayer Wholesale > Setup** in the Shopify app: 3 in SparkLayer (a price list, a customer group and your first buyer) and 2 for your theme. Most stores finish in under 15 minutes. > - Want to see SparkLayer as a buyer first? [Try it out](https://docs.sparklayer.io/help/get-started/launching.md#place-a-test-order) places a test order on your own store that doesn't count towards your plan. > - The Setup checklist is built around Shopify. On BigCommerce, Wix, WooCommerce or Magento, start with your platform's install guide: see [Other platforms](#other-platforms). If price lists and customer groups are new to you, read [How SparkLayer works](https://docs.sparklayer.io/help/get-started/how-sparklayer-works.md) first. It explains the ideas these steps rely on in a few minutes. Not sure where to start? Answer 4 quick questions and get [your own setup guide](https://docs.sparklayer.io/help/get-started/setup-guide.md): the guides that apply to your store, in the order you need them. ## Before you start - **SparkLayer installed on your store.** On Shopify, install the **SparkLayer Wholesale** app: see [Install SparkLayer on Shopify](https://docs.sparklayer.io/help/platforms/shopify/install.md). On other platforms, see [Other platforms](#other-platforms). - **Your B2B prices, or the rule for them**, for example 20% off your retail prices. A spreadsheet of prices by SKU is fine. - **An email address for your first buyer**: a real trade customer, or an address of your own to test with. ## How setup works The 5 Setup steps: 1. **1. Price list**: The prices your B2B customers see 2. **2. Customer group**: Decides which buyers see that price list 3. **3. First buyer**: Added, and sees trade prices when they sign in 4. **4. Theme**: SparkLayer added to your theme 5. **5. Publish**: The theme is live for your customers The **Setup** page lists the steps in 2 groups: **SparkLayer setup** (steps 1 to 3) and **Theme setup** (steps 4 and 5, for your Shopify theme). Each step shows **Complete** or **To do**, based on your store's data. A step ticks itself off once it's done, however you did it. | Version | Where to find Setup | | --- | --- | | **Shopify app** | **Setup**, in the menu under **SparkLayer Wholesale** in your Shopify admin. | | **SparkLayer Dashboard** | On **Home**, click **Open Setup** on the **Get your first wholesale order** card. There's no Setup item in the menu. | **The setup card on Home** Until your first order comes in, **Home** shows a **Get your first wholesale order** card. It has the same 5 steps, a progress bar and a **Next** box with the next step's button. After your first order, the card becomes **Get live with SparkLayer** until every step is complete. You can minimise or dismiss the card. The steps are always on the Setup page. ## Work through the steps ### Step 1. Set up a price list Price lists set the prices your B2B customers see. On the step, click **Create a price list**. **More detail** You can also go to **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app and click **Create price list**. A price list can be worked out from your retail prices (for example, 20% off), uploaded as exact prices by CSV, or sent from another system. The free Basic plan includes 3 price lists. See [Managing pricing](https://docs.sparklayer.io/help/pricing/managing-pricing.md). ### Step 2. Assign a price list to a customer group Customer groups decide which price list a buyer sees when they sign in. Click **Open customer groups**, open a group and choose its **Price list**. **More detail** Customer groups are at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app. Every store starts with a **Base customer group**, whose settings every B2B customer gets. That's enough to get going. Create more groups when some buyers need different prices, payment methods or a minimum order. See [Customer groups](https://docs.sparklayer.io/help/customers/customer-groups.md). ### Step 3. Add your first buyer Click **Invite a buyer** , enter their email, choose a **Customer group** and click **Send invite** . They see your trade prices as soon as they sign in. The step completes once any customer group has customers. To add them yourself, tag them `b2b` in your Shopify admin (see [Add B2B customers on Shopify](https://docs.sparklayer.io/help/platforms/shopify/invite-customers.md)), or approve a registration form entry in [Forms](https://docs.sparklayer.io/help/forms.md). **More detail** The invite adds the buyer to your store with the group's tag, such as `b2b-trade`. In the Shopify app, Shopify emails them an invite and they sign in with a one-time code. In the SparkLayer Dashboard, SparkLayer sends its own invite with a **Create trade account** button. To share a sign-up link instead, click **Copy registration link**. See [Invite a buyer](https://docs.sparklayer.io/help/customers/invite-buyers.md). ### Step 4. Add SparkLayer to your theme SparkLayer adds its B2B pricing, cart and account area to your Shopify theme. On most themes, this is set up for you. Click **Review theme setup** to check each block. On other platforms, add the widgets as your platform guide describes: see [Other platforms](#other-platforms). **More detail** **Shopify only:** The theme steps apply to the theme chosen under **Select theme**. Your published theme is marked **Active**. [Theme setup](https://docs.sparklayer.io/help/platforms/shopify/theme-setup.md) shows which SparkLayer blocks are on, and opens the theme editor at any of them. If something isn't right, our team installs SparkLayer for you, free. Click **Something not right? Install SparkLayer for me** there, or **Request installation** at **Storefront > Widgets** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/frontend/core)), or **SparkLayer Wholesale > Storefront > Widgets** in the Shopify app. ### Step 5. Publish your theme Publish the theme you set SparkLayer up on. The step completes when that theme is published and active for your customers. **More detail** **Shopify only:** If you set SparkLayer up on a copy of your theme, publish that copy in your Shopify admin at **Online Store > Themes** ([open in the Shopify admin](https://admin.shopify.com/themes)). When all 5 steps are complete, Setup shows **You're ready to go with SparkLayer**. Next, place a test order with [Try it out](https://docs.sparklayer.io/help/get-started/launching.md#place-a-test-order), then work through the [Launch checklist](https://docs.sparklayer.io/help/get-started/launching.md). > **We can set it up with you** > > On every plan, our team installs the storefront widgets for you, free, usually within days. On a paid plan, an onboarding session can also set up your first price lists with you. Click **Book setup call** at the top of Setup, or **Book free setup** on Home. To message our team, click **Chat with support** at the top of Setup. See [Contact support](https://docs.sparklayer.io/help/support.md). ## Other platforms On BigCommerce, Wix, WooCommerce and Magento, setup follows the same idea in a different order. The Setup checklist in the SparkLayer Dashboard is only for Shopify stores. 1. **Install SparkLayer** and connect your store with your platform's guide: [BigCommerce](https://docs.sparklayer.io/help/platforms/bigcommerce/install.md), [Wix](https://docs.sparklayer.io/help/platforms/wix/install.md), [WooCommerce](https://docs.sparklayer.io/help/platforms/woocommerce/install.md) or [Magento](https://docs.sparklayer.io/help/platforms/magento/install.md). 2. **Set up a price list** at **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app, as in [step 1](#set-up-your-b2b-pricing). 3. **Assign it to a customer group** at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app, as in [step 2](#set-up-your-customer-groups). 4. **Mark your B2B customers** in your platform: a BigCommerce customer group whose name starts with `B2B`, the `b2b` label on Wix, a **SparkLayer B2B** role on WooCommerce, or a **B2B:** customer group on Magento. See [Customer groups](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#assign-customers-to-a-customer-group). 5. **Add the widgets** to your theme as your platform guide describes. Our team can do it for you, free: see [Request free installation](https://docs.sparklayer.io/help/support.md#request-free-installation). 6. **Test, then launch** with the [Launch checklist](https://docs.sparklayer.io/help/get-started/launching.md). ## Optional: connect your other systems You don't need this to get started. On the Pro plan, you can send price lists, customer rules and product data, such as pack sizes, from an ERP, CRM or other system. This is usually a job for your developer or integration partner, using the [SparkLayer API](https://docs.sparklayer.io/developers/api.md). Create an API key at **Settings > API** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/api)), or **SparkLayer Wholesale > Settings > API** in the Shopify app, or use a ready-made [integration](https://docs.sparklayer.io/help/integrations.md). ## Next steps - [Try our demo](https://docs.sparklayer.io/help/get-started/demo.md): See SparkLayer as a B2B buyer on our demo store, with nothing to set up - [Launch checklist](https://docs.sparklayer.io/help/get-started/launching.md): Test, invite your first customers and go live - [Contact support](https://docs.sparklayer.io/help/support.md): Book a setup call or contact our team --- # Your setup guide URL: https://docs.sparklayer.io/help/get-started/setup-guide Answer 4 quick questions about your store and get a setup guide made for you: the SparkLayer guides you need, in order, to tick off as you go. > **Quick summary** > > - Answer 4 quick questions about your store, prices, customers and systems. It takes about a minute. > - You get your own step-by-step setup guide, with only the guides that apply to you, in the order you'll need them. > - Tick each step off as you go. Your answers and progress are saved in this browser, so your guide is here when you come back. > - On a paid plan, bring it to your onboarding call: the guide ends with ideas for what to cover. Rather than reading every guide, tell us what you need and we'll pick the ones that matter for your store. New to B2B pricing? Start with [How SparkLayer works](https://docs.sparklayer.io/help/get-started/how-sparklayer-works.md), which explains the ideas your guide builds on. The page builds a personal setup guide from 4 short questions. On the page, answer them and you get your own step-by-step guide through these docs, which you tick off as you go. Your answers and progress are saved in your browser. 1. **Your store:** your platform, where you're starting from (new to B2B, phone and email orders, another B2B app or Shopify B2B), and who's setting SparkLayer up. 2. **Your prices:** how you set B2B prices (a rule, a spreadsheet or your ERP), who gets which prices, and whether you need quantity breaks, discounts or RRPs. 3. **Customers and ordering:** how customers pay, ordering rules (minimum orders, pack sizes, credit limits, stock levels), and whether you have sales reps, company accounts, online applications or wholesale hidden from retail. 4. **Systems and finishing touches:** the ERP or accounting systems to connect, and extras such as checkout fields, B2B shipping, branding and languages. The guide always covers the basics, connecting your store, prices, customers and ordering, and testing and launch. For the full checklist without the quiz, see [Launch checklist](https://docs.sparklayer.io/help/get-started/launching.md). ## Prefer a checklist? The [Launch checklist](https://docs.sparklayer.io/help/get-started/launching.md) covers testing, inviting your first customers and going live, for every store. Our team can also help you set up: we install the storefront widgets for you, free, and on a paid plan you can [book an onboarding call](https://book.sparklayer.io/). See [Contact support](https://docs.sparklayer.io/help/support.md). --- # How SparkLayer works URL: https://docs.sparklayer.io/help/get-started/how-sparklayer-works How SparkLayer adds B2B ordering to your store, from data sync to orders, and the key ideas it's built on: price lists, customer groups, widgets and more. > **Quick summary** > > - SparkLayer adds B2B ordering to the store you already have. Products, customers and orders stay in your eCommerce platform, and SparkLayer syncs the data it needs. > - You set the B2B rules in SparkLayer: **price lists** hold prices, and **customer groups** decide which prices, payment methods and ordering rules each customer gets. You can also send them from another system. > - When a B2B customer signs in, SparkLayer's **frontend interfaces** (widgets) show them their prices, cart and account on your store. Their orders arrive in your store's admin like any other order. > - New to B2B? [Key concepts](#key-concepts) explains each idea in plain English. Then build [your setup guide](https://docs.sparklayer.io/help/get-started/setup-guide.md): the steps for your store, in order. ## How it works in 5 steps SparkLayer sits alongside your store. Here's what happens, from connecting your store to fulfilling an order: 1. **SparkLayer connects to your store.** It links to your eCommerce platform, such as [Shopify](https://docs.sparklayer.io/help/platforms/shopify.md), and syncs product and customer information. 2. **You set your B2B rules.** Create [price lists](#price-lists) and set rules for each [customer group](#customer-groups), such as which payment methods they can use. Manage them in [the app](#the-sparklayer-app). You can also automate them from an ERP or CRM with the [SparkLayer API](https://docs.sparklayer.io/developers/api.md). 3. **Customers order on your website.** SparkLayer's [frontend interfaces](#frontend-interfaces) give signed-in B2B customers self-service ordering: their prices, quick ordering, re-ordering and an account area. Retail customers see your store as normal. 4. **Your sales team can help.** With [sales agent ordering](https://docs.sparklayer.io/help/sales-ordering.md), your team manages B2B accounts and orders for customers. The [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md) covers the full quote-to-order process. 5. **Orders arrive in your admin.** B2B orders are created in your platform's admin. You review, edit and fulfil them with the processes you already use. SparkLayer's [Orders](https://docs.sparklayer.io/help/dashboard/orders.md) page shows your B2B sales over time. ## When a B2B customer signs in SparkLayer matches them to a customer group by their tags, and applies that group's rules to everything they see and order. What happens when a B2B customer signs in: 1. **B2B customer**: Signs in to your store 2. **Customer group**: Matched by their tags 3. **Rules**: Price lists, payment methods, order limits 4. **Storefront**: Their prices, cart and checkout 5. **Order**: Created in your platform ## Key concepts The ideas SparkLayer is built on, grouped by area. Jump to one, or read on: each takes a minute. - **[Your store](#your-store-and-sparklayer)**: Where SparkLayer runs and how you manage it. [Your platform](#your-ecommerce-platform), [SKUs](#products-and-skus), [Data sync](#data-sync), [The app](#the-sparklayer-app). - **[Pricing](#pricing)**: The B2B prices each customer sees. [Price lists](#price-lists), [Quantity pricing](#quantity-pricing-and-discounts). - **[Customers](#customers)**: Who your B2B buyers are and their rules. [B2B customers](#b2b-customers), [Customer groups](#customer-groups), [Companies](#companies-and-company-users), [Sales agents](#sales-agents). - **[The storefront](#the-storefront)**: What buyers see and use on your website. [Widgets](#frontend-interfaces), [Checkout and payment](#checkout-and-payment). - **[Going live](#going-live)**: Testing safely, and what your plan includes. [Testing](#testing), [Plans](#plans). ## Your store and SparkLayer ### Your eCommerce platform SparkLayer runs on top of your store on [Shopify, BigCommerce, Wix, WooCommerce or Magento](https://docs.sparklayer.io/help/platforms.md). You keep managing products, stock, customers and fulfilment there. SparkLayer adds the B2B layer: trade pricing, B2B ordering rules and self-service ordering. ### Products and SKUs SparkLayer matches B2B prices to your products by SKU (stock keeping unit). That's the product code you set on each product and variant in your platform. Every product you want B2B customers to buy needs a SKU, and each SKU must be unique. See [Check your products have unique SKUs](https://docs.sparklayer.io/help/get-started/launching.md#check-your-products-have-unique-skus). ### Data sync SparkLayer keeps a copy of the product and customer data it needs. It updates the copy automatically when you change something in your platform. If a product doesn't look right in SparkLayer, look it up at **Pricing > Products** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/products)), or **SparkLayer Wholesale > Integrations > Product sync** in the Shopify app. Customers that didn't sync show in a banner at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app. See [Monitoring data sync](https://docs.sparklayer.io/help/integrations/data-sync.md). ### The SparkLayer app You set up and manage everything in the SparkLayer app: price lists, customer groups, orders and settings. It comes in 3 versions with the same screens. | Version | Where | How it's laid out | | --- | --- | --- | | **SparkLayer Dashboard** | [app.sparklayer.io](https://app.sparklayer.io/), on any platform | A sidebar with grouped pages, such as **Pricing > Price lists**. | | **Shopify app** | **SparkLayer Wholesale**, under **Sales channels** in your Shopify admin | One menu item per area, with that area's pages as tabs. | | **Wix app** | **SparkLayer B2B & Wholesale**, under **Apps** in your Wix dashboard | The same screens, inside Wix. | The Help Center shows the path for the version you use. See [Find your way around SparkLayer](https://docs.sparklayer.io/help/dashboard.md). ## Pricing ### Price lists A [price list](https://docs.sparklayer.io/help/pricing.md) is a set of B2B prices for your products, keyed by SKU. A price list can be: | Type | How prices are set | | --- | --- | | **Automatic** | Calculated from another price source, such as your store's retail prices, with a percentage change (for example, 40% off). | | **Manual** | Uploaded as exact prices by CSV, or edited in the [Price editor](https://docs.sparklayer.io/help/pricing/price-editor.md). | | **Integration** | Sent from another system, such as an ERP, through the [SparkLayer API](https://docs.sparklayer.io/developers/api.md). | You can combine them, for example an automatic price list with exact prices uploaded for a few products. Prices are shown excluding tax, and tax is added at checkout. ### Quantity pricing and discounts On top of price lists, you can set [quantity breaks and pack sizes](https://docs.sparklayer.io/help/pricing/quantity-pricing.md) and [discounts](https://docs.sparklayer.io/help/pricing/discounts.md) for B2B customers. ## Customers ### B2B customers A B2B customer (a buyer) is a customer account in your platform that SparkLayer recognises as trade. Retail customers who aren't tagged keep shopping as normal. - **Shopify:** a customer tagged `b2b`. SparkLayer adds the tag for you when you [invite a buyer](https://docs.sparklayer.io/help/customers/invite-buyers.md). - **Wix:** a contact with the `b2b` label. - **Other platforms:** see [Assign customers to a customer group](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#assign-customers-to-a-customer-group). ### Customer groups A [customer group](https://docs.sparklayer.io/help/customers/customer-groups.md) is a set of ordering rules shared by a group of B2B customers: - Which price lists they see - Which payment methods they can use, such as card upfront or payment on account - Order limits, such as a minimum order value - Other rules, such as shipping and checkout options Every account starts with a **Base customer group**. B2B customers are in it unless you put them in another group. To move a customer to another group, give them a second tag that matches it, such as `b2b-vip`. Customer groups are under **Customers** in the app. ### Companies A [company](https://docs.sparklayer.io/help/customers/companies.md) is a business you sell to. On Shopify, these are your Shopify B2B companies. Larger companies can be split into [locations](https://docs.sparklayer.io/help/customers/company-locations.md), such as stores or regions. ### Company users A B2B customer can invite colleagues to share their account as [company users](https://docs.sparklayer.io/help/customers/company-users.md). The whole team then sees the same orders, addresses and shopping lists. The main user can approve orders placed by limited users. ### Sales agents [Sales agents](https://docs.sparklayer.io/help/sales-ordering.md) (sales reps) are members of your team who sign in to your store and order on behalf of the customers they look after. Each agent's role controls what they can do. ## The storefront ### Frontend interfaces The [frontend interfaces](https://docs.sparklayer.io/help/storefront/interfaces.md) (or widgets) are the parts of SparkLayer your customers use: - B2B product pricing - A quick-order product matrix - The My Cart checkout - The My Account area, for reordering, invoices and addresses They sit inside your existing theme and only appear for signed-in B2B customers. To choose how they look, see [Customising the design](https://docs.sparklayer.io/help/storefront/customising-design.md). ### Checkout and payment B2B customers check out in the My Cart interface. Depending on their [payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md), they either: - Pay upfront by card in your platform's checkout - Place the order on account, by invoice or as a quote request Either way, the order arrives in your platform's admin. ## Going live ### Testing To see SparkLayer as a buyer before your customers do, use [Try it out](https://docs.sparklayer.io/help/get-started/launching.md#place-a-test-order). It signs you in to your own store as a test B2B customer, and the test order doesn't count towards your plan. To try changes on a second, test store, use [Test mode](https://docs.sparklayer.io/help/dashboard/test-mode.md). ### Plans What you can use depends on your plan, and a few features also depend on your platform. Every paid plan has a 14-day free trial. See [Plans and features](https://docs.sparklayer.io/help/plans-and-features.md), [Your plan and usage](https://docs.sparklayer.io/help/dashboard/plan-and-features.md) and [Compare platforms](https://docs.sparklayer.io/help/platforms/compare.md). ## Under the hood For the more technical: how SparkLayer's 3 parts connect your store, your website and any back-office systems, such as an ERP. You don't need this to get started. How SparkLayer connects: - **Backend:** B2B-specific data (price lists, product pack sizes, customer rules) comes from an ERP / CRM, a manual upload or an automatic sync, and is sent to the **SparkLayer Backend**, which stores it. - **eCommerce platform** (e.g. Shopify): its core functions (order, catalogue and customer management, analytics, marketing and promotions, CMS) sync both ways with the **SparkLayer Connector**. - **Website storefront:** core templates (homepage, collections, products, static pages, blog) work as normal. The **SparkLayer Frontend** overlays B2B widgets: product pricing, buy button, quick order form, checkout and ordering, and the My Account area. ## See it in action Try SparkLayer for yourself as a B2B buyer on [our demo stores, or your own store](https://docs.sparklayer.io/help/get-started/demo.md). SparkLayer works with Shopify, BigCommerce, Wix, WooCommerce and Magento. See [Platforms](https://docs.sparklayer.io/help/platforms.md) for what's supported on each, and [Architecture](https://docs.sparklayer.io/developers/architecture.md) for the technical detail. ## Next steps You're ready to set up SparkLayer. The first step is installing it on your platform. Not sure where to start? Answer 4 quick questions and get [your own setup guide](https://docs.sparklayer.io/help/get-started/setup-guide.md): the guides that apply to your store, in the order you need them. - [Get started](https://docs.sparklayer.io/help/get-started.md): Set up SparkLayer with the 5 Setup steps - [Find your platform](https://docs.sparklayer.io/help/platforms.md): Install guides for Shopify, BigCommerce, Wix, WooCommerce and Magento - [Glossary](https://docs.sparklayer.io/help/glossary.md): Every SparkLayer term, defined - [Contact support](https://docs.sparklayer.io/help/support.md): Book an onboarding call or ask our team --- # Try our demo URL: https://docs.sparklayer.io/help/get-started/demo See SparkLayer in action: try the B2B ordering experience on your own website, or sign in to our Shopify demo store and place test B2B orders. > **Quick summary** > > - Before you install, see SparkLayer's B2B ordering on your own website, with nothing installed. Or sign in to our Shopify demo store and place test orders. > - The demo store is a combined retail and B2B store: anyone can browse, and B2B customers sign in to see their own pricing. > - Already installed SparkLayer on Shopify? [Try it out](https://docs.sparklayer.io/help/get-started/launching.md#place-a-test-order) places a test order on your own store as a B2B buyer, and its **Launch live demo** button opens our live demo. > - Want a guided tour? [Arrange a live demo](https://www.sparklayer.io/?demo#contact) with our team. There are 2 ways to see SparkLayer before you install it. Once it's installed, use [Try it out](https://docs.sparklayer.io/help/get-started/launching.md#place-a-test-order) instead. It signs you in to your own store as a test B2B customer, with your real prices. - [On your own store](#try-it-on-your-store): See B2B ordering on your website, with your products and branding - [Demo store](#demo-stores): Sign in to our Shopify demo store and place test B2B orders ## Try it on your store The fastest way to see SparkLayer is on your own store. Our interactive demo loads your website and overlays SparkLayer's B2B ordering on top. You can then place a wholesale order with your real products and branding. Nothing is installed, and nothing changes on your site. To see SparkLayer on your own store, open https://www.sparklayer.io/?demo=www.yourstore.com with your store's domain in place of www.yourstore.com. In the app, the **Launch live demo** button on **Orders > Place a test order** in the SparkLayer Dashboard, or **SparkLayer Wholesale > Try it out** in the Shopify app opens a live demo in the same way. ## Demo store Our demo store runs SparkLayer on Shopify. Sign in to try B2B pricing, the checkout and [sales agent ordering](https://docs.sparklayer.io/help/sales-ordering.md), as your customers would. ### Hybrid DTC and B2B ![Hybrid DTC and B2B – Try our demo](https://docs.sparklayer.io/images/help/get-started/demo/demo-8f33df.webp) A combined DTC (direct to consumer) and B2B store. Anyone can browse and buy, and B2B customers sign in to see their own pricing. It also shows multiple currencies. [Watch the walk-through video](https://26157419.fs1.hubspotusercontent-eu1.net/hubfs/26157419/SparkLayer%20Recorded%20Demo%20Video.mp4). [Open the hybrid demo store](https://demo.sparklayer.io/pages/b2b-login-register) ### What to try - [Product purchasing](https://docs.sparklayer.io/help/storefront/interfaces/product-detail.md): How customers add items to a B2B order - [Checkout](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md): How the checkout works, such as choosing a payment method - [My Account area](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md): How the self-service My Account area works ## Get a live demo > **See it with our team** > > Our team walks you through SparkLayer and shows you how it all works. [Arrange a live demo](https://www.sparklayer.io/?demo#contact). ## Next steps - [Get started](https://docs.sparklayer.io/help/get-started.md): Ready to set up? Follow the 5 Setup steps - [How SparkLayer works](https://docs.sparklayer.io/help/get-started/how-sparklayer-works.md): How it fits with your store, plus price lists, customer groups and the other essentials --- # Launch checklist URL: https://docs.sparklayer.io/help/get-started/launching Work through the SparkLayer launch checklist: test as a B2B customer, check SKUs, pricing and payments, invite your first customers, then go live for everyone. > **Quick summary** > > - Launching has 3 phases: **test** SparkLayer yourself, **invite** a first group of customers, then **launch** to all your B2B customers. Each phase is a short list of tasks to tick off. > - Start once you have a price list assigned to a customer group, and SparkLayer on your theme. The steps on **Home > Setup** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/)), or **SparkLayer Wholesale > Setup** in the Shopify app cover this, or your platform's install guide on other platforms. See [Get started](https://docs.sparklayer.io/help/get-started.md). > - On Shopify, **Try it out** is the quickest test: it signs you in as a test B2B customer and places a test order that doesn't count towards your plan. > - Many checks happen in your store's admin, such as customer tags, SKUs and sales channels. Steps are given for Shopify and Wix. For other platforms, see your [platform guide](https://docs.sparklayer.io/help/platforms.md). > - Want the whole journey, from setup to launch, for your store? Build [your setup guide](https://docs.sparklayer.io/help/get-started/setup-guide.md). > - Our team can help you go live. On a paid plan, [book an onboarding call](https://book.sparklayer.io/). See [Contact support](https://docs.sparklayer.io/help/support.md). 1. **Test:** check everything works the way your customers will see it. 2. **Invite:** invite a first group of customers and gather their feedback. 3. **Launch:** go live and bring the rest of your B2B customers on board. ## Phase 1: Test Test SparkLayer the way your customers will use it, so you know everything works before anyone else sees it. > **Before you start** > > - **A price list** at **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app (a test one is fine), assigned to a customer group at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app (the **Base customer group** is fine). > - **SparkLayer on your theme**, added by you or our team. On Shopify, check [Theme setup](https://docs.sparklayer.io/help/platforms/shopify/theme-setup.md). On other platforms, see your [platform guide](https://docs.sparklayer.io/help/platforms.md). ### Create a test B2B customer and sign in Set up an example B2B customer and browse your store as them. **Shopify:** The quickest way is **Try it out**. Its **Test as a B2B customer** step uses or creates a customer with the `b2b` tag. **Open store as test customer** then opens your store signed in as them. You can also set up a test customer by hand. SparkLayer only loads for customers tagged `b2b` in Shopify. 1. In your Shopify admin, go to **Settings > Customer accounts** ([open in the Shopify admin](https://admin.shopify.com/settings/customer_accounts)) and choose **Customer accounts** or **Legacy accounts**, so customers can sign in. Both work with SparkLayer. 2. Go to **Customers** ([open in the Shopify admin](https://admin.shopify.com/customers)) and open an existing customer, or click **Add customer**. 3. Fill in all the fields, including the address. SparkLayer can't find a customer record that has no address. 4. In the customer's **Tags** box, type `b2b` and choose the existing tag or create it. To put the customer in a group other than **Base**, add that group's tag as well, for example `b2b-account`. 5. Give the customer access: - With **Customer accounts**, there's nothing to send. The customer goes to your sign-in page (for example `www.yourstore.com/account`), enters their email and receives a 6-digit code. - With **Legacy accounts** and a new customer record, open the customer and click **More actions** > **Send account invite**. The customer receives an email with an **Activate your account** button, and sets a password. You can edit the [account activation email](https://admin.shopify.com/email_templates/customer_account_activate/preview). See Shopify's guide to [inviting customers to create accounts](https://help.shopify.com/en/manual/customers/customer-accounts#invite-customers-to-create-accounts). 6. Go to your store's sign-in page (for example `www.yourstore.com/account`) and sign in as the customer. With Customer accounts, enter the 6-digit code sent to the customer's email. SparkLayer loads, and you can browse your store as a B2B customer. If you can't reach the sign-in page, check customer accounts are turned on (step 1). **Wix:** SparkLayer only syncs Wix contacts that have the `b2b` label and are site members. 1. In your Wix dashboard, go to **Customers & Leads > Contacts**. Create a new contact or edit an existing one. 2. Fill in a valid address, with every address field completed. Note the email address, as you'll need it to sign in. 3. In the contact's **Labels** section, click **Add Label** and add `b2b`. 4. Check the contact is a site member: under **Member info**, the **Member status** shows **Site Member**. Only site members can sign in to your store. 5. If you've created other customer groups at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app, add their labels exactly as they appear in SparkLayer, for example `b2b` and `b2b-additional-group`. Don't edit a label in Wix after you've added it. 6. Sign in to your store as the customer. Every account has a **Base customer group** you can use for your B2B customers. Once at least one customer has a group's label, you can manage that group's rules at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app. For different rules, click **Create customer group**, then add the new group's label to customers in Wix (for example `b2b` and `b2b-account`). **Other platforms:** How you create a B2B customer depends on your platform. See your platform's guide in [Platforms](https://docs.sparklayer.io/help/platforms.md). To check the customer has synced to SparkLayer, go to **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app and search for their name or email. If they're listed with their customer group, they've synced. If they're missing, check the sync banner at the top of the page. Click **Show errors** to see which customers didn't sync and why, such as a missing address. Fix them in your store's admin, and they sync on the next partial sync. See [Monitoring data sync](https://docs.sparklayer.io/help/integrations/data-sync.md). ### Check your products have unique SKUs SparkLayer matches prices to products by SKU, so every product needs a unique one. SparkLayer matches prices and its storefront widgets to products by SKU. Without SKUs, it can't show B2B pricing or its widgets. Every product you want B2B customers to see prices for must have a SKU, and each SKU must be unique (for example `MUG-CAT` and `MUG-DOG`). **Shopify:** 1. Go to **Products** ([open in the Shopify admin](https://admin.shopify.com/products)) and open a product. 2. Check the **SKU (Stock Keeping Unit)** field in the **Inventory** section, and on each variant. 3. To add SKUs, edit products one by one, or add them in bulk with Shopify's **Import** feature or an app such as [Matrixify](https://apps.shopify.com/excel-export-import). If two products share a SKU, change one so every SKU is unique. **Wix:** 1. Go to **Catalog > Store Products > Products** and edit a product. 2. For a product without variants, add the SKU in the **SKU** field of the **Inventory and shipping** section. 3. For a product with variants (such as colour or size), turn on **Manage pricing and inventory for each product variant**, then add a SKU for each variant in the **Product variants** section. **Other platforms:** Check each product's SKU in your platform's product admin. ### Check your products are in the SparkLayer sales channel (Shopify only) Products must be active and in the SparkLayer Wholesale sales channel. **Shopify only:** SparkLayer only shows B2B prices for products in both the **Online Store** and **SparkLayer Wholesale** sales channels. Products must also have the status **Active**. SparkLayer doesn't import draft products. 1. In your Shopify admin, go to **Products** ([open in the Shopify admin](https://admin.shopify.com/products)) and open a product. 2. Check its **Status** is **Active**. 3. In the product's sales channel settings, check **Online Store** and **SparkLayer Wholesale** are both selected. To make a product unavailable to B2B customers, leave it out of the **SparkLayer Wholesale** channel. To check what SparkLayer has for a product, search for it at **Pricing > Products** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/products)), or **SparkLayer Wholesale > Integrations > Product sync** in the Shopify app. ### Check your B2B prices Sign in as your test customer and check they see their B2B prices. Sign in as your test customer and check the prices on your product pages. No B2B prices? SparkLayer doesn't show any until you've added a price list and assigned it to the customer's group. These are steps 1 and 2 of the Setup checklist: see [Work through the steps](https://docs.sparklayer.io/help/get-started.md#work-through-the-steps). If the prices are there but not the ones you expect, see [Prices are different from what you expect](https://docs.sparklayer.io/help/troubleshooting.md#prices-are-different-from-what-you-expect). ### Set up B2B shipping (optional) Only if you want shipping rules just for your B2B customers. By default, SparkLayer uses the shipping rules in your eCommerce platform, such as Shopify. To show B2B-only shipping rules to your B2B customers, set them up at **Settings > Shipping** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/shipping)), or **SparkLayer Wholesale > Settings > Shipping** in the Shopify app. See [Shipping rules](https://docs.sparklayer.io/help/ordering/shipping-rules.md) for both options. Skip this step if your platform's shipping rules suit your B2B customers. ### Place a test order Check out with each payment method, then see how each order arrives in your admin. As your test customer, go to any product page and add items. They appear in the [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md). Check out once with each payment method you offer, then check how each order arrives in your admin. **Shopify only:** The **Place a test order** step of **Try it out** opens your store as the test customer. Its test orders don't count towards your plan. **Shopify:** **Payment methods** At the payment step, customers choose from the payment methods their customer group allows (set under **Payment methods** on the [customer group](https://docs.sparklayer.io/help/customers/customer-groups.md#choose-payment-methods)): | At checkout | In the customer group | For the customer | How the order arrives in Shopify | | --- | --- | --- | --- | | **Pay on Account** | **Payment on account** | Checks out without entering payment details. You can set credit limits and net terms such as Net 30: see [Credit limits and net terms](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md). | As a **draft order**, which stays a draft until it's paid. | | **Pay by Invoice** | **Pay by invoice** | Checks out without entering payment details. You take payment offline, for example by bank transfer. | As a **draft order**, which stays a draft until it's paid. | | **Pay Online by Card** | **Card at checkout** | Goes to your Shopify checkout and pays straight away, by card or another payment provider. Sometimes called upfront or pro-forma payment. | As a **completed order**, marked **Paid** and ready to fulfil. The customer gets Shopify's order notification. | Quote requests from the [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md) don't create a Shopify order straight away. It waits for your reply, and becomes an order once it's accepted. See [Work on a quote](https://docs.sparklayer.io/help/ordering/work-on-a-quote.md). How B2B payment methods work with SparkLayer and Shopify, starting from the B2B checkout (SparkLayer): - **Pay online by card (upfront):** - If it's a **sales agent order**, or a **company user order**, an email is sent to the customer to complete payment. The customer clicks the link, pays in the **Shopify checkout** and the order is completed in Shopify. - Otherwise the customer pays in the **Shopify checkout** and the order is completed in Shopify. - **Payment on account or by invoice:** the order is completed in SparkLayer ("Order completed (SparkLayer)"). - If **auto-complete draft orders** is on, a completed order is created in Shopify. - If it's off, a draft order is created in Shopify, which becomes a completed order once it's manually marked as complete. To create completed orders instead of draft orders, turn on **Auto-complete draft orders** at **Integrations > Platform > Shopify order actions** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform > Shopify order actions** in the Shopify app. If a customer chooses Pay Online by Card but doesn't finish paying, the order still appears in your Shopify draft orders for review. **Payment methods at the Shopify checkout** Customers who choose Pay Online by Card go to the Shopify checkout. There, they see all the payment methods you've set up in Shopify, such as card or PayPal. To limit which ones B2B customers see, try an app such as [Payfy Conditional Payments](https://apps.shopify.com/payfy-conditional-payments). **Find your B2B orders in Shopify** Every order placed through SparkLayer is tagged `b2b`. To see only B2B orders, open [B2B-tagged orders in Shopify](https://admin.shopify.com/store/orders?tag=b2b), or add `orders?tag=b2b` to your Shopify admin URL. **Extra details SparkLayer adds to orders (for automations and developers)** | Attribute | What it contains | | --- | --- | | `tag` | `b2b` is added to every order placed through SparkLayer. Use it to filter and segment orders, or in automations. | | `note` | `sparkCartId`, added as an order note. Mainly for internal use and debugging. | | `note` | `sparkPaymentType`, added as an order note: the payment option used (`upfrontPayment`, `paymentOnAccount`, `paymentByInvoice` or `quote`). | **Wix:** **Payment methods** Orders appear in **Sales > Orders** in your Wix dashboard: | At checkout | In the customer group | For the customer | How the order arrives in Wix | | --- | --- | --- | --- | | **Pay on Account** | **Payment on account** | Checks out without entering payment details. | Payment status **UNPAID**. Mark it as paid once you've received payment. | | **Pay by Invoice** | **Pay by invoice** | Checks out without entering payment details. | Payment status **UNPAID**. Mark it as paid once you've received payment. | | **Pay Online by Card** | **Card at checkout** | Goes to your Wix checkout and pays straight away, by card or another payment provider. | Payment status **PAID**, ready to fulfil. | Customers who choose Pay Online by Card see all the payment methods you've set up in Wix, such as card or PayPal. **Other platforms:** See [Payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md) for how each method works, and your [platform guide](https://docs.sparklayer.io/help/platforms.md) for how orders arrive in your admin. ### Check the design Make sure SparkLayer's widgets match your store's fonts, colours and buttons. Sign in as your test customer and check SparkLayer's widgets match your store's look, such as its fonts, colours and buttons. If our team installed SparkLayer for you, this styling is already done. If not, we recommend adding some basic styling with CSS. That's usually a job for your developer or our team. See [Customising the design](https://docs.sparklayer.io/help/storefront/customising-design.md). ### Set up B2B sign-in and registration Decide how B2B customers sign in, and how new ones apply for a trade account. If you invite your B2B customers yourself, you might not need a registration form. See [Inviting](#inviting). **Shopify only:** On Shopify, there are two recommended ways to let customers sign in and apply for a trade account: 1. **SparkLayer Forms (recommended).** Build B2B registration forms at **Forms** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/forms)) with the no-code form builder. You don't need any third-party apps. Start from the ready-made **Customer Registration Form** template, which includes approval workflows, automatic customer tagging and email notifications. Forms are in the SparkLayer Dashboard at app.sparklayer.io, not in the Shopify app. See [Forms](https://docs.sparklayer.io/help/forms.md). 2. **Our B2B login and register page.** A ready-made page template that includes a registration form. You can see it on our [demo store](https://docs.sparklayer.io/help/get-started/demo.md). See [Shopify B2B registration and login](https://docs.sparklayer.io/help/platforms/shopify/customisations/registration-and-login.md). On other platforms, see your [platform guide](https://docs.sparklayer.io/help/platforms.md). ### Turn on extra B2B features (optional) Live stock, pack sizes, B2B-only products, RRPs and more. You can add features such as live stock levels, pack sizes, B2B-only products and retail prices (RRP). Try them on [our demo stores](https://docs.sparklayer.io/help/get-started/demo.md), or see [Storefront features](https://docs.sparklayer.io/help/storefront.md). | Area | Features | | --- | --- | | Customer experience | [B2B login page](https://docs.sparklayer.io/help/platforms/shopify/customisations/registration-and-login.md), [B2B registration page](https://docs.sparklayer.io/help/platforms/shopify/customisations/registration-and-login.md), [hide B2B products from retail (DTC) customers, show B2B-only content and create a B2B-only navigation menu](https://docs.sparklayer.io/help/platforms/shopify/customisations/b2b-only-content.md), [B2B email notifications](https://docs.sparklayer.io/help/platforms/shopify/customisations/email-notifications.md) (Shopify) | | Checkout | [B2B-only shipping](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md), [B2B payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md), [custom checkout fields](https://docs.sparklayer.io/help/ordering/checkout-fields.md) | | Products | [Pack sizes and minimum or maximum quantities](https://docs.sparklayer.io/help/storefront/quantity-rules.md), [live stock levels, pre-orders and back-orders, and reserved stock for DTC customers](https://docs.sparklayer.io/help/storefront/stock-display.md) | | Automations | [Shopify Flow ready-made automations](https://docs.sparklayer.io/help/platforms/shopify/customisations/flow.md) (Shopify) | **Ready for the next phase:** A test order has arrived in your admin the way you expect, and your store looks right to a B2B customer. If something doesn't work as expected, see [Troubleshooting](https://docs.sparklayer.io/help/troubleshooting.md) . ## Phase 2: Invite Once you're happy everything works, invite a first group of customers. Test the whole journey end to end before you do. Starting with a small group lets you gather feedback before you invite everyone. ### Invite your first customers Start with a small group, so you can gather feedback before you invite everyone. **Shopify:** The quickest way is **Invite a buyer** , on step 3 of **Home > Setup** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/)), or **SparkLayer Wholesale > Setup** in the Shopify app or at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app ( **Invite buyer** ). Enter the buyer's email, choose their **Customer group** and click **Send invite** . SparkLayer adds them to Shopify with the group's tag, and they see trade prices as soon as they sign in. See [Invite a buyer](https://docs.sparklayer.io/help/customers/invite-buyers.md) . To invite customers you've already set up in Shopify (see [Add B2B customers on Shopify](https://docs.sparklayer.io/help/platforms/shopify/invite-customers.md) for adding them one at a time, in bulk or from scratch): 1. Check customer accounts are turned on in **Settings > Customer accounts** ([open in the Shopify admin](https://admin.shopify.com/settings/customer_accounts)) (**Customer accounts** or **Legacy accounts**). 2. For each customer, follow steps 2 to 5 of [Create a test B2B customer and sign in](#create-a-test-b2b-customer-and-sign-in): complete their record including the address, tag them `b2b`, and send an account invite if you use Legacy accounts. 3. Tell the customer to go to your sign-in page (for example `www.yourstore.com/account`). With Customer accounts, they enter their email and then a 6-digit code. With Legacy accounts, they sign in with their email address and password. Once signed in, they see SparkLayer load and can browse your store as a B2B customer. If they can't reach the sign-in page, check customer accounts are turned on. **Wix:** 1. Set up each customer as in [Create a test B2B customer and sign in](#create-a-test-b2b-customer-and-sign-in). Any contact with the `b2b` label syncs to SparkLayer automatically. To sign in, they must also be a site member. 2. Let your customers know they can sign in and start ordering: - To message one customer, go to **Customers & Leads > Contacts**, open the contact and use the **Inbox** tab to send a direct message. - To email several customers, go to **Customers & Leads > Contacts**, search or filter, select the customers and click **Send Email Campaign**. You can start from our [example welcome email](#send-a-welcome-email). **Other platforms:** See your [platform guide](https://docs.sparklayer.io/help/platforms.md) for how to set up and invite customers. ### Invite customers in bulk (optional) Create and invite lots of customers at once with an app. **Shopify only:** On Shopify, apps can create and invite many customers at once: - [Matrixify](https://apps.shopify.com/excel-export-import?st_source=autocomplete) has tools to create customer records and invite them quickly. - [BAIS Bulk Account Invite](https://apps.shopify.com/bulk-account-invite-sender?) invites customers in bulk without sending them emails. On other platforms, see your [platform guide](https://docs.sparklayer.io/help/platforms.md). ### Automate approval of new customers (optional) Let customers apply for access, and review each application. **Shopify only:** On Shopify, customers can apply for access on your store, and you review each application before they can place B2B orders. See the options in [Shopify B2B registration and login](https://docs.sparklayer.io/help/platforms/shopify/customisations/registration-and-login.md). On other platforms, see your [platform guide](https://docs.sparklayer.io/help/platforms.md). **Ready for the next phase:** Your first customers are signing in and ordering without problems. ## Phase 3: Launch When your first customers are ordering without problems, launch your B2B store fully and invite the rest of your customers. ### Turn off preview mode (Shopify only) If your store shows a preview mode banner, finish the last launch step in the app. **Shopify only:** A **preview mode** banner on your store means the final launch step in the SparkLayer Wholesale app isn't done yet. 1. In your Shopify admin, under **Sales channels**, click **SparkLayer Wholesale** to open the app's **Home**. 2. Click **Start taking B2B orders**. If you don't see **Start taking B2B orders**, the app thinks a setup step isn't complete, such as **Add SparkLayer to your theme**. Check every step at **Home > Setup** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/)), or **SparkLayer Wholesale > Setup** in the Shopify app is ticked off. See [Work through Setup](https://docs.sparklayer.io/help/platforms/shopify/install.md#work-through-setup). **More detail** If every step looks done and the button still isn't there, [contact our support team](https://docs.sparklayer.io/help/support.md). We may need collaborator access to your Shopify store, with the **Apps and channels** permission, to check the app's setup. ### Add an onboarding landing page A ready-made page that explains the benefits of your B2B store. Explaining the benefits encourages customers to use your new B2B store. Our ready-made onboarding landing page does this for you. Headed "Welcome to our B2B store", it introduces the B2B cart and My Account area. It also lists what customers can do, such as view their order history, track orders, download invoices and update their addresses. **Shopify:** 1. In your Shopify admin, go to **Online Store > Pages** ([open in the Shopify admin](https://admin.shopify.com/pages)) and click **Add page**. 2. In the **Content** editor, click **Show HTML** and paste in the [page code from this gist](https://gist.github.com/cm-sl/47d750425f90d527e1210efe3735dc7f). 3. Change the **Title** and content as you like. 4. Under **Search engine listing**, set the **URL handle** to `b2b-onboarding` (our recommendation). 5. Under **Visibility**, choose **Visible**, then save. Click **View** to see the page. 6. Link to the page from your store's navigation, such as the header or footer. If you use our [B2B registration and login page](https://docs.sparklayer.io/help/platforms/shopify/customisations/registration-and-login.md), you can link to it from there too. **Other platforms:** See your platform's own help for how to create a custom landing page. ### Create a landing page for signed-in B2B customers (optional) A hub B2B customers see as soon as they sign in. You can also create a landing page that B2B customers see as soon as they sign in. Use it to highlight products, share important information or act as the hub of your B2B store. See [Shopify B2B landing page](https://docs.sparklayer.io/help/platforms/shopify/customisations/b2b-landing-page.md). ### Send a welcome email Invite the rest of your customers with our example email. Use our example email to invite your customers, as a newsletter or a personal email from your B2B sales team. Replace the text in square brackets with your own details. The example is written for Shopify's Legacy customer accounts, where customers activate their account and set a password. If you use new customer accounts, or invite buyers with **Invite a buyer**, rewrite the **Account Activation** part. Tell customers to go to your store's sign-in page and enter their email, then the one-time code they're sent. **Example welcome email** Dear \[Valued Partner], We're excited to announce our new online B2B store and we're excited to have you join! To ensure a smooth start, we've put together a guide to help you activate your account and start placing orders. **Account Activation: The First Step to Joining** - **Look Out for Our Email:** Keep an eye on your inbox for an email from \[My Store] with the subject "Activate Your \[My Store] Partner Account." - **Activate with a Click:** Within that email, you'll find the 'Activate My Account' button. Click it to move forward with your activation. - **Secure Your Login:** Follow the link to create your own secure password. After this, your account is all set and ready to go. **B2B Portal: Streamlining Your Business** - **Fast Track with Quick Order:** Speed is essential in business. That's why our 'Quick Order' feature offers a simple layout to place your orders quickly and efficiently - perfect for when you know exactly what you need. - **Explore Products in Detail:** Curious about a product? Visit the 'Products' page for an in-depth look at the benefits, and quickly add to your order **Effortless Account Management** - **Your Orders, Simplified**: By clicking on the 'Account' or 'Cart' icons, you can view your Order Summary, adjust account settings, and monitor your orders in real-time. - **Get a Shipping Quote:** Ready to finalise your order? Get live shipping costs right before you place your order - **Approval Before Payment:** If you need administrative approval, select 'Pay on Account' to submit your order and we'll take care of the rest. **Account Extras:** Within 'My Account,' you'll also discover tools to: - Review your order history. - Save personalised shopping lists for quick reordering. - Update your shipping addresses whenever necessary. **We're Here for You** Should you have any questions or need assistance, our dedicated team is ready to help at \[Your Support Email]. Thank you for choosing \[My Store] as your partner, we're excited to have you on board! Warm regards, \[Your Name] \[Your Position] \[My Store] \[Contact Information] ### Promote your B2B store on your website Help B2B customers find your B2B store from your website. A few changes to your website help B2B customers find your B2B store: 1. **Navigation:** add a clear link in your header or footer. On Shopify, edit your menus in **Online Store > Navigation** ([open in the Shopify admin](https://admin.shopify.com/menus)). 2. **Landing page:** set up a page to attract new and existing customers, with graphics, the benefits of your B2B store, testimonials and featured products. 3. **Emails:** update your email marketing to promote your new B2B store. **You're live.** All your B2B customers are invited and ordering. Here's where to go next. ## After you launch - [Orders](https://docs.sparklayer.io/help/dashboard/orders.md): See the B2B orders coming in through SparkLayer, and your sales over time - [Customer groups](https://docs.sparklayer.io/help/customers/customer-groups.md): Add groups for different prices, payment methods and order limits - [Storefront features](https://docs.sparklayer.io/help/storefront.md): Pack sizes, stock display and the other options for your B2B store - [Contact support](https://docs.sparklayer.io/help/support.md): Contact our team if anything isn't working as expected ## Additional resources We also publish guides to help you grow your B2B and wholesale business. - [Micropaper: Unlocking customer adoption](https://www.sparklayer.io/adoption/): Plan and deliver a strategy that gets your B2B customers ordering online. - [Micropaper: Reimagining B2B operations](https://www.sparklayer.io/reimagine/): The wholesale tactics brands are using to stay ahead. - [Micropaper: Simplifying B2B success](https://www.sparklayer.io/simplify/): Ways to make B2B ordering simpler for your team and your trade customers. - [Video series: Acquire, onboard, retain and adopt](https://www.sparklayer.io/b2b-journey/): A free video series for brands, wholesalers and distributors on the B2B customer journey, from winning customers to keeping them. - [Love B2B eCommerce, by SparkLayer](https://www.sparklayer.io/love-b2b-ecommerce/): A free toolkit for growing your B2B eCommerce business, with expert videos, strategy guides, case studies and 1:1 consultations. --- # Guides URL: https://docs.sparklayer.io/help/guides Step-by-step guides to common B2B goals in SparkLayer, from setting trade prices and payment terms to shipping, tax, sign-up and moving customers across. > **Quick summary** > > - Each guide takes one goal, such as giving a key account their own prices, from start to finish. It links to the detailed page for each step. > - Every guide says what you'll end up with, how long it takes and which plan or platform it needs. Steps that differ by platform are labelled. > - New to SparkLayer? Start with [Set up wholesale prices](https://docs.sparklayer.io/help/guides/set-up-wholesale-prices.md), or work through [Get started](https://docs.sparklayer.io/help/get-started.md). ## Pricing - [Set up wholesale prices for your trade customers](https://docs.sparklayer.io/help/guides/set-up-wholesale-prices.md): You'll be able to give your buyers trade prices they see when they sign in. - [Give a key account their own prices](https://docs.sparklayer.io/help/guides/key-account-prices.md): You'll be able to give one company or customer different prices from their group. - [Move brand discounts from another wholesale app](https://docs.sparklayer.io/help/guides/migrate-brand-discounts.md): You'll be able to recreate per-brand trade discounts with price lists and customer groups. - [Run volume pricing and promotions](https://docs.sparklayer.io/help/guides/volume-discounts.md): You'll be able to reward bigger orders with price breaks, pack sizes and discounts. - [Show RRPs to your trade customers](https://docs.sparklayer.io/help/guides/show-rrp.md): Fill in every product's RRP from your Shopify prices or a spreadsheet - [Get B2B tax and VAT right](https://docs.sparklayer.io/help/guides/tax-and-vat.md): You'll be able to show net prices and charge VAT or sales tax once. ## Payments and orders - [How payments work](https://docs.sparklayer.io/help/guides/how-payments-work.md): You'll be able to follow each payment method from checkout to payment, and choose which to offer. - [Let trusted customers pay later on Net 30](https://docs.sparklayer.io/help/guides/net-terms.md): You'll be able to offer pay on account, with credit limits and payment terms. - [Process your B2B orders in Shopify](https://docs.sparklayer.io/help/guides/process-orders-in-shopify.md): You'll be able to complete draft orders, take payment and give buyers invoices. - [Show imported or manual orders in My Account](https://docs.sparklayer.io/help/guides/show-imported-orders.md): You'll be able to show draft and historic orders in your customers' order history. - [Charge the right shipping on B2B orders](https://docs.sparklayer.io/help/guides/b2b-shipping.md): You'll be able to show each customer group the right shipping methods and costs. ## Customers and your store - [Keep wholesale hidden from retail shoppers](https://docs.sparklayer.io/help/guides/hide-wholesale-from-retail.md): You'll be able to hide B2B products and prices from everyone but your trade customers. - [Hide products from customers](https://docs.sparklayer.io/help/guides/hide-products.md): You'll be able to hide products, such as custom products or fees, from every B2B customer or some customer groups. - [Sell a B2B-only version of a product](https://docs.sparklayer.io/help/guides/sell-b2b-only-versions.md): You'll be able to sell a trade pack, such as a case of 12, that only B2B customers see. - [Let new trade customers apply, and approve them](https://docs.sparklayer.io/help/guides/approve-trade-applications.md): You'll be able to take trade account applications and approve each buyer into a group. - [Move your existing wholesale customers onto SparkLayer](https://docs.sparklayer.io/help/guides/move-existing-customers.md): You'll be able to bring your trade customers, their terms and their order history across. - [Fix customers or products that won't sync](https://docs.sparklayer.io/help/guides/fix-sync-problems.md): You'll be able to find and fix the records that stop buyers seeing their prices. --- # Set up wholesale prices for your trade customers URL: https://docs.sparklayer.io/help/guides/set-up-wholesale-prices Create a B2B price list, add your trade prices, assign it to a customer group and add your buyers, then sign in as a buyer to check the prices they see. > **Quick summary** > > - You'll end up with a price list of trade prices, a customer group that uses it, and buyers who see those prices when they sign in. > - Most stores finish the core steps in under 15 minutes. Allow longer if you're preparing a spreadsheet of exact prices. > - Works on every plan and platform. The free Basic plan includes 3 price lists; Starter and above have unlimited price lists. A buyer's prices come from a price list, and a customer group decides who sees it. This guide sets up both, then adds your buyers and checks what they see. For the ideas behind it, see [Key concepts](https://docs.sparklayer.io/help/get-started/how-sparklayer-works.md#key-concepts). ## Before you start - **SparkLayer installed on your store.** On Shopify, see [Install SparkLayer on Shopify](https://docs.sparklayer.io/help/platforms/shopify/install.md). On other platforms, see [Platforms](https://docs.sparklayer.io/help/platforms.md). - **A unique SKU on every product** you sell to B2B customers, and the product set to active. Prices are matched to products by SKU. - **Your trade prices, or the rule for them**, for example 20% off your retail prices. A spreadsheet of prices by SKU is fine. - **An email address you can sign in to**, to test as a buyer. ## Set it up yourself ### Step 1. Create a price list This is step 1 of the Setup checklist: see [Set up a price list](https://docs.sparklayer.io/help/get-started.md#set-up-your-b2b-pricing). Give it a name your team will recognise, such as "Trade GBP", and pick its **Currency** with care: you can't change the **Handle** or **Currency** later. See [Create a price list](https://docs.sparklayer.io/help/pricing/managing-pricing.md#create-a-price-list). [Take the 1-minute tour](https://docs.sparklayer.io/help/pricing/managing-pricing?tour). ### Step 2. Add your trade prices Choose how the list gets its prices: | If your trade prices are… | Do this | | --- | --- | | A set percentage off retail | Tick **Enable automatic pricing**, choose a **Pricing source** and enter the percentage. See [Set up automatic pricing](https://docs.sparklayer.io/help/pricing/managing-pricing.md#set-up-automatic-pricing). | | Exact prices in a spreadsheet | Save it as a CSV file with **SKU** and **Price** columns, then click **Upload** next to the list. See [Upload prices by CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md). | Upload prices without tax. SparkLayer shows prices net and adds tax at checkout: see [step 5](#check-your-prices-allow-for-tax). ### Step 3. Assign the price list to a customer group This is step 2 of the Setup checklist: see [Assign a price list to a customer group](https://docs.sparklayer.io/help/get-started.md#set-up-your-customer-groups). To give every B2B customer these prices, use the **Base customer group**. To give them to some customers only, create a customer group for them. See [Assign price lists](https://docs.sparklayer.io/help/customers/customer-groups.md#assign-price-lists). [Take the 1-minute tour](https://docs.sparklayer.io/help/customers/customer-groups?tour). **More detail** A group can have several price lists, and their order decides which price a customer sees for a SKU that's in more than one. See [Price list order](https://docs.sparklayer.io/help/pricing/managing-pricing.md#price-list-order). ### Step 4. Add your buyers to the group Each customer belongs to one customer group. On Shopify, this is step 3 of the Setup checklist: see [Add your first buyer](https://docs.sparklayer.io/help/get-started.md#add-your-b2b-customers). Give each buyer the group's tag as well as `b2b` if it isn't the Base group, for example `b2b-trade`. On other platforms, you mark B2B customers in your platform's admin, such as the `b2b` label on Wix: see [Other platforms](https://docs.sparklayer.io/help/get-started.md#other-platforms). For every platform, see [Assign customers to a customer group](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#assign-customers-to-a-customer-group). ### Step 5. Check your prices allow for tax Customers see exactly the price in their price list, before tax. Tax is added at the last step of checkout. **Shopify only:** In your Shopify admin, go to **Settings > Taxes and duties** ([open in the Shopify admin](https://admin.shopify.com/settings/taxes)). If **Include sales tax in product price and shipping rate** is on and you use an automatic price list, raise its percentage to take the tax out too. Otherwise customers pay tax twice. See [Tax-inclusive prices](https://docs.sparklayer.io/help/pricing/managing-pricing.md#tax-inclusive-prices). **BigCommerce and Wix and WooCommerce and Magento only:** SparkLayer uses your platform's tax rules. Check the limits for your platform in [Set up tax on other platforms](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md#set-up-tax-on-other-platforms). For VAT and tax-exempt customers, see the guide [Get B2B tax and VAT right](https://docs.sparklayer.io/help/guides/tax-and-vat.md). ### Step 6. Test as a B2B customer Sign in to your store as a buyer in the group and check the prices, payment methods and any minimum order. **Shopify only:** Go to **Orders > Place a test order** in the SparkLayer Dashboard, or **SparkLayer Wholesale > Try it out** in the Shopify app. It creates a test customer with the `b2b` tag, gives them a price list and opens your store signed in as them. Test orders don't count towards your plan. See [Try it out](https://docs.sparklayer.io/help/get-started/launching.md#place-a-test-order). **BigCommerce and Wix and WooCommerce and Magento only:** Create a test customer in your platform, add them to the group as in step 4, then sign in to your store as them. See [Test as a B2B customer](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#test-as-a-b2b-customer). ## Check it worked Signed in as your test buyer: - **Product pages show the price list's price**, for example $7.99 for a SKU listed at 7.99. - **The cart shows the same prices**, with tax added as its own line on **Review & Pay**. - **The buyer shows in the right group** at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app, in the **Group** column. To check one product's price in every list, search for its SKU at **Pricing > Price editor** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/editor)), or **SparkLayer Wholesale > Pricing > Price editor** in the Shopify app. ## If something's not right - **The buyer sees retail prices, or products say "Unavailable".** Check their tag, their sync status and that the product is in a price list their group uses. See [Customers can't see B2B prices](https://docs.sparklayer.io/help/troubleshooting.md#customers-cant-see-b2b-prices-or-products-say-unavailable). - **A price isn't the one you expected.** The SKU may be in an earlier price list on the group (see [Price list order](https://docs.sparklayer.io/help/pricing/managing-pricing.md#price-list-order)), or your store prices may include tax. See [Prices are different from what you expect](https://docs.sparklayer.io/help/troubleshooting.md#prices-are-different-from-what-you-expect). - **Tax is charged twice.** Upload net prices, and make automatic lists allow for tax. See [Tax is charged twice](https://docs.sparklayer.io/help/troubleshooting.md#tax-is-charged-twice). - **Some CSV rows were skipped.** Check each SKU matches your store exactly and prices have no currency symbol. See [Skipped rows](https://docs.sparklayer.io/help/pricing/csv-upload.md#skipped-rows). ## Next steps - [Give a key account their own prices](https://docs.sparklayer.io/help/guides/key-account-prices.md): Set different prices for one company or customer - [Get B2B tax and VAT right](https://docs.sparklayer.io/help/guides/tax-and-vat.md): Show net prices and charge VAT once - [Let trusted customers pay later on Net 30](https://docs.sparklayer.io/help/guides/net-terms.md): Offer pay on account with credit limits and terms - [Launch checklist](https://docs.sparklayer.io/help/get-started/launching.md): Test everything, then invite your customers --- # Give a key account their own prices URL: https://docs.sparklayer.io/help/guides/key-account-prices Give one company or customer prices different from their customer group: their own price list, an extra percentage off, or a group of their own. > **Quick summary** > > - You'll end up with one key account seeing their own prices when they sign in, while everyone else in their customer group keeps theirs. > - Allow about 15 minutes once their prices are ready. > - Every plan includes it. A company price list is set in SparkLayer, for Shopify stores that use companies. A customer's own price list or extra discount is set on their record in your store, and isn't available on Wix. Most buyers get their prices from their [customer group](https://docs.sparklayer.io/help/customers/customer-groups.md). For a key account, you set a price list at a more specific level, and the most specific one wins. See [What overrides what](https://docs.sparklayer.io/help/customers.md#who-sets-what). ## Before you start - **Their prices, or the rule for them**, for example 30% off retail, or a spreadsheet of exact prices by SKU. - **Your standard trade prices set up.** If not, follow [Set up wholesale prices](https://docs.sparklayer.io/help/guides/set-up-wholesale-prices.md) first. - **The account in SparkLayer.** Find the company at **Companies** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/companies)), or **SparkLayer Wholesale > Companies** in the Shopify app, or the customer at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app. ## Give them their prices ### Step 1. Choose how to give them their prices | For | Use | Where you set it | | --- | --- | --- | | **A whole business**, with everyone who orders for it | A price list on the [company](https://docs.sparklayer.io/help/customers/companies.md#prices-and-rules) | In SparkLayer (Shopify) | | **One customer** | Their own price lists, with [customer pricing](https://docs.sparklayer.io/help/pricing/customer-pricing.md#give-a-customer-their-own-price-lists) | On their record in your store | | **One customer, a little extra off** | An [extra percentage discount](https://docs.sparklayer.io/help/pricing/customer-pricing.md#give-a-customer-an-extra-percentage-discount) on top of their usual prices | On their record in your store | | **Several key accounts on the same terms** | A [customer group](https://docs.sparklayer.io/help/customers/customer-groups.md#create-a-customer-group) of their own | In SparkLayer, on every platform | For an extra percentage off, skip to [step 4](#add-an-extra-percentage-off). ### Step 2. Create their price list Go to **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app, click **Create price list** and add their prices, automatically or by CSV. Note the list's **Handle**, shown under its name, such as `acme-pricing`. See [Create a price list](https://docs.sparklayer.io/help/pricing/managing-pricing.md#create-a-price-list). [Take the 1-minute tour](https://docs.sparklayer.io/help/pricing/managing-pricing?tour). ### Step 3. Give the price list to the account **Shopify only:** **For a company:** go to **Companies** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/companies)), or **SparkLayer Wholesale > Companies** in the Shopify app , click the company's name and, under **Prices and rules** , choose the **Price list** . Click **Save** . It replaces the group's price lists for everyone at the company. See [Give a company its own price list](https://docs.sparklayer.io/help/pricing/customer-pricing.md#give-a-company-its-own-price-list) . [Take the 1-minute tour](https://docs.sparklayer.io/help/customers/companies?tour) . **For one customer:** add the price lists metafield to your store once, at **Integrations > Platform > Metafields** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform > Metafields** in the Shopify app (click **Configure** next to **SparkLayer metafields**). Then open the customer in your Shopify admin and enter the handle in their price lists metafield, for example `["acme-pricing"]`. Save the customer. **BigCommerce and WooCommerce and Magento only:** Enter the price list's handle in the customer's `price_lists` metafield (or attribute), for example `["acme-pricing"]`, and save the customer. Your developer or agency can set up the field: see [Give a customer their own price lists](https://docs.sparklayer.io/help/pricing/customer-pricing.md#give-a-customer-their-own-price-lists). **Wix only:** Wix doesn't support metafields, so customer pricing isn't available. Create a customer group for the account with its own price list, then add the group's label to the contact. See [Create a customer group](https://docs.sparklayer.io/help/customers/customer-groups.md#create-a-customer-group). A customer's own price lists replace their group's price lists. ### Step 4. Add an extra percentage off Optional. A customer discount takes an extra percentage off whatever prices the customer already gets. **Shopify only:** Enable the customer discount once at **Integrations > Platform > Metafields** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform > Metafields** in the Shopify app. Then open the customer in your Shopify admin and, in the **Metafields** card, enter the percentage in **Customer % Discount**, for example `25`. Save the customer. **BigCommerce and WooCommerce and Magento only:** Set the `discount_percentage` metafield (or attribute) on the customer, for example `25`. Your developer or agency can set up the field. See [Give a customer an extra percentage discount](https://docs.sparklayer.io/help/pricing/customer-pricing.md#give-a-customer-an-extra-percentage-discount). ### Step 5. Check which price wins Open the customer at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app. **Price list override** under **Basic information** and **Discount percentage** under **Financial details** show what's set on them. If you've given a group or company more than one price list, order matters: SparkLayer uses the first list a SKU is in. See [How a buyer's price is chosen](https://docs.sparklayer.io/help/customers.md#how-a-buyers-price-is-chosen). [Take the 1-minute tour](https://docs.sparklayer.io/help/customers/managing-customers?tour). ## Check it worked - **Sign in as someone at the account** and open a product on their price list. They see its price from that list, less any extra percentage. - **Sign in as another buyer in the same group.** They still see the group's prices. - **Search the SKU** at **Pricing > Price editor** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/editor)), or **SparkLayer Wholesale > Pricing > Price editor** in the Shopify app to compare its price in each list. ## If something's not right - **They still see the group's prices.** Check the handle is typed exactly, inside square brackets and double quotes, and that the account has synced. See [Prices for one customer](https://docs.sparklayer.io/help/pricing/customer-pricing.md#give-a-customer-their-own-price-lists). - **They see a price from the wrong list.** The SKU is in an earlier list on their group or company. See [Can I assign several price lists to one customer group or customer?](https://docs.sparklayer.io/help/pricing/faqs.md#can-i-assign-multiple-price-lists-to-one-customer-group-andor-customer) - **A price is different from what you expect.** Your store prices may include tax. See [Prices are different from what you expect](https://docs.sparklayer.io/help/troubleshooting.md#prices-are-different-from-what-you-expect). - **Checkout shows PRICING:001.** The account has price lists in 2 currencies. See [Customers see "An unknown error occurred" at checkout](https://docs.sparklayer.io/help/troubleshooting.md#customers-see-an-unknown-error-occurred-at-checkout). ## Next steps - [Let trusted customers pay later on Net 30](https://docs.sparklayer.io/help/guides/net-terms.md): Give key accounts credit limits and payment terms - [Run volume pricing and promotions](https://docs.sparklayer.io/help/guides/volume-discounts.md): Add price breaks, pack sizes and discounts - [Set up wholesale prices](https://docs.sparklayer.io/help/guides/set-up-wholesale-prices.md): The price list and customer group everyone else uses --- # Move brand discounts from another wholesale app URL: https://docs.sparklayer.io/help/guides/migrate-brand-discounts Applies to: Shopify Recreate brand-by-brand trade discounts from another wholesale app in SparkLayer, with a manual price list per brand and a customer group per mix. > **Quick summary** > > - You'll end up with each B2B customer getting the same discount on each brand as in your old wholesale app, for example 30% off Brand A and 20% off Brand B. > - An automatic price list always applies to every product, so a discount on one brand needs a manual price list, built from a CSV of that brand's SKUs. > - Customers who get the same mix of brand discounts share a customer group. Allow about an hour for a few brands, and longer if you have many combinations. > - Price lists are on every plan. The free Basic plan includes 3 price lists, so you'll usually need Starter or above, which have unlimited price lists. Some wholesale apps give a customer a percentage off a whole brand (the **Vendor** on a Shopify product). SparkLayer prices by SKU instead. You recreate each brand discount as a manual price list that holds the discounted price for every SKU of that brand, then give each customer the lists they need through their customer group. How brand discounts become price lists: 1. **Product export**: Your Shopify products, filtered by vendor 2. **One price list per brand discount**: For example "Brand A 30%", uploaded by CSV 3. **One customer group per mix**: Holds each brand list the customers get, in order 4. **Customer tags**: `b2b` plus the group's tag ## Before you start - **A list of your brand discounts**, from your old app: which customers get what percentage off which brand. - **A unique SKU on every variant**, with each product **Active** and published to the **SparkLayer Wholesale** sales channel. Prices are matched to products by SKU. - **Excel or Google Sheets**, to work out the prices. - **The right plan** for the number of price lists you need. See [If you're on the Basic plan](https://docs.sparklayer.io/help/pricing/managing-pricing.md#if-youre-on-the-basic-plan). ## Set up your brand discounts ### Step 1. Work out your combinations List each customer's brand discounts. Each brand and percentage becomes one price list. Each unique mix of price lists becomes one customer group, because a customer can only be in one group. | Customer | Discounts in your old app | Price lists | Customer group | | --- | --- | --- | --- | | Retailer 1 | 30% off Brand A, 20% off Brand B | Brand A 30%, Brand B 20% | Brand A 30 + Brand B 20 | | Retailer 2 | 30% off Brand A, 20% off Brand B | Brand A 30%, Brand B 20% | Brand A 30 + Brand B 20 | | Retailer 3 | 25% off Brand A | Brand A 25% | Brand A 25 | Retailers 1 and 2 share a group. Brand A needs two price lists, one at 30% and one at 25%. ### Step 2. Export your products from Shopify In your Shopify admin, go to **Products** ([open in the Shopify admin](https://admin.shopify.com/products)), click **Export** and export all products as a CSV file. Open it in Excel or Google Sheets. Each variant has its own row, with its **Vendor**, **Variant SKU** and **Variant Price**. ### Step 3. Build a CSV for each brand discount For each price list from step 1: 1. Filter the sheet by **Vendor** to show only that brand. 2. Copy the **Variant SKU** and **Variant Price** columns into a new sheet. Delete any rows with no SKU. 3. Add a column that works out the discounted price. For 30% off a price in column B, use `=ROUND(B2*(1-0.3),2)` and fill it down. 4. Keep two columns, headed `sku` and `price`, with the discounted prices as numbers only. Remove any spaces before or after the SKUs (the `TRIM` function does this). 5. Save the sheet as a CSV file, for example `brand-a-30.csv`. **More detail** - If your Shopify prices include tax, the discount is taken off the tax-inclusive price, so allow for tax when you work out your prices. See [Tax and VAT](https://docs.sparklayer.io/help/guides/tax-and-vat.md). - The CSV format is in [Prepare your CSV file](https://docs.sparklayer.io/help/pricing/csv-upload.md#prepare-your-csv-file). ### Step 4. Create a manual price list for each brand discount 1. Go to **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app and click **Create price list**. 2. Enter a **Name**, such as "Brand A 30%", and choose the **Currency**. 3. Tick **Enable manual pricing** and click **Save**. 4. Click **Upload** next to the new list, choose that brand's CSV file, check the rows under **Check your upload**, then click **Import**. Repeat for each brand discount. See [Create a price list](https://docs.sparklayer.io/help/pricing/managing-pricing.md#create-a-price-list) and [Upload prices by CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md). ### Step 5. Create a customer group for each combination 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 **Create customer group**. 2. Enter a **Name**, such as "Brand A 30 + Brand B 20", and click **Create group**. Note the group's tag, for example `b2b-brand-a-30-brand-b-20`. 3. Open the group and, under **Price lists**, add each of its brand price lists. Click **Add price list** for each one. 4. Click **Save**. **Products from other brands** A customer only gets prices for SKUs in their group's price lists, so products from brands with no discount show as **Unavailable**. To sell those at another price, add a list that covers them last, for example an automatic list at 0% off your Shopify prices. Price lists are used in order: SparkLayer uses the first list on the group that contains the SKU, so the brand lists must come before the catch-all list. See [Which price list wins](https://docs.sparklayer.io/help/pricing/managing-pricing.md#price-list-order). ### Step 6. Tag your customers In your Shopify admin, open each customer and give them the tag `b2b` plus their group's tag, for example `b2b-brand-a-30-brand-b-20`. Save the customer. A customer can have no more than two B2B tags. See [Assign customers to a customer group](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#assign-customers-to-a-customer-group). ## Add new products later When you add products to a brand, export just the new products, work out their prices as in step 3, and upload a CSV with only the new SKUs to that brand's price list. Prices already on the list stay as they are. ## Check it worked - **Sign in as a customer in each group**, or use [Try it out](https://docs.sparklayer.io/help/get-started/launching.md#place-a-test-order), and open a product from each brand. The price matches what they got in your old app. - **Search a SKU** at **Pricing > Price editor** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/editor)), or **SparkLayer Wholesale > Pricing > Price editor** in the Shopify app to see its price in each list. - **Open a product from a brand with no discount.** It shows the price from your catch-all list, or **Unavailable** if you didn't add one. ## If something's not right - **A product shows Unavailable.** Its SKU isn't in any of the group's price lists, or the upload didn't match it. See [Why a product shows Unavailable](https://docs.sparklayer.io/help/pricing/managing-pricing.md#unavailable). - **The upload worked but nothing matched.** The SKUs probably have spaces before or after them. See [The upload worked, but products show as Unavailable](https://docs.sparklayer.io/help/pricing/csv-upload.md#unavailable-after-upload). - **A product gets the wrong brand's discount.** The SKU is in more than one of the group's lists, and the first one wins. Check the vendor filter in your CSV files and the order of the lists on the group. - **A customer sees the Base group's prices.** Check they have both the `b2b` tag and their group's tag. - **Prices are a little off.** Your Shopify prices may include tax. See [Prices are different from what you expect](https://docs.sparklayer.io/help/troubleshooting.md#prices-are-different-from-what-you-expect). ## Next steps - [Price lists](https://docs.sparklayer.io/help/pricing/managing-pricing.md): Manage, clear and reorder your price lists - [Customer groups](https://docs.sparklayer.io/help/customers/customer-groups.md): Payment methods, order limits and other rules for each group - [Run volume pricing and promotions](https://docs.sparklayer.io/help/guides/volume-discounts.md): Add price breaks, pack sizes and discounts --- # How payments work URL: https://docs.sparklayer.io/help/guides/how-payments-work Applies to: Shopify Follow Pay Online by Card, Pay by Invoice and Pay on Account from checkout to payment on Shopify, and choose which to offer each customer group. > **Quick summary** > > - SparkLayer has 3 payment methods. With **Pay Online by Card**, the customer pays at the Shopify checkout. With **Pay by Invoice** and **Pay on Account**, they order now and pay you later. > - You choose the methods for each customer group in its **Payment methods** rule at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app. > - Pay-later orders arrive in Shopify as draft orders, or as unpaid orders if **Auto-complete draft orders** is on. Card orders arrive paid. > - [SparkLayer Invoices](https://docs.sparklayer.io/help/ordering/invoices.md) needs the Growth plan or above. The [Xero](https://docs.sparklayer.io/help/integrations/accountancy/xero.md) and [QuickBooks Online](https://docs.sparklayer.io/help/integrations/accountancy/quickbooks.md) integrations need Pro or above. Every B2B order is paid one of 3 ways. In the guide below, pick the options you use, such as how you send invoices or whether a customer has a credit limit, and each flow shows what the customer, SparkLayer, Shopify and your accounting software do. **Interactive guide: how payments work** ([open the interactive guide](https://docs.sparklayer.io/guides/payment-methods/index.html)). For each of the 3 payment methods, a flow you can change shows each step from checkout to payment, with how to set it up, a credit limit example and which set-up suits which customers. The same information is in the sections below and the pages they link to. ## The 3 payment methods Customers choose a method on the **Review & Pay** step of the [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md), from the methods their customer group allows. A company or location with **Let them pay later** off can only pay by card. Quotes aren't a payment method: with the [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md), the customer chooses how to pay when they complete the quote. | Payment method | Pay Online by Card | Pay by Invoice | Pay on Account | | --- | --- | --- | --- | | **The customer pays** | At the Shopify checkout | After you invoice them | By their due date, for example Net 30 | | **The order arrives in Shopify as** | A paid order | A draft order, or an unpaid order with auto-complete on | A draft order with payment terms, or an unpaid order with auto-complete on | | **In the customer group rule** | **Card at checkout** | **Pay by invoice** | **Payment on account** | ### Pay Online by Card The customer pays in full at your Shopify checkout, and the order arrives paid. In SparkLayer, card is simply on or off for each customer group. When a sales rep [orders for a customer](https://docs.sparklayer.io/help/sales-ordering/order-for-a-customer.md#how-the-order-and-payment-work) and chooses card, the customer is emailed a link to pay. ### Pay by Invoice The customer orders without paying, and you invoice them. Send the invoice from the Shopify draft order, with [SparkLayer Invoices](https://docs.sparklayer.io/help/ordering/invoices.md), or through [Xero or QuickBooks Online](https://docs.sparklayer.io/help/integrations/accountancy.md). Shopify's **Send invoice** is only on draft orders, so use it with **Auto-complete draft orders** off. See [Choose how to send invoices](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md#choose-how-to-send-invoices). ### Pay on Account The customer orders within their credit limit and pays on their net terms. You set both on the customer, in the **Credit Limit and Account Balance** metafield. By default, Pay on Account is turned off for an order over the credit limit. With Xero, payments on the invoice reduce the customer's balance automatically; QuickBooks Online doesn't send payments back. See [Credit limits and net terms](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md). ## Next steps - [Payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md): Choose each group's methods, and rename or reorder them at checkout - [Let trusted customers pay later on Net 30](https://docs.sparklayer.io/help/guides/net-terms.md): Set up Pay on Account with credit limits and payment terms - [Process your B2B orders in Shopify](https://docs.sparklayer.io/help/guides/process-orders-in-shopify.md): Complete drafts, take payment and send invoices --- # Let trusted customers pay later on Net 30 URL: https://docs.sparklayer.io/help/guides/net-terms Let trusted B2B customers order now and pay later: turn on Pay on Account for their group, set credit limits and Net 30 terms, and choose how to invoice. > **Quick summary** > > - You'll end up with trusted customers who can choose **Pay on Account** at checkout, within a credit limit, on terms such as Net 30. They see their balance, limit and terms in My Account. > - Allow about 30 minutes, plus a minute for each customer you give terms to. > - Pay on Account, credit limits and net terms are on every plan. [SparkLayer Invoices](https://docs.sparklayer.io/help/ordering/invoices.md) needs the Growth plan or above. > - Works on every platform. Credit limits and terms live in a customer [metafield](https://docs.sparklayer.io/help/glossary.md#metafields); on Shopify, SparkLayer adds it for you. [Net terms](https://docs.sparklayer.io/help/glossary.md#net-terms) are the number of days a customer has to pay for an order they didn't pay for at checkout, such as 30 days on Net 30. There are 2 ways to pay later. **Pay on Account** charges the order to the customer's account, within their credit limit and on their net terms. **Pay by Invoice** lets them order without payment details, and you invoice them. Credit limits only apply to Pay on Account. See [Which method to offer](https://docs.sparklayer.io/help/ordering/payment-methods.md#which-method-to-offer). ## Before you start - **Which customers get terms**, their credit limits and their terms, such as Net 30. - **How you'll invoice them**: SparkLayer Invoices, your store, your own invoice files or an app. See [Choose how to send invoices](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md#choose-how-to-send-invoices). - **Access to edit customers** in your store admin, where the terms are stored. ## Set it up ### Step 1. Put trusted customers in their own group Optional, but it keeps card-only customers separate. 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, click **Create customer group**, name it, for example "Trade 30 days", and add the customers to it. See [Create a customer group](https://docs.sparklayer.io/help/customers/customer-groups.md#create-a-customer-group). ### Step 2. Turn on Pay on Account for the group Open the group, click **Override** next to **Payment methods** (on the Base group, **Customize**), tick **Payment on account** and click **Save**. Keep **Card at checkout** ticked if they can also pay by card. See [Choose which payment methods a customer group can use](https://docs.sparklayer.io/help/ordering/payment-methods.md#choose-which-payment-methods-a-customer-group-can-use). [Take the 1-minute tour](https://docs.sparklayer.io/help/customers/customer-groups?tour). ### Step 3. Add the payment on account metafield Credit limits, balances and net terms all live in one customer metafield, **Credit Limit and Account Balance** (`sparklayer.payment_on_account`). You add it once. **Shopify only:** Go to **Integrations > Platform** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform** in the Shopify app. In the **Metafields** card, click **Configure** next to **SparkLayer metafields** and enable it. See [Add metafields automatically](https://docs.sparklayer.io/help/platforms/shopify/metafields.md#add-metafields-automatically). **BigCommerce and Wix and WooCommerce and Magento only:** Ask your developer to add it, using the settings in [The payment on account metafield](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md#the-payment-on-account-metafield) and the [developer docs](https://docs.sparklayer.io/developers.md). ### Step 4. Set each customer's credit limit and terms Fill in the form with the customer's limit and terms, and copy the value it writes. For a 1,000 credit limit on Net 30, it's `{"credit_limit":1000,"net_terms":"30_days"}`. Then open the customer in your store admin, paste the value into the metafield and save. **Lots of customers? Fill them in one table (Shopify):** in your Shopify admin, go to **Customers**, tick the customers and click **Edit customers**. Click **Columns**, tick **Credit Limit and Account Balance** under **Metafields**, type the values and click **Save**. See [Shopify's guide](https://help.shopify.com/en/manual/custom-data/metafields/bulk-edit-metafields). Terms can be 7, 15, 30, 45, 60 or 90 days. To add an opening balance, or a currency, see [Set a credit limit and account balance](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md#set-a-credit-limit-and-account-balance) and [Set net payment terms](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md#set-net-payment-terms). **Example: $250 to spend** Available credit is the `credit_limit` minus the `balance`, which is what the customer owes you. To give them $250 to spend, enter `{"credit_limit":250,"balance":0}`. After a $77.80 Pay on Account order, the balance is 77.80 and they have $172.20 left. Don't set `balance` to 250: that means they've already used it all. See [Worked example](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md#worked-example). **More detail** By default, a customer can't pay on account for an order over their credit limit. To allow it, see [Let customers order over their credit limit](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md#let-customers-order-over-their-credit-limit). ### Step 5. Decide what happens to their orders **Shopify only:** Pay on Account orders arrive in Shopify as draft orders, with **Payment terms** and a due date filled in, such as "Payment due on 19 June 2023 (Net 30)". To complete them automatically and collect payment later, turn on **Auto-complete draft orders** at **Integrations > Platform > Shopify order actions** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform > Shopify order actions** in the Shopify app. See [Process your B2B orders in Shopify](https://docs.sparklayer.io/help/guides/process-orders-in-shopify.md). **BigCommerce and Wix and WooCommerce and Magento only:** Orders are placed without payment details, and you collect payment later. On Wix, they arrive with a payment status of "UNPAID": mark them as paid once you've been paid. See [How orders arrive in your store](https://docs.sparklayer.io/help/ordering/payment-methods.md#how-orders-arrive). ### Step 6. Choose how to send invoices To let customers download a PDF invoice from My Account, turn on **Invoices** 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 (Growth plan and above). Add your bank details with **Invoice Settings**. See [Turn on invoices](https://docs.sparklayer.io/help/ordering/invoices.md#turn-on-invoices). [Take the 1-minute tour](https://docs.sparklayer.io/help/dashboard/settings?tour). An invoice is created once the order reaches **Processing**, so draft orders get one when they're completed. For other ways to invoice, see [Choose how to send invoices](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md#choose-how-to-send-invoices). ## Check it worked - **In SparkLayer**, open the customer at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app. Under **Financial details**, **Payment on account** shows their **Credit limit** and **Net terms**. - **In My Account**, signed in as the customer, **Financials** shows their balance, credit limit and payment terms. - **At checkout**, **Pay on Account** is offered. Place a small test order with it. - **In your store**, the order arrives unpaid, with its terms. On Shopify, it's a draft order with **Payment due later** ticked. ## If something's not right - **Only card payment shows at checkout.** Check the group allows **Payment on account**. On Shopify, a company with **Let them pay later** off can only pay by card. See [Payment methods](https://docs.sparklayer.io/help/customers/customer-groups.md#choose-payment-methods) and [Paying](https://docs.sparklayer.io/help/customers/companies.md#paying). - **Pay on Account is blocked for a customer you've just given credit.** Check their `balance` is 0, not the same as their limit. See [Worked example](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md#worked-example). - **Pay on Account disappears for a large order.** The order would take them over their credit limit. See [What happens when a customer goes over their credit limit?](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md#what-happens-when-a-customer-goes-over-their-credit-limit) - **The balance in the metafield doesn't change.** That's expected: SparkLayer works out the live balance itself. See [Why is the "Payment on Account" metafield not updating?](https://docs.sparklayer.io/help/ordering/payment-methods.md#why-is-the-payment-on-account-metafield-not-updating) - **An order has no invoice.** Draft orders and orders awaiting approval get one once they're completed. See [When invoices are available](https://docs.sparklayer.io/help/ordering/invoices.md#when-invoices-are-available). ## Next steps - [How payments work](https://docs.sparklayer.io/help/guides/how-payments-work.md): Follow each payment method from checkout to payment - [Process your B2B orders in Shopify](https://docs.sparklayer.io/help/guides/process-orders-in-shopify.md): Complete drafts, take payment and send invoices - [Give a key account their own prices](https://docs.sparklayer.io/help/guides/key-account-prices.md): Set different prices for your best customers - [Get B2B tax and VAT right](https://docs.sparklayer.io/help/guides/tax-and-vat.md): Make sure tax is charged once, at checkout --- # Process your B2B orders in Shopify URL: https://docs.sparklayer.io/help/guides/process-orders-in-shopify Applies to: Shopify Find SparkLayer orders in Shopify, review and complete draft orders, take payment or mark them as paid, automate the routine parts and give buyers invoices. > **Quick summary** > > - You'll end up with a routine for every B2B order: card orders arrive paid, and pay-later orders arrive as Shopify draft orders that you review, complete and get paid for. > - Allow about 20 minutes to set up, then a minute or two per order. Automation can take most of that away. > - Draft orders and auto-complete are on every plan. [SparkLayer Invoices](https://docs.sparklayer.io/help/ordering/invoices.md) needs the Growth plan or above. [Shopify Flow](https://docs.sparklayer.io/help/platforms/shopify/customisations/flow.md) is a free Shopify app, on every Shopify plan. How an order arrives depends on how the buyer pays. Card orders go through the Shopify checkout and arrive paid. **Pay on Account** and **Pay by Invoice** orders arrive as [draft orders](https://help.shopify.com/en/manual/orders/create-orders), so you can change them before you take payment and fulfil. ## Before you start - **Your customer groups' payment methods set.** See [Choose which payment methods a customer group can use](https://docs.sparklayer.io/help/ordering/payment-methods.md#choose-which-payment-methods-a-customer-group-can-use). - **Access to Orders in your Shopify admin**, including **Drafts**. - **A test order** to work through, for example one placed with [Try it out](https://docs.sparklayer.io/help/get-started/launching.md#place-a-test-order) using **Pay by Invoice**. ## Handle an order ### Step 1. Find the order | The buyer chose | Where the order is | | --- | --- | | **Pay Online by Card** | In your Shopify **Orders**, paid. | | **Pay on Account** or **Pay by Invoice** | In **Orders > Drafts** ([open in the Shopify admin](https://admin.shopify.com/draft_orders)). In SparkLayer, it shows as **Awaiting merchant** until it's completed. | | **Pay Online by Card**, chosen by a sales agent or a company user | In **Drafts**. Shopify emails the buyer to complete payment. | | **Pay Online by Card**, but the buyer left the checkout before paying | In **Drafts**, with no payment taken. Send the invoice or follow up with the buyer. | Every B2B order has the `b2b` tag, so you can filter by it. See [How orders arrive in your store](https://docs.sparklayer.io/help/ordering/payment-methods.md#how-orders-arrive). ### Step 2. Get told about new draft orders Shopify doesn't notify you about new draft orders. Set up an email alert with Shopify Flow, so someone knows to review each one. See [Get email alerts for new draft orders](https://docs.sparklayer.io/help/ordering/automation-and-workflows.md#get-email-alerts-for-new-draft-orders). ### Step 3. Review the draft order Open the draft and change anything you need before you complete it, such as quantities or the shipping cost. To change shipping, see [Change shipping costs after an order is placed](https://docs.sparklayer.io/help/ordering/shipping-rules.md#change-shipping-costs-after-an-order-is-placed-on-shopify). ### Step 4. Complete it and take payment Choose how you'll be paid: | To | Do this in the draft order | | --- | --- | | **Send the buyer a payment link** | Send the invoice. The buyer gets an email with a **Complete your purchase** button. When they pay, the order moves to **Orders**, marked as paid. Click **Resend invoice** if they haven't paid. | | **Record a payment you've taken another way** | Use **Collect payment** to mark it as paid. | | **Give the buyer time to pay** | Add payment terms. Pay on Account orders arrive with their terms already filled in. | See [Send invoices from your store](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md#send-invoices-from-your-store) and Shopify's guide to [accepting payment](https://help.shopify.com/en/manual/orders/create-orders#accept-payment). ### Step 5. Automate the routine parts Optional. If you don't need to change orders before completing them: - **Complete drafts automatically:** turn on **Auto-complete draft orders** at **Integrations > Platform > Shopify order actions** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform > Shopify order actions** in the Shopify app and click **Save**. See [Complete draft orders automatically](https://docs.sparklayer.io/help/ordering/automation-and-workflows.md#complete-draft-orders-and-mark-them-as-paid-automatically). [Take the 1-minute tour](https://docs.sparklayer.io/help/integrations/managing-integrations?tour). - **Mark orders as paid automatically:** import our **Mark order as paid** or **Mark Payment on Account order as paid** workflow into Shopify Flow. See [Order workflows](https://docs.sparklayer.io/help/platforms/shopify/customisations/flow.md#order-workflows). > **Auto-completed orders can't be edited** > > Because of a Shopify limitation, orders completed by **Auto-complete draft orders** can't be edited afterwards. Shopify shows "Unable to edit order". ### Step 6. Give the buyer their invoice With **Invoices** on 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, SparkLayer creates a PDF invoice once the order reaches **Processing**. The buyer downloads it with **View & Download Invoice** on the order in My Account. Draft orders get one when they're completed. See [Invoices](https://docs.sparklayer.io/help/ordering/invoices.md) and [When invoices are available](https://docs.sparklayer.io/help/ordering/invoices.md#when-invoices-are-available). Then fulfil the order in Shopify as you would any other. ## Check it worked Work through your test order: - **It's in Orders > Drafts**, and shows as **Awaiting merchant** at **Orders** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/activity)), or **SparkLayer Wholesale > Orders** in the Shopify app. [Take the 1-minute tour](https://docs.sparklayer.io/help/dashboard/orders?tour). - **Once you complete it**, it moves to your Shopify **Orders**. - **In the buyer's My Account**, its status changes from "Awaiting merchant", for example to "Processing", and **View & Download Invoice** appears if invoices are on. ## If something's not right - **An order isn't in your Shopify orders.** It's probably a draft. See [Orders don't show in your Shopify orders](https://docs.sparklayer.io/help/troubleshooting.md#orders-dont-show-in-your-shopify-orders). - **Shopify says "Unable to edit order".** The order was auto-completed. See "Can I edit orders?" in [Shopify FAQs](https://docs.sparklayer.io/help/platforms/shopify/faqs.md#orders). - **The buyer sees "Awaiting merchant".** That's expected until you complete the draft. See [Orders show as "Awaiting merchant"](https://docs.sparklayer.io/help/troubleshooting.md#orders-show-as-awaiting-merchant). - **The buyer can't download an invoice.** See [I can't download an invoice](https://docs.sparklayer.io/help/ordering/invoices.md#i-cant-download-an-invoice-what-am-i-doing-wrong). ## Next steps - [Let trusted customers pay later on Net 30](https://docs.sparklayer.io/help/guides/net-terms.md): Set credit limits and payment terms - [Charge the right B2B shipping](https://docs.sparklayer.io/help/guides/b2b-shipping.md): Set B2B shipping methods and costs - [Get B2B tax and VAT right](https://docs.sparklayer.io/help/guides/tax-and-vat.md): Make sure tax on orders is right --- # Show imported or manual orders in My Account URL: https://docs.sparklayer.io/help/guides/show-imported-orders Applies to: Shopify Show orders created outside the SparkLayer checkout, such as Shopify draft orders or imported history, in My Account with a tag and an order metafield. > **Quick summary** > > - You'll end up with orders you created in the Shopify admin, or imported from another system, showing in your customers' order history in My Account. > - Allow about 10 minutes for a few orders. For hundreds, allow longer and use an import app such as Matrixify. > - Everything in this guide is for Shopify. On BigCommerce, see [Import past orders](https://docs.sparklayer.io/help/platforms/bigcommerce/metafields.md#import-past-orders). [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md) only shows orders placed through the SparkLayer checkout. An order created another way, such as a draft order you made in the Shopify admin or a historic order you imported, needs 2 things before it shows: the `b2b` order tag, and the **B2B - Order Import** order metafield set to `true`. ## Before you start - **SparkLayer installed** on your store. Set orders up after installing, so they sync. - **Each order belongs to the B2B customer** who should see it. - **A list of the orders** to show, with their Shopify order numbers. ## Show the orders ### Step 1. Add the order import metafield The order metafield `sparklayer.order_import` must exist before you can fill it in. In Shopify, go to **Settings > Custom data** ([open in the Shopify admin](https://admin.shopify.com/settings/custom_data)), click **Orders** and check for **B2B - Order Import**. If it isn't there, click **Add definition** and enter: | Field | Value | | --- | --- | | **Namespace and key** | `sparklayer.order_import` | | **Type** | True or false (`boolean`) | See [Import order history into SparkLayer](https://docs.sparklayer.io/help/platforms/shopify/metafields.md#import-order-history-into-sparklayer). ### Step 2. Tag the orders `b2b` For one order, open it in **Orders** ([open in the Shopify admin](https://admin.shopify.com/orders)), add the tag `b2b` under **Tags** and save. For many, tick the orders in **Orders** ([open in the Shopify admin](https://admin.shopify.com/orders)), click **Add tags**, enter `b2b` and save. ### Step 3. Set the metafield to true For one order, open it in Shopify and, in its **Metafields** card, set **B2B - Order Import** to `true`. Click **Show all** if you can't see it. Save the order. **For many orders, use Matrixify** An import app such as [Matrixify](https://apps.shopify.com/excel-export-import) sets the metafield on many orders at once. Start from our [sample CSV template](https://cdn.shopify.com/s/files/1/0612/7602/9065/files/example-historic-order-import.csv?v=1738672207), or put each Shopify order ID in the `ID` column: | ID | Metafield: sparklayer.order\_import \[boolean] | Command | | --- | --- | --- | | `[order-id-here]` | `TRUE` | `UPDATE` | ## Check it worked - **In SparkLayer**, the orders show at **Orders** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/activity)), or **SparkLayer Wholesale > Orders** in the Shopify app. - **In My Account**, signed in as the customer, the orders show in **Recent Activity**. - **In Shopify**, each order has the `b2b` tag and **B2B - Order Import** is `true`. ## If something's not right - **The order doesn't show.** Check it has both the `b2b` tag and the metafield set to `true`. One without the other isn't enough. - **You can't find B2B - Order Import on the order.** The metafield definition doesn't exist yet. Add it as in step 1, then set the value. - **A draft order you created still doesn't show.** Draft orders aren't listed in My Account until they're completed. Complete it in Shopify first. See [Complete a draft order by hand](https://docs.sparklayer.io/help/ordering/automation-and-workflows.md#complete-a-draft-order-by-hand). ## Next steps - [Move your existing wholesale customers onto SparkLayer](https://docs.sparklayer.io/help/guides/move-existing-customers.md): Bring across customers, their terms and their order history - [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md): What customers see in their order history - [Shopify metafields and data mapping](https://docs.sparklayer.io/help/platforms/shopify/metafields.md): Every SparkLayer metafield, and how to fill them in bulk --- # Keep wholesale prices and products hidden from retail shoppers URL: https://docs.sparklayer.io/help/guides/hide-wholesale-from-retail Applies to: Shopify Hide B2B-only products from retail shoppers with B2B Catalogs, hide prices from signed-out visitors, or make everyone sign in before they see your store. > **Quick summary** > > - You'll end up with retail shoppers and signed-out visitors seeing only what's meant for them, while signed-in B2B customers see your full wholesale range and prices. > - Allow about 30 minutes for B2B Catalogs. Hiding prices or locking the store is a theme code change, so allow time for your developer. > - [B2B Catalogs](https://docs.sparklayer.io/help/storefront/b2b-catalogs.md) is a free app on every SparkLayer plan. Everything in this guide is for Shopify. Retail and B2B customers can share one Shopify store. SparkLayer only shows B2B prices to signed-in B2B customers, but your products and Shopify prices are visible to everyone until you hide them. ## Before you start - **Your B2B customers tagged `b2b`** in Shopify. See [Assign customers to a customer group](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#assign-customers-to-a-customer-group). - **A list of B2B-only products**, and any that should be retail-only. - **Someone who can edit your theme code**, if you'll hide prices or lock the store. We can explain the approach, but we can't make the changes for you. ## Hide what retail shoppers shouldn't see ### Step 1. Choose what to hide | To hide | Use | How | | --- | --- | --- | | **Products** from retail customers, or from B2B customers | B2B Catalogs (steps 2 to 4) | Tags in your Shopify admin, no code | | **Prices** from signed-out visitors | Liquid code in your theme (step 5) | A developer change | | **Your whole store** until a customer signs in | Liquid code in your theme (step 6) | A developer change | You can use any of them together. See [B2B Catalogs or B2B-only content](https://docs.sparklayer.io/help/storefront/b2b-catalogs.md#b2b-catalogs-or-b2b-only-content). ### Step 2. Install and enable B2B Catalogs Install [B2B Catalogs](https://apps.shopify.com/sparklayer-b2b-catalogs) from the Shopify App Store. Open it in your Shopify admin and, under **Enable on your theme**, choose your theme and click **Enable**. See [Install and enable B2B Catalogs](https://docs.sparklayer.io/help/storefront/b2b-catalogs.md#install-and-enable-b2b-catalogs). ### Step 3. Tag your B2B-only products In your Shopify admin, open each product and add the tag `b2b-only`, then save. Use `b2c-only` for products only retail customers should see. Products with neither tag are shown to everyone. See [Make a product B2B-only or B2C-only](https://docs.sparklayer.io/help/storefront/b2b-catalogs/configuring-your-catalogs.md#make-a-product-b2b-only-or-b2c-only). A hidden product disappears from product pages, collection pages and store search. If someone opens its URL directly, they see an access denied page, which you can change: see [Customise the access denied page](https://docs.sparklayer.io/help/storefront/b2b-catalogs/configuring-access-denied-view.md). ### Step 4. Hide products from some customer groups Optional. To show a range to one customer group only, hide its variants from the other groups with the `sparklayer.settings` variant metafield. This needs the SparkLayer Wholesale app as well as B2B Catalogs. Tag the products `b2b-only` too if retail shoppers shouldn't see them. See [Catalogs per customer group](https://docs.sparklayer.io/help/storefront/b2b-catalogs/configuring-advanced-catalogs.md), and the [worked example](https://docs.sparklayer.io/help/storefront/product-settings.md#example-a-product-range-for-each-customer-group). [Hide products from customers](https://docs.sparklayer.io/help/guides/hide-products.md) has a form that writes the rule, and your AI assistant can apply it. Variant rules only apply to B2B customer groups: they don't hide anything from retail shoppers, and Shopify can't hide a single variant from them. To keep one variant for B2B customers only, make it a separate product and tag it `b2b-only`: see [Sell a B2B-only version of a product](https://docs.sparklayer.io/help/guides/sell-b2b-only-versions.md). ### Step 5. Hide prices from signed-out visitors Optional. Ask your developer to add the example code to your product cards and product page. Signed-in B2B customers see the SparkLayer product card, and everyone else sees "Please sign in to see pricing". See [Hide prices from signed-out visitors](https://docs.sparklayer.io/help/platforms/shopify/customisations/b2b-only-content.md#hide-prices-from-signed-out-visitors). ### Step 6. Make customers sign in first Optional, for a store that's only for trade customers. Ask your developer to add the redirect code to `theme.liquid`. Signed-out visitors go to the login page, except on pages you leave open, such as `/pages/b2b-login`. See [Make customers sign in before they see your store](https://docs.sparklayer.io/help/platforms/shopify/customisations/registration-and-login.md#make-customers-sign-in-before-they-see-your-store). ## Check it worked - **Signed out, in a private browser window:** B2B-only products don't appear in collections or search, opening one's URL shows the access denied page, and prices are hidden if you added that code. - **Signed in as a B2B customer:** you see the B2B-only products with your trade prices, and not the `b2c-only` ones. - **Signed in as a customer in another group:** products you've hidden from that group don't appear. ## If something's not right - **B2B Catalogs can't change your theme.** The theme has invalid Liquid syntax. See [Invalid Liquid syntax](https://docs.sparklayer.io/help/storefront/b2b-catalogs/limitations.md#invalid-liquid-syntax). - **A retail shopper sees a B2B-only variant.** Variant rules don't apply to retail shoppers. Make the variant a separate `b2b-only` product. See [Variants and retail shoppers](https://docs.sparklayer.io/help/storefront/b2b-catalogs/limitations.md#variants-and-retail-shoppers). - **A collection page has gaps, or its counts include hidden products.** Hiding happens as the page loads. See [Collection grids, search and filter counts](https://docs.sparklayer.io/help/storefront/b2b-catalogs/limitations.md#grids-search-and-filter-counts). - **A hidden product is still in someone's cart.** Products already in a cart stay there. See [Hidden products in a cart](https://docs.sparklayer.io/help/storefront/b2b-catalogs/limitations.md#hidden-product-add-to-cart-caveats). - **B2B-only products are in your sitemap.** Shopify's sitemap still lists them, but search engines can't see the pages. See [B2B Catalogs FAQs](https://docs.sparklayer.io/help/storefront/b2b-catalogs/faqs.md#visibility). - **Your Shopify prices show in Google.** That's standard Shopify behaviour, not SparkLayer. See "How do I stop my Shopify prices showing in Google search results?" in [Shopify FAQs](https://docs.sparklayer.io/help/platforms/shopify/faqs.md#theme-and-storefront). ## Next steps - [Let new trade customers apply](https://docs.sparklayer.io/help/guides/approve-trade-applications.md): Add a B2B login page and approve applications - [Set up wholesale prices](https://docs.sparklayer.io/help/guides/set-up-wholesale-prices.md): Set the prices signed-in buyers see - [B2B-only content](https://docs.sparklayer.io/help/platforms/shopify/customisations/b2b-only-content.md): Show B2B-only menus, banners and content --- # Hide products from customers URL: https://docs.sparklayer.io/help/guides/hide-products Applies to: Shopify, BigCommerce, WooCommerce, Magento Hide products from B2B customers, some customer groups or retail shoppers: in Catalog and Quick Order, the cart and your store's pages, one product or hundreds. > **Quick summary** > > - You'll end up with the products you choose hidden from the customers who shouldn't see them: every B2B customer, some customer groups or retail shoppers. > - Most stores hide custom products that need artwork, printing charges and add-on fees, or a range kept for one customer group. > - Allow about 15 minutes, plus a minute or so a product. A form on this page writes the setting for you, and your AI assistant can apply it to every product. There are 2 places a product can show: in SparkLayer, where B2B customers and sales reps order, and on your store's own pages. You hide it from each in a different way. Most stores only need the first. ## Pick the right option | You want to | Do this | Hidden in | | --- | --- | --- | | **Stop B2B customers seeing or ordering a product**, such as a custom product or a fee | Set `"display": false` in the product's `sparklayer.settings`, as on this page | SparkLayer: Catalog and Quick Order, search in My Cart and SparkLayer's product interfaces | | **Keep it on show, but stop orders** | Set `"sell": false` instead | Nothing hidden: it can't be added to the cart | | **Show a range to some customer groups only** | Hide it for everyone with a `base` entry, then show it to those groups | SparkLayer, for every other group | | **Hide products from retail shoppers and signed-out visitors** | Tag them `b2b-only` with the free B2B Catalogs app (Shopify) | Your store's collection, search and product pages. See [Keep wholesale hidden from retail shoppers](https://docs.sparklayer.io/help/guides/hide-wholesale-from-retail.md) | | **Hide a range from some customer groups on your store's pages too** | Combine the two: B2B Catalogs and `display` per customer group (Shopify) | SparkLayer and your store's pages. See [Catalogs per customer group](https://docs.sparklayer.io/help/storefront/b2b-catalogs/configuring-advanced-catalogs.md) | **What each setting hides, in detail** `display` and `sell` are 2 of the [product rules per customer group](https://docs.sparklayer.io/help/storefront/product-settings.md) in the `sparklayer.settings` metafield. They only apply to signed-in B2B customers, and to sales reps ordering for them. Retail shoppers see whatever your theme shows. See [What hides what](https://docs.sparklayer.io/help/storefront/product-settings.md#what-hides-what) for every view. ## Before you start - **The products to hide**: their SKUs, or a way to find them, such as a tag like `CUSTOM`. - **The customer groups**, if you're only hiding them from some. You need each group's handle, such as `trade`: click the group's name at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app. - **Access to your store's admin**, to edit the products' variants. ## Hide the products ### Step 1. Turn on the metafield in SparkLayer Go to **Integrations > Platform** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform** in the Shopify app and, in the **Metafields** card, click **Configure** next to **SparkLayer metafields**, then enable the product settings metafield. You only do this once. **More detail** On Shopify, SparkLayer adds the `sparklayer.settings` field to every variant for you. On BigCommerce, WooCommerce and Magento, follow your platform's guide: [BigCommerce](https://docs.sparklayer.io/help/platforms/bigcommerce/metafields.md), [WooCommerce](https://docs.sparklayer.io/help/platforms/woocommerce/metafields.md) or [Magento](https://docs.sparklayer.io/help/platforms/magento/metafields.md). ### Step 2. Build the setting Choose who shouldn't see the products and whether to hide them or only stop orders. The form writes the value, which is the same for every product. **What the values look like** Hide from every B2B customer: ```json [{ "customer_group": "base", "display": false, "sell": false }] ``` Hide from the `trade` and `distributors` groups only: ```json [ { "customer_group": "trade", "display": false, "sell": false }, { "customer_group": "distributors", "display": false, "sell": false } ] ``` Show only to the `vip` group: ```json [ { "customer_group": "base", "display": false, "sell": false }, { "customer_group": "vip", "display": true, "sell": true } ] ``` ### Step 3. Add it to the products The value goes in the `sparklayer.settings` field of every variant you're hiding: a product in 3 sizes needs it on all 3. Choose the way that suits how many there are. | How many | How | | --- | --- | | **A few** | Open each variant in your store's admin, paste the value into its `sparklayer.settings` field and save. In Shopify, it's **Settings** under **Metafields**, as the form shows. | | **Many** | Fill in the field for every variant in one table, in your platform's bulk editor. | | **Many, or found by a tag** | Let your AI assistant do it. Connect your Shopify store to it, such as with the Shopify connector in Claude, then click **Ask Claude** or **Ask ChatGPT** in the form and tell it which products. It finds the variants, shows you every change and only saves them once you approve. | **Lots of products? Fill them in one table (Shopify):** in your Shopify admin, go to **Products**, tick the products and click **Edit products**. Click **Columns**, tick the SparkLayer field under **Metafields**, type the values and click **Save**. See [Shopify's guide](https://help.shopify.com/en/manual/custom-data/metafields/bulk-edit-metafields). **If the products already have a value** A variant can already have a `sparklayer.settings` value, such as a pack size for a customer group. Pasting a new value replaces it, so add the `display` and `sell` keys to the entries that are there instead. The AI assistant's prompt does this for you: it keeps every other setting. ### Step 4. Hide them from your store's pages too Optional, on Shopify. To hide the same products from retail shoppers and signed-out visitors, tag them `b2b-only` with B2B Catalogs: see [Keep wholesale hidden from retail shoppers](https://docs.sparklayer.io/help/guides/hide-wholesale-from-retail.md). To hide them from some customer groups on your store's pages as well, see [Catalogs per customer group](https://docs.sparklayer.io/help/storefront/b2b-catalogs/configuring-advanced-catalogs.md). ## Check it worked Changes take about 10 minutes to sync. Then check as each kind of customer: | Check as | What you should see | | --- | --- | | **A customer in a group you hid them from** | The products aren't in [Catalog and Quick Order](https://docs.sparklayer.io/help/sales-ordering/catalog.md) or in search in My Cart. With **Show it, but stop orders**, they show as **Unavailable for this account**. | | **A sales rep ordering for that customer** | The same as the customer: the rep's **Catalog** follows the customer's group. | | **A customer in another group** | The products as usual. | ## If something's not right - **A product still shows.** Check the value is on every variant, not the product, and that each `customer_group` is a handle, such as `trade`, not a Shopify tag, such as `b2b-trade`. See [Why aren't my settings being applied?](https://docs.sparklayer.io/help/storefront/product-settings.md#settings-not-applied) - **A pack size or limit stopped working.** The new value replaced the variant's old one. Add the old settings back into the same value: see [Which rule wins](https://docs.sparklayer.io/help/storefront/product-settings.md#which-rule-wins). - **The product still shows on your store's collection pages.** `display` only changes SparkLayer. Use B2B Catalogs as well: see [step 4](#hide-on-store-pages). - **The value doesn't save.** It must be valid JSON with straight quotes (`"`). Build it with the [form](#build-the-setting) rather than typing it. ## Next steps - [Catalog and Quick Order](https://docs.sparklayer.io/help/sales-ordering/catalog.md): How customers and reps browse and order from the catalog - [Product rules per customer group](https://docs.sparklayer.io/help/storefront/product-settings.md): Pack sizes, limits and visibility for each customer group - [Keep wholesale hidden from retail shoppers](https://docs.sparklayer.io/help/guides/hide-wholesale-from-retail.md): Hide B2B products and prices from retail shoppers --- # Sell a B2B-only version of a product URL: https://docs.sparklayer.io/help/guides/sell-b2b-only-versions Applies to: Shopify Sell a trade-only version of a retail product, such as a case of 12: duplicate it in Shopify, give it new SKUs, tag it b2b-only, price it and test it. > **Quick summary** > > - You'll end up with a separate product, such as "Olive Oil, Case of 12", that only signed-in B2B customers can see and buy, at their trade price. Retail shoppers keep seeing the original. > - It has to be its own product: Shopify can't hide a single variant from retail shoppers, and the `b2b-only` tag works on whole products. > - Allow about 15 minutes a product. It needs [B2B Catalogs](https://docs.sparklayer.io/help/storefront/b2b-catalogs.md), a free app on every SparkLayer plan, and is for Shopify. The `b2b-only` tag hides a whole product from retail shoppers. That works when a product is only ever sold to trade customers. When you sell the same item to both, in a different pack size or format for trade, the trade version needs its own product, with its own SKUs, so it can be tagged and priced on its own. ## Pick the right route Not every B2B-only product needs a duplicate. Choose by what you want to do: | You want to | Do this | | --- | --- | | **Show a whole existing product to B2B customers only** | No duplicate: tag the product `b2b-only`, then check [steps 5 and 6](#check-b2b-catalogs) below. See [Make a product B2B-only or B2C-only](https://docs.sparklayer.io/help/storefront/b2b-catalogs/configuring-your-catalogs.md#make-a-product-b2b-only-or-b2c-only) | | **Sell a B2B version of a retail product**, such as a case of 12 alongside single bottles | Follow every step on this page | | **Show a range to one customer group only**, such as VIP trade customers | No duplicate: hide it from the other groups with the `sparklayer.settings` metafield. See [Hide products from customers](https://docs.sparklayer.io/help/guides/hide-products.md) | ## Before you start - **B2B Catalogs installed**, and enabled on the theme you'll test on. See [Install and enable B2B Catalogs](https://docs.sparklayer.io/help/storefront/b2b-catalogs.md#install-and-enable-b2b-catalogs). - **A B2B customer to test with**, tagged `b2b`, and a retail customer account. See [Assign customers to a customer group](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#assign-customers-to-a-customer-group). - **The trade price** for the new version, or the rule your price list uses for it. ## Create the B2B-only version ### Step 1. Duplicate the original product In your Shopify admin, open the original product at **Products** ([open in the Shopify admin](https://admin.shopify.com/products)), then click **More actions** > **Duplicate**. Name the copy after the original plus its pack size or format, such as "Olive Oil, Case of 12", and copy the images. Set its status to **Draft**. **More detail** Keep it as a draft until it's tagged `b2b-only` in step 3. A product that goes live untagged shows to everyone, retail shoppers included. ### Step 2. Give every variant a new SKU Open each variant of the copy and replace its SKU, so none is left the same as the original's. A simple pattern is the original SKU plus a suffix: `OIL-500` becomes `OIL-500-CASE12`. Then, under **Search engine listing**, remove `-copy` from the URL handle. **More detail** SparkLayer matches prices to products by SKU, so every variant needs a SKU of its own. If the copy shares a SKU with the original, the trade price lands on the wrong product or doesn't show at all. See [Do I need product SKUs when uploading pricing?](https://docs.sparklayer.io/help/pricing/faqs.md#do-i-need-product-skus-when-uploading-pricing) ### Step 3. Tag it b2b-only and make it active Add the tag `b2b-only` in the product's **Tags** field. Change its status to **Active** and click **Save**. Should B2B customers still see the retail version too? If not, tag the original `b2c-only`, so they only see the trade version. ### Step 4. Price it for your B2B customers Do this once the product is **Active**: SparkLayer only syncs active products, so it can't price a draft. How depends on your price list: | Price list | What to do | | --- | --- | | **Automatic** (for example 30% off your Shopify prices) | Nothing to add: it prices every product, including the new one. Check the price looks right | | **Manual** (exact prices) | Add a price for each new SKU, with the [Price editor](https://docs.sparklayer.io/help/pricing/price-editor.md#add-a-price) or a [CSV upload](https://docs.sparklayer.io/help/pricing/csv-upload.md), in every price list your B2B customer groups use | Then check the new SKUs' prices at **Pricing > Price editor** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/editor)), or **SparkLayer Wholesale > Pricing > Price editor** in the Shopify app. ### Step 5. Check B2B Catalogs is on your live theme Open B2B Catalogs in your Shopify admin, and check your live theme shows as **Enabled**. Without it, the `b2b-only` tag does nothing: it's the most common reason a product still shows to retail shoppers. **More detail** If B2B Catalogs isn't installed yet, install it from the [Shopify App Store](https://apps.shopify.com/sparklayer-b2b-catalogs) and enable it on an unpublished copy of your theme first, to check it. See [Install and enable B2B Catalogs](https://docs.sparklayer.io/help/storefront/b2b-catalogs.md#install-and-enable-b2b-catalogs). ### Step 6. Test it as three kinds of visitor Check the product as each of these. All three must pass. | Test as | Sees the product? | What you should see | | --- | --- | --- | | **A signed-out visitor**, in a private browser window | No | It's missing from collections and search. Its URL shows the [access denied page](https://docs.sparklayer.io/help/storefront/b2b-catalogs/configuring-access-denied-view.md) | | **A signed-in retail customer** | No | The same as a signed-out visitor | | **A signed-in B2B customer** | Yes | It's in collections and search, at the trade price from their price list | ## Common mistakes **The trade price shows on the wrong product, or not at all** A variant still has the SKU it was copied with. Check every variant of the copy, not just the first, and give each one its own SKU. See [step 2](#new-skus). **The new product has no trade price** Prices were added while the product was a draft, or it's on a manual price list without its new SKUs. Check the product is **Active**, then check its SKUs at **Pricing > Price editor** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/editor)), or **SparkLayer Wholesale > Pricing > Price editor** in the Shopify app. See [step 4](#price). **Retail shoppers can still see the product** Check the product is tagged `b2b-only`, and that B2B Catalogs is enabled on your live theme. See [step 5](#check-b2b-catalogs) and [Why don't my b2b-only and b2c-only tags do anything?](https://docs.sparklayer.io/help/storefront/b2b-catalogs.md#tags-not-working). **Can I tag just one variant b2b-only?** No. Tags work on whole products, and Shopify can't hide a single variant from retail shoppers. If only one pack size is for trade customers, make it its own product, as on this page. See [Variants and retail shoppers](https://docs.sparklayer.io/help/storefront/b2b-catalogs/limitations.md#variants-and-retail-shoppers). **What about stock?** The new SKUs have their own inventory in Shopify. If the trade version comes from the same physical stock as the original, decide how you'll keep both counts right, for example by adjusting them when you restock. ## Good to know - **Collection pages can show gaps.** A hidden product can still take a place in a collection grid, and count towards product and filter totals. Keeping B2B-only products in their own collections avoids it. See [Collection grids, search and filter counts](https://docs.sparklayer.io/help/storefront/b2b-catalogs/limitations.md#grids-search-and-filter-counts). - **Hiding doesn't empty carts.** A product already in someone's cart stays there, and add-to-cart links still work. See [Hidden products in a cart](https://docs.sparklayer.io/help/storefront/b2b-catalogs/limitations.md#hidden-product-add-to-cart-caveats). ## Next steps - [Keep wholesale hidden from retail shoppers](https://docs.sparklayer.io/help/guides/hide-wholesale-from-retail.md): Hide B2B products and prices from everyone but your trade customers - [Catalogs per customer group](https://docs.sparklayer.io/help/storefront/b2b-catalogs/configuring-advanced-catalogs.md): Show a range to some customer groups only - [Upload prices by CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md): Add trade prices for many SKUs at once --- # Let new trade customers apply, and approve them URL: https://docs.sparklayer.io/help/guides/approve-trade-applications Applies to: Shopify Add a B2B login and registration page to your Shopify store, collect trade account applications with SparkLayer Forms, and approve each buyer into a group. > **Quick summary** > > - You'll end up with a B2B login page where new customers apply for a trade account, and a list of applications you approve or reject. Approving one creates the customer in Shopify in the customer group you choose. > - Allow about 45 minutes, or less if our team installs the B2B login page for you, free of charge. > - [Forms](https://docs.sparklayer.io/help/forms.md) are on every plan, in the SparkLayer Dashboard only. The notification emails and the **Approve** and **Reject** buttons run on [workflows](https://docs.sparklayer.io/help/forms/workflows.md), which are on the Growth plan and above (see [Plans and features](https://docs.sparklayer.io/help/plans-and-features.md)). Without them, you [approve applications by hand](https://docs.sparklayer.io/help/forms/entries.md#approve-an-application-without-workflows). Customers who apply don't become B2B customers until you approve them. You check each application, choose their customer group, and SparkLayer creates and tags them for you. Forms are only in the SparkLayer Dashboard at [app.sparklayer.io](https://app.sparklayer.io/), not in the SparkLayer Wholesale app in Shopify admin. ## Before you start - **Your customer groups set up**, so you can choose one when you approve. See [Set up wholesale prices](https://docs.sparklayer.io/help/guides/set-up-wholesale-prices.md). - **A SparkLayer Dashboard login** at [app.sparklayer.io](https://app.sparklayer.io/), for Forms. - **Customer accounts turned on** in your Shopify admin, at **Settings > Customer accounts** ([open in the Shopify admin](https://admin.shopify.com/settings/customer_accounts)). ## Set up applications ### Step 1. Create your registration form In the SparkLayer Dashboard, go to **Forms** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/forms)). On the **Start from a template** card, click **Wholesale Registration Form**. It comes with an approve and reject workflow and email notifications. See [Start from a template](https://docs.sparklayer.io/help/forms.md#start-from-a-template). [Take the 1-minute tour](https://docs.sparklayer.io/help/forms?tour). Add or change fields if you need more from applicants. See [Build a form](https://docs.sparklayer.io/help/forms/setup.md). ### Step 2. Check who's told about new applications The template's **Notification of submission** workflow emails your team about each new entry. To change the recipient, open the **Workflows** tab and click **View** next to it. See [Get notified of new submissions](https://docs.sparklayer.io/help/forms/setup.md#get-notified-of-new-submissions). ### Step 3. Publish the form Click **Publish**. The form and its workflows only go live once you publish. See [Publish changes](https://docs.sparklayer.io/help/forms/versions.md#publish-changes). ### Step 4. Add the B2B login page Our free, ready-made page lets existing customers sign in and new ones apply, at `/pages/b2b-login`. Adding it means creating 2 files in your theme code. [Contact us](https://docs.sparklayer.io/help/support.md) and our team installs it for you, or follow [Add the B2B login page](https://docs.sparklayer.io/help/platforms/shopify/customisations/registration-and-login.md#add-the-b2b-login-page). ### Step 5. Put your form on the page In the theme editor, open the `b2b-login` page and set **Form Action** to **Embed custom contact form**. Paste your form's embed code, from its **Embed** tab, into **Custom Contact Form HTML**, then save. See [Embed a SparkLayer form](https://docs.sparklayer.io/help/platforms/shopify/customisations/registration-and-login.md#embed-a-sparklayer-form). **More detail** - To show the form on another page instead, add the **SparkLayer Form** block in the theme editor. See [Add a form to your store](https://docs.sparklayer.io/help/forms/embedding-and-styling.md#add-a-form-to-your-store). - To share it as a link, click **Copy registration link** on the form's **Embed** tab, or in the **Invite a buyer** box. See [Share your registration link](https://docs.sparklayer.io/help/customers/invite-buyers.md#share-your-registration-link). ### Step 6. Approve or reject each application Open the form's entries and click the applicant's name. Under **Your decision**, choose their **Customer group**, tick **Tax exempt** if they shouldn't pay tax, then click **Approve** or **Reject**. Approving creates the customer in Shopify with the group's tag and emails them. They can sign in and see trade prices straight away. See [Approve or reject an application](https://docs.sparklayer.io/help/forms/entries.md#approve-or-reject-an-application). **Not using SparkLayer Forms?** The B2B login page can instead email applications to your store's email address, through Shopify's contact form. Sending it doesn't create a customer. Once you've reviewed it, add them to a customer group by [tagging them in Shopify](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#assign-customers-to-a-customer-group), or invite them with **Invite buyer** at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app and choose their customer group. See [Send an email to the store owner](https://docs.sparklayer.io/help/platforms/shopify/customisations/registration-and-login.md#send-an-email-to-the-store-owner) and [Invite a buyer](https://docs.sparklayer.io/help/customers/invite-buyers.md). ## Check it worked - **Apply as a customer.** Go to `www.yourstore.com/pages/b2b-login` and send an application with an email address you can sign in to. - **Find the entry.** It's in the form's entries, and your team gets the notification email. - **Approve it.** The new customer shows at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app in the group you chose. [Take the 1-minute tour](https://docs.sparklayer.io/help/customers/managing-customers?tour). - **Sign in as them.** You see your trade prices. ## If something's not right **Diagnose: Trade applications not working?** Check your form, approvals and customer sign-in. 1. **What’s going wrong?** Pick the closest match. - Customers can’t find the application form: go to question 2 - I’m not told about new applications: go to question 2 - Approve or Reject on an entry does nothing: go to fix A (Approve and Reject run on workflows) - Approved customers can’t see B2B pricing: go to question 2 - Approved customers didn’t get an email: go to question 2 - People sign in without applying: go to fix B (Shopify lets anyone create an account) - Customers can’t sign in: go to question 3 2. **Which form do you use for applications?** SparkLayer Forms is built into the SparkLayer Dashboard. Customer Fields is a separate Shopify app. - SparkLayer Forms: go to question 4 for missing; question 5 for arriving; question 6 for access; question 7 for email - Customer Fields: go to question 8 for missing; question 9 for arriving; question 10 for access; question 11 for email - Another app: go to fix C (Check your form app’s settings) 3. **Which customer accounts does your Shopify store use?** Shopify has customer accounts (sign in with an emailed code) and legacy accounts (sign in with a password). Where to look: Settings > Customer accounts (Shopify admin). - Customer accounts (a code): go to fix D (Sign in with the code, using the right email) - Legacy accounts (a password): go to fix E (The customer needs to activate their account) - Not sure: go to fix F (Check your customer accounts setting) 4. **Is the form added to a page on your live theme?** Forms are built in SparkLayer, then added to a page on your store. Where to look: Forms (SparkLayer). - Yes: go to question 12 - No / not sure: go to fix G (Add the form to a page) 5. **Do new submissions show on the form’s Entries tab?** Applications appear there as soon as they’re submitted. Where to look: Forms (SparkLayer). - Yes: go to fix H (Applications are arriving: add a notification) - No: go to question 4 6. **Does approving an application give the customer the `b2b` tag and their group’s tag?** The Wholesale Registration Form template creates the customer with their customer group’s tag when you approve them. Where to look: Forms (SparkLayer). - Yes: go to fix I (Approval looks right: check the customer) - No / not sure: go to fix J (Check what approval does) 7. **Does the form’s approval workflow send the customer an email?** Emails to customers are sent by a workflow step. Where to look: Forms (SparkLayer). - Yes: go to fix K (Check the email arrived) - No / not sure: go to fix L (Add an email step to the approval workflow) 8. **Is Customer Fields turned on in your theme, with the form on a page?** The app must be enabled in the theme editor and its form added to a page. Where to look: Online Store > Themes (Shopify admin). - Yes: go to question 12 - No / not sure: go to fix M (Turn on Customer Fields and place the form) 9. **Is “Require account approval” turned on for the form?** With approval on, applications wait in Customer Fields until you approve them. - Yes: go to fix N (Check pending customers in Customer Fields) - No: go to fix O (Applications go straight to Shopify) 10. **Does the form’s auto-tag rule add `b2b` to approved customers?** Check the rule on the form’s Rules tab. - Yes: go to fix I (Approval looks right: check the customer) - No / not sure: go to fix P (Add `b2b` in the auto-tag rule) 11. **Is the approval email set up in Customer Fields?** Approval emails for Customer Fields forms are sent by Customer Fields, not SparkLayer. - Yes: go to fix K (Check the email arrived) - No / not sure: go to fix Q (Set up the approval email in Customer Fields) 12. **Is there a link to the form page in your menu or footer?** Customers need a way to reach the page. - Yes: go to fix R (Everything checks out) - No: go to fix S (Link to the form from your store) **Fixes** - **A. Approve and Reject run on workflows** The buttons, the application status and new-entry emails are run by the form’s workflows, which are on the Growth plan and above. On lower plans the buttons show but do nothing. To approve by hand, create the customer in Shopify with the `b2b` tag and their group’s tag. See [Plans and features](https://docs.sparklayer.io/help/plans-and-features.md). - **B. Shopify lets anyone create an account** With Shopify’s customer accounts, anyone can sign in with an emailed code. SparkLayer only appears for customers tagged `b2b`, so they see your store as retail. You can redirect them, show a banner pointing to your application form, or sign them out with a message. See [Wholesale-only stores](https://docs.sparklayer.io/help/platforms/shopify/customisations/registration-and-login.md). - **C. Check your form app’s settings** Make sure approved customers get the `b2b` tag and their group tag. That’s what gives them access to SparkLayer. Next: Wrong prices, payment methods or shipping for a customer? - **D. Sign in with the code, using the right email** Customers sign in with a code sent to their email, with no password. If they use a different email from their customer record, Shopify creates a new retail customer without their tags. Where: Customers > select the customer > Tags (Shopify admin). - **E. The customer needs to activate their account** With legacy accounts, a new customer must activate their account from the invite email before they can sign in. Open the customer, click More actions, then Send account invite. Where: Customers > select the customer > Tags (Shopify admin). - **F. Check your customer accounts setting** Open Settings, then Customer accounts, to see which your store uses. Then start this check again. Where: Settings > Customer accounts (Shopify admin). - **G. Add the form to a page** Add the form to a page on your live theme, such as a trade account page. Where: Forms (SparkLayer). See [Embed a form](https://docs.sparklayer.io/help/forms/embedding-and-styling.md). - **H. Applications are arriving: add a notification** To be emailed about new applications, use a workflow with the Form submitted trigger and a Send email step. Workflows are on the Growth plan and above. On lower plans, check the Entries tab. Where: Forms (SparkLayer). See [Workflows](https://docs.sparklayer.io/help/forms/workflows.md). - **I. Approval looks right: check the customer** If an approved customer still can’t see B2B pricing, check their tags and how they’re signing in. Next: SparkLayer not showing or looking wrong? - **J. Check what approval does** Set the form’s approval to create the customer with the right customer group. Customers approved before the change need tagging by hand. Where: Forms (SparkLayer). See [Approve trade applications](https://docs.sparklayer.io/help/guides/approve-trade-applications.md). - **K. Check the email arrived** Ask the customer to check their spam or junk folder, and check the email address on their application. - **L. Add an email step to the approval workflow** Add a Send email step to the workflow that runs when you approve an application, so customers know they can sign in. Where: Forms (SparkLayer). See [Workflows](https://docs.sparklayer.io/help/forms/workflows.md). - **M. Turn on Customer Fields and place the form** Enable Customer Fields in your theme editor, then add the form to your registration or wholesale page. Where: Online Store > Themes (Shopify admin). - **N. Check pending customers in Customer Fields** With approval on, customers are only created in Shopify once you approve them. Review pending applications in the Customer Fields app. - **O. Applications go straight to Shopify** With approval off, customers are created immediately. Check your Shopify customers list for new accounts. Where: Customers (Shopify admin). - **P. Add `b2b` in the auto-tag rule** On the form’s Rules tab, make the auto-tag rule add `b2b`, and the group tag if you use one. Customers approved before the change need tagging by hand. - **Q. Set up the approval email in Customer Fields** Turn on and edit the approved-customer email in the Customer Fields app. - **R. Everything checks out** Your setup looks right, so we'll take it from here. Send us your answers with a link to the form page. - **S. Link to the form from your store** Add a link to the form page in your header or footer menu so trade customers can find it. - **Approve or Reject does nothing.** The buttons run workflows, which are on the Growth plan and above. Without them, [approve applications by hand](https://docs.sparklayer.io/help/forms/entries.md#approve-an-application-without-workflows). - **No email arrives for new applications.** The notification email is a workflow too. Without workflows, check the form's entries yourself. Shopify Flow can't start from a SparkLayer form submission. - **You can't find Forms in the Shopify app.** Forms are only in the SparkLayer Dashboard. See [You can't see Forms in the Shopify app](https://docs.sparklayer.io/help/troubleshooting.md#you-cant-see-forms-in-the-shopify-app). - **Approving didn't create the customer.** Check what the workflow did on the entry. See [Check workflow runs](https://docs.sparklayer.io/help/forms/workflows.md#check-workflow-runs). - **The applicant already has an account.** You'll see "That buyer already has an account". Move them to a group by changing their tags in Shopify. See [Invite a buyer](https://docs.sparklayer.io/help/customers/invite-buyers.md#invite-a-buyer). - **Application emails don't arrive.** If you use Shopify's contact form, Shopify may not be delivering them. See [Send an email to the store owner](https://docs.sparklayer.io/help/platforms/shopify/customisations/registration-and-login.md#send-an-email-to-the-store-owner). - **You sell in several languages.** Make one form per language and add each one's embed code to the B2B login page's translations. See [Translate a form](https://docs.sparklayer.io/help/forms/embedding-and-styling.md#translate-a-form). ## Next steps - [Keep wholesale hidden from retail shoppers](https://docs.sparklayer.io/help/guides/hide-wholesale-from-retail.md): Hide B2B products and prices from everyone else - [Move your existing wholesale customers](https://docs.sparklayer.io/help/guides/move-existing-customers.md): Bring customers you already have onto SparkLayer - [Launch checklist](https://docs.sparklayer.io/help/get-started/launching.md): Welcome emails, onboarding pages and going live --- # Charge the right shipping on B2B orders URL: https://docs.sparklayer.io/help/guides/b2b-shipping Choose your store's shipping rates or SparkLayer's own, set B2B shipping methods and bands by order total or weight, pre-select a method and test the costs. > **Quick summary** > > - You'll end up with B2B customers seeing the right shipping methods and costs at checkout, for their country, customer group and order. > - Allow about 30 minutes, longer if you have many countries or weight bands. > - SparkLayer shipping rates need the Starter plan or above. They work on every platform, with an extra step on Wix and BigCommerce. By default, B2B customers see your store's own shipping methods at checkout, with nothing to set up. Use SparkLayer's own shipping rates when B2B customers need different rates from retail, or different rates for each customer group. ## Before you start - **Your B2B shipping costs**, for example £20 under £99 and free above. - **The countries you ship to**, and which customer groups get which methods. - **Product weights**, if you charge by weight. Weight bands always use grams. ## Set up your shipping ### Step 1. Choose where your rates come from | Use | When | | --- | --- | | **Your store's shipping methods** (the default) | B2B and retail pay the same, or your rates need complex rules or a shipping app. On Shopify, B2B-only methods need an app such as [Intuitive Shipping](https://docs.sparklayer.io/help/integrations/customer-experience/intuitive-shipping.md). | | **SparkLayer shipping rates** | Different B2B rates for each customer group, by order total or weight, especially when retail and B2B share one store. | B2B customers get one or the other, never both. To compare them, see [How it works](https://docs.sparklayer.io/help/ordering/shipping-rules.md#how-it-works) and [What SparkLayer shipping rules can do](https://docs.sparklayer.io/help/ordering/shipping-rules.md#what-sparklayer-shipping-rules-can-do). If you keep your store's methods, skip to [step 5](#choose-which-method-is-pre-selected). ### Step 2. Turn on SparkLayer shipping rates Go to **Settings > Shipping** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/shipping)), or **SparkLayer Wholesale > Settings > Shipping** in the Shopify app, tick **Use SparkLayer shipping rates** and click **Save**. Wix and BigCommerce need an extra step. See [Turn on SparkLayer shipping rates](https://docs.sparklayer.io/help/ordering/shipping-rules.md#turn-on-sparklayer-shipping-rates). ### Step 3. Create a shipping method Click **Create shipping method**, give it a name customers will understand, such as "Standard Shipping", and choose its countries and, if it's only for some groups, its customer groups. For every field, see [Create a shipping method](https://docs.sparklayer.io/help/ordering/shipping-rules.md#create-a-shipping-method). ### Step 4. Add shipping bands A method only shows at checkout once it has a band. Add bands by order total or weight until every order is covered, with no gaps: the first band an order matches sets its cost. For the fields and an example (£20 under £99, free above), see [Add shipping bands](https://docs.sparklayer.io/help/ordering/shipping-rules.md#add-shipping-bands). ### Step 5. Choose which method is pre-selected **Shopify only:** SparkLayer pre-selects one of your Shopify shipping methods at checkout. Customers can pick another. To stop a free rate becoming the default, go to **Settings > Shipping > Automatic shipping selection** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/shipping)), or **SparkLayer Wholesale > Settings > Shipping > Automatic shipping selection** in the Shopify app, choose **Prefer cheapest paid method** and click **Save**. See [Choose which method is pre-selected](https://docs.sparklayer.io/help/ordering/shipping-rules.md#automatic-shipping-selection). **BigCommerce and Wix and WooCommerce and Magento only:** **Automatic shipping selection** is for Shopify. With SparkLayer shipping rates, set each method's **Priority order** to choose the order customers see them in, with 1 first. ### Step 6. Test your shipping rates Sign in as a B2B customer and go to **Review & Pay** with different countries, customer groups, order values and weights. Check the right methods and costs show. See [Test your shipping rates](https://docs.sparklayer.io/help/ordering/shipping-rules.md#test-your-shipping-rates). **Shopify only:** [Try it out](https://docs.sparklayer.io/help/get-started/launching.md#place-a-test-order) opens your store as a test buyer, and test orders don't count towards your plan. ## Check it worked - **Each test order shows the methods you expect** for its country and customer group. - **Each cost matches the band** for its order total or weight, including the free band. - **The pre-selected method** is the one you chose. ## If something's not right - **No shipping methods show at checkout.** The customer doesn't match any method, or the order falls in a gap between bands. See [No shipping methods show at checkout](https://docs.sparklayer.io/help/troubleshooting.md#no-shipping-methods-show-at-checkout). - **Free shipping isn't applied, or the wrong band wins.** The first band the order matches sets the cost, so check for overlapping ranges. See [Free shipping isn't applied, or the wrong rate shows](https://docs.sparklayer.io/help/ordering/shipping-rules.md#free-shipping-isnt-applied). - **Free shipping is pre-selected when you'd rather it wasn't.** On Shopify, choose **Prefer cheapest paid method**. See [Choose which method is pre-selected](https://docs.sparklayer.io/help/ordering/shipping-rules.md#automatic-shipping-selection). - **B2B customers see the same rates as retail.** That's how Shopify shipping works. Use a shipping app that sets rates by customer tag, or SparkLayer shipping rates. See [Show B2B-only shipping methods on Shopify](https://docs.sparklayer.io/help/ordering/shipping-rules.md#show-b2b-only-shipping-methods-on-shopify). - **Shipping set up during a trial still shows after you change plan.** [Contact our support team](https://docs.sparklayer.io/help/support.md) to switch it off. See [If you set up shipping during a trial](https://docs.sparklayer.io/help/ordering/shipping-rules.md#if-you-set-up-shipping-during-a-trial). - **Costs at checkout don't match your bands.** Check your products have valid weights and prices, then contact support. See [Shipping costs don't match the shipping bands](https://docs.sparklayer.io/help/ordering/shipping-rules.md#shipping-not-matching-the-shipping-bands). ## Next steps - [Get B2B tax and VAT right](https://docs.sparklayer.io/help/guides/tax-and-vat.md): Make sure tax on products and shipping is right - [Process your B2B orders in Shopify](https://docs.sparklayer.io/help/guides/process-orders-in-shopify.md): Change shipping on a draft order before you complete it - [Shipping rules](https://docs.sparklayer.io/help/ordering/shipping-rules.md): Custom messages, local pickup and every setting --- # Get B2B tax and VAT right URL: https://docs.sparklayer.io/help/guides/tax-and-vat Make sure B2B customers pay VAT or sales tax once: show net prices, allow for tax-inclusive store prices, exempt customers and check the tax at checkout. > **Quick summary** > > - You'll end up with B2B prices shown without tax (net), VAT or sales tax added once at checkout, and tax-exempt customers paying none. > - Allow about 20 minutes. > - Tax handling is on every plan. SparkLayer doesn't calculate tax: it uses your platform's tax settings. Most of the settings here are in Shopify; other platforms have their own limits. By default, SparkLayer shows B2B prices excluding tax, whatever your store's tax setting. On the **Review & Pay** step, it asks your platform for the tax and shows it as its own line. Tax goes wrong, for example VAT added twice, when the prices going in already include it. ## Before you start - **Your tax rates**, for example 20% VAT, and whether any products are taxed differently. - **Which customers are tax-exempt**, if any. - **Whether you use a tax app**, such as Avalara or TaxJar. ## Set up tax ### Step 1. Check whether your store prices include tax **Shopify only:** In your Shopify admin, go to **Settings > Taxes and duties** ([open in the Shopify admin](https://admin.shopify.com/settings/taxes)). Under **Global settings**, see whether **Include sales tax in product price and shipping rate** is ticked. If it is, your Shopify prices include tax (gross). **BigCommerce and Wix and WooCommerce and Magento only:** Set tax up in your platform, then check its limits in [Set up tax on other platforms](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md#set-up-tax-on-other-platforms). For example, on Wix, tax exemptions only apply when the customer pays by card through the Wix checkout. See [How it works](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md#how-it-works) for net and gross prices. ### Step 2. Make your price lists net | Price list | What to do | | --- | --- | | **Manual** | Upload prices excluding tax (ex VAT). | | **Automatic**, based on tax-inclusive Shopify prices | Work out a percentage that also takes the tax out, and enter it by hand. See [Tax-inclusive prices](https://docs.sparklayer.io/help/pricing/managing-pricing.md#tax-inclusive-prices) for how. | Open the list at **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app, change it and click **Save**. [Take the 1-minute tour](https://docs.sparklayer.io/help/pricing/managing-pricing?tour). ### Step 3. Make tax-exempt customers exempt **Shopify only:** In your Shopify admin, open the customer, click **Manage tax exemptions**, untick **Collect tax** and click **Save**. If you use a tax app such as Avalara or TaxJar, exempt them there too (in Avalara, add them to the Exemption Customer List with their Shopify customer ID as the **Customer Code**): the two work independently. See [Make a customer tax-exempt](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md#make-a-customer-tax-exempt). **BigCommerce and Wix and WooCommerce and Magento only:** Set the exemption in your platform's customer settings. See [Set up tax on other platforms](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md#set-up-tax-on-other-platforms). A tax-exempt customer still sees net prices, and pays no tax at checkout. ### Step 4. Handle products with different tax rates **Shopify only:** Optional. By default, tax is charged on the cart subtotal. If your products have different rates and Shopify's prices include tax, [contact our support team](https://docs.sparklayer.io/help/support.md) to turn on line item tax. To stop charging tax on a product, untick **Charge tax on this product** on it. See [Charge different tax rates on different products](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md#charge-different-tax-rates-on-different-products). **BigCommerce and Wix and WooCommerce and Magento only:** Set product tax rates in your platform's tax settings. ### Step 5. Show prices with tax, if your buyers expect it Optional. Turn on **Tax-inclusive prices** at **Settings > Configurations > Pricing and cart** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Pricing and cart** in the Shopify app and add a `display_tax_rate` column to your price CSV, such as `10` for 10% GST. Buyers see gross prices labelled "inc. tax", but you still upload and charge net. It only works on manual price lists: see [Show tax-inclusive prices](https://docs.sparklayer.io/help/pricing/pricing-display.md#show-tax-inclusive-prices). [Take the 1-minute tour](https://docs.sparklayer.io/help/dashboard/settings?tour). ## Sell to VAT-registered businesses in the EU **Shopify only:** A common setup for EU B2B sales: show net prices, add VAT at checkout, and zero-rate VAT-registered customers in other EU countries under the reverse charge. 1. **Show net B2B prices.** Upload prices excluding VAT to a manual price list, or adjust an automatic one. See [Make your price lists net](#make-your-price-lists-net). 2. **Collect VAT in each EU country you sell to.** In **Settings > Taxes and duties** ([open in the Shopify admin](https://admin.shopify.com/settings/taxes)), check the **Collecting tax** column for each country. VAT is then added on **Review & Pay**. 3. **Make reverse-charge customers tax-exempt.** For each VAT-registered EU customer who shouldn't pay VAT, open them in Shopify, click **Manage tax exemptions**, untick **Collect tax** and click **Save**. See [Make a customer tax-exempt](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md#make-a-customer-tax-exempt). 4. **Test it.** Place a test order as a VAT-registered customer and as one who pays VAT, and check the **Tax** line on each. Shopify also charges VAT on shipping in the EU and the UK. See [Why is tax charged on shipping?](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md#why-is-tax-charged-on-shipping) ## Check it worked Place a test order as a B2B customer, using a product whose price you know: - **The product page and cart show the net price**, the same as the price list. - **On Review & Pay**, **Tax** is its own line, at your rate, and the **Total** is the net price plus tax once. - **As a tax-exempt customer**, **Tax** is zero. - **On the order in your store**, the prices and tax match the checkout. ## If something's not right These fixes are for Shopify. On other platforms, check your platform's tax settings and [its limits](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md#set-up-tax-on-other-platforms). - **VAT or tax is charged twice.** Upload manual price lists excluding tax, and if your Shopify prices include tax, make sure each automatic price list's percentage also takes the tax out. See [Make your price lists net](#make-your-price-lists-net). - **Tax shows as zero, or VAT is missing at checkout.** Check the customer isn't tax-exempt (**Manage tax exemptions** on the customer in Shopify, with **Collect tax** ticked), the product has **Charge tax on this product** ticked, and you collect tax in the country of their shipping address: in **Settings > Taxes and duties** ([open in the Shopify admin](https://admin.shopify.com/settings/taxes)), find the country and check its **Collecting tax** column. If those are right, check the customer record's default address, then place a test order as the customer. - **An exempt customer is still charged.** A tax app such as Avalara or TaxJar overrides Shopify's settings, so exempt the customer in both. In Avalara, for example, add them to the Exemption Customer List with their Shopify customer ID as the **Customer Code**. See [Tax is charged but I use a third-party tax app](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md#tax-is-charged-but-i-use-a-third-party-tax-app-eg-avalara-taxjar). - **Tax is charged on shipping.** In Canada, the EU, the UK and the US, Shopify taxes shipping whatever its settings say. See [Why is tax charged on shipping?](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md#why-is-tax-charged-on-shipping) - **Order prices differ from the checkout.** The checkout uses whichever is lower, the SparkLayer price or the Shopify price, and that comparison includes tax: if the SparkLayer price after tax is higher than your tax-inclusive Shopify price, the Shopify price is used. Compare the variant's price at **Pricing > Price editor** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/editor)), or **SparkLayer Wholesale > Pricing > Price editor** in the Shopify app with its **Price** in Shopify. See [Prices on the Shopify order don't match the SparkLayer checkout](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md#prices-on-the-shopify-order-dont-match-the-sparklayer-checkout). For every tax question, see [Troubleshooting](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md#troubleshooting) in Tax and shipping. ## Next steps - [Set up wholesale prices](https://docs.sparklayer.io/help/guides/set-up-wholesale-prices.md): Create price lists and assign them to customer groups - [Charge the right B2B shipping](https://docs.sparklayer.io/help/guides/b2b-shipping.md): Set B2B shipping methods and costs - [How tax works at checkout](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md): Every tax setting, by platform --- # Fix customers or products that won't sync URL: https://docs.sparklayer.io/help/guides/fix-sync-problems Find products and B2B customers that haven't reached SparkLayer, fix missing SKUs, incomplete addresses and tag errors in your store, then check they sync. > **Quick summary** > > - You'll end up with every product and B2B customer synced to SparkLayer, so buyers see their prices when they sign in. > - Allow about 15 minutes, plus the time to fix the records in your store. > - Sync is on every plan and platform. Product sync is at **Pricing > Products** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/products)), or **SparkLayer Wholesale > Integrations > Product sync** in the Shopify app, and customer sync errors show as a banner at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app. SparkLayer keeps a copy of your products, and of customers tagged `b2b`, from your store. A product or customer that doesn't sync can't get B2B prices. The fix is almost always in your store: a missing SKU, a draft product or an incomplete address. See [How sync works](https://docs.sparklayer.io/help/integrations/data-sync.md#how-sync-works). ## Before you start - **The product's SKU, or the customer's email**, for anything you know is missing. - **Access to edit products and customers** in your store admin. ## Fix products ### Step 1. Check product sync Go to **Pricing > Products** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/products)), or **SparkLayer Wholesale > Integrations > Product sync** in the Shopify app. When everything is working, the banner reads **Products are up to date**. See [Check your products are syncing](https://docs.sparklayer.io/help/integrations/data-sync.md#check-your-products-are-syncing). ### Step 2. Look up the missing product In **Product data lookup**, search by name, SKU, barcode or ID. If it says **No products found**, SparkLayer doesn't have it. See [Look up a product's data](https://docs.sparklayer.io/help/integrations/data-sync.md#look-up-a-products-data). If the banner shows errors instead of **Products are up to date**, the rest of your products still sync, but fix the errors: | Error message | Fix | | --- | --- | | **Check SKUs are assigned to all variants in Shopify** | The product, or one of its variants, has no SKU. Add one in the product's **Inventory** section. SparkLayer only imports products with a SKU on every variant. | | **Please ensure the variant slug is unique** or **Please ensure the variant SKU is unique** | Search your store for the SKU and rename any duplicate. If you recently deleted the product and added it again, an old copy may still be in SparkLayer: [contact support](https://docs.sparklayer.io/help/support.md) and we'll remove it. | | **Metafield(s) configurations appear to be invalid (rrp)** | The variant's `rrp` field must hold a price and currency, such as `[{"value":15.99,"currency_code":"usd"}]`, not just a number. See [Show RRP](https://docs.sparklayer.io/help/guides/show-rrp.md). | ### Step 3. Fix the product in your store **Shopify only:** In your Shopify admin, check the product: - Has a unique SKU on every variant, in the **Inventory** section - Is **Active**, not **Draft** - Is included in the **SparkLayer Wholesale** sales channel See "Do my products need SKUs?" in [Shopify FAQs](https://docs.sparklayer.io/help/platforms/shopify/faqs.md#products). **BigCommerce and Wix and WooCommerce and Magento only:** In your platform's admin, check the product has a unique SKU on every variant and is active. See your platform's guide in [Platforms](https://docs.sparklayer.io/help/platforms.md). Then wait for the next partial sync. SparkLayer refreshes products every 10 minutes, so the fixed product syncs then. ## Fix customers ### Step 1. Check customer sync Go to **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app. If some customers didn't sync, a banner such as **Customers sync completed with 3 errors** shows at the top. Click **Show errors** to see each customer and the problem. See [Fix customer sync errors](https://docs.sparklayer.io/help/integrations/data-sync.md#fix-customer-sync-errors). [Take the 1-minute tour](https://docs.sparklayer.io/help/customers/managing-customers?tour). ### Step 2. Fix each customer in your store **Shopify only:** Click **Open customers in Shopify** and fix each record: | Error message | Fix | | --- | --- | | **Missing a default shipping address** | Add a default shipping address, with a country, first line, city and postcode or ZIP code. | | **Address - The Country assigned is incomplete or invalid**, **Address - The City is missing and is a required field**, **Address - The address needs a first line added (Line 1)** or **Address - the Post/Zip code is invalid and is a required field** | Add the missing country, city, first line or postcode or ZIP code. This applies to every address in the customer's address book, including second and older addresses: an incomplete second address causes an error even when the default is complete. Complete it or delete it. | | **Tagged b2b-trade but no first or last name**, or the same message with another group tag | Add the customer's first and last name. | | **Invalid customer group**, such as `{"code":"resource-id-not-found","message":"Invalid customer group "tier-1"."}` | The customer has a tag, such as `b2b-tier-1`, that doesn't match any group at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app, for example because the group was deleted. Fix the tag, or create the group. | | Address doesn't sync, with no error | Check the address for unusual characters, such as a long dash (―), in the first line, and replace them with plain text. | | Not in the list at all | Add the `b2b` tag. Only customers tagged `b2b` sync. | If a customer still won't sync, check whether their email address changed recently. It shouldn't cause problems, but it sometimes affects syncing. **Customers with a sales agent groups metafield** Older setups used a **sales agent groups** metafield (`sparklayer.sales_agent_groups`) on each customer. If customers with it don't sync, check the metafield's definition in **Settings > Custom data** ([open in the Shopify admin](https://admin.shopify.com/settings/custom_data)) is set to **Limit to preset choices**. See [Set up the sales agent groups metafield](https://docs.sparklayer.io/help/platforms/shopify/metafields.md#set-up-the-sales-agent-groups-metafield). **BigCommerce and Wix and WooCommerce and Magento only:** Fix each customer in your platform's admin. Check they're marked as B2B for your platform and have a complete address. On Wix, they must also be a **Site Member**. See [Assign customers to a customer group](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#assign-customers-to-a-customer-group). ### Step 3. Wait for the next sync Fixed customers sync on the next partial sync. You don't need to start it yourself. If a customer still hasn't synced after you've fixed them, [contact support](https://docs.sparklayer.io/help/support.md). ## Check it worked - **The product sync banner** shows **Products are up to date**, and **Product data lookup** finds the product. - **The customer appears at** **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app, with the right customer group in the **Group** column. - **The customer signs in** and sees B2B prices on the product. ## If something's not right - **Product data lookup says "No products found".** See [Product data lookup says "No products found"](https://docs.sparklayer.io/help/troubleshooting.md#the-product-data-sync-says-this-product-cannot-be-found). - **A customer isn't in the Customers list.** See [A customer isn't in the Customers list](https://docs.sparklayer.io/help/troubleshooting.md#the-customer-data-sync-says-this-customer-id-cannot-be-found). - **You can't choose a pricing source for an automatic price list.** SparkLayer can't find SKUs on your store. See [You can't choose a source for an automatic price list](https://docs.sparklayer.io/help/troubleshooting.md#you-cant-choose-a-source-for-an-automatic-price-list). - **The customer synced but sees no B2B prices.** See [Customers can't see B2B prices](https://docs.sparklayer.io/help/troubleshooting.md#customers-cant-see-b2b-prices-or-products-say-unavailable). ## Next steps - [Move your existing wholesale customers](https://docs.sparklayer.io/help/guides/move-existing-customers.md): Tag customers in bulk and import their order history - [Set up wholesale prices](https://docs.sparklayer.io/help/guides/set-up-wholesale-prices.md): Give synced products their B2B prices - [Troubleshooting](https://docs.sparklayer.io/help/troubleshooting.md): Every symptom, with the checks to fix it --- # Move your existing wholesale customers onto SparkLayer URL: https://docs.sparklayer.io/help/guides/move-existing-customers Applies to: Shopify Bring the trade customers already in your Shopify store onto SparkLayer: tag them into groups, import their terms and order history, then ask them to sign in. > **Quick summary** > > - You'll end up with your existing trade customers in the right customer groups, with their payment terms and past orders, ready to sign in and order. > - Allow an hour or two, depending on how many customers you have. A bulk import app saves time for large lists. > - Customer groups and customer-specific pricing are on every plan. Everything in this guide is for Shopify. Customers already in Shopify become B2B customers through their tags, so there's nothing to recreate. You tag them, bring across anything stored on them, and tell them they can sign in. ## Before you start - **Your price lists and customer groups set up.** See [Set up wholesale prices](https://docs.sparklayer.io/help/guides/set-up-wholesale-prices.md). - **A list of your trade customers** and the group each belongs in. - **Their credit limits and terms**, if they pay on account. - **Your previous wholesale app still installed**, if you have one. SparkLayer can run alongside it while you test. ## Move your customers ### Step 1. Tag your trade customers In your Shopify admin, give each trade customer the `b2b` tag, plus their group's tag if it isn't the Base group, for example `b2b-trade`. You'll find each group's tag under its name at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app. Use no more than 2 B2B tags per customer, and check each has at least one complete address. See [Tag existing customers in Shopify](https://docs.sparklayer.io/help/platforms/shopify/install.md#tag-your-customers-in-shopify). [Take the 1-minute tour](https://docs.sparklayer.io/help/customers/customer-groups?tour). **More detail** Don't use **Invite a buyer** for customers who already have an account: you'll see "That buyer already has an account". It's for new buyers. ### Step 2. Bring across their terms and prices If customers have credit limits, net terms or their own price lists, these go in [metafields](https://docs.sparklayer.io/help/platforms/shopify/metafields.md) on each customer. To fill them in for many customers at once, use Shopify's bulk editor, or an import app such as Matrixify if the values are already in a spreadsheet. See [Fill in metafields for many at once](https://docs.sparklayer.io/help/platforms/shopify/metafields.md#import-metafields-in-bulk). For the values to enter, see [Credit limits and net terms](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md#what-to-enter) and [Prices for one customer](https://docs.sparklayer.io/help/pricing/customer-pricing.md). ### Step 3. Check they've synced Go to **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app and check each customer is there, with the right group in the **Group** column. If a sync banner shows errors, click **Show errors** and fix those customers in Shopify. See [Check a customer has synced](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#check-a-customer-has-synced). [Take the 1-minute tour](https://docs.sparklayer.io/help/customers/managing-customers?tour). ### Step 4. Import their order history So customers see their previous orders in My Account, add an order metafield with the namespace `sparklayer`, key `order_import` and type `boolean`. Set it to `true` on each order you want to import, and check each order has the `b2b` tag. Do this after SparkLayer is installed. For many orders, use Matrixify with our sample CSV template. See [Import order history into SparkLayer](https://docs.sparklayer.io/help/platforms/shopify/metafields.md#import-order-history-into-sparklayer). ### Step 5. Tell your customers they can sign in Customers sign in at your store's login page, for example `www.yourstore.com/account`. If you use Legacy customer accounts, send each one Shopify's account invite first. Email them to say your B2B store is ready, starting with a small group. See [Invite your first customers](https://docs.sparklayer.io/help/get-started/launching.md#invite-your-first-customers) and our [example welcome email](https://docs.sparklayer.io/help/get-started/launching.md#send-a-welcome-email). **More detail** To invite many customers at once, apps such as Matrixify and BAIS Bulk Account Invite can help. See [Invite customers in bulk](https://docs.sparklayer.io/help/get-started/launching.md#invite-customers-in-bulk). ### Step 6. Retire your old wholesale app Once you're happy with SparkLayer, uninstall your previous B2B app. If it changed your theme code, you can ask its developer to remove the changes, but you don't have to. See "What if I already use a wholesale app on my store?" in [Shopify FAQs](https://docs.sparklayer.io/help/platforms/shopify/faqs.md#theme-and-storefront). **Old SparkLayer scripts** SparkLayer now adds a **B2B Ordering** app pixel to **Settings > Customer events** ([open in the Shopify admin](https://admin.shopify.com/settings/customer_events)) when you install it. If an older SparkLayer install added scripts to your checkout or thank-you page, you can delete them once the pixel shows as connected: see [Can I delete old SparkLayer scripts from Additional Scripts?](https://docs.sparklayer.io/help/platforms/shopify/faqs.md#can-i-delete-old-sparklayer-scripts-from-additional-scripts) ## Check it worked - **Every customer is at** **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app, in the right group. - **Signed in as one of them,** you see their trade prices. - **In My Account,** their imported orders show in their order history, and **Financials** shows any credit limit and terms. ## If something's not right - **Customer sync shows errors.** Usually an incomplete address or a tag that doesn't match a group. See [Customer sync shows errors](https://docs.sparklayer.io/help/troubleshooting.md#the-customer-data-sync-shows-errors). - **A customer isn't in the Customers list.** See [A customer isn't in the Customers list](https://docs.sparklayer.io/help/troubleshooting.md#the-customer-data-sync-says-this-customer-id-cannot-be-found). - **SparkLayer doesn't appear when they sign in.** Check their tags and address, and that you're testing on the right theme. See [Widgets don't appear when a B2B customer signs in](https://docs.sparklayer.io/help/troubleshooting.md#widgets-dont-appear-when-a-b2b-customer-signs-in). - **Their old orders don't show.** Check each order has the metafield set to `true` and the `b2b` tag. See [Import order history into SparkLayer](https://docs.sparklayer.io/help/platforms/shopify/metafields.md#import-order-history-into-sparklayer). ## Next steps - [Fix customers or products that won't sync](https://docs.sparklayer.io/help/guides/fix-sync-problems.md): Find and fix sync errors - [Let trusted customers pay later on Net 30](https://docs.sparklayer.io/help/guides/net-terms.md): Set credit limits and payment terms - [Launch checklist](https://docs.sparklayer.io/help/get-started/launching.md): Onboarding pages, welcome emails and going live --- # Run volume pricing and promotions for trade customers URL: https://docs.sparklayer.io/help/guides/volume-discounts Reward bigger B2B orders with quantity price breaks and pack sizes, then run discounts such as volume tiers and coupon codes for chosen customer groups. > **Quick summary** > > - You'll end up with lower unit prices for larger quantities, products sold in packs if you need them, and promotions such as "5% off 24 or more units" for the customer groups you choose. > - Allow about 30 minutes, plus time to prepare a CSV of price breaks. > - Quantity pricing and pack sizes are on every plan. Pack sizes aren't available on Wix. [Discounts](https://docs.sparklayer.io/help/pricing/discounts.md) need the Growth plan or above, including the 14-day Growth trial. There are 3 ways to reward bigger orders, and you can combine them. Quantity pricing changes a product's price as the quantity goes up. Pack sizes control how many customers can order. Discounts sit on top of your price lists, so you can run a promotion without changing anyone's prices. ## Before you start - **Your price lists set up.** See [Set up wholesale prices](https://docs.sparklayer.io/help/guides/set-up-wholesale-prices.md). - **Your price breaks**, for example 14.99 each from 1 unit and 10.99 each from 5. - **The customer groups** a promotion is for, and any coupon code or dates. ## Set it up ### Step 1. Choose the right tool | To | Use | | --- | --- | | Lower a product's unit price as the quantity goes up | [Quantity pricing](https://docs.sparklayer.io/help/pricing/quantity-pricing.md) (step 2) | | Sell a product in packs, or set a minimum quantity | [Quantity rules](https://docs.sparklayer.io/help/storefront/quantity-rules.md) (step 3) | | Run a promotion, such as more off as the quantity goes up, money off over a spend, or a coupon code | [Discounts](https://docs.sparklayer.io/help/pricing/discounts.md) (steps 4 to 6) | ### Step 2. Add quantity price breaks Prepare a CSV file with `sku`, `price` and `qty` columns, one row per price break. Always include a row for a quantity of `1`: ```csv sku,price,qty 123-abc,14.99,1 123-abc,10.99,5 ``` Go to **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app, click **Upload** next to the price list, check the rows and click **Import**. Quantity pricing works with prices you upload, not with an automatic pricing rule. See [Set up quantity pricing](https://docs.sparklayer.io/help/pricing/quantity-pricing.md#set-up-quantity-pricing). To change the breaks for one product, use the [Price editor](https://docs.sparklayer.io/help/pricing/price-editor.md). [Take the 1-minute tour](https://docs.sparklayer.io/help/pricing/price-editor?tour). ### Step 3. Set pack sizes or minimum quantities Optional. Pack sizes and minimums are set in a metafield on each product variant. **Shopify only:** Go to **Integrations > Platform** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform** in the Shopify app. In the **Metafields** card, click **Configure** next to **SparkLayer metafields** to add **B2B - Pack Size** to your variants. Then open the product in your Shopify admin, select a variant, enter the pack size, for example `6`, and click **Save**. **Lots of products? Fill them in one table (Shopify):** in your Shopify admin, go to **Products**, tick the products and click **Edit products**. Click **Columns**, tick **B2B - Pack Size** under **Metafields**, type the values and click **Save**. See [Shopify's guide](https://help.shopify.com/en/manual/custom-data/metafields/bulk-edit-metafields). **BigCommerce and WooCommerce and Magento only:** Add a variant-level `sparklayer` field with the key `pack_size`, as your platform's metafields guide describes, and enter the pack size on each variant. **Wix only:** Wix doesn't support metafields, so pack sizes and product quantity limits aren't available. See [Set a pack size](https://docs.sparklayer.io/help/storefront/quantity-rules.md#product-pack-sizing) and [Set minimum and maximum quantities](https://docs.sparklayer.io/help/storefront/quantity-rules.md#set-minimum-and-maximum-quantities). ### Step 4. Create a discount Go to **Pricing > Discounts** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/discounts)), or **SparkLayer Wholesale > Pricing > Discounts** in the Shopify app and click **Create discount**. Enter a **Discount internal name**, a **Discount handle (or ID)** and a **Discount public name**, which customers see. See [Create a discount](https://docs.sparklayer.io/help/pricing/discounts.md#create-a-discount). [Take the 1-minute tour](https://docs.sparklayer.io/help/pricing/discounts?tour). For more off as the quantity goes up, choose **Advanced requirements and rewards** under **Type**. Set each tier's **Minimum units** and **Discount**, and click **Add tier** for more. See [Set up volume tiers](https://docs.sparklayer.io/help/pricing/discounts.md#set-up-volume-tiers). ### Step 5. Choose which products it applies to Optional. Under **Rules**, click **New rule** to add the products, collections or tags the cart must include before the discount applies. See [Restrict a discount to certain products](https://docs.sparklayer.io/help/pricing/discounts.md#restrict-a-discount-to-certain-products). ### Step 6. Choose who gets it, and when Under **Requirements**, tick **Customer groups** and choose the groups. Add a **Coupon codes** requirement if customers should enter a code, and **Scheduling** for start and end dates. Click **Save**. See [Limit a discount to customer groups](https://docs.sparklayer.io/help/pricing/discounts.md#limit-a-discount-to-customer-groups) and [Limit who can use a discount and when](https://docs.sparklayer.io/help/pricing/discounts.md#limit-who-can-use-a-discount-and-when). ## Check it worked Signed in as a customer in the group: - **The product page shows the price breaks**, as a table of **Qty**, **Price** and **Savings**. - **The quantity selector moves in packs**, if you set a pack size. - **The cart shows the discount** once the order meets its requirements, or once you enter the coupon code. - **A customer in another group** doesn't get the discount. ## If something's not right - **Price breaks don't show.** Check the `qty` column and that every SKU has a price for a quantity of 1. See [Tiered pricing doesn't show](https://docs.sparklayer.io/help/troubleshooting.md#tiered-pricing-doesnt-show). - **A discount isn't applied.** Check it's **Active** and the order meets every requirement. See [Why wasn't a discount applied to an order?](https://docs.sparklayer.io/help/pricing/discounts.md#why-wasnt-a-discount-applied-to-an-order) - **There's no coupon box at checkout.** It only shows when an active discount uses a coupon code. See [I don't see the discount coupon box](https://docs.sparklayer.io/help/pricing/discounts.md#i-dont-see-the-discount-coupon-box-on-the-checkout). - **You can't save a discount.** On Basic or Starter, discounts need Growth. See [Why can't I save a discount?](https://docs.sparklayer.io/help/pricing/discounts.md#why-cant-i-save-a-discount) ## Next steps - [Give a key account their own prices](https://docs.sparklayer.io/help/guides/key-account-prices.md): Set different prices for one company or customer - [Charge the right B2B shipping](https://docs.sparklayer.io/help/guides/b2b-shipping.md): Offer free shipping over a spend - [Discounts](https://docs.sparklayer.io/help/pricing/discounts.md): Every discount type and requirement --- # Show RRPs to your trade customers URL: https://docs.sparklayer.io/help/guides/show-rrp Applies to: Shopify, BigCommerce, WooCommerce, Magento Show each product's RRP (MSRP) beside the B2B price: copy your Shopify prices with a ready-made Flow, or fill in your whole catalogue from a spreadsheet. > **Quick summary** > > - You'll end up with every product showing its RRP (also called MSRP) next to the customer's B2B price, for example "£6.75" with "RRP: £29.99", so trade customers see their margin. > - The RRP lives in a field on each product variant, called `rrp`. SparkLayer adds the field for you; this guide is about filling it in without typing it product by product. > - If your RRP is your Shopify price, a Shopify Flow fills it in for you. If it's a different price, or you sell in several currencies, fill it in from a spreadsheet. Allow about 20 minutes either way. > - Works on Shopify, BigCommerce, WooCommerce and Magento. Wix doesn't support metafields, so RRPs aren't available on Wix. Each variant's `rrp` field holds its retail price and the currency, written like this: `[{"value":29.99,"currency_code":"usd"}]`. The value is a decimal amount, such as `29.99`, not a number of cents or pence. You never have to type that by hand: every route below writes it for you. ## Choose your route | Your RRP is | Use | How it stays up to date | | --- | --- | --- | | The same as your Shopify price | [Shopify Flow](#copy-your-shopify-prices-with-shopify-flow) | Automatically, every hour | | A different price, or in several currencies | [A spreadsheet](#fill-in-rrps-from-a-spreadsheet) | Import again when your RRPs change | | Only needed on a few products | [By hand](#fill-in-a-few-products-by-hand) | Edit the product | Using Shopify Flow? It fills in products as they change, so do a one-off [spreadsheet import](#fill-in-rrps-from-a-spreadsheet) first to cover the products you already have. ## Before you start - **The RRP field.** On Shopify, go to **Integrations > Platform > Metafields** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform > Metafields** in the Shopify app, click **Configure** next to **SparkLayer metafields** and enable the RRP field. On other platforms, your developer adds a variant-level `sparklayer.rrp` field of the type JSON: see [Metafields](https://docs.sparklayer.io/developers/data/metafields.md). - **Your currency code**, in lowercase: the 3 letters for the currency your B2B prices are in, such as `usd`, `gbp` or `eur`. ## Copy your Shopify prices with Shopify Flow **Shopify only:** ### Step 1. Install Shopify Flow [Shopify Flow](https://apps.shopify.com/flow) is a free Shopify app, available on every Shopify plan. Install it from the Shopify App Store. ### Step 2. Import our RRP workflow 1. Download our workflow: [Update RRP metafield when a product is updated](https://cdn.shopify.com/s/files/1/0612/7602/9065/files/Update_RRP_Metafield_when_product_updated.flow?v=1772815525). 2. In your Shopify admin, go to **Apps** > **Flow** and click **Import**. 3. Click **Add files**, choose the file you downloaded and click **Import**. ### Step 3. Set your currency and timing The workflow opens in Flow's editor. Before you turn it on, change two settings: 1. Click the **Get product variant data** step. In its **Query**, change `15 minute` to `60 minute`. The workflow runs once an hour, so this makes it pick up every change since its last run. 2. Click the **Update product variant metafield** step. In its **Value**, change `gbp` to your currency code, for example `usd`. 3. Click **Turn on workflow**. **What the workflow does** Once an hour, it finds the variants that changed in the last hour, up to 100 of them, and writes each one's Shopify price into its `rrp` field. New products are included, because adding a product counts as a change. 100 is the most Flow's **Get product variant data** step can return in one run. ### Step 4. Fill in the products you already have The workflow only picks up products as they change. Fill in your existing catalogue once with a [spreadsheet import](#fill-in-rrps-from-a-spreadsheet), using your **Variant Price** column as the RRP. **BigCommerce and WooCommerce and Magento only:** Shopify Flow is only on Shopify. On BigCommerce, WooCommerce and Magento, fill in your RRPs [from a spreadsheet](#fill-in-rrps-from-a-spreadsheet). ## Fill in RRPs from a spreadsheet A spreadsheet fills in every variant in one import, whatever your RRPs are. On Shopify, use the [Matrixify](https://apps.shopify.com/excel-export-import) app to export and import. On other platforms, use your platform's product export and import, or ask your developer. ### Step 1. Export your products Export your products, including their variants, as an Excel or CSV file. Each variant has its own row, with its price. In Matrixify, export **Products**: the price is in the **Variant Price** column. ### Step 2. Add the RRP column Open the file in Excel or Google Sheets and add a column for the RRP field. For Matrixify, head it `Variant Metafield: sparklayer.rrp [json]`. Then fill in the form with the column that holds each variant's RRP: **Variant Price** if your RRP is your Shopify price, or a column you've added with your RRPs. It writes a formula that turns each price into the right format. Paste it into the first row of your new column, then fill it down to the last row. Rows with no price stay empty, so those variants won't show an RRP. If your spreadsheet writes decimals with a comma, such as `29,99`, set its language to English for this file first, so prices come out as `29.99`. ### Step 3. Import the file So nothing else changes, delete every column except the IDs and your RRP column. For Matrixify, keep **ID** and **Variant ID**: Matrixify uses them to find and update each variant. Then import the file. ## Fill in a few products by hand For one or two products, enter the RRP and its currency in the form. It writes the value for you. Click **Copy**, open the variant in your store admin, paste the value into its `rrp` field and save. **Lots of products? Fill them in one table (Shopify):** in your Shopify admin, go to **Products**, tick the products and click **Edit products**. Click **Columns**, tick the SparkLayer field under **Metafields**, type the values and click **Save**. See [Shopify's guide](https://help.shopify.com/en/manual/custom-data/metafields/bulk-edit-metafields). ## Choose how RRPs and savings show Optional. At **Storefront > Options > Pricing and display** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Pricing and display** in the Shopify app, you can turn on **Base savings on RRP**, so savings are worked out from the RRP, and **RRP toggle**, so buyers can switch between the RRP and their own prices. Click **Save and publish**. See [How prices are shown](https://docs.sparklayer.io/help/pricing/pricing-display.md#show-an-rrp-msrp-price). ## Check it worked Signed in as a B2B customer, or with [Try it out](https://docs.sparklayer.io/help/get-started/launching.md#place-a-test-order): - **The product page shows the RRP** under the price, for example "RRP: £29.99", on each variant. - **In your store admin**, a variant's `rrp` field holds a value such as `[{"value":29.99,"currency_code":"gbp"}]`, with your currency. - **On Shopify Flow**, the workflow's **Runs** show it running each hour without errors. ## If something's not right - **No RRP shows.** Check the value is on the variant, not the product, and that you're signed in as a B2B customer. The RRP's currency must match the currency of the customer's prices. - **Only some products show an RRP.** With Shopify Flow, products that haven't changed since you turned it on have no RRP yet. Fill them in with a [spreadsheet import](#fill-in-rrps-from-a-spreadsheet). - **The product shows the same RRP for every variant.** On a product with several variants, the RRP in the product summary is the first variant's, in your platform's variant order, and it doesn't change when the customer picks another variant. A range isn't available yet. Each variant's own RRP shows in the variant table. See [Show an RRP (MSRP) price](https://docs.sparklayer.io/help/pricing/pricing-display.md#show-an-rrp-msrp-price). - **The RRP shows in the wrong currency.** The workflow still has `gbp` in its value. Change it to your currency code, as in [Set your currency and timing](#set-your-currency-and-timing). - **A price changed but the RRP didn't.** The workflow updates up to 100 variants an hour. After a big price change, import your RRPs again from a spreadsheet. Check the workflow's **Runs** in Shopify Flow for errors. - **You're on Wix.** Wix doesn't support metafields, so RRPs aren't available. ## Next steps - [How prices are shown](https://docs.sparklayer.io/help/pricing/pricing-display.md): Every way to change how prices show, including RRP-only mode - [Shopify Flow for B2B](https://docs.sparklayer.io/help/platforms/shopify/customisations/flow.md): More ready-made workflows for orders, customers and products - [Set up wholesale prices](https://docs.sparklayer.io/help/guides/set-up-wholesale-prices.md): Give trade customers their prices --- # Pricing URL: https://docs.sparklayer.io/help/pricing How B2B pricing works in SparkLayer: price lists, the three ways to fill them, how customer groups decide who sees which prices, and where to set each up. > **Quick summary** > > - B2B prices live in **price lists**: a set of prices for your products, matched by SKU, in one currency. Manage them at **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app. > - A price list gets its prices **automatically** from your store's prices (for example 50% off retail), **manually** by CSV upload or the Price editor, or from another system such as an ERP through an **integration**. > - Customers see a price list's prices when they sign in, once it's assigned to their **customer group**, their company or them individually. > - The free Basic plan includes up to 3 price lists; Starter and above have unlimited price lists. [Discounts](https://docs.sparklayer.io/help/pricing/discounts.md) need the Growth plan. See [Plans and features](https://docs.sparklayer.io/help/plans-and-features.md). Pricing builds up in layers. You start with a price list, choose who sees it, then add quantity pricing and discounts where you need them. This page explains each layer in that order, and how they combine into the price a customer pays. ## How pricing works A [price list](https://docs.sparklayer.io/help/glossary.md#price-list) holds your B2B prices. Each price is set against a product SKU (at variant level), so every product you sell to B2B customers needs a unique SKU. You assign price lists to [customer groups](https://docs.sparklayer.io/help/customers/customer-groups.md), and every B2B customer belongs to a group. When customers sign in, the SparkLayer widgets on your store show them the prices from their group's price lists. How a price reaches a B2B customer: 1. **Prices go in**: Automatic, CSV upload or an integration 2. **Price list**: Prices per SKU, in one currency 3. **Customer group**: Each group is assigned one or more price lists 4. **Customer signs in**: They see their group's prices on your store Prices are always shown to B2B customers **net** (excluding tax). Tax is added at checkout, depending on how tax is set up in your store. If your buyers expect to see prices with tax included, see [tax-inclusive price display](https://docs.sparklayer.io/help/pricing/pricing-display.md#show-tax-inclusive-prices). If your store's own prices include tax, see [If your store's prices include tax](https://docs.sparklayer.io/help/pricing/managing-pricing.md#tax-inclusive-prices) before you set up automatic pricing. ## Automatic, manual or integration Prices get into a price list in 3 ways. Choose the one that matches where your trade prices come from today. | Way | What it means | Example | Set it up | | --- | --- | --- | --- | | **Automatic** | SparkLayer works out prices from a pricing source, such as your store's own prices, with a percentage increase or decrease. Prices update when your store's prices change. | 50% off your store's retail prices | [Set up automatic pricing](https://docs.sparklayer.io/help/pricing/managing-pricing.md#set-up-automatic-pricing) | | **Manual** | You set exact prices per SKU by uploading a CSV file, or edit single prices in the Price editor. | A CSV of specific trade prices | [Upload prices by CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md) | | **Integration** | A backend system such as an ERP, PIM or CRM sends prices to SparkLayer through the API. Available on the Pro and Enterprise plans. | Sync prices from NetSuite | [Send prices from another system](https://docs.sparklayer.io/help/pricing/managing-pricing.md#send-prices-from-another-system) | You can combine them. For example, an automatic price list at 50% off retail can also hold exact prices for a few products, set by CSV upload or with **Override for this SKU** in the [Price editor](https://docs.sparklayer.io/help/pricing/price-editor.md). ## Who sees which prices Customer groups set the prices for most customers. When one business or person needs something different, you can go a level further: | Level | Set it at | Guide | | --- | --- | --- | | **Customer group** | **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app. One or more price lists per group. | [Assign a price list to customers](https://docs.sparklayer.io/help/pricing/managing-pricing.md#assign-a-price-list-to-customers) | | **Company or location** | The company or location page, under **Prices and rules**. | [Give a company its own price list](https://docs.sparklayer.io/help/pricing/customer-pricing.md#give-a-company-its-own-price-list) | | **One customer** | Their own price lists, or an extra percentage discount, on their record in your store. | [Prices for one customer](https://docs.sparklayer.io/help/pricing/customer-pricing.md) | To give one key account their own prices, step by step, follow [Give a key account their own prices](https://docs.sparklayer.io/help/guides/key-account-prices.md). ## Quantity pricing and discounts Once customers have the right price list, 2 features can lower what they pay: - **[Quantity pricing](https://docs.sparklayer.io/help/pricing/quantity-pricing.md)** lowers the unit price as the quantity rises, for example buy 1 at $10 or 10 at $8. You set it in a price list. Quantities can be counted per variant or across the parent product. - **[Discounts](https://docs.sparklayer.io/help/pricing/discounts.md)** add promotions on top of price lists: order discounts, volume tiers and coupon codes. They need the Growth plan. To set up both for bigger orders, follow [Run volume pricing and promotions for trade customers](https://docs.sparklayer.io/help/guides/volume-discounts.md). ## How it all fits together SparkLayer works out a customer's price in this order: | Step | What happens | Guide | | --- | --- | --- | | 1. Price list | The most specific price list applies: the customer's own price lists, then their company location's, then their company's, then their customer group's. If a product is in several of the group's lists, the first one wins. | [What overrides what](https://docs.sparklayer.io/help/customers.md#who-sets-what) and [Which price list wins](https://docs.sparklayer.io/help/pricing/managing-pricing.md#price-list-order) | | 2. Quantity price | If the price list has price breaks, the unit price comes from the break the quantity falls into. | [Quantity pricing](https://docs.sparklayer.io/help/pricing/quantity-pricing.md) | | 3. Customer discount | A customer's extra percentage discount, if set, is taken off the unit price. | [Prices for one customer](https://docs.sparklayer.io/help/pricing/customer-pricing.md#give-a-customer-an-extra-percentage-discount) | | 4. Discounts | Any discounts the cart qualifies for apply on top, for example an amount off the order's sub-total. | [Discounts](https://docs.sparklayer.io/help/pricing/discounts.md) | | 5. Tax | Tax is added at checkout. | [Tax and shipping](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md) | ## Set up B2B pricing for the first time B2B pricing takes 4 steps to set up, and needs no code. 1. Check that every product you sell to B2B customers has a **unique SKU** in your store. SparkLayer matches prices to products by SKU. 2. Create a price list at **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app. See [Create a price list](https://docs.sparklayer.io/help/pricing/managing-pricing.md#create-a-price-list). 3. Fill it with prices: a percentage off your store's prices ([automatic pricing](https://docs.sparklayer.io/help/pricing/managing-pricing.md#set-up-automatic-pricing)), or exact prices from a spreadsheet ([upload prices by CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md)). 4. Assign the price list to a customer group at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app. To give every B2B customer the same prices, assign it to the **Base customer group**. See [Assign a price list to customers](https://docs.sparklayer.io/help/pricing/managing-pricing.md#assign-a-price-list-to-customers). Then sign in to your store as a test B2B customer to check the prices. See [Test as a B2B customer](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#test-as-a-b2b-customer). For the same setup as one guide, from price list to first buyer, follow [Set up wholesale prices for your trade customers](https://docs.sparklayer.io/help/guides/set-up-wholesale-prices.md). ## Supported pricing rules Everything SparkLayer's pricing engine supports, and where to set it up: | Rule | What you can do | Guide | | --- | --- | --- | | **Currencies** | Set up price lists in different currencies. | [Price lists](https://docs.sparklayer.io/help/pricing/managing-pricing.md) | | **Customer rules** | Assign one or more price lists to a customer group, a company or a single customer, and give individual customers an extra percentage discount. | [Prices for one customer](https://docs.sparklayer.io/help/pricing/customer-pricing.md) | | **Quantity pricing** | Lower the unit price as the quantity rises. Count quantities per variant or across the parent product. | [Quantity pricing](https://docs.sparklayer.io/help/pricing/quantity-pricing.md) | | **Discounts and promotions** | Add order discounts, volume tiers and coupon codes on top of price lists. Needs the Growth plan. | [Discounts](https://docs.sparklayer.io/help/pricing/discounts.md) | | **Pricing display** | Show RRP (MSRP), quantity price breaks, unit costs and tax-inclusive prices. | [How prices are shown](https://docs.sparklayer.io/help/pricing/pricing-display.md) | | **Quantity rules** | Set minimum and maximum order quantities and pack sizes per customer group. | [Quantity rules](https://docs.sparklayer.io/help/storefront/quantity-rules.md) and [storefront features](https://docs.sparklayer.io/help/storefront.md) | ## Pricing guides - [Price lists](https://docs.sparklayer.io/help/pricing/managing-pricing.md): Create automatic and manual price lists and assign them to customers - [Upload prices by CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md): Prepare a CSV file and upload exact prices to one or more price lists - [Price editor](https://docs.sparklayer.io/help/pricing/price-editor.md): Find a product and change or override its prices without a CSV file - [Prices for one customer](https://docs.sparklayer.io/help/pricing/customer-pricing.md): Give individual customers their own price lists or an extra discount - [Quantity pricing](https://docs.sparklayer.io/help/pricing/quantity-pricing.md): Set price breaks by quantity and price boxes, cases or pallets - [Discounts](https://docs.sparklayer.io/help/pricing/discounts.md): Set up order discounts, volume tiers and coupon codes (Growth plan) - [How prices are shown](https://docs.sparklayer.io/help/pricing/pricing-display.md): Control how prices, RRP, savings and tax appear on your store - [Pricing FAQs](https://docs.sparklayer.io/help/pricing/faqs.md): Answers to common questions, and how to diagnose pricing issues --- # Price lists URL: https://docs.sparklayer.io/help/pricing/managing-pricing Create automatic or manual B2B price lists in SparkLayer, upload or override prices, and assign each list to the customer groups that should see it. > **Quick summary** > > - A price list is a set of B2B prices matched to your product SKUs, in one currency. Create and manage them at **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app. > - A price list can be **automatic** (a percentage off or on your Shopify prices, or another list), **manual** (exact prices you upload by CSV) or both. On the Pro and Enterprise plans, prices can also come from another system through the API. > - Customers see a price list once it's assigned to their [customer group](https://docs.sparklayer.io/help/customers/customer-groups.md), or to them individually with [customer pricing](https://docs.sparklayer.io/help/pricing/customer-pricing.md). If a group has several lists, the first one that contains the product wins: see [Which price list wins](#price-list-order). > - The free Basic plan includes 3 price lists; Starter and above have unlimited price lists. ## How it works You create price lists, then assign them to customers through [customer groups](https://docs.sparklayer.io/help/customers/customer-groups.md). When customers sign in to your store, they see the prices you've set for them. From pricing source to customer: 1. **Pricing source**: Your store's prices, a CSV file or another system 2. **Price list**: A rule such as 50% off, or exact prices per SKU 3. **Customer group**: Assign one or more price lists 4. **Customer**: Signs in and sees their prices | Type | How it works | Best for | | --- | --- | --- | | **Automatic** | You choose a pricing source, such as your Shopify prices, and apply a percentage decrease or increase, such as 50% off. | A simple B2B pricing structure based on percentage discounts | | **Manual** | You upload exact prices for your product SKUs by CSV, or edit them in the [Price editor](https://docs.sparklayer.io/help/pricing/price-editor.md). | Precise pricing, where you need control over every price a customer sees | | **Integration** | A backend system such as an ERP, PIM or CRM sends price data to SparkLayer automatically. | Prices that are already managed in another system | You can combine them: an automatic list at 50% off retail can also hold exact prices for a few products. Prices are always shown **net** (excluding tax), and tax is added at checkout. To show prices with tax included, see [tax-inclusive price display](https://docs.sparklayer.io/help/pricing/pricing-display.md#show-tax-inclusive-prices). If your store's own prices include tax, see [If your store's prices include tax](#tax-inclusive-prices) before you set up automatic pricing. ## Create a price list Start with an empty price list, then add its prices. Before you start, check that: - Every product you sell to B2B customers has a **unique SKU** in your store. Prices are matched to products by SKU. - Those products are **active** in your store, not drafts. SparkLayer only imports prices for active products. - You know the **currency** of the prices. You need one price list per currency. To create a price list: 1. Go to **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app and click **Create price list**. 2. Under **Details**, enter a **Name**, such as "Wholesale GBP". 3. Check the **Handle**. It's filled in from the name. You can change it now, but not later. 4. Choose a **Currency**. You can't change it later either. 5. Choose how the list gets its prices. Tick **Enable automatic pricing** for a percentage off your store's prices (see [Set up automatic pricing](#set-up-automatic-pricing)), **Enable manual pricing** to upload exact prices, or both. 6. Click **Save** in the save bar at the top of the page. **More detail** - Not sure which to choose? Automatic pricing is quickest if your B2B prices are a set percentage off your retail prices. Choose manual if you already have a spreadsheet of trade prices. You can upload exact prices to an automatic list later, so ticking both keeps your options open. - If you've connected a backend system such as an ERP to SparkLayer, only create price lists by hand if they aren't imported from that system. The new price list appears on the **Price lists** screen. Next: 1. Add its prices: [set up automatic pricing](#set-up-automatic-pricing), or [upload prices by CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md). 2. [Assign the price list to a customer group](#assign-a-price-list-to-customers), so customers see it. ### Price list settings The price list form has 3 cards: **Details**, **Automatic pricing** and **Manual pricing**. **Every setting on the form** | Setting | What it does | | --- | --- | | **Name** | The name shown in SparkLayer, for example "Wholesale pricing". It must be unique. You use it to assign the price list to a customer group. | | **Handle** | The list's unique ID, for example `wholesale-pricing`. It's used in [bulk CSV uploads](https://docs.sparklayer.io/help/pricing/csv-upload.md#upload-prices-to-several-price-lists-at-once), [customer pricing](https://docs.sparklayer.io/help/pricing/customer-pricing.md) and the API. It can't be changed once the list is created. | | **Currency** | The currency of the prices in the list, for example GBP. It can't be changed once the list is created. | | **Enable automatic pricing** | Works out prices from a pricing source and your percentage, for example 50% off Shopify prices. | | **Enable manual pricing** | Lets you set specific prices for each product by uploading a CSV file. Once a list is created, this card shows "Manual pricing is managed by uploading a CSV file on the price lists page." instead. | ### If you're on the Basic plan Basic includes 3 price lists. If you save a 4th, you'll see **Basic includes 3 price lists**. Click **Try Starter free** to start a 14-day Starter trial with unlimited price lists, or click **Not now** and delete a list you don't use. See [Your plan and usage](https://docs.sparklayer.io/help/dashboard/plan-and-features.md). ## Set up automatic pricing An automatic price list works out its prices from a **pricing source** and a percentage, so you don't set each price yourself. It's the quickest setup when your B2B prices are a set percentage off retail. 1. Create or edit a price list and tick **Enable automatic pricing**. 2. Choose a **Pricing source**: **Shopify Price**, or one of your other price lists. 3. Leave **Apply a percentage variation** ticked. 4. Choose **Decrease** or **Increase**, and enter the percentage. For example, to take 50% off, choose **Decrease** and enter `50`. 5. Click **Save** in the save bar. **More detail** - **Shopify Price** is the **Price** field on a product in the Shopify admin: the price your regular customers see on your store. When you change a price in Shopify, your automatic price lists update too. - A decrease can be between 0% and 99%, and an increase between 0% and 500%. - If the price list is in a different currency from its pricing source, set a [currency conversion](#set-a-currency-conversion). If your store's prices include tax, [adjust the percentage for tax](#tax-inclusive-prices). - On other platforms, the pricing source is that platform's product price. > **An automatic price list covers every product** > > An automatic price list always applies its percentage to all your products. You can't limit it to some SKUs, a brand or a collection. To price only some products, use a manual price list: upload a CSV with a `sku` and a `price` for just those products, or set them in the [Price editor](https://docs.sparklayer.io/help/pricing/price-editor.md). To add more SKUs later, upload a CSV with only the new ones. If a group has both kinds of list, the [order of its lists](#price-list-order) decides which price wins. For discounts by brand, see [Move brand discounts from another wholesale app](https://docs.sparklayer.io/help/guides/migrate-brand-discounts.md). To set an exact price for a few products on an automatic list, upload them by CSV, or use **Override for this SKU** in the [Price editor](https://docs.sparklayer.io/help/pricing/price-editor.md#override-an-automatic-price-for-one-sku). The **Type** column then shows how many, for example **Automatic + 12 SKU**. ### Set a currency conversion If the price list is in a different currency from its pricing source, you can set a fixed exchange rate. For example, if your pricing source is in USD and the price list is in EUR: 1. Tick **Currency conversion** ("Use a manual exchange rate"). 2. Enter the rate, for example `1 USD = 1.1 EUR`. If the price list is in the same currency as the pricing source, you can't set a currency conversion. ### If your store's prices include tax SparkLayer treats the prices in a price list as **net** (excluding tax), and adds tax at checkout. An automatic price list takes its percentage off your store's own prices. So if your store's prices include tax, the result still contains tax, and tax is then added again at checkout. SparkLayer has no button to correct this for you: work out the percentage by hand, and enter that instead. To find the percentage to enter as a **Decrease**: 1. Take your discount from 100. For 20% off: 100 − 20 = 80. 2. Divide that by 1 plus your tax rate. With 20% VAT: 80 ÷ 1.2 = 66.67. 3. Take the result from 100: 100 − 66.67 = 33.33. Enter `33.33` as the **Decrease**. **Worked example: 20% off, with 20% VAT** | Price | Amount | | --- | --- | | Your store's price, including 20% VAT | £120.00 | | Net price (excluding VAT) | £100.00 | | What you want trade customers to pay: 20% off the net price | £80.00 + VAT | | With a **Decrease** of `20`, the price list price | £96.00 + VAT (20% off £120, treated as net) | | With a **Decrease** of `33.33`, the price list price | £80.00 + VAT | For trade prices with no discount, only the tax taken out, the decrease is 100 − (100 ÷ 1.2) = 16.67%. On Shopify, your prices include tax when **Include sales tax in product price and shipping rate** is turned on at **Settings > Taxes and duties** ([open in the Shopify admin](https://admin.shopify.com/settings/taxes)). If it's off, your prices are already net and you can enter the percentage you want as it is. If your Shopify store uses line item tax (specific tax rates per SKU), automatic price lists don't take this into account. On other platforms, the same applies whenever your platform's product prices include tax. ## Add manual prices A manual price list holds the exact prices you set for each SKU. Choose the tool that fits the job: | To | Use | | --- | --- | | **Add or update prices in bulk** | Click **Upload** next to the price list at **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app. See [Upload prices by CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md). | | **Change a few prices** | The [Price editor](https://docs.sparklayer.io/help/pricing/price-editor.md). | | **Set price breaks by quantity** (for example buy 1 for $10.00, buy 5 for $8.00) | See [Quantity pricing](https://docs.sparklayer.io/help/pricing/quantity-pricing.md). | You can add exact prices to an automatic price list too. That way you automate most of your pricing and still set specific prices for some products. ## Send prices from another system If your prices are managed in a backend system such as an ERP, it can send them to SparkLayer automatically through the [SparkLayer API](https://docs.sparklayer.io/developers/api.md). This is available on the Pro and Enterprise plans, and is usually set up by your developer or integration partner. Some systems have a ready-made [integration](https://docs.sparklayer.io/help/integrations.md) that does this for you. ## Assign a price list to customers A price list takes effect once you assign it to a [customer group](https://docs.sparklayer.io/help/customers/customer-groups.md). This is how you decide which customers see which prices when they sign in. 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. To set prices for every B2B customer, click **Edit** on the **Base customer group** card instead. 2. Find **Price lists**. If it's under **Inherited rules**, click **+ Override** next to it (on the base group, **+ Customize**) to move it up to **Customized rules**. 3. Choose a price list. To add another, click **Add price list**. 4. Click **Save** in the save bar. **More detail** - You can also choose a price list when you create a group, in the **Create customer group** window. - **Reset** next to a customized rule hands it back to the base customer group. - See [Customer groups](https://docs.sparklayer.io/help/customers/customer-groups.md) for everything else a group controls. ### Which price list wins A customer group can have several price lists, numbered in the order you add them. When a product is in more than one of them, the first list wins. As the group page puts it: "If a SKU is in more than one list, SparkLayer uses the first list it's in." So the order of the lists is their priority. For example, if `ABC-123` is $10 in price list 1, $8 in price list 2 and $12 in price list 3, customers in the group see $10. A product that's only in list 3 gets its price from list 3. - **Put the most specific list first**, such as a key account's prices or a clearance list, and a broad list like "Wholesale 30% off" last. A broad automatic list prices every product, so lists after it only count for products it can't price. - **The order is the one shown in the group's Price lists rule**, at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app. - **Prices from outside the group come first.** A customer's own price lists, set with [customer pricing](https://docs.sparklayer.io/help/pricing/customer-pricing.md), and a company's or location's price list, replace the group's. See [What overrides what](https://docs.sparklayer.io/help/customers.md#who-sets-what). If a customer sees the wrong price, check the price list order on their group first. See [A customer gets prices from the wrong price list](https://docs.sparklayer.io/help/troubleshooting.md#a-customer-gets-prices-from-the-wrong-price-list). ### Prices for one company or customer Customer groups set the prices for most buyers. When one business or person needs something different, set their prices at a lower level: | For | Do this | | --- | --- | | **A company or one of its locations** | Choose a **Price list** on the [company page](https://docs.sparklayer.io/help/customers/companies.md#prices-and-rules) or the [location page](https://docs.sparklayer.io/help/customers/company-locations.md#prices-and-rules), in SparkLayer. | | **One customer** | Give them their own price lists, or an extra percentage discount, on their record in your store (on Shopify, in the Shopify admin). See [Prices for one customer](https://docs.sparklayer.io/help/pricing/customer-pricing.md). | For the whole job, step by step, follow [Give a key account their own prices](https://docs.sparklayer.io/help/guides/key-account-prices.md). Once your price lists are set up and assigned, you manage them from the **Price lists** screen. ## The Price lists screen **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app is where you manage every price list. It lists them in a table, with **Bulk upload** and **Create price list** at the top. | Column | What it shows | | --- | --- | | **Name** | The price list's name, with its handle underneath (for example "Handle: trade-20"). Click it to edit the list. | | **Currency** | The list's currency, such as USD. | | **Type** | **Manual (n)**: a manual list with n SKU prices. **Automatic + n SKU**: an automatic list with n SKUs set by hand. **Automatic**: an automatic list with no SKUs set by hand. | Each row has an **Upload** button, for [uploading prices by CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md), and a **⋯** menu. **The ⋯ menu** | Menu item | What it does | | --- | --- | | **Upload CSV** | Uploads prices to this list. See [Upload prices by CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md). | | **Download CSV** | Downloads the list's SKU prices as a CSV file. It's unavailable for an automatic list with no SKUs set by hand. | | **Edit** | Opens the list's settings. | | **Clear** | Removes every SKU price uploaded to the list. See [Clear or delete a price list](#clear-or-delete-a-price-list). | | **Delete** | Deletes the list. See [Clear or delete a price list](#clear-or-delete-a-price-list). | **Tips and shortcuts on the screen** - A tip banner appears at the top of the screen when something needs attention, for example "Trade has no price list, so those buyers see retail prices." or "Trade 20% isn't used by any customer group yet." - The **Common tasks** card links to the usual jobs: create a price list, change prices on a list, set the price of one product, choose who sees a price list, and upload prices from a spreadsheet. ## Edit a price list 1. Go to **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app and click the list's name (or **Edit** in its **⋯** menu). 2. Change the **Name** or the automatic pricing. The **Handle** and **Currency** are read-only. 3. Click **Save** in the save bar. The **More actions** menu at the top of the page has **Download CSV**, **Clear** and **Delete**. ## Clear or delete a price list Clearing empties a list but keeps it; deleting removes it. | Action | What happens | | --- | --- | | **Clear** | Removes every SKU price uploaded to the list. On an automatic list, the automatic rule stays. Confirm with **Clear prices**. | | **Delete** | Deletes the list. Customer groups using it go back to your base pricing. This can't be undone. Confirm with **Delete price list**. | Both are in the list's **⋯** menu at **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app, and in **More actions** when you're editing the list. ## Tax and discounts For how tax is calculated on B2B orders, see [Tax and shipping](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md). To add promotions on top of price lists, use [Discounts](https://docs.sparklayer.io/help/pricing/discounts.md) (Growth plan). They apply automatically or with a coupon code, for all customers or specific customer groups. They include an amount off an order, and volume tiers (more off as the quantity goes up). ## Show "price on application" To show "Price on application" instead of a price, so customers contact you for one: 1. **Leave the product out of the customer's price lists.** With no B2B price, it shows **Unavailable** instead of a price and quantity box, and can't be added to the order. This needs manual price lists, because an automatic list covers every product. To do it for one group whatever its price lists, make the variant un-sellable for that group instead: see [Hide variants or make them unavailable](https://docs.sparklayer.io/help/storefront/product-display.md#hide-variants-or-make-them-unavailable). 2. **Rename "Unavailable".** 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, add overrides for `pdp.messaging.un-sellable` (product pages) and `product-card.messaging.un-sellable` (product cards), for example `Price on application`. See [Change the "Unavailable" message](https://docs.sparklayer.io/help/pricing/pricing-display.md#change-the-unavailable-message). **More detail** - The new text shows wherever a product has no price, including products missing from a price list by mistake. Check your other products have prices first: see [Why a product shows Unavailable](#unavailable). - To let customers ask for a price, use the [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md): your sales agents can add price on application (POA) products to a quote and set the price. ## Troubleshooting **Diagnose: Product missing, no B2B price or “Unavailable”?** Find out whether it’s the product, the price list or your theme. 1. **What’s happening?** Sign in as a B2B customer, then pick the closest match. - The product says “Unavailable”, or shows the retail price: go to question 2 - The product is missing completely: go to question 3 - The product shows, but SparkLayer’s buttons or price are missing: go to question 4 2. **Search for the SKU in the Price editor. Does it find the product?** “No product was found for SKU” means SparkLayer doesn’t have it. Where to look: Pricing > Price editor (SparkLayer). - Yes: go to question 5 - No product was found: go to question 3 3. **Does every variant of the product have a SKU?** Check each variant, not just the product. A barcode doesn’t count as a SKU. Where to look: Products > select the product (Shopify admin). - Yes: go to question 6 - No: go to fix A (Add a SKU to every variant) 4. **Are SparkLayer’s buttons missing on every product, or just some?** Check a few products while signed in as a B2B customer. - Every product: go to fix B (This looks like a tags or theme issue) - Just some: go to question 7 5. **Does the product have a price in a price list on the customer’s group?** Without a B2B price, a product shows as Unavailable, or at your store’s own price. Where to look: Pricing > Price editor (SparkLayer). - Yes: go to question 8 - No: go to question 9 6. **Is each SKU unique across your store?** If two variants share a SKU, SparkLayer can’t tell them apart. Where to look: Products (Shopify admin). - Yes: go to question 10 - No / not sure: go to fix C (Make each SKU unique) 7. **Where are they missing?** Product pages and collection pages use different parts of your theme. - On the product page: go to question 11 - On collection or search results pages: go to question 12 - In a wishlist, quick view or other app: go to fix D (Other apps show your retail price) 8. **Is the customer trying to add fewer than the lowest tier in a tiered price list?** With tiered pricing, the lowest tier also sets the smallest quantity a customer can buy. - Yes: go to fix E (Add a tier for smaller quantities) - No: go to question 13 9. **Which type of price list should give it a price?** Manual lists are uploaded by CSV or set in the Price editor. Automatic lists work prices out from a pricing source, such as your Shopify prices. Where to look: Pricing > Price lists (SparkLayer). - Automatic: go to question 14 - Manual (CSV): go to question 15 10. **Is the product’s status Active?** SparkLayer only imports active products, not Draft ones. Where to look: Products > select the product (Shopify admin). - Yes: go to question 16 - No: go to fix F (Set the product to Active) 11. **Does this product use a different product template from the ones that work?** Check the Theme template setting on the product. Each template needs SparkLayer’s product widget. Where to look: Products > select the product (Shopify admin). - Yes: go to fix G (Add SparkLayer to this product template) - No / not sure: go to question 2 12. **Are you using a filter or search app on that page?** Filter and search apps often use their own product card, which needs SparkLayer added separately. - Yes: go to fix H (Add SparkLayer to the app’s product card) - No / not sure: go to fix I (Add SparkLayer to your product card) 13. **Does the variant’s `sparklayer.settings` metafield set `"sell": false` for this group?** That makes a variant visible but un-sellable on purpose. Where to look: Products > select a variant > Metafields (Shopify admin). - Yes: go to fix J (The variant is set not to be sold) - No / no metafield: go to fix K (Everything checks out) 14. **Does this variant have a value in the list’s pricing source?** For example, a list based on compare-at price needs a compare-at price on every variant. An empty field means there’s no B2B price. Where to look: Products > select the product (Shopify admin). - Yes: go to fix K (Everything checks out) - No: go to fix L (Fill in the pricing source) 15. **Did the SKUs change in Shopify after you uploaded the list?** Prices are matched by SKU, so a renamed SKU no longer matches its old row. - Yes: go to fix M (Update the price list with the new SKUs) - No / not sure: go to question 17 16. **Is the product published to the SparkLayer Wholesale sales channel?** Open the product and check its sales channels. Products from Shopify’s own Bundles app can’t be added to it. Where to look: Products > select the product (Shopify admin). - Yes: go to question 18 - No: go to fix N (Add the product to the SparkLayer Wholesale sales channel) - I can’t select it (a bundle): go to fix O (Shopify’s own Bundles app isn’t supported) 17. **Do the SKUs in your CSV match Shopify exactly, with no spaces before or after?** Spreadsheet exports often add spaces. The upload succeeds, but nothing matches. - Yes: go to fix P (Add a price for this product) - No / not sure: go to fix Q (Trim the SKUs and upload again) 18. **Could the product be hidden on purpose, by B2B Catalogs or a visibility setting?** For example a `b2c-only` tag, or `"display": false` for the customer’s group. - Yes / not sure: go to fix R (Check what’s hiding it) - No: go to fix K (Everything checks out) **Fixes** - **A. Add a SKU to every variant** SparkLayer matches B2B prices to SKUs, so variants without one won’t show. Add a SKU and the product will appear after it syncs. Where: Products > select the product (Shopify admin). - **B. This looks like a tags or theme issue** When SparkLayer’s buttons are missing on every product, the cause is usually the customer’s tags or your theme. Next: SparkLayer not showing or looking wrong? - **C. Make each SKU unique** Rename duplicate SKUs so every variant has its own. Then update any price lists that use the old SKUs. Where: Products (Shopify admin). - **D. Other apps show your retail price** Wishlist, quick view and search apps show Shopify’s own price and don’t know about B2B prices. A SparkLayer widget can be added to the app’s template instead. Ask us, or see the guide. See [Prices in other apps](https://docs.sparklayer.io/help/pricing/pricing-display.md). - **E. Add a tier for smaller quantities** If the first tier starts at, say, 50, customers can’t buy fewer than 50. Add a price for a quantity of 1 if smaller orders should be allowed. Where: Pricing > Price editor (SparkLayer). See [Quantity pricing](https://docs.sparklayer.io/help/pricing/quantity-pricing.md). - **F. Set the product to Active** Draft products don’t sync to SparkLayer. Set it to Active and allow a few minutes for it to sync. Where: Products > select the product (Shopify admin). - **G. Add SparkLayer to this product template** Each product template needs SparkLayer’s product widget. Switch the product to your main template, or send us the template name and we’ll add it. Where: Products > select the product (Shopify admin). - **H. Add SparkLayer to the app’s product card** Tell us which filter or search app you use and we’ll add SparkLayer’s product card widget to it. - **I. Add SparkLayer to your product card** Your theme’s product card is missing SparkLayer’s widget, which often happens after a theme update. Send us a link to the page and we’ll add it. - **J. The variant is set not to be sold** Remove `"sell": false` for this group, or change it to true, if customers in it should be able to buy it. Where: Products > select a variant > Metafields (Shopify admin). See [Product settings](https://docs.sparklayer.io/help/storefront/product-settings.md). - **K. Everything checks out** Your setup looks right, so we'll take it from here. Send us your answers with the product link and the customer’s email. - **L. Fill in the pricing source** The automatic list has nothing to calculate from, so the variant has no B2B price. Add the value, for example a compare-at price, and allow a few minutes for it to sync. Where: Products > select the product (Shopify admin). See [Automatic price lists](https://docs.sparklayer.io/help/pricing/managing-pricing.md). - **M. Update the price list with the new SKUs** Rows for the old SKUs don’t match anything now. Upload the prices again with the new SKUs, or set them in the Price editor. Where: Pricing > Price lists (SparkLayer). - **N. Add the product to the SparkLayer Wholesale sales channel** SparkLayer only imports products published to its sales channel. Where: Products > select the product (Shopify admin). - **O. Shopify’s own Bundles app isn’t supported** Its bundle products can’t be published to the SparkLayer sales channel, so they get no B2B price or buttons. Use a bundle app that creates a regular product with its own SKU. See [Bundles and SparkLayer](https://docs.sparklayer.io/help/platforms/shopify/faqs.md#do-bundles-from-other-apps-get-b2b-prices). - **P. Add a price for this product** Add the SKU to a price list on the customer’s group, or set it in the Price editor. If you don’t want B2B customers to buy it, hide it from them instead. Where: Pricing > Price editor (SparkLayer). - **Q. Trim the SKUs and upload again** Clear the price list, remove spaces from the SKU column, save the CSV and upload it again. SKUs must match Shopify exactly. Where: Pricing > Price lists (SparkLayer). See [Upload prices by CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md). - **R. Check what’s hiding it** B2B Catalogs tags and the visibility metafield can hide products on purpose. Next: Product showing to the wrong customers? ### Why a product shows Unavailable B2B customers see **Unavailable** instead of a price and quantity box when SparkLayer has no price it can use for them. | Cause | Fix | | --- | --- | | **No B2B price for the SKU** on the customer's price lists. This is the most common cause. | Add a price for the SKU, by [CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md) or in the [Price editor](https://docs.sparklayer.io/help/pricing/price-editor.md). If B2B customers shouldn't buy it, hide it from them with the free [B2B Catalogs](https://docs.sparklayer.io/help/storefront/b2b-catalogs/configuring-your-catalogs.md#make-a-product-b2b-only-or-b2c-only) app and the `b2c-only` tag. | | **The automatic list's pricing source is empty** for that variant. For example, the list is based on the compare-at price and the variant has no compare-at price, so there's nothing to take the percentage from. | Fill in the field in your store, then wait a few minutes for it to sync. | | **The SKU in the price list doesn't match the product**, because of spaces in the CSV or a SKU that's changed. | See [If prices show as Unavailable after an upload](#if-prices-show-as-unavailable-after-an-upload). | | **The product isn't in SparkLayer.** The Price editor says no product was found. | Publish the product to the **SparkLayer Wholesale** sales channel, and check it's **Active**. See [Add prices for a product that isn't found](https://docs.sparklayer.io/help/pricing/price-editor.md#product-not-found). | | **The variant has been made un-sellable** on purpose, with `sell: false` in its `sparklayer.settings` metafield. | Remove the setting if customers should be able to order it. See [Hide variants or make them unavailable](https://docs.sparklayer.io/help/storefront/product-display.md#hide-variants-or-make-them-unavailable). | Your store might not say **Unavailable**. If your theme or the `pdp.messaging.un-sellable` [language string](https://docs.sparklayer.io/help/storefront/stock-display.md#change-stock-status-messages) has been changed, the same state can show as **Out of stock**, or as a message such as "Contact us to order". Check the causes above before you look at stock. A free product from a [discount](https://docs.sparklayer.io/help/pricing/discounts.md) needs a B2B price too. If the free SKU has no price on the customer's price lists, it shows as Unavailable in the cart. ### If prices show as Unavailable after an upload An upload can look successful and still match nothing. Two things cause this: - **Spaces before or after a SKU.** `ABC-123 ` (with a space) doesn't match `ABC-123`. Clear the price list (**⋯** > **Clear**), trim the spaces from the SKU column, then upload the file again. In Excel or Google Sheets, the `TRIM` function removes them. - **SKUs changed in your store after the upload.** The price list still holds prices for the old SKUs, so the products with new SKUs have no price. Upload the prices again against the new SKUs. See [Upload prices by CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md). ## FAQs **How quickly does an automatic price list update when I change a price in my store?** Straight away. Price changes in your platform update automatic price lists in SparkLayer instantly. **Can I override some prices in an automatic price list?** Yes. Upload a CSV file to the automatic price list with only the SKUs and prices you want to set (see [Upload prices by CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md)), or use **Override for this SKU** in the [Price editor](https://docs.sparklayer.io/help/pricing/price-editor.md). **Can I change a price list's currency or handle?** No. The handle and currency can't be changed once a price list has been created. Create a new price list instead. **Where can I find more answers?** See [Pricing FAQs](https://docs.sparklayer.io/help/pricing/faqs.md) for common questions about price lists, and the [troubleshooting guide](https://docs.sparklayer.io/help/troubleshooting.md) for ways to solve common issues. ## Next steps - [Set up wholesale prices](https://docs.sparklayer.io/help/guides/set-up-wholesale-prices.md): The whole setup in one guide: a price list, a customer group and your first buyers - [Upload prices by CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md): Add exact prices to a price list from a spreadsheet - [Customer groups](https://docs.sparklayer.io/help/customers/customer-groups.md): Assign the price list to a group, then add customers to it --- # Upload prices by CSV URL: https://docs.sparklayer.io/help/pricing/csv-upload Prepare a CSV file of SKUs and prices, upload it to one or several SparkLayer price lists, check the rows before you import, and update or remove prices. > **Quick summary** > > - Upload exact prices to a price list with a CSV file that has a **SKU** and a **Price** column. Add `qty` for quantity pricing, `unit_of_measure` for unit of measure pricing, or `price_list_slug` to update several price lists at once. > - Upload to one price list with **Upload** next to it at **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app, or to several with **Bulk upload** at the top of the same screen. > - Before anything changes, **Check your upload** shows how many rows are ready and why any will be skipped. Then click **Import** to set the prices. > - A file only needs the SKUs you want to change: everything else on the list stays as it is. Prices must be numbers, without a currency symbol. ## How it works Upload a CSV file to set exact prices on a manual price list, or to set specific prices for some products on an automatic price list. For single changes, the [Price editor](https://docs.sparklayer.io/help/pricing/price-editor.md) is quicker. A CSV (comma-separated values) file is a plain spreadsheet format. Any spreadsheet tool can save a sheet as a CSV file, usually from its **File** menu. In Google Sheets, for example, go to **File > Download > Comma Separated Values (.csv)**. Uploading prices by CSV: 1. **Prepare the file**: One row per SKU and price 2. **Choose the file**: For one price list, or several with Bulk upload 3. **Check your upload**: See which rows are ready and which will be skipped 4. **Import**: Signed-in customers see the new prices ## Prepare your CSV file Start from a template: - [Download the CSV template](https://docs.sparklayer.io/files/price-list-template.csv): SKU and Price columns, ready to fill in - [Copy our Google Sheet](https://docs.google.com/spreadsheets/d/13gi0W7yZcZ-CtWXYw1nUJN_art-gSbzRjqN8GSLNaig/copy): Makes your own copy in Google Drive You can also get a template in the upload window: click **Download template**. The simplest file has 2 columns, **SKU** and **Price**. It has a header row (the column names), then one row per SKU. Prices are per unit, for example `14.99`: ```csv sku,price 123-abc,14.99 124-abc,12.99 125-abc,15.99 126-abc,99.99 ``` The template writes the column names as `SKU` and `Price`. Column names aren't case-sensitive, so `sku` and `price` work too. Before you upload, check that: - The **price list exists**. If not, [create a price list](https://docs.sparklayer.io/help/pricing/managing-pricing.md#create-a-price-list) first. - Every **SKU matches** a product SKU in your store exactly, and the product is active. - No SKU has **spaces before or after it**. A space stops the SKU matching. In Excel or Google Sheets, the `TRIM` function removes them. - The **header row** is the first row, and uses the column names shown below. - **Prices are numbers only**, such as `14.99`, with no currency symbol. - The file is **saved as CSV**, not as a spreadsheet file such as .xlsx. ### CSV columns Most uploads need only SKU and Price. Add the other columns for specific features. | Column | What it contains | Required | | --- | --- | --- | | `sku` | The product SKU as set up in your eCommerce platform or backend system. | Yes | | `price` | The unit price for the SKU, for example `14.99`. Don't include a currency symbol such as $ or £. | Yes | | `qty` | The quantity this price applies from, for [quantity pricing](https://docs.sparklayer.io/help/pricing/quantity-pricing.md). If you use it, every row needs a quantity, and every SKU needs a row with a quantity of `1`. An empty cell fails the import. Leave the column out and every price applies from a quantity of 1. | No (defaults to 1) | | `unit_of_measure` | The unit the quantity belongs to, such as `box` or `pallet`, for [unit of measure pricing](https://docs.sparklayer.io/help/pricing/quantity-pricing.md#set-up-unit-of-measure-pricing). Letters and numbers only, with underscores as separators, such as `pallet_box`. | No | | `price_list_slug` | The handle of the price list to update, for [bulk uploads](#upload-prices-to-several-price-lists-at-once). | Only for bulk uploads | | `display_tax_rate` | The tax percentage (0 to 100) used to show prices with tax included, for [tax-inclusive price display](https://docs.sparklayer.io/help/pricing/pricing-display.md#show-tax-inclusive-prices). It applies to the whole SKU on the price list, so use the same rate on every row for a SKU: conflicting rates fail the import. A blank cell leaves the SKU's rate as it is, so you can give it on just one of its rows. | No | For example, a file with price breaks, units and display tax rates: ```csv sku,price,qty,unit_of_measure,display_tax_rate ABC-123,10.00,1,each,20 ABC-123,9.00,10,each,20 ``` ## Upload prices to a price list 1. Go to **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app and click **Upload** next to the price list (or **Upload CSV** in its **⋯** menu). The **Upload prices to** window opens, named after the list. 2. Choose your CSV file, or drop it into the window. 3. Under **Check your upload**, check the number of rows ready, and the reasons for any rows that will be skipped (see [Skipped rows](#skipped-rows)). 4. Click **Import**. The button shows how many prices it imports, for example **Import 240 prices**. **More detail** - Importing sets the prices for the SKUs in the file. Everything else on the list stays as it is. - To fix a problem first, click **Choose another file**. - If the price list isn't assigned to a customer group yet, [assign it](https://docs.sparklayer.io/help/pricing/managing-pricing.md#assign-a-price-list-to-customers) so customers can see the prices. ## Upload prices to several price lists at once Use **Bulk upload** to update several price lists from one CSV file, for example the same products in several currencies. 1. Find the handle of each price list you want to update. It's shown under the price list's name at **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app, for example `Handle: base-uk`. 2. Add a `price_list_slug` column to your CSV file and enter the handle on each row. You can add as many rows as you need for each price list: ```csv sku,price,price_list_slug 123-abc,7.99,base-uk 123-abc,10.99,base-us 789-abc,5.99,base-uk 789-abc,7.99,base-us ``` 3. At **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app, click **Bulk upload** at the top of the page. The **Bulk upload prices** window opens. 4. Choose your file, check the rows under **Check your upload**, then click **Import**. Under **Check your upload**, the ready banner shows how many prices go to each list. Once the prices are imported, [assign the price list to a customer group](https://docs.sparklayer.io/help/pricing/managing-pricing.md#assign-a-price-list-to-customers) if it isn't already. ## Skipped rows Rows with a problem are skipped, and the rest still import. **Check your upload** shows your file's name and how many rows are ready, for example "238 of 240 rows ready", and lists each skipped row with a reason. | Reason | What to do | | --- | --- | | **No SKU** | Add the SKU to the row. | | **SKU … isn't in your catalogue** | Check the SKU exists in your store, matches exactly and the product is active. | | **Price "…" isn't a number (no currency symbols)** | Enter the price as a number only, such as `14.99`. | | **No price list with the handle "…"** | In a bulk upload, check the `price_list_slug` matches a list's handle exactly. | If you see **This file can't be used**, the first row doesn't have the right column names. The first row needs **SKU** and **Price** (or **SKU**, **Price** and **price\_list\_slug** for a bulk upload). Click **Download template** to see the layout, then **Try another file**. ## Update or remove some prices | To | Do this | | --- | --- | | **Update some prices** | Upload a CSV file with only the SKUs and prices you want to change. SparkLayer updates those prices and keeps the rest. | | **Remove one product's price** | In the [Price editor](https://docs.sparklayer.io/help/pricing/price-editor.md), open the variant and click **Remove** next to the price. | | **Remove every price from a price list** | Open the **⋯** menu next to the price list and click **Clear**, then **Clear prices**. On an automatic list, the automatic rule stays. | | **Download a price list's prices** | Open the **⋯** menu next to the price list and click **Download CSV**. | A row with a blank price doesn't remove that SKU's price. To remove a price, use the Price editor, or clear the price list. ## Troubleshooting **My SKUs aren't found** SparkLayer matches prices to products by SKU, so each product (variant) needs a unique SKU in your store. Check that: - The **SKU exists** in your product catalogue and **matches exactly**. - The SKU is **unique**. - The product is **active**, not a draft. See [Pricing FAQs](https://docs.sparklayer.io/help/pricing/faqs.md#why-isnt-my-b2b-pricing-showing-on-my-website). **The upload worked, but products show as Unavailable** The SKUs in the file probably don't match your products exactly. Check for: - **Spaces before or after a SKU.** The upload can still look successful, but nothing matches. Clear the price list (**⋯** > **Clear**), trim the spaces from the SKU column, then upload the file again. - **SKUs that changed in your store.** If you change a SKU after uploading its price, the price list keeps the old SKU and the product has no price. Upload the prices again against the new SKUs. For other causes, see [Why a product shows Unavailable](https://docs.sparklayer.io/help/pricing/managing-pricing.md#unavailable). **My prices aren't importing** Check the price column contains numbers only, without a currency symbol, and that the header row is the first row of the file. **Still having issues?** See the [troubleshooting guide](https://docs.sparklayer.io/help/troubleshooting.md) for ways to solve common issues. ## Next steps - [Assign a price list to customers](https://docs.sparklayer.io/help/pricing/managing-pricing.md#assign-a-price-list-to-customers): Choose which customer groups see the prices you've uploaded - [Price editor](https://docs.sparklayer.io/help/pricing/price-editor.md): Check or change a single product's prices without a new file --- # Price editor URL: https://docs.sparklayer.io/help/pricing/price-editor Use the SparkLayer Price editor to find a product or variant, see its price on every list, and edit, remove or override a price without a CSV file. > **Quick summary** > > - The Price editor changes B2B prices one product at a time, without uploading a CSV file. Find it at **Pricing > Price editor** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/editor)), or **SparkLayer Wholesale > Pricing > Price editor** in the Shopify app. > - Search for a product and open a variant to see its Shopify price and its price on every price list. > - On a manual price list, edit or remove the price. On an automatic list, click **Override for this SKU** to set an exact price for that one variant. > - For many prices at once, [upload a CSV file](https://docs.sparklayer.io/help/pricing/csv-upload.md). ## How it works The Price editor is for one-off changes, such as giving one product a special price on your trade list. For changes to many products, [upload a CSV file](https://docs.sparklayer.io/help/pricing/csv-upload.md) instead. The editor has 2 levels: | Screen | What it shows | | --- | --- | | **Price editor** | A search box and a product table with **Product**, **ID or SKU** and **Retail price**. Click a product's arrow to show its variants underneath. | | **A variant's prices** | The variant's details, its **Shopify price**, and a card for each price list with the variant's price on that list. | It's also the quickest way to check whether a product has a price on a list, when [diagnosing pricing issues](https://docs.sparklayer.io/help/pricing/faqs.md#diagnosing-pricing-issues). ## Find a product's prices 1. Go to **Pricing > Price editor** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/editor)), or **SparkLayer Wholesale > Pricing > Price editor** in the Shopify app. 2. Search by product name, ID, barcode, variant SKU or option. 3. Click the arrow next to the product to show its variants. If you searched for a variant's SKU, the product opens already. 4. Click the variant's option name to see its prices. **More detail** - The variant's page shows the product name, its SKU and Shopify ID, and the option. Use the **Variant** menu to switch to another variant, or **View product in Shopify** to open it in your Shopify admin. - **Shopify price** shows the variant's price in Shopify. It's read-only: change it on the product in Shopify. - Each price list card shows the list's name and currency, and a table of **Quantity**, **Unit of measure** and **Price**. ## Edit or remove a price You can edit a price on a manual price list, or on an automatic list you've overridden for this SKU. 1. Find the product and open the variant. 2. In the price list's card, click **Edit** next to the price. 3. Enter the new **Price for 1 or more** and click **Save price**. To delete a price, click **Remove** next to it, then click **Remove price**. On an overridden automatic list, the SKU goes back to the list's automatic rule. ## Override an automatic price for one SKU An automatic price list works out its prices from a rule, such as "Automatic: 20% off the Shopify price." To give one variant an exact price on that list: 1. Find the product and open the variant. 2. In the automatic list's card, click **Override for this SKU**. 3. Enter the **Price for 1 or more** and click **Save price**. The card now says "Overridden for this SKU." At **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app, the list's **Type** counts the extra SKU, for example **Automatic + 1 SKU**. To go back to the rule, click **Remove** next to the price. ## Add a price Add a price to give a variant a quantity break or a unit of measure price. 1. Find the product and open the variant. 2. Under the price list's table, click **Add a new price**. 3. Enter the quantity and price. For [unit of measure pricing](https://docs.sparklayer.io/help/pricing/quantity-pricing.md#set-up-unit-of-measure-pricing), also enter the unit of measure. 4. Save the price. ## Add prices for a product that isn't found If a search finds nothing, you'll see "No product was found for SKU …". You can still click **Create pricing for SKU …** to add prices for a SKU that isn't in your catalogue yet. ## FAQs **Why can't I edit a price?** The price is on an automatic price list, so it's worked out from the list's rule. Click **Override for this SKU** to set an exact price for that variant, or change the list's percentage at **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app. See [Set up automatic pricing](https://docs.sparklayer.io/help/pricing/managing-pricing.md#set-up-automatic-pricing). **How do I add a product to a price list it isn't on?** On a manual list, upload the product's SKU and price by CSV. See [Upload prices by CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md). On an automatic list, every product already has a price from the rule. **Where do I change the retail price?** In Shopify. The **Shopify price** card is read-only and comes from the product in your Shopify admin. Automatic price lists based on it update when you change it. --- # Prices for one customer URL: https://docs.sparklayer.io/help/pricing/customer-pricing Give individual B2B customers an extra percentage discount or their own price lists, set on the customer's record in Shopify or your other eCommerce platform. > **Quick summary** > > - Give a single customer their **own price lists**, which replace their customer group's, or an **extra percentage discount** on top of their prices. Both are included on every plan. > - Both are set on the customer's record in your eCommerce platform, in 2 SparkLayer fields called metafields: the customer's **price lists** and their **discount percentage**. > - On Shopify, SparkLayer can add these fields to your store for you from **Integrations > Platform > Metafields** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform > Metafields** in the Shopify app. You then fill them in on the customer in the Shopify admin. Wix doesn't support metafields, so customer pricing isn't available on Wix. > - To give a whole > [company](https://docs.sparklayer.io/help/customers/companies.md) > different prices from its customer group, set the company's > **Price list** > instead. ## How it works A customer's prices usually come from the [price lists](https://docs.sparklayer.io/help/pricing/managing-pricing.md) assigned to their [customer group](https://docs.sparklayer.io/help/customers/customer-groups.md). Customer pricing goes a step further for individual customers: - **Customer-specific price lists** replace the customer group's price lists for that customer. For example, you have a standard B2B price list, but some customers should get lower prices on some or all products. You create another price list, upload its prices in SparkLayer, then set it on those customers. - A **customer percentage discount** takes an extra percentage off the customer's prices. For example, your B2B customers are on a price list, and you want some of them to get an extra 25% off those prices. How a customer's price is worked out: 1. **Customer group price lists**: The default for everyone in the group 2. **Customer price lists**: Override the group's, if set 3. **Customer discount**: An extra percentage off, if set To choose between these, and a customer group of their own, step by step, follow [Give a key account their own prices](https://docs.sparklayer.io/help/guides/key-account-prices.md). **Shopify only:** People at a [company](https://docs.sparklayer.io/help/customers/companies.md) can also get a price list set on their company or location, in SparkLayer. See [Give a company its own price list](#give-a-company-its-own-price-list). A customer's own price lists win over their company's and location's: see [What overrides what](https://docs.sparklayer.io/help/customers.md#who-sets-what). ### Where customer pricing is stored Customer pricing is stored in **metafields** (sometimes called attributes). A metafield is an extra field on a customer's record in your eCommerce platform, like a custom box on the customer's page, which SparkLayer reads. You set the field up once for your store, then fill it in for each customer who needs it. See [Shopify metafields and data mapping](https://docs.sparklayer.io/help/platforms/shopify/metafields.md), and for other platforms, [Metafields](https://docs.sparklayer.io/developers/data/metafields.md) in the developer docs. To check what a customer has, open their page at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app: **Price list override** is under **Basic information**, and **Discount percentage** under **Financial details**. Both are read-only there, because they come from your store. ## Give a customer their own price lists A customer's own price lists replace their customer group's price lists. 1. Create the price list and add its prices. See [Price lists](https://docs.sparklayer.io/help/pricing/managing-pricing.md) and [Upload prices by CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md). 2. Note the price list's handle, shown under its name at **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app, for example `vip-pricing`. 3. Make sure the `price_lists` metafield is set up in your store. On Shopify, you can add it from **Integrations > Platform > Metafields** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform > Metafields** in the Shopify app by clicking **Configure** next to **SparkLayer metafields**. 4. In the form below, enter the price list handles. It writes the value for you, for example `["vip-pricing","base-list"]`. 5. Click **Copy**, open the customer in your store admin (on Shopify, the customer's **Metafields** card), paste the value into the price lists field and save. **Lots of customers? Fill them in one table (Shopify):** in your Shopify admin, go to **Customers**, tick the customers and click **Edit customers**. Click **Columns**, tick the SparkLayer field under **Metafields**, type the values and click **Save**. See [Shopify's guide](https://help.shopify.com/en/manual/custom-data/metafields/bulk-edit-metafields). **Metafield settings, if you create the field by hand** The settings are the same on every platform: | Setting | Value | | --- | --- | | **Custom data type** | Customers (on Shopify, at **Settings > Custom data > Customers** ([open in the Shopify admin](https://admin.shopify.com/settings/custom_data/customer/metafields))) | | **Metafield type** | `json` | | **Namespace** | `sparklayer` | | **Key** | `price_lists` | | **Value** | A JSON list of price list handles, as above | For platforms other than Shopify, see the [SparkLayer developer docs](https://docs.sparklayer.io/developers.md). ## Give a customer an extra percentage discount A customer discount takes an extra percentage off the customer's prices. **Shopify:** 1. Set up the discount field once: go to **Integrations > Platform > Metafields** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform > Metafields** in the Shopify app, click **Configure** next to **SparkLayer metafields** and enable the customer discount. See [Add metafields automatically](https://docs.sparklayer.io/help/platforms/shopify/metafields.md#add-metafields-automatically). 2. In your Shopify admin, go to **Customers** ([open in the Shopify admin](https://admin.shopify.com/customers)) and open the customer. 3. In the customer's **Metafields** card, find **Customer % Discount** (click **Show all** if you can't see it). 4. Enter the percentage, for example `25` for an extra 25% off, and save the customer. **Lots of customers? Fill them in one table (Shopify):** in your Shopify admin, go to **Customers**, tick the customers and click **Edit customers**. Click **Columns**, tick **Customer % Discount** under **Metafields**, type the values and click **Save**. See [Shopify's guide](https://help.shopify.com/en/manual/custom-data/metafields/bulk-edit-metafields). **Metafield settings, if you create the field by hand** | Setting | Value | | --- | --- | | **Custom data type** | Customers, at **Settings > Custom data > Customers** ([open in the Shopify admin](https://admin.shopify.com/settings/custom_data/customer/metafields)) | | **Metafield type** | `number_decimal` | | **Namespace** | `sparklayer` | | **Key** | `discount_percentage` | | **Value** | A decimal number, for example `10`, `22.5` or `50.25` | **Other platforms:** Set the `discount_percentage` metafield (or attribute) on the customer to the percentage, for example `25` for an extra 25% off. Your developer or agency can set this up with these settings: | Setting | Value | | --- | --- | | **Custom data type** | Customers | | **Metafield type** | `decimal` | | **Namespace** | `sparklayer` | | **Key** | `discount_percentage` | | **Value** | A decimal number, for example `10`, `20` or `50` | For more information, see the [SparkLayer developer docs](https://docs.sparklayer.io/developers.md). For promotions such as coupon codes or spend thresholds, use [Discounts](https://docs.sparklayer.io/help/pricing/discounts.md) instead. ## Give a company its own price list **Shopify only:** If you use [companies](https://docs.sparklayer.io/help/customers/companies.md), set a price list for the whole company instead of for each person in it. You do this in SparkLayer, not in your store. 1. Go to **Companies** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/companies)), or **SparkLayer Wholesale > Companies** in the Shopify app and click the company's name. 2. Under **Prices and rules**, choose a **Price list**. Leave it on **Use the customer group's price list** unless the company needs different prices from its group. 3. Click **Save** in the save bar. ## FAQs **Does a customer's own price list replace their customer group's price lists?** Yes. Price lists set on a customer override the price lists of their customer group. **Can I set customer pricing from my ERP?** Yes. Customer-specific price lists set with metafield data are designed for more advanced setups, such as pricing managed in an ERP. See [Send prices from another system](https://docs.sparklayer.io/help/pricing/managing-pricing.md#send-prices-from-another-system). **Can I assign several price lists to a customer group instead?** Yes. A customer group can have several price lists. See [Assign a price list to customers](https://docs.sparklayer.io/help/pricing/managing-pricing.md#assign-a-price-list-to-customers). --- # Quantity pricing URL: https://docs.sparklayer.io/help/pricing/quantity-pricing Set up tiered quantity pricing and unit of measure pricing for boxes or pallets in SparkLayer, by CSV or in the Price editor, including rules for variants. > **Quick summary** > > - **Quantity pricing** (also called tiered pricing or price breaks) lowers the unit price as customers buy more, for example 1 unit at $14.99, 5 at $10.99 and 10 at $8.99. > - **Unit of measure pricing** prices set units such as boxes, cases or pallets, and works out the average unit price for the quantity ordered. > - Set both up with prices you upload: a `qty` column (and `unit_of_measure`) in your [CSV upload](https://docs.sparklayer.io/help/pricing/csv-upload.md), or in the [Price editor](https://docs.sparklayer.io/help/pricing/price-editor.md). An automatic pricing rule can't create them. > - Always include a price for a quantity of 1. Both features are available on every plan. ## How it works With quantity pricing, the **unit price** depends on the quantity the customer adds to their order. SparkLayer finds the tier the quantity falls into and uses that tier's price. If the customer also has discounts, SparkLayer then takes them off the unit price. For example: | Quantity | Unit price | | --- | --- | | 1 or more | $14.99 | | 5 or more | $10.99 | | 10 or more | $8.99 | Customers see the price breaks in the [Product Detail Interface](https://docs.sparklayer.io/help/storefront/interfaces/product-detail.md), as a table of **Qty**, **Price** and **Savings**. By default, the savings are worked out from the single unit price of the product or variant. To base them on the RRP (retail price) instead, see [How prices are shown](https://docs.sparklayer.io/help/pricing/pricing-display.md#base-savings-on-the-rrp). ## Set up quantity pricing Quantity pricing works with prices you upload, not with an automatic pricing rule. On an automatic price list, upload prices for the products that need quantity pricing. See [Price lists](https://docs.sparklayer.io/help/pricing/managing-pricing.md). 1. Prepare a CSV file with `sku`, `price` and `qty` columns. Add one row per price break, and always include a row for a quantity of `1`: ```csv sku,price,qty 123-abc,14.99,1 123-abc,10.99,5 ``` Here, SKU `123-abc` costs 14.99 each from 1 unit and 10.99 each from 5 units. 2. Go to **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app and click **Upload** next to the price list. 3. Choose the file, check the rows under **Check your upload**, then click **Import**. See [Upload prices by CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md) for the full steps. | Column | What it contains | Required | | --- | --- | --- | | `sku` | The product SKU as set up in your eCommerce platform or backend system. | Yes | | `price` | The unit price for the SKU at the quantity in the `qty` column. | Yes | | `qty` | The quantity from which this price applies. | No (defaults to 1) | You must include a unit price for a quantity of `1`, even if customers can't buy single units because you've set up minimum quantities or pack sizes. See [Quantity rules](https://docs.sparklayer.io/help/storefront/quantity-rules.md). To change quantity pricing for a single product, use the [Price editor](https://docs.sparklayer.io/help/pricing/price-editor.md): open the variant, then edit a price or click **Add a new price** to add another quantity break. ## Choose how variants are counted For products with variants (for example colour or size), you choose whether quantities are counted across all variants or per variant. | Behaviour | What happens | | --- | --- | | **Across all variants** (default) | Quantity pricing applies across every variant of the product. If a product comes in Small, Medium and Large and the price break starts at 5, a customer gets the lower price for any combination, such as 1 Small, 2 Medium and 3 Large. | | **Per variant** | Quantity pricing only counts the quantity of each variant on its own. For example, you can set quantity pricing that only applies to the Large size. | To count per variant, turn off **Tiered pricing across variants** at **Settings > Configurations > Pricing and cart** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Pricing and cart** in the Shopify app and save. The same switch is also at **Storefront > Options > Pricing and display** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Pricing and display** in the Shopify app; changing it in one place changes it in the other. ## Set up unit of measure pricing Unit of measure pricing lets customers order in set units such as boxes, cases or pallets. You set a unit price for each unit, and SparkLayer prices any quantity left over at the single unit price. It works like quantity pricing: customers buy more and pay less per unit. The difference is how the line total is worked out. SparkLayer splits the quantity across your units of measure, then adds up the line total. The unit price shown is the average across the total quantity. For example, a product sells as single units, in boxes of 7 and on pallets of 150. A customer orders 320 units: | Unit | Unit price | Units in the order | Line | | --- | --- | --- | --- | | Pallet (150 units) | $8.99 | 300 (2 pallets) | $8.99 × 300 = $2,697.00 | | Box (7 units) | $10.99 | 14 (2 boxes) | $10.99 × 14 = $153.86 | | Single unit | $14.99 | 6 | $14.99 × 6 = $89.94 | | **Total** | | **320** | **$2,940.80** | The unit price shown is $2,940.80 ÷ 320 = **$9.19**. ### Upload unit of measure prices 1. Prepare a CSV file with a `unit_of_measure` column as well as `sku`, `price` and `qty`. Set `qty` to the number of units in each unit of measure, and leave `unit_of_measure` blank for the single unit price: ```csv sku,price,qty,unit_of_measure 123-abc,14.99,1, 123-abc,10.99,7,box 123-abc,8.99,150,pallet ``` 2. Upload it to the price list from **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app. See [Upload prices by CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md). | Column | What it contains | Required | | --- | --- | --- | | `sku` | The product SKU as set up in your eCommerce platform or backend system. | Yes | | `price` | The unit price for the SKU at the quantity in the `qty` column. | Yes | | `qty` | The quantity for this price. For a unit of measure, the number of units it contains. | No (defaults to 1) | | `unit_of_measure` | The unit of measure the quantity belongs to. Use letters and numbers only, with underscores as separators, for example `box`, `pallet` or `pallet_box`. | No | As with quantity pricing, you must include a unit price for a quantity of `1`, even if customers can't buy single units. You can also set up unit of measure pricing in the [Price editor](https://docs.sparklayer.io/help/pricing/price-editor.md): add or edit a price, and enter the unit of measure and its unit price. ### How unit of measure pricing shows to customers The [Product Detail Interface](https://docs.sparklayer.io/help/storefront/interfaces/product-detail.md) shows the price for each unit, for example "1+", "7 (box)" and "150 (pallet)", and a breakdown of how the unit price has been calculated. The [My Cart Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) shows the same breakdown, so customers can see how the line total and unit price were worked out. ## Show a quantity pricing table SparkLayer shows your price breaks in the [Product Detail Interface](https://docs.sparklayer.io/help/storefront/interfaces/product-detail.md) by default. To show the table anywhere else on your product page, add a code snippet. See [Show the quantity pricing table](https://docs.sparklayer.io/help/pricing/pricing-display.md#show-the-quantity-pricing-table). ## Related quantity rules Quantity rules control how customers order, rather than what they pay. See [Quantity rules](https://docs.sparklayer.io/help/storefront/quantity-rules.md). To combine price breaks, pack sizes and discounts for bigger orders, follow [Run volume pricing and promotions for trade customers](https://docs.sparklayer.io/help/guides/volume-discounts.md). - **Pack sizes** (also called quantity increments): make customers add items in set packs, for example packs of 3 or 6. - **Minimum quantities** for a variant (for example products that come in colours), or for the parent product as a whole, across its variants. - **Maximum quantities** for a variant or for the parent product. ## For developers These changes are made in code, so they're usually done by your developer or agency. You don't need them to set up quantity pricing. ### Name and pluralise units of measure Language strings for each unit of measure let the storefront pluralise quantities in messages to customers (for example "1 box", "2 boxes"). Use the key you set for the unit of measure in your price list. Add the strings to your SparkLayer [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting): ```javascript title="Core Script" translations: { en: { "unit-of-measure.unit-type.box": "{uomQuantity, plural, =1 {box} other {boxes}}", "unit-of-measure.unit-type.pallet_box": "{uomQuantity, plural, =1 {pallet box} other {pallet boxes}}" } }, ``` See [Languages and international](https://docs.sparklayer.io/help/storefront/languages-and-international.md) for more on language strings that contain variables. ## FAQs **Can I use quantity pricing with an automatic price list?** Not from the automatic rule: quantity pricing needs prices you upload. Upload manual prices to the automatic price list for the products that need quantity pricing. See [Price lists](https://docs.sparklayer.io/help/pricing/managing-pricing.md). **Do I need a price for a single unit?** Yes. When you import a price list with quantity pricing, include a row for each SKU with a quantity of `1`, even if customers can't buy single units. --- # Discounts URL: https://docs.sparklayer.io/help/pricing/discounts Set up B2B discounts in SparkLayer on the Growth plan: money off orders, volume tiers, coupon codes, customer group limits, scheduling and other requirements. > **Quick summary** > > - SparkLayer discounts add promotions on top of your [price lists](https://docs.sparklayer.io/help/pricing/managing-pricing.md): an amount off an order, volume tiers (more off as the quantity goes up), free products and coupon codes. Manage them at **Pricing > Discounts** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/discounts)), or **SparkLayer Wholesale > Pricing > Discounts** in the Shopify app. > - A discount applies **automatically** when the cart meets its requirements, or when the customer enters a **coupon code**. Limit it by customer group, dates, order sub-total, number of items, uses per customer, excluded customers and currency. > - Discounts need the **Growth** plan or above, including the Growth trial. On Basic and Starter you can open the screens and fill in a discount, but saving it asks you to start Growth. See [Plan availability](#plan-availability). > - Use SparkLayer discounts instead of your platform's own: Shopify discounts, BigCommerce promotions and Wix discounts can't be used alongside SparkLayer. See [Compare platforms](https://docs.sparklayer.io/help/platforms/compare.md). Discounts sit on top of price lists, so you can run a promotion without changing anyone's prices. To try them as a customer, sign in to our [B2B demo store](https://demo.sparklayer.io/pages/b2b-login-register), add some products to your cart and use the coupon code `SAVE10`. New to SparkLayer? [Speak to our team](https://www.sparklayer.io/?demo#contact). ## How discounts work Every discount has three parts: - **A type and reward:** what the customer gets, such as 20% off the order or 5% off 24 or more units. - **Requirements:** who qualifies and when, such as a customer group, a date range, a minimum spend or a coupon code. - **How it's applied:** automatically, or when the customer enters a coupon code. How a discount is applied to an order: 1. **Customer builds a cart**: Signed in, with their B2B prices 2. **Requirements checked**: Group, dates, coupon, order limits 3. **Reward applied**: To the net sub-total, before tax and shipping 4. **Order placed**: With the discount details saved on the order | How it's applied | What happens | | --- | --- | | **Automatic** | SparkLayer applies the discount when the order meets the requirements you've set, for example spend over $1,000 and get $100 off. | | **Coupon code** | SparkLayer applies the discount when the customer enters a coupon code in the [My Cart Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md). See [Cart and checkout](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md) for what you can customise. | ### What a discount is calculated on An amount off an order comes off the order's **sub-total**, which is net of tax and excludes shipping. For example, if the sub-total is $200.00 and the discount is $100 off, the cart shows "Discounts applied -$100". Tax is calculated in the final step of checkout. Discounts apply whichever payment method the customer chooses. On Shopify, to give a discount for one payment method, add a [payment method rule](https://docs.sparklayer.io/help/ordering/payment-method-rules.md). Those discounts apply after all your other discounts, whatever their **Can be used with** setting. ### How many discounts apply to an order By default, only one discount applies to an order. To let a discount be used alongside others, turn on its **Compatible discounts** requirement (see [Allow discounts to be combined](#allow-discounts-to-be-combined)). ## Discount types Each discount has one type, which decides the reward the customer gets. | Type | What it gives | | --- | --- | | **Give an amount off an order** | A percentage or fixed amount off the order's sub-total. This is the default. | | **Give a free product** | Adds a product to the order at no cost. | | **Give a percentage off products** | A percentage off specific products. | | **Give a shipping reward** | Money off shipping, or a fixed shipping charge. Only available if you use SparkLayer [shipping rules](https://docs.sparklayer.io/help/ordering/shipping-rules.md). | | **Advanced requirements and rewards** | For example volume tiers: more off as the quantity goes up. | | **Advanced free products** | One or more free products when the cart meets requirements you set, such as "buy one get one free". | ## Create a discount 1. Go to **Pricing > Discounts** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/discounts)), or **SparkLayer Wholesale > Pricing > Discounts** in the Shopify app and click **Create discount**, or click a ready-made discount to start from it. 2. Under **Summary**, leave **Enable this discount** on. 3. Enter a **Discount internal name** (for you), a **Discount handle (or ID)** (a short unique ID, such as `vip-20-off`) and a **Discount public name** (what customers see). See [Summary settings](#summary-settings). 4. Under **Type**, choose a discount type. The **Reward** card changes to match. 5. Set up the reward. See the section for your type below. 6. Under **Requirements**, tick any requirements you need, such as **Coupon codes** or **Customer groups**. See [Limit who can use a discount and when](#limit-who-can-use-a-discount-and-when). 7. Click **Save** in the save bar. To change a discount later, click its name at **Pricing > Discounts** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/discounts)), or **SparkLayer Wholesale > Pricing > Discounts** in the Shopify app, make your changes and click **Save**. ### Summary settings | Setting | What it does | | --- | --- | | **Enable this discount** | Turns the discount on or off. A discount is only active when it's enabled and today falls within its schedule. | | **Discount internal name** | A name for your own use. Only visible to you. | | **Discount handle (or ID)** | Identifies the discount when an order is placed. It appears in the order's discount data (`discountSlugs`). | | **Discount public name** | Shown to buyers when the discount applies to their order, for example "20% off your first B2B order". | To show customers a longer description under the public name, your developer can add one: see [Show customers a description](#show-customers-a-description). ## Give an amount off an order 1. Create a discount and choose **Give an amount off an order** under **Type**. 2. Under **Reward**, choose **Percentage discount (e.g. 10% off)** or **Fixed amount discount (e.g. US$100 off)**. 3. Enter the **Percentage off** (between 1 and 100) or the **Amount off**. The reward is applied to the order's sub-total, excluding tax and shipping ("net"). For a fixed amount, check the [currency requirement](#set-the-discount-currency). ## Set up volume tiers Volume tiers give more off as the quantity goes up, for example 5% off 24 or more units and 10% off 96 or more. 1. Create a discount and choose **Advanced requirements and rewards** under **Type**. 2. Under **Reward**, set the first tier's **Minimum units** and **Discount** percentage. It starts at 24+ units and 5%. 3. Click **Add tier** for each further tier, and use the bin icon to remove one. On the **Discounts** screen, these show with the type **Volume tiers**. To combine them with quantity pricing and pack sizes, follow [Run volume pricing and promotions for trade customers](https://docs.sparklayer.io/help/guides/volume-discounts.md). ## Give a free product, products off or a shipping reward Set up these types the same way: choose the type under **Type**, then set up the reward. | Type | What you set | | --- | --- | | **Give a free product** | The SKU of the product to add to the cart at no cost. It must be a valid SKU, and a different product from those already in the order. It also needs a price on the customer's price lists, or it shows as Unavailable. | | **Give a percentage off products** | The SKUs to discount, and the percentage off each. | | **Give a shipping reward** | The shipping method, and a percentage off, a fixed amount off, or a fixed charge. The amount is net of tax. | | **Advanced free products** | The requirements the cart must meet, the free products and quantities, and whether they're added once, every time the requirements are met, or up to a limit. | ## Restrict a discount to certain products Use a rule for a collection discount, or a discount on a product range or category. Under **Rules**, click **New rule** to add the products, collections or tags the cart must include before the discount applies. For a tag-based discount, give every product in the range the same tag in your store, such as `dog-toy`, and choose that tag in the rule. This works for a range that isn't a collection. ## Limit who can use a discount and when Requirements decide who gets a discount and when. A discount only applies when every requirement you've turned on is met. The **Requirements** card lists 9 requirements, with a count of how many are on. Tick a requirement to turn it on, then set it up underneath. | Requirement | Description on screen | Settings | | --- | --- | --- | | **Coupon codes** | Require a coupon code to use this discount | **Add a coupon code**, then **Add coupon** | | **Customer groups** | Limit discount to specific customer groups | The **Customer groups** to include | | **Scheduling** | Limit the discount to a specific date range | **Start date** and **Expiry date (optional)** | | **Order sub-total limits** | Require a minimum or maximum order sub-total | **Minimum order sub-total** and **Maximum order sub-total** | | **Order item limits** | Require a minimum or maximum number of items | **How to count the order**, **Require at least** and **Up to** | | **Usage limits** | Limit number of uses per customer | **Maximum uses per customer** | | **Exclude customers** | Exclude specific customers from this discount | The **Excluded customers** | | **Compatible discounts** | Let this discount be used alongside others | The discounts it **Can be used with** | | **Currency** | The buyer must be ordering in a specific currency | The **Currency** | ### Require a coupon code A coupon code makes a discount manual: it isn't applied until the customer enters the code. 1. Tick **Coupon codes**. 2. Enter the code under **Add a coupon code** and click **Add coupon**. Add more codes the same way. Click **×** on a code to remove it. With a coupon, the customer clicks **Discounts & codes** in the cart or the **Order Summary**, enters the code and clicks **Apply** (see [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md#discounts-and-promotions)). When the order reaches your store, the coupon codes used are in the order's additional notes (see [See discount details on an order](#see-discount-details-on-an-order)). - Coupon codes are saved in capitals. For example, `Code-Abc` is saved as `CODE-ABC`. - You can save several coupon codes against one discount, for example `CODE-ABC` and `CODE-123`, to promote the same discount in different places. - The [My Cart Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) accepts up to 3 coupon codes per order. If a customer has 3 coupons applied and adds a 4th, the 4th isn't applied. ### Limit a discount to customer groups By default, a discount applies to all customers. To restrict it to some [customer groups](https://docs.sparklayer.io/help/customers/customer-groups.md): 1. Tick **Customer groups**. 2. Tick one or more groups. Only these groups get the discount. To apply the discount to everyone again, untick **Customer groups**. ### Schedule a discount 1. Tick **Scheduling**. 2. Choose a **Start date** and, if the discount should end, an **Expiry date (optional)**, each with a time. - The dates use the time zone shown under them, for example Europe/London. For customers in another time zone, adjust the dates and times to match. - A time of `00:00` means the start of the selected date, and `23:59` the end. ### Set minimum or maximum order requirements **Order sub-total limits** set the spend needed to qualify, for example spend over $400 and get 5% off. 1. Tick **Order sub-total limits**. 2. Enter a **Minimum order sub-total**, a **Maximum order sub-total**, or both. The discount applies when the order's sub-total (net of tax and shipping) is between these amounts. A maximum of 100 covers orders up to 99.99. The amounts aren't converted between currencies. They're compared with the sub-total in the currency the customer orders in, even though the form shows your store's currency. A minimum of 5,000 means €5,000 for a customer on a EUR price list and 5,000 Kč for one on a CZK price list. If you sell in more than one currency, create one discount for each currency and limit each with [Currency](#set-the-discount-currency). To give more off bigger orders without the discounts overlapping, make the ranges meet. For example, 1.5% off with a minimum of 5,000 and a maximum of 10,000, then 3.5% off with a minimum of 10,000. There's no setting to apply only the highest discount. **Order item limits** set how many items the order must contain. 1. Tick **Order item limits**. 2. Under **How to count the order**, choose an option (see below). 3. Enter **Require at least**, **Up to**, or both. | Option | What it counts | Example: 1 Red Shoe, 5 Blue Shoes, 4 Green Shoes | | --- | --- | --- | | **Quantity across all line items** | The total quantity of items across all products. | 10 | | **Number of line items** | The number of different items (lines) in the order. | 3 | ### Limit uses per customer 1. Tick **Usage limits**. 2. Enter the **Maximum uses per customer**, for example `1` for a one-time discount. Once a customer has used the discount this many times, it stops applying to their orders. ### Exclude customers 1. Tick **Exclude customers**. 2. Under **Excluded customers**, tick the customers who should never get this discount. Each is listed by name and company. ### Set the discount currency If you have price lists in several currencies, you can limit a discount to one of them. 1. Tick **Currency**. 2. Choose the **Currency**, for example **GBP**. The customer must be ordering in this currency for the discount to apply. ### Allow discounts to be combined 1. Tick **Compatible discounts**. 2. Under **Can be used with**, tick the discounts that can be used alongside this one in the same order. If you don't tick any, it can be combined with any discount. Once your discounts are live, you manage them from the **Discounts** screen. ## The Discounts screen **Pricing > Discounts** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/discounts)), or **SparkLayer Wholesale > Pricing > Discounts** in the Shopify app lists your discounts, with **Create discount** at the top. | Column | What it shows | | --- | --- | | **Discount** | The discount's name, with a short description underneath, such as "Code TRADE10: 10% off" or "24+ units: 5% off, 96+ units: 10% off". Click it to edit the discount. | | **Type** | **Order discount**, **Volume tiers** or **Coupon code**. | | **Customer groups** | The groups the discount is limited to, or **All**. | | **Status** | **Active** or **Paused**. | | **Uses** | How many times the discount has been used. | With no discounts yet, the screen offers two ready-made discounts you can edit before saving: **20% off with coupon code 20-OFF** and **$100 off orders over $1,000**. ## Pause or delete a discount To stop a discount for now, pause it; to remove it for good, delete it. Open the discount from **Pricing > Discounts** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/discounts)), or **SparkLayer Wholesale > Pricing > Discounts** in the Shopify app and use **More actions** at the top of the page: | Action | What happens | | --- | --- | | **Pause discount** | Stops the discount applying. Its status changes to **Paused**. Click **Turn on discount** to start it again. | | **Delete discount** | Buyers stop getting it straight away. Orders that already used it keep their discount. This can't be undone. Confirm with **Delete discount**. | ## See discount details on an order When a customer uses a discount, SparkLayer saves details of it on the order: - The coupon codes applied. - The handles (IDs) of the discounts applied. - The order's value before the discount. - The amount taken off by the discount. All amounts are in the currency the customer ordered in. **Shopify:** The details are in the **Additional details** section of the Shopify order. You'll see: - **B2B Discount Coupon Codes**: a comma-separated list of the coupon codes used, kept separate so you can see it at a glance. - **B2B Discount Data**: the rest of the discount data, including the SKUs ordered, net pricing and the internal ID of the discount. **Discount data for your developer** In the Shopify API, the details are in `note_attributes`, and the discount data is a JSON string. For example: ```json {"subTotalPreDiscount":{"net":"10.00"},"subTotalDiscount":{"net":"5.00"},"lineItemDiscounts":[{"preDiscount":{"net":"10.00"},"discount":{"net":"5.00"},"sku":"t-shirt","itemKey":"73199196ee530866c9a5db11f50c1442"}],"discountSlugs":["50-off"]} ``` To read this data with code, use the Shopify API (see the [Shopify Order API reference](https://shopify.dev/docs/api/admin-rest/latest/resources/order)). **BigCommerce:** The details are in the **Staff Notes** of the BigCommerce order. SparkLayer adds two lines to the notes of each order with a discount: - **B2B Discount Coupon Codes**: a comma-separated list of the coupon codes used, kept separate so you can see it at a glance. - **B2B Discount Data**: the rest of the discount data, as a JSON string. To see them, go to **Orders** in your BigCommerce admin, click the three dots under **Action** next to the order, then click **View notes**. To read this data with code, use the BigCommerce API (see the [BigCommerce Orders API reference](https://developer.bigcommerce.com/docs/rest-management/orders)). **Other platforms:** See the [SparkLayer developer docs](https://docs.sparklayer.io/developers.md) for how discount data is stored. ## Report on discount usage SparkLayer doesn't have built-in reporting on discount usage. **Shopify only:** On Shopify, use [Shopify Flow](https://apps.shopify.com/flow), Shopify's automation tool, to tag orders that use a discount and then report on those tags. Download our [example Shopify flow](https://cdn.shopify.com/s/files/1/0612/7602/9065/files/Tag_B2B_order_with_discount_if_used.flow?v=1723118334) and edit it to match your discounts. It works like this: 1. **An order is created** by the customer (for example a draft order). The flow starts on **Draft order created**. 2. **The flow checks for a discount** by looking at the **B2B Discount Data** field on the order (shown under **Additional details** in Shopify). It checks that a custom attribute key equals "B2B Discount Data" **and** its value includes a specific discount ID from `discountSlugs`, for example `free-product-test`. 3. **The flow tags the order**, for example with `b2b-free-product-test`, using **Add draft order tags**. 4. **You report on the tag**: filter the [Orders section](https://admin.shopify.com/store/orders?tag=b2b-discount-id) by the tag, or use the [Analytics section](https://admin.shopify.com/store/dashboards) in Shopify. To find a discount's ID, edit the discount in SparkLayer and look at **Discount handle (or ID)**. ## Limitations | Item | Limitation | | --- | --- | | **Combining discounts** | By default, a customer can only apply one discount to an order. Use [Compatible discounts](#allow-discounts-to-be-combined) to let discounts be used together. | | **Payment-specific discounts** | You can't base a discount on the payment method, for example $10 off if the customer pays by card. | | **Discounts from a URL** | You can't apply a discount from a link, for example $100 off for visiting `mystore.com/?discount=ABC`. | | **Platform discounts** | Your platform's own discounts can't be used alongside SparkLayer (see [Compare platforms](https://docs.sparklayer.io/help/platforms/compare.md)). | ## Plan availability Discounts are part of the **Growth** plan and above, including the 14-day Growth trial. Every discount type and requirement is included. See [Plans and features](https://docs.sparklayer.io/help/plans-and-features.md) and [SparkLayer pricing](https://www.sparklayer.io/pricing/). On Basic and Starter: - The **Discounts** screen shows **B2B discounts are part of Growth**. Click **Try Growth free** to start a trial. - You can still open **Create discount** and fill it in. When you save, **Advanced discounts** opens: click **Try Growth free for 14 days** to start a trial and keep your discount, or **Book a 15-min demo**. See [Your plan and usage](https://docs.sparklayer.io/help/dashboard/plan-and-features.md) for how trials work. ## For developers These changes are made in your SparkLayer Core Script, so they're usually done by your developer or agency. You don't need them to set up or run discounts. ### Show customers a description A discount description can be shown to customers when a discount is applied to their order, under its public name. For example: "For this month only, all customers will get 20% off their first order!" Add a language string of `discount.[handle].description` to your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting), replacing `[handle]` with the discount's **Discount handle (or ID)**. See [Languages and international](https://docs.sparklayer.io/help/storefront/languages-and-international.md) for how language strings work. ```javascript title="Core Script" /* [handle] should be replaced with the discount's handle, shown in the discount's Summary card. */ translations: { en: { "discount.[handle].description": "Include a description here", } }, ``` ### Change the cart text To change the discount text customers see in the [My Cart Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md), such as the coupon field's placeholder or the success message, add these language strings to your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting) and edit the values. See [Languages and international](https://docs.sparklayer.io/help/storefront/languages-and-international.md). ```javascript title="Core Script" translations: { en: { "cart.checkout.coupons.apply": "Apply", "cart.checkout.coupons.input-placeholder": "Enter discount code here and click 'Apply'", "cart.checkout.coupons.not-found": "Discount code ''{couponCode}'' not found", "cart.checkout.coupons.already-applied": "Discount code ''{couponCode}'' already applied", "cart.checkout.coupons.successful-apply": "You've successfully added discount code ''{couponCode}''!", "cart.checkout.coupons.max-reached": "You can only add a maximum of 3 discount codes", "cart.checkout.discount.cta": "Enter a discount here or view discounts", "cart.checkout.discount.success-message": "Discounts have successfully been applied to your order", "cart.checkout.discount.totals-row-text": "Discounts Applied", "cart.checkout.discount.no-of-discounts-applied": "{numberOf} {numberOf, plural, =1 {discount applied} other {discounts applied}}" } }, ``` ## Troubleshooting and FAQs **I don't see the discount coupon box on the checkout** The coupon field ("Enter discount code here and click 'Apply'") only shows to customers when there's an active, enabled discount that uses a coupon code. Check your discounts at **Pricing > Discounts** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/discounts)), or **SparkLayer Wholesale > Pricing > Discounts** in the Shopify app: the discount's **Status** should be **Active**, with **Enable this discount** on and a coupon code added. **How do I see discount details on an order in my store?** When a customer uses a discount, details are saved on the order in your store (for example Shopify or BigCommerce). See [See discount details on an order](#see-discount-details-on-an-order). **Why wasn't a discount applied to an order?** Check that: - The discount is **Active**, not **Paused**, and **Enable this discount** is on. - Today falls within its **Scheduling** dates, if it has them. - The customer meets **every requirement** you've turned on: customer group, sub-total, items, usage and currency. - The customer isn't in the **Excluded customers** list. - The customer hasn't already applied another discount that it isn't **compatible** with. **Will my B2B customers get my Shopify discount codes?** No. Shopify discount codes and automatic discounts don't apply to orders placed through SparkLayer. Create the discounts you want B2B customers to get here, in SparkLayer. To keep a SparkLayer discount from particular customers, use the [Exclude customers](#exclude-customers) requirement. It's only available on SparkLayer discounts. **Why isn't my free shipping discount applying?** Check that: - The discount **names the shipping method** the customer chose. A shipping reward only applies to the methods it names. If you have a method for each region, select each one, or create one discount per region. - The customer is in one of the discount's **customer groups**, if you've limited it. - The order meets the **minimum order sub-total**. The threshold is in the currency of the customer's price list: a minimum of 500 means £500 for a customer whose price list is in GBP. To test it, [place a test order](https://docs.sparklayer.io/help/get-started/launching.md#place-a-test-order) as the customer. **Why can't I save a discount?** - On Basic or Starter, saving opens **Advanced discounts**, because discounts need the Growth plan. See [Plan availability](#plan-availability). - A message under a field tells you what's missing, such as "Give the discount an internal name", "Add a coupon code, or untick Coupon codes" or "Pick at least one customer group, or untick Customer groups". **Can I discount a whole collection or product range?** Yes. Add a rule under **Rules** with the collection, or with a tag that every product in the range shares. See [Restrict a discount to certain products](#restrict-a-discount-to-certain-products). For more off as the quantity goes up, use [volume tiers](#set-up-volume-tiers). **How should I inform my customers about discounts?** | Method | Details | | --- | --- | | **Email** | Send B2B customers emails about the discount codes, their benefits and how to use them. | | **Website banner** | Show a banner on your homepage or relevant pages announcing the discount codes. | | **Order confirmation** | Add a note to order confirmation emails or invoices reminding customers of codes for future orders. | | **Sales reps** | Make sure your sales team tells B2B customers about discount codes when they talk to them. | | **Printed materials** | Include discount codes in printed B2B marketing materials. | --- # How prices are shown URL: https://docs.sparklayer.io/help/pricing/pricing-display Control how B2B prices appear on your store: RRP (MSRP), quantity price break tables, savings, price labels, unit costs, RRP-only mode and tax-inclusive prices. > **Quick summary** > > - Change how prices appear to signed-in B2B customers: show an RRP (MSRP), price break tables and savings, tax-inclusive prices, custom price labels, a unit cost and an RRP-only mode. > - Without code: show an **RRP** by filling in a field (a metafield) on each product variant, show **quantity price breaks** (they appear automatically), and turn on **Tax-inclusive prices** at **Settings > Configurations > Pricing and cart** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Pricing and cart** in the Shopify app. Wix doesn't support metafields, so RRP and unit cost display aren't available on Wix. > - Savings and RRP options are switches at **Storefront > Options > Pricing and display** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Pricing and display** in the Shopify app: **Base savings on RRP**, **RRP toggle**, **Savings on price breaks** and **Round price break percentages**. > - Everything else is a change to your SparkLayer **Core Script** or your theme, so it's usually done by your developer or agency. See [Customise how prices look](#customise-how-prices-look). ## How it works Once your price lists are set up, SparkLayer's [frontend interfaces](https://docs.sparklayer.io/help/storefront/interfaces.md) show B2B prices on your store. You change what they show in 4 ways: | Method | Use it for | How | Who usually does it | | --- | --- | --- | --- | | **Metafields** | Data stored per product variant, such as an RRP or a pack size | Set on the product in your eCommerce platform. See [Shopify metafields and data mapping](https://docs.sparklayer.io/help/platforms/shopify/metafields.md). | You, in your store admin | | **Storefront options** | Switches for savings, the RRP toggle and price break percentages | Turn them on at **Storefront > Options > Pricing and display** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Pricing and display** in the Shopify app, then click **Save and publish**. See [Storefront options](https://docs.sparklayer.io/help/storefront/storefront-options.md). | You, in SparkLayer | | **Core Script settings** | Display options (in `display`) and text (in `translations`) | Add code to your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting). See [Languages and international](https://docs.sparklayer.io/help/storefront/languages-and-international.md) for changing text. | Your developer or agency | | **CSS** | Colours and styling | Add CSS overrides. See [Customising the design](https://docs.sparklayer.io/help/storefront/customising-design.md). | Your developer or agency | ## Show an RRP (MSRP) price Show the RRP (recommended retail price, also called MSRP) next to a customer's B2B price, so signed-in customers see what retail customers pay and how much they save. For example, a product page might show "£6.75" with "RRP: £29.99" beside it. Each variant row shows its own RRP under its price. Each variant's RRP is stored in a field called `rrp` (a metafield). SparkLayer adds the field for you, then you fill it in. > **Filling in RRPs for your whole catalogue?** > > Follow [Show RRPs to your trade customers](https://docs.sparklayer.io/help/guides/show-rrp.md). It copies your Shopify prices with a ready-made Shopify Flow, or fills in every variant from a spreadsheet, so you don't type RRPs product by product. To set an RRP on one product: 1. Set up the RRP field once. On Shopify, go to **Integrations > Platform > Metafields** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform > Metafields** in the Shopify app and click **Configure** next to **SparkLayer metafields**. On other platforms, see the field details below. 2. In the form, enter the RRP and its currency, for example `15.99` and `usd`. Add a row for each currency you sell in. It writes the value for you. 3. Click **Copy**, open the variant in your store admin, paste the value into the `rrp` field and save. The RRP is set on each variant, as a decimal amount such as `9.00` (not in pence or cents), with one entry per currency: `[{"value":9.00,"currency_code":"gbp"}]`. On a product with several variants, the RRP in the product summary is the RRP of the first variant, in your platform's variant order. It doesn't change when the customer picks another variant, and it can't show a range yet. Each variant's own RRP shows in the variant table. **Field details** | Setting | Value | | --- | --- | | **Custom data type** | Variants. On Shopify, at **Settings > Custom data > Variants** ([open in the Shopify admin](https://admin.shopify.com/settings/custom_data/productvariant/metafields)) | | **Metafield type** | `JSON` | | **Namespace** | `sparklayer` | | **Key** | `rrp` | | **Value** | `[{"value":15.99,"currency_code":"usd"}]`, where `value` is the retail price and `currency_code` is the currency code (for example `usd`, `gbp` or `eur`). For more currencies, add more entries: `[{"value":15.99,"currency_code":"usd"},{"value":10.99,"currency_code":"gbp"}]` | ## Show the quantity pricing table If you've set up [quantity pricing](https://docs.sparklayer.io/help/pricing/quantity-pricing.md), SparkLayer shows the price breaks in the [Product Detail Interface](https://docs.sparklayer.io/help/storefront/interfaces/product-detail.md) by default, as a table with **Qty**, **Price** and **Savings** columns. Customers also see a **Qty discount pricing** table, and the price per unit, when they add items to the [My Cart Interface](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md). To show an extra price breaks table anywhere on your product page, make a small change to your theme's product page code: **Theme code for your developer** Add this to the source code of your product pages: ```html ``` For minimum quantities, pack sizes and other quantity settings, see [Quantity rules](https://docs.sparklayer.io/help/storefront/quantity-rules.md). ## Show tax-inclusive prices Tax-inclusive price display shows your B2B prices with tax included, labelled "inc. tax" so buyers know what they're seeing. It's designed for markets where buyers expect gross prices, which is common in Australia and in trade sectors that sell to smaller businesses. > **Tax-inclusive display changes presentation only** > > Your prices are still stored, uploaded and charged net. The tax your buyer pays is still calculated by your store's checkout at the point of purchase, using the rules or third-party integration set up in your eCommerce platform. If your store's own prices include tax and you use automatic price lists, that's a different setting: see [If your store's prices include tax](https://docs.sparklayer.io/help/pricing/managing-pricing.md#tax-inclusive-prices). How it works: - **It shows gross prices** to buyers who think in tax-inclusive terms, without changing how you upload or charge for your pricing. - **It works per price list.** Turn it on for the price lists that need it and leave the rest showing net prices, so you can serve different markets from one store. - **It uses your own rate per product.** You supply a display tax rate per SKU, so reduced-rate and zero-rated products show correctly next to standard-rate ones. - **It labels prices.** Key pricing areas add an "inc. tax" label, so it's clear which basis a buyer is seeing. ### Turn on tax-inclusive display Buyers only see gross prices once all 3 parts are in place. 1. **Turn it on for your store.** Go to **Settings > Configurations > Pricing and cart** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Pricing and cart** in the Shopify app, turn on **Tax-inclusive prices** and click **Save**. 2. **Turn it on for each price list.** Each price list has its own **Tax Inclusive Display** setting. The setting only shows on manual price lists, because the rate comes from your CSV. Automatic price lists don't have it. Turn it on for the price lists whose customers should see gross prices. Customers on other price lists keep seeing net prices. 3. **Add a display tax rate to your products.** Add a `display_tax_rate` column to your [price CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md): the percentage used to work out the gross price from your net price, from 0 to 100. Use the same rate on every row for a SKU. For the columns and an example file, see [CSV columns](https://docs.sparklayer.io/help/pricing/csv-upload.md#csv-columns). ```csv sku,price,display_tax_rate ABC-123,10.00,20 ``` A product on a tax-inclusive price list with **no rate, or a rate of 0**, still shows the "inc. tax" label, at 0%. This is deliberate, so a zero-rated product can't be confused with one whose rate hasn't been uploaded yet. ### Where buyers see tax-inclusive prices Once it's on, gross prices and the "inc. tax" label appear at every step of buying. | Area | What buyers see | | --- | --- | | **Product pages and product cards** | The gross price, with the label next to key pricing information. The label isn't repeated for every price in pricing tables. Where a product has several prices, the "from" price follows whichever price applies. | | **Cart** | Each line shows its gross line total, and the cart subtotal and total show gross with the label. The shipping message reads "Prices include tax. Shipping costs calculated during checkout" instead of the standard net wording. | | **Checkout** | The order total on the checkout review step shows gross with the label. Minimum and maximum order value rules are checked against the gross total, so buyers are measured against the total they can see. | | **Order history** | In the customer's account area, order lines and the order total show on the same basis, so a past order looks the way the buyer bought it. | ### Limitations of tax-inclusive display Tax-inclusive display only suits stores with simple tax setups, where you can always provide a tax rate for each SKU on a tax-inclusive price list. Read these limits before you turn it on. | Limitation | What it means | | --- | --- | | **Your store's checkout decides the tax charged** | The display tax rate you upload is only used for display; the actual tax is calculated by your store's checkout. If the two differ, your buyer sees one figure in the cart and pays another. Keep your uploaded rates in line with your store's tax setup. | | **Tax-exempt customers always see net prices** | If a customer is marked as tax exempt, SparkLayer shows them net prices with no label, whatever the price list setting, because a gross price would be wrong for them. | | **Mixed carts show net totals** | If a cart has both tax-inclusive and tax-exclusive products, the cart totals show net and drop the label. Each line still shows on its own basis. A single gross total across both would understate the tax on the tax-exclusive lines. | | **Custom items and unpriced products affect cart totals** | Custom line items have no display tax rate. A cart containing a product with no price but a manually quoted price shows net totals. | | **Quoted prices are always net** | When a sales agent edits a quoted unit price, it's entered and stored net. The editor is labelled "(excluding tax)" when the prices around it are shown gross. | | **RRP prices are never adjusted for tax** | RRPs show exactly as you upload them. On a tax-inclusive price list, a gross B2B price sits next to a net RRP, and any savings percentage based on the RRP compares the two. If you show both, upload RRPs on the same basis as your display prices. | | **Display can vary within a product** | Variants of the same product can use different price lists, so one variant may be tax-inclusive and another not. Set up your price lists and customer groups so customers only see either tax-inclusive or tax-exclusive prices. | ## Show B2B prices in other apps Wishlist, quick view, search and upsell apps show your platform's own price: the retail price, with tax included if your store shows it that way. They don't know about SparkLayer, so they can't show B2B prices on their own. To show a B2B customer their price inside one of these apps, your developer embeds a SparkLayer interface in the app's template, if the app lets you edit it: | To show | Use | | --- | --- | | **The price only** | `spark-product-price` (and `spark-product-rrp` for the RRP). See [Product price](https://docs.sparklayer.io/help/storefront/interfaces/product-price.md). | | **The price with a quantity box and an add button** | `spark-product-card`, or `spark-product-card mode-quick-buy` for a quick buy row. See [Product card](https://docs.sparklayer.io/help/storefront/interfaces/product-card.md) and [quick buy mode](https://docs.sparklayer.io/help/storefront/product-display.md#turn-on-quick-buy-mode). | The app's own quantity selectors and add-to-cart buttons don't add to the SparkLayer cart, so hide them for B2B customers. If you'd like us to set this up for you, [contact our support team](https://docs.sparklayer.io/help/support.md). ## Discounts and promotions To show discounts and promotions in the cart, set them up in [Discounts](https://docs.sparklayer.io/help/pricing/discounts.md) (Growth plan). They apply automatically, or with a coupon code during checkout. ## Customise how prices look Change what the price labels say, how the RRP and savings look, and what shows when a product has no price. Several of these are switches at **Storefront > Options > Pricing and display** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Pricing and display** in the Shopify app, which need no code. The rest are made in your SparkLayer [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting), your CSS overrides or your theme's code, usually by your developer or agency. For how language strings (`translations`) work, see [Languages and international](https://docs.sparklayer.io/help/storefront/languages-and-international.md). ### Change the RRP label To change the "RRP" label, for example to "MSRP", add this to your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting): ```javascript title="Core Script" translations: { en: { "pdp.price.rrp": "MSRP: ", "product-card.price.rrp": "MSRP: ", "cart.price.rrp": "MSRP: ", } }, ``` ### Style the RRP To change how the RRP looks, for example to strike it through in red, add this CSS to your [CSS overrides](https://docs.sparklayer.io/help/storefront/customising-design.md) and adjust it as needed: ```html ``` ### Change how savings are shown You can change the **Savings** column in quantity pricing tables at **Storefront > Options > Pricing and display** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Pricing and display** in the Shopify app, then click **Save and publish**: | Switch | What it does | | --- | --- | | **Savings on price breaks** | Shows the amount saved next to each quantity break. On by default. | | **Round price break percentages** | Shows savings as whole-number percentages, for example 9% off instead of 9.45% off. On by default. | **The same settings in the Core Script** ```javascript title="Core Script" display: { roundPriceBreakPercentages: true, showPriceBreakSavings: false, } ``` `showPriceBreakSavings: false` hides the savings. ### Base savings on the RRP By default, the savings in a quantity pricing table are calculated from the **single unit price** of the product or variant. For example, if the single unit price is $2.00 and the price drops to $1.00 for 5 or more, the savings show as `-50%`. To calculate savings from the product's **RRP** (retail price) instead, turn on **Base savings on RRP** at **Storefront > Options > Pricing and display** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Pricing and display** in the Shopify app and click **Save and publish**. For example, with an RRP of $21.95 and a price of $16.66, the savings show as -24% from the first price break. **The same setting in the Core Script** ```javascript title="Core Script" display: { savingsUseRrp: true, } ``` ### Change the price labels You can add text before the price on a product page, such as "Your price", so it reads "Your Price, from: £2.91". Add this to your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting): ```javascript title="Core Script" translations: { en: { "pdp.price.from-prefix": "Your Price:" } }, ``` You can also change any of the default pricing text with these language strings: ```javascript title="Core Script" translations: { en: { "pdp.price.from": "From:", "pdp.price.rrp": "RRP:", "pdp.price.pack-size": "Pack ({packSize}): {price}", "product-card.price.from": "From:", "product-card.price.rrp": "RRP:" } }, ``` ### Show a unit cost price If you sell products made up of several units, you can show a unit price on your product pages, worked out automatically. For example, a product sold in packs of 10 could show "This product comes in packs of 10. Unit cost $0.31". Or, for products sold by weight, you could show a price per kg. To set it up, add a `case_size` metafield to each product variant. **Shopify:** See [Shopify metafields and data mapping](https://docs.sparklayer.io/help/platforms/shopify/metafields.md) for how to set up metafields on Shopify. | Setting | Value | | --- | --- | | **Custom data type** | Variants, at **Settings > Custom data > Variants** ([open in the Shopify admin](https://admin.shopify.com/settings/custom_data/productvariant/metafields)) | | **Metafield type** | `integer` | | **Namespace** | `sparklayer` | | **Key** | `case_size` | | **Value** | A whole number, for example `1`, `2` or `3` | Then add this code to your product page template and change it as needed: **View code sample** ```javascript {%- if customer.metafields.sparklayer.authentication -%} {% if product.metafields.sparklayer.case_size %} {% endif %} {% endif %} ``` **Use Shopify's unit price feature** If you use Shopify's built-in unit price (in the product's pricing, tick **Show unit price for this product** and set the **Total product measurement** and **Base measure**, such as 400 g and 1 kg), you can show the reference unit, such as kg, lb or ml. In the code sample above, change `el.textContent` to: ```javascript el.textContent = `Unit price per {{ item.unit_price_measurement.reference_unit }}: ${formatter.format(priceData.fromPrice / Number(caseSize))}`; ``` To customise how this works further, we recommend working with a Shopify expert. **Other platforms:** | Setting | Value | | --- | --- | | **Custom data type** | Variant level (products) | | **Metafield type** | `integer` | | **Namespace** | `sparklayer` | | **Key** | `case_size` | | **Value** | A whole number, for example `1`, `2` or `3` | For more information, see the [SparkLayer developer docs](https://docs.sparklayer.io/developers.md). ### Change the "Unavailable" message When a product has no B2B price, the [Product Card Interface](https://docs.sparklayer.io/help/storefront/interfaces/product-card.md) and [Product Detail Interface](https://docs.sparklayer.io/help/storefront/interfaces/product-detail.md) show "Unavailable", so B2B customers know they can't buy it. To show a different message, such as "Price on application", add a translation override for each key below 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. No code is needed. For the full recipe, see [Show "price on application"](https://docs.sparklayer.io/help/pricing/managing-pricing.md#price-on-application). | Key | Default text | | --- | --- | | `pdp.messaging.un-sellable` | Unavailable | | `product-card.messaging.un-sellable` | Unavailable | | `product-card.messaging.select-option` | Unavailable, please select another option | 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) instead: ```javascript title="Core Script" translations: { en: { "pdp.messaging.un-sellable": "Unavailable", "product-card.messaging.un-sellable": "Unavailable", "product-card.messaging.select-option": "Unavailable, please select another option" } }, ``` ### Show RRP prices only If you take orders with customers in person, for example in a shop, you can make the SparkLayer [frontend interfaces](https://docs.sparklayer.io/help/storefront/interfaces.md) show only the RRP (MSRP) while browsing and adding items to an order. This hides your B2B prices from view. Use cases include: - In-store customer visits, where an order needs to be placed and the customer must only see retail (RRP) prices. - Sales teams placing orders on behalf of customers (for example on the road), where only retail (RRP) prices must be seen. This is for display only. The order is still created with the B2B prices of the signed-in customer. To turn it on for every B2B customer who signs in, turn on **RRP toggle** ("Buyers can switch between the RRP and their own prices.") at **Storefront > Options > Pricing and display** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Pricing and display** in the Shopify app and click **Save and publish**. Or add this to the `display` section of your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting): ```javascript title="Core Script" display: { showRrpToggle: true, } ``` **Shopify only:** To turn it on only for some customers, check their tags (Shopify Liquid): ```javascript title="Core Script" display: { {% for tag in customer.tags %} {% if tag == "b2b-group-1" %} showRrpToggle: true, {% elsif tag == "b2b-group-2" %} showRrpToggle: true, {% endif %} {% endfor %} } ``` ## FAQs **Does tax-inclusive display change the prices I upload or the amount my customer is charged?** No. Prices are stored and charged net exactly as before, and your checkout calculates tax as it always has. Only the figure shown on your store changes. **Can I show tax-inclusive prices to some customers and not others?** Yes. Tax-inclusive display is set per price list, so you can show gross prices to the customer groups on one price list and net prices to everyone else. **What happens if I don't upload a display tax rate?** Products on a tax-inclusive price list with no rate show their net price, still labelled "inc. tax", at an effective 0%. Upload rates for every product on a tax-inclusive price list so buyers see accurate gross prices. **Why does my cart total show net when my product prices show gross?** The cart most likely contains a mix of tax-inclusive and tax-exclusive products, a custom item, or a product with a quoted price and no uploaded price. In these cases the cart totals show net rather than a gross figure that would understate the tax due. Set up your price lists and customer groups so a customer sees only tax-inclusive or only tax-exclusive price lists, not a mixture. **Will my buyers see gross prices at card checkout?** The SparkLayer cart and checkout review show gross prices with the label. Once a buyer moves into your store platform's own checkout, that platform's tax display rules apply. **Why don't RRP or unit cost prices show on my Wix store?** **Wix only:** Both rely on product metafields, which can't be set up in Wix. See [Wix limitations](https://docs.sparklayer.io/help/platforms/wix/limitations.md). --- # Pricing FAQs URL: https://docs.sparklayer.io/help/pricing/faqs Answers to common SparkLayer pricing questions on automatic and manual price lists, tiered pricing, gross prices and currencies, plus diagnosing pricing issues. ## Setting up prices **Do I need product SKUs when uploading pricing?** Yes. SparkLayer matches prices to products by SKU. Without a unique SKU in your store (for example Shopify), a product can't show the right B2B price when customers sign in. **Why isn't my B2B pricing showing on my website?** Check that: - You've **imported a price list** at **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app and **assigned it to a customer group** at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app. - All your products have **unique SKUs**. - The **SKU exists** in your product catalogue. - The product's status in your store admin is **Active**. SparkLayer only imports prices for active products, not products in **Draft** status. Then follow the steps in [diagnosing pricing issues](#diagnosing-pricing-issues). **How do I show the gross price?** Turn on **Tax-inclusive prices** at **Settings > Configurations > Pricing and cart** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Pricing and cart** in the Shopify app. It shows gross prices, labelled "inc. tax", on the price lists you choose. Prices are still charged net, and tax is calculated at checkout. See [tax-inclusive price display](https://docs.sparklayer.io/help/pricing/pricing-display.md#show-tax-inclusive-prices). By default, SparkLayer shows prices net (excluding tax), whatever tax setting you use on your store. Customers see exactly the prices you upload. Some merchants use a workaround instead: 1. Set the customer as tax exempt in your eCommerce platform (for example Shopify), so their orders are zero-rated for tax. 2. In the price lists you upload to SparkLayer, enter gross amounts (even though they don't technically include tax). 3. Report on the tax amounts afterwards, for example in your accounting system. **How do I show RRP (MSRP) pricing?** Add an `rrp` metafield to your product variants. See [Show an RRP (MSRP) price](https://docs.sparklayer.io/help/pricing/pricing-display.md#show-an-rrp-msrp-price). **How do I set up and manage several currencies?** SparkLayer supports several currencies by default: create a price list in each currency and assign it to the right customers. On Shopify, see [Shopify Markets and currencies](https://docs.sparklayer.io/help/platforms/shopify/markets-and-currencies.md). **Can I set B2B prices higher than my retail (DTC) prices?** Yes. Use a percentage increase on an automatic price list, or upload the higher prices. **Can I set up different automatic pricing rules based on product collections?** Not directly: SparkLayer has no built-in way to apply B2B pricing to selected collections (or categories). As a workaround: 1. Create a [separate price list](https://docs.sparklayer.io/help/pricing/managing-pricing.md#create-a-price-list) for each collection you need (Collection A, Collection B and so on). 2. At **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app, assign the price lists each customer group should see. You can assign **several** price lists to a customer group. ## Automatic price lists **How do I set up automatic price lists (based on my retail prices with a discount)?** Create a price list and tick **Enable automatic pricing**, choose your store's prices as the pricing source and apply a percentage variation. See [Set up automatic pricing](https://docs.sparklayer.io/help/pricing/managing-pricing.md#set-up-automatic-pricing). **How can I override pricing for some products if I'm using an automatic price list?** Set exact prices for those products on the automatic list. This lets you automate your pricing and still set specific prices for some products. - **For one product:** in the **Pricing > Price editor** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/editor)), or **SparkLayer Wholesale > Pricing > Price editor** in the Shopify app, open the variant and click **Override for this SKU** on the list's card. See [Override an automatic price for one SKU](https://docs.sparklayer.io/help/pricing/price-editor.md#override-an-automatic-price-for-one-sku). - **For many products:** at **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app, click **Upload** next to your automatic price list and upload a CSV file with the prices you want to set. See [Upload prices by CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md). The list's **Type** then shows how many SKUs you've set, for example **Automatic + 12 SKU**. **If I change a price in my store, how quickly do automatic price lists update?** Straight away. Price changes in your platform update your automatic price lists instantly. ## Manual price lists **How do I remove a product's price from a manual price list?** | To remove | Do this | | --- | --- | | **Some prices for one product** | In the **Pricing > Price editor** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/editor)), or **SparkLayer Wholesale > Pricing > Price editor** in the Shopify app, search for the product, open the variant and click **Remove** next to the prices you want to delete. | | **Prices for several SKUs** | Clear the price list (below), then upload a CSV file with only the prices you want to keep. A blank price in a CSV file doesn't remove a price. | | **Every price for every product** | Open the **⋯** menu next to the price list, click **Clear**, then **Clear prices**. | **How do I clear (empty) a manual price list?** At **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app, open the **⋯** menu next to the price list, click **Clear**, then **Clear prices**. This removes every SKU price uploaded to the list. On an automatic list, the automatic rule stays. **How do I see prices I’ve already uploaded?** - Download the price list as a CSV file: at **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app, open the **⋯** menu next to the price list and click **Download CSV**. - Search for a product in the [Price editor](https://docs.sparklayer.io/help/pricing/price-editor.md) and open the variant to see its price on every list. - Sign in to your store as a B2B customer and view the product page. See [Test as a B2B customer](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#test-as-a-b2b-customer) to make sure you're signed in correctly. ## Assigning prices to customers **Can I assign several price lists to one customer group or customer?** Yes. At **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app, click the group's name and find **Price lists** (click **+ Override** if it's under **Inherited rules**). Click **Add price list** to add another, then click **Save** in the save bar. See [Assign a price list to customers](https://docs.sparklayer.io/help/pricing/managing-pricing.md#assign-a-price-list-to-customers). If a SKU is in more than one of the price lists, the first list it's in wins: see [Which price list wins](https://docs.sparklayer.io/help/pricing/managing-pricing.md#price-list-order). To give a single customer several price lists, see [Prices for one customer](https://docs.sparklayer.io/help/pricing/customer-pricing.md). **Which price wins when a product is in several price lists?** The first price list, in the order shown on the customer group, that contains the SKU. See [Which price list wins](https://docs.sparklayer.io/help/pricing/managing-pricing.md#price-list-order). **How do I assign a price list to a specific customer?** Add the price list's handle to the customer's price lists field (the `price_lists` metafield) on their record in your store admin. The customer then sees that price list instead of their customer group's. See [Give a customer their own price lists](https://docs.sparklayer.io/help/pricing/customer-pricing.md#give-a-customer-their-own-price-lists). To give a whole company its own prices, choose a **Price list** on the [company page](https://docs.sparklayer.io/help/customers/companies.md#prices-and-rules) instead. ## Quantity pricing **How do I set up quantity (tiered) pricing?** Add a `qty` column to your price list CSV, with a row for each price break. See [Quantity pricing](https://docs.sparklayer.io/help/pricing/quantity-pricing.md). **Do I need a price for a single unit if I use quantity pricing?** Yes. When you import a price list with tiered pricing, include a price for a single unit for every SKU. For example: ```csv sku,price,qty 123-abc,14.99,1 123-abc,10.99,5 ``` ## Discounts **How do I set up coupon codes for checkout?** Create a discount and require a coupon code, for example a code that gives 10% off the order. Discounts need the Growth plan. See [Require a coupon code](https://docs.sparklayer.io/help/pricing/discounts.md#require-a-coupon-code). **How do I discount a collection or product range?** Add a rule to the discount: under **Rules**, click **New rule** and choose the products, collections or tags the cart must include. See [Restrict a discount to certain products](https://docs.sparklayer.io/help/pricing/discounts.md#restrict-a-discount-to-certain-products). For more off as the quantity goes up, use [volume tiers](https://docs.sparklayer.io/help/pricing/discounts.md#set-up-volume-tiers). Without discounts, there's a workaround: 1. Create a new product in your catalogue with a variant for each product you want to include in the offer. 2. Set a [minimum product quantity](https://docs.sparklayer.io/help/storefront/quantity-rules.md), which makes the customer order at least a set number of the product (for example 3). 3. Use [quantity pricing](https://docs.sparklayer.io/help/pricing/quantity-pricing.md) to set the discounted rates (for example buy 3 and the price is 10% lower). 4. In Shopify, hide these products from retail customers by not adding them to a collection. **How do I set up discounts based on an order total?** Use order sub-total limits or order item limits, so a discount applies once the order total or the number of items reaches a threshold. See [Set minimum or maximum order requirements](https://docs.sparklayer.io/help/pricing/discounts.md#set-minimum-or-maximum-order-requirements). ## Diagnosing pricing issues If prices still aren't right after the checks above, find where the price is missing. To check whether a product has prices on a price list: 1. Go to the **Pricing > Price editor** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/editor)), or **SparkLayer Wholesale > Pricing > Price editor** in the Shopify app and search for the product's name or SKU. 2. Open the variant. 3. Check its card for each price list. A manual list without a price for the SKU means customers on that list won't see a price from it. To check that SparkLayer has the product at all, use **Product data lookup** at **Pricing > Products** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/products)), or **SparkLayer Wholesale > Integrations > Product sync** in the Shopify app. See [Product and customer sync](https://docs.sparklayer.io/help/integrations/data-sync.md). If you're using the [SparkLayer API](https://docs.sparklayer.io/developers/api.md), your developer can also check the price data there. For other common problems, see [Troubleshooting](https://docs.sparklayer.io/help/troubleshooting.md). --- # Customers and companies URL: https://docs.sparklayer.io/help/customers How companies, their locations, the people who buy for them and customer groups fit together in SparkLayer, and where to manage each one in the app. > **Quick summary** > > - The > **Companies** > area is where you manage who buys from you and on what terms. Open it at > **Companies** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/companies)), or **SparkLayer Wholesale > Companies** in the Shopify app > . It has three screens: > **Companies** > , > **Customers** > and customer groups. > - A **company** is a business you sell to. It can be split into **locations**, such as stores or regions. A **customer** is a person who signs in to your store and orders, on their own or for a company. > - A **customer group** sets prices (through its price lists), payment methods and order rules. Every B2B customer is in one. The **Base customer group** covers everyone else. > - On Shopify, companies and locations are your Shopify B2B companies, kept in sync both ways. Customers and customer groups work on every platform.## How it fits togetherSparkLayer uses four building blocks: - **Company**: a business you sell to, such as a shop chain or a distributor. You give it a customer group, an optional price list, pay later and the sales agents who look after it. - **Location**: part of a company, such as a store, a region or a warehouse. Locations can sit inside each other. Each one uses the settings of the level above unless you change them. - **Customer**: a person who signs in to your store and orders. A customer can belong to a company and be added to some of its locations. - **Customer group**: the rules a set of customers buy on: their price lists, payment methods and order limits.A company holds locations, and people are added to the locations they order for:Who belongs to what: 1. **Company**: The business. It's in a customer group, and can have its own price list and pay later setting 2. **Locations**: Stores or regions inside the company. Each uses the company's settings unless it sets its own 3. **People**: The customers who order. Each person is added to the locations they order for, as a Buyer, Approver or ManagerA customer doesn't have to belong to a company. Someone who buys for themselves, or a store that doesn't use companies, gets their customer group's settings.## Where a buyer's prices come fromA buyer's prices come from a customer group and its price lists:Where a buyer's prices come from: 1. **Customer group**: The customer's group, or their company's group if they're in a company 2. **Price list**: The group's price lists, unless the company, the location or the customer has a price list of its own 3. **Buyer signs in**: They see those prices, the group's payment methods and its order rules## What overrides whatEach setting starts broad, and you can replace it with a more specific one. The most specific setting wins.| What | Starts from | Replaced by | | --- | --- | --- | | **Prices** | The [customer group's price lists](https://docs.sparklayer.io/help/customers/customer-groups.md#assign-price-lists). | A **Price list** on the [company](https://docs.sparklayer.io/help/customers/companies.md#prices-and-rules), then on a [location](https://docs.sparklayer.io/help/customers/company-locations.md#prices-and-rules). For one person, use [customer pricing](https://docs.sparklayer.io/help/pricing/customer-pricing.md). | | **Payment methods and order rules** | The [customer group](https://docs.sparklayer.io/help/customers/customer-groups.md#what-a-customer-group-controls). Each group follows the Base customer group until you override a rule. | A different **Customer group** on the company, or on a location. | | **Pay later** | The [company](https://docs.sparklayer.io/help/customers/companies.md#paying). | One of its [locations](https://docs.sparklayer.io/help/customers/company-locations.md#paying). | | **Sales agents who look after them** | The company. | One of its locations. | | **Who orders for a business** | Never inherited. | Each person is added to the exact [locations](https://docs.sparklayer.io/help/customers/company-locations.md#people-and-location-roles) they order for, as a **Buyer**, **Approver** or **Manager**. |Which sales agents can order for a customer is also set on the sales agent's page, where you tick the [customer groups they can see](https://docs.sparklayer.io/help/sales-reps.md#restrict-which-customers-a-sales-agent-can-see).### How a buyer's price is chosenSparkLayer uses the most specific price list that applies, in this order:1) **The customer's own price lists**, set with [customer pricing](https://docs.sparklayer.io/help/pricing/customer-pricing.md). 2) **Their location's price list** , if it or a location above it has one. It applies to that location and the locations inside it. 3) **Their company's price list** , if it has one. It applies to everyone at the company. 4) **Their customer group's price lists.** That's the company's customer group if it has one, otherwise the group from the customer's own tag. A group without price lists uses the Base customer group's. If a product is in several of the group's lists, the first list it's in wins.With no price list at any level, the buyer sees your standard prices.Rules, such as payment methods and order limits, follow the same order: the location's customer group, then the company's customer group, then the group from the customer's own tag.## Where to find itThe two versions of the app have the same screens:* **SparkLayer Dashboard**: the **Companies** group in the sidebar, with **Companies**, **Customers** and **Groups**. * **Shopify app** (**SparkLayer Wholesale** in Shopify admin): **Companies**, with the tabs **Companies**, **Customers** and **Customer groups**.| To do this | Go to | | --- | --- | | See the businesses you sell to, and set their pricing, pay later, people and sales agents | **Companies** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/companies)), or **SparkLayer Wholesale > Companies** in the Shopify app | | Split a company into locations and choose who orders for each | **Companies > Manage locations** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/companies)), or **SparkLayer Wholesale > Companies > Manage locations** in the Shopify app | | Find a customer, invite a buyer and check customer sync errors | **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app | | Set price lists, payment methods and order rules for groups of customers | **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app | | Make a customer a sales agent and choose who they look after | **Sales Agents > Agents** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/v2/customers/agents)), or **SparkLayer Wholesale > Sales agents** in the Shopify app | | Turn company users and company locations on or off | **Settings > Configurations > Ordering** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Ordering** in the Shopify app | | Turn on messages on orders and quotes | **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 |## Get your first buyer ordering1) [Create a price list](https://docs.sparklayer.io/help/pricing/managing-pricing.md#create-a-price-list) at **Pricing > Price lists** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/lists)), or **SparkLayer Wholesale > Pricing > Price lists** in the Shopify app. 2) [Give it to a customer group](https://docs.sparklayer.io/help/customers/customer-groups.md#assign-price-lists) at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app. Use the Base customer group, or a [new group](https://docs.sparklayer.io/help/customers/customer-groups.md#create-a-customer-group) with its own prices. 3) [Add a buyer to the group](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md) in your platform (on Shopify, with a tag), or [invite a buyer](https://docs.sparklayer.io/help/customers/invite-buyers.md) from **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app and choose their customer group. On Shopify, buyers can also [apply for a trade account](https://docs.sparklayer.io/help/guides/approve-trade-applications.md) with a SparkLayer form, for you to approve into a group. 4) [Place a test order](https://docs.sparklayer.io/help/get-started/launching.md#place-a-test-order) as a buyer to check their prices and checkout.**More detail** - [Setup](https://docs.sparklayer.io/help/get-started.md) walks you through the same steps, and ticks each one off as you go. For the same steps as one guide, see [Set up wholesale prices for your trade customers](https://docs.sparklayer.io/help/guides/set-up-wholesale-prices.md). - Already have trade customers in Shopify? See [Move your existing wholesale customers onto SparkLayer](https://docs.sparklayer.io/help/guides/move-existing-customers.md). - To give a business its own terms, [create a company](https://docs.sparklayer.io/help/customers/companies.md#create-a-company) and choose its customer group and price list.## Key terms| Term | Meaning | | --- | --- | | [B2B customer](https://docs.sparklayer.io/help/glossary.md#b2b-customer) | A customer who sees your B2B prices and ordering rules when they sign in. | | [Company](https://docs.sparklayer.io/help/customers/companies.md) | A business you sell to. On Shopify, a Shopify B2B company. | | [Company location](https://docs.sparklayer.io/help/customers/company-locations.md) | A store, region or site of a company. Locations nest, and inherit from the level above. | | [Location role](https://docs.sparklayer.io/help/customers/company-locations.md#people-and-location-roles) | What a person can do at a location: **Buyer**, **Approver** or **Manager**. | | [Customer group](https://docs.sparklayer.io/help/customers/customer-groups.md) | The rules shared by a set of B2B customers. Every store has a **Base customer group**. | | [Company user](https://docs.sparklayer.io/help/customers/company-users.md) | A colleague a customer invites to share their account, with a **Standard** or **Limited** role. | | [Sales agent](https://docs.sparklayer.io/help/sales-reps.md) | A member of your team who orders on behalf of customers. |## In this section- [Companies](https://docs.sparklayer.io/help/customers/companies.md): The businesses you sell to: their pricing, pay later, people and sales agents - [Company locations](https://docs.sparklayer.io/help/customers/company-locations.md): Split a company into stores or regions, and choose who orders for each - [Find and manage customers](https://docs.sparklayer.io/help/customers/managing-customers.md): Find a customer, check what they'll see and fix sync errors - [Invite a buyer](https://docs.sparklayer.io/help/customers/invite-buyers.md): Send a buyer an invite to create their trade account - [Customer groups](https://docs.sparklayer.io/help/customers/customer-groups.md): Set price lists, payment methods and order rules for groups of customers - [Add customers to a group](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md): Tag customers into the right group, check they've synced and test as one - [Company users](https://docs.sparklayer.io/help/customers/company-users.md): Let customers invite colleagues and approve each other's orders - [Customise My Account](https://docs.sparklayer.io/help/customers/account-and-addresses.md): Customise the My Account area, addresses, order statuses and redirects - [Order timeline and messages](https://docs.sparklayer.io/help/customers/timeline.md): Message customers and keep internal notes on orders and quotes --- # Companies URL: https://docs.sparklayer.io/help/customers/companies Applies to: Shopify See the businesses you sell to and set each company's customer group, price list, pay later, people and sales agents, synced with your Shopify B2B companies. > **Companies are in early access.** Request it for your store. [Request early access](mailto:product@sparklayer.io?subject=Early%20access%20to%20Companies). > **Quick summary** > > - A company is a business you sell to. Set its terms once, and everyone who buys for it orders on them. Find your companies at **Companies** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/companies)), or **SparkLayer Wholesale > Companies** in the Shopify app. Companies are on every plan. > - Companies are your Shopify B2B companies and locations, kept in sync both ways. Shopify holds who they are. SparkLayer adds what they buy at: customer group, price list, payment terms, sales agents and ordering rules. > - On a company's page, you set its **Customer group**, an optional **Price list**, **Let them pay later**, its **Main contact** and **Admins**, the **Sales agents who look after them** and its **IDs in other systems**. > - Big companies can be split into [locations](https://docs.sparklayer.io/help/customers/company-locations.md), such as stores or regions. Each location uses the company's settings unless you change them. ## How it works A company groups the people who buy for the same business. Everyone at the company orders at its prices and payment terms. The sales agents you choose can order for them. The company itself lives in Shopify B2B, at **Customers > Companies** ([open in the Shopify admin](https://admin.shopify.com/companies)). SparkLayer reads your companies, their locations and their contacts, and stores its own settings against each one. | Kept in | What it holds | | --- | --- | | **Shopify B2B** | Who they are: the company's name, its locations and their addresses, and its contacts (the people who buy). | | **SparkLayer** | What they buy at: the customer group (so the prices, payment methods and order rules), an optional price list for the company or a location, whether they can pay later and what they owe, the sales agents who look after them, and each person's role at a location. | From Shopify company to B2B ordering: 1. **Company in Shopify B2B**: Created in Shopify, or with Create company in SparkLayer 2. **Kept in sync**: Changes in either place reach the other 3. **Terms set in SparkLayer**: Customer group, price list, pay later and sales agents 4. **People order**: Everyone at the company buys on those terms Everyone at a company still needs the `b2b` tag on their Shopify customer record, as other B2B customers do. See [Add B2B customers on Shopify](https://docs.sparklayer.io/help/platforms/shopify/invite-customers.md). On other platforms, manage your B2B customers with [customer groups](https://docs.sparklayer.io/help/customers/customer-groups.md) and [company users](https://docs.sparklayer.io/help/customers/company-users.md). Companies is only available on Shopify. ## Create a company 1. Go to **Companies** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/companies)), or **SparkLayer Wholesale > Companies** in the Shopify app and click **Create company**. 2. Under **Company**, enter the **Company name**, for example `Northwind Toys`. 3. Under **Prices and rules**, choose its **Customer group**. Leave **Price list** as **Use the customer group's price list** unless the company needs different prices. 4. Under **Paying**, turn on **Let them pay later** if they can order now and pay by invoice. 5. Under **Sales agents**, choose the **Sales agents who look after them**, or leave **Any sales agent**. 6. Click **Save** in the bar at the top of the page. You'll see "Company created". If you didn't enter a name, you'll see "Give the company a name" instead. Then finish setting up the company: 1. Add its people: [invite them as buyers](https://docs.sparklayer.io/help/customers/invite-buyers.md) and choose the company, or add them as contacts of the company in Shopify. 2. Open the company again and choose its **Main contact** and **Admins** under [People](#people). 3. If it orders for several stores or regions, [split it into locations](https://docs.sparklayer.io/help/customers/company-locations.md#add-a-location). Then [add each person to the locations they order for](https://docs.sparklayer.io/help/customers/company-locations.md#add-people-to-a-location). **More detail** - Because companies sync both ways, the new company is added to your Shopify B2B companies too. - Until you add its people, the company's **People** card says "After you create the company, add its people from Customers." - **IDs in other systems** is optional. Fill it in only if an accounting system, ERP or other tool needs to match the company. ## Edit a company 1. At **Companies** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/companies)), or **SparkLayer Wholesale > Companies** in the Shopify app, click the company's name, or click **⋯** and then **Edit company**. 2. Change what you need. See [The company page](#the-company-page) for every field. 3. Click **Save** in the bar at the top. You'll see "Company saved". To undo your changes instead, click **Discard**. ## The Companies screen The Companies screen lists every company, with its pricing and whether it can pay later. Go to **Companies** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/companies)), or **SparkLayer Wholesale > Companies** in the Shopify app, or click the **Companies** figure ("Businesses you sell to") on Home. | Part | What it shows / does | | --- | --- | | **Open in Shopify** | Opens **Customers > Companies** in your Shopify admin. | | **Create company** | Opens the form for a new company. See [Create a company](#create-a-company). | | Search | Type part of a company's name (**Search companies**). The list filters as you type. | | **Company** | The company's name, with how many people and locations it has underneath, for example "4 people · 11 locations". Click the name to open the company. | | **Pricing** | The company's own price list. Without one, the customer group's pricing, for example "Trade pricing". Without either, **Standard pricing**. | | **Pay later** | "Owes" and the amount, **On, nothing owed**, or **Off**. | | **⋯** | **Edit company** opens the company. **Manage locations** opens its [locations](https://docs.sparklayer.io/help/customers/company-locations.md). | | **Works with Shopify B2B** | A reminder of what Shopify holds and what SparkLayer adds, with **Open Companies in Shopify**. | If you have no companies yet, the list says **No companies yet** ("Add the businesses you sell to."), with **Create company**. If your search finds nothing, it says **No companies found** ("Try a different name."). ## The company page The company page holds everything SparkLayer stores about a company, in these cards. ### Company | Field | What it's for | | --- | --- | | **Company name** | The business's name, for example "Northwind Toys". | ### Prices and rules | Field | Options | What it does | | --- | --- | --- | | **Customer group** | **Base customer group** (the default), or any of your groups | "Sets their prices, payment methods and order rules." See [Customer groups](https://docs.sparklayer.io/help/customers/customer-groups.md). | | **Price list** | **Use the customer group's price list** (the default), or any of your price lists | "Only set this if this company needs different prices from its group." | ### Paying | Field | What it does | | --- | --- | | **Let them pay later** | A switch. When it's on, "They order now and pay by invoice, up to their credit limit." | | **Currently owes** | Shown under the switch when the company has an unpaid balance, for example "Currently owes $1,240.50." | The credit limit isn't set on the company page. A customer's credit limit, net terms and balance show on their [customer page](https://docs.sparklayer.io/help/customers/managing-customers.md#a-customers-page), under **Financial details**. See [Credit limits and net terms](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md). ### People The people at a company are the customers whose **Company** is this company. | Field | What it does | | --- | --- | | **Main contact** | The one person who "Gets order and invoice emails for the company." Each person shows as their name and email. | | **Admins** | Tick the people who manage the company. "Admins can invite people and manage locations for their company." | If no one is in the company yet, the card says "No one is in this company yet. Add people from Customers." ### Sales agents | Field | Options | What it does | | --- | --- | --- | | **Sales agents who look after them** | **Any sales agent** (the default), or a group of sales agents, such as **UK reps** | "These sales agents can see them and order on their behalf." | See [Sales agents](https://docs.sparklayer.io/help/sales-reps.md) for what agents can do. ### Locations This card only shows on an existing company. It says how many locations the company has and names the top-level ones, for example "11 locations: UK, USA, Australia and more inside them." Click **Manage locations** to open them. With no locations, it says "Split this company into stores or regions if they need different prices or people.", with **Add a location**. See [Company locations](https://docs.sparklayer.io/help/customers/company-locations.md). ### IDs in other systems "Optional. Only needed if you sync with an accounting system, ERP or other tool." | Field | What it's for | | --- | --- | | **Accounting system ID** | The company's ID in your accounting system. | | **Shopify company ID** | The company's ID in Shopify B2B. | | **Other system ID** | The company's ID in an ERP or any other tool. | ## How a company's settings reach its locations A company's **Customer group**, **Price list**, **Pay later** and **Sales agents** are the starting point for all its locations. Each location shows **Same as** and the level above it until you change it. So: - To change something for the whole company, change it on the company page. - To change it for one store or region, change it on that [location](https://docs.sparklayer.io/help/customers/company-locations.md#the-location-page). The locations inside it follow. ## Delete a company 1. Open the company. 2. Click **More actions**, then **Delete company**. 3. Click **Delete company** to confirm. The company's locations are deleted too. Its people stay as customers, but lose the company's prices and payment terms. This can't be undone. ## FAQs **Do I have to use companies?** No. A customer who isn't in a company buys at their [customer group's](https://docs.sparklayer.io/help/customers/customer-groups.md) settings. Use companies when several people buy for the same business, or when one business needs its own prices, payment terms or locations. **Can I change a company in Shopify instead?** Yes. Companies are kept in sync both ways, so a company, location or contact you add or change in Shopify B2B shows in SparkLayer too. Prices, payment terms and sales agents are set in SparkLayer. **Why does a company show Standard pricing?** Neither the company nor its customer group has a price list, so it sees your standard prices. Give the company a **Price list**, or give its customer group one. See [Assign price lists](https://docs.sparklayer.io/help/customers/customer-groups.md#assign-price-lists). **Does SparkLayer use Shopify catalogs or payment terms?** No. Prices come from SparkLayer's price lists, and payment methods and order rules from its customer groups. See [Shopify Companies](https://docs.sparklayer.io/help/platforms/shopify/companies.md). **How do I add someone to a company?** [Invite them as a buyer](https://docs.sparklayer.io/help/customers/invite-buyers.md) and choose the company, or add them as a contact of the company in Shopify. Then add them to the [locations](https://docs.sparklayer.io/help/customers/company-locations.md#add-people-to-a-location) they order for. **What happens to the people when I delete a company?** They stay as customers, but they lose the company's prices and payment terms and go back to their own customer group's settings. --- # Company locations URL: https://docs.sparklayer.io/help/customers/company-locations Split a B2B company into stores, branches or regions with their own prices, pay later and people, and let buyers order for one location at a time. > **Companies are in early access.** Request it for your store. [Request early access](mailto:product@sparklayer.io?subject=Early%20access%20to%20Companies). > **Quick summary** > > - A company can be split into **locations**, such as stores, branches or regions. Locations can sit inside each other as deep as you need, for example UK > North > Leeds. Company locations are on every plan. > - Each location uses the settings of the level above (another location, or the company) unless you change them. That covers its customer group, price list, pay later and sales agents. > - Set them up at **Companies > Manage locations** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/companies)), or **SparkLayer Wholesale > Companies > Manage locations** in the Shopify app. Add people to each location and give each one a role: **Buyer**, **Approver** or **Manager**. > - On your store, someone at the company orders for **one location at a time**, with that location's prices, payment options and address. **Company locations** is on by default; turn it off at **Settings > Configurations > Ordering** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Ordering** in the Shopify app. ## How it works A company that buys from you often orders for several places: a chain of shops, regional branches, or a head office and its warehouses. Each place can need its own prices, payment terms and people. With company locations, the person ordering picks the place first. The cart, checkout and My Account then follow it. This page has two halves: [setting up locations](#set-up-a-companys-locations) in the app, and [how buyers order for a location](#how-buyers-order-for-a-location) on your store. ### How locations share settings Locations form a tree, with the company at the top. There's no separate "region" type: a region is a location with other locations inside it. Each location **inherits from the level above unless it sets its own**. For example, every store in the North region uses the region's price list until you give one store a different list. When you change a setting on the company, every location that hasn't set its own follows. How settings pass down the tree: 1. **Company**: Northwind Toys: Trade customer group, pay later on 2. **Region**: North: Same as Northwind Toys 3. **Store**: Leeds: its own price list, everything else the same as North | Setting | How it works | | --- | --- | | **Customer group**, **Price list**, **Pay later** and **Sales agents** | Set on the [company](https://docs.sparklayer.io/help/customers/companies.md#edit-a-company), and changed on any location that needs its own. Each location shows **Same as** and the level above until you change it. | | **People** | Never inherited. Each person is added to the exact locations they order for. | | **Address** | Never shared. Each location ships to its own address. On Shopify, that's the address of its Shopify company location. | | **Balance** | Rolls up the tree. A region owes what its stores owe, shown in the **Owes** column. | | **Credit limit** | Belongs to the company. There's one limit, shared by every location, and the credit available is that limit minus what the whole company owes. | On Shopify, companies and their locations are your [Shopify B2B companies](https://docs.sparklayer.io/help/platforms/shopify/companies.md), kept in sync both ways. ## Set up a company's locations 1. Check **Company locations** is on (it is by default): see [Turn company locations on or off](#turn-company-locations-on-or-off). 2. At **Companies** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/companies)), or **SparkLayer Wholesale > Companies** in the Shopify app, click **⋯** next to the company, then **Manage locations**. 3. [Add a location](#add-a-location) for each region or store. Add regions first, then the stores inside them. 4. On each [location page](#the-location-page), change only what's different from the level above, such as its **Price list**. 5. [Add people to each location](#add-people-to-a-location) and choose their role. ## Turn company locations on or off 1. Go to **Settings > Configurations > Ordering** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Ordering** in the Shopify app. 2. Turn **Company locations** on or off ("Customers in a company choose which location they're buying for, and get that location's pricing."). It's on by default. 3. Click **Save** in the bar at the top of the page. ## The locations screen The locations screen shows a company's location tree, with each location's pricing, people and balance. Open it in either of these ways: - At **Companies** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/companies)), or **SparkLayer Wholesale > Companies** in the Shopify app, click **⋯** next to the company, then **Manage locations**. - On the company's page, under **Locations**, click **Manage locations** (or **Add a location** if it has none). The screen is named after the company, for example "Museum of Play Group locations". Above the list: "Each location uses the company's settings unless you change them. Put locations inside others to group them, like stores inside a region." | Column | What it shows | | --- | --- | | **Location** | The location's name, indented under the location it sits in. Click it to open the location. | | **Pricing** | The location's own price list, its customer group's pricing (for example "Trade pricing"), or **Same as** and the level above. | | **People** | How many people are in the location, or **No one yet**. | | **Owes** | The location's unpaid balance, or **Nothing**. | | **⋯** | **Edit location**, **Add a location inside** and the location's name, and **Delete**. | A company with no locations shows **No locations yet**: "Split this company into stores or regions if they need different prices or people. Each location uses the company's settings unless you change them." ## Add a location 1. On the locations screen, click **Add a location** to add one at the top level. To add one inside another location, click **⋯** next to it and choose **Add a location inside** and its name. 2. Enter a **Location name**, for example `Glasgow store`. The help text says which settings it starts with, for example "It uses Museum of Play Group's settings until you change them." 3. Click **Add location**. You'll see "Location added". You can also add a location inside the one you're editing: on the location page, click **More actions**, then **Add a location inside**. ## The location page The location page holds one location's settings. To open it, click the location's name, or click **⋯** and then **Edit location**. Change what you need, then click **Save** in the bar at the top. You'll see "Location saved", and you go back to the locations screen. ### Location | Field | What it does | | --- | --- | | **Location name** | The location's name. | | **Sits under** | Where it sits in the tree: the company (top level), or another location. Moving it "brings the locations inside it too". You can't move a location inside itself or one of its own locations. | ### Prices and rules | Field | Options | What it does | | --- | --- | --- | | **Customer group** | **Same as** the level above, or any of your groups | "Sets their prices, payment methods and order rules." | | **Price list** | **Same as** the level above, or any of your price lists | Leave it as **Same as** unless this location needs its own prices. | ### Paying | Field | Options | What it does | | --- | --- | --- | | **Pay later** | **Same as** the level above, **On** or **Off** | "Order now and pay by invoice, up to their credit limit." With an unpaid balance, the card also says what the location currently owes. | ### People Who can order for this location, and their role. See [People and location roles](#people-and-location-roles). ### Sales agents | Field | Options | What it does | | --- | --- | --- | | **Sales agents who look after them** | **Same as** the level above, or a group of sales agents, such as **UK reps** | "These sales agents can see them and order on their behalf." | ### IDs in other systems The same optional fields as a company: **Accounting system ID**, **Shopify company ID** and **Other system ID**. ## People and location roles Location roles decide who can order for each location. A person joins the company first, then you add them to the locations they order for: 1. **They join the company.** A person belongs to a company through the **Company** on their customer record. That happens when you [invite them as a buyer](https://docs.sparklayer.io/help/customers/invite-buyers.md) and choose the company, or when they're a contact of the company in Shopify and sync across. 2. **You add them to locations.** On each location page, add them under **People** and choose their role. One person can be in several locations, for example a buyer who orders for both Leeds and Manchester. | Role | What they can do | | --- | --- | | **Buyer** | "Places orders for this location." The default for anyone you add. | | **Approver** | "Checks and approves orders before they're placed." | | **Manager** | "Everything a buyer can do, plus managing this location's people." | ### Add people to a location 1. Open the location page. 2. Under **People**, choose someone from **Add someone from** and the company's name. The list shows the company's people who aren't in this location yet. 3. Click **Add**. This saves straight away ("Added to the location"). 4. In the **Role** column, choose **Buyer**, **Approver** or **Manager**, then click **Save** in the bar at the top. The list shows each person's name and email, and their role. With nobody added, it says "No one is in this location yet." If someone isn't in the **Add someone from** list, they're not in the company yet: [invite them](https://docs.sparklayer.io/help/customers/invite-buyers.md) and choose the company first. ### Remove someone from a location 1. Under **People**, click **Remove** next to the person. 2. Click **Remove** to confirm. "They stay in the company, just not in this location." ## Move or delete a location To move a location, open it, change **Sits under**, then click **Save**. The locations inside it move too. To delete a location: 1. Click **⋯** next to the location and choose **Delete**. Or open the location and click **More actions**, then **Delete location**. 2. Click **Delete location** to confirm. The locations inside it are deleted too. Its people stay in the company. This can't be undone. ## How buyers order for a location The rest of this page is about your store: what someone at the company sees when they sign in, and how they switch between locations. Ordering for a company location: 1. **Sign in**: The person signs in for the company, or a sales agent orders for it 2. **Choose a location**: The location chip shows the current location; click it to switch 3. **Prices and payment follow**: The cart uses the location's price list and payment options 4. **Check out**: The order goes to the location's address and is recorded against it ### The location chip The location chip shows which location someone is ordering for. On your store, it sits in the widget's top bar, to the left of the avatar. | What it shows | When | | --- | --- | | A pin and the location's name | The person is ordering for that location. | | Up and down arrows beside the name | There's more than one location to choose from. | | The pin on its own | A sales agent's top bar is full. The location's name is in the chip's tooltip. | | **No location** | The person hasn't been added to any location yet. | | No chip | The company has no locations. | ### Choose a location 1. Click the location chip in the top bar. 2. In **Choose a location**, click the location to order for. The cart, checkout and My Account switch to that location straight away. A notification confirms it, for example **Ordering for** and the location's name. Underneath, it shows the location's price list and whether it can pay later (or what it owes). **More detail** - **Current location** comes first, with its place in the tree (for example a region, then the store), so it's never lost at the bottom of a long list. - **Recent**, for companies with more than six locations, lists the last three locations the person ordered for. - Everything else follows, grouped under the region it's in. Someone who can only reach some locations sees **Your other locations**, and a company with no regions shows **Other locations**. - Each row shows the location's name, its address and, on the right, its price list as a short badge such as **30% off** (hover to see the list's name). **Pay later off** marks a location that can't pay on account or by invoice. - With more than six locations, a **Find a location** search appears. Every word typed must match the location's name or a place above it, so a region's name plus a store's name finds that store. Press Enter to choose the first match. - Use the arrow keys to move through the list, and Escape, the backdrop or **×** to close it. If the person can only order for one location, the box says so, and says a company admin can add them to more. If they're in no location, it names the company admin to ask. ### What changes with the location | Where | What changes | | --- | --- | | [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) | Each line's unit price comes from the location's price list. For example, on a list that's 30% off RRP, a product with an RRP of $100.00 costs $70.00. The crossed-out sub-total is the RRP total. A price a sales agent changed by hand on a line keeps the agent's price. | | Checkout: **Details** | The **Shipping Address** is the location's own, with a note saying it's delivering to that location's address and a **Change location** link. | | Checkout: **Review & Pay** | With **Pay later off**, the pay-later methods (such as **Pay on Account** and **Pay by Invoice**) are hidden and card payment is selected. The **Order Summary** has an **Ordering for** row naming the location, with **Change**. | | Checkout: **Complete** | The confirmation message names the location the order was placed for. The confirmation goes to the email address of the person who placed the order, not the company's. | | My Account: greeting and **My Details** | The signed-in person's own first name, name and email address, not the company's. | | My Account: **Recent Activity** | The location's orders, each naming the location it was placed for. A region also shows its stores' orders. A location with no orders says so, with **Change location**. | | My Account: **Financials** | The payment terms, the location's unpaid balance and the company's credit limit, with a note of how much of the shared limit is left. | | My Account: **Address Book** | The location's address, as the default shipping and billing address, with **Change location**. | | My Account: **Company Users** | The company's people, each with the locations they can reach (or "No location yet"), their role (**Admin** or **Standard**) and **(you)** beside the signed-in person. | | Account menu | Under the company's name, the person's name and their location. A sales agent's menu doesn't change. | See [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md), [Cart and checkout](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md) and [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md) for the rest of each screen. ### Who can order for which locations Someone can order only for the locations they've been added to. Where those locations sit in the tree doesn't matter: being added to one store doesn't give someone its region, or the other stores in it. | Who | Locations they can choose | What else they can do | | --- | --- | --- | | Company admin (one of the company's **Admins**) | Every location | Manage the company's people and locations: **Add new address**, **Invite new user** and the actions on **Company Users**. | | Anyone else at the company | Only the locations they've been added to | Order for those locations. They don't see **Add new address** (in My Account or at checkout), **Invite new user** or the **Company Users** actions. | | [Sales agent](https://docs.sparklayer.io/help/sales-ordering/order-for-a-customer.md) | Every location of the company they're ordering for | Order for any location, and manage people and locations like an admin. | To give someone more locations, [add them on the location page](#add-people-to-a-location). A company admin, or a sales agent who looks after the company, can do it too. ## FAQs **Why can't someone see a location?** They haven't been added to it. People only see the locations they've been added to, even if they're in another store in the same region. Company admins and sales agents see every location. To fix it, add them on the location page under **People**. **Why isn't someone in the Add someone list?** They're not in the company yet. A person joins a company through the **Company** on their customer record: [invite them as a buyer](https://docs.sparklayer.io/help/customers/invite-buyers.md) and choose the company, or add them as a contact of the company in Shopify. **How do I create a region?** Add a location with the region's name, such as `North`. Then add the stores inside it with **Add a location inside**. A region is a location with other locations inside it. **Does each location have its own credit limit?** No. The credit limit belongs to the company and is shared by every location. **Financials** shows the current location's unpaid balance and how much of the company's limit is left. **Why can't a customer pay on account or by invoice?** The location they're ordering for has **Pay later** off, so only card payment is available. Check the setting on the location, the locations above it and the company. A location uses the nearest setting above it unless it has its own. **Why don't the prices match the customer group's price list?** With company locations, the cart uses the price list of the location being ordered for. Check which location the location chip shows. Then check which price list that location uses, or the location or company above it. **Can someone change the delivery address at checkout?** The checkout uses the location's own address. To deliver somewhere else, choose a different location with **Change location**. Company admins can also add addresses. **What happens to people when I delete a location?** They stay in the company, just not in that location or the locations inside it. Add them to another location if they still need to order. --- # Invite a buyer URL: https://docs.sparklayer.io/help/customers/invite-buyers Invite a buyer from SparkLayer: they get an email to create their trade account, join the customer group you choose and see your trade prices when they sign in. > **Quick summary** > > - **Invite a buyer** adds a person to your store as a B2B customer in the customer group you choose, and emails them an invite. They see your trade prices as soon as they sign in. > - Click **Invite buyer** at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app. You can also open it from Setup, Home and customer groups. > - In the Shopify app, Shopify sends the invite and you can add the buyer to one of your Shopify B2B companies. In the SparkLayer Dashboard, SparkLayer sends its own branded invite. > - **Copy registration link** gives you a link to your trade registration form instead, so buyers can apply themselves. You can still add customers by [tagging them in Shopify](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#assign-customers-to-a-customer-group). ## How it works Inviting a buyer does the setup for you. SparkLayer adds them to Shopify as a customer with the customer group's tag (such as `b2b-trade`), so they're a B2B customer in that group straight away. It then emails them to create their account. From invite to first order: 1. **You invite them**: Enter their email and choose their customer group 2. **They're added**: They're added to Shopify with the group's tag, and show as Invited in Customers 3. **They get an email**: It asks them to create their trade account 4. **They sign in**: They see your trade prices and can order any time ## Invite a buyer Invite a buyer from **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app, or from any of the places in [Where to invite from](#where-to-invite-from). The box is slightly different in each version of the app. **Shopify app:** 1. Click **Invite buyer** (or **Invite a buyer**). 2. Enter their **First name** and **Last name**, and their **Email**. Email is required. 3. Under **Company**, choose one of your Shopify B2B companies, or leave **No company**. 4. Under **Customer group**, choose their group. Each option shows the group and its price list, for example **Trade · Trade 20%**. 5. Click **Send invite**. | Field | What it does | | --- | --- | | **First name**, **Last name** | Their name on the Shopify customer. | | **Email** | Required. The address they sign in with. | | **Company** | "Adds them as a contact at this Shopify B2B company." See [Companies](https://docs.sparklayer.io/help/customers/companies.md). | | **Customer group** | "Adds the group's tag, like b2b-trade". The group sets their prices, payment methods and order rules. | **What the buyer receives:** "Shopify emails them an invite to your store. They sign in with a one-time code, no password, and see trade prices straight away." Click **Edit the email in Shopify** to change it at **Settings > Notifications** ([open in the Shopify admin](https://admin.shopify.com/settings/notifications)). **More detail** - Without a company, Shopify sends its customer account invite. - With a company, Shopify sends its B2B access email for company contacts. **SparkLayer Dashboard:** 1. Click **Invite buyer** (or **Invite a buyer**). 2. Enter their **Email** (required), for example `buyer@theirshop.com`, and their **Name**, for example `Priya Shah`. 3. Optionally, type their company under **Company (optional)**, for example `Northwind Toys`. 4. Under **Customer group**, choose their group. 5. Click **Send invite**. | Field | What it does | | --- | --- | | **Email** | Required. The address they sign in with. | | **Name** | Their name. | | **Company (optional)** | The business they buy for. | | **Customer group** | The group sets their prices, payment methods and order rules. | **What the buyer receives:** a SparkLayer email in your store's name. The **What they'll get** box shows a preview: your store's name and "invited you to order wholesale", then "Create your trade account to see your prices and order any time.", with a **Create trade account** button. "They're added to Shopify with the group's tag, so SparkLayer shows them trade prices as soon as they log in." You'll see "Invite sent to" and their email. The buyer appears at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app with **Access** set to **Invited** until they create their account. If something's wrong, you'll see one of these instead: | Message | What it means | | --- | --- | | Enter the buyer's email address | The email is missing or isn't a valid address. | | That buyer already has an account | Someone with that email is already a customer. Find them at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app. To move them to another group, see [Assign customers to a customer group](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#assign-customers-to-a-customer-group). | Your first invite also completes the Setup step **Invite your first buyer**. ## Where to invite from The same **Invite a buyer** box opens from each of these places: | Where | What to click | | --- | --- | | **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app | **Invite buyer**, at the top of the page. | | **Home > Setup** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/)), or **SparkLayer Wholesale > Setup** in the Shopify app | Step 3, **Invite your first buyer**: **Invite a buyer**. | | **Home** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/)), or **SparkLayer Wholesale** in the Shopify app | The getting-started card on Home lists the same steps as Setup, including **Invite a buyer**. | | **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app | Under **Common tasks**, **Add a buyer to a group** ("Invite them straight into the group you choose"). | | A customer group's page | **More actions**, then **Invite a buyer**. | ## Share your registration link To let buyers apply themselves, share the link to your trade registration form: 1. In the **Invite a buyer** box, click **Copy registration link**. You'll see "Registration link copied". 2. Share the link by email, or put it on your website. Applications arrive as entries on the registration form in [Forms](https://docs.sparklayer.io/help/forms.md). There, you approve or reject each one and choose the customer group. Approving one adds the buyer the same way as an invite, and also completes the Setup step. Forms are in the SparkLayer Dashboard only. ## Other ways to add a buyer | Way | When to use it | | --- | --- | | [Tag the customer in Shopify](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#assign-customers-to-a-customer-group) | For customers who already have an account on your store, or to add many at once. Give them `b2b`, plus the group's tag. | | [Add them as a contact of a Shopify B2B company](https://docs.sparklayer.io/help/customers/companies.md) | For people at a company you already have. They sync to SparkLayer as people at that company. | | [Approve a registration form entry](https://docs.sparklayer.io/help/forms/entries.md) | For buyers who applied through your trade registration form. | On other platforms, add B2B customers in your platform's admin: see [Assign customers to a customer group](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#assign-customers-to-a-customer-group). Invite a buyer is only available on Shopify. ## FAQs **Does the buyer need a password?** In the Shopify app version, no: Shopify's customer accounts sign them in with a one-time code sent to their email. In the SparkLayer Dashboard version, they create their trade account from the invite email. **Can I change the invite email?** In the Shopify app, Shopify sends it: click **Edit the email in Shopify** in the **Invite a buyer** box. The SparkLayer Dashboard's invite is sent by SparkLayer in your store's name. **Can I invite someone who already has an account?** No: you'll see "That buyer already has an account". Move them to the right customer group by changing their tags in Shopify instead. **What if the buyer hasn't received their invite?** Check the email address at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app and ask them to check their spam folder. In the Shopify app, you can resend Shopify's invite from the customer in your Shopify admin. --- # Find and manage customers URL: https://docs.sparklayer.io/help/customers/managing-customers Find a B2B customer, check their access, customer group, credit and addresses, invite new buyers and fix customer sync errors in SparkLayer. > **Quick summary** > > - **Customers** lists every B2B customer who can order on your store, with their **Access** (**Standard** or **Limited**, or **Invited** if they haven't accepted an invite yet) and customer group. Find it at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app. > - Click **Invite buyer** to [invite someone new](https://docs.sparklayer.io/help/customers/invite-buyers.md). A banner at the top tells you when the customer sync found records that need fixing. > - Open a customer to see what SparkLayer holds for them: company, customer group, credit, role, company users, addresses and IDs. You change their **Role** here. Everything else comes from your store. > - Available on every plan.## How it worksSparkLayer doesn't hold its own customer accounts. It syncs your B2B customers from your eCommerce platform (on Shopify, customers tagged `b2b`) and shows them here. Use it to check what each one sees when they sign in.Where customer data comes from: 1. **Your platform**: The customer, their tags and their company live in your store's admin 2. **Customer sync**: SparkLayer imports B2B customers automatically, and tells you about any it couldn't 3. **Customers**: You check their access, group, credit and addressesTo change most details, edit the customer in your platform, and the change syncs to SparkLayer. The exception is the customer's [role](#make-a-customer-a-sales-agent), which you set here.## Find a customer1) Go to **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app. 2) Search by name, email or company. 3) Click the customer's name, or **View**, to open them.## The Customers screenThe Customers screen lists every B2B customer who can order on your store. Go to **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app.| Part | What it shows / does | | --- | --- | | **Open in Shopify** | Opens **Customers** in your Shopify admin. | | **Invite buyer** | Opens **Invite a buyer**. See [Invite a buyer](https://docs.sparklayer.io/help/customers/invite-buyers.md). | | Sync banner | Shown when the last customer sync had problems. See [Fix customer sync errors](#fix-customer-sync-errors). | | Search | Type a name, email or company (**Search by name, email or company**). | | **Name** | The customer's name, with their company underneath. Click it to open the customer. | | **Email** | The email address they sign in with. | | **Access** | **Standard** or **Limited**, or **Invited** (see below). | | **Group** | Their [customer group](https://docs.sparklayer.io/help/customers/customer-groups.md). Sales agents show **Base**. | | **View** | Opens the customer. |If nothing matches your search, the list says **No customers found** ("Try a different name or email.").### Access| Access | What it means | | --- | --- | | **Standard** | They can sign in and place orders. | | **Limited** | They can build orders, but their orders need approving before they're placed, as a [limited company user](https://docs.sparklayer.io/help/customers/company-users.md#limited-access). | | **Invited** | You've [invited them](https://docs.sparklayer.io/help/customers/invite-buyers.md), and they haven't created their account yet. |## A customer's pageA customer's page shows everything SparkLayer holds for them. To open it, click the customer's name or **View**. To open the same customer in your Shopify admin, click **View in Shopify**. An empty value shows **None set**.| Card | What it shows | | --- | --- | | **Basic information** | **Email**, **Company**, **Customer group**, **Price list override** (a price list for this customer only, see [Prices for one customer](https://docs.sparklayer.io/help/pricing/customer-pricing.md)) and **Sales agents who can see them**. | | **Financial details** | **Discount percentage** and **Accounting ID** (see [advanced account settings](https://docs.sparklayer.io/help/customers/account-and-addresses.md#advanced-account-settings)). Under **Payment on account**: **Balance**, **Credit limit**, **Net terms** and **Currency**. See [Credit limits and net terms](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md). | | **Role** | Whether the person is a customer, a sales agent or a sales administrator. See [Make a customer a sales agent](#make-a-customer-a-sales-agent). | | **Company users** | "Everyone at this customer's company, and their roles." With none, it suggests adding company users, with **Learn more**. See [Company users](https://docs.sparklayer.io/help/customers/company-users.md). | | **Addresses** | **Default shipping address**, **Default billing address** and **Other addresses**. | | **Identifiers** | **Platform ID** (the customer's ID in your platform), **Legacy ID** and **Internal ID** (SparkLayer's own ID). |**Sales agents who can see them** lists the agents allowed to see this customer's customer group, plus any agents who can see every customer. See [Sales agents](https://docs.sparklayer.io/help/sales-reps.md).The customer page doesn't show which [company locations](https://docs.sparklayer.io/help/customers/company-locations.md) a person is in, or their location roles. Check those on each location's page.## Change a customer's detailsCustomer information comes from your connected platform. To change fields such as the email address, name or company, edit the customer in your platform (on Shopify, click **View in Shopify**) and the change syncs to SparkLayer.**Shopify only:** Fields such as the accounting ID and default addresses can also be set with metafields on Shopify: see [advanced account settings](https://docs.sparklayer.io/help/customers/account-and-addresses.md#advanced-account-settings).## Make a customer a sales agentA sales agent is a customer with a sales agent role. To give someone sales agent access:1) Open the customer and go to **Role** ("Assign a role to manage permissions for this person."). 2) Choose a role. 3) Click **Save** in the bar at the top. You'll see "Role saved".| Role | What they can do | | --- | --- | | **Customer** | "Can log in and place orders." | | **Sales agent** | "Can place orders and manage addresses, shopping lists, and company access on behalf of customers." | | **Sales administrator** | "All sales agent permissions, plus the ability to edit order prices and create new customers." | | Your own roles | Any [custom role](https://docs.sparklayer.io/help/sales-reps/roles.md) you've created, shown as "Custom sales rep role." |To remove sales agent access, choose **Customer** and save.Sales agents need the Starter plan or above. Below Starter, choosing an agent role shows what sales agents do and how to upgrade.If you've used all the sales agents on your plan, you'll see "You've used all" and your plan's number of agents. Change another agent's role to **Customer**, or upgrade. See [Sales agent ordering](https://docs.sparklayer.io/help/sales-ordering.md) and [Your plan](https://docs.sparklayer.io/help/dashboard/plan-and-features.md).## Remove a customer from B2BOnce a customer has synced to SparkLayer, removing the `b2b` tag (or label) in your platform doesn't remove them from SparkLayer. It doesn't take them out of their customer group either. They stay at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app with the same group.To remove customers you no longer want in SparkLayer, [contact our support team](https://docs.sparklayer.io/help/support.md) with their email addresses. We can remove them one at a time or in bulk.To move a customer to another group instead, change their group tag: see [Assign customers to a customer group](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#assign-customers-to-a-customer-group).## Fix customer sync errorsSparkLayer syncs your customers in full now and then, and syncs changes in between (a partial sync). When a sync finds records it can't use, a warning banner appears at the top of Customers. For example:> **Customers sync completed with 3 errors** > We synced your customers to SparkLayer, but some records need fixing.The banner also gives the times of the last full and partial syncs. Home shows the same problem in your briefing ("customers didn't sync from Shopify"), with **Show errors**.To fix them:1) Click **Show errors**. **Customer sync errors** lists each customer's name, email and the problem. 2) Click **Open customers in Shopify** and fix each record there.The fixed customers sync on the next partial sync. You don't need to do anything else.| Example problem | How to fix it | | --- | --- | | Missing a default shipping address | Add an address to the customer and make it the default. | | Tagged `b2b-trade` but no first or last name | Add the customer's first and last name. | | Tax exemption ID is not valid for DE | Correct the tax exemption ID for the customer's country. |The banner is a warning, not an error: the sync worked for everyone else. Close it with **×** and it stays hidden until the next sync.## FAQs**Why is a customer missing from the list?** Only B2B customers are synced. Check the customer is marked as B2B in your platform (on Shopify, tagged `b2b`) and has an email address and a default address. If the sync banner is showing, click **Show errors** to see whether they're listed. **What do I do when a customer shows Invited?** They haven't created their account yet. Ask them to check their email for the invite, or [send another](https://docs.sparklayer.io/help/customers/invite-buyers.md). Once they've signed in, their access changes. **Can I edit a customer's email or company in SparkLayer?** No. Change them in your eCommerce platform and they sync across to SparkLayer. **How do I move a customer to another customer group?** Change their tags (or labels) in your platform. See [Assign customers to a customer group](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#assign-customers-to-a-customer-group). If they're in a company, the company's customer group applies instead. Change it on the [company page](https://docs.sparklayer.io/help/customers/companies.md#prices-and-rules). **I removed the b2b tag but the customer is still in SparkLayer** That's expected. Removing the tag doesn't remove a customer who has already synced, or change their customer group. Ask our team to remove them: see [Remove a customer from B2B](#remove-a-customer-from-b2b). **Where did the customer data lookup go?** Customer sync now lives on this screen: the banner shows the last full and partial sync and any errors, and **Show errors** lists the records to fix. To check one customer, search for them here and open their page. --- # Customer groups URL: https://docs.sparklayer.io/help/customers/customer-groups Set the price lists, payment methods, order limits and other rules for each B2B customer group, and see how groups inherit from the Base group. > **Quick summary** > > - A customer group is a set of rules shared by a set of B2B customers: which [price lists](https://docs.sparklayer.io/help/pricing.md) they see, which payment methods they can use, their order limits, and settings such as address editing and stock display. > - Manage groups at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app. Every store has a **Base customer group** that applies to all B2B customers. Every other group inherits the Base group's rules unless you override them. > - Each customer belongs to one group. Add buyers by [inviting them](https://docs.sparklayer.io/help/customers/invite-buyers.md) and choosing the group, or in your eCommerce platform. On Shopify, tag them `b2b` plus the group's tag, for example `b2b-trade`. See [Add customers to a group](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md). > - A [company](https://docs.sparklayer.io/help/customers/companies.md) or [location](https://docs.sparklayer.io/help/customers/company-locations.md) can be put in a group too. Customer groups are on every plan.## How it worksB2B customers usually order on agreed terms. A new customer might only be allowed to pay by card. A long-standing customer might pay on account with 30-day terms and a lower price list. With customer groups, you set those rules once and they apply to every customer in the group.How a customer gets their B2B rules: 1. **Add them to a group**: Tag them `b2b` plus the group's tag, such as `b2b-trade`, or invite them and choose the group 2. **SparkLayer syncs**: SparkLayer imports the customer and matches their tags to a customer group. With no group tag, they're in the Base group 3. **Customer signs in**: They see the group's prices, payment methods and ordering rules### The Base customer groupThe **Base customer group** covers all your B2B customers. If every B2B customer orders on the same terms, the Base group is all you need: set your rules there and they apply to everyone.When some customers need different rules, create more groups. Every new group **inherits** its rules from the Base group. A rule the group hasn't changed shows as **Inherited**. Override a rule to give the group its own setting. Anything you don't override keeps following the Base group.How rules are inherited: 1. **Base customer group**: Its rules apply to every B2B customer 2. **Another group**: Starts with the Base group's rules, shown as Inherited 3. **Override a rule**: Give the group its own setting, such as price lists. The rest still follow the Base groupSo to change something for every B2B customer, such as turning on stock display, change it in the Base group.### What can replace a group's settingsA group's settings are the starting point for its customers. A [company](https://docs.sparklayer.io/help/customers/companies.md#prices-and-rules) or [location](https://docs.sparklayer.io/help/customers/company-locations.md#prices-and-rules) can use a different customer group, or its own price list. A single customer can have their own price lists, with [customer pricing](https://docs.sparklayer.io/help/pricing/customer-pricing.md). See [What overrides what](https://docs.sparklayer.io/help/customers.md#who-sets-what).## Create a customer groupCreate a group for customers who need different rules from the rest. If all your B2B customers order on the same terms, you don't need one: set up the [Base customer group](#the-base-customer-group) instead.**BigCommerce only:** On BigCommerce, you create customer groups in BigCommerce, and they sync to SparkLayer. See [Add customers to a group](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#assign-customers-to-a-customer-group).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 **Create customer group**. 2) Enter a **Name**, for example `Trade`. 3) Choose a **Price list**, or leave **Base pricing** to use the Base group's prices. 4) Optionally, enter a **Minimum order value**, for example `250`. 5) Click **Create group**. You'll see "Customer group created".SparkLayer makes the group's **Handle (or ID)** from its name and creates its tag: a group called `Trade` gets the handle `trade` and the tag `b2b-trade`.**More detail** - If you see "Give the group a name", "There's already a group with that name" or "The minimum order can't be negative", fix the field and click **Create group** again. - The minimum order value becomes the group's **Order total limits** rule: see [Set order limits](#set-order-limits). - The handle is also the ID you use elsewhere, for example in [pack size rules per customer group](https://docs.sparklayer.io/help/storefront/quantity-rules.md), the API and ERP integrations. You can't change it.Then finish setting up the group:1) [Check its price lists](#assign-price-lists). 2) [Choose its payment methods](#choose-payment-methods). 3) Optionally, [change its order limits](#set-order-limits). 4) [Add customers to the group](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md), for example by [inviting them](https://docs.sparklayer.io/help/customers/invite-buyers.md). 5) [Test as a B2B customer](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#test-as-a-b2b-customer) to check what they'll see.## Edit a customer group's rules1) 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. 2) Click the group's name. For the Base group, click **Edit** on the **Base customer group** card. 3) Find the rule under **Inherited rules** and click **Override** (on the Base group, **Customize**). The rule moves up to **Customized rules**. 4) Change the rule's settings. 5) Click **Save** in the bar at the top of the page. You'll see "Customer group saved". One save covers every rule you've changed.To hand a rule back, click **Reset** next to it under **Customized rules**, then save. On a group, the rule goes back to following the Base group. On the Base group, it goes back to SparkLayer's default.**More detail** - **Customized rules** on a group: "Set for this group. Reset hands a rule back to the base group." With nothing customized, it says "Nothing customized yet. Everything below comes from the base group." - **Inherited rules** on a group: "From the base customer group. Override one to change it for" the group. Each rule shows the value it inherits. - On the Base group, **Customized rules** says "Every B2B customer gets these. Other groups inherit them unless they override them." and **Inherited rules** says "SparkLayer's defaults. Customize one to change it for every B2B customer." - Click **Discard** in the bar at the top to throw away changes you haven't saved.### The group page| Part | What it shows / does | | --- | --- | | **Details** | The group's **Name** (fixed on the Base group), its **Handle (or ID)** ("Made from the name. Used by the API and ERP integrations.") and its **Customer tags**. The Base group's tag is `b2b` ("Applied to customers to turn on SparkLayer."). Other groups have `b2b` and their own tag ("Customers with these tags join this group."). **View customers** opens the customers with that tag in Shopify. A group also says how many customers it has. | | **Customized rules** | The rules this group sets itself, each with **Reset**. | | **Inherited rules** | Every other rule, with the value it inherits and **Override** (or **Customize** on the Base group). | | **More actions** | On a group (not the Base group): **Invite a buyer**, **Edit base customer group** and **Delete group**. |## The customer groups screenThe customer groups screen shows the Base customer group and every other group, with what each one sets. 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. In the SparkLayer Dashboard, it's **Groups** in the sidebar. In the Shopify app, it's the **Customer groups** tab.**Base customer group** comes first: "Every B2B customer gets these settings. Groups inherit them unless they override one." Click **Edit** to open it. Four tiles sum it up: its **Shopify tag** (`b2b`), its **Price list**, its **Payment methods** and any **Other settings** it customizes.**What the Base customer group tiles show** | Tile | What it shows | | --- | --- | | **Shopify tag** | `b2b`, the tag every B2B customer has. | | **Price list** (or **Price lists**) | The Base group's price lists, or **Retail prices** if it has none. | | **Payment methods** | The payment methods it allows. | | **Other settings** | Any other rules it customizes, such as **Address management**. |**Additional customer groups** lists your other groups:| Column | What it shows | | --- | --- | | **Group** | The group's name, with its tag underneath, for example "Tag: b2b-trade". Click the name to open the group. | | **Customers** | How many customers are in the group. | | **Price list** | The group's own price lists, or **Inherited**. | | **Payment methods** | The group's own payment methods, or **Inherited**. | | **Order limit** | The group's minimum order, for example "$250 minimum", or **Inherited**. |With no other groups, it says **No customer groups yet**: "Every B2B customer gets the base settings until you add a group."**Common tasks** **Common tasks** shortcuts the usual jobs: **Create a customer group**, **Add a buyer to a group** (opens [Invite a buyer](https://docs.sparklayer.io/help/customers/invite-buyers.md)), **Give a group its prices**, **Set a minimum order** and **Tag customers in Shopify**.## What a customer group controlsEach group has the same 11 rules.| Rule | What it does | When it's inherited, it shows | | --- | --- | --- | | [Price lists](#assign-price-lists) | "Choose which price lists this group uses." | The Base group's price lists, or **Retail prices** | | [Payment methods](#choose-payment-methods) | "Choose which payment methods show at checkout." | The Base group's payment methods | | [Order quantity limits](#set-order-limits) | The minimum or maximum number of items in the whole order. | **No quantity limits set** | | [Order total limits](#set-order-limits) | "The order total buyers must reach before checking out." | **No total limits set** | | [Stock display](#show-stock-levels) | "What buyers see about stock." | **Availability: On, Pre-order: On, Units: Off, Max: 100** | | [Stock location](#set-a-stock-location) | "Which inventory locations buyers can order from." | **The stock location feature isn't on** | | [Credit settings](#block-orders-over-the-credit-limit) | "What happens when a buyer reaches their credit limit." | **Checkout blocked if limit exceeded** | | [Quoting engine](#let-customers-request-quotes) | "Whether buyers can request quotes." | **Buyers can request quotes** | | [Checkout access](#disable-checkout) | "Whether buyers can check out." | **Checkout is enabled** | | [Address management](#allow-customers-to-edit-addresses) | "Whether buyers can edit their addresses." | Whether buyers can edit addresses | | [Recurring orders](#allow-recurring-orders) | "Whether buyers can set up repeat orders." | **The recurring orders feature isn't on** |Most groups only need their own price lists and payment methods. Every other rule is optional, and follows the Base group until you override it: see [Optional rules](#optional-rules).## Assign price lists1) [Edit the customer group](#edit-a-customer-groups-rules). If **Price lists** is under **Inherited rules**, click **Override** (or **Customize** on the Base group). 2) Choose a price list. Each option shows its currency and name, for example **USD - Trade 20%**. 3) To add another, click **Add price list**. To remove one, click the bin icon next to it. 4) Click **Save** in the bar at the top.### When a product is in several price listsA group's price lists are numbered in order, and if a product is in more than one, the first list it's in wins. So put the most specific list first, and check this order first when a customer sees the wrong price. See [Which price list wins](https://docs.sparklayer.io/help/pricing/managing-pricing.md#price-list-order).### Prices from outside the groupSome customers can get prices from somewhere other than their group. A company or location can have its own price list: see [Companies](https://docs.sparklayer.io/help/customers/companies.md#prices-and-rules). An individual customer can have their own price lists or a percentage discount: see [Prices for one customer](https://docs.sparklayer.io/help/pricing/customer-pricing.md).## Choose payment methods1) [Edit the customer group](#edit-a-customer-groups-rules) and override **Payment methods**. 2) Tick the methods the group can use: **Pay by invoice**, **Payment on account** or **Card at checkout**. Then click **Save**.At checkout, the customer sees the methods their group allows, as **Pay by Invoice**, **Pay on Account** and **Pay Online by Card**. A group with only **Card at checkout** ticked shows card payment and nothing else. For what each method means, how the order arrives in your platform and how to rename or reorder them, see [Payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md) and [How orders arrive](https://docs.sparklayer.io/help/ordering/payment-methods.md#how-orders-arrive).**Shopify only:** Under each method you tick, **Add rule** gives the method a discount or surcharge, or hides it, when an order meets your conditions. See [Payment method rules](https://docs.sparklayer.io/help/ordering/payment-method-rules.md).A company or location with **Pay later** off can only pay by card, whatever its group allows. See [Companies](https://docs.sparklayer.io/help/customers/companies.md#paying).## Set order limitsOrder limits stop a customer checking out until the whole order meets your rules: a minimum or maximum order total (**Order total limits**, per currency) or a minimum or maximum number of items (**Order quantity limits**). [Edit the customer group](#edit-a-customer-groups-rules), override the rule and save. For the steps, the checkout messages and how to change them, see [Set order limits](https://docs.sparklayer.io/help/storefront/quantity-rules.md#order-limit-rules).A minimum, maximum or pack size for one product isn't a group rule: it's a [quantity rule](https://docs.sparklayer.io/help/storefront/quantity-rules.md) set on the product, and can differ by group with [product settings](https://docs.sparklayer.io/help/storefront/quantity-rules.md#set-different-rules-for-each-customer-group).## Add customers to the groupEach customer belongs to one group. You add them in your eCommerce platform: on Shopify, with the `b2b` tag plus the group's tag, such as `b2b-trade`. Or [invite them](https://docs.sparklayer.io/help/customers/invite-buyers.md) and choose the group. For the steps on each platform, how to check a customer has synced and how to test as one, see [Add customers to a group](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md).## Optional rulesThese rules are optional. Each one follows the Base group until you override it. Most groups only need price lists, payment methods and perhaps an order limit.### Allow customers to edit addressesAddress management controls whether customers can manage their own address book in the [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md) and [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) interfaces.1) [Edit the customer group](#edit-a-customer-groups-rules) and override **Address management** (on the Base group, it's already customized). 2) Tick or untick the settings below, then click **Save**.| Setting | What it does | | --- | --- | | **Allow address editing in My Account** | "Buyers can add or edit their addresses." | | **Allow buyers to add and edit billing addresses** | "Buyers can set a default billing address." Untick it to stop billing address changes while still allowing shipping address changes. |If addresses are synced to SparkLayer from another system, such as an ERP, the sync may overwrite changes your customers make. [Contact us](https://docs.sparklayer.io/help/support.md) if you're unsure.### Block orders over the credit limitThe **Credit settings** rule decides what happens when a customer paying on account would go over their [credit limit](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md). By default, **Checkout blocked if limit exceeded**. To let a group order over its limit, override **Credit settings**, click **Configure** and turn off **Prevent placing an order if exceeding credit limit**. See [Let customers order over their credit limit](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md#let-customers-order-over-their-credit-limit).### Show stock levelsThe **Stock display** rule decides what a group's customers see about stock: availability, pre-order messages and, if you want, the number of units. By default, availability and pre-order messages are on and unit counts are off. To change it for every customer, edit the Base group. For the settings and what customers see, see [Show stock levels to customers](https://docs.sparklayer.io/help/storefront/stock-display.md#show-stock-levels-to-customers).### Set a stock locationStock location (also called inventory location) shows a customer group the stock from one location, such as the warehouse that serves their region. For example, with warehouses in London, Paris, Toronto and Madrid, you can show your Canada group the stock held in Toronto. Stock locations need the Growth plan or above.1) Turn on **Multi-location stock** at **Settings > Configurations > Ordering** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Ordering** in the Shopify app ("Choose which inventory locations customers can buy stock from."). Until it's on, the rule shows **The stock location feature isn't on**. 2) [Edit the customer group](#edit-a-customer-groups-rules), override **Stock location** and click **Configure**. 3) Select the location the group should use, then save.Things to know:* If you don't choose a location, customers see combined stock from all your locations. * Stock locations only affect the stock **shown** to customers. They don't change which location your platform uses to fulfil the order.Your platform needs some setup too:**Shopify:** SparkLayer syncs your active Shopify locations automatically. Set them up in Shopify first (see Shopify's guide to [locations](https://help.shopify.com/en/manual/locations)): 1. In your Shopify admin, go to **Settings > Locations** ([open in the Shopify admin](https://admin.shopify.com/settings/locations)) and check the locations you want to use for B2B customers are active. 2. Open each of those locations and, under **Fulfillment details**, tick **Fulfill online orders from this location**. 3. Optionally, review how Shopify chooses a location for each order at **Settings > Shipping and delivery > Order routing** ([open in the Shopify admin](https://admin.shopify.com/settings/shipping/order_routing)). Routing rules (such as **Minimize split fulfillments** or **Ship from the closest location**) run from top to bottom. If you run retail and B2B from the same store (a [hybrid store](https://docs.sparklayer.io/help/glossary.md#hybrid-store)): - Signed-in B2B customers can buy up to the stock held at their group's location. For example, if their group uses **London Warehouse** and it has 100 of product A, they can order up to 100. - Assigning a location to B2B customers doesn't stop retail customers buying the same stock, depending on how your Shopify store is set up. To hold stock back, see reserving stock and minimum stock levels in [Stock display](https://docs.sparklayer.io/help/storefront/stock-display.md). **Other platforms:** Stock locations and their stock levels are managed through the [Stock API](https://docs.sparklayer.io/developers/api/stock.md).### Let customers request quotesIf you use the [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md), the **Quoting engine** rule decides whether a group can request quotes. By default, **Buyers can request quotes**. Quotes are included on Pro and Enterprise, and are an add-on on Starter and Growth. See [Choose which customer groups can request quotes](https://docs.sparklayer.io/help/ordering/quoting.md#choose-which-customer-groups-can-request-quotes).### Disable checkoutTo stop a group checking out, override **Checkout access** and click **Configure**. By default, every customer group can check out once their order meets your rules (**Checkout is enabled**). A common use is with the [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md): turn off checkout so the group can only submit a quote.### Allow recurring ordersThe **Recurring orders** rule decides whether a group's buyers can set orders to repeat on a schedule.1) Turn on **Recurring orders** at **Settings > Configurations > Ordering** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Ordering** in the Shopify app ("Customers can set orders to repeat on a schedule."). Until then, the rule shows **The recurring orders feature isn't on**. 2) [Edit the customer group](#edit-a-customer-groups-rules), override **Recurring orders** and click **Configure**.## Delete a customer groupYou can't delete a customer group while it still has customers. Move them to another group first, for example the Base customer group, by changing their tags in your platform. See [Add customers to a group](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#assign-customers-to-a-customer-group). On Shopify, **View customers** on the group's page lists everyone with its tag.Once the group is empty:1) Open the group. 2) Click **More actions**, then **Delete group**. 3) Click **Delete group** to confirm.This can't be undone. You can't delete the Base customer group.Moving a customer to another group doesn't remove them from SparkLayer. To remove customers altogether, see [Remove a customer from B2B](https://docs.sparklayer.io/help/customers/managing-customers.md#remove-a-customer-from-b2b).## FAQs and troubleshootingIf a customer sees the wrong prices, payment methods or shipping, check their tags and group first: see [Add customers to a group](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#troubleshooting).**Can a customer be in more than one customer group?** No. Each customer belongs to one customer group. To give a customer prices from several price lists, assign several lists to their group, or give the customer their own in [Prices for one customer](https://docs.sparklayer.io/help/pricing/customer-pricing.md). See [Add customers to a group](https://docs.sparklayer.io/help/customers/add-customers-to-a-group.md#assign-customers-to-a-customer-group). **Can a group inherit from a group other than Base?** No. Every group inherits from the Base customer group. Rules you override on a group apply to that group only. **Why can't I delete a customer group?** A group can't be deleted while it still has customers. Move them to another group, such as Base, then delete it. See [Delete a customer group](#delete-a-customer-group). **Why didn't a group change when I changed the Base group?** The other group overrides that rule, so it no longer inherits it. Open the group and click **Reset** on the rule to follow the Base group again. **Which price is used when a SKU is in several price lists?** The first price list, in the order shown on the group, that contains the SKU. See [Which price list wins](https://docs.sparklayer.io/help/pricing/managing-pricing.md#price-list-order). **Do order limits include tax?** No. Order total limits use net prices, before tax, unless you show [tax-inclusive prices](https://docs.sparklayer.io/help/pricing/pricing-display.md#show-tax-inclusive-prices). See [Set order limits](https://docs.sparklayer.io/help/storefront/quantity-rules.md#order-limit-rules). **Does a stock location change where orders are fulfilled from?** No. It only changes the stock customers see. Your platform's own settings, such as Shopify order routing, decide where orders are fulfilled from. --- # Add customers to a group URL: https://docs.sparklayer.io/help/customers/add-customers-to-a-group Put B2B customers in the right customer group with a tag or label in your eCommerce platform, check they've synced, then sign in as one to test. > **Quick summary** > > - Each B2B customer belongs to one [customer group](https://docs.sparklayer.io/help/customers/customer-groups.md), which sets their prices, payment methods and ordering rules. > - You add customers to a group in your eCommerce platform. On Shopify, tag them `b2b` plus the group's tag, for example `b2b-trade`. Or [invite them](https://docs.sparklayer.io/help/customers/invite-buyers.md) from **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app and choose the group. > - Check SparkLayer has matched them to the right group at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app, then sign in as a test customer to see what they'll see. > - Works on every plan. On Shopify, new customers can also [apply for a trade account](https://docs.sparklayer.io/help/guides/approve-trade-applications.md) for you to approve. ## Ways to add customers | If you're adding | Do this | | --- | --- | | **One customer**, or moving one to another group | Change their tags or labels in your platform. See [Add a customer to a group](#assign-customers-to-a-customer-group). | | **Your existing trade customers**, all at once (Shopify) | Follow [Move your existing wholesale customers onto SparkLayer](https://docs.sparklayer.io/help/guides/move-existing-customers.md): tag them in bulk, bring across their terms, then ask them to sign in. | | **New customers who apply** for a trade account (Shopify) | Follow [Let new trade customers apply, and approve them](https://docs.sparklayer.io/help/guides/approve-trade-applications.md). Approving an application creates the customer in the group you choose. | | **A new buyer you invite** | [Invite them](https://docs.sparklayer.io/help/customers/invite-buyers.md) and choose the group. SparkLayer adds them to Shopify with the group's tag for you. | ## Add a customer to a group A customer can belong to only one customer group. To give a customer more than one price list, [assign several price lists](https://docs.sparklayer.io/help/customers/customer-groups.md#assign-price-lists) to their group, or [give the customer their own](https://docs.sparklayer.io/help/pricing/customer-pricing.md). If different customers need different mixes of price lists, create one group for each combination, for example **Trade** with the Trade list, and **Trade and clearance** with the Trade and Clearance lists. To add a customer to a group, if they already have an account, or to move them to another group, change their tags or labels in your platform: **Shopify:** SparkLayer uses Shopify **customer tags**. When a tagged customer signs in to your store, they see their group's prices, payment methods and rules. - **Every B2B customer has the `b2b` tag**, even if they're also in another group. - **Other groups need their own tag as well.** You'll find it under the group's name at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app, for example "Tag: b2b-trade". - **You can't swap `b2b` for your own tag**, such as `trade-approved`. SparkLayer only recognises `b2b` plus the group's tag. - **Copy the group's tag exactly**, as it shows under the group's name. A tag that's nearly right, such as one with part of the prefix missing, matches no group and leaves the customer in Base. - **No more than two B2B tags per customer.** `b2b` and `b2b-trade` is correct; `b2b`, `b2b-trade` and `b2b-vip` is not. To tag a customer: 1. In your Shopify admin, go to **Customers** ([open in the Shopify admin](https://admin.shopify.com/customers)) and open the customer. 2. In the **Tags** box, type `b2b` and choose it, or add it as a new tag. 3. To add them to another group, also add its tag, for example `b2b-trade`. If the tag doesn't exist yet, create it as a new tag and you can reuse it for other customers. 4. Save the customer. To tag many customers at once, or add a new customer from scratch, see [Add B2B customers on Shopify](https://docs.sparklayer.io/help/platforms/shopify/invite-customers.md). People at a [company](https://docs.sparklayer.io/help/customers/companies.md) get the customer group set on the company or their [location](https://docs.sparklayer.io/help/customers/company-locations.md) . **Wix:** SparkLayer uses Wix contact **labels**. It only syncs contacts that have the `b2b` label and are **Site Members**. 1. In your Wix dashboard, go to **Customers & Leads > Contacts** and create or edit a contact. 2. Add a valid address and fill in every address field. Note the email address: the customer uses it to sign in. 3. Click **Add Label** and add `b2b`. For a group other than Base, also add that group's label exactly as shown at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app, for example `b2b-additional-group`. 4. Check the contact is a **Site Member** (shown under **Member info**), so they can sign in to your store. Don't edit a label after you've added it. Once at least one contact has a group's label, you can manage that group's rules at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app. **Other platforms:** | Platform | How customers join a group | | --- | --- | | BigCommerce | SparkLayer syncs your BigCommerce customer groups whose names start with `B2B`, once at least one customer is in them. Assign customers to those groups in BigCommerce. See [Install on BigCommerce](https://docs.sparklayer.io/help/platforms/bigcommerce/install.md). | | WooCommerce | Give the WordPress user a **SparkLayer Role** that matches the group, such as "SparkLayer B2B: Base". See [Install on WooCommerce](https://docs.sparklayer.io/help/platforms/woocommerce/install.md). | | Magento | SparkLayer creates a Magento customer group, prefixed "B2B", for each group you create. Assign customers to it in Magento. See [Install on Magento](https://docs.sparklayer.io/help/platforms/magento/install.md). | Moving a customer to another group doesn't remove them from SparkLayer. To remove customers altogether, see [Remove a customer from B2B](https://docs.sparklayer.io/help/customers/managing-customers.md#remove-a-customer-from-b2b). ## Check a customer has synced To check SparkLayer has picked up a customer in the right group, find them at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app. The **Group** column shows the customer group they've been matched to. Open them to see more. See [Find and manage customers](https://docs.sparklayer.io/help/customers/managing-customers.md). If a customer is missing, check the sync banner at the top of Customers and click **Show errors**: see [Fix customer sync errors](https://docs.sparklayer.io/help/customers/managing-customers.md#fix-customer-sync-errors). ## Test as a B2B customer Before your customers start ordering, place a test order as a B2B customer and check their group's rules. **Shopify only:** In the Shopify app, [Try it out](https://docs.sparklayer.io/help/get-started/launching.md#place-a-test-order) does this for you: it creates a test customer with the `b2b` tag, gives them a price list and opens your store signed in as them. - **Prices** match the group's price lists. - **Payment methods** at checkout are the ones the group allows. - **Order limits** stop checkout when the order is below the minimum or above the maximum. To test by hand: **Shopify:** **Step 1.** **Turn on customer accounts** In your Shopify admin, go to **Settings > Customer accounts** ([open in the Shopify admin](https://admin.shopify.com/settings/customer_accounts)) and choose either **Customer accounts** or **Legacy accounts**. Both work with SparkLayer. **Step 2.** **Add a test customer** In Shopify, go to **Customers** ([open in the Shopify admin](https://admin.shopify.com/customers)), open or add a customer with an email you can sign in to, fill in every field **including the address**, and add the `b2b` tag plus the group's tag. Or [invite a buyer](https://docs.sparklayer.io/help/customers/invite-buyers.md) with an email you can sign in to, and choose the group you're testing. **Step 3.** **Sign in as the customer** Go to your store's login page (for example `www.yourstore.com/account`) and sign in. With Customer accounts, enter the code sent to your email. With Legacy accounts, activate the account from the invite email first. SparkLayer loads and you can browse as a B2B customer. If the login page doesn't load, check customer accounts are turned on. **Other platforms:** Create a test customer in your platform, add them to a B2B group as described in [Add a customer to a group](#assign-customers-to-a-customer-group), then sign in to your store as them. See your platform's install guide under [Platforms](https://docs.sparklayer.io/help/platforms.md) for details. ## Troubleshooting and FAQs A customer seeing the wrong prices, payment methods or shipping usually comes down to their tags or their group. **Diagnose: Wrong prices, payment methods or shipping for a customer?** Check the customer’s tags and customer group. 1. **What is the customer seeing?** Pick the closest match. - Wrong prices: go to question 2 - Wrong payment methods: go to question 2 - Wrong shipping options: go to question 2 2. **Are you checking while signed in as the customer?** B2B prices, payment methods and shipping only apply once a B2B customer signs in. - Yes: go to question 3 - No / not sure: go to fix A (Sign in as the customer first) 3. **Does the customer have the `b2b` tag?** Check the spelling exactly, with no extra spaces or characters. Where to look: Customers > select the customer > Tags (Shopify admin). - Yes: go to question 4 - No: go to fix B (Add the `b2b` tag) 4. **Should they be in a customer group other than Base?** Customers with only the `b2b` tag are in the Base customer group. - Yes: go to question 5 - No, Base is right: go to question 6 5. **Does the customer have that group’s tag, spelt exactly as it is on the group?** Each group shows its Shopify tag. It’s usually `b2b-` followed by the group’s handle, for example `b2b-vip`. Where to look: Customers > Groups (SparkLayer). - Yes: go to question 7 - No: go to fix C (Fix the group tag) 6. **Are the price lists / payment methods / shipping set up on that customer group?** Open the group and check its settings. Where to look: Customers > Groups (SparkLayer). - Yes: go to question 8 for prices; fix D (Tags look right: check plan and terms) for payments; fix E (Tags look right: check your shipping setup) for shipping - No: go to fix F (Set them up on the group) 7. **Does the customer have only `b2b` and that one group tag?** Look for older group tags left over from a previous setup. A customer can only be in one group. Where to look: Customers > select the customer > Tags (Shopify admin). - Yes: go to question 6 - No, there are others: go to fix G (Remove the extra tags) 8. **Is the product in more than one of the group’s price lists?** SparkLayer uses the first price list on the group that contains the SKU. An automatic list covers every product, so if it’s first it always wins. Where to look: Customers > Groups (SparkLayer). - Yes: go to fix H (Put the most specific price list first) - No / not sure: go to fix I (Tags look right: check the price itself) **Fixes** - **A. Sign in as the customer first** Signed-out visitors see retail prices and checkout. Sign in as the customer, or use Place a test order, and check again. Where: Orders > Place a test order (SparkLayer). - **B. Add the `b2b` tag** Without it the customer shops as retail, with retail prices and checkout. Add the tag and save. Where: Customers > select the customer > Tags (Shopify admin). - **C. Fix the group tag** A tag that doesn’t match a group is ignored, and the customer gets Base settings. Copy the tag from the group and add it to the customer. If the group doesn’t exist yet, create it. Where: Customers > Groups (SparkLayer). - **D. Tags look right: check plan and terms** Some payment methods depend on your plan, and Pay on Account needs the customer’s credit limit and terms set. See [Payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md). - **E. Tags look right: check your shipping setup** The customer is in the right group, so the cause is in your shipping settings. Next: Shipping not working as expected? - **F. Set them up on the group** Add the missing price lists / payment methods / shipping to the customer’s group, save, then sign in as the customer to check. Where: Customers > Groups (SparkLayer). See [Customer groups](https://docs.sparklayer.io/help/customers/customer-groups.md). - **G. Remove the extra tags** SparkLayer only uses `b2b` and one customer group tag. Extra B2B or group tags can put the customer in the wrong group. Remove the ones you don’t need, save, and ask them to sign out and back in. Where: Customers > select the customer > Tags (Shopify admin). - **H. Put the most specific price list first** The first list on the group that contains the SKU sets its price. Move your specific lists above any automatic list, and save. Where: Customers > Groups (SparkLayer). See [Price list order](https://docs.sparklayer.io/help/pricing/managing-pricing.md#price-list-order). - **I. Tags look right: check the price itself** The customer is in the right group, so the difference is coming from the price list or your tax settings. Next: Prices or tax looking wrong? **Can a customer be in more than one customer group?** No. Each customer belongs to one customer group. If you need a customer to see prices from several price lists, assign several price lists to their group, or give the customer their own price lists in [Prices for one customer](https://docs.sparklayer.io/help/pricing/customer-pricing.md). If customers need different mixes of price lists, create one group for each combination. **What happens if a customer has no group tag?** They're in the [Base customer group](https://docs.sparklayer.io/help/customers/customer-groups.md#the-base-customer-group), as long as they have the `b2b` tag (or your platform's equivalent). Without it, they aren't a B2B customer and see your retail store. --- # Company users URL: https://docs.sparklayer.io/help/customers/company-users Let B2B customers invite colleagues to one company account to share orders, shopping lists and addresses, with Limited users whose orders need approval. > **Quick summary** > > - Company users (also called sub-accounts or company roles) let a B2B customer invite colleagues to their company account. Everyone shares the company's orders, shopping lists and addresses, and orders at the same prices. > - It's on by default. Turn it on or off with **Company users** at **Settings > Configurations > Ordering** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Ordering** in the Shopify app. Customers invite colleagues from the **Company Users** section of My Account. > - Invited users are **Standard** (can place orders) or **Limited** (orders go to the main user for approval). Company users are on every plan; order approval workflows need the Growth plan or above. > - On BigCommerce, WooCommerce and Magento, invited users don't receive a confirmation email. See [Compare platforms](https://docs.sparklayer.io/help/platforms/compare.md). ## How it works The customer who sends the invitations becomes the **main user** (the account owner, or admin). They decide who has access to the company account, and approve orders from limited users. Each user they invite signs in with their own email address, but orders on the company's account at the main user's prices. How company users join an account: 1. **Turn it on**: Company users is on in Settings > Configurations 2. **Main user invites**: A B2B customer invites a colleague from My Account and picks a role 3. **Colleague signs in**: They activate their account, or sign in with an existing one 4. **Shared account**: Everyone sees the company's orders, shopping lists and addresses Users of the same company share most of the account: | Area | Shared? | | --- | --- | | **Order history** | Yes. Users see every order placed for the company, can check its status and re-order. | | **Shopping lists** | Yes. Users can view and delete the company's shopping lists. | | **Address book** | Yes. Users can view, edit and delete all the company's addresses. | | **Shopping cart** | No. Items in one user's order aren't shared with other users. | Company users can be used alongside [sales agent ordering](https://docs.sparklayer.io/help/sales-ordering.md): a sales agent can add users to a customer's company in the same way a main user does. In the app, each person's role shows in the **Access** column at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app: **Standard** or **Limited**. Open a customer to see everyone at their company under **Company users**. **Shopify only:** On Shopify, a [company](https://docs.sparklayer.io/help/customers/companies.md) also has **Admins**, who can invite people and manage its locations. Each [location](https://docs.sparklayer.io/help/customers/company-locations.md#people-and-location-roles) also gives its people a role of its own. ## Turn on company users Company users is on by default. To check it, or turn it off: 1. Go to **Settings > Configurations > Ordering** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Ordering** in the Shopify app. 2. Turn **Company users** on or off ("Customers can create teams that share orders, shopping lists and addresses."). 3. Click **Save** in the bar at the top of the page. When it's on, a **Company Users** section appears at the bottom of the [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md) for every B2B customer. You can't turn it on for some customers only. ## Roles Each company user has a role, which decides whether they can place orders themselves. The main user chooses it under **User role** when they invite someone. | Role | What the user can do | | --- | --- | | **Standard** | Place orders and see all activity in the shared company account. | | **Limited** | Add items to an order but not complete it. Their orders are sent to the main user for approval. | ## Invite a company user Customers invite colleagues from your store, not from the SparkLayer app. You may want to explain these steps to your customers when you launch the feature. 1. In My Account, go to the **Company Users** section and click **Invite new user**. 2. Enter the colleague's **First Name**, **Last Name** and **Email**. They'll sign in with this email address. 3. Under **User role**, choose **Standard** or **Limited** (see [Roles](#roles)). 4. Click **Create Company User**. What happens next depends on whether the person already has an account on your store: | Account status | What happens | | --- | --- | | No account | They're emailed an invitation to set a password, which activates their account and adds them to the company. | | Has an account | They sign in with their existing details to join the company. | | Already a B2B customer | They can't be invited as a company user. Link them to the company manually instead: see [Link users to a company manually](#link-users-to-a-company-manually). | **Shopify only:** On Shopify, the invitation is Shopify's **Activate account** email ("Activate your account"), which you can edit at **Settings > Notifications** ([open in the Shopify admin](https://admin.shopify.com/settings/notifications)). You can't send a custom SparkLayer email instead. **BigCommerce and WooCommerce and Magento only:** On BigCommerce, WooCommerce and Magento, invited users don't receive a confirmation email. Tell them the email address they've been invited with and ask them to use "Forgot password" to set a password. ## Sign in as a company user An invited user sees the [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md) as usual. A message at the top says "You're signed into a Company User account", and explains that activity is shared across the company. Under **My Details**, the **Company** shows the company name and the account owner, for example "SparkLayer (Your company account owner is Bob Jones)". They browse and order at the prices set for the main user in [Pricing](https://docs.sparklayer.io/help/pricing.md). They check out in the [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) with the same addresses, shipping methods and payment methods. ### How company user orders arrive in Shopify **Shopify only:** Orders are saved to the main user's account. By default, they arrive in Shopify as **draft orders**, with the customer's details on the right. The email of the user who placed the order is under **Additional details**, in the **Company User Email** field. | Payment method | What happens | | --- | --- | | **Pay by Invoice** | A draft order is created for you to process. It stays a draft until payment is made. | | **Pay on Account** | A draft order is created for you to process. It stays a draft until payment is made. | | **Pay Online by Card** | A draft order is created and the customer is emailed to pay. It stays a draft until they do. | | **Request for Quote** | A draft order is created for you to process. It stays a draft until payment is made. | When the customer needs to pay, Shopify emails them their order with a **Complete your purchase** button. This uses the "Send invoice" feature of draft orders: see Shopify's guide to [sharing a checkout link](https://help.shopify.com/en/manual/orders/create-orders#share-checkout-link-with-customers). Once they pay, the order appears in your Shopify orders as paid. To change the email, edit the **Draft order invoice** template at **Settings > Notifications** ([open in the Shopify admin](https://admin.shopify.com/settings/notifications)). If the customer hasn't paid, or you take payment another way, open the draft order in Shopify and click **Resend invoice**, or use **Collect payment** to mark it as paid. ## Approve orders from limited users A limited user's orders wait for the main user to approve them before they reach you. ### What a limited user sees When a limited user checks out, they see "This order needs to be reviewed". They submit the order with **Submit Order** instead of paying. SparkLayer holds it as a pending order, so you won't see it in your platform yet. Once the main user approves it, it becomes a normal order that you review, complete and fulfil as usual. How an order from a limited user is approved: 1. **Limited user submits**: The order is saved for review with a P# reference 2. **Main user is emailed**: They open the order from the email or from My Account 3. **Complete or cancel**: Complete Order checks it out; Cancel Order removes it 4. **Limited user is told**: They get an email when the order is approved or changed ### Review orders as the main user Orders waiting for approval appear in the main user's My Account under **Recent Activity**, on the **Requires approval** tab, with the status **Requires Approval**. Their reference starts with `P#` (for example `P#1264`), which sets them apart from other orders. To change it, use **Purchase ID prefix** and **Purchase ID postfix** at **Settings > Configurations > Store** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Store** in the Shopify app. See [Settings](https://docs.sparklayer.io/help/dashboard/settings.md). The main user opens the order and, from the **Actions** menu, chooses: | Action | What it does | | --- | --- | | **Complete Order** | Loads the order into a new cart so the main user can check out and place it. | | **Cancel Order** | Cancels the order and removes it from the **Requires approval** list. | SparkLayer sends emails at each stage, so neither user needs to be signed in to keep track: | Email to | Sent when | What it contains | | --- | --- | --- | | **Main user** | A limited user submits an order. | Who placed it, a summary of up to five items with the totals, shipping method and address, and a **Review Order** button. | | **Limited user** | The main user approves or changes their order. | An update on the order's status. | The store name at the top of these emails comes from your eCommerce platform. To change it, edit **Store details** at **Settings > Configurations > Store** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Store** in the Shopify app: see [Settings](https://docs.sparklayer.io/help/dashboard/settings.md). ## Remove a company user The main user removes a colleague from My Account: 1. Open the **Company Users** section. 2. Click the bin icon next to the user. They lose access to the company. ## Link users to a company manually You can add a customer to a company yourself, for example when the person is already a B2B customer and can't be invited. **Shopify:** You link a customer by setting customer metafields in Shopify. SparkLayer can add the metafield definitions for you: go to **Integrations > Platform** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform** in the Shopify app and, on the **Metafields** card, click **Configure**. Or add them yourself at **Settings > Metafields and metaobjects > Customers** ([open in the Shopify admin](https://admin.shopify.com/settings/custom_data/customer/metafields)). See [Shopify metafields and data mapping](https://docs.sparklayer.io/help/platforms/shopify/metafields.md). 1. Find the main user's customer ID. Open them in your Shopify admin: the ID is the number at the end of the page address. For example, in `https://your-shopify-store-url.com/admin/customers/6494756339930` the ID is `6494756339930`. 2. Open the customer you want to link and, under **Metafields**, set `parent_customer_id` to the main user's ID. 3. Optionally, set their role with the `role` metafield. 4. Give them the same B2B tags as the main user. For example, if the main user has `b2b` and `b2b-company-1`, add both. **Lots of customers? Fill them in one table (Shopify):** in your Shopify admin, go to **Customers**, tick the customers and click **Edit customers**. Click **Columns**, tick the SparkLayer field under **Metafields**, type the values and click **Save**. See [Shopify's guide](https://help.shopify.com/en/manual/custom-data/metafields/bulk-edit-metafields). | Metafield | Type | Namespace and key | Value | | --- | --- | --- | --- | | Parent customer | Single line text | `sparklayer.parent_customer_id` | The main user's customer ID. | | Role | Single line text | `sparklayer.role` | `main` for Standard, or `limited-customer` for Limited. | **Other platforms:** See the [developer docs](https://docs.sparklayer.io/developers.md) and [Metafields](https://docs.sparklayer.io/developers/data/metafields.md) for how to link customers on your platform. ## Customise the text You can change the wording of the Company Users section by adding translations to your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting). This is a code change, so it's usually done by your developer or agency. See [Languages and international](https://docs.sparklayer.io/help/storefront/languages-and-international.md). **Code for your developer** ```javascript title="Core Script" translations: { en: { "account.main.company-users.actions": "Actions", "account.main.company-users.title": "You're signed into a Company User account", "account.main.company-users.child-account-notice": "Any activity will be shared across all users from your company. This applies to orders, shopping lists, and addresses. Please speak to your company account owner if you have any queries.", "account.main.company-users.email": "Email", "account.main.company-users.delete-confirm-message": "Are you sure you want to remove this user from your company?", "account.main.company-users.delete-failed-message": "Failed to delete user.", "account.main.company-users.header": "Company Users", "account.main.company-users.invite-button-text": "Invite new user", "account.main.company-users.invite-user.header": "Invite new user", "account.main.company-users.invite-user.invite-sent": "User invite sent", "account.main.company-users.invite-user.invite-failed": "Sorry, something has gone wrong and we have not been able to invited this user", "account.main.company-users.invite-user.form.first-name": "First Name", "account.main.company-users.invite-user.form.last-name": "Last Name", "account.main.company-users.invite-user.form.email": "Email", "account.main.company-users.invite-user.form.send-invite": "Create Company User", "account.main.company-users.invite-user.form.cancel": "Cancel", "account.main.company-users.invite-user.form.description": "When you invite company users, any activity will be shared across your team including orders, shopping lists, and addresses. If the user you're inviting doesn't already have an account to login to our store, they'll receive an Account Activation email and they'll be asked to set a password to gain access. If they already have an account, they can login with their existing details by visiting the login page. If you're unsure about inviting users, please speak to your contact within our company." } }, ``` ## Limitations - **Invitation emails:** on Shopify, invited users receive Shopify's "Activate Account" email. You can't create a custom email for this. - **All customers:** once company users is turned on, every B2B customer can invite users. You can't choose which customers have it. ## FAQs **Do company users see the same prices as the main user?** Yes. They order at the prices set up for the main user. **Can I see who placed an order?** Yes. On Shopify, the user's email is in the **Company User Email** field under **Additional details** on the order. **Why can't I see an order from a limited user?** It's waiting for the main user's approval and only reaches your platform once they complete it. **What if someone can't be invited because they're already a B2B customer?** Link them to the company with metafields instead: see [Link users to a company manually](#link-users-to-a-company-manually). --- # Customise My Account URL: https://docs.sparklayer.io/help/customers/account-and-addresses Customise the SparkLayer My Account area: add custom My Details fields, rename order statuses, control address editing, show tracking and set login redirects. > **Quick summary** > > - The [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md) is where B2B customers see their details, orders and addresses. This page covers the settings that change what it shows and how it behaves. > - Address editing is set per customer group, under **Address management** at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app. Order tracking details come from your eCommerce platform when you fulfil an order. > - Most other options, such as custom fields and order status names, are set in your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting) or, on Shopify, with customer metafields. Your developer or agency usually does these. See [For developers](#for-developers). > - Available on every plan. ## How it works My Account brings together a customer's **My Details**, **Recent Activity** (orders, quotes and their statuses), **Shopping Lists**, **Address Book** and, if turned on, **Company Users**. Its data comes from your eCommerce platform. For example, on Shopify, tracking numbers you add when fulfilling an order appear on the customer's order details. You change My Account in three ways: | Where | Used for | | --- | --- | | The SparkLayer app | [Address editing](#allow-address-editing) per customer group, and [payment status](#show-payment-status) at **Settings > Configurations** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations** in the Shopify app. | | Core Script | [Custom My Details fields](#add-custom-fields-to-my-details), [order status names](#rename-order-statuses), the [shipping address summary](#show-the-shipping-address-on-orders) and the [account redirect](#change-where-customers-go-after-signing-in). See [Frontend integration](https://docs.sparklayer.io/developers/frontend.md). | | Your platform | [Tracking details](#show-order-tracking-details), [custom order IDs](#show-a-custom-order-id) and [advanced account settings](#advanced-account-settings) such as accounting IDs. | ## Allow address editing Address editing is on by default. Customers manage their own address book in My Account: they click **Add new address** to add one, or use the icons next to an address to edit or delete it. To change it, edit the customer group's **Address management** settings at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app. You can turn off address editing completely. Or you can stop customers adding and changing billing addresses only, and still let them manage other addresses. See [Allow customers to edit addresses](https://docs.sparklayer.io/help/customers/customer-groups.md#allow-customers-to-edit-addresses). | Setting in **Address management** | What it does | | --- | --- | | **Allow address editing in My Account** | Buyers can add or edit their addresses. | | **Allow buyers to add and edit billing addresses** | Buyers can set a default billing address. | **Shopify only:** On Shopify, people ordering for a [company location](https://docs.sparklayer.io/help/customers/company-locations.md) use that location's address instead. ## Show order tracking details Customers see tracking details on an order's details page, including for orders shipped in parts. They see a **Track shipment** link, the carrier and the tracking number. **Shopify:** When you fulfil an order in Shopify, enter the **Tracking number** and **Shipping carrier** under **Tracking information (optional)**. A third-party app can do this for you automatically. The details then appear in My Account. **Other platforms:** See the [developer docs](https://docs.sparklayer.io/developers.md). ## Show payment status Alongside the order status, customers can see a **Payment** column showing whether each order is **Paid** or **Unpaid**. It's on by default. Turn it on or off with **Payments visibility** at **Settings > Configurations > Ordering** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Ordering** in the Shopify app ("Show the payment status of orders in the My Account area."). See [Payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md). ## Change where customers go after signing in When a signed-in B2B customer opens your store's own account page (for example `/account`), SparkLayer sends them to the SparkLayer My Account interface. You can send them somewhere else instead, such as a collection page. **Shopify only:** On Shopify with customer accounts (new accounts), you can do this without code: 1. In your Shopify admin, go to **Settings > Checkout** ([open in the Shopify admin](https://admin.shopify.com/settings/checkout)). 2. Under **Configurations**, click **Customize**. 3. Go to the **Orders** page, click **Apps** and turn on the **B2B Account Redirect** extension. 4. Optionally, add placeholder text to show customers while they're redirected, and the URL to send them to, such as a collection or landing page. On any platform, including Shopify with legacy (classic) customer accounts, your developer or agency can add an `accountRedirect` to your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting) instead. **Code for your developer** ```javascript title="Core Script" accountRedirect: { urlRegex: /\/account/g, goTo: "/index", // page to redirect logged in users to }, ``` **Shopify only:** **Different pages for different customer groups (Shopify legacy accounts)** With Shopify's legacy (classic) customer accounts, you can send each customer group to its own page, for example group ABC to `/collections/wholesale-page` and group XYZ to `/collections/wholesale-vip`. Replace the code above with Liquid code like this and change the tags and pages to suit: ```javascript title="Core Script" accountRedirect: { urlRegex: /\/account/g, {% assign goTo = "/index" %} {% for tag in customer.tags %} {% if tag == "b2b-group-1" %} {% assign goTo = "/collections/wholesale-page" %} {% elsif tag == "b2b-group-2" %} {% assign goTo = "/collections/another-wholesale-page" %} {% endif %} {% endfor %} goTo: {{ goTo | json }}, }, ``` ## Other My Account features These features also show in My Account, and have their own guides: | Feature | What it does | See | | --- | --- | --- | | Account credit and balances | Shows the customer's credit, balance and payment terms. | [Credit limits and net terms](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md) | | Timeline and communications | Brings messages, internal notes, order events and email notifications for orders and [quotes](https://docs.sparklayer.io/help/ordering/quoting.md) into one place on the order details page. | [Order timeline and messages](https://docs.sparklayer.io/help/customers/timeline.md) | | Links straight to an order | Takes a customer straight to an order's or quote's details from a link. | [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md) | | Invoices on orders | Attaches invoices, such as PDFs, to a customer's orders. | [Credit limits and net terms](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md) | | Imported and manual orders | Shows orders created outside the SparkLayer checkout, such as Shopify admin draft orders or imported history, in the customer's order history (Shopify). | [Show imported or manual orders in My Account](https://docs.sparklayer.io/help/guides/show-imported-orders.md) | ## For developers The settings in this section are made in your SparkLayer [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting), or with metafields (extra fields on a customer or order record in your store). Your developer or agency usually makes them. ### Add custom fields to My Details The **My Details** section shows the customer's email address, name, company and financial details, such as their account balance and payment terms. You can add your own fields, such as a website, phone number or account manager's email. Add a `customAccountDetails` list to your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting). It works like [custom checkout fields](https://docs.sparklayer.io/help/ordering/checkout-fields.md). ```javascript title="Core Script" customAccountDetails: [ { title: "Website", value: "{{ customer.metafields.global.company_website }}", type: "website", displayText: "Visit Website", }, { title: "Phone", value: "01234567890", type: "phone", }, { title: "Email", value: "contact@sparklayer.io", type: "email", displayText: "Click to email", }, { title: "Some normal text", value: "This is a normal value with no formatting", }, ], ``` | Key | What it does | | --- | --- | | `title` | The label the customer sees, for example "Website". | | `value` | The value. Set it directly or generate it, for example from a metafield or setting. | | `type` | Optional. Turns the value into a link: `email` makes a `mailto:` link, `phone` makes a `tel:` link and `website` makes a link to the value. | | `displayText` | Optional. Text to show instead of the value, for example `displayText: "Click here"` for a link. | If you use [sales agent ordering](https://docs.sparklayer.io/help/sales-ordering.md), fields based on a customer metafield show the sales agent's value, not the customer's, when an agent is signed in as a customer. ### Rename order statuses My Account shows each order's status, such as **Processing**, **Shipped**, **Part-Shipped**, **Cancelled** or **Requires Review**. See [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md) for what each status means. To change the names, add translations to your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting) (see [Languages and international](https://docs.sparklayer.io/help/storefront/languages-and-international.md)): ```javascript title="Core Script" translations: { en: { "account.order-status.incoming": "Incoming", "account.order-status.returned": "Returned", "account.order-status.cancelled": "Cancelled", "account.order-status.shipped": "Shipped", "account.order-status.part_shipped": "Part-shipped", "account.order-status.part_returned": "Part-returned", "account.order-status.varied": "Varied", "account.order-status.processing": "Processing", "account.order-status.awaiting_approval": "Requires approval", "account.order-status.awaiting_merchant": "Awaiting merchant", "account.order-status.archived": "Archived", } }, ``` ### Show the shipping address on orders To show each order's shipping address under it in the order list, add this to the `display` object in your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting): ```javascript title="Core Script" display: { orderListShowShippingAddress: true, }, ``` ### Show a custom order ID You can replace the order number customers see with your own (a "visible ID"), so order numbers match across your systems. **Shopify only:** On Shopify, this is set with a metafield: see [Shopify metafields and data mapping](https://docs.sparklayer.io/help/platforms/shopify/metafields.md). ### Add custom content with slots Custom slots (or targets) are places in My Account, such as above **Recent Activity**, where you can add your own HTML. See [Custom slots](https://docs.sparklayer.io/help/storefront/interfaces/custom-slots.md). ### Advanced account settings Customer metafields give you finer control over account and address data, for example when a backend system such as an ERP needs specific customer IDs. Each one uses the namespace `sparklayer` with the key below. | Setting | Key | Type | What it does | | --- | --- | --- | --- | | **Accounting ID** | `accounting_id` | Single line text | A unique account ID for the customer, for example from your ERP or accounts package. When set, it's added to the order's metadata in your eCommerce platform. | | **Title** | `title` | Single line text | A title for the customer. | | **Company Name** | `company_name` | Single line text | The customer's company name. | | **Shipping Address ID** | `shipping_address_id` | Single line text | A unique shipping address ID. When set, it's the customer's default shipping address. | | **Billing Address ID** | `billing_address_id` | Single line text | A unique billing address ID. When set, it's the customer's default billing address. | | **Available Shipping Addresses by ID** | `available_shipping_address_ids` | JSON | The shipping addresses the customer can use, by Shopify address ID, as a list. For example `[9840404758756,9840404758756]`. | To add them on Shopify, go to **Settings > Metafields and metaobjects > Customers** ([open in the Shopify admin](https://admin.shopify.com/settings/custom_data/customer/metafields)), as [Shopify metafields](https://docs.sparklayer.io/help/platforms/shopify/metafields.md) describes. On other platforms, see [Metafields](https://docs.sparklayer.io/developers/data/metafields.md). **Lots of customers? Fill them in one table (Shopify):** in your Shopify admin, go to **Customers**, tick the customers and click **Edit customers**. Click **Columns**, tick the SparkLayer field under **Metafields**, type the values and click **Save**. See [Shopify's guide](https://help.shopify.com/en/manual/custom-data/metafields/bulk-edit-metafields). **Build the list of shipping address IDs** Enter each Shopify address ID the customer can use, and copy the value into **Available Shipping Addresses by ID**: ## FAQs **Can I stop customers editing their addresses?** Yes. Turn off address editing in the customer group's **Address management** settings. See [Allow customers to edit addresses](https://docs.sparklayer.io/help/customers/customer-groups.md#allow-customers-to-edit-addresses). **Why does a sales agent see their own value in a custom field?** Custom My Details fields based on a customer metafield show the signed-in account's value. When a sales agent acts as a customer, that's the agent's account. **Where do tracking numbers come from?** From your eCommerce platform. On Shopify, add them when you fulfil the order. --- # Order timeline and messages URL: https://docs.sparklayer.io/help/customers/timeline Turn on the order timeline so customers and sales agents can message each other, keep internal notes and see order events and edits on B2B orders and quotes. > **Quick summary** > > - The timeline is a record on each order's details page, in date order. It holds messages between customers and your sales team, internal notes, order events and edits. > - **Timeline and communications** 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 lets customers and sales agents post messages and internal notes on orders. Quotes always allow messages. An order with entries, such as a payment, shows its timeline either way. > - Available on every plan, and doesn't need the [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md). Sending emails from your own domain needs the Pro or Enterprise plan. ## How it works The timeline appears on the **Order Details** page of the [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md), for customers and sales agents. It covers: - Standard B2B orders - Orders placed by [sales agents](https://docs.sparklayer.io/help/sales-ordering/order-for-a-customer.md), including their draft orders - [Quotes](https://docs.sparklayer.io/help/ordering/quoting.md) Customers and sales agents post messages on the order. When a new message arrives, SparkLayer emails the other side. Sales agents can also save internal notes that customers never see. Order events, such as edits and status changes, are added automatically, so the timeline is a complete audit trail of the order. How a message reaches the other side: 1. **Customer posts a message**: On the order's details page in My Account 2. **Your team is emailed**: The assigned sales agent, or your notification addresses if no agent is assigned 3. **Sales agent replies**: From the order's timeline, or by replying to the email 4. **Customer is emailed**: They sign in to read and reply You can try it on our [B2B demo store](https://demo.sparklayer.io/pages/b2b-login-register). ## Turn on the timeline 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 **Timeline and communications** ("Customers and sales agents can send messages on quotes and orders."). 3. Click **Save** in the bar at the top of the page. The setting controls posting, not whether the timeline shows: - **Quotes** always have the timeline and its message box, whether or not the setting is on. - **Orders** with the setting off still show their timeline when it has entries, such as payments, but customers and sales agents can't post messages or notes on them. ## Post a message or internal note Customers and sales agents post from the order itself. Open an order in My Account and use the message box at the top of the **Timeline**. | Who | Option | What it does | | --- | --- | --- | | Customer | Message box | Sends a message to your sales team. | | Sales agent | **Notify customer** | Sends the message to the customer by email when you click **Send as Email**. | | Sales agent | **Save as internal note** | Saves a note only sales agents can see when you click **Save Note**. Internal notes are highlighted in yellow and never shown to the customer. | ## What the timeline shows The timeline records these entries. Each one shows who made it (for example "Customer" or "Sales Team") and when. | Entry | What it records | | --- | --- | | **Order actions** | The order being created, updated, approved or changing status. | | **Customer messages** | Messages the customer sends from the order. | | **Sales agent messages** | Messages from the assigned sales agent or your team. | | **Internal notes** | Notes saved by sales agents, hidden from the customer. | | **Order edits** | An audit record of changes such as quantities, prices or items. | | **Payments** | Payments made against the order. See [Payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md). | ## Choose who's notified about new messages When a customer posts a message on an order that has no sales agent assigned, SparkLayer emails the addresses you choose here. 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. Under **Email addresses**, enter the addresses to notify. Separate addresses with commas. 4. Click **Save**. **Purchase notifications** decides "Who gets an email when a quote or order updates and nobody is assigned to it." Quotes use the same setting: see [Quote notifications](https://docs.sparklayer.io/help/ordering/quoting.md). ## Emails the timeline sends Only new messages send emails. Other order activity and internal notes don't. | Email | Sent to | When | | --- | --- | --- | | **Buyer message** | The assigned sales agent if there is one, any notification addresses you've added, or a fallback store inbox (your store's email under **Store details**, see [Settings](https://docs.sparklayer.io/help/dashboard/settings.md)) | The customer posts a message on an order. | | **Sales Agent message** | The customer | A sales agent posts a message on an order. | The email shows the message and a **Reply to message** button that opens the order. You can also send customers and agents straight to an order's details with a link: see [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md). To change what the emails say, go to **Settings > Templates** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/theme)), or **SparkLayer Wholesale > Settings > Templates** in the Shopify app. See [Templates](https://docs.sparklayer.io/help/dashboard/settings.md). ### Replies by email When someone replies to a notification email, the reply is added to the order's timeline as a message. It shows the sender's name and email address, and both the customer and your sales team can see it. If the email thread has several replies, only the most recent is added. Images and attachments are removed. ### Send emails from your own domain By default, emails are sent from `no-reply@mail.sparklayer.io`. On the Pro and Enterprise plans, you can send them from your own address, such as `store@mail.yourstore.com`. They then match your brand and are more likely to be delivered. 1. Go to **Settings > Configurations > Store** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Store** in the Shopify app and click **Edit** next to **Custom email domain**. 2. Tick **Use my own domain for SparkLayer emails** ("Emails to and from customers use your domain. Our team helps you verify it."). 3. Enter the **Email user** (the part before the @) and your **Domain**, then click **Save**. Our team then helps you verify the domain. This only changes emails sent by SparkLayer, not emails from your eCommerce platform or other systems. ## FAQs **Which plans include Timeline and communications?** All SparkLayer plans. Sending emails from your own domain needs the Pro or Enterprise plan. **Do I need the Quoting Engine to use the timeline?** No. You can turn on the timeline without the [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md). **Can I turn off the timeline for some customer groups?** No. Once it's turned on, the timeline appears on all supported order types for all customers. **Does other order activity send notifications?** No. Only new messages send emails. **Are internal notes visible to customers?** No. Internal notes are only visible to sales agents, and they don't send an email. **Does this replace Shopify order notes?** **Shopify only:** No. Shopify order notes don't change. The timeline adds a record inside SparkLayer. ## Feedback Tell us what you think of Timeline and communications at [product@sparklayer.io](mailto:product@sparklayer.io). --- # Ordering & checkout URL: https://docs.sparklayer.io/help/ordering Configure how B2B customers build carts, check out, pay and reorder in SparkLayer, from payment methods and net terms to quoting, shipping rules and invoices. > **Quick summary** > > - This section covers the B2B ordering journey, from the cart to the order in your eCommerce platform: checkout fields, payment, credit and net terms, tax and shipping, quotes, invoices and reordering tools. > - Customers order in the SparkLayer [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) on your storefront, and each order is created in your eCommerce platform. > - Most features are on every plan, including net terms and Pay on Account. Intelligent Cart and SparkLayer shipping rates need Starter, Invoices need Growth and Quotes need Pro (or the Quoting Engine add-on on Starter and Growth). See [Plans and features](https://docs.sparklayer.io/help/plans-and-features.md). > - Switch ordering features on at **Settings > Configurations** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations** in the Shopify app, and set up the checkout at **Storefront > Options > Checkout** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Checkout** in the Shopify app. ## How B2B ordering works The B2B ordering journey: 1. **Cart**: The customer adds products, from search, shopping lists, Favourites or Intelligent Cart. 2. **Checkout**: They choose a shipping address, fill in checkout fields such as a PO number, and pick a shipping method. 3. **Payment**: They pay upfront by card, by invoice or on account, or request a quote. 4. **Order in your platform**: The order is created in your eCommerce platform as a draft or completed order, and shows in Orders. Tax is added at the last step of the checkout, from your platform's tax settings. Shipping costs come from your platform or SparkLayer shipping rates. ## Where the settings live | Screen | What you set there | | --- | --- | | **Settings > Configurations** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations** in the Shopify app | Feature switches in four cards: **Ordering** (company users, company locations, multi-location stock, recurring orders, payments visibility), **Quotes and invoices**, **Pricing and cart** and **Store** (store details, email domain, purchase ID prefix). | | **Storefront > Options > Checkout** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Checkout** in the Shopify app | Checkout fields, the order of payment methods, saving addresses and hiding the AI cart features. | | **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app | Which payment methods, order limits and checkout access each group of customers gets. | | **Settings > Shipping** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/shipping)), or **SparkLayer Wholesale > Settings > Shipping** in the Shopify app | SparkLayer's own B2B shipping methods, and which Shopify method is pre-selected at checkout. | | **Integrations > Platform > Shopify order actions** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform > Shopify order actions** in the Shopify app | On Shopify, whether draft orders are completed automatically. | ## Checkout and payment - [Cart & checkout](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md): How the SparkLayer cart and checkout work for B2B customers, and the settings that change them. - [Checkout fields](https://docs.sparklayer.io/help/ordering/checkout-fields.md): Collect extra information at checkout, such as a PO number, with custom and standard checkout fields. - [Payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md): Choose which B2B payment methods customers see, rename and reorder them, and set the default. - [Credit, net terms & invoicing](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md): Set credit limits, account balances and payment terms such as Net 30 or Net 60 for B2B customers. - [Invoices](https://docs.sparklayer.io/help/ordering/invoices.md): Let B2B customers download PDF invoices from My Account, and customise what they show. - [Set up quotes](https://docs.sparklayer.io/help/ordering/quoting.md): Let customers request quotes, then edit, negotiate and convert them into orders. ## Tax and shipping - [How tax works at checkout](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md): How SparkLayer shows net prices and adds tax at checkout, and how to set up tax on your platform. - [Shipping rules](https://docs.sparklayer.io/help/ordering/shipping-rules.md): Use your store's shipping rates, or set up B2B shipping methods priced by order total or weight for each customer group. ## Reordering tools - [Quick Order](https://docs.sparklayer.io/help/sales-ordering/catalog.md): Let customers browse your range in pictures and add products to the cart, with pack sizes and volume breaks applied. - [Shopping lists](https://docs.sparklayer.io/help/ordering/shopping-lists.md): Let customers save named lists of products and quantities, and add a whole list to the cart. - [Favourites](https://docs.sparklayer.io/help/ordering/favourites.md): Let customers save products with a heart icon and add them to the cart from My Account. - [Intelligent Cart (AI)](https://docs.sparklayer.io/help/ordering/intelligent-cart.md): Fill the cart by uploading a PDF, spreadsheet or photo, forwarding an email or scanning barcodes. ## After the order - [Complete draft orders automatically](https://docs.sparklayer.io/help/ordering/automation-and-workflows.md): On Shopify, complete draft orders automatically, and get email alerts for new draft orders. - [Orders](https://docs.sparklayer.io/help/dashboard/orders.md): Track B2B orders in SparkLayer, with sales for a period compared with the period before, and your sales history. --- # Cart and checkout URL: https://docs.sparklayer.io/help/ordering/cart-and-checkout How the SparkLayer checkout works, step by step, and how to customise it: the PO number field, payment and checkout messages, terms link and order limits. > **Quick summary** > > - B2B customers check out in the [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) in four steps: **Cart**, **Details**, **Review & Pay** and **Complete**. Customers who can request quotes also see **Request Quote**. > - Set order limits per customer group at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app. Set checkout fields, the order of payment methods and saving addresses at **Storefront > Options > Checkout** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Checkout** in the Shopify app. > - Change most checkout 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, including payment and checkout messages, the terms link and the order complete message. ## How it works The four steps of the SparkLayer checkout: 1. **Cart**: Check the lines, apply discount codes, then click **Checkout** 2. **Details**: Shipping address, PO number, files and a preferred shipping date 3. **Review & Pay**: Shipping method, payment method, order summary and terms 4. **Complete**: The order is placed and sent to your eCommerce platform A strip at the top of My Cart shows the four steps. Finished steps get a tick, and customers can click one to go back. From **Details** onwards, a bar at the bottom shows the sub-total, with a **Back** button beside the main button. You change the checkout in one of three ways: | What you're changing | How | Who does it | | --- | --- | --- | | Text customers see | A translation key, 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 or in `translations` in your Core Script. See [Change checkout text](#change-checkout-text). | You, in SparkLayer. No code needed. | | How something behaves | A display setting in your [Core Script](https://docs.sparklayer.io/help/glossary.md#core-script) (the SparkLayer code in your theme), such as `display: { customerReferenceRequired: true }`. See [Frontend integration](https://docs.sparklayer.io/developers/frontend.md). | Your developer or agency | | How something looks | CSS variables in your [CSS overrides](https://docs.sparklayer.io/help/storefront/customising-design.md). | Your developer, agency or anyone who edits your theme code | ## The checkout, step by step ### Cart The customer checks their lines, quantities, **Discounts & codes** and **Sub-total**, then clicks **Checkout**. **More detail** If the order breaks the customer group's [order limits](#set-minimum-and-maximum-order-values), My Cart shows a message and the customer can't check out until they change it. If their group can request quotes, **Request Quote** sits beside **Checkout**: see [Submit a quote instead](#submit-a-quote-instead). ### Details The customer confirms the delivery address, fills in your [checkout fields](https://docs.sparklayer.io/help/ordering/checkout-fields.md), such as a PO number, and clicks **Continue**. You choose which fields appear, their names and their order. **What's on the Details step** | Part | What it does | | --- | --- | | **Shipping Address** | Lists the customer's saved addresses (as a drop-down list if there are more than 4), with **Add a new address**. A note says they can edit addresses from their account. | | **Purchase Order (PO) Number** | A box for the customer's PO number, if you've turned on the PO number field. | | **Upload Files** | Attaches files to the order, such as a purchase order, if you've turned on file uploads (Growth plan and above). | | **Preferred Shipping Date** | The date the customer would like the order shipped, if you've added a shipping date field. It can open on the earliest date you allow. | | **Additional Information** | A free-text box for notes, if it's turned on. See [Set up the Additional Information field](#set-up-the-additional-information-field-po-number). | | Other checkout fields | Any other fields you've added, such as delivery instructions or a tick box. | Addresses come from the customer's address book in your store admin. With [company locations](https://docs.sparklayer.io/help/customers/company-locations.md), the address is the location's own, with a note saying so and a **Change location** link. When adding a new address, the customer can also tick: | Option | What it does | | --- | --- | | **Set as default shipping address** | Uses this address for shipping on future orders. | | **Set as default billing address** | Uses this address for billing on future orders. | | **Save address to address book** | Saves the address so it can be edited later in the [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md). | They then click **Continue and use this address**. To stop customers adding or editing addresses, see [Allow customers to edit addresses](https://docs.sparklayer.io/help/customers/customer-groups.md#allow-customers-to-edit-addresses). ### Review & Pay The customer chooses a shipping and payment method, checks the totals, ticks the terms and clicks **Complete Order**, which shows the total (for example, **Complete Order: $1,540.03**). Tax and shipping are worked out on this step: see [Tax and shipping](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md). **What's on the Review & Pay step** | Part | What it does | | --- | --- | | Checkout message | Your own message in a box at the top, if you've [added one](#add-a-checkout-message). | | **Shipping Method** | The shipping options, each with its cost, such as standard or express. See [Shipping rules](https://docs.sparklayer.io/help/ordering/shipping-rules.md). | | **Payment Method** | The [payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md) the customer's group allows, such as **Pay on Account**, **Pay by Invoice** and **Pay Online by Card**, with a message about the selected method. | | **Order Summary** | **Discounts & codes**, **Sub-total**, **Shipping** (with the delivery address), **Tax** and **Total**. With [company locations](https://docs.sparklayer.io/help/customers/company-locations.md), an **Ordering for** row names the location, with **Change**. | | Terms tick box | "I agree to the terms and conditions". See [Change the terms and conditions link](#change-the-terms-and-conditions-link). | | **Complete Order** | Places the order. The button shows the total, for example **Complete Order: $1,540.03**. | ### Complete The customer sees **Thank you for your order!**, with a note that a confirmation email is on its way and they can track the order in My Account. **View order** opens it in [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md). The order goes to your eCommerce platform like any other, as a draft or completed order depending on the payment method. See [Payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md). ### Submit a quote instead If the customer's group can request quotes with the [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md), they can send the cart to your team as a quote instead of placing an order. No payment is taken. 1. In **My Cart**, click **Request Quote**, next to **Checkout**. Sales agents ordering for a customer see **Submit Quote** instead. 2. On **Details**, choose the address and fill in the fields. 3. On **Review & Pay**, a banner says **This order will be submitted as a quote**. Choose a **Shipping Method** and check the **Order Summary**. There's no payment method: the customer chooses one when they complete the quote. 4. Fill in **Quote Details**, tick the terms and conditions and click **Submit Quote**, which shows the total (for example, **Submit Quote: $1,540.03**). The Complete step says **Thank you for requesting a quote!** Your team is emailed, and the quote appears in the customer's My Account. For what happens next, see [Work on a quote](https://docs.sparklayer.io/help/ordering/work-on-a-quote.md). ## Set minimum and maximum order values Order limits stop a customer checking out until the order meets your rules, such as a $100 minimum spend or at least 50 items. You set them for each customer group, as **Order total limits** or **Order quantity limits**: see [Set order limits](https://docs.sparklayer.io/help/storefront/quantity-rules.md#order-limit-rules). Order totals exclude tax, unless you show [tax-inclusive prices](https://docs.sparklayer.io/help/pricing/pricing-display.md#show-tax-inclusive-prices). Until the order meets the limit, My Cart shows a message and the customer can't check out. For every option and the message text, see [Order limits in customer groups](https://docs.sparklayer.io/help/storefront/quantity-rules.md#order-limit-rules). ## Offer discounts and coupon codes Customers enter a coupon code with **Discounts & codes**, in the cart or in the **Order Summary**, and discounts can also apply automatically. For what customers see, see [Discounts and promotions](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md#discounts-and-promotions) in My Cart. B2B discounts need the Growth plan or above. To set them up, including order-level, percentage, fixed, scheduled and customer group discounts, see [Discounts](https://docs.sparklayer.io/help/pricing/discounts.md). ## Change checkout text Every piece of text in the cart and checkout has a translation key, such as `cart.checkout.notes.label`. Change any of it without code: 1. Go to **Storefront > Options** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options** in the Shopify app and open **Translation overrides**. 2. Click **Add override**. 3. Choose the language, such as `en`, and the key, then enter your text. 4. Click **Save and publish**. The sections below give the key for each message, plus Core Script code for developers. To find other keys, see [Find the key for a piece of text](https://docs.sparklayer.io/help/storefront/languages-and-international.md#find-the-key-for-a-piece-of-text) and [Languages and international](https://docs.sparklayer.io/help/storefront/languages-and-international.md). ## Add a checkout message A checkout message sits in a box at the top of **Review & Pay**, above the shipping methods. Use it for anything customers need to know before ordering, such as shipping cut-off times or payment information. To add one, set the key `cart.checkout.review-step.custom-message` in **Translation overrides** (see [Change checkout text](#change-checkout-text)). The message shows to all customers; you can't vary it by customer. **Core Script code for your developer** ```javascript title="Core Script" translations: { en: { "cart.checkout.review-step.custom-message": "Add your custom checkout message here", } }, ``` ### Style the checkout message The message's colours, spacing, alignment and border are CSS variables in your website's CSS. See [Customising design](https://docs.sparklayer.io/help/storefront/customising-design.md). **CSS for your developer** This is a theme code change, so pass it to your developer if you don't edit your theme: ```html ``` ## Add a message for each payment method A payment method message sits under the payment methods on **Review & Pay** and explains the selected method. For example, tell customers who choose **Pay by Invoice** when and how you'll invoice them. It changes as the customer picks a method. Set the method's key in **Translation overrides** (see [Change checkout text](#change-checkout-text)): | Payment method | Key | | --- | --- | | **Pay by Invoice** | `cart.checkout.payment-providers.paymentByInvoice.message` | | **Pay Online by Card** | `cart.checkout.payment-providers.upfrontPayment.message` | | **Pay on Account** | `cart.checkout.payment-providers.paymentOnAccount.message` | | **Request for Quote** | `cart.checkout.payment-providers.quote.message` | Each message shows to every customer who selects that method; you can't vary it by customer. To choose which methods each customer sees, see [Payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md). A message is a good place to explain a [payment method rule](https://docs.sparklayer.io/help/ordering/payment-method-rules.md)'s discount or surcharge. For the keys of the rule's own text, see [Change the text customers see](https://docs.sparklayer.io/help/ordering/payment-method-rules.md#change-the-text-customers-see). **Core Script code for your developer** ```javascript title="Core Script" translations: { en: { "cart.checkout.payment-providers.paymentByInvoice.message": "This is a message for Payment by Invoice", "cart.checkout.payment-providers.upfrontPayment.message": "This is a message for Pay Online by Card", "cart.checkout.payment-providers.paymentOnAccount.message": "This is a message for Pay on Account", "cart.checkout.payment-providers.quote.message": "This is a message for Request for Quote", } }, ``` ## Set up the Additional Information field (PO number) **Additional Information** is a free-text box on the **Details** step, up to 512 characters. Customers often use it for a PO number, delivery instructions or other notes. Its placeholder is "Order notes e.g. PO Number". On Shopify, the text appears in the order's **Notes** section. You can also send it to a backend system with the [SparkLayer API](https://docs.sparklayer.io/developers/api.md). For other platforms, see the [developer docs](https://docs.sparklayer.io/developers.md). To store a PO number or customer reference in a structured, searchable place, use the standard **PO Number** or **Customer Reference** checkout field instead. Add them without code at **Storefront > Options > Checkout** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Checkout** in the Shopify app: see [Move to the standard fields](https://docs.sparklayer.io/help/ordering/checkout-fields.md#move-to-the-standard-fields). You can change the field's text yourself. Making it required, limiting its length or hiding it are Core Script settings for your developer. ### Change the label and helper text Set these keys in **Translation overrides** (see [Change checkout text](#change-checkout-text)): | Key | Default text | | --- | --- | | `cart.checkout.notes.label` | Additional Information | | `cart.checkout.notes.placeholder` | Order notes e.g. PO Number | | `cart.checkout.notes.helper-text` | Please note, this is required before placing your order (only shown if the field is required) | | `cart.checkout.notes.default-helper-text` | Empty. Add a helper message to show below the field. | **Core Script code for your developer** ```javascript title="Core Script" translations: { en: { "cart.checkout.notes.label": "Additional Information", "cart.checkout.notes.placeholder": "Order notes e.g. PO Number", "cart.checkout.notes.helper-text": "Please note, this is required before placing your order", /* Only shown if the field is set to required */ "cart.checkout.notes.default-helper-text": "", /* Add a helper message below the form field */ } }, ``` ### Make the field required Your developer adds this to the `display` object in your Core Script. Customers then can't place an order until they fill in the field, and see the helper text "Please note, this is required before placing your order". ```javascript title="Core Script" display: { customerReferenceRequired: true, }, ``` ### Limit the number of characters Your developer can set a limit lower than 512: ```javascript title="Core Script" display: { customerReferenceMaxLength: 512, /* update 512 as required */ }, ``` ### Hide the field Your developer adds this to the Core Script: ```javascript title="Core Script" display: { customerReferenceHidden: true, }, ``` ## Change the terms and conditions link Customers tick "I agree to the terms and conditions" before they complete the order. The link goes to `policies/terms-of-service` by default. | To change | How | Who does it | | --- | --- | --- | | The words around the link | The keys `cart.checkout.terms.start` ("I agree to the "), `cart.checkout.terms.link` ("terms and conditions") and `cart.checkout.terms.end`, in **Translation overrides** (see [Change checkout text](#change-checkout-text)) | You, in SparkLayer | | Where the link goes | `termsAndConditionsLink` in your Core Script. On Shopify, it can change with the customer's tags or the store language. | Your developer | **Core Script code for your developer** Set the link: ```javascript title="Core Script" termsAndConditionsLink: "/policies/terms-of-service", ``` **Shopify only:** On Shopify, use Liquid to show a different link by customer tag or store language: ```javascript title="Core Script" {% if customer.tags contains 'b2b' %} termsAndConditionsLink: '/policies/b2b-terms', {% elsif customer.tags contains 'b2b-2' %} termsAndConditionsLink: '/policies/b2b-2-terms', {% elsif shop.locale == "fr" %} termsAndConditionsLink: '/policies/fr-terms-and-conditions', {% else %} termsAndConditionsLink: '/policies/terms-and-conditions', {% endif %} ``` To switch the link by language only: ```javascript title="Core Script" {%- if shop.locale == "fr" -%} termsAndConditionsLink: '/policies/fr-terms-and-conditions', {%- else -%} termsAndConditionsLink: '/policies/terms-and-conditions', {%- endif -%} ``` To change the wording in the Core Script instead of Translation overrides: ```javascript title="Core Script" translations: { en: { "cart.checkout.terms.start": "I agree to the ", "cart.checkout.terms.link": "terms and conditions", "cart.checkout.terms.end": " ", } }, ``` ## Change the tax and shipping note A short note under the main button tells customers when tax and shipping are calculated. Set these keys in **Translation overrides** (see [Change checkout text](#change-checkout-text)): | Where | Default text | Key | | --- | --- | --- | | Under **Checkout** on the **Cart** step | Tax and shipping costs calculated during checkout | `cart.tax-shipping-note` | | Under **Continue** on the **Details** step | Tax and shipping costs shown on next step | `cart.tax-shipping-message` | **Core Script code for your developer** ```javascript title="Core Script" translations: { en: { "cart.tax-shipping-note": "Tax and shipping costs calculated during checkout", "cart.tax-shipping-message": "Tax and shipping costs shown on next step", } }, ``` For how tax and shipping are calculated, see [Tax and shipping](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md). ## Change the order complete message After placing an order, customers see a heading and a short message, with a separate version for quote requests. Set these keys in **Translation overrides** (see [Change checkout text](#change-checkout-text)). `{email}` is replaced with the customer's email address. | Key | Default text | | --- | --- | | `cart.thanks.payment.main` | Thank you for your order! | | `cart.thanks.payment.blurb` | Your order has now been placed and you will shortly receive email confirmation to `{email}`. You can check the status of your order at any time by going to 'My Account'. | | `cart.thanks.quote.main` | Thank you for requesting a quote! | | `cart.thanks.quote.blurb` | We can confirm that your request for a quote has been received and we'll be in touch once our team has reviewed it. | **Core Script code for your developer** ```javascript title="Core Script" translations: { en: { "cart.thanks.payment.main": "Thank you for your order!", "cart.thanks.payment.blurb": "Your order has now been placed and you will shortly receive email confirmation to {email}. You can check the status of your order at any time by going to 'My Account'.", "cart.thanks.quote.main": "Thank you for requesting a quote!", "cart.thanks.quote.blurb": "We can confirm that your request for a quote has been received and we'll be in touch once our team has reviewed it.", } }, ``` ## More ways to change the cart ### Collect a tax ID Some countries require a customer's tax ID (or equivalent) at checkout, so orders comply with local tax law and avoid customs delays or fines. See [Collect a tax ID for international shipping](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md#collect-a-tax-id-for-international-shipping). ### Add your own content with slots Custom slots (also called targets) add your own HTML in set places in My Cart, such as above the cart lines (**My Cart** slot) or under the thank-you message on **Complete** (**Order complete** slot). Add them at **Storefront > Options > Custom slots** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Custom slots** in the Shopify app. See [Custom slots](https://docs.sparklayer.io/help/storefront/interfaces/custom-slots.md). ### Hide the RRP in the cart If you show an [RRP (MSRP)](https://docs.sparklayer.io/help/pricing/pricing-display.md), the cart shows it under each line's price, such as "RRP: US$5.99". To hide it, add this to your [CSS overrides](https://docs.sparklayer.io/help/storefront/customising-design.md) (a theme code change): ```css --spark-cart-rrp-display: none; ``` ### Change how product images fit in the cart Product images that aren't square may be cropped in the cart. Add one of these to your [CSS overrides](https://docs.sparklayer.io/help/storefront/customising-design.md) (a theme code change): ```css --spark-cart-background-size: cover /* Set image to fill the space*/ --spark-cart-background-size: contain /* Set image to be fully visible*/ ``` ## Related features | Feature | Where to read about it | | --- | --- | | Searching for products and adding them by SKU in the cart | [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) | | Which payment methods customers see, and their names and order | [Payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md) | | Custom fields, standard fields and file uploads at checkout | [Checkout fields](https://docs.sparklayer.io/help/ordering/checkout-fields.md) | | Shipping methods and rates | [Shipping rules](https://docs.sparklayer.io/help/ordering/shipping-rules.md) | ## FAQs **Where have custom checkout fields and file uploads gone?** They have their own page: [Checkout fields](https://docs.sparklayer.io/help/ordering/checkout-fields.md). For file uploads, see [Let customers upload files at checkout](https://docs.sparklayer.io/help/ordering/checkout-fields.md#file-upload-file-attachments). **Can I show a different payment or checkout message to different customers?** No. Both show to all customers, though payment messages change with the payment method the customer selects. **Can I change the checkout text without editing code?** Yes, 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](#change-checkout-text). --- # Catalog and Quick Order URL: https://docs.sparklayer.io/help/sales-ordering/catalog Browse your whole range in pictures and add products straight to the order: grid, quick-buy list or matrix views, search, filters and pack-aware quantities. > **Catalog and Quick Order is in early access.** Request it for your store. [Request early access](https://feedback.sparklayer.io/get-started?choice=now). > **Quick summary** > > - Catalog and Quick Order is an image-first product browser inside the SparkLayer widget. It has search, a collection filter, 3 views, and quantities that follow your pack sizes and volume breaks. > - Sales reps see it as the **Catalog** tab. Customers see the same browser as the **Quick Order** tab, so it's a fast way for anyone to build an order. > - Every **Add** goes straight into the cart. For a rep, that's the cart of the customer they're [ordering for](https://docs.sparklayer.io/help/sales-ordering/order-for-a-customer.md), at that customer's prices. > - The order button at the top, such as **60 in order**, shows what's in the order so far without leaving the catalog, and **Review order** opens the cart to check out. Catalog and Quick Order need the Starter plan or above. > - To keep products out of the catalog, such as custom products or fees, hide them for every B2B customer or for some customer groups. See [Hide products from the catalog](#hide-products). ## How it works Catalog and Quick Order show your products as a page of cards, each with its photo, price, stock and quantity rules. Choose a quantity and click **Add**. The line goes into the order as if it had been typed into [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md). The order stays in the cart, so you can switch between browsing and the cart at any time. Building an order from the catalog: 1. **Find products**: Search, filter by collection or sort the range 2. **Set a quantity**: Choose the variant and quantity; packs and volume prices apply 3. **Add**: The line goes straight into the cart 4. **Review order**: Open the cart from the running order and check out | Who | Tab name | Adds go to | | --- | --- | --- | | Customer | **Quick Order** | Their own cart | | Sales rep | **Catalog** | The cart of the customer they're ordering for | ## Open the catalog 1. Open the SparkLayer widget in your store, for example from the cart or account link. 2. Sales reps: choose the customer you're ordering for first. See [Choose a customer](https://docs.sparklayer.io/help/sales-ordering/order-for-a-customer.md#choose-a-customer). 3. Click **Quick Order** (customers) or **Catalog** (sales reps). It's the last tab, after **My Account**. **More detail** The widget widens while the tab is open, so more products fit on the screen. The rep's **Catalog** header also has a **Counter** button, which opens [Counter mode](https://docs.sparklayer.io/help/sales-ordering/counter-mode.md) for serving customers in person. ## Choose a view The catalog has 3 views. Switch between them with the view icons at the top of the catalog. Your choice is remembered next time. | View | Best for | What you see | | --- | --- | --- | | **Grid view** | Browsing by eye, new products, customers who know a product by its look | A card per product: photo, collection, name, SKU, price and MSRP, volume offer, stock and pack rules, then the option, quantity, **Add** and the heart | | **Quick-buy list** | Fast ordering when you know what you want | A table with **Product**, **Variant**, **Qty** and **Line total** columns, and **Add** on each row. The line total also shows the quantity times the unit price | | **Matrix ordering** | Products with two options, such as colour and size | Each two-option product as a grid of every combination, so you can fill in several at once. Other products show as a single row | **More detail** On a narrow screen the list's columns stack, with **Variant**, **Qty** and **Line total** labelled on each row. On a narrow grid card, the **Add** button shows only the plus sign and the line total, so the price is never cut off. ## Set the quantity Each product starts at its smallest allowed quantity. The quantity follows your [quantity rules](https://docs.sparklayer.io/help/storefront/quantity-rules.md): - **−** and **+** move by one pack. For a product sold in packs of 12, they go 12, 24, 36. - You can type any number. When you leave the box, it snaps to the nearest pack and stays within the minimum and maximum. - The rules show under the price, such as **Min 6 · Packs of 6** or **Max 100**. For a product with options, choose the variant from the dropdown first. The price, stock and volume offer change to match it. ### Volume breaks If a product has [quantity pricing](https://docs.sparklayer.io/help/pricing/quantity-pricing.md) (volume breaks), its card shows the best offer in words, such as "From $7.70 for 34+", or "$6.40 each by the pack" for a product sold in packs. 1. Hover over, focus or tap the offer to see **Qty discount pricing**: every break with its **Qty**, **Price** and **Savings**. 2. Click a row to set the quantity to that break. When the quantity reaches a break, the card shows the saving (for example **−20%**) and **Add** shows the discounted line total. The cart uses the same price. ### Stock | Status | Means | | --- | --- | | **In stock** | Available, with a count (such as **100+**) if you [show unit counts](https://docs.sparklayer.io/help/storefront/stock-display.md). | | **Low** | Stock is low, with the units left if counts are shown. | | **Pre-order** | Can be ordered now and ships later, with the expected date. | | **Out of stock** | Can't be ordered: the button reads **Sold out**. You can still add it to the wishlist. | What customers see depends on the [stock display](https://docs.sparklayer.io/help/customers/customer-groups.md#show-stock-levels) settings of their customer group. ## Add products to the order 1. Choose the variant and quantity. 2. Click **Add**. It turns green with a tick, and a message confirms who the order is for. **More detail** The product's card then shows a tick and the quantity already in the order, and the list view shows how many are in the order, such as **12 in order**, under the button. These counts are read from the cart, so they're always up to date. If a product is already in the order, **Add** adds to the quantity that's there. ### Add from the matrix 1. In **Matrix ordering**, type a quantity into each combination you want. Each cell shows its stock and price, and **Unavailable** for combinations you can't order. 2. Check the total under the grid: units selected and the order value. 3. Click **Add to order** to add every combination at once. **More detail** In the matrix, volume breaks count the whole grid's quantity, so 6 small and 6 medium count as 12. Click the info icon in a cell to see that variant's SKU and its pack rules. ### Add to a customer's order as a sales rep When a rep is [ordering for a customer](https://docs.sparklayer.io/help/sales-ordering/order-for-a-customer.md), every **Add** goes into that customer's cart, at that customer's prices, stock and quantity rules. The confirmation names the customer, so you always know whose order you're building. To build an order for someone else, [switch customer](https://docs.sparklayer.io/help/sales-ordering/order-for-a-customer.md) first. ## Review the order 1. Click the order button at the top right. It shows how many units are in the order, such as **60 in order**. The **In this order** panel shows the last 3 lines added, with the number of lines and units. 2. To see every line, click the link under them, such as **+ 4 more lines in the cart**. Click **Show fewer lines** to go back. 3. Click **Keep browsing** to carry on, or **Review order** to open the cart and [check out](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md#check-out). ## Add to the wishlist To save a product for later, click the heart beside its **Add** button (**Add to wishlist**). The heart fills when the product is saved. Click it again to remove it. You can save a product that's out of stock. **More detail** The wishlist belongs to the customer's account: a rep ordering for a customer saves to that customer's wishlist, not their own. Saved products appear in the customer's [Favourites](https://docs.sparklayer.io/help/ordering/favourites.md) in My Account. ## Share a view To send someone what you're looking at, click **Copy link**. It copies the search, collection, sort, page and view. Paste it into an email or chat, and the person who opens it lands on the same view. ## Hide products from the catalog Some products shouldn't be ordered straight from the catalog: a custom product that needs artwork uploaded, or a printing charge or add-on fee that only belongs on an order with something else. Hide them with the `sparklayer.settings` [metafield](https://docs.sparklayer.io/help/glossary.md#metafields) on each variant, for every B2B customer or only for some customer groups. | You want | Set on each variant | What customers and reps see | | --- | --- | --- | | **Hide it** | `"display": false, "sell": false` | Nothing: it's left out of Catalog and Quick Order, search in My Cart and SparkLayer's other views | | **Show it, but stop orders** | `"sell": false` | The product, marked **Unavailable for this account**, with no way to add it | | **Hide it from some customer groups** | An entry for each of those groups | Hidden only for customers in those groups | | **Show it to some customer groups only** | A `base` entry that hides it, and an entry for each group that sees it | Hidden for everyone else | Sales reps see what the customer they're ordering for sees, so a product hidden from a customer's group is hidden from the rep's **Catalog** too. ### Step 1. Turn on the metafield in SparkLayer You only do this once. Go to **Integrations > Platform** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform** in the Shopify app and, in the **Metafields** card, click **Configure** next to **SparkLayer metafields**, then enable the product settings metafield. See [Product rules per customer group](https://docs.sparklayer.io/help/storefront/product-settings.md#set-product-settings-for-a-customer-group). ### Step 2. Build the value Choose who shouldn't see the products and whether to hide them or only stop orders. The value is the same for every product. For customer groups, use each group's handle, such as `trade`: find it by clicking the group's name at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app. For example, this value hides a variant from every B2B customer: ```json [{ "customer_group": "base", "display": false, "sell": false }] ``` ### Step 3. Add it to each variant The value goes on every variant you're hiding: a product with 3 sizes needs it on all 3. - **A few products:** open each variant in your store's admin, paste the value into its `sparklayer.settings` field and save. In Shopify, it's **Settings** under **Metafields**, as the form shows. - **Many products:** fill in the field for every variant in one table. - **With your AI assistant:** connect your Shopify store to it, such as with the Shopify connector in Claude, click **Ask Claude** or **Ask ChatGPT** in the form above, and tell it which products. The assistant finds every variant, shows you each change and waits for your approval before saving anything. **Lots of products? Fill them in one table (Shopify):** in your Shopify admin, go to **Products**, tick the products and click **Edit products**. Click **Columns**, tick the SparkLayer field under **Metafields**, type the values and click **Save**. See [Shopify's guide](https://help.shopify.com/en/manual/custom-data/metafields/bulk-edit-metafields). **More detail** A variant can already have a `sparklayer.settings` value, such as a pack size for a customer group. Pasting a new value replaces it. Add the `display` and `sell` keys to the entries that are there instead, or let the AI assistant merge them for you: its prompt keeps every other setting. ### Step 4. Check it worked Changes take about 10 minutes to sync. Then sign in as a customer in one of the groups, or [order for one](https://docs.sparklayer.io/help/sales-ordering/order-for-a-customer.md) as a rep, open **Quick Order** or **Catalog** and search for the product. `display` and `sell` only change SparkLayer. To hide products from your store's own pages too, such as from retail shoppers, see [Hide products from customers](https://docs.sparklayer.io/help/guides/hide-products.md). ## The parts of the screen | Part | What it shows / does | | --- | --- | | View switch | Three icons: **Grid view**, **Quick-buy list** and **Matrix ordering**. Your choice is remembered next time. | | Order button, such as **60 in order** | How many units are in the order. Click it to see the order's lines (see [Review the order](#review-the-order)). | | Collection filter | **All collections**, or one collection, with a count of products in each. Type in **Filter collections…** to find one in a long list. On Shopify, the collections follow your navigation menu: see [Collections in Catalog and Quick Order](https://docs.sparklayer.io/help/platforms/shopify/catalog-collections.md). | | Search | **Search the catalog…** finds products by name, SKU and collection. With several words, a product must match all of them. | | Sort | **Name A–Z**, **Price: low to high** or **Price: high to low**. | | **Copy link** | Copies a link to the view you're looking at (see [Share a view](#share-a-view)). | | Page footer | The products shown out of the total, with **Prev** and **Next**. Each page holds 24 products. | If nothing matches, the catalog says **No products match** and suggests trying a different search or collection. ## FAQs **Is Quick Order different from the Catalog?** No. It's the same product browser. Customers see it as **Quick Order**; sales reps see it as **Catalog**, with a **Counter** button for [Counter mode](https://docs.sparklayer.io/help/sales-ordering/counter-mode.md). **Why did my quantity change after I typed it?** The product is sold in packs or has a minimum or maximum. When you leave the box, the quantity snaps to the nearest pack within those limits. See [Quantity rules](https://docs.sparklayer.io/help/storefront/quantity-rules.md). **Why is a price lower than the card's price in the cart?** The quantity in the order has reached a volume break. The cart prices each line at the break its total quantity reaches, as the catalog does. **Why can't I find a product?** Check the collection filter is on **All collections**, and try fewer words: a product has to match every word you search for. The product might also be [hidden](#hide-products) from the customer's group. **Can I hide every product with a tag, such as CUSTOM?** Yes, but the setting goes on each variant, not on the tag. Click **Ask Claude** or **Ask ChatGPT** in the [form](#build-the-value) and tell the assistant "every product tagged CUSTOM": it finds and updates them. Or, in your Shopify admin, filter **Products** by the tag, select them all and fill in the field in the bulk editor. **Can I hide a product from the catalog but still sell it from its product page?** Not with `display` and `sell`: they apply to every SparkLayer view, including SparkLayer's ordering on the product page. If you need a product orderable only from its product page, [contact support](https://docs.sparklayer.io/help/support.md). --- # Checkout fields URL: https://docs.sparklayer.io/help/ordering/checkout-fields Collect extra details at checkout, such as a PO number, delivery date or file, with standard and custom checkout fields, and see where the data is saved. > **Quick summary** > > - Checkout fields collect extra details on the **Details** step of the [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md), such as a PO number, delivery date or delivery instructions. > - **Standard fields** (**Customer Reference**, **PO Number**, **Requested Shipping Date**) save to set, searchable places on the order. **Custom fields** are your own and save as order notes. > - Add both without code with **Add field** at **Storefront > Options > Checkout** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Checkout** in the Shopify app. Standard fields need Core Script 4.7.0 or later; custom fields work on any version. File uploads, validation rules and other options need a developer. > - File uploads need the Growth plan or above. On Wix, a developer adds custom fields in code, with `checkoutCustomElements`. ## How it works What happens to checkout field data: 1. **Customer fills in the field**: On the Details step of the checkout 2. **Saved with the order**: Standard fields go to set places; custom fields are saved as order notes 3. **Shown to you and the customer**: In your platform's order admin and the customer's My Account 4. **Used elsewhere**: On invoices and packing slips, in automations, or sent to your ERP through the API | Kind | How it's identified | Where the data goes | Use it for | | --- | --- | --- | --- | | **Standard field** | A fixed `id` that SparkLayer recognises | A structured place on the order, such as Shopify's own PO number field. You can search and filter by it, and use it in your theme and template editor. | Customer references, purchase order (PO) numbers and requested shipping dates | | **Custom field** | A `name` you choose | The order's notes (on Shopify, **Additional details**) | Anything else, such as delivery instructions, a tax ID or a confirmation tick box | Checkout fields are separate from **Additional Information**, the single free-text box at checkout. See [Cart and checkout](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md#set-up-the-additional-information-field-po-number). ### What you can do without code | Task | Where | Who does it | | --- | --- | --- | | Add the standard fields | **Add field** at **Storefront > Options > Checkout** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Checkout** in the Shopify app (Core Script 4.7.0 or later) | You | | Add your own custom field | **Add field** at **Storefront > Options > Checkout** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Checkout** in the Shopify app | You | | Add a file upload field, a validation rule (such as no weekend delivery dates) or any other option | Your [Core Script](https://docs.sparklayer.io/help/glossary.md#core-script), the SparkLayer code in your theme, with `checkoutCustomElements` | Your developer or agency | ## Turn on standard checkout fields Standard fields need Core Script 4.7.0 or later: 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. 1. Go to **Storefront > Options** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options** in the Shopify app and open **Checkout**. 2. Next to **Checkout fields**, click **Add field** and choose a standard field. Set whether it's shown, optional or hidden. 3. Repeat for each standard field you want. 4. Click **Save and publish**. See [Storefront options](https://docs.sparklayer.io/help/storefront/storefront-options.md). **Core Script code for your developer** For more control, a developer can add standard fields to the Core Script by `id`. The `id` must match exactly, or SparkLayer won't recognise the field. | Field | Field ID | | --- | --- | | Customer Reference | `customer-reference` | | PO Number | `po-number` | | Requested Shipping Date | `shipping-requested-date` | ```javascript title="Core Script" checkoutCustomElements: [ { id: "customer-reference" }, { id: "shipping-requested-date" }, { id: "po-number" }, ], ``` Standard fields take the same `attributes` and `onChange` keys as custom fields (see [Custom field settings](#custom-field-settings)). For example, to make the customer reference required: ```javascript title="Core Script" checkoutCustomElements: [ { id: "customer-reference", attributes: { required: true, }, }, ], ``` ### Where standard fields appear in your orders **Shopify only:** On Shopify, standard fields are saved here: | Field | Where it's saved | | --- | --- | | **PO Number** | Shopify's own PO number field on the order, shown as a **PO number** column in your orders and draft orders lists. | | **Requested Shipping Date** | A dedicated custom field on the order, shown as `sparkShippingRequestedDate`. | | **Customer Reference** | The Shopify order notes field. | Your theme and template editor can use these fields, so you can show them on documents such as [invoices](https://docs.sparklayer.io/help/ordering/invoices.md). Customers see them on the order's **Summary** in [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md). In the order and activity views, you can: - Search by Customer Reference - Search by PO Number - Filter by Requested Shipping Date, using a date range ## Add a custom checkout field A custom field is one you design, such as a delivery instructions box, a tax ID or a confirmation tick box. To add one without code: 1. Go to **Storefront > Options** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options** in the Shopify app and open **Checkout**. 2. Next to **Checkout fields**, click **Add field** and fill in the field's details. 3. Click **Save and publish**. 4. Check the **Details** step of the checkout on your store. **Shopify only:** On Shopify, you can show a field only to customers with a particular tag: see [B2B-only content](https://docs.sparklayer.io/help/platforms/shopify/customisations/b2b-only-content.md). For validation rules, grouped drop-down menus and every other option, your developer can [add the field in the Core Script](#add-a-custom-field-in-the-core-script-for-developers). ### Where custom field data is saved Custom field answers are saved to the order as notes. | Where | What you see | | --- | --- | | **Shopify order** | The **Notes** card, under **Additional details**, beside SparkLayer's own details such as `sparkCartId` and `sparkPaymentType`. Shopify calls these **custom attributes**. | | **Customer's My Account** | The order's **Additional Information**, for example "Preferred Shipping Date: 2024-12-02". | **Shopify only:** On Shopify, custom attributes can also: - Show on packing slips and [email notifications](https://docs.sparklayer.io/help/platforms/shopify/customisations/email-notifications.md) - Go to a backend system through the [API](https://docs.sparklayer.io/developers/api.md) - Trigger [Shopify Flow](https://apps.shopify.com/flow) workflows (see our [ready-made Shopify Flow templates](https://docs.sparklayer.io/help/platforms/shopify/customisations/flow.md)) Some third-party invoicing apps can show **Additional details** too; check with the app's developer. To show answers on SparkLayer invoices, see [Content Zones](https://docs.sparklayer.io/help/ordering/invoices.md#add-checkout-field-data-to-an-invoice). ## Let customers upload files at checkout A file upload field lets B2B customers attach files to the order at checkout, such as a purchase order or order-specific details. It needs the Growth, Pro or Enterprise plan: to change plan, go to **Plan card** in the SparkLayer Dashboard, or **SparkLayer Wholesale > Plan** in the Shopify app or see [SparkLayer plans and pricing](https://www.sparklayer.io/pricing/). Your developer adds the field in the Core Script: 1. Add the sample below to your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting), inside `checkoutCustomElements`. 2. Change the settings in `attributes` to suit. 3. Edit `translations` to change the text customers see. **Core Script code and settings for your developer** ```javascript title="Core Script" checkoutCustomElements: [ { translations: { en: { title: "File Upload", detail: "Files must not be larger than 10MB. You can upload between 1 and 4 files" }, }, name: "file-upload", attributes: { type: "file", required: false, // Optional. Default: false minlength: 1, // Optional. Default: 1 maxlength: 4, // Optional. Default: 20 maxsize: '10MB', // Optional. Default: 20MB, Must be a number followed by `B`, `KB` or `MB` fileextensions: [ // Optional. Default: ['txt', 'csv', 'pdf', 'json', 'png', 'jpeg', 'gif', 'webp', 'svg', 'psd', 'xls', 'xlsx', 'ods', 'fods', 'ppt', 'pptx', 'odp', 'fodp', 'doc', 'docx', 'odt', 'fodt'] 'png', 'txt', 'pdf', 'xls' ] } } ], ``` | Setting | What it does | | --- | --- | | `required` | Set to `true` to make the customer upload a file. Default: `false`. | | `minlength` | The **minimum** number of files the customer must upload. For example, `1` means at least 1 file. Default: `1`. | | `maxlength` | The **maximum** number of files the customer can upload. For example, `4` stops them uploading more than 4. Default: `20`. | | `maxsize` | The largest file size allowed, as a number followed by `B`, `KB` or `MB` (for example, `10MB`). The default and maximum is 20MB; you can set a lower limit but not a higher one. | | `fileextensions` | The file types customers can upload. By default, all of these are allowed: `['txt', 'csv', 'pdf', 'json', 'png', 'jpeg', 'gif', 'webp', 'svg', 'psd', 'xls', 'xlsx', 'ods', 'fods', 'ppt', 'pptx', 'odp', 'fodp', 'doc', 'docx', 'odt', 'fodt']` | | `translations` | The text customers see: the field `title` and the `detail` helper text. | Customers then see a **File Upload** field on the **Details** step, and their files appear on the order in [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md), under **Attachments**. **What customers see** The field has a **Choose file** button and helper text, such as the size limit and number of files allowed. Chosen files are listed above the button, and customers can remove one before continuing. Under **Attachments**, each file shows its **File name** and **Assignment** (**Order-level** for checkout uploads), with an **Actions** menu to download it. ### Download uploaded files There are 3 ways to get a file a customer uploaded: | Who | How | | --- | --- | | **The customer** | Signs in and downloads the attachment from the order. | | **A sales agent** | Signs in on the customer's behalf with [sales agent ordering](https://docs.sparklayer.io/help/sales-ordering/order-for-a-customer.md), opens the order and downloads the attachment. | | **The API** | The [SparkLayer Files API](https://docs.sparklayer.io/developers/api/files.md) links uploads to the order data, so they can go to a back-office system such as an ERP. For help, contact our [support team](https://docs.sparklayer.io/help/support.md). | **Shopify only:** On Shopify, the order lists uploads in **Additional details** under `file-upload` (or your field's `name`). These are file references (`gid://sparklayer/File/...`) that can't be opened from Shopify. For other platforms, see the [developer docs](https://docs.sparklayer.io/developers.md). ## Let customers upload files on the product page Line-item uploads let customers attach a file to a specific product, such as a logo or name customisation. This advanced setup needs a developer: see [Let customers upload a file](https://docs.sparklayer.io/developers/javascript-sdk/cart.md#let-customers-upload-a-file) in the JavaScript SDK docs. How product-level file uploads work once set up: 1. **Product page**: One or more upload fields, each with its own label (such as Front Design) and a Choose file button 2. **Cart**: Each file is shown under the product line, for example Front Design: "logo.png" 3. **My Account**: The files appear on the order under Attachments, assigned to the product's SKU You can combine product-level and [checkout-level](#file-upload-file-attachments) uploads, such as a logo per product plus a purchase order for the whole order. All files appear on the order in My Account. ## Move to the standard fields If your developer set up a customer reference or shipping date in the Core Script the older way, switch to the standard fields to get structured storage, search and filtering. | If your Core Script has | Replace it with | | --- | --- | | The **Additional Information** field with `customerReferenceHidden` and `customerReferenceRequired` | The standard field `{ id: "customer-reference" }` | | A shipping date custom field with a `name`, such as `my-shipping-requested-date` | The standard field `{ id: "shipping-requested-date" }` | **Before and after code for your developer** **Customer reference.** If you used the **Additional Information** field with the `customerReferenceHidden` and `customerReferenceRequired` display settings, like this: ```javascript title="Core Script" display: { customerReferenceHidden: false, customerReferenceRequired: true, }, ``` replace it with the standard field: ```javascript title="Core Script" checkoutCustomElements: [ { id: "customer-reference", attributes: { required: true, }, }, ], ``` **Requested shipping date.** If you added a shipping date as a custom field with a `name`, like this: ```javascript title="Core Script" checkoutCustomElements: [ { name: "my-shipping-requested-date" }, ], ``` switch it to the standard `id`: ```javascript title="Core Script" checkoutCustomElements: [ { id: "shipping-requested-date" }, ], ``` The `id` must be `shipping-requested-date`. A custom field's `name` can be anything you choose; using the standard `id` is what turns on the structured storage, search and filtering. ## Add a custom field in the Core Script (for developers) The Core Script gives every option for a custom field, such as validation rules and grouped drop-down menus. It's a theme code change, so pass this section to your developer or agency if you don't edit your theme. 1. Add a `checkoutCustomElements` array to your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting) (or add to it if it's already there). 2. Add one object per field, with a `name`, `translations` (the text customers see) and `attributes` (the field type and validation). See [Custom field settings](#custom-field-settings). 3. Save your theme and check the **Details** step of the checkout. This example adds a required delivery date field: ```javascript title="Core Script" checkoutCustomElements: [ { name: "delivery-date", translations: { en: { title: "Delivery Date", detail: "Delivery unavailable on weekends." } }, attributes: { required: true, type: "date" } }, ], ``` One array can hold several fields. This example shows most of the [supported field types](#supported-field-types): **Example with multiple custom fields** ```javascript title="Core Script" checkoutCustomElements: [ { translations: { en: { title: "Text field", detail: "Explains what the field is for. Must be 2 letters followed by 2-4 digits" } }, name: "text-field", attributes: { required: true, type: "text", placeholder: "Placeholder shows inside the empty input", minlength: 4, maxlength: 6, pattern: "[a-zA-Z]{2}[0-9]{2,4}" } }, { translations: { en: { title: "Number field", } }, name: "number-field", attributes: { type: "number", step: 5, min: 15, max: 25, } }, { translations: { en: { title: "Date field", } }, name: "date-field", attributes: { type: "date" } }, { translations: { en: { title: "Time field", } }, name: "time-field", attributes: { type: "time" } }, { translations: { en: { title: "Week field", } }, name: "week-field", attributes: { type: "week" } }, { translations: { en: { title: "Datetime field", } }, name: "datetime-field", attributes: { type: "datetime-local" } }, { translations: { en: { title: "Checkbox field", } }, name: "checkbox-field", attributes: { type: "checkbox" } }, { translations: { en: { title: "Month field", } }, name: "month-field", attributes: { type: "month" } }, { translations: { en: { title: "Telephone field", } }, name: "telephone-field", attributes: { type: "tel" } }, { translations: { en: { title: "Email field", } }, name: "email-field", attributes: { type: "email" } }, { translations: { en: { title: "URL field", } }, name: "url-field", attributes: { type: "url" } }, ], ``` ### Example fields Copy one of these into your Core Script, or send it to your developer, and adjust it to suit. **Date picker, e.g. 'Shipping date'** ```javascript title="Core Script" checkoutCustomElements: [ { name: "shipping-date", translations: { en: { title: "Shipping Date", detail: "Please select your preferred shipping date" } }, attributes: { required: true, type: "date" } }, ], ``` **Custom text, e.g. 'Tax ID Reference'** ```javascript title="Core Script" checkoutCustomElements: [ { translations: { en: { title: "Tax ID Reference", detail: "Please enter your Tax ID reference" } }, name: "tax-id", attributes: { required: false, type: "text", placeholder: "Enter Tax ID reference", minlength: 4, maxlength: 600 } }, ], ``` **Drop-down menu ("select" menu), e.g. 'Seasonal information'** Options can be grouped under headings (`groupName`), as in this example with "Group A" and "Group B". ```javascript title="Core Script" checkoutCustomElements: [ { translations: { en: { title: "Option Title", detail: "Select Option Detail" } }, name: "select-option-test", attributes: { required: true, type: "select", }, options: [ { translations: { en: {groupName: "Group A"}, }, items: [ {value: "Option 1", translations: { en: { label: "Option 1" } } }, {value: "Option 2", translations: { en: { label: "Option 2" } } } ], }, { translations: { en: { groupName: "Group B" } }, items: [ {value: "Option 3", translations: { en: { label: "Option 3" } } }, {value: "Option 4", translations: { en: { label: "Option 4" } } } ], } ] } ], ``` **Custom text, e.g. 'Shipping instructions'** ```javascript title="Core Script" checkoutCustomElements: [ { translations: { en: { title: "Shipping instructions field", detail: "Please confirm any shipping instructions for us" } }, name: "shipping-instructions", attributes: { required: true, type: "text", placeholder: "Shipping instructions field", minlength: 4, maxlength: 600 } }, ], ``` **Number, e.g. 'Contact phone number'** ```javascript title="Core Script" checkoutCustomElements: [ { translations: { en: { title: "Contact phone number", detail: "Please supply a phone number to allow us to contact you" } }, name: "number-field", attributes: { type: "number", min: 10, max: 25, } }, ], ``` **File attachments (e.g. Purchase Order file upload)** File uploads are also added as a custom checkout field. See [Let customers upload files at checkout](#file-upload-file-attachments). **Date picker that requires date at least 1 day in future** ```javascript title="Core Script" checkoutCustomElements: [ { name: "delivery-date", translations: { en: { title: "Delivery Date", detail: "Delivery date must be at least one day in future." } }, attributes: { required: true, type: "date", min: ((d) => { d.setDate(d.getDate() + 1); return d.toISOString().slice(0,10); })(new Date()) } }, ], ``` **Date picker that restricts by weekends and specific dates** This uses `onChange` to block past dates (and today after 12:00 UK time), weekends and the listed UK bank holidays, with a different message for each. Update the bank holiday list for the current year. ```javascript title="Core Script" checkoutCustomElements: [ { translations: { en: { title: "Delivery Date", detail: "Delivery unavailable on weekends.", 'select-mon-fri': "Date must be Monday-Friday", 'select-date-in-future': "Select a date in the future", 'select-non-bank-holiday': "Select another date which is not a UK bank holiday", }, }, name: "delivery-date-requested", attributes: { required: true, type: "date" }, onChange(val, el) { const [year, month, date] = val.split('-'); const selectedDate = new Date( Number(year), Number(month)-1, Number(date), 0, 0, 0, 0 ); const now = new Date() const ukTime = now.toLocaleString( 'en-GB', { hour: '2-digit', hour12: false, timeZone: 'Europe/London' } ); const earliestDeliveryDate = new Date( now.getFullYear(), now.getMonth(), now.getDate() + (Number(ukTime) >= 12 ? 1 : 0) ) const ukBankHolidays = [ '07/04/2023', '10/04/2023', '01/05/2023', '08/05/2023', '29/05/2023', '28/08/2023', '25/12/2023', '26/12/2023', ]; const selectedDateStr = new Intl.DateTimeFormat('en-GB', { dateStyle: 'short' }) .format(selectedDate); let messageTranslationKey switch (true) { // Date is in the past case selectedDate < earliestDeliveryDate: messageTranslationKey = 'select-date-in-future' break; // Day is weekend case [0, 6].includes(selectedDate.getDay()): messageTranslationKey = 'select-mon-fri' break; // Is bank holiday case ukBankHolidays.includes(selectedDateStr): messageTranslationKey = 'select-non-bank-holiday' break; } return { valid: messageTranslationKey === undefined, messageTranslationKey } } } ], ``` **Checkbox to require customer confirmation** ```javascript title="Core Script" checkoutCustomElements: [ { translations: { en: { title: "I agree to the terms and conditions", detail: "Please confirm you've read and agree to the terms and conditions", }, }, name: "confirmation", attributes: { required: true, type: "checkbox" }, }, ], ``` ## Reference ### Custom field settings Settings for fields added in the Core Script, for your developer: | Key | What it does | | --- | --- | | `name` | The name of the field. It's shown in your eCommerce platform but not to customers. **Required** (standard fields use `id` instead). | | `translations` | An object of customer-facing text, keyed by two-letter language code ([ISO 639-1](https://www.wikiwand.com/en/ISO_639-1)). **Required.** | | `title` | Inside `translations`: the text shown in bold above the field. **Required.** | | `detail` | Inside `translations`: small helper text shown under the field, for example to explain what to enter. | | `attributes` | HTML attributes for the field, which set its type and validation: `max`, `maxlength`, `min`, `minlength`, `name`, `pattern`, `placeholder`, `required` (default `false`), `disabled` (default `false`), `step` and `type` (default `text`). Some attributes only apply to certain types; see the [MDN input attributes reference](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attributes). | | `options` | For `select` fields: the drop-down options, optionally in named groups. | | `onChange` | A function that validates the value and returns a message key from `translations` if it's invalid. | To change the default look of the fields, see [Frontend integration](https://docs.sparklayer.io/developers/frontend.md). ### Supported field types | Field type | What the customer enters | | --- | --- | | `text` | Free text | | `select` | A choice from a drop-down menu | | `number` | A number | | `date` | A date, DD/MM/YYYY | | `time` | A time, 00:00 | | `week` | A week (for example, week 4) | | `month` | A month of the year (for example, 12) | | `datetime-local` | A date and time, DD/MM/YYYY 00:00 | | `checkbox` | A tick box (allows multiple selections) | | `tel` | A phone number | | `email` | An email address | | `url` | A website URL | | `file` | A file attachment (Growth, Pro and Enterprise plans) | ## FAQs **Do I need a developer to add checkout fields?** Not for standard or custom fields: add them at **Storefront > Options > Checkout** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Checkout** in the Shopify app. File uploads and validation rules need a developer. See [What you can do without code](#what-you-can-do-without-code). **Can I use custom checkout fields on Wix?** **Wix only:** Yes, with a developer. They add the fields in code, with `checkoutCustomElements` in the `window.sparkWixOptions` script. See [JavaScript options](https://docs.sparklayer.io/help/platforms/wix/install.md#javascript-options) and [Wix limitations](https://docs.sparklayer.io/help/platforms/wix/limitations.md). **What's the difference between checkout fields and the Additional Information field?** **Additional Information** is one free-text box (up to 512 characters), saved to the order notes. You can add as many checkout fields as you need, each with its own type and validation. See [Cart and checkout](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md#set-up-the-additional-information-field-po-number). **Can I raise the 20MB file size limit?** No. 20MB is the maximum. You can set a lower limit with `maxsize`. **Why can't I open an uploaded file from the Shopify order?** **Shopify only:** Shopify stores only a reference to the file. Download it from the customer's account (as the customer or a sales agent) or through the Files API. See [Download uploaded files](#download-uploaded-files). --- # Payment methods URL: https://docs.sparklayer.io/help/ordering/payment-methods Choose how each B2B customer group can pay (on account, by invoice or by card), see how each method affects the order, and rename or reorder them at checkout. > **Quick summary** > > - SparkLayer has 3 B2B payment methods. With **Pay on Account** and **Pay by Invoice**, the customer orders now and pays you later. With **Pay Online by Card**, they pay in your store's checkout straight away. > - Choose the methods for each customer group in its **Payment methods** rule at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app, where they have different names: see [Payment method names](#names). On Shopify, you can also give a method a discount or surcharge, or hide it, when an order meets your conditions: see [Payment method rules](https://docs.sparklayer.io/help/ordering/payment-method-rules.md). > - On Shopify, on-account and invoice orders arrive as draft orders unless you turn on **Auto-complete draft orders**. Card orders arrive paid. > - To let customers ask for a quote instead of paying, turn on the [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md). Quotes aren't a payment method. ## How it works On the **Review & Pay** step of the [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md), customers pick from the payment methods their customer group allows. Their choice decides whether they pay now, and how the order arrives in your store. | Payment method | For the customer | For you and the order | | --- | --- | --- | | **Pay on Account** | Checks out without payment details. The order is charged to their account, for example on Net 30 terms. | An offline method. You can set a [credit limit and net terms](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md) for each customer and collect payment later. | | **Pay by Invoice** | Checks out without payment details, and pays later, for example on Net 30 terms. | An offline method. You take payment outside the store, for example by bank transfer, often against an [invoice](https://docs.sparklayer.io/help/ordering/invoices.md). You can set [net terms](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md), but there's no credit limit. | | **Pay Online by Card** | Pays straight away in your store's standard checkout, by card or any other method your store offers. Sometimes called pro forma payment. | The order arrives paid (completed), with nothing to collect. | ### Which method to offer | If you want customers to... | Offer | | --- | --- | | Pay before you ship, for example new customers | **Pay Online by Card** | | Order within a credit limit and pay on terms such as Net 30 or Net 60 | **Pay on Account**, with [credit limits and net terms](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md) | | Order now and pay later against an invoice, for example by bank transfer, with or without net terms but no credit limit | **Pay by Invoice** | | Agree a price with your team before ordering | The [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md) | | Encourage a method with a discount, cover card fees with a surcharge, or offer a method only for some orders | [Payment method rules](https://docs.sparklayer.io/help/ordering/payment-method-rules.md), on Shopify | A group can have several methods, for example card and on account for long-standing customers, and card only for new ones. **Shopify only:** To follow each method from checkout to payment, step by step, try the interactive guide [How payments work](https://docs.sparklayer.io/help/guides/how-payments-work.md). ### Which payment methods work with the SparkLayer checkout? **Shopify only:** | Payment method | Works? | How | | --- | --- | --- | | **Card gateways**, such as Shopify Payments or PayPal | Yes | Through **Pay Online by Card**, which takes the customer to Shopify's checkout. | | **Manual (custom) methods**, such as Zelle or bank transfer | Yes | Zelle isn't a Shopify automated gateway. Add it as a manual payment method in **Settings > Payments** ([open in the Shopify admin](https://admin.shopify.com/settings/payments)), and it shows in Shopify's checkout with **Pay Online by Card**. Or offer **Pay by Invoice** and explain how to pay in a [payment method message](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md#add-a-message-for-each-payment-method). | | **ACH bank transfer** | Partly | It shows at Shopify's own payment step, the last step of the checkout, with **Pay Online by Card**. Full ACH support in the SparkLayer checkout is in development, with no date yet. | | **Pay on Account** and **Pay by Invoice** | Yes | SparkLayer's own methods. The customer checks out without payment details and you collect payment later. | | **Quotes** | Yes | Not a payment method: the customer chooses how to pay when they complete the quote. See [Set up quotes](https://docs.sparklayer.io/help/ordering/quoting.md). | | **Shopify gift cards** | With card checkout only | Only in Shopify's checkout, with **Pay Online by Card**. Not with **Pay on Account** or **Pay by Invoice**. | Each order has one payment method, so a customer can't split an order between methods, such as part on account and part by card. ### How orders arrive in your store Which payment method the customer chooses decides how the order arrives in your platform: paid and ready to fulfil, or waiting for you to collect payment. **Shopify:** How B2B payment methods work with SparkLayer and Shopify, starting from the B2B checkout (SparkLayer): - **Pay online by card (upfront):** - If it's a **sales agent order**, or a **company user order**, an email is sent to the customer to complete payment. The customer clicks the link, pays in the **Shopify checkout** and the order is completed in Shopify. - Otherwise the customer pays in the **Shopify checkout** and the order is completed in Shopify. - **Payment on account or by invoice:** the order is completed in SparkLayer ("Order completed (SparkLayer)"). - If **auto-complete draft orders** is on, a completed order is created in Shopify. - If it's off, a draft order is created in Shopify, which becomes a completed order once it's manually marked as complete. | Payment method | How the order arrives | | --- | --- | | **Pay on Account** and **Pay by Invoice** | A [draft order](https://help.shopify.com/en/manual/orders/create-orders) by default, so you can make changes before you take payment and fulfil. To create completed orders instead, turn on **Auto-complete draft orders**. | | **Pay Online by Card** | The customer pays in the Shopify checkout and the order arrives completed. If they don't finish paying, the order still shows in your Shopify draft orders. | | **Pay Online by Card**, chosen by a **sales agent** or **company user** | The customer is emailed to complete payment, then the order continues as normal. | **Auto-complete draft orders** is at **Integrations > Platform > Shopify order actions** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform > Shopify order actions** in the Shopify app. See [Complete draft orders automatically](https://docs.sparklayer.io/help/ordering/automation-and-workflows.md) and [Shopify payment methods](https://docs.sparklayer.io/help/platforms/shopify/customisations/payment-methods.md). **Wix:** Orders are created in your Wix admin under **Sales > Orders**. Every method except **Pay Online by Card** creates an unpaid order. | Payment method | How the order arrives | | --- | --- | | **Pay on Account** | Payment status "UNPAID". Mark it as paid once you've received payment, for example offline. | | **Pay by Invoice** | Payment status "UNPAID". Mark it as paid once you've received payment. | | **Pay Online by Card** (**Card at checkout** in the customer group) | Payment status "PAID". You can fulfil it straight away. | Pay Online by Card takes customers to the Wix checkout, with all the Wix payment methods you've set up, such as card or PayPal. **Other platforms:** | Payment method | What happens | | --- | --- | | **Pay on Account** and **Pay by Invoice** | The customer places the order without entering payment details. | | **Pay Online by Card** | The customer goes to your store's checkout, enters their card details and sees the payment methods you've set up there. | For how orders are created on your platform, see the [developer docs](https://docs.sparklayer.io/developers.md). ## Choose which payment methods a customer group can use 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. To change every group, click **Edit** on the base customer group. 2. Under **Inherited rules**, click **+ Override** next to **Payment methods** (on the base group, **+ Customize**). The rule moves up to **Customized rules**. 3. Tick the methods the group can use: **Pay by invoice** ("Place an order and be invoiced later"), **Payment on account** ("Order on account, e.g. net terms and credit") and **Card at checkout** ("Pay online by card"). 4. Click **Save**. Groups inherit the base customer group's methods until you override them. Click **Reset** on the rule to hand it back. See [Customer groups](https://docs.sparklayer.io/help/customers/customer-groups.md#choose-payment-methods). ## Add a discount or surcharge, or hide a method **Shopify only:** Under each method you tick, click **Add rule** to change the method for orders that meet your conditions: - **Apply a discount**, such as 2% off for paying by invoice. - **Apply a surcharge**, such as a 1.5% fee on card payments. - **Hide this payment method**, such as **Pay on Account** on orders over £5,000. Customers see each method's discount or surcharge next to it on **Review & Pay**. Laws on surcharges vary by country, so check them where you sell before you add one. Rules need the Growth plan or above and Core Script 4.13.0 or later. See [Payment method rules](https://docs.sparklayer.io/help/ordering/payment-method-rules.md). **More detail** **Shopify only:** On Shopify, you can also let a [company](https://docs.sparklayer.io/help/customers/companies.md) pay later, or stop it, whatever its group says. Open the company at **Companies** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/companies)), or **SparkLayer Wholesale > Companies** in the Shopify app and use **Let them pay later** ("They order now and pay by invoice, up to their credit limit."). Each location has its own **Pay later** setting. ## Set up net terms and credit limits [Net terms](https://docs.sparklayer.io/help/glossary.md#net-terms) (such as Net 30) are how many days a customer has to pay an order they didn't pay for at checkout, so they apply to both **Pay on Account** and **Pay by Invoice**. A credit limit applies to **Pay on Account** only. Both are on every plan. You set them on each customer in a [metafield](https://docs.sparklayer.io/help/glossary.md#metafields) (an extra field on the customer record in your store admin). Customers see them in the **Financials** section of [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md). See [Credit limits and net terms](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md). ## Rename payment methods Change the names customers see 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, without code: add an override for the key and enter the new name. See [Change checkout text](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md#change-checkout-text). | Default name | Translation key | | --- | --- | | **Pay by Invoice** | `cart.checkout.payment-method.full.paymentByInvoice` | | **Pay on Account** | `cart.checkout.payment-method.full.paymentOnAccount` | | **Pay Online by Card** | `cart.checkout.payment-method.full.upfrontPayment` | **Core Script code for your developer** A developer can set the same names in your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting): ```javascript title="Core Script" translations: { en: { "cart.checkout.payment-method.full.paymentByInvoice": "Pay by Invoice", "cart.checkout.payment-method.full.paymentOnAccount": "Pay on Account", "cart.checkout.payment-method.full.upfrontPayment": "Pay Online by Card", } }, ``` To explain a method, such as how Pay by Invoice works, add a message under it. See [Add a message for each payment method](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md#add-a-message-for-each-payment-method). ## Change the order and default payment method Customers see payment methods in a set order, and the first is selected by default. To change the order without code: 1. Go to **Storefront > Options** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options** in the Shopify app and open **Checkout**. 2. Under **Payment methods, in order**, drag the methods into the order you want. 3. Click **Save and publish**. The order only affects methods the customer's group can use. **Core Script code for your developer** A developer can set `paymentMethodsOrder` in your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting) instead, using the Core Script names in [Payment method names](#names). Here, Payment on account is first, so it's the default: ```javascript title="Core Script" paymentMethodsOrder: [ "paymentOnAccount", "paymentByInvoice", "upfrontPayment", ], ``` To make card payment (`upfrontPayment`) the default, move it to the top: ```javascript title="Core Script" paymentMethodsOrder: [ "upfrontPayment", "paymentOnAccount", "paymentByInvoice", ], ``` ## Choose which card payment options customers see (Shopify) **Shopify only:** **Pay Online by Card** takes customers to the Shopify checkout, with every [Shopify payment method](https://help.shopify.com/en/manual/payments/additional-payment-methods) you've set up, such as credit card, PayPal or cash on delivery. To hide some of them from B2B customers on Shopify: 1. Install a Shopify app that hides payment methods, such as [ETP Hide and Sort Payment Methods](https://apps.shopify.com/etp-hide-sort-payments?) or [Payfy Conditional Payments](https://apps.shopify.com/payfy-conditional-payments). 2. In the app, add a rule for customers with the `b2b` tag, and choose the methods to hide, such as PayPal and Cash on Delivery. Only Shopify Plus stores can hide the **Credit card** method. This is a limit of Shopify's Payment Customization API. On other platforms, **Pay Online by Card** shows your standard checkout's payment methods. ## Show payment status to customers **Shopify only:** Payments visibility lets customers see whether each order is paid, their payment history and what they owe, in [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md). It's for Shopify only. 1. Go to **Settings > Configurations > Ordering** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Ordering** in the Shopify app. 2. Turn on **Payments visibility** ("Show the payment status of orders in the My Account area"). 3. Click **Save**. It's the same setting as **Show payment status** at **Storefront > Options > My Account** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > My Account** in the Shopify app: turning on either turns on both. Once it's on: - The My Account order list has a **Payment** column, showing **Paid** or **Unpaid**. It updates when you change the payment status in Shopify. - The order's [timeline](https://docs.sparklayer.io/help/customers/timeline.md) logs each payment, with the amount and date, such as "US$666.90 paid against order". - With [Xero](https://docs.sparklayer.io/help/integrations/accountancy/xero.md), payments against Xero invoices appear as transactions on the order. ## Show a real-time account balance **Shopify only:** With Payments visibility on, SparkLayer keeps a real-time account balance for each customer. The **Financials** section of My Account shows their **Payment terms**, **Unpaid Balance** and **Credit Limit**. SparkLayer starts from an **opening balance** (what the customer owed on a given date), then tracks every new order and payment. This works with Shopify, Xero and QuickBooks Online, so customers can see which orders are paid or outstanding, and your team gets fewer balance queries. ### Set an opening balance **Shopify only:** The opening balance goes in the same customer metafield as the credit limit: **Credit Limit and Account Balance** (namespace `sparklayer`, key `payment_on_account`). To set up the metafield, see [Credit limits and net terms](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md). 1. In the form below, enter the **Balance** the customer owes and the **Balance date** it applies from, plus their **Credit limit** and **Net terms** if they have them: the value replaces everything in the field. It writes the date in the format SparkLayer needs. 2. In the Shopify admin, go to **Customers** ([open in the Shopify admin](https://admin.shopify.com/customers)) and open the customer. 3. Paste the value into the **Credit Limit and Account Balance** metafield, replacing what's there, and save the customer. | Property | What it is | Example | | --- | --- | --- | | `balance` | The amount owed on a specific date. | `150.00` | | `balance_date` | The date and time of the balance, in RFC 3339 format. | `2025-01-01T18:00:00+08:00` | Whenever you update the metafield, SparkLayer recalculates the balance from the new values. ## Payment method names Each method has a different label in each part of SparkLayer: the checkout, a customer group's **Payment methods** rule at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app, and **Payment methods, in order** at **Storefront > Options > Checkout** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Checkout** in the Shopify app. | Buyers see at checkout | Customer group rule | Storefront options | Core Script name | | --- | --- | --- | --- | | **Pay on Account** | **Payment on account** | **Payment on account** | `paymentOnAccount` | | **Pay by Invoice** | **Pay by invoice** | **Payment by invoice** | `paymentByInvoice` | | **Pay Online by Card** | **Card at checkout** | **Upfront payment** | `upfrontPayment` | | **Request for Quote** (retired) | – | **Quote** | `quote` | ## FAQs **Why do customers only see card payment, with Pay by Invoice not showing?** Their customer group only allows **Card at checkout**. Customers see the payment methods their group allows, so a card-only group shows credit card (upfront) payment and nothing else. Tick **Pay by invoice** or **Payment on account** on the group: see [Choose which payment methods a customer group can use](#choose-which-payment-methods-a-customer-group-can-use). **Shopify only:** On Shopify, also check the customer's company has **Let them pay later** on. A company or location with pay later off can only pay by card. See [Customers only see card payment](https://docs.sparklayer.io/help/troubleshooting.md#customers-only-see-card-payment). **How do I turn off card payment and offer pay by invoice only?** On the customer group, untick **Card at checkout** and tick **Pay by invoice**, then click **Save**. Customers in the group then check out without paying upfront, and on Shopify the order arrives as a draft order by default, for you to invoice. See [Choose which payment methods a customer group can use](#choose-which-payment-methods-a-customer-group-can-use). **How often does the customer's balance update?** Whenever a new order is placed, or a payment syncs from your store or accounting tool (Xero or QuickBooks Online). **Can I update balances in bulk?** Yes. Update the **Credit Limit and Account Balance** metafield for several customers with Shopify's bulk editor or a CSV import tool. **Why is the "Payment on Account" metafield not updating?** The metafield keeps the values you set. The real-time balance is calculated and held in SparkLayer, not written back to the metafield. **Can I still use Request for Quote?** No. Quotes use the [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md), and Request for Quote can't be selected in a customer group. **Can I add a message to explain a payment method?** Yes. A message can show under each payment method on **Review & Pay**, the same for every customer. See [Add a message for each payment method](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md#add-a-message-for-each-payment-method). **Can I preselect a different payment method for each customer group?** No. The first method in **Payment methods, in order** is selected by default, and the order is the same for every customer group. See [Change the order and default payment method](#change-the-order-and-default-payment-method). If a [payment method rule](https://docs.sparklayer.io/help/ordering/payment-method-rules.md) hides the first method, the next one shown is selected. **Can I charge a fee for card payments?** Yes, on Shopify. Add a [payment method rule](https://docs.sparklayer.io/help/ordering/payment-method-rules.md) to **Card at checkout** that applies a surcharge, as a percentage or a fixed amount. Laws on surcharges vary by country, so check them where you sell first. **Can customers pay with Zelle or ACH?** Zelle works as a Shopify manual payment method. ACH bank transfer shows at Shopify's own payment step, and full ACH support is in development. See [Which payment methods work with the SparkLayer checkout?](#which-payment-methods-work-with-the-sparklayer-checkout) --- # Payment method rules URL: https://docs.sparklayer.io/help/ordering/payment-method-rules Applies to: Shopify Add a discount or surcharge to a payment method, or hide it, when an order meets your conditions, such as its sub-total, items, credit or shipping destination. > **Quick summary** > > - A payment method rule gives a payment method a discount or a surcharge, or hides it, when an order meets your conditions, for example a 2% surcharge on card payments under £500. > - Add rules to each payment method in a customer group's **Payment methods** rule, at **Customers > Groups > Payment methods** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups > Payment methods** in the Shopify app. > - Needs the Growth plan or above and Core Script 4.13.0 or later. For Shopify stores. > - Rules don't apply to quotes. ## How it works A rule belongs to one payment method in one customer group. It has 2 parts: - **When:** the conditions the order must meet, such as an order sub-total of at least £500. A rule with no conditions applies to every order. - **Then:** the outcome. **Apply a discount**, **Apply a surcharge** or **Hide this payment method**. An order must meet every condition on a rule for it to apply. Every rule that applies is used, so a method can have a discount and a surcharge at the same time. There's no priority to set: SparkLayer always works them out in the same order. How payment method rules are applied to an order: 1. **Hide rules**: A method with a matching hide rule isn't shown, and its other rules don't apply 2. **Discounts**: Your normal discounts, then payment rule discounts, off the net sub-total 3. **Surcharges**: Added to the net sub-total after every discount 4. **Shipping and tax**: Worked out with the surcharge included > **Check surcharge laws where you sell** > > Laws on surcharges, and on charging different amounts for different payment methods, vary by country and region. Some places limit or ban surcharges on certain payment methods. Check the rules in every country you sell to before you add a surcharge. You're responsible for making sure your rules comply: SparkLayer doesn't check them against any law. ### A worked example A customer pays by card for £1,000 (net) of products, with a 10% off coupon. **Card at checkout** has 2 rules: - **Rule 1:** a 5% discount, with no conditions. - **Rule 2:** a 2% surcharge, when the order sub-total is at least £500. | Step | Amount | Order sub-total | | --- | --- | --- | | Products | £1,000.00 | £1,000.00 | | 10% off coupon | -£100.00 | £900.00 | | Rule 1: 5% of £900.00 | -£45.00 | £855.00 | | Rule 2: 2% of £855.00 | +£17.10 | £872.10 | | Shipping and tax | Worked out on £872.10 | | Rule 2's minimum is checked against £900.00: the sub-total after the coupon, before the payment rule discount. See [Which sub-total conditions use](#which-sub-total-conditions-use). ## Add a rule 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. To add rules for every group, click **Edit** on the base customer group. 2. If **Payment methods** is under **Inherited rules**, click **+ Override** next to it (on the base group, **+ Customize**). 3. Under a ticked payment method, click **Add rule**. 4. Under **When**, tick the conditions the order must meet and fill them in. To apply the rule to every order, leave them all unticked. 5. Under **Then**, choose **Apply a discount**, **Apply a surcharge** or **Hide this payment method**. 6. For a discount or surcharge, choose **Percentage** or **Fixed amount**, and enter the amount. 7. Click **Update customer group**. **More detail** - Groups that inherit the **Payment methods** rule inherit its payment method rules too. - Unticking a payment method deletes its rules when you save. - **Reset** on the **Payment methods** rule deletes the group's rules, and the group goes back to the inherited methods and rules. ## Conditions | Condition | The rule applies when | Notes | | --- | --- | --- | | **Order sub-total** | The order's net sub-total is between the **Minimum** and **Maximum** | Excludes shipping and tax. See [Which sub-total conditions use](#which-sub-total-conditions-use) | | **Order items** | The number of items is between the **Minimum** and **Maximum** | Count the **Quantity across all line items** or the **Number of line items**. Free products from discounts and custom line items count | | **Available credit** | The customer's remaining credit is between the **Minimum** and **Maximum** | How much [credit](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md) they have left on their account when they reach checkout. A customer with no credit limit meets any minimum and never meets a maximum | | **Products** | The order contains a product that matches any of your filters | Filter on **SKU**, **Shopify Vendor** or **Shopify Tags**. Values must be spelled as in your store, but capitals don't matter | | **Pre-order items** | The cart contains a pre-order item, or contains none | A pre-order item is one the customer can order without stock. This doesn't check that the other items are in stock | | **Shipping destination** | The shipping address is in one of the **Countries** you choose | Narrow a country to some regions, or leave its regions empty for the whole country. The billing address isn't checked | The minimum is included and the maximum isn't: with a **Maximum** of £100, the rule applies to orders up to £99.99. Amounts exclude tax. ### Which sub-total conditions use **Order sub-total** is checked against the net sub-total after your normal [discounts](https://docs.sparklayer.io/help/pricing/discounts.md) and before any payment rule discount. This is the same for every rule, whatever its outcome. For example, a group has a 10% payment rule discount and a surcharge for orders of at least £950. On a £1,000 order, the surcharge still applies, because £1,000 meets the minimum. It's then worked out on £900, the sub-total after the discount. ## Outcomes | Outcome | What happens | | --- | --- | | **Apply a discount** | Taken off the net sub-total, after all your other discounts. A **Percentage** or a **Fixed amount** | | **Apply a surcharge** | Added to the net sub-total after every discount, before shipping and tax. A **Percentage** or a **Fixed amount**. It's taxed at your store's default tax rate, so it adds to the order's tax as well as its total | | **Hide this payment method** | The method isn't shown while the conditions match. Keep at least one method that no hide rule matches. To hide a method from every order, untick it instead | Fixed amounts and money conditions are in the group's currency, and aren't converted: 5 means £5 in a GBP cart and €5 in a EUR cart. ### When several rules apply - **Hide wins.** If a hide rule matches, the method is hidden and its discount and surcharge rules don't apply. - **Discounts all come off the same amount.** A 10% and a 20% payment rule discount on a £900 sub-total take £90 and £180 off, £270 in all, in any order. - **Surcharges add up**, and each percentage is worked out on the same amount. A 2% and a 3% surcharge on £855 add £42.75. A fixed surcharge is added as it is. - **Surcharges count towards shipping.** Shipping is worked out after the surcharge, so a surcharge can move an order into a different shipping rate based on order total, such as free shipping over £1,000. - **Payment rule discounts aren't limited by compatibility.** They apply alongside any other discount, whatever its **Can be used with** setting. ## What customers see at checkout On **Review & Pay** in [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md): - Each payment method shows its discounts and surcharges, such as `-5%` or `+£5.00`, so customers can compare before they choose. - The totals list each payment rule discount, such as "Card payment discount (5%)", and a **Surcharge** line, excluding tax. - A hidden method isn't shown. If it was selected, the first method still shown in **Payment methods, in order** is selected instead. Rules apply from **Review & Pay**, not earlier in the cart. To explain a surcharge or discount to your customers, add a [message for the payment method](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md#add-a-message-for-each-payment-method). ## What the order looks like in Shopify In Shopify, the order shows: - **A surcharge** as a line item named **Surcharge**, with a quantity of 1. Its tax is in the order's tax, as at checkout. - **A payment rule discount** as lower line item prices, the same as other SparkLayer discounts. It's listed in the order's **B2B Discount Data** with its other discounts. See [See discount details on an order](https://docs.sparklayer.io/help/pricing/discounts.md#see-discount-details-on-an-order). ## Change the text customers see Change these in **Translation overrides**: see [Change checkout text](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md#change-checkout-text). `{amount}` is the rule's amount, such as `5%` or `£10.00`. | Default text | Key | | --- | --- | | Card payment discount (\{amount}) | `cart.checkout.discount.payment-rule.upfrontPayment` | | Pay on account discount (\{amount}) | `cart.checkout.discount.payment-rule.paymentOnAccount` | | Invoice payment discount (\{amount}) | `cart.checkout.discount.payment-rule.paymentByInvoice` | | Surcharge | `global.totals.surcharge` | | View discounts | `cart.checkout.discount.cta-view-only` | | Sorry, your order wasn't placed as your total changed. Please check it and try again. | `cart.validation-messages.payment-method-not-calculated` | **View discounts** opens the list of discounts when a payment rule discount applies and your store has no coupon codes. The amounts shown next to each payment method, and the **Surcharge** line item name in Shopify, can't be changed. **Core Script code for your developer** ```javascript title="Core Script" translations: { en: { "cart.checkout.discount.payment-rule.upfrontPayment": "Card payment discount ({amount})", "global.totals.surcharge": "Card fee", } }, ``` ## Limits | Limit | Value | | --- | --- | | Rules per payment method | 5 | | Filters in a **Products** condition | 25 | | Payment methods | **Pay by invoice**, **Payment on account** and **Card at checkout** | | Plan | Growth or above | | Core Script | 4.13.0 or later. 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 | | Price list | The customer group, or a group it inherits from, needs a price list, which sets the currency of its rules | | Quotes | Rules don't apply to quotes, from the [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md) or the retired Request for Quote | ## FAQs **Can I charge a fee for card payments?** Yes. Add a rule to **Card at checkout** with **Apply a surcharge**, as a percentage or a fixed amount. Leave the conditions empty to charge it on every card order. Check the surcharge laws in each country you sell to first: see [How it works](#how-it-works). **Can I give a discount for paying by card?** Yes. Add a rule to **Card at checkout** with **Apply a discount**. It comes off after your other discounts, and customers see it next to the method at checkout. **Why didn't my rule apply?** Check that the order meets every condition on the rule, and that: - The maximum isn't included: a **Maximum** of £100 doesn't match a £100 order. - **Order sub-total** is checked after your normal discounts, and excludes shipping and tax. - The customer is in the group you added the rule to, or one that inherits its **Payment methods** rule. - A hide rule on the same method doesn't match, as it stops the method's other rules. - Your Core Script is 4.13.0 or later. **Is the surcharge taxed?** Yes, at your store's default tax rate. Its tax is added to the order's tax at checkout, and the order total includes it. **Can a surcharge give an order free shipping?** Yes. Shipping is worked out after the surcharge, so it counts towards shipping rates based on order total. A surcharge can move an order over a free shipping threshold. **Does a surcharge count towards a customer's credit limit?** Yes. **Pay on Account** checks the order's total with tax, including its payment rule discounts and surcharges. If that's more than the customer's available credit, they can't use it for the order. See [Credit limits and net terms](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md). **What happens to the Available credit condition when a customer has no credit limit?** A customer with no credit limit meets any **Minimum** and never meets a **Maximum**. For example, a rule that hides **Pay on Account** when available credit is under £500 never hides it from them. **Can I set different amounts for each currency?** No. Amounts are in the group's currency and aren't converted, so a fixed surcharge of 5 is £5 in a GBP cart and €5 in a EUR cart. A percentage works the same way in every currency. **Do payment method rules apply to quotes?** No. Rules don't apply to quotes from the [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md), and you can't add them to the retired Request for Quote method. --- # Credit limits and net terms URL: https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing Give B2B customers credit limits, account balances and net terms such as Net 30 using SparkLayer metafields, and choose how to send or attach their invoices. > **Quick summary** > > - Give each B2B customer a [credit limit](https://docs.sparklayer.io/help/glossary.md#credit-limit), an account balance and [net terms](https://docs.sparklayer.io/help/glossary.md#net-terms) (7 to 90 days). Enter them on the customer's record in your store admin, in the [metafield](https://docs.sparklayer.io/help/glossary.md#metafields) **Credit Limit and Account Balance** (`sparklayer.payment_on_account`). > - Customers see them in the **Financials** section of [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md). By default, **Pay on Account** is turned off for an order over the credit limit. > - Net terms are how many days a customer has to pay an order they didn't pay for at checkout, with **Pay on Account** or **Pay by Invoice**. Credit limits only apply to **Pay on Account**. On Shopify, Pay on Account orders arrive as draft orders with Shopify's payment terms filled in. > - Credit limits, balances and net terms are on every plan. Send invoices with [SparkLayer Invoices](https://docs.sparklayer.io/help/ordering/invoices.md) (automatic PDF invoices, payment reminders and your own invoice template, on Growth and above), your store, an attached invoice file, or an app such as Sufio. ## How it works How credit and net terms work, from setup to payment: 1. **Set terms on the customer**: Credit limit, balance and net terms in the customer metafield 2. **Customer sees them**: In the Financials section of My Account 3. **Customer pays on account**: At checkout, within their credit limit 4. **Order arrives with terms**: On Shopify, a draft order with payment terms and a due date 5. **You invoice and collect**: Through SparkLayer Invoices, your store, your own files or an app **Shopify only:** To compare Pay on Account with the other payment methods, step by step, see the interactive guide [How payments work](https://docs.sparklayer.io/help/guides/how-payments-work.md). Before you start: - **Pay on Account or Pay by Invoice is turned on** for the customer's group. Credit limits only apply to Pay on Account; net terms apply to both. See [Payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md#choose-which-payment-methods-a-customer-group-can-use). - **The payment on account metafield exists** in your store. You set it up once: see [The payment on account metafield](#the-payment-on-account-metafield). ### The payment on account metafield A metafield is an extra field on a record in your store admin. Credit limits, balances and net terms all live in one customer metafield. **Shopify only:** On Shopify, SparkLayer can add it for you: go to **Integrations > Platform** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform** in the Shopify app and, in the **Metafields** card, click **Configure** next to **SparkLayer metafields**. See [Shopify metafields and data mapping](https://docs.sparklayer.io/help/platforms/shopify/metafields.md). For other platforms, see the [developer docs](https://docs.sparklayer.io/developers.md). **Metafield details, for adding it by hand** | Item | Value | | --- | --- | | **Custom data type** | Customers. On Shopify, see [customer metafields](https://admin.shopify.com/settings/custom_data/customer/metafields). | | **Metafield type** | `JSON` | | **Namespace** | `sparklayer` | | **Key** | `payment_on_account` | | **Value** | Set on each customer record, for example `{"credit_limit":1000,"balance":250,"net_terms":"30_days"}`. Include only the properties you use. | The value is a short piece of text in a set format (JSON), with these properties: | Property | What it does | Example | | --- | --- | --- | | `credit_limit` | The most the customer can owe you. | `1000` | | `balance` | What the customer owes you now. | `250` | | `currency_code` | The currency to show the limit and balance in, if you sell in more than one. | `usd` | | `net_terms` | The customer's payment terms. See [supported values](#set-net-payment-terms). | `30_days` | | `balance_date` | The date of an opening balance, for the real-time account balance. See [Payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md#payments---account-balance). | `2025-01-01T18:00:00+08:00` | ### What to enter Fill in the form and copy the value it writes. Leave out anything you don't use, and enter amounts without a currency symbol. Add a **Balance date** only for an [opening balance](https://docs.sparklayer.io/help/ordering/payment-methods.md#set-an-opening-balance) on Shopify: the date the **Balance** was owed from, which SparkLayer tracks new orders and payments from. Pick it in the form and it's written in the format SparkLayer needs: the date, the time and your time zone's offset from UTC, such as `2025-01-01T00:00:00+00:00` for midnight on 1 January 2025 in the UK. A date needs a balance with it. These are the common values, if you'd rather copy one: | To give the customer | Enter | | --- | --- | | A credit limit of 1,000 | `{"credit_limit":1000}` | | A credit limit of 1,000 and a balance of 250 | `{"credit_limit":1000,"balance":250}` | | Net 30 payment terms only | `{"net_terms":"30_days"}` | | A credit limit, a balance and Net 30 terms | `{"credit_limit":1000,"balance":250,"net_terms":"30_days"}` | | A credit limit and balance in US dollars, if you sell in several currencies | `{"credit_limit":1000,"currency_code":"usd","balance":250}` | | A credit limit and an opening balance of 250 owed on 1 January 2025 (UK time), for the real-time account balance on Shopify | `{"credit_limit":1000,"balance":250,"balance_date":"2025-01-01T00:00:00+00:00"}` | ## Set a credit limit and account balance 1. Open the customer's record in your store admin. On Shopify, go to **Customers** ([open in the Shopify admin](https://admin.shopify.com/customers)) and open the customer. 2. In the **Credit Limit and Account Balance** metafield, paste the value from the [form](#what-to-enter), for example `{"credit_limit":1000,"balance":250}`. 3. If you sell in several currencies (see [Shopify Markets and currencies](https://docs.sparklayer.io/help/platforms/shopify/markets-and-currencies.md)), add the customer's currency, for example `{"credit_limit":1000,"currency_code":"usd","balance":250}`. 4. Save the customer. **Lots of customers? Fill them in one table (Shopify):** in your Shopify admin, go to **Customers**, tick the customers and click **Edit customers**. Click **Columns**, tick **Credit Limit and Account Balance** under **Metafields**, type the values and click **Save**. See [Shopify's guide](https://help.shopify.com/en/manual/custom-data/metafields/bulk-edit-metafields). The balance updates automatically with each successful order, and you can change it by hand at any time. For a balance that also tracks payments, turn on **Payments visibility**: see [Show a real-time account balance](https://docs.sparklayer.io/help/ordering/payment-methods.md#payments---account-balance). | Where | What the customer sees | | --- | --- | | **My Account** | In **Financials**, for example, "Your account balance is £250.00 with a credit limit of £1,000.00", then "Payments may take some time to be updated. Please contact us to discuss payments or credit." | | **Checkout** | If the cart would exceed their available credit, "Your order currently exceeds your available credit limit". By default, **Pay on Account** is turned off and they must choose another method, such as **Pay Online by Card**. | **Check a customer's credit details in SparkLayer** Open the customer at **Customers** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/list)), or **SparkLayer Wholesale > Customers** in the Shopify app. Under **Financial details**, **Payment on account** shows their **Balance**, **Credit limit**, **Net terms** and **Currency**. These come from the metafield, so change them on the customer's record in your store admin. ### Worked example Available credit is the customer's `credit_limit` minus their `balance`. The balance is what they owe you, not what they have left to spend. | What happens | Metafield value | Available credit | | --- | --- | --- | | You give a new customer $250 to spend | `{"credit_limit":250,"balance":0}` | $250.00 | | They place a $77.80 order with **Pay on Account** | SparkLayer updates the balance to `77.80` | $172.20 | | They try to pay on account for a $200.00 order | No change | $172.20, so checkout is blocked for **Pay on Account** | Don't set `balance` to 250 to give them $250 to spend. `{"credit_limit":250,"balance":250}` means they already owe you $250, so they've used all their credit. Checkout blocks the order, rather than warning the customer, because of the customer group's **Prevent placing an order if exceeding credit limit** setting, shown on the group as **Checkout blocked if limit exceeded**. See [Block orders over the credit limit](https://docs.sparklayer.io/help/customers/customer-groups.md#block-orders-over-the-credit-limit). ### Let customers order over their credit limit By default, a customer can't pay on account for an order over their credit limit. To allow it, change the customer group's **Credit settings** rule: 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 **Credit settings** (on the base group, **+ Customize**), then **Configure**. 3. Turn off **Prevent placing an order if exceeding credit limit**, then click **Save**. Customers can then pay on account over their limit, with a message that the order may be delayed and subject to approval. See [Block orders over the credit limit](https://docs.sparklayer.io/help/customers/customer-groups.md#block-orders-over-the-credit-limit). There's also a store-wide setting at **Settings > Configurations** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations** in the Shopify app that lets customers use Pay on Account when an order takes them over their limit. ### Change the credit messages 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)). `{balance}`, `{creditLimit}` and `{type}` are replaced with the customer's own values. | Key | Default text | | --- | --- | | `account.main.my-details.payment-on-account.detail` | Your account balance is `{balance}` with a credit limit of `{creditLimit}`. | | `account.main.my-details.payment-on-account.detail-without-limit` | Your account balance is `{balance}`. | | `account.main.my-details.payment-on-account.net-terms` | Your payment terms are `{type}`. | | `account.main.my-details.payment-on-account.sub-text` | Payments may take some time to be updated. Please contact us to discuss payments or credit. | | `cart.checkout.payment-method.credit-unavailable.title` | Your cart currently exceeds your available credit limit | | `cart.checkout.payment-method.credit-unavailable.message` | Please choose an alternative payment method to complete your order. If you'd like to discuss your payment terms, please contact us. | | `cart.checkout.payment-method.credit-limit-hit.title` | Your cart currently exceeds your available credit limit | | `cart.checkout.payment-method.credit-limit-hit.message` | You can place an order but it may be delayed and subject to approval. If you'd like to discuss your payment terms, please contact us. | `credit-unavailable` messages show when Pay on Account is turned off for an order over the limit. `credit-limit-hit` messages show when you let customers order over it. **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: { "account.main.my-details.payment-on-account.detail": "Your account balance is {balance} with a credit limit of {creditLimit}.", "account.main.my-details.payment-on-account.detail-without-limit": "Your account balance is {balance}.", "account.main.my-details.payment-on-account.net-terms": "Your payment terms are {type}.", "account.main.my-details.payment-on-account.sub-text": "Payments may take some time to be updated. Please contact us to discuss payments or credit.", "cart.checkout.payment-method.credit-unavailable.title": "Your cart currently exceeds your available credit limit", "cart.checkout.payment-method.credit-unavailable.message": "Please choose an alternative payment method to complete your order. If you'd like to discuss your payment terms, please contact us.", "cart.checkout.payment-method.credit-limit-hit.title": "Your cart currently exceeds your available credit limit", "cart.checkout.payment-method.credit-limit-hit.message": "You can place an order but it may be delayed and subject to approval. If you'd like to discuss your payment terms, please contact us.", } }, ``` ## Set net payment terms Net terms tell the customer how many days they have to pay an order they didn't pay for at checkout, such as Net 30. They show as **Payment terms** (for example, "45 days") in **Financials** in My Account. 1. Open the customer's group at **Customers > Groups** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/customers/groups)), or **SparkLayer Wholesale > Customers > Customer groups** in the Shopify app and tick **Payment on account** (or **Pay by invoice**) in its **Payment methods** rule. See [Payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md#choose-which-payment-methods-a-customer-group-can-use). 2. On the customer's record, add the terms to the payment on account metafield, for example `{"net_terms":"30_days"}`. Use the [form](#what-to-enter) to combine them with a credit limit: it writes `{"credit_limit":1000,"balance":250,"net_terms":"30_days"}` for you. The customer uses their terms by choosing **Pay on Account** (or **Pay by Invoice**) at checkout. Supported values: | Net terms | Value | | --- | --- | | 7 days | `7_days` | | 15 days | `15_days` | | 30 days | `30_days` | | 45 days | `45_days` | | 60 days | `60_days` | | 90 days | `90_days` | **Shopify:** Pay on Account orders arrive in Shopify as **draft orders**. SparkLayer ticks **Payment due later** and fills in **Payment terms** (such as "Within 30 days") and **Issue date**, so Shopify shows the due date, such as "Payment due on 19 June 2023 (Net 30)". To complete these drafts automatically and collect payment later (for example, through your accounting system), turn on **Auto-complete draft orders** at **Integrations > Platform > Shopify order actions** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform > Shopify order actions** in the Shopify app. To mark net terms orders as paid automatically, and automate more of the process, use our [ready-made Shopify Flows](https://docs.sparklayer.io/help/platforms/shopify/customisations/flow.md). **Other platforms:** For how net terms orders are created on your platform, see the [developer docs](https://docs.sparklayer.io/developers.md). ## Choose how to send invoices | Method | How it works | Best when | | --- | --- | --- | | **SparkLayer Invoices** (Growth and above) | A PDF invoice is created for each order, and customers view and download it from My Account. | Your needs are fairly simple and you don't want another app. See [Invoices](https://docs.sparklayer.io/help/ordering/invoices.md). | | **Send invoices from your store** | You send invoices from your eCommerce platform's admin. | Your needs are basic, or you're testing a B2B invoicing process. See [Send invoices from your store](#send-invoices-from-your-store). | | **Attach your own invoice** | A metafield links an invoice file to the order, added by hand or automatically. | Another system, such as your ERP or accounting software, already creates invoice files such as PDFs. See [Attach your own invoice](#attach-your-own-invoice-to-an-order). | | **Third-party app** | Apps such as Sufio integrate with SparkLayer. | You also invoice retail customers, or want more design control. See [Use a third-party invoicing app](#use-a-third-party-invoicing-app). | **Shopify only:** To see how each way of invoicing works with **Auto-complete draft orders**, and with Xero or QuickBooks Online, try the interactive guide [How payments work](https://docs.sparklayer.io/help/guides/how-payments-work.md). ### Send invoices from your store **Shopify:** Orders with an offline [payment method](https://docs.sparklayer.io/help/ordering/payment-methods.md), such as Pay by Invoice, can arrive in Shopify as draft orders. Shopify's **Send invoice** emails the customer a message and a link to the Shopify checkout. 1. In the Shopify admin, open the draft order. 2. Send the invoice. The customer gets an email with a **Complete your purchase** button and an order summary. 3. When the customer pays, the order is marked as paid and moves to your Shopify **Orders**. Until then, the order stays a draft. If the customer hasn't paid, open the draft and click **Resend invoice**. If you're taking payment another way, use **Collect payment** to mark it as paid. To change the email, edit the **Draft order invoice** template at **Settings > Notifications** ([open in the Shopify admin](https://admin.shopify.com/settings/notifications)). See Shopify's guide to [sharing a checkout link with customers](https://help.shopify.com/en/manual/orders/create-orders#share-checkout-link-with-customers). **Other platforms:** See the [developer docs](https://docs.sparklayer.io/developers.md). ### Attach your own invoice to an order Link an invoice file to an order, and customers see **View & Download Invoice** on that order in [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md). Put a [UUID](https://www.uuidgenerator.net/) in the file name or URL so no one can guess it. **Shopify:** 1. Add an order metafield in Shopify (see [Shopify metafields and data mapping](https://docs.sparklayer.io/help/platforms/shopify/metafields.md)): | Item | Value | | -------------------- | ------------------------------------------------------------------------- | | **Custom data type** | [Orders](https://admin.shopify.com/settings/custom_data/order/metafields) | | **Metafield type** | `URL` or `File`. One value or a list of values are both supported. | | **Namespace** | `sparklayer` | | **Key** | `invoice_url` | 2. If your invoice isn't hosted anywhere yet, upload it to [Shopify Files](https://admin.shopify.com/content/files?selectedView=all) and click the **Copy link** icon next to it. 3. Open the order in Shopify. In **Metafields**, paste the link into the invoice URL field (for example, **B2B Invoice URL**) and save. As this is a Shopify metafield, you can attach invoices in bulk, or automatically from a backend system such as an ERP or CRM. **Other platforms:** | Item | Value | | --- | --- | | **Custom data type** | Orders | | **Metafield type** | A text string. Use secure, unguessable file names, for example with a [UUID generator](https://www.uuidgenerator.net/). | | **Namespace** | `sparklayer` | | **Key** | `invoice_url` | | **Value** | N/A | For more information, see the [developer docs](https://docs.sparklayer.io/developers.md). ### Use a third-party invoicing app For more invoicing features, consider an app such as [Sufio Invoicing](https://docs.sparklayer.io/help/integrations/customer-experience/sufio.md). ## Troubleshooting **Diagnose: Credit limit or Pay on Account not working?** Check the customer’s credit metafield and group settings. 1. **What’s happening?** Pick the closest match. - “Your cart exceeds your available credit limit”: go to question 2 - Pay on Account doesn’t show at checkout: go to question 3 - They want to pay part by credit and part by card: go to fix A (One payment method per order) - Gift cards don’t work: go to fix B (Gift cards only work at Shopify’s card checkout) 2. **In the customer’s credit metafield, is `balance` what they already owe you?** `balance` is the amount owed, not the credit they have left. Available credit is `credit_limit` minus `balance`. Where to look: Customers > select the customer > Metafields (Shopify admin). - Yes: go to question 4 - No, it’s what they can spend: go to fix C (Set `balance` to what they owe) 3. **Is Pay on Account turned on for the customer’s group?** Payment methods are chosen per customer group. Where to look: Customers > Groups (SparkLayer). - Yes: go to fix D (Check the customer’s group) - No: go to fix E (Turn on Pay on Account for the group) 4. **Would this order take them over their limit?** For example, with a limit of 250 and a balance of 200, only 50 is available. - Yes: go to fix F (The group blocks orders over the limit) - No: go to fix G (Everything checks out) **Fixes** - **A. One payment method per order** An order can’t be split between Pay on Account and card. The customer can pay the whole order one way. - **B. Gift cards only work at Shopify’s card checkout** The gift card field is Shopify’s, so it only appears when paying by card. It doesn’t work with Pay on Account, and SparkLayer isn’t a store-credit system. - **C. Set `balance` to what they owe** To give a customer 250 to spend, use `{"credit_limit":250,"balance":0}`. After a 77.80 order their balance is 77.80, leaving 172.20 available. A balance of 250 means they’ve used it all. Where: Customers > select the customer > Metafields (Shopify admin). See [Credit and net terms](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md). - **D. Check the customer’s group** If the group has Pay on Account but this customer doesn’t see it, check they’re in that group. Next: Wrong prices, payment methods or shipping for a customer? - **E. Turn on Pay on Account for the group** Add Pay on Account to the group’s payment methods and save. Then set the customer’s credit limit and terms. Where: Customers > Groups (SparkLayer). See [Payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md). - **F. The group blocks orders over the limit** The customer group is set to block checkout when an order would exceed the limit. Raise the customer’s `credit_limit`, record a payment by lowering their `balance`, or change the group’s credit setting to allow it. Where: Customers > Groups (SparkLayer). See [Block orders over the credit limit](https://docs.sparklayer.io/help/customers/customer-groups.md#block-orders-over-the-credit-limit). - **G. Everything checks out** Your setup looks right, so we'll take it from here. Send us your answers with the customer’s email and their credit metafield value. ## FAQs **What happens when a customer goes over their credit limit?** By default, **Pay on Account** is turned off for that order, and a message asks them to choose another method. To let them order over their limit, see [Let customers order over their credit limit](#let-customers-order-over-their-credit-limit). **I gave a customer credit, so why can't they pay on account?** Check the metafield's `balance`. It's what the customer owes you, so a balance equal to the credit limit leaves them nothing to spend. To give them $250 to spend, enter `{"credit_limit":250,"balance":0}`. See [Worked example](#worked-example). **Why is checkout blocked instead of showing a warning?** The customer group's **Prevent placing an order if exceeding credit limit** setting is on, which is the default. Turn it off to let customers place the order with a warning instead. See [Let customers order over their credit limit](#let-customers-order-over-their-credit-limit). **How do I collect payment for a Pay on Account order?** **Shopify only:** Pay on Account orders arrive in Shopify as draft orders with payment due later. SparkLayer doesn't take the payment. Collect it your usual way, such as by bank transfer, then mark the order as paid in Shopify. See [Complete a draft order by hand](https://docs.sparklayer.io/help/ordering/automation-and-workflows.md#complete-a-draft-order-by-hand). **Can a customer pay for one order partly on account and partly by card?** No. Each order has one payment method, so a customer can't split an order between their credit and a card. **Can customers use Shopify gift cards or store credit?** **Shopify only:** Shopify gift cards only work in Shopify's own checkout, when the customer chooses **Pay Online by Card**. They can't be used with **Pay on Account**. SparkLayer isn't a store credit system: the credit limit is how much a customer can owe you, not a balance they've paid in advance. See [Which payment methods work with the SparkLayer checkout?](https://docs.sparklayer.io/help/ordering/payment-methods.md#which-payment-methods-work-with-the-sparklayer-checkout) **Can I automatically mark net terms orders as paid?** Not in SparkLayer: net terms orders arrive with Shopify's payment terms and a due date, and stay unpaid until you collect payment. Use Shopify Flow instead. See [Set net payment terms](#set-net-payment-terms). **Can customers see payments as well as orders in their balance?** Yes, with **Payments visibility** (Shopify only). See [Show a real-time account balance](https://docs.sparklayer.io/help/ordering/payment-methods.md#payments---account-balance). --- # Invoices URL: https://docs.sparklayer.io/help/ordering/invoices Turn on SparkLayer Invoices so B2B customers can download PDF invoices from My Account, then add payment details, checkout data and your branding to them. > **Quick summary** > > - SparkLayer Invoices creates a PDF invoice for each B2B order once it reaches **Processing**. Customers and sales agents download it with **View & Download Invoice** on the order in [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md). > - Turn on **Invoices** 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 add text such as bank details with **Invoice Settings**. To redesign the invoice, use [Templates](#change-the-invoice-design-with-theming). > - SparkLayer Invoices (automatic PDF invoices, payment reminders and your own invoice template) needs the Growth plan or above. [Net terms and credit limits](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md) don't: they're on every plan. > - For signed-in B2B customers only, in English, French or Spanish. Invoices can't show line-item tax, refunds, cancellations or part-fulfilled orders. ## How it works How a SparkLayer invoice is created: 1. **Order placed**: By a B2B customer or a sales agent 2. **Order is Processing**: Draft orders and orders awaiting approval wait until they're completed 3. **Invoice generated**: With your company details, the order's items and your Content Zones 4. **Customer downloads it**: View & Download Invoice on the order in My Account Each invoice shows: - Your store name, address, website and phone number, with the order number and invoice date - The **Bill to** and **Ship to** addresses - The items (SKU, quantity, unit price and total), subtotal, shipping, tax, total and a tax summary - Any [Content Zones](#add-payment-details-and-other-text-with-content-zones) you've filled in, at the bottom [Download Example Invoice (via SparkLayer).pdf](https://docs.sparklayer.io/files/example-invoice.pdf) Instead of SparkLayer Invoices, you can attach invoices made in another system, send invoices from your store, or use an app such as [Sufio](https://docs.sparklayer.io/help/integrations/customer-experience/sufio.md). See [Choose how to send invoices](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md#choose-how-to-send-invoices). **Shopify only:** To compare the ways of invoicing step by step, see the interactive guide [How payments work](https://docs.sparklayer.io/help/guides/how-payments-work.md). ## Turn on invoices 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 **Invoices** ("Send invoices to your B2B customers directly from SparkLayer"). 3. Click **Save**. **Invoice Settings** then appears beside **Invoices**, so you can [add your own content](#add-payment-details-and-other-text-with-content-zones). Content changes apply to all invoices, the next time each is viewed. Invoices are created for orders placed from now on. Orders placed before you turned on Invoices don't get one. Below Growth, you see a **Growth** badge and an **Unlock** button instead of the switch. **Unlock** shows what Growth adds and starts a free 14-day trial. ## Add payment details and other text with Content Zones Content Zones are 3 optional blocks of text at the bottom of every invoice. Use them for payment terms, bank details, tax details, terms and conditions or legal statements. 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 and make sure **Invoices** is on. 2. Next to **Invoice Settings**, click **Edit**. The **Edit Invoice Settings** panel opens. 3. For each zone you want, enter a **Title** (up to 50 characters, shown as a bold heading) and **Content** (up to 2,000 characters, shown smaller below it). Line breaks are kept. 4. Save your changes. Every zone, title and content box is optional. For example, a zone titled "Making payment" could list the account number, sort code, IBAN, BIC and bank name to pay into. ### Add checkout field data to an invoice To show details collected at checkout, such as a delivery date from a [custom checkout field](https://docs.sparklayer.io/help/ordering/checkout-fields.md#add-a-custom-checkout-field), paste one of these snippets into a Content Zone's **Content** box. No coding is needed. You can change plain words such as `Tax ID:`, but leave everything inside `{% %}` and `{{ }}` as it is. Where a snippet names a checkout field (such as `"tax-id"`), it must match the field's name. **Show "Additional Information" field (e.g. Purchase Order)** You need the [Additional Information field](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md#set-up-the-additional-information-field-po-number) turned on at checkout first. ```html {% if purchase.customer_reference %} Customer Reference: {{ purchase.customer_reference }} {% endif %} ``` **Show the payment type** Shows a message based on the [payment method](https://docs.sparklayer.io/help/ordering/payment-methods.md) used for the order. ```html {% if purchase.payment_method == "upfrontPayment" %} A message for Pay Online by Card {% elsif purchase.payment_method == "paymentOnAccount" %} A message for Payment On Account {% elsif purchase.payment_method == "paymentByInvoice" %} A message for Pay By Invoice {% elsif purchase.payment_method == "quote" %} A message for Quote {% else %} {{ purchase.payment_method }} {% endif %} ``` **Show the invoice due date** You need [net terms](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md#set-net-payment-terms) set on the customer's metafield first, so invoices get a due date. ```html {% if data.purchase.dates.payment_due_at %}

Due Date: {{ data.purchase.dates.payment_due_at | ldate }}

{% endif %} ``` **Show a custom "Shipping date"** You need a custom "Shipping date" [checkout field](https://docs.sparklayer.io/help/ordering/checkout-fields.md#add-a-custom-checkout-field) first. The `field.name` must match the `name` of your checkout field. ```html {% for field in purchase.custom_fields %} {% if field.name == "delivery-date" %} Shipping Delivery Date: {{ field.value }} {% endif %} {% endfor %} ``` **Show a custom "Order Notes"** You need a custom "Order Notes" [checkout field](https://docs.sparklayer.io/help/ordering/checkout-fields.md#add-a-custom-checkout-field) first. The `field.name` must match the `name` of your checkout field. ```html {% for field in purchase.custom_fields %} {% if field.name == "order-notes" %} Order Notes: {{ field.value }} {% endif %} {% endfor %} ``` **Show a custom "Tax ID"** You need a custom "Tax ID" [checkout field](https://docs.sparklayer.io/help/ordering/checkout-fields.md#add-a-custom-checkout-field) first. The `field.name` must match the `name` of your checkout field. ```html {% for field in purchase.custom_fields %} {% if field.name == "tax-id" %} Tax ID: {{ field.value }} {% endif %} {% endfor %} ``` **Show an Accounting ID ("Tax ID") from metafield** You need the Accounting ID metafield on your store first (see below). It's the only metafield an invoice can show. | Item | Details | | --- | --- | | **Custom data type** | [Customers](https://admin.shopify.com/settings/custom_data/customer/metafields) | | **Metafield type** | `single line text` | | **Namespace** | `sparklayer` | | **Key** | `accounting_id` | | **Use** | A unique accounting ID for the customer, for example the account ID in your ERP or accounts package. When it's set, it's also added to the order's metadata in your eCommerce platform. | ```html {% if purchase.customers.sparklayer.accounting_id %}

{{ purchase.customers.sparklayer.accounting_id }}

{% endif %} ``` ## Update your company details Invoices show your company name, address, phone number and website at the top. SparkLayer syncs these from your store, and what you enter here overrides what B2B customers see. 1. Go to **Settings > Configurations > Store** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Store** in the Shopify app. 2. Next to **Store details**, click **Edit**. 3. Update the **Store name**, **Store address**, **Phone number**, **Email** and **Website URL**. 4. Click **Save**. See [Settings](https://docs.sparklayer.io/help/dashboard/settings.md#store-details). ## Change the invoice design with theming Theming gives full control of the invoice's layout, fonts, colours and content. Templates use a template language, so we recommend working with a web developer. Invoice templates need the Growth plan or above. Go to **Settings > Templates** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/theme)), or **SparkLayer Wholesale > Settings > Templates** in the Shopify app and click **Create template**. This creates a template theme for your invoices, email notifications and translations. See [Settings](https://docs.sparklayer.io/help/dashboard/settings.md#templates) and the [templates developer docs](https://docs.sparklayer.io/developers/templates.md). Example changes: **Output the product image on an invoice** In the ``, add a new `` at the start: ```html {{ "pdf.quote.section.line_items.table.headings.item" | t }} {{ "pdf.quote.section.line_items.table.headings.quantity" | t }} {{ "pdf.quote.section.line_items.table.headings.unit_price" | t }} {{ "pdf.quote.section.line_items.table.headings.total" | t }} ``` In the ``, add a new `` at the start: ```html ``` **Output a logo on an invoice** At the start of the template file, find this code: ```html {% if data.merchant.store_name %}

{{ data.merchant.store_name }}

{% endif %} ``` Host your logo image somewhere, then replace the code with: ```html {% if data.merchant.store_name %} {% endif %} ``` ## Test your invoices There's no invoice preview, but changes show the next time an invoice is viewed. To check them: 1. **Place a test order.** Sign in to your store as a B2B customer or sales agent and place an order. It must reach **Processing**, so it can't be a draft order. 2. **Open the order** in My Account. 3. **Click View & Download Invoice.** The invoice opens in your browser, where you can download it. 4. **Make changes** to your [Content Zones](#add-payment-details-and-other-text-with-content-zones), [company details](#update-your-company-details) or [theme](#change-the-invoice-design-with-theming), then view the invoice again. ## Reference ### When invoices are available | Situation | What happens | | --- | --- | | **Order is Processing** | An invoice is created. | | **Order placed before you turned on Invoices** (old, past or historic orders) | No invoice. Invoices are only created for new orders, not for previous orders. | | **Draft order, or an order awaiting approval** | No invoice until the order is completed. This includes orders from [company users](https://docs.sparklayer.io/help/customers/company-users.md) that need approval. | | **Refunded or cancelled order** | No invoice. | | **Split shipment** (part of the order fulfilled first) | The invoice shows all products on the order. | | **Editing a completed order** (Processing but not yet fulfilled) | Your changes **don't** appear on the invoice. | | **Editing a draft order** | Your changes appear once the order is completed (set to Processing). | ### Limitations | Item | Limitation | | --- | --- | | **Line-item tax** | Invoices can't show a tax breakdown for each line. | | **Refunds, returns, cancellations** | Invoices can't show these order statuses. | | **Languages** | English, French and Spanish. Invoices are always in your store's default language, even if your store has several. For another language, contact [our support team](https://docs.sparklayer.io/help/support.md). | | **Part fulfilment** | Part-fulfilled orders aren't supported. The invoice shows all products on the order, whether they've been fulfilled or not. | | **Customers** | Only signed-in B2B customers set up in SparkLayer can get invoices. | ### Compliance Every country has its own invoicing rules, from required fields to tax details and legal statements. Add the payment terms, bank details or legal wording you need with [Content Zones](#add-payment-details-and-other-text-with-content-zones). > **Check your invoices meet local rules** > > SparkLayer isn't an accounting or legal service provider, and isn't liable for your invoices meeting local regulations. Ask a professional to check them. ## FAQs **What SparkLayer plan do I need to be on to enable invoices?** Growth, Pro or Enterprise. Net terms and credit limits, without SparkLayer Invoices, are on every plan. Change plan at **Plan card** in the SparkLayer Dashboard, or **SparkLayer Wholesale > Plan** in the Shopify app, or click **Unlock** next to **Invoices** to start a free trial. See [SparkLayer plans and pricing](https://www.sparklayer.io/pricing/). **How do I turn on invoices?** Turn on **Invoices** 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. See [Turn on invoices](#turn-on-invoices). **How do I view changes I make to invoices?** Place a test order and download its invoice from My Account. See [Test your invoices](#test-your-invoices). **How do multiple currencies work?** Each invoice uses the order's currency, which is based on the customer's location or your store's settings. **How does tax work on invoices?** Tax is calculated from the settings in your store. See [Tax and shipping](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md). **I can't download an invoice. What am I doing wrong?** - **The order is Processing.** Invoices aren't available before then. - **The order was placed after you turned on Invoices.** Older orders don't have an invoice. - **Your browser allows PDFs to download.** Check its settings. If it still doesn't work, [contact our support team](https://docs.sparklayer.io/help/support.md). **Can I get invoices for old or past orders?** No. SparkLayer only creates invoices for new orders, once Invoices is on. It doesn't create them for previous or historic orders, including [imported order history](https://docs.sparklayer.io/help/platforms/shopify/metafields.md#import-order-history-into-sparklayer). **If I edit an order, will the changes reflect on the invoice?** Not once the order is completed (Processing). Changes to a draft order appear once it's completed. **Can I show custom checkout fields on an invoice?** Yes, for example a tax ID number. See [Add checkout field data to an invoice](#add-checkout-field-data-to-an-invoice). **How do I set payment terms and how do they show on invoices** Add them as free text in a [Content Zone](#add-payment-details-and-other-text-with-content-zones), for example a "Making payment" zone with your bank details. To show a due date based on the customer's net terms, see [Show the invoice due date](#show-the-invoice-due-date). **How do I turn off my other invoicing system?** For Sufio, in the SparkLayer Dashboard, go to **Integrations > Partners** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/partners)), or **SparkLayer Wholesale > Integrations > Partners** in the Shopify app and turn off **Sufio** under **Invoicing**. The Shopify app has no switch: Sufio's **Setup guide** explains how to disconnect it. For any other invoicing app, uninstall it from your store as usual. **How do I fully customise how the invoice looks?** Use [theming](#change-the-invoice-design-with-theming) at **Settings > Templates** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/theme)), or **SparkLayer Wholesale > Settings > Templates** in the Shopify app, with a web developer. [Our support team](https://docs.sparklayer.io/help/support.md) can help. **Can I use my own invoices instead of the invoices from SparkLayer?** Yes. See [Attach your own invoice to an order](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md#attach-your-own-invoice-to-an-order). **How does a customer share an invoice?** They sign in, open the order and download the PDF to share, for example by email. **Can I use invoices for my regular (non-B2B) customers?** No. Invoices are only for signed-in B2B customers set up in SparkLayer. We'd love to hear your feedback on invoices. Email our product team at [product@sparklayer.io](mailto:product@sparklayer.io). --- # How tax works at checkout URL: https://docs.sparklayer.io/help/ordering/tax-and-shipping See how SparkLayer shows net prices and adds tax at checkout, set up tax on Shopify and other platforms, and fix common tax and shipping cost issues. > **Quick summary** > > - SparkLayer shows B2B prices excluding tax (net pricing) unless you turn on **Tax-inclusive prices**. Tax is added at the last step of the checkout. > - SparkLayer doesn't calculate tax: it uses your eCommerce platform's tax settings. On Shopify, that's **Settings > Taxes and duties** ([open in the Shopify admin](https://admin.shopify.com/settings/taxes)). > - Most tax options here are for Shopify. Other platforms use their own settings, with the limits in [Set up tax on other platforms](#set-up-tax-on-other-platforms). > - Shipping is set up separately, at **Settings > Shipping** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/shipping)), or **SparkLayer Wholesale > Settings > Shipping** in the Shopify app. See [Shipping rules](https://docs.sparklayer.io/help/ordering/shipping-rules.md). ## How it works A B2B price is either net or gross: | Price type | What it means | | --- | --- | | **Net** | The price excludes tax. A $20.00 price is $20.00 before tax. | | **Gross** | The price includes tax. A $20.00 price already contains the tax. | By default, SparkLayer shows net prices, whatever tax setting your website uses. Customers see exactly the price in their [price list](https://docs.sparklayer.io/help/pricing/managing-pricing.md): if it has SKU `EEEAR` at 7.99, the product page shows $7.99. On the **Review & Pay** step, SparkLayer asks your platform for the tax and shows it as its own line: **Sub-total**, **Shipping**, **Tax** and **Total**. Here's how that works with Shopify: **How tax works with SparkLayer and Shopify** 1. **Your B2B customer browses your store.** All prices shown by SparkLayer exclude tax — customers always see the net price, whatever your Shopify tax settings. 2. **The B2B price comes from your price list.** Customers see the wholesale price from their SparkLayer price list. 3. **Customer goes to checkout.** SparkLayer works with Shopify to calculate the tax to add. 4. **Different tax rates per product?** If our team has enabled this, SparkLayer creates a preliminary Shopify order (tagged `b2b-pending`) when the shipping address is selected to get exact per-product tax. Otherwise tax is calculated as a single rate across the order when checkout completes. 5. **Is the customer tax-exempt?** Tax-exempt customers (Customers › [Customer] › Manage tax exemptions) pay no tax; otherwise Shopify checks "Charge tax on this product" per product. 6. **Tax rate based on shipping country.** Managed in Shopify under Settings › Taxes and duties. 7. **Your wholesale price is sent to Shopify,** replacing the retail price. 8. **Do your Shopify prices include tax?** If yes, manual price lists need no change; for automatic price lists tick "adjust percentage to account for tax". If no, no special setup is needed. 9. **Prices are shown as net + tax,** with tax as a separate line item. 10. **Customer completes their order.** The preliminary draft order is updated, or a new order is created. 11. **The order appears in your Shopify admin.** With "include tax in price" on, Shopify shows tax-inclusive prices with a tax summary — the totals match checkout. For a step-by-step setup, from checking your store's prices to testing an order, follow the guide [Get B2B tax and VAT right](https://docs.sparklayer.io/help/guides/tax-and-vat.md). This page is the reference for each setting. ### Show prices including tax To show prices including tax, labelled "inc. tax", turn on **Tax-inclusive prices** at **Settings > Configurations > Pricing and cart** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Pricing and cart** in the Shopify app and on the price lists that need it, and give each product a `display_tax_rate` in your [price CSV](https://docs.sparklayer.io/help/pricing/csv-upload.md), such as `10` for 10% GST. It changes what buyers see, not what they pay. Because the rate comes from a price CSV, it has no effect on automatic price lists. For the steps and limitations, see [Show tax-inclusive prices](https://docs.sparklayer.io/help/pricing/pricing-display.md#show-tax-inclusive-prices). ## Set up tax on Shopify **Shopify only:** In Shopify, you set tax rules for the whole store, then make exceptions for customers and products. Before you start: - **Check your current tax setup** in **Settings > Taxes and duties** ([open in the Shopify admin](https://admin.shopify.com/settings/taxes)). - **Read Shopify's guide** to [setting up tax](https://help.shopify.com/en/manual/taxes/registration/setup). - **Check the effect on retail customers** if your store serves both retail (B2C) and B2B. Many of these settings apply to both. ### Make a customer tax-exempt **Shopify only:** A tax-exempt customer still sees net prices, and pays zero tax at checkout. 1. In the Shopify admin, go to **Customers** ([open in the Shopify admin](https://admin.shopify.com/customers)) and open the customer. 2. In the customer's details, click **Manage tax exemptions**. 3. Untick **Collect tax**, then click **Save**. With a third-party tax app such as Avalara or TaxJar, also mark the customer as exempt in that app. See [Tax is charged but I use a third-party tax app](#tax-is-charged-but-i-use-a-third-party-tax-app-eg-avalara-taxjar). ### Turn tax on or off for a product or variant **Shopify only:** 1. In the Shopify admin, go to **Products** ([open in the Shopify admin](https://admin.shopify.com/products)) and open the product. 2. In **Pricing**, tick or untick **Charge tax on this product**. When ticked, the product uses your Shopify tax rules. 3. For a single variant, open the variant and tick or untick **Charge tax on this variant** (**Taxable** in newer versions of the Shopify admin). 4. Click **Save**. Products that don't charge tax are left out of the tax total at checkout. ### Set tax by country **Shopify only:** Shopify applies tax rules by the customer's shipping country, at the last step of the checkout. 1. In the Shopify admin, go to **Settings > Taxes and duties** ([open in the Shopify admin](https://admin.shopify.com/settings/taxes)). 2. Under **Regional settings**, check the **Collecting tax** column for each country or region. A region needs a [shipping zone](https://help.shopify.com/en/manual/shipping/setting-up-and-managing-your-shipping) before you can collect tax there. 3. Select a country or region to manage its tax settings. You can also manage these from **Settings > Markets** ([open in the Shopify admin](https://admin.shopify.com/settings/markets)). ### Remove tax from a draft order **Shopify only:** If orders arrive in Shopify as draft orders, you can change the tax before you complete them. 1. In the Shopify admin, open the draft order. 2. Click **Estimated tax**. 3. Untick **Charge taxes**, then click **Apply**. **Estimated tax** then shows **Not collected** and 0.00. Only the tax total changes, not the product prices. ### Charge different tax rates on different products **Shopify only:** By default, tax is charged on the cart subtotal. If your products have different tax rates in one tax jurisdiction, SparkLayer can work out tax per line instead ("line item tax"). Our team turns it on for you. Line item tax applies when **Include sales tax in product price and shipping rate** is on in Shopify. To check: 1. In the Shopify admin, go to **Settings > Taxes and duties** ([open in the Shopify admin](https://admin.shopify.com/settings/taxes)). 2. Under **Global settings**, see whether **Include sales tax in product price and shipping rate** is ticked. If it's ticked and your products have different tax rates, [contact our support team](https://docs.sparklayer.io/help/support.md) to turn on line item tax. It's the **Create a draft order on calculate** setting at **Integrations > Platform > Shopify order actions** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform > Shopify order actions** in the Shopify app, which only our team can change. To stop charging tax on some lines, untick **Charge tax** on those variants in Shopify. > **Draft orders are created before the order is complete** > > With line item tax on, SparkLayer creates the Shopify draft order when the customer reaches the shipping and payment step, before they complete the order. The draft is tagged `b2b-pending`, which changes to `b2b` when the customer completes the order. **Why line item tax is needed** SparkLayer applies a discount to each line item so the customer pays their B2B price. | Include sales tax in product price and shipping rate | How SparkLayer calculates the discount | | --- | --- | | **Off** | The difference between the Shopify price and the SparkLayer B2B price. | | **On** | The discount also has to account for tax. Without line item tax, SparkLayer uses one tax rate (the rate of the first line item) for every line. Shopify only gives SparkLayer each line item's tax rate when it creates a draft order. | For example, two products with the same £6.00 B2B price, one at the default tax rate and one at 5%: | Product | Shopify price | Without line item tax | With line item tax | | --- | --- | --- | --- | | Default tax product | £12.00 | £6.00 (discount £6.00) | £6.00 (discount £6.00) | | 5% tax product | £10.50 | £6.00 (discount £4.50), incorrect | £5.25 (discount £5.25), correct | ### Adjust automatic price lists for tax-inclusive Shopify prices **Shopify only:** If **Include sales tax in product price and shipping rate** is on in Shopify, an [automatic price list](https://docs.sparklayer.io/help/pricing/managing-pricing.md#set-up-automatic-pricing) based on **Shopify Price** takes its percentage off a price that already includes tax. Work out a percentage that also takes the tax out, or customers pay tax twice: see [Tax-inclusive prices](https://docs.sparklayer.io/help/pricing/managing-pricing.md#tax-inclusive-prices). [Manual price lists](https://docs.sparklayer.io/help/pricing/managing-pricing.md) don't need this if you upload net prices. ## Set up tax on other platforms On BigCommerce, Wix, WooCommerce and Magento, SparkLayer uses your platform's tax rules. Set tax up there, then check these limits: | Platform | Where tax is set up | Limits | | --- | --- | --- | | BigCommerce | BigCommerce tax settings | Multi-zone tax only works if prices are entered exclusive of tax, or if tax outside the default zone is set to update product prices. If you change **How are prices displayed on your storefront** on its own, contact us so SparkLayer can resync. See [BigCommerce limitations](https://docs.sparklayer.io/help/platforms/bigcommerce/limitations.md). | | Wix | **Settings > Tax** in your Wix dashboard ([setup guide](https://docs.sparklayer.io/help/platforms/wix/install.md#adjusting-tax-settings)) | Tax exemptions only apply when the customer pays through the Wix checkout (upfront payment). With manual payment methods, tax is charged. See [Wix limitations](https://docs.sparklayer.io/help/platforms/wix/limitations.md). | | WooCommerce | WooCommerce tax settings ([setup guide](https://docs.sparklayer.io/help/platforms/woocommerce/install.md#adjusting-tax-settings)) | None documented. | | Magento | Magento tax settings ([setup guide](https://docs.sparklayer.io/help/platforms/magento/install.md#adjusting-tax-settings)) | None documented. | **Shopify only:** On Shopify, orders that mix taxable and tax-exempt products aren't handled, and duties aren't supported. See [Shopify limitations](https://docs.sparklayer.io/help/platforms/shopify/limitations.md). ## Show tax information on your storefront Change any tax wording in the [frontend interfaces](https://docs.sparklayer.io/help/storefront/interfaces.md) 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: add an override for the key, enter your text and click **Save and publish**. See [Change checkout text](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md#change-checkout-text). A developer can set the same keys in your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting) instead: see [Languages and international](https://docs.sparklayer.io/help/storefront/languages-and-international.md). ### Change the word "tax" These keys set the tax wording in the cart and checkout: | Key | Default text | | --- | --- | | `global.totals.tax` | Tax | | `cart.tax-shipping-note` | Tax and shipping costs calculated during checkout | | `cart.tax-shipping-message` | Tax and shipping costs shown on next step | **Core Script code for your developer** ```javascript title="Core Script" translations: { en: { "global.totals.tax": "Tax", "cart.tax-shipping-note": "Tax and shipping costs calculated during checkout", "cart.tax-shipping-message": "Tax and shipping costs shown on next step" } }, ``` ### Add a tax note next to prices Add text such as "Excluding tax: " before the product page price, or "(ex. tax)" after the unit price in the [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md), as in "US$6.99 per unit (ex. tax)". Set these keys in **Translation overrides**: | Key | Example text | Where it shows | | --- | --- | --- | | `pdp.price.from-prefix` | Excluding tax: | Before the price on the product page | | `global.per-unit` | `{price}` per unit (ex. tax) | The unit price in the cart. Keep `{price}`, which is replaced with the price. | **Core Script code for your developer** ```javascript title="Core Script" translations: { en: { "pdp.price.from-prefix": "Excluding tax: ", "global.per-unit": "{price} per unit (ex. tax)", } }, ``` ### Collect a tax ID for international shipping Some countries require the customer's tax ID (or equivalent) at checkout, so orders comply with local tax law and aren't held up or fined at customs. Collecting it means the order can be processed and converted from a draft to a completed order in Shopify. Countries that may need a national tax number (such as CPF/CNPJ, RFC or Resident ID) include Brazil, Chile, Colombia, Costa Rica, Ecuador, Guatemala, Indonesia, Italy, Mexico, Malaysia, Peru, Portugal, Paraguay and Turkey. Formats and rules vary, so check the regulations for each destination. When it's needed, the **Details** step shows an **Additional Tax ID** field above **Additional Information**. To change the field's label and placeholder, set these keys in **Translation overrides**: | Key | Default text | | --- | --- | | `checkout.notes.tax-id-label` | Additional Tax ID | | `checkout.notes.tax-id-placeholder` | Tax ID | **Core Script code for your developer** ```javascript title="Core Script" translations: { en: { "checkout.notes.tax-id-label": "Additional Tax ID", "checkout.notes.tax-id-placeholder": "Tax ID", } }, ``` If you already collect a tax ID with a [custom checkout field](https://docs.sparklayer.io/help/ordering/checkout-fields.md), we recommend turning that field off. ## Set up shipping Use your eCommerce platform's shipping rates, or create B2B shipping methods in SparkLayer at **Settings > Shipping** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/shipping)), or **SparkLayer Wholesale > Settings > Shipping** in the Shopify app. See [Shipping rules](https://docs.sparklayer.io/help/ordering/shipping-rules.md). ## Why is tax charged on shipping? SparkLayer uses Shopify's tax calculation, so shipping is taxed whenever Shopify taxes it. B2B orders can show tax on shipping even when your retail checkout looks different, for one of these reasons. | Reason | What happens | | --- | --- | | **The customer is in Canada, the EU, the UK or the US** | Shopify charges tax on shipping in these regions whatever its **Charge tax on shipping rates** setting says. Our development team has confirmed this is how Shopify behaves. | | **Include sales tax in product price and shipping rate is on** | Your Shopify shipping rates already contain tax. SparkLayer shows net amounts, so it has to charge that tax when it creates the order. | For example, with 20% VAT in the UK: | Line | Net | VAT at 20% | Total | | --- | --- | --- | --- | | Products | £500.00 | £100.00 | £600.00 | | Shipping | £95.00 | £19.00 | £114.00 | | **Order** | £595.00 | £119.00 | £714.00 | The customer sees £95.00 shipping, and £114.00 once VAT is added. **Shopify only:** To change this: - **Use SparkLayer shipping rates**, entered as net values, such as 95 for £95.00 before tax. See [Shipping rules](https://docs.sparklayer.io/help/ordering/shipping-rules.md#set-up-sparklayer-shipping-rules). - **Make the customer tax-exempt**, where that's right for them, so their order has no tax on products or shipping. See [Make a customer tax-exempt](#make-a-customer-tax-exempt). ## Troubleshooting These fixes are for Shopify. On other platforms, check your platform's tax settings and [its limits](#set-up-tax-on-other-platforms), or [contact our support team](https://docs.sparklayer.io/help/support.md). **Diagnose: Prices or tax looking wrong?** Check your Shopify tax settings against your price lists. 1. **What looks wrong?** Pick the closest match. - B2B prices are too high, or tax is charged twice: go to question 2 - Tax is added to shipping in the B2B checkout: go to fix A (Shopify taxes shipping in some regions) - I want B2B prices shown including tax: go to fix B (Tax-inclusive display has three parts) - VAT or tax is missing at checkout: go to question 3 2. **Is “Include sales tax in product price and shipping rate” turned on?** It’s under Global settings. It decides whether Shopify treats your prices as including tax, which is common for UK, EU and Australian stores. Where to look: Settings > Taxes and duties (Shopify admin). - On: go to question 4 - Off: go to question 5 3. **Is the customer marked as tax exempt in Shopify?** Reverse charge for VAT-registered EU customers uses Shopify’s customer tax exemption. Where to look: Customers > select the customer > Tax settings (Shopify admin). - Yes: go to fix C (That’s why tax isn’t added) - No: go to fix D (Check the customer’s address and test their checkout) 4. **Which type of price list does the customer use?** Manual lists are uploaded by CSV or set in the Price editor. Automatic lists apply a percentage to your Shopify prices. Where to look: Pricing > Price lists (SparkLayer). - Manual (CSV or Price editor): go to question 5 - Automatic (a percentage): go to question 6 5. **Are the prices in the price list excluding tax (net)?** All SparkLayer prices are net. Tax is added at checkout. Where to look: Pricing > Price editor (SparkLayer). - Yes, net: go to fix E (Your tax setup looks right) - No, they include tax: go to fix F (Upload your prices excluding tax) - Not sure: go to fix G (Compare one product in the Price editor) 6. **Has the list’s percentage been raised to take the tax out too?** An automatic list based on tax-inclusive Shopify prices needs its percentage adjusted for tax. For example, with 20% VAT and a 10% trade discount, use 25% off. Where to look: Pricing > Price lists (SparkLayer). - Yes: go to fix E (Your tax setup looks right) - No: go to fix H (Adjust the percentage for tax) **Fixes** - **A. Shopify taxes shipping in some regions** SparkLayer uses Shopify’s tax calculation. In Canada, the EU, the UK and the US, Shopify charges tax on shipping whatever its “Charge tax on shipping rates” setting says, so the B2B checkout can show tax on shipping. If that’s a problem, use SparkLayer shipping with your rates entered without tax. See [Tax and shipping](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md). - **B. Tax-inclusive display has three parts** Buyers see gross prices once three things are in place: Tax-inclusive prices turned on for your store (if you don’t see the setting, ask us), the price lists chosen, and a `display_tax_rate` column in the price CSV, for example 10 for Australian GST. It works on manual price lists only, not automatic ones, so use a manual list for those customers. See [Show tax-inclusive prices](https://docs.sparklayer.io/help/pricing/pricing-display.md#show-tax-inclusive-prices). - **C. That’s why tax isn’t added** Tax-exempt customers check out without tax. Remove the exemption if they should pay it. Where: Customers > select the customer > Tax settings (Shopify admin). - **D. Check the customer’s address and test their checkout** Tax follows the customer’s default address and your Shopify tax regions. Check their default address, that you collect tax in that country, and that the products are set to charge tax. Then place a test order as the customer. Where: Settings > Taxes and duties (Shopify admin). - **E. Your tax setup looks right** The SparkLayer checkout shows net prices with tax on its own line. If “Include sales tax” is on, the Shopify order shows tax-inclusive prices instead. The totals are the same: it’s just shown differently. - **F. Upload your prices excluding tax** Prices that already include tax get tax added again at checkout, so customers pay it twice. Convert them to net prices and upload the list again. Where: Pricing > Price lists (SparkLayer). - **G. Compare one product in the Price editor** Pick a product, work out its price without tax, and check it matches the Price editor. If it doesn’t, your list includes tax and needs uploading again as net prices. Where: Pricing > Price editor (SparkLayer). - **H. Adjust the percentage for tax** Without it, the percentage comes off your tax-inclusive Shopify prices, so B2B prices come out too high and tax is added again at checkout. Where: Pricing > Price lists (SparkLayer). See [Adjust automatic price lists for tax](https://docs.sparklayer.io/help/pricing/managing-pricing.md#tax-inclusive-prices). **Tax is charged when it shouldn't be** **Shopify only:** If the customer should be tax-exempt, open them in **Customers** ([open in the Shopify admin](https://admin.shopify.com/customers)), click **Manage tax exemptions** and untick **Collect tax**. With a third-party tax app, also see the next question. **Tax is charged but I use a third-party tax app (e.g. Avalara, TaxJar)** **Shopify only:** Tax apps such as Avalara and TaxJar override Shopify's tax settings, so a customer set to "Don't collect tax" in Shopify can still be charged. SparkLayer only passes through the tax that Shopify and your tax app return, so the cause is almost always the tax app's setup. Exempt the customer in both places: 1. In your tax app, add the customer to its exemption list. For example, in Avalara, go to the Exemption Customer List and add the customer with their Shopify customer ID as the Customer Code. 2. In Shopify, open the customer in **Customers** ([open in the Shopify admin](https://admin.shopify.com/customers)), click **Manage tax exemptions** and check that **Collect tax** is unticked. The two exemptions work independently, so if either is missing, tax may still be charged. For help in your tax app, see its documentation or support team. **Tax isn't charged when it should be** **Shopify only:** Check the customer isn't tax-exempt: open them in **Customers** ([open in the Shopify admin](https://admin.shopify.com/customers)), click **Manage tax exemptions** and make sure **Collect tax** is ticked. **Prices on the Shopify order don't match the SparkLayer checkout** **Shopify only:** 1. In **Settings > Taxes and duties** ([open in the Shopify admin](https://admin.shopify.com/settings/taxes)), check whether **Include sales tax in product price and shipping rate** is on. If it is, check each automatic price list's percentage allows for tax: see [Tax-inclusive prices](https://docs.sparklayer.io/help/pricing/managing-pricing.md#tax-inclusive-prices). 2. Check the SparkLayer price is lower than the Shopify price. Go to **Pricing > Price editor** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/pricing/editor)), or **SparkLayer Wholesale > Pricing > Price editor** in the Shopify app, search for the variant SKU and note its price in each price list, then compare it with the product's **Price** in Shopify. 3. If **Include sales tax in product price and shipping rate** is on, a difference of a few cents is expected. Shopify only accepts whole-cent unit prices on a draft order, and with this setting on, the unit price has to include tax. For example, $14.45 plus 10% GST is $15.895, so the unit price is sent as $15.90. Shopify multiplies that by the quantity, so 30 units come to $0.15 more than the net sub-total plus 10%. No setting in SparkLayer or Shopify changes this, and line item tax doesn't affect it. If your invoices must match to the cent, add an order discount for the difference to the draft order before you invoice it. If the Shopify price is lower, the checkout uses it. This includes tax: if the SparkLayer price after tax is higher than your tax-inclusive Shopify price, the checkout also uses the Shopify price. **Tax is wrong when shipping to a different country** **Shopify only:** In **Settings > Taxes and duties** ([open in the Shopify admin](https://admin.shopify.com/settings/taxes)), find the customer's country and check whether you're collecting tax there. **Tax is charged twice** - **Manual price lists use net prices.** Upload [manual price list](https://docs.sparklayer.io/help/pricing/managing-pricing.md) prices excluding tax, so tax is added correctly at checkout. - **Automatic price lists allow for tax.** If **Include sales tax in product price and shipping rate** is on in Shopify, an [automatic price list](https://docs.sparklayer.io/help/pricing/managing-pricing.md)'s percentage must also take out tax. See [Tax-inclusive prices](https://docs.sparklayer.io/help/pricing/managing-pricing.md#tax-inclusive-prices). **Some products should be taxed and others not** **Shopify only:** [Contact our support team](https://docs.sparklayer.io/help/support.md) to turn on line item tax, then untick **Charge tax** on the variants that shouldn't be taxed. See [Charge different tax rates on different products](#charge-different-tax-rates-on-different-products). **Shipping costs don't match the SparkLayer shipping rules** With [SparkLayer shipping rates](https://docs.sparklayer.io/help/ordering/shipping-rules.md), the costs at **Settings > Shipping** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/shipping)), or **SparkLayer Wholesale > Settings > Shipping** in the Shopify app should always match the checkout. If they don't, [contact our support team](https://docs.sparklayer.io/help/support.md). **Can I show gross (tax-inclusive) prices to B2B customers?** Yes. Turn on **Tax-inclusive prices** at **Settings > Configurations > Pricing and cart** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Pricing and cart** in the Shopify app and add a `display_tax_rate` column to your pricing CSV. Buyers see gross prices, labelled "inc. tax", but pay the same. It only works on manual price lists: see [Show tax-inclusive prices](https://docs.sparklayer.io/help/pricing/pricing-display.md#show-tax-inclusive-prices), including its limitations. If that doesn't suit your tax setup, try one of these: | To show | Workaround | | --- | --- | | **Net and gross prices** | Show an extra price to signed-in customers with custom theme code, for example from [metafields](https://docs.sparklayer.io/developers/data/metafields.md) on Shopify or BigCommerce. Or use the [RRP (MSRP) feature](https://docs.sparklayer.io/help/pricing/pricing-display.md) to set a price separate from the B2B price. | | **Gross prices only** | Make the customer tax-exempt in Shopify so their orders are zero-rated, and upload gross amounts to their price lists (though tax isn't technically included). Report on tax afterwards, for example in your accounting system. | --- # Shipping rules URL: https://docs.sparklayer.io/help/ordering/shipping-rules Use your store's shipping rates or SparkLayer's own B2B shipping methods, with bands by order total or weight for each customer group, and pre-select a method. > **Quick summary** > > - By default, B2B customers see your eCommerce platform's shipping methods at checkout in the [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md). > - To create B2B-only methods priced by customer group, order total or weight, tick **Use SparkLayer shipping rates** at **Settings > Shipping** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/shipping)), or **SparkLayer Wholesale > Settings > Shipping** in the Shopify app. On Shopify, **Automatic shipping selection** there sets the pre-selected method. > - SparkLayer shipping rates need the Starter plan or above (see [Plans and features](https://docs.sparklayer.io/help/plans-and-features.md)). On BigCommerce, they only work with card payment turned off. On Wix, also turn on SparkLayer Shipping in your Wix dashboard. > **Shopify shipping or SparkLayer shipping: pick one** > > B2B customers get one or the other, never both. **Use SparkLayer shipping rates** at **Settings > Shipping** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/shipping)), or **SparkLayer Wholesale > Settings > Shipping** in the Shopify app decides: unticked, they see your store's shipping (on Shopify, Shopify shipping); ticked, they only see your SparkLayer shipping methods. > > | Choose | You get | Keep in mind | > | ----------------------- | -------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | > | **Shopify shipping** | Live (calculated) carrier rates and Shopify shipping apps pass through to the SparkLayer checkout. | B2B customers see the same rates as retail. For different automated rates for wholesale, use a shipping app that sets rates by customer tag. See [Show B2B-only shipping methods on Shopify](#show-b2b-only-shipping-methods-on-shopify). | > | **SparkLayer shipping** | B2B-only methods for each country and customer group, priced by order value or weight. | One cost per band (the weight or value only picks the band), with no live carrier rates and no rules by product or tag. See [What SparkLayer shipping rules can do](#what-sparklayer-shipping-rules-can-do). | ## How it works How a customer gets a shipping cost: 1. **Add products**: The customer builds their order in the cart. 2. **Choose an address**: On the Details step, they pick a shipping address. 3. **Choose a method**: On Review & Pay, they see the methods for their country (and customer group, with SparkLayer rules). 4. **See the total**: The shipping cost and tax are added to the order total. Shipping methods come from one of two places: | Option | Best for | Limits | | --- | --- | --- | | **Your store's shipping methods** (default) | Keeping shipping in your platform's admin, and complex rules such as country or state-level rates. Works with third-party shipping apps. | Your platform may need an app for B2B-only shipping methods. | | **SparkLayer shipping rates** | Different B2B rates for each customer group, especially when retail (DTC) and B2B share one store. Rates by order value or weight. | Basic shipping types only. Managed in SparkLayer, not your platform's shipping admin. | ## Use your store's shipping methods SparkLayer shows your eCommerce platform's shipping methods and rates out of the box, with nothing to configure. **Shopify only:** On Shopify, live shipping rates and shipping rule apps also work: SparkLayer pulls their rates through. **Shopify shipping settings** at **Settings > Shipping** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/shipping)), or **SparkLayer Wholesale > Settings > Shipping** in the Shopify app opens Shopify's **Shipping and delivery** settings. For help, see Shopify's [guide to setting up shipping](https://help.shopify.com/en/manual/shipping/setting-up-and-managing-your-shipping) or contact Shopify support. ### Show B2B-only shipping methods on Shopify **Shopify only:** Shopify can't show different shipping methods to different types of customer on its own. Use a shipping app that sets rates by customer tag, such as [Intuitive Shipping](https://docs.sparklayer.io/help/integrations/customer-experience/intuitive-shipping.md), or [SparkLayer shipping rates](#set-up-sparklayer-shipping-rules), which are B2B-only by design. ![Intuitive Shipping logo](https://docs.sparklayer.io/images/help/ordering/shipping-rules/shipping-rules-3c0a2b.webp) With Intuitive Shipping, you set rates and rules by customer tag, so a signed-in B2B customer (tagged `b2b`) gets their B2B shipping methods. For its full rates to load in SparkLayer, [contact us](https://docs.sparklayer.io/help/support.md) to turn on a setting. See [Features we turn on for you](https://docs.sparklayer.io/help/dashboard/features-on-request.md). Some other shipping apps also need a setting turned on by our team, and some lower-cost apps don't work with the SparkLayer checkout. Before you buy a shipping app, [ask our support team](https://docs.sparklayer.io/help/support.md) whether it's compatible. ### Choose which method is pre-selected (Shopify) **Shopify only:** SparkLayer pre-selects one of your Shopify shipping methods at checkout. Customers can pick another, and their choice is never overridden. To choose which one: 1. Go to **Settings > Shipping > Automatic shipping selection** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/shipping)), or **SparkLayer Wholesale > Settings > Shipping > Automatic shipping selection** in the Shopify app. 2. Choose an option, then click **Save**. | Option | What's pre-selected | | --- | --- | | **First available method (default)** | Whichever method Shopify returns first, whatever its price. If a free rate comes back first, free shipping is the default. | | **Prefer cheapest paid method** | The lowest-priced method that isn't free, so a free rate doesn't become the default. If every method is free, the first one is used. | ### Change shipping costs after an order is placed on Shopify **Shopify only:** Draft orders let customers pick a standard Shopify shipping method while you adjust the cost before completing the order. **Pay on Account** and **Pay by Invoice** orders arrive as drafts unless you [complete drafts automatically](https://docs.sparklayer.io/help/ordering/automation-and-workflows.md). 1. In the Shopify admin, open the draft order and edit its shipping. 2. In **Edit shipping**, choose another rate, or choose **Custom** and enter a **Rate name** and **Price**. 3. Click **Done**. See Shopify's guide to [adding shipping to an order](https://help.shopify.com/en/manual/orders/create-orders#add-shipping). ### Offer local pickup on Shopify **Shopify only:** SparkLayer doesn't support Shopify's **Local pickup** delivery option. Instead, create a normal shipping method called "Local pickup", for example with a zero rate, in **Settings > Shipping and delivery** ([open in the Shopify admin](https://admin.shopify.com/settings/shipping)). It then appears in the SparkLayer checkout. This method also shows to retail (DTC) customers in the Shopify checkout, unless an app hides it. To show it only to B2B customers, create it as a [SparkLayer shipping method](#set-up-sparklayer-shipping-rules) instead. ## Set up SparkLayer shipping rules SparkLayer shipping rates have two parts: | Part | What it is | | --- | --- | | **Shipping method** | What the customer sees and picks at checkout, such as "Standard Shipping". Each method applies to chosen countries and customer groups. | | **Shipping band** | A cost rule inside a method. For example, orders under £100 cost £20 to ship, and orders over £100 ship free. A method without a band doesn't show at checkout. | Copy the rates from your eCommerce platform or backend system, so customers see the same costs everywhere. For example, if UK customers get free shipping over £100, set up the same rule here. ### What SparkLayer shipping rules can do SparkLayer shipping rules can: - Offer B2B-only methods in chosen countries (and, for some countries, states or regions) to chosen customer groups. - Pick a band by the order's net total or its weight. - Charge each band's cost: free, a fixed price, a percentage of the net total, or a message instead of a cost. They can't: - Charge by the kilogram. A band's price is fixed for the band, and the order's weight only picks the band. For example, a £10 band from 0 to 5,000 g costs £10 for a 1 kg order and for a 5 kg order. - Set rates by product, product tag or collection. - Fetch live carrier rates. For any of these, use your store's shipping with a shipping app instead. See [Show B2B-only shipping methods on Shopify](#show-b2b-only-shipping-methods-on-shopify). ### Turn on SparkLayer shipping rates 1. Go to **Settings > Shipping** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/shipping)), or **SparkLayer Wholesale > Settings > Shipping** in the Shopify app. 2. Under **Shipping rates**, tick **Use SparkLayer shipping rates** ("Set B2B-only shipping methods, priced by customer group, order total or weight"). 3. Click **Save**. The **Shipping methods** card appears, listing each method's **Countries**, **Customer groups** ("All groups" when none are chosen), number of **Bands** and **Priority**. To go back to your store's own rates, untick the box. Some platforms need an extra step: | Platform | What to do | | --- | --- | | **Wix** | In your Wix dashboard, go to **Settings > Shipping, Delivery & Fulfillment**. Make sure you have at least one shipping region, click **Manage Your Apps** below it, and turn on **SparkLayer Shipping**. See [Install SparkLayer on Wix](https://docs.sparklayer.io/help/platforms/wix/install.md#enabling-sparklayer-shipping-methods). | | **BigCommerce** | Turn off card payment (**Card at checkout** in your customer groups). BigCommerce overwrites the shipping method on orders paid by card in its checkout. See [BigCommerce limitations](https://docs.sparklayer.io/help/platforms/bigcommerce/limitations.md). | | **Shopify, WooCommerce, Magento** | Nothing extra. | #### If you set up shipping during a trial Shipping methods and bands you set up during a trial can stay live at checkout after you move to the free plan, while their settings become locked so you can't change them. To switch them off, [contact our support team](https://docs.sparklayer.io/help/support.md). ### Create a shipping method 1. At **Settings > Shipping** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/shipping)), or **SparkLayer Wholesale > Settings > Shipping** in the Shopify app, click **Create shipping method**. 2. Fill in the fields below, then click **Save**. Add bands once the method is saved. | Field | What it does | | --- | --- | | **Method name** | The name customers see at checkout, such as "Standard Shipping" or "Next Day". Make it clear. | | **Shipping SKU** | A unique ID for the method, such as `standard-shipping`, filled in from the name. If you use the SparkLayer API, it must match the shipping SKU in your backend system, such as your ERP. | | **Priority order** | The order methods are shown in. 1 shows first at checkout. Set this on every method. | | **Available countries** | The countries where the method is offered at checkout. Choose at least one. | | **States or regions (optional)** | For the United States, Canada and Australia, limit the method to states or regions, for example "California, New York". Leave it empty for the whole country. | | **Customer groups** | The B2B customer groups that see the method. Leave every group unticked to offer it to all B2B customers. | To delete a method, open it and choose **More actions** > **Delete method**. It disappears from checkout; orders already placed keep their shipping. ### Add shipping bands Shipping bands set a method's cost, by **Order total (net)** or **Order weight (grams)**. Weight bands always use grams, so convert from oz or lb if your products use them. 1. Open the shipping method and, under **Shipping bands**, click **Add band**. 2. Fill in the fields below, then click **Add band**. 3. Add more bands to cover the rest of your order values or weights. | Field | What it does | | --- | --- | | **Band name** | A name such as "Orders under £99". Customers don't see it, except in a custom message key. | | **Shipping SKU (optional)** | A shipping SKU for the band, if your backend system supports band SKUs. If you leave it blank, the method's SKU is used. | | **Cost type** | **Free**, **Fixed price**, **Percentage of the net total**, or **Custom message** (see [Show a message instead of a cost](#show-a-message-instead-of-a-cost)). | | **Cost** | The price, or the percentage for a percentage band. Ignored for free and custom message bands. | | **Applies based on** | **Order total (net)** or **Order weight (grams)**. | | **From** and **Up to (optional)** | The range the band covers. Leave **Up to** empty for "and over". To apply a band to every order, set **From** to 0 and leave **Up to** empty. | Band order sets each band's priority. At checkout, the first band the order matches sets the cost, so a free shipping band only applies if no band above it also matches the order. Make sure the bands cover every order value or weight with no gaps: an order whose weight falls in a gap gets no rate from this method. **Example: £20 under £99, free above** Add a band with **Cost type** **Fixed price**, **Cost** 20, **Applies based on** **Order total (net)**, **From** 0 and **Up to** 98.99. Then add a **Free** band from 99 with no **Up to**. To change a band, click **Edit** next to it. **Remove** deletes it: orders it covered fall to the next matching band, or the method won't show for them. ### Show a message instead of a cost Use the **Custom message** cost type when you can't confirm the cost yet. At checkout, the method shows a message such as "To be confirmed" instead of a cost. The order's shipping cost is set to 0.00, so you can edit it afterwards. 1. Add or edit a band and set **Cost type** to **Custom message**, then save it. 2. In the **Shipping bands** table, the band's **Cost** shows its key, `shipping.custom-message.` followed by the band's name in lowercase with dashes, for example `shipping.custom-message.orders-under-250`. Copy it. 3. Go to **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, click **Add override**, choose the key and enter your message, such as "To be confirmed". 4. Click **Save and publish**. For more on translation overrides, see [Change checkout text](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md#change-checkout-text). **Core Script code for your developer** A developer can set the message in your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting) translations instead (see [Languages and international](https://docs.sparklayer.io/help/storefront/languages-and-international.md)): ```javascript title="Core Script" /* Replace orders-under-250 with your band's key */ translations: { en: { "shipping.custom-message.orders-under-250": "To be confirmed", } }, ``` ### Test your shipping rates Your methods show in the [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) and on **Review & Pay**, such as **Standard Shipping** £20.00 and **Express Shipping** £50.00. Try different countries, customer groups, order values and weights to check the right methods and costs show. ## Set a custom shipping rate as a sales agent With [Sales agent ordering](https://docs.sparklayer.io/help/sales-ordering.md), a sales agent whose [role](https://docs.sparklayer.io/help/sales-reps/roles.md) has the **Change shipping** permission, such as the built-in **Sales administrator**, can set a custom shipping rate at checkout. It overrides your shipping rules. ## Troubleshooting **Diagnose: Shipping not working as expected?** Check which shipping your B2B customers use. 1. **Is “Use SparkLayer shipping rates” ticked?** For B2B customers it’s either your Shopify shipping or SparkLayer’s shipping rules, never both. Where to look: Settings > Shipping (SparkLayer). - Yes, SparkLayer shipping: go to question 2 - No, Shopify shipping: go to question 3 2. **What’s wrong?** Pick the closest match. - I want live carrier rates: go to fix A (Live rates come from Shopify shipping) - Rates should depend on the products: go to fix B (Product-based rates need a shipping app) - Free shipping isn’t applied: go to question 4 - “No shipping methods available” at checkout: go to fix C (Cover the customer’s country and group) - I can’t edit my rates after a trial: go to fix D (Ask us to switch them off) 3. **What’s wrong?** Pick the closest match. - B2B customers see the same rates as retail: go to fix E (Use a shipping app that sets rates by customer tag) - I want to hide free shipping from B2B: go to fix E (Use a shipping app that sets rates by customer tag) - B2B customers see wrong or missing rates: go to fix F (Check the customer’s setup) 4. **Is the free shipping a SparkLayer discount?** Free shipping can come from a shipping band or from a discount. Where to look: Pricing > Discounts (SparkLayer). - Yes, a discount: go to fix G (Select every shipping method the customer can see) - No, a shipping band: go to fix H (Check the band order) **Fixes** - **A. Live rates come from Shopify shipping** SparkLayer’s rules charge per band, chosen by order value or weight. For live or calculated carrier rates, untick “Use SparkLayer shipping rates” so B2B customers get your Shopify rates, including shipping apps. Where: Settings > Shipping (SparkLayer). See [Shipping rules](https://docs.sparklayer.io/help/ordering/shipping-rules.md). - **B. Product-based rates need a shipping app** SparkLayer’s rules work on order value or weight only, not on products or tags. Use Shopify shipping with an app that sets rates by product or customer tag, such as Intuitive Shipping. See [Intuitive Shipping](https://docs.sparklayer.io/help/integrations/customer-experience/intuitive-shipping.md). - **C. Cover the customer’s country and group** No band matches this customer. Check your shipping rules cover their country, their customer group and the order’s value or weight. Where: Settings > Shipping (SparkLayer). - **D. Ask us to switch them off** Shipping rules set up during a trial can stay live after a downgrade while the settings are locked. Tell us and we’ll switch SparkLayer shipping off, so your Shopify rates apply. - **E. Use a shipping app that sets rates by customer tag** Shopify can’t show different rates to different customers on its own. A shipping app that uses customer tags, such as Intuitive Shipping, can. Some apps, including Intuitive Shipping, also need a SparkLayer setting: follow the app’s guide, or tell us which app you use. See [Intuitive Shipping](https://docs.sparklayer.io/help/integrations/customer-experience/intuitive-shipping.md). - **F. Check the customer’s setup** If one customer sees the wrong rates, check their tags and group. Next: Wrong prices, payment methods or shipping for a customer? - **G. Select every shipping method the customer can see** A free shipping discount only applies to the shipping methods it names. If you have methods per region, select each one, or make a discount per region. Also check the customer’s group is eligible and the threshold is in their price list’s currency. Where: Pricing > Discounts (SparkLayer). See [Discounts](https://docs.sparklayer.io/help/pricing/discounts.md). - **H. Check the band order** The first band an order matches sets its cost, so a free band only applies if no band above it also matches. Put the free band first, or make the bands cover separate ranges. Where: Settings > Shipping (SparkLayer). See [Free shipping isn’t applied](https://docs.sparklayer.io/help/ordering/shipping-rules.md#free-shipping-isnt-applied). **Free shipping isn't applied, or the wrong rate shows** Change your bands so the free shipping band is the first one the order matches. At checkout, the first band the order matches sets the cost. If a paid band higher up also covers the order, its rate wins, even when the order qualifies for free shipping. 1. Open the shipping method at **Settings > Shipping** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/shipping)), or **SparkLayer Wholesale > Settings > Shipping** in the Shopify app. 2. Check the order of the bands, and which ones cover the order's total or weight. 3. Edit the ranges so they don't overlap, or reorder the bands so the free band comes first. Then [test your shipping rates](#test-your-shipping-rates) with an order that should ship free. **Local pickup not displaying** **Shopify only:** SparkLayer doesn't support Shopify's Local pickup option. Create a free "Local pickup" shipping method in Shopify or SparkLayer, whichever you use (see [Offer local pickup on Shopify](#offer-local-pickup-on-shopify)), and check it's available for the region you're testing. **Shipping costs don't match the shipping bands** - **The expected condition:** the bands use weight or order value as you expect. - **Product data:** all products have a valid weight and price, so the bands can be calculated. If the costs at checkout still differ from the bands at **Settings > Shipping** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/shipping)), or **SparkLayer Wholesale > Settings > Shipping** in the Shopify app, [contact our support team](https://docs.sparklayer.io/help/support.md). **Having technical issues?** If you see error messages or can't set this up, see [Troubleshooting](https://docs.sparklayer.io/help/troubleshooting.md) or [contact our support team](https://docs.sparklayer.io/help/support.md). --- # 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 **Sales Agents > 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. If a custom shipping rate isn't added to the total, see [this FAQ](https://docs.sparklayer.io/help/sales-ordering/order-for-a-customer.md#custom-shipping-rate-not-in-total). 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). --- # Work on a quote URL: https://docs.sparklayer.io/help/ordering/work-on-a-quote Review, assign, edit and message B2B quotes as a sales agent or Sales administrator, then complete them, and see how a quote moves from request to order. > **Quick summary** > > - For the people who handle quotes from the [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md): sales agents and Sales administrators. You work on a quote by signing in to your store on the customer's behalf, where it opens in their My Account. > - A Sales administrator assigns each new quote to a sales agent, with a status and an expiry date. Only the assigned sales agent can then change it. > - You find quotes in the new quote email and in **Recent Activity** in your account on the storefront, where you review and edit them. Each quote has a purchase ID such as `P#1264`. > - Once you've agreed it, the customer, or a sales agent for them, clicks **Confirm & Complete** and the quote becomes an order. To turn on quotes, set up statuses and choose who's emailed, see [Set up quotes](https://docs.sparklayer.io/help/ordering/quoting.md). ## How a quote becomes an order How a quote moves from request to order: 1. **Requested**: The customer submits their cart as a quote and chooses a shipping method 2. **Assigned**: Your team is emailed; a Sales administrator assigns a sales agent, a status and an expiry date 3. **Negotiated**: The agent and customer edit the quote and exchange messages on its timeline 4. **Confirmed**: The customer, or the agent for them, clicks Confirm & Complete and places the order 5. **Order**: The order is Processing and follows your usual workflow until it ships The quote's [status](#what-happens-at-each-status) decides what the customer can do at each stage, such as edit or complete it. On Shopify, a completed quote becomes a regular order, not a draft order. If a [limited user](https://docs.sparklayer.io/help/customers/company-users.md) completes a quote, the order goes to their company's main user for approval first. Once it's approved, it reaches you as a normal order. See [Approve orders from limited users](https://docs.sparklayer.io/help/customers/company-users.md#approve-orders-from-limited-users). ### Where to find quotes | Where | What you see | | --- | --- | | **Email** | A new quote email with the customer's details and the items, and a **View requested quote** button. Who gets it is set in [Choose who is notified about quotes](https://docs.sparklayer.io/help/ordering/quoting.md#choose-who-is-notified-about-quotes). | | **Your account on the storefront** | Sales agents find quotes in **Recent Activity**, with **All**, **Assigned to me** and **Placed by me** tabs. The **Status** column tells quotes (such as "Quote Requested") apart from orders. | | **Orders** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/activity)), or **SparkLayer Wholesale > Orders** in the Shopify app | Quotes may also be listed here as **Awaiting merchant**, with their purchase ID, as there's no order in your store yet. To work on a quote, open it on the storefront. See [Orders](https://docs.sparklayer.io/help/dashboard/orders.md) and [Awaiting merchant](https://docs.sparklayer.io/help/glossary.md#awaiting-merchant). | ## Request a quote Customers, or sales agents signed in on their behalf, request a quote from the cart: they click **Request Quote** instead of **Checkout** (sales agents see **Submit Quote**), choose a shipping method and click **Submit Quote**. No payment is taken. For each step of the quote checkout, see [Submit a quote instead](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md#submit-a-quote-instead). The quote then shows in the activity list in the customer's [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md). Its **Summary** shows when it was requested, its expiry date, the assigned sales agent and its status. The **Order Lines**, **Timeline** and **Files** tabs show the products, messages and attachments, and **Download PDF** downloads a copy. ### Start a quote for a customer Sales agents can build a quote for a customer: sign in as them with [Order for a customer](https://docs.sparklayer.io/help/sales-ordering/order-for-a-customer.md#submit-a-quote), add the products and submit the cart as a quote. The customer is emailed to review it. **Shopify only:** Don't create a draft order for a B2B customer by hand in the Shopify admin instead: it uses your Shopify prices, not the customer's B2B prices. To order or quote at their prices, use [Order for a customer](https://docs.sparklayer.io/help/sales-ordering/order-for-a-customer.md). ## What happens at each status | Status | Who acts next | What the customer sees and can do | | --- | --- | --- | | **Quote Requested** (default) | You. A Sales administrator assigns the quote, and the sales agent reviews it, adjusting prices, quantities or shipping. | The quote in My Account, with this status. **Confirm & Complete** is disabled by design, so the order can't be placed until you've reviewed it. They can message you on the quote's timeline. | | **Awaiting Customer** | The customer. | They review your changes, then click **Confirm & Complete** to place the order. They can also click **Edit Quote** if the status allows edits. | | Statuses you add | Whoever you decide. | Whatever the status allows, with **Allow customers to complete quote** and **Allow customers to make edits to quote**. | Only sales agents assigned to a quote can change its status. To add statuses or change what each allows, see [Set up quote statuses](https://docs.sparklayer.io/help/ordering/quoting.md#set-up-quote-statuses). ## Review and assign a quote 1. Click **View requested quote** in the new quote email and sign in to your store. The quote opens in the customer's My Account. 2. As a Sales administrator, click the edit icon in the yellow box at the top of the quote and set: - **Assigned Sales Agent**: who handles the quote - **Quote Status**: one of your [quote statuses](#what-happens-at-each-status) - **Expiry Date**: after this, the customer must start a new quote (if the status archives expired quotes) 3. Click **Save**. The assigned sales agent is emailed, and sees the quote when they next sign in. Of your team, only the sales agent assigned to the quote can change it. ## Edit a quote and send it back Sales agents can edit a quote, and so can customers if its status allows. 1. Open the quote in My Account and click **Edit Quote**. It opens in the [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md). 2. Make your changes. Customers can add or remove products and change quantities. Sales agents can also change line prices and shipping, add custom line items and custom shipping, and add out-of-stock (not on BigCommerce) or POA (price on application) products. 3. Continue through the checkout. Sales agents get an extra **Quote Details** step, with a banner naming the customer. There, they: - Set the **Quote Status**, **Expiry Date** and **Assigned Sales Agent** - Under **Communications**, choose **Notify customer** (emails the customer) or **Save as internal note**, with an optional message 4. Click **Submit Revisions to Quote**. The customer is notified to review the changes. Changing prices and shipping needs the **Change quoted prices** and **Change shipping** permissions in the sales agent's [role](https://docs.sparklayer.io/help/sales-reps/roles.md). You can't add discounts to a quote. ## Message the customer about a quote Each quote's **Timeline** tab in My Account keeps all messages between the customer and your sales team in one place. Messages are also sent by email. | Who | How they send a message | | --- | --- | | **Sales agent** | Choose **Notify customer** and click **Send Email**, or choose **Save as internal note** for a private note (in a yellow box, seen only by sales agents). Customers sign in to reply. | | **Customer** | Types in the message box and clicks **Send Message**. The assigned sales agent is notified. | Each entry shows who sent it and when, for example "Seb Latch (Customer) sent a message". See [Order timeline and messages](https://docs.sparklayer.io/help/customers/timeline.md). ## Complete a quote Once the quote is agreed, the customer or a sales agent turns it into an order. 1. Open the quote in My Account and click **Confirm & Complete**. 2. The checkout opens at **Review & Pay**, with a banner saying "You are completing a quote" and the quote's shipping method selected. Choose a payment method, and change anything else you need. 3. Tick the terms and conditions and click **Complete Order**. The quote becomes a **Processing** order and follows your usual workflow until it ships. On Shopify, it's a regular order, not a draft. If the quote is no longer needed, click **Cancel and archive** under the quote's buttons. This cancels it and stops any further changes. ## Reference ### Quote actions | Action | Customer | Sales agent | | --- | --- | --- | | **Edit Quote** | Opens the quote in the cart to add or remove products and change quantities, if the status allows edits. | Opens the quote in the cart to also change line prices and shipping costs. | | **Confirm & Complete** | Goes to checkout to place the order, if the status allows it. The shipping method is pre-selected and can be changed; they choose how to pay. | Completes the quote on the customer's behalf. | | **Cancel and archive** | Cancels the quote and stops any further changes. Only use it when the quote is no longer needed. | The same. | ### Timeline activities | Activity | What's shown | | --- | --- | | **Quote actions** | When the quote was requested and updated | | **Customer messages** | Messages from the customer | | **Sales agent messages** | Messages from a sales agent | | **Internal notes** | Private notes from a sales agent | | **Quote edits** | Each edit, with a log of what changed | The emails sent at each step are listed in [Email notifications](https://docs.sparklayer.io/help/ordering/quoting.md#email-notifications-sent). ## Troubleshooting **Diagnose: Quote buttons greyed out?** Check who acts next and what each status allows. 1. **Who can’t act on the quote?** Buyers and merchants see different buttons at each stage. - The customer: go to question 2 - Me or a sales agent: go to question 3 2. **Is the quote’s status “Quote requested”?** That’s the status right after a customer asks for a quote. - Yes: go to fix A (You review the quote first) - No: go to question 4 3. **Does the person’s role allow them to work on quotes?** Sales agents can only do what their role allows. Where to look: Sales Agents > Roles (SparkLayer). - Yes: go to question 5 - No / not sure: go to fix B (Give the role quote permissions) 4. **Is the customer trying to edit the quote?** Whether a customer can edit a quote is set for each status. - Yes: go to fix C (Allow editing for that status) - No: go to fix D (Everything checks out) 5. **Are your quote statuses turned on?** Quote statuses and what each allows are set in your configuration. Where to look: Settings > Configurations > Quote statuses (SparkLayer). - Yes: go to fix D (Everything checks out) - No / not sure: go to fix E (Turn on your quote statuses) **Fixes** - **A. You review the quote first** When a customer requests a quote, you or a sales agent review it and adjust prices. Confirm & complete stays greyed out for the customer until you move it on. That’s by design. See [Quoting](https://docs.sparklayer.io/help/ordering/quoting.md). - **B. Give the role quote permissions** Edit the person’s role, tick the quote permissions and save. Where: Sales Agents > Roles (SparkLayer). - **C. Allow editing for that status** Open Quote statuses, edit the status the quote is in, and allow the customer to edit it. Where: Settings > Configurations > Quote statuses (SparkLayer). - **D. Everything checks out** Your setup looks right, so we'll take it from here. Send us your answers with the quote number and who’s trying to act on it. - **E. Turn on your quote statuses** Enable the quote statuses you use, then reload the quote. Where: Settings > Configurations > Quote statuses (SparkLayer). ## FAQs **Why is Confirm & Complete greyed out?** | Who | Why | | --- | --- | | **The customer**, at **Quote Requested** | This is by design. You review the quote first, then move it to a status that lets the customer complete it, such as **Awaiting Customer**. See [What happens at each status](#what-happens-at-each-status). | | **The customer**, at another status | The status doesn't allow customers to complete quotes. Check its **Allow customers to complete quote** setting in [quote statuses](https://docs.sparklayer.io/help/ordering/quoting.md#set-up-quote-statuses). | | **You or a sales agent** | The agent's [role](https://docs.sparklayer.io/help/sales-reps/roles.md#permissions) doesn't have the **Quotes** permission they need, such as **Edit quotes** or **Complete quotes**, or the quote isn't assigned to them. Only the assigned sales agent can change a quote. Also check the quote's status allows the action. | **Can I edit the prices and shipping costs on a quote?** Yes, if your sales agent [role](https://docs.sparklayer.io/help/sales-reps/roles.md) has the **Change quoted prices** and **Change shipping** permissions. The built-in **Sales administrator** role has both. **Can I apply discounts to a quote?** No. Change the line prices instead. --- # Shopping lists URL: https://docs.sparklayer.io/help/ordering/shopping-lists Let B2B customers save named shopping lists, add products from the cart or product page, edit quantities, add whole lists to the cart and export them to CSV. > **Quick summary** > > - Shopping lists let B2B customers save products and quantities in named lists, such as "Every month order", then add a whole list to the cart to reorder. > - They're on by default, on every plan, with nothing to set up. Customers use them from **My Account > Shopping Lists**, product pages and the cart. Sales agents can use and export lists when [ordering for a customer](https://docs.sparklayer.io/help/sales-ordering/order-for-a-customer.md). > - To hide them, turn off **Shopping lists** at **Storefront > Options > My Account** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > My Account** in the Shopify app. ## How it works Shopping lists save products with their variants and quantities, so customers don't rebuild the same order each time. Each customer can keep as many lists as they need, such as monthly restocks, seasonal ranges or an order built up over several days. How customers use shopping lists: 1. **Save products**: From a product page, the cart or My Account. 2. **Edit the list**: Change quantities, add or remove products. 3. **Add to cart**: The whole list, or only selected items. 4. **Check out**: As with any other order. To try them, sign in to our [B2B demo store](https://demo.sparklayer.io/pages/b2b-login-register). [Favourites](https://docs.sparklayer.io/help/ordering/favourites.md) are different: they save only the product, with no variant or quantity. See [Favourites vs shopping lists](https://docs.sparklayer.io/help/ordering/favourites.md#favourites-vs-shopping-lists). ## Create a shopping list Customers can create a list in 3 places: | Where | How | | --- | --- | | **My Account** | Go to **My Account > Shopping Lists** and click **Create List**. This starts an empty list and leaves the cart as it is. | | **Add to shopping list window** | When adding a product to a list, click **Or create a new shopping list**. | | **Cart** | Click **Actions**, choose **Add to shopping list**, then create a new list. | The **Shopping Lists** page shows each list's **Name** and **Last Updated** date, with a search box and an **Actions** menu for each list. ## Add products to a list **From a product page** 1. Set the quantity of each product or variant you want. 2. Click the **Add to shopping list** icon (a clipboard) next to the **Add to Cart** button. 3. In the **Add to shopping list** window, choose a list (or create a new one) and click **Save**. The quantity on the page is saved to the list, and a message confirms it. **From the cart** 1. In the cart, click **Actions**. 2. Choose **Add to shopping list**, or one of the lists shown under **Shopping Lists** in the menu. 3. In the **Add to shopping list** window, choose the list and click **Save**. ## Edit a list Open a list from **My Account > Shopping Lists**. It shows when it was created and last modified, and each product's quantity and price. | To | Do this | | --- | --- | | **Add products** | Search by name, SKU or barcode at the top of the list, and set the quantity. | | **Change quantities** | Use the quantity controls on each product. Quantity rules such as pack sizes still apply. | | **Remove products** | Click the bin icon on a product, or tick several products and remove them together. | ## Add a list to the cart Customers open the list and add the **whole list** at its saved quantities, or tick products and add **only the selected items**. Then they check out as normal. Lists top up the cart: if a product is already there, its quantity increases. Nothing in the cart is removed or replaced. ## Export a list to CSV Customers and sales agents can download a list as a CSV file, to share or work on offline. Unsaved changes are saved first, so the file matches the screen. The CSV includes the SKU, name, unit price and quantity of every item. ## Turn shopping lists off 1. Go to **Storefront > Options** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options** in the Shopify app and open **My Account**. 2. Turn off **Shopping lists**. 3. Click **Save and publish**. The shopping list icon disappears from product pages, and Shopping Lists disappears from My Account. ## FAQs **Can a customer create more than one shopping list?** Yes. Customers can create and name as many lists as they need. **Can products be added to a list without going to the account area?** Yes. Products can be added straight from a product page or from the cart. **Does adding a list to the cart replace what's already there?** No. Items are added to the current cart, and a product already there has its quantity increased. **Are quantities saved with a list?** Yes. Each item's quantity is saved and carries over to the cart. **Can a customer remove items from a list?** Yes. Items can be removed one at a time or several at once. **Can a list be downloaded?** Yes. Customers and sales agents can export any list as a CSV. See [Export a list to CSV](#export-a-list-to-csv). --- # Favourites URL: https://docs.sparklayer.io/help/ordering/favourites Let B2B customers save products with a heart icon as they browse and add them to the cart from My Account, and see how Favourites differ from shopping lists. > **Quick summary** > > - Favourites let B2B customers save a product with one click on the heart icon, then find it in **My Account > Favourites**. They save the product only, not a variant or quantity: for those, use [shopping lists](https://docs.sparklayer.io/help/ordering/shopping-lists.md). > - They're on by default and need Core Script version 4.9 or later. 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 hide them, turn off **Favourites lists** at **Storefront > Options > My Account** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > My Account** in the Shopify app. ## How it works Favourites let customers browsing a large catalogue mark products for later, without building an order or filling the cart. When they're ready to buy, they pick the variant and quantity and add the product to the cart. Each customer sees only their own Favourites, which aren't shared with other users or accounts. There's nothing for you to keep up to date. To try them, sign in to our [B2B demo store](https://demo.sparklayer.io/). Before you start: - **Core Script 4.9 or later** on your storefront. 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. - **Favourites lists turned on** at **Storefront > Options > My Account** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > My Account** in the Shopify app (on by default). ### Favourites vs shopping lists Favourites and [shopping lists](https://docs.sparklayer.io/help/ordering/shopping-lists.md) work side by side but do different jobs. | Topic | Favourites | Shopping lists | | --- | --- | --- | | **Best for** | Marking products to come back to later | Building and reordering a specific order | | **What's saved** | The product only | Products with their variants and quantities | | **Structure** | One simple list per customer | Multiple named lists per customer | | **Adding to the cart** | Select products, then choose options and quantities | Add the whole list, or selected items, with saved quantities | A shopping list suits a customer who knows what to reorder. Favourites are quicker for remembering products while browsing. ## Add a product to Favourites Customers click the heart icon (**Add to favourites**) next to **Add to cart** and the shopping list icon on a product page, or on a product card on a collection page. The heart changes to show the product is saved. Saving it again doesn't create a duplicate. ## View Favourites in My Account The My Account overview shows the most recently saved products in **Favourites**, above the shopping lists. Hovering over a product shows its name, and **View all** opens the Favourites page. The Favourites page lists every saved product with its image, name and SKU, with the total in the heading. If nothing's saved yet, it explains how to use the heart icon. ## Add favourites to the cart 1. On the Favourites page, click **Select & add to cart**. 2. Select one or more products. 3. For each product, click **Choose options** to pick the variant and set the quantity. Current pricing and stock are shown for each option. 4. Add the selected products to the cart. The products stay in Favourites. The usual availability and quantity rules apply, and if a product can't be added, such as when it's no longer available, a message explains why. ## Remove a favourite On the Favourites page, customers click the remove icon next to a product. It's removed straight away, without changing the product or any shopping lists. ## Turn Favourites off 1. Go to **Storefront > Options** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options** in the Shopify app and open **My Account**. 2. Turn off **Favourites lists**. 3. Click **Save and publish**. The heart icon disappears from product and collection pages, and Favourites disappears from My Account. Turn it back on in the same place at any time. ## FAQs **What's the difference between Favourites and shopping lists?** Favourites save only the product, to come back to later. Shopping lists save products with variants and quantities, for building and reordering a specific order. Both are in My Account. See [Favourites vs shopping lists](#favourites-vs-shopping-lists). **Can a customer save a specific variant or quantity as a favourite?** No. Customers choose the variant and quantity when adding a favourite to the cart, so they always see current options, pricing and stock. **Can customers favourite products from collection pages?** Yes. The heart icon is on collection page product cards as well as product pages. **Are Favourites shared with other users or accounts?** No. Favourites are personal to each signed-in customer. **Does adding a favourite to the cart remove it from Favourites?** No. Products stay in Favourites after they're added to the cart. **What happens if a favourited product is no longer available?** It stays in Favourites but can't be added to the cart. A message explains this, and the customer can remove it. **Does removing a favourite affect shopping lists?** No. It only affects that customer's Favourites. **The heart icon doesn't appear on my store** Check the requirements in [Before you start](#how-it-works): Core Script 4.9 or later, and **Favourites lists** turned on at **Storefront > Options > My Account** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > My Account** in the Shopify app. ## Next steps - [Shopping lists](https://docs.sparklayer.io/help/ordering/shopping-lists.md): Save products with their variants and quantities to reorder in one go - [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md): Everything customers can do in My Account, Favourites included --- # Intelligent Cart (AI) URL: https://docs.sparklayer.io/help/ordering/intelligent-cart Build B2B orders with SparkLayer Intelligent Cart by uploading a PDF, spreadsheet or photo, forwarding an email or scanning barcodes to fill the cart. > **Quick summary** > > - Intelligent Cart uses AI to fill the cart from a file or email listing products and quantities, such as an invoice, purchase order or photo of a handwritten order. Customers can also scan barcodes with their camera. > - Customers and sales agents use it in the [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md), with **Upload a file**, **Forward an email** and **Scan barcode**. > - The AI features and camera scanning are on the Starter plan and above (see [Plans and features](https://docs.sparklayer.io/help/plans-and-features.md)), and need the latest version of the [Core Script](https://docs.sparklayer.io/help/glossary.md#core-script) in your theme. Importing a CSV file or spreadsheet of SKUs, and using a handheld barcode scanner, work on every plan. > - Uploaded and emailed data is never used for training, and is deleted within 24 hours. ## How it works How Intelligent Cart builds a cart: 1. **Send the order**: Upload a file, forward an email or scan a barcode. 2. **AI reads it**: SKUs, barcodes and quantities are picked out. 3. **Products matched**: Only products that match your store are added. 4. **Review and check out**: Edit the cart as normal, then check out or request a quote. | Feature | What it does | Plan | | --- | --- | --- | | **Upload a file** (AI) | Reads documents, spreadsheets and images: PDF, XLSX, PNG, JPG, CSV, TXT, JSON and DOCX. Recognised SKUs and quantities are added to the active cart. | Starter and above | | **Forward an email** (AI) | Reads order details in the body or an attachment of a forwarded email, and fills the cart. | Starter and above | | **Scan barcode** | Adds products by scanning their barcodes with a phone or computer camera. | Starter and above | | [CSV import](#import-products-from-a-csv-file) | Adds products from a file with SKU (or barcode) and quantity columns, or rows pasted from a spreadsheet. | Every plan | | [Barcode scanner](#use-a-barcode-scanner) | A handheld scanner types each barcode into the cart's search box, like a keyboard. | Every plan | To try it, sign in to our [demo store](https://demo.sparklayer.io/pages/b2b-login-register). ## Set up Intelligent Cart - **The latest version of SparkLayer** on your storefront. See the [frontend integration guide](https://docs.sparklayer.io/developers/frontend.md) for how to upgrade, or ask your developer. - **The Starter plan or above.** See [Plans and features](https://docs.sparklayer.io/help/plans-and-features.md). - **Barcodes on your products**, if you want barcode scanning. Add them in your eCommerce platform's admin. See [How products are shown](https://docs.sparklayer.io/help/storefront/product-display.md) for how barcodes show on your store. To check it, sign in to your store as a B2B customer and open the cart. An empty cart shows shortcuts to **Upload a file**, **Forward an email**, **Scan barcode** and **Repeat order**. Once it has items, they're in the **Actions** menu next to the search box. ## Build a cart from a file 1. In the cart, click **Upload a file** (in the **Actions** menu once the cart has items). 2. Drop the file onto **Build a cart from a file**, or click **browse** and choose it. 3. Within a few seconds, SKUs and quantities that match products in your store are added to the cart. Others aren't added. 4. Edit the cart if needed, then check out as normal. For best results, use a file with SKUs or barcodes, such as an invoice or purchase order. From a previous invoice, for example, Intelligent Cart picks up each item's SKU and quantity. The items are added to what's already in the cart. ## Import products from a CSV file Customers can add many products at once from a CSV file, by uploading it or by pasting rows from a spreadsheet. This works on every plan. 1. In the cart, open **Actions** and choose **Upload a file**. 2. Drop the CSV file onto the upload box, or click **Paste rows**, paste the first two columns from a spreadsheet and add them. Under the upload box, customers can download a **SKU template** or a **barcode template** to start from. By default, the file needs two columns with these headings: | Ordering by | Columns | | --- | --- | | SKU | `sku` and `qty` | | Barcode | `barcode` and `qty` | ```csv sku,qty abc123,10 xyz123,20 ``` The products in the file are added to the cart. If a product must be ordered in packs, the quantity is rounded up to the nearest valid pack size. ### Rename the CSV column headings You can give the columns names that suit your customers, for example `Item No.` and `Quantity` instead of `sku` and `qty`. The upload screen then shows your headings. To do it without code, add translation overrides for these keys 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. **For developers: set them in the Core Script** Add these [text overrides](https://docs.sparklayer.io/help/storefront/languages-and-international.md) to your Core Script and change the values: ```javascript title="Core Script" translations: { en: { "cart.import.csv-headers.sku": "Item No.", "cart.import.csv-headers.barcode": "Barcode No.", "cart.import.csv-headers.qty": "Quantity", } }, ``` ## Build a cart from an email 1. In the cart, click **Forward an email**. 2. Click **Copy** to copy the customer's email address. 3. Forward the email with the order details, in its body or an attachment, to that address. 4. Within a few seconds, the cart shows **Email has been received**. Click **Populate cart from email**. 5. Edit the cart if needed, then check out as normal. Each customer account has its own address, generated once for all future orders. It takes the form `ai+yourstoreid+has@b2b.sparklayer.io` and can't be changed. **Example: a sales agent forwards a customer's email** A customer emails their sales agent asking for 20 of each of 4 SKUs. The agent signs in as that customer with [Sales agent ordering](https://docs.sparklayer.io/help/sales-ordering.md), copies the customer's address and forwards the email. The matching products are added to the cart at a quantity of 20. ## Scan a barcode Barcodes are synced from your store (see [How products are shown](https://docs.sparklayer.io/help/storefront/product-display.md)), so add them to your products in your store admin first. 1. In the cart, click **Scan barcode**. The device needs a built-in camera. 2. Point the camera at a product barcode. If it matches an active product in your store, the product is added to the cart. To remove **Scan barcode** from the cart, turn it off in the SparkLayer Dashboard. ### Use a barcode scanner A handheld barcode scanner works on every plan, and suits warehouse or in-store ordering. It types each barcode into the cart's search box, like a keyboard, and the search box accepts both SKUs and barcodes. 1. Set up the scanner to type into the search box at the top of My Cart. 2. Open My Cart and scan. Each scanned product is added to the cart. The search box needs to be on: see [Choose how customers search](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md#choose-how-customers-search). ## Check quantity rules on added items Added items follow your inventory and product settings, such as [pack sizes and minimum or maximum quantities](https://docs.sparklayer.io/help/storefront/quantity-rules.md). If a quantity breaks a rule, such as ordering in multiples of 12, the cart shows an import notification, for example: "Your items have been added excluding the following: BRACE-GOLD - Example Bracelet - Quantity rounded to the nearest pack size". The customer or sales agent can then edit the cart and check out, or submit a quote if you use the [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md). ## Hide Intelligent Cart To remove the Intelligent Cart (AI) features from the cart, turn on **Hide AI features in the cart** at **Settings > Configurations > Pricing and cart** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Pricing and cart** in the Shopify app. It's the same setting as **Hide AI features in the cart** at **Storefront > Options > Checkout** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Checkout** in the Shopify app. ## Data and privacy SparkLayer never uses uploaded or emailed data for training. It's deleted as soon as the cart is filled, or within 24 hours if it isn't. See [Policies](https://docs.sparklayer.io/help/policies.md). ## FAQs **Is this using artificial intelligence (AI)?** Yes. It uses machine learning and related algorithms to scan, interpret and filter files and emails, only to build B2B orders. **What file types can I upload?** PDF, XLSX, PNG, JPG, CSV, TXT, JSON and DOCX: documents, spreadsheets and images. See [How it works](#how-it-works). **Does uploading a file replace what's already in the cart?** No. The items in the file are added to the cart. **What if some SKUs are not recognised?** They're ignored: only SKUs that match your products are added. You can edit the cart by hand afterwards. **What are typical use cases?** - Uploading an invoice, purchase order (PO) or other document to reorder items - Uploading a spreadsheet (XLSX or CSV) of SKUs and quantities - Taking a photo of a handwritten order, for example at a trade show - Scanning barcodes in a shop or at an event - Forwarding any of these, or a customer's email with a product list, by email **Can customers use this on mobile devices?** Yes. File upload, barcode scanning and email forwarding all work on mobile. **Does it work offline?** No. It needs an internet connection to process files, emails and barcode scans. **How do I give feedback?** Email our team at [product@sparklayer.io](mailto:product@sparklayer.io). --- # Complete draft orders automatically URL: https://docs.sparklayer.io/help/ordering/automation-and-workflows Applies to: Shopify Turn SparkLayer draft orders into completed orders in Shopify automatically, and get email alerts for new draft orders with Shopify Flow. > **Quick summary** > > - On Shopify, B2B orders paid with a manual payment method, such as Pay by Invoice or Pay on Account, arrive as draft orders. > - To have SparkLayer complete them for you, turn on **Auto-complete draft orders** at **Integrations > Platform > Shopify order actions** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform > Shopify order actions** in the Shopify app. > - Shopify doesn't notify you about new draft orders, so use [Shopify Flow](https://docs.sparklayer.io/help/platforms/shopify/customisations/flow.md) to send email alerts. > - These automations are for Shopify only. ## How it works Unless a customer pays by card at checkout (**Card at checkout** in a customer group), SparkLayer creates a [draft order](https://help.shopify.com/en/manual/online-sales-channels/wholesale/channel/orders/process-orders) in Shopify, under **Orders > Drafts**. Drafts let you make changes before taking payment and fulfilling, such as adjusting quantities or applying a special shipping method. If you don't need that step, automate it. What happens to an order paid by invoice or on account: 1. **Customer orders**: They choose a manual payment method, such as Pay by Invoice. 2. **Draft order**: SparkLayer creates a draft order in Shopify. 3. **Auto-complete (optional)**: SparkLayer converts the draft to a completed order. 4. **Fulfil**: You process the order like any other. ## Complete a draft order by hand To approve a draft order and turn it into a completed order, complete it in Shopify: 1. In the Shopify admin, go to **Orders > Drafts** ([open in the Shopify admin](https://admin.shopify.com/draft_orders)) and open the draft order. 2. Make any changes, such as adjusting quantities or shipping. 3. Click **Mark as paid** if the customer has paid. If they pay later, add payment terms such as Net 30 instead, then create the order. The completed order is a normal Shopify order, ready to fulfil. See Shopify's guide to [accepting payment](https://help.shopify.com/en/manual/orders/create-orders#accept-payment). If draft orders are piling up, complete them automatically instead. Draft orders you create yourself in the Shopify admin, rather than through the SparkLayer checkout, don't show in the customer's My Account. To show them, add the `b2b` tag and the order import metafield: see [Show imported or manual orders in My Account](https://docs.sparklayer.io/help/guides/show-imported-orders.md). ## Complete draft orders automatically 1. In SparkLayer, go to **Integrations > Platform** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform** in the Shopify app. 2. In **Shopify order actions**, turn on **Auto-complete draft orders**. 3. Click **Save**. The **Shopify order actions** card has 2 switches: | Setting | What it does | | --- | --- | | **Auto-complete draft orders** | Turns draft orders from manual payments into completed orders automatically. | | **Don't send Shopify's customer invite** | When a sales agent creates a customer in Shopify, Shopify's account invite email isn't sent. See [Order for a customer](https://docs.sparklayer.io/help/sales-ordering/order-for-a-customer.md#add-a-new-customer). | ## Get email alerts for new draft orders Shopify doesn't notify you about new draft orders by default. Send an email to an address of your choice, so someone knows to review the order. [Shopify Flow](https://apps.shopify.com/flow) is a free Shopify app for automating tasks in your store and across apps. For ready-made templates for email notifications and more, see [Shopify Flow for B2B](https://docs.sparklayer.io/help/platforms/shopify/customisations/flow.md). ## FAQs **Can I use these automations on other platforms?** No. They're for Shopify, where orders paid with manual payment methods arrive as draft orders. **Where do I find SparkLayer draft orders in Shopify?** In the Shopify admin, go to **Orders**, then **Drafts**. **Why doesn't a draft order I created in Shopify show in My Account?** My Account only shows orders placed through the SparkLayer checkout. Add the `b2b` tag and set the **B2B - Order Import** metafield to `true` on the order. See [Show imported or manual orders in My Account](https://docs.sparklayer.io/help/guides/show-imported-orders.md). **Can I mark draft orders as paid automatically?** **Auto-complete draft orders** turns them into completed orders automatically. To mark an order as paid once the customer pays, open it in Shopify and click **Mark as paid**. See [Complete a draft order by hand](#complete-a-draft-order-by-hand). SparkLayer can't mark orders as paid automatically: to do that, use our [ready-made Shopify Flows](https://docs.sparklayer.io/help/platforms/shopify/customisations/flow.md#order-workflows). --- # Storefront URL: https://docs.sparklayer.io/help/storefront What the SparkLayer frontend adds to your store for signed-in B2B customers, and how to control its design, product display, stock, quantity rules and language. > **Quick summary** > > - When a B2B customer signs in to your store, they see their own prices, a B2B cart and checkout, and an account area. These are SparkLayer's [frontend interfaces](https://docs.sparklayer.io/help/storefront/interfaces.md) (or widgets), and they sit on top of your existing store theme. > - Only customers signed in as B2B customers see them. Retail visitors see your store as normal. > - You add them to your theme at **Storefront > Widgets** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/frontend/core)), or **SparkLayer Wholesale > Storefront > Widgets** in the Shopify app, and control how they behave without code at **Storefront > Options** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options** in the Shopify app. Design, product display, stock, quantity rules, text and language can all be changed. Some parts are fixed: see [What you can and can't change](https://docs.sparklayer.io/help/storefront/what-you-can-change.md). > - The interfaces and customisation are included on every plan. ## How it works You keep your store, theme and catalogue on your eCommerce platform. SparkLayer adds a script to your store, the [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting), that loads its interfaces. When a B2B customer signs in, the interfaces replace parts of your store with B2B versions, such as product pricing, the cart and the account area. What a signed-in B2B customer sees: 1. **Customer signs in**: SparkLayer recognises them as a B2B customer and looks up their customer group 2. **Interfaces load**: Product pricing, the B2B cart and My Account replace your theme's own versions 3. **Their rules apply**: Prices, quantity rules, stock display and payment methods come from their customer group 4. **Order placed**: The order is created in your eCommerce platform The interfaces cover the whole B2B journey: B2B pricing and ordering on product and collection pages, the B2B cart and checkout (**My Cart**), and the customer's account area (**My Account**). You can also add your own content to them with custom slots. See [Storefront widgets](https://docs.sparklayer.io/help/storefront/interfaces.md) for each interface and where it appears. ## Add SparkLayer to your theme This is your set-up step. **Storefront > Widgets** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/frontend/core)), or **SparkLayer Wholesale > Storefront > Widgets** in the Shopify app offers 3 ways to install the interfaces: | Option | How it works | | --- | --- | | **App embed** (recommended) | SparkLayer's app blocks, turned on in your Shopify theme. No code. Click **Open theme setup**. See [Theme setup](https://docs.sparklayer.io/help/platforms/shopify/theme-setup.md). | | **Ask us to install it** | Our team installs SparkLayer on your theme for you, free. Click **Request installation** and we'll be in touch within a working day. | | **Manually** | Your developer adds the Core Script to your theme's code. Click **Installation guide**, or see your platform's install guide under [Platforms](https://docs.sparklayer.io/help/platforms.md). | The same screen has a **Core script version** card. New installs use the latest version. To pin your store to an earlier version, choose it under **Version for this store** and click **Save version**. **See what's new** lists the changes in each version. The [frontend integration guide](https://docs.sparklayer.io/developers/frontend.md) explains how the Core Script works. ## What you can control Each of these pages starts with what your customers see, then shows you how to set it up. - [Storefront widgets](https://docs.sparklayer.io/help/storefront/interfaces.md): Every interface your B2B customers use, and where each appears - [Storefront options](https://docs.sparklayer.io/help/storefront/storefront-options.md): Change settings, text, checkout fields and My Account sections without code - [Customising the design](https://docs.sparklayer.io/help/storefront/customising-design.md): Match SparkLayer to your brand colours and fonts, and turn on dark mode - [What you can and can't change](https://docs.sparklayer.io/help/storefront/what-you-can-change.md): What's a setting, CSS or a slot, what needs a developer and what's fixed - [How products are shown](https://docs.sparklayer.io/help/storefront/product-display.md): Table view, variant modes, SKUs and barcodes, quick buy and 1-click ordering - [Stock display](https://docs.sparklayer.io/help/storefront/stock-display.md): Live stock levels, pre-orders and back-orders, restock dates and reserved stock - [Quantity rules](https://docs.sparklayer.io/help/storefront/quantity-rules.md): Pack sizes and minimum or maximum quantities - [Product rules per customer group](https://docs.sparklayer.io/help/storefront/product-settings.md): Apply pack sizes, quantity limits and visibility to specific customer groups - [Languages and international](https://docs.sparklayer.io/help/storefront/languages-and-international.md): Change SparkLayer's text, supported languages and locale formats - [B2B Catalogs](https://docs.sparklayer.io/help/storefront/b2b-catalogs.md): Control which products B2B and retail customers see (free, Shopify only) ## Related features These features also shape what B2B customers see on your store. They're covered in other sections of the Help Center. - [How prices are shown](https://docs.sparklayer.io/help/pricing/pricing-display.md): RRP (MSRP) pricing, quantity pricing and unit cost pricing - [Prices for one customer](https://docs.sparklayer.io/help/pricing/customer-pricing.md): Customer discounts and customer price lists - [Payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md): Enable B2B payments, set defaults, rename payment methods and request quotes - [Cart and checkout](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md): Custom checkout fields, file uploads, terms and conditions and checkout text - [Shipping and tax](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md): B2B-only shipping, free shipping rules, tax handling and product tax rules - [Credit and invoicing](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md): Credit limits, account balances, net terms and PDF invoices - [Customise My Account](https://docs.sparklayer.io/help/customers/account-and-addresses.md): Custom account fields, address editing and display, sales statistics - [Automation and workflows](https://docs.sparklayer.io/help/ordering/automation-and-workflows.md): Update order statuses and send notifications - [Order timeline and messages](https://docs.sparklayer.io/help/customers/timeline.md): Track messages and activity across all order types - [Sales agent ordering](https://docs.sparklayer.io/help/sales-ordering.md): Let your team place orders and manage accounts for B2B customers - [Company users](https://docs.sparklayer.io/help/customers/company-users.md): Let a customer's colleagues share one company account - [Set up quotes](https://docs.sparklayer.io/help/ordering/quoting.md): Manage the quote-to-order process for your sales team and customers - [Forms](https://docs.sparklayer.io/help/forms.md): Capture, review and approve wholesale customers from your store --- # Storefront widgets URL: https://docs.sparklayer.io/help/storefront/interfaces See every SparkLayer frontend interface your B2B customers use, from product pricing and the matrix to My Cart and My Account, and where each appears. > **Quick summary** > > - Frontend interfaces (sometimes called widgets) are the B2B parts of your store that SparkLayer adds: product pricing and ordering, the B2B cart and checkout, and the customer's account area. > - They only appear to customers who are signed in as B2B customers. Retail visitors see your store as normal. > - You add them to your theme at **Storefront > Widgets** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/frontend/core)), or **SparkLayer Wholesale > Storefront > Widgets** in the Shopify app, with the app embed, a free installation by our team, or by hand. They're loaded by the SparkLayer [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting): keep it up to date to get the latest features. > - Every plan includes them. On Wix, the product card interface isn't available (see [Wix limitations](https://docs.sparklayer.io/help/platforms/wix/limitations.md)). ## How it works When a B2B customer signs in, SparkLayer replaces your store's own pricing, "add to cart" buttons, cart and account pages with its interfaces. Each interface uses the customer's [customer group](https://docs.sparklayer.io/help/customers/customer-groups.md) to show their prices, quantity rules, stock and payment methods. A B2B customer's path through the interfaces: 1. **Browse**: Product card or product price on collection pages 2. **Choose products**: Product detail or product matrix on product pages 3. **Build the order**: My Cart: search, import, edit 4. **Check out**: Shipping, Review & Pay, Complete 5. **Track and reorder**: My Account: orders, lists, addresses ## The interfaces Each interface page starts with what customers see and do, then shows you how to add and set it up. | Interface | Where it appears | What customers can do | | --- | --- | --- | | [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) | An overlay that opens from your store's cart link, on any page | Build an order, import products, check out and choose a payment method | | [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md) | An overlay that opens from your store's account link, on any page | See order history, reorder, manage shopping lists, addresses and account details | | [Catalog and Quick Order](https://docs.sparklayer.io/help/sales-ordering/catalog.md) | A tab in the widget, beside My Cart and My Account: **Quick Order** for customers, **Catalog** for sales reps | Browse the range in pictures, search and filter, and add products to the cart in a grid, list or matrix | | [Product detail](https://docs.sparklayer.io/help/storefront/interfaces/product-detail.md) | Product pages, in place of the price and "add to cart" area | See their price, stock and pack sizes, and order one or many variants | | [Product matrix](https://docs.sparklayer.io/help/storefront/interfaces/product-matrix.md) | Product pages, usually for products with two or more variant options | Order every colour and size combination from one table | | [Product card](https://docs.sparklayer.io/help/storefront/interfaces/product-card.md) | Collection (category) pages and anywhere else a product card shows | See their price and add products without opening the product page | | [Product price](https://docs.sparklayer.io/help/storefront/interfaces/product-price.md) | Anywhere you add it on product or collection pages | See their B2B price or the RRP | You can also add your own content inside My Cart, My Account and the checkout with [custom slots](https://docs.sparklayer.io/help/storefront/interfaces/custom-slots.md). To change how the interfaces look and behave, see [Customising the design](https://docs.sparklayer.io/help/storefront/customising-design.md) and [How products are shown](https://docs.sparklayer.io/help/storefront/product-display.md). - [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md): The B2B cart and four-step checkout. - [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md): Order history, reordering, shopping lists and addresses. - [Catalog and Quick Order](https://docs.sparklayer.io/help/sales-ordering/catalog.md): Browse the range in pictures and add to the cart. - [Product detail](https://docs.sparklayer.io/help/storefront/interfaces/product-detail.md): B2B pricing and ordering on product pages. - [Product matrix](https://docs.sparklayer.io/help/storefront/interfaces/product-matrix.md): Every variant of a product in one table. - [Product card](https://docs.sparklayer.io/help/storefront/interfaces/product-card.md): B2B pricing and ordering on collection pages. - [Product price](https://docs.sparklayer.io/help/storefront/interfaces/product-price.md): A B2B price or RRP anywhere on your store. - [Custom slots](https://docs.sparklayer.io/help/storefront/interfaces/custom-slots.md): Add your own messages and banners inside My Cart and My Account. --- # My Cart URL: https://docs.sparklayer.io/help/storefront/interfaces/my-cart What B2B customers see and do in the SparkLayer My Cart interface: search, file uploads, shopping lists and discount codes, then a four-step checkout. > **Quick summary** > > - My Cart is SparkLayer's B2B cart and checkout. Signed-in B2B customers see it instead of your store's cart, as a panel over any page. > - Customers build an order by searching, entering SKUs or barcodes, importing a CSV file or loading a [shopping list](https://docs.sparklayer.io/help/ordering/shopping-lists.md). With [Intelligent Cart](https://docs.sparklayer.io/help/ordering/intelligent-cart.md), they can also upload a PDF or photo, forward an email or scan with their camera. They then check out in four steps: **Cart**, **Details**, **Review & Pay** and **Complete**. > - You choose the search type at **Settings > Configurations > Pricing and cart** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Pricing and cart** in the Shopify app, and the payment methods each customer sees in their [customer group](https://docs.sparklayer.io/help/customers/customer-groups.md). > - Some features depend on your plan: Intelligent Cart starts on Starter, file uploads at checkout and B2B discounts on Growth, and the [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md) is on Pro and Enterprise (or an add-on on Starter and Growth). See [Plans and features](https://docs.sparklayer.io/help/plans-and-features.md). [Try the interactive demo](https://www.figma.com/proto/5FPCY5hSGl7mlwjsjMZI2t/SparkLayer-Interfaces?page-id=0%3A1\&type=design\&node-id=86-36708\&viewport=554%2C-398%2C0.33\&t=34VlPwbCqpvQOTsh-8\&scaling=min-zoom\&starting-point-node-id=35%3A7920\&hide-ui=1) to click through My Cart yourself. This page is about what your customers see and do in My Cart. The one setting here is [Choose how customers search](#choose-how-customers-search); checkout settings are in [Cart and checkout](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md). ## How it works My Cart is one of SparkLayer's [frontend interfaces](https://docs.sparklayer.io/help/storefront/interfaces.md). When a B2B customer is signed in, it replaces your store's shopping cart with a layout built for B2B ordering. It opens as a panel over the page the customer is on. Tabs at the top let customers switch to the [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md) without leaving the page. From product page to placed order: 1. **Add products**: From product pages, search, a file, an email or a shopping list 2. **Cart**: Review lines, quantities, discounts and the sub-total 3. **Details**: Shipping address and checkout fields, such as a PO number 4. **Review & Pay**: Shipping method, payment method and totals 5. **Complete**: The order is created in your eCommerce platform In My Cart, customers can: - Add products by name, SKU or barcode, or from a file or email with Intelligent Cart. - Change quantities in steps that follow your pack sizes, remove products and clear the cart. - See how close each line is to its next volume price. - Save the cart as a shopping list, or load a saved one. - Enter discount codes, then check out with the payment methods you've allowed for them, such as Pay on Account or Pay by Invoice. - Pick up a saved cart later, on the same or another device. ### What customers see in My Cart | Part | What it shows or does | | --- | --- | | Tabs | **My Cart** and **My Account**. If Quick Order is on, a **Quick Order** tab follows them: see [Catalog and Quick Order](https://docs.sparklayer.io/help/sales-ordering/catalog.md). | | Location chip | For [company locations](https://docs.sparklayer.io/help/customers/company-locations.md): the location the customer is ordering for, beside their avatar. | | Avatar menu | The customer's name and company, then **Expand** and **Log out**. **Expand** widens the panel to give more room to work on the order, and **Minimise** shrinks it again. | | Step strip | **Cart**, **Details**, **Review & Pay** and **Complete**, with the current step highlighted. | | Search box | Adds products by name, SKU or barcode, depending on the [search type](#choose-how-customers-search) you choose. The placeholder reads "Add products by name, SKU, or barcode". A handheld barcode scanner can type into it. | | **Actions** menu | Shortcuts for building and managing the order. See [The Actions menu](#the-actions-menu). | | Product lines | One row per product. See [Product lines](#product-lines). | | **Discounts & codes** | Opens a box to enter a coupon code. Applied discounts show as a green label, such as **1 Discount Applied**. See [Discounts and promotions](#discounts-and-promotions). | | **Sub-total** | The total before tax and shipping, with the number of lines and items. If discounts apply, the price before discounts is shown crossed out. | | **Checkout** | Starts the checkout. With the [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md), **Request Quote** sits beside it for customers who can request quotes (sales agents see **Submit Quote**). See [Quotes](#quotes). | ### The Actions menu | Item | What it does | | --- | --- | | **Upload a file** | Builds a cart from a CSV file (every plan) or, with Intelligent Cart, a spreadsheet, PDF or photo of an order sheet. See [Add products from a file, email or barcode](#add-products-from-a-file-or-email-intelligent-cart). | | **Forward an email** (Intelligent Cart) | Builds a cart from an order email the customer forwards to their own address. | | **Scan barcode** (Intelligent Cart) | Adds products by scanning their barcodes with the device's camera. | | **Clear cart** | Removes every item from the cart, after the customer confirms in a **Clear cart?** box. This can't be undone. | | **Save shopping list** | Saves the cart as a [shopping list](#save-and-load-shopping-lists). | | **Shopping lists** | The customer's saved lists: click one to load it. **View all** opens the lists in My Account. | ### Product lines | Part | What it shows or does | | --- | --- | | Image and name | The product photo and name, linking to the product page. | | SKU and options | The SKU and the variant, for example `SHOE-RED-02 · Red · US 2`. | | Stock | A coloured dot and the stock status, for example **In stock** with **100+**, or **Pre-order** with its due date (for example **14 Jun 2025**). See [Stock display](https://docs.sparklayer.io/help/storefront/stock-display.md). | | Pack rule | The product's [quantity rules](https://docs.sparklayer.io/help/storefront/quantity-rules.md) in words, for example **Packs of 6** or **Min 12 · Packs of 24**. Hover for the full rule, such as "This product comes in pack sizes of 24, minimum 12". | | **Customizations active** | Shown when the line has [product customisations](https://docs.sparklayer.io/help/storefront/product-display.md#product-customisations), such as custom text. Hover or tap to see them, for example **Custom Text: ABC 123**. | | Quantity stepper | **−** and **+** buttons around the quantity. Each click moves one pack, and a typed quantity follows your pack and minimum rules. | | Line price | The line total, the price per unit, and the RRP crossed out if you show it. | | **Discounts** | For products with quantity pricing. It says how far the line is from its next volume price, such as **3 more → $9.00/unit** or **2 more packs → $4.75/unit**. Once the line reaches the best price, it reads **Discounts**. Hover to see every quantity break. | | Delete | The bin icon removes the line. | ## How customers open My Cart Customers can open My Cart from any page in 3 ways: | Way in | How it works | | --- | --- | | Cart link | Your store's cart (shopping bag) link opens My Cart, as long as it points to `/cart`. | | Notification | **View order & checkout** in the notification that appears after they add a product. | | `#spark-cart` link | Any URL ending in `#spark-cart`, for example `https://www.yourstore.com/#spark-cart`. You can use this in your own links and buttons. | When a customer adds a product, a notification (sometimes called a toast) appears in the top right of the screen. It says **Added to order**, with a **View order & checkout** link. To change its style and animation, see [Customising the design](https://docs.sparklayer.io/help/storefront/customising-design.md). ## Choose how customers search The search box at the top of My Cart lets customers add products without browsing your store. You choose one of 2 types: | Type | What it does | Best for | | --- | --- | --- | | **Search** | Searches by product name, product description, SKU, variant name, variant option name and barcode, and shows matching products with a quantity box for each. It handles misspellings and partial matches (a search for `coffe`, `cofee` or `cofe` still finds coffee) and lists the most relevant results first. It also adds exact SKU or barcode matches, like SKU / Barcode Lookup. | Most stores. It gives customers the most features. | | **SKU / Barcode Lookup** | Adds a product straight to the cart when the customer types an exact SKU or barcode. If there's no exact match, nothing is added. Customers can then edit the quantity. | Customers who only ever order by exact SKU or barcode. | Search results show the same information as the cart: quantity pricing, pack size rules and stock status. Both types apply your rules as they add a product. For example, [pack sizes](https://docs.sparklayer.io/help/storefront/quantity-rules.md) and minimum or maximum quantities are applied straight away. Barcodes are synced from your store; see [How products are shown](https://docs.sparklayer.io/help/storefront/product-display.md). The search box needs version `3.8` or later of the Core Script, the SparkLayer code in your theme. See [upgrading the Core Script](https://docs.sparklayer.io/developers/frontend.md). To choose the search type: 1. Go to **Settings > Configurations > Pricing and cart** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Pricing and cart** in the Shopify app. 2. Under **Cart search type**, choose the type you want, or choose **Hide search** to remove the search box. 3. Click **Save**. ### Change the search box text You can change the placeholder text in the search box. For example, if your products have barcodes, you might tell customers they can search by SKU or barcode. To do it without code, add a translation override for `cart.quick-order.search-placeholder` 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. **For developers: set it in the Core Script** Add this to your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting): ```javascript title="Core Script" translations: { en: { "cart.quick-order.search-placeholder": "Add products by SKU or barcode", } }, ``` For more on changing text, see [Languages and international](https://docs.sparklayer.io/help/storefront/languages-and-international.md). ## Add products from a file, email or barcode The **Actions** menu (or the shortcuts in an empty cart) gives customers quicker ways to fill the cart than searching: | Customer does | What happens | Plan | | --- | --- | --- | | **Upload a file** | Drops in a spreadsheet, PDF or photo of an order sheet. SparkLayer reads the SKUs, barcodes and quantities and adds the matching products to the cart. | Starter and above ([Intelligent Cart](https://docs.sparklayer.io/help/ordering/intelligent-cart.md#build-a-cart-from-a-file)) | | **Upload a file** with a CSV file, or **Paste rows** | Adds the products from a file with `sku` (or `barcode`) and `qty` columns. | Every plan ([CSV import](https://docs.sparklayer.io/help/ordering/intelligent-cart.md#import-products-from-a-csv-file)) | | **Forward an email** | Copies their own forwarding address, then forwards an order email to it. | Starter and above ([Intelligent Cart](https://docs.sparklayer.io/help/ordering/intelligent-cart.md#build-a-cart-from-an-email)) | | **Scan barcode** | Scans product barcodes with the device's camera. | Starter and above ([Intelligent Cart](https://docs.sparklayer.io/help/ordering/intelligent-cart.md#scan-a-barcode)) | | Scans with a handheld barcode scanner | The scanner types into the search box, and each product is added. | Every plan ([Use a barcode scanner](https://docs.sparklayer.io/help/ordering/intelligent-cart.md#use-a-barcode-scanner)) | The customer can then edit the cart before they check out. Uploaded files and emails are deleted after 24 hours and never used for training. For file types, column headings and how to rename them, see [Intelligent Cart (AI)](https://docs.sparklayer.io/help/ordering/intelligent-cart.md). ## Save and load shopping lists Shopping lists let customers save the contents of a cart, so they can reorder the products they buy regularly. See [Shopping lists](https://docs.sparklayer.io/help/ordering/shopping-lists.md). 1. To save the cart, the customer opens **Actions** and chooses **Save shopping list**. 2. They enter a name for the list and click **Save**. 3. To load a list later, they open **Actions** and click the list under **Shopping lists**. **More detail** Customers can also save products to a list from any product page. They manage their lists (preview, add to and edit them) in the [My Account](https://docs.sparklayer.io/help/storefront/interfaces/my-account.md), which **View all** in the menu opens. Customers and sales agents can export any list as a CSV file to share it across a team. ## Discounts and promotions Customers enter a coupon code with **Discounts & codes**, under the cart lines or in the **Order Summary** on **Review & Pay**: 1. Click **Discounts & codes**. 2. Enter the code in **Enter a discount code** and click **Apply**. An order can have up to 3 coupon codes. Discounts can also apply automatically. Applied discounts show as a green label, such as **1 Discount Applied**, with a line naming the discounts the order qualifies for, and the sub-total shows the price before discounts crossed out. B2B discounts need the Growth plan or above. To set them up, see [Discounts](https://docs.sparklayer.io/help/pricing/discounts.md). ## Check out When the cart is ready, the customer clicks **Checkout** and works through the 4 steps in the strip at the top of My Cart: **Cart**, **Details** (address and [checkout fields](https://docs.sparklayer.io/help/ordering/checkout-fields.md), such as a PO number or **Upload Files**), **Review & Pay** (shipping method, payment method and totals) and **Complete**. From **Details** onwards, a bar at the bottom of the panel shows the sub-total, a **Back** button and the button for the next step. Customers can also click a finished step in the strip to go back to it. Each step, and what you can change on it, is in [The checkout, step by step](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md#the-checkout-step-by-step). If the order breaks your [order limits](https://docs.sparklayer.io/help/storefront/quantity-rules.md#order-limit-rules), My Cart shows a message and the customer can't check out until they change it. ### Complete step The customer sees **Thank you for your order!**, and **View order** opens the order in My Account. The order is sent to your eCommerce platform, and to your backend system if you've connected the [SparkLayer API](https://docs.sparklayer.io/developers/api.md). To change the text, see [Change the order complete message](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md#change-the-order-complete-message); to add your own content, use [custom slots](https://docs.sparklayer.io/help/storefront/interfaces/custom-slots.md). ## Payment methods On **Review & Pay**, customers choose from the payment methods their [customer group](https://docs.sparklayer.io/help/customers/customer-groups.md) allows. **Pay Online by Card** takes the customer to your store's checkout to pay straight away. **Pay on Account** and **Pay by Invoice** need no payment details at checkout, and you collect payment later. For what each method does, their names and order, and how each order arrives in your store, see [Payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md) and [How orders arrive in your store](https://docs.sparklayer.io/help/ordering/payment-methods.md#how-orders-arrive). ## Quotes With the [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md), customers whose group can request quotes see **Request Quote** next to **Checkout**. They send the cart to your team as a quote instead of placing an order, and can then message your sales team about it until they're ready to complete it. See [Submit a quote instead](https://docs.sparklayer.io/help/ordering/cart-and-checkout.md#submit-a-quote-instead) and [Work on a quote](https://docs.sparklayer.io/help/ordering/work-on-a-quote.md). ## Saved carts The cart is saved automatically for up to 90 days. If the customer signs out and back in, their products are still there. This also works across devices: a customer can start an order on a desktop computer and finish it the next day on a phone. ## Cart locking Cart locking stops 2 people changing the same cart at once. This matters most with [sales agent ordering](https://docs.sparklayer.io/help/sales-ordering/order-for-a-customer.md), where a sales agent may be building an order for a customer. If someone opens a cart that another person is working on, My Cart shows a message at the top, for example **This cart is being edited by a sales agent**. The message includes the time the other person last accessed the cart. They can wait, or click **Take control** to make their own changes and complete the order. When another sales agent has the same customer open, the cart is locked to that agent, and changes show the warning "You cannot update the cart because it is being processed by a sales agent". Shared sales agent logins make this more likely, so give each person their own. See [Cart locking for sales agents](https://docs.sparklayer.io/help/sales-ordering/order-for-a-customer.md#cart-locking). ## Tax Prices in My Cart are shown excluding tax, unless you show [tax-inclusive prices](https://docs.sparklayer.io/help/pricing/pricing-display.md#show-tax-inclusive-prices), and tax is added on **Review & Pay**. See [Tax and shipping](https://docs.sparklayer.io/help/ordering/tax-and-shipping.md). ## Add your own content With [custom slots](https://docs.sparklayer.io/help/storefront/interfaces/custom-slots.md), you can add your own content, such as a message or banner, in set places in My Cart. These include above the products, on each product line, on the **Details** and **Review & Pay** steps, and on the order complete screen. For other options, see [Storefront](https://docs.sparklayer.io/help/storefront.md). ## FAQs **How long does SparkLayer keep a customer's cart?** Up to 90 days. The cart is saved automatically, so it's still there after the customer signs out, and on any device they sign in from. **Does uploading a file replace what's already in the cart?** No. The products in the file are added to the cart. See [Intelligent Cart (AI)](https://docs.sparklayer.io/help/ordering/intelligent-cart.md#build-a-cart-from-a-file). **Why does the quantity jump when a customer clicks + or −?** The product is sold in packs. Each click moves one pack, and the line's pack rule (for example **Packs of 6**) says so. See [Quantity rules](https://docs.sparklayer.io/help/storefront/quantity-rules.md). **Why are my B2B orders arriving as draft orders in Shopify?** **Shopify only:** By default, every payment method except **Pay Online by Card** creates a draft order in Shopify. See [How orders arrive in your store](https://docs.sparklayer.io/help/ordering/payment-methods.md#how-orders-arrive). **Can I link straight to the cart?** Yes. Add `#spark-cart` to the end of any URL on your store, for example `https://www.yourstore.com/#spark-cart`, and My Cart opens for signed-in B2B customers. --- # My Account URL: https://docs.sparklayer.io/help/storefront/interfaces/my-account Learn what B2B customers can do in the SparkLayer My Account interface: track and export orders, reorder, manage lists and addresses, and hide sections. > **Quick summary** > > - My Account is SparkLayer's B2B account area. Signed-in B2B customers see it instead of your store's account pages, as a panel over any page. > - Customers can track and export their orders, reorder, manage shopping lists and addresses, see their account and credit details, run purchase reports and manage [company users](https://docs.sparklayer.io/help/customers/company-users.md). > - You can reorder its sections without code at **Storefront > Options > My Account** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > My Account** in the Shopify app. Order status names and extra account fields are set up in [Customise My Account](https://docs.sparklayer.io/help/customers/account-and-addresses.md). > - It's included on every plan. Some features it shows depend on your plan, such as [invoices](https://docs.sparklayer.io/help/ordering/invoices.md) and order approval (Growth and above). See [Plans and features](https://docs.sparklayer.io/help/plans-and-features.md).[Try the interactive demo](https://www.figma.com/proto/5FPCY5hSGl7mlwjsjMZI2t/SparkLayer-Interfaces?page-id=0%3A1\&type=design\&node-id=86-36708\&viewport=554%2C-398%2C0.33\&t=34VlPwbCqpvQOTsh-8\&scaling=min-zoom\&starting-point-node-id=35%3A7920\&hide-ui=1) to click through My Account yourself.This page starts with what your customers see and do in My Account. The settings you control start at [Hide the Financials section](#hide-the-financials-section), [Set up quick links to orders](#set-up-quick-links-to-orders) and [Reorder or hide sections](#reorder-or-hide-sections).## How it worksMy Account is one of SparkLayer's [frontend interfaces](https://docs.sparklayer.io/help/storefront/interfaces.md). When SparkLayer is installed, it replaces your store's own account area for B2B customers. It opens as a panel over the page the customer is on, with a greeting that uses the customer's first name, such as "Welcome back". **My Cart** and **My Account** tabs at the top let customers switch to the [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) without leaving the page.In My Account, customers can:* See every order they've placed, with its payment status and status, and filter, search and export them. * Reorder a whole order, a single product or everything bought in a time period. * Load, edit and delete their shopping lists. * Add, edit and delete addresses, and choose their default addresses. * See their account details and, if you use them, their credit limit, balance and payment terms. * Message your team about orders and quotes, and manage company users if you've turned that on.How customers reorder from My Account: 1. **Recent Activity**: Open a past order, report or shopping list 2. **Actions**: Add the items to the current cart, or start a new cart with them 3. **My Cart**: Adjust quantities and check out### SectionsMy Account is made up of these sections, shown in this order by default. You can [reorder or hide them](#reorder-or-hide-sections).| Section | What customers see and do | Name in code (for developers) | | --- | --- | --- | | Custom content | Your own content at the top of the page, if you've added a [custom slot](https://docs.sparklayer.io/help/storefront/interfaces/custom-slots.md) | `spark-slot-my-account` | | **Recent Activity** | Their latest orders and quotes, with a **Status** filter and **View all** for the full list | `recent-activity` | | **Favourites** | The products they've saved with the heart icon, if [favourites](https://docs.sparklayer.io/help/ordering/favourites.md) are on, with **View all** | – | | **Shopping Lists** | Their saved shopping lists, each with an **Actions** menu to load or delete it | `shopping-lists` | | **Financials** | Their **Payment terms**, **Unpaid Balance** and **Credit Limit**, if you use credit terms | `financials` | | **My Details** | Their email address and name, plus any custom fields | `my-details` | | **Reports** | Their purchase history by time period | `reports` | | **Address Book** | Their saved addresses, with **Add new address** | `address-book` | | **Company Users** | The people who share the account, with **Invite new user**, if [company users](https://docs.sparklayer.io/help/customers/company-users.md) is on | `company-users` |With [company locations](https://docs.sparklayer.io/help/customers/company-locations.md), several sections follow the location the customer is ordering for: see [Company locations in My Account](#company-locations-in-my-account).## How customers open My AccountCustomers can open My Account from any page in 2 ways:| Way in | How it works | | --- | --- | | Account link | Your store's account link, usually in the header, opens My Account, as long as it points to `/account`. | | `#spark-account` link | Any URL ending in `#spark-account`, for example `https://www.yourstore.com/#spark-account`. |When a signed-in customer goes to your store's own account pages (for example `/account`), they're redirected to My Account. To send B2B customers to a different URL after they sign in, your developer can update the Core Script. See [Customise My Account](https://docs.sparklayer.io/help/customers/account-and-addresses.md).## Order historyEvery order a customer places through SparkLayer is saved to their order history. The **Recent Activity** section lists them, newest first:| Column | What it shows | | --- | --- | | **Reference** | The order or quote reference. Click it to open the order. | | **Submitted on** | The date the order was placed. | | **Payment** | The payment status, such as **Pending** or **Paid**. | | **Status** | The order status, such as **Processing** or **Shipped**. See [Order statuses](#order-statuses). | | **Amount** | The order total. |The **Status** menu at the top of the section filters the list, for example to **All**, **Processing** or **Shipped**. Each option shows a count. Other filters, such as **Awaiting merchant** or **Requires approval** (for [company users](https://docs.sparklayer.io/help/customers/company-users.md)), appear when the customer has orders in them. Customers click an order's reference to see its full details, however it was paid for. To rename the order statuses customers see, see [Customise My Account](https://docs.sparklayer.io/help/customers/account-and-addresses.md).### Search and filter ordersTo see all their orders, customers click **View all** in **Recent Activity**. This opens the Activity view, where they can filter and search:| Filter | Options | | --- | --- | | Date | Choose a year or a time period (within a 365-day period), or **Custom Date Range** with a **Start Date** and **End Date**. | | Search | Search by order ID, purchase order (PO) number, or address (first line, second line, city or zip code). |### Order detailsBy default, My Account shows completed orders, and purchases that exist only in SparkLayer, such as quotes and orders waiting for approval. Draft orders in your store aren't listed.An order opens on its own page, headed with its reference (for example **My Account › #1001**), with 3 tabs and an **Actions** menu for [reordering](#reorder).| Tab | What it shows | | --- | --- | | **Summary** | The **Order Summary**: **Payment Status**, **Status**, **Payment Method**, **Shipping Method**, **Submitted on**, any **Additional Information** (such as a preferred shipping date) and the **Shipping Address**. **View & download invoice** opens the invoice, where there is one. | | **Order Lines** | Every product ordered, grouped by status, with its quantity, SKU and options, line total, quantity × unit price and RRP. Each line has **Order again**. Under the lines, the **Order Total**: **Sub-total**, **Shipping**, **Tax**, **Total**, **Paid** and the **Balance**, with its due date and terms for orders paid on account. | | **Timeline** | Messages and events for the order. See [Timeline and messages](#timeline-and-messages). |**More detail** - **Status** is based on the status sent from your store admin or backend system, for example Processing, Shipped or Cancelled. - **Payment Status** is, for example, Pending or Paid, and **Payment Method** shows how the order was paid for, for example On Account. See [Payment methods](https://docs.sparklayer.io/help/ordering/payment-methods.md). - On Shopify, you can [customise the order number](https://docs.sparklayer.io/help/platforms/shopify/metafields.md). - Where you've supplied a tracking number, it shows on the order too. See [Customise My Account](https://docs.sparklayer.io/help/customers/account-and-addresses.md).### Order statusesAn order's status sums up the status of all the packages in it. For example, if half the items have shipped and half are still processing, the order shows as **Part-shipped**. Customers can open the order to see the status of each package.| Order status | Shown when the packages are | | --- | --- | | **Processing** | `Processing`, or `Processing` and `Cancelled` | | **Shipped** | `Shipped` | | **Cancelled** | `Cancelled` | | **Returned** | `Returned` | | **Part-returned** | `Returned` and `Processing` | | **Part-shipped** | `Shipped` and `Processing` | | **Varied** | Any other mix |SparkLayer also has its own statuses, which don't match a status in your eCommerce platform:| Status | What it means | | --- | --- | | **Awaiting Approval** | A [limited user](https://docs.sparklayer.io/help/glossary.md#limited-user) has submitted an order, and the main company user needs to approve it. | | **Awaiting merchant** | The customer has placed the order, but it isn't a completed order in your store yet: usually a Pay on Account or Pay by Invoice order that's still a draft order for you to complete. It has a purchase ID, such as `P#1264`. You see it as **Awaiting merchant** in **Orders** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/activity)), or **SparkLayer Wholesale > Orders** in the Shopify app too. See [Awaiting merchant](https://docs.sparklayer.io/help/glossary.md#awaiting-merchant). | | **Archived** | The order has been archived. For example, if a user cancels an order before it's approved, it's archived. |Orders paid on account or by invoice arrive in your store as draft orders, so they show as **Awaiting merchant** until you complete them, and their **Payment** shows **Pending** until they're paid. On Shopify, **Auto-complete draft orders** at **Integrations > Platform > Shopify order actions** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/integrations/platform)), or **SparkLayer Wholesale > Integrations > Platform > Shopify order actions** in the Shopify app turns them into completed orders automatically.Purchases that exist only in SparkLayer, such as orders waiting for approval and quotes, have an internal ID. By default it starts with `P#`, for example `P#1264`. You can change this prefix, and add a suffix, with **Purchase ID prefix** and **Purchase ID postfix** at **Settings > Configurations > Store** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/settings/general)), or **SparkLayer Wholesale > Settings > Configurations > Store** in the Shopify app.### Offline and archived ordersYou can show orders placed outside SparkLayer, for example over the phone, so customers see their whole order history in one place. Send them with the [SparkLayer API](https://docs.sparklayer.io/developers/api.md). On Shopify, you can also show orders you created in the Shopify admin or imported, with the `b2b` tag and an order metafield: see [Show imported or manual orders in My Account](https://docs.sparklayer.io/help/guides/show-imported-orders.md).### InvoicesDepending on your setup, customers can view and download invoices from their order history, with **View & download invoice** on the order's **Summary**. See [Credit limits and net terms](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md).### Export ordersCustomers can download their orders as a CSV file, for example to reconcile them with their own systems or analyse what they buy. The customer:1) Clicks **View all** in **Recent Activity**. 2) Searches or filters the list to export only some orders. The export includes only the orders shown. For example, filtering by **Quote** exports only quotes. 3) Opens the **Download** menu in the top right and chooses an option:| Option | What the file contains | | --- | --- | | **Activity** | One row per order, with order details such as the order number, date, status and total. Best for an overview. | | **Activity with line items** | One row per product line, with product details, quantities, prices, shipping and tracking. Best for analysing products across orders. |If you use custom fields or line item attributes, they're added as extra columns in the **Activity with line items** export. Custom field columns start with `custom_`.## ReorderCustomers can repeat a past order, or order individual products again.| To reorder | How | | --- | --- | | A whole order | On the order's page, open **Actions** in the top right and choose an option (see below). | | One product | Click **Order again** next to the product in the order's **Order Lines**. | | Everything bought in a time period | Use [Reports](#reports). |The **Actions** menu has 2 options:| Option | What it does | | --- | --- | | **Add items to existing cart** | **Adds** the products from the order to what's already in the cart. | | **Create new cart** | **Replaces** what's in the cart with the products from the order. |Products that aren't available (for example, out of stock) aren't added, unless you've allowed customers to order unavailable products.## Shopping listsShopping lists let customers reorder products they've saved, such as a range they always buy or a list of favourites. Every list saved from the [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md) appears in the **Shopping Lists** section. See [Shopping lists](https://docs.sparklayer.io/help/ordering/shopping-lists.md).| Item | Details | | --- | --- | | **Name** | The name the customer gave the list when saving it in My Cart. | | **Last Updated** | When the list was last changed (usually when it was created). | | **Actions** | **Add items to existing cart** adds the list's products to what's already in the cart. **Create new cart** empties the cart and adds the list's products. **Delete** deletes the list. |## ReportsThe **Reports** section shows customers what they've bought. They can filter by time period and reorder straight from a report.| Report | Details | | --- | --- | | **Purchase history by time period** | Every product the customer has bought over a period, such as by quarter, month or week. They can reorder a whole range of products in a few clicks and go straight to checkout. |Reports have these limits:| Limit | Details | | --- | --- | | Time periods | Only the **4 most recent periods** of the selected time range are shown. | | Products | Up to 100 products are shown for a time period. |## Address bookCustomers see their saved addresses in My Account, and can choose any of them at checkout in the [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md). The addresses come from your store admin, or from your backend system through the [SparkLayer API](https://docs.sparklayer.io/developers/api.md).| Item | Details | | --- | --- | | **Default shipping address** | The address used for shipping by default, marked with a label. | | **Default billing address** | The address used for billing by default, marked with a label. | | Other addresses | Every other saved address. |Customers can manage their own address book:| Task | How | | --- | --- | | Add an address | Click **Add new address**. | | Edit an address | Open **Actions** next to it and choose **Edit address**. | | Delete an address | Open **Actions** next to it and choose **Delete address**. A default address can't be deleted. |Address management is on by default. To turn it off, or to stop customers changing their default billing address, see [Allow address editing](https://docs.sparklayer.io/help/customers/account-and-addresses.md#allow-address-editing).### Address autocompleteWhen customers add or edit an address, they can start typing and choose a suggested address to fill in the rest of the form. This saves typing and reduces mistakes, so orders reach the right place first time.Suggestions favour your store's country, but matches further afield still appear, so international customers can find their address too.### Local address formatsThe address form adapts to the country the customer chooses:| What changes | Example | | --- | --- | | **Field order and labels** | The first name and last name fields swap places where that's the local convention. | | **Local terms** | Customers in Japan see "Prefecture" instead of "Region". |These labels are translated into every language SparkLayer supports.## Account detailsThe **My Details** section shows the customer's **Email address** and **Name**.If you use [credit terms](https://docs.sparklayer.io/help/ordering/credit-net-terms-and-invoicing.md), the **Financials** section shows their **Payment terms**, **Unpaid Balance** and **Credit Limit**. A note tells them that payments may take some time to update. This information comes from the customer's record in your store admin, or from your backend system through the [SparkLayer API](https://docs.sparklayer.io/developers/api.md).You can also add your own fields to **My Details**, such as a website address or sales agent contact details. See [Customise My Account](https://docs.sparklayer.io/help/customers/account-and-addresses.md).### Hide the Financials sectionTo stop customers seeing **Financials** while you still use credit terms, hide it. You don't need code:1) Go to **Storefront > Options** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options** in the Shopify app and open **My Account**. 2) Turn on **Hide financial figures**. This hides financial figures everywhere, and the Financials section too. 3) Click **Save and publish**.**Core Script code for your developer** Your developer can do the same in the `display` section of your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting) instead: ```javascript title="Core Script" display: { hideFinancials: true, }, ```## Company users[Company users](https://docs.sparklayer.io/help/customers/company-users.md) lets a business share one account across a team, with permissions for what each person can do. It's sometimes called company roles or sub-accounts.When it's on, the **Company Users** section appears in My Account, listing each person's **Name**, **Email** and **Role**. The main user can add people with **Invite new user**, and remove them with **Actions** > **Delete user**.## Company locations in My Account**Shopify only:** On Shopify, a B2B company can have several [locations](https://docs.sparklayer.io/help/customers/company-locations.md), such as stores or branches. The customer orders for one location at a time, and My Account follows it: | Section | What changes | | --- | --- | | **Recent Activity** | Shows the location's orders (and, for a region, its stores' orders), each naming the location it was placed for. A location with no orders says so, with **Change location**. | | **Financials** | The location's unpaid balance, with the company's credit limit, which every location shares, and how much of it is left. | | **My Details** | The signed-in person's own name and email address, not the company's. | | **Address Book** | The location's address, as the default shipping and billing address, with **Change location**. | | **Company Users** | Each person's locations, and **(you)** beside the signed-in person. |## Timeline and messagesThe [Timeline](https://docs.sparklayer.io/help/customers/timeline.md) shows the messages, notes, events and related email notifications for an order or [quote](https://docs.sparklayer.io/help/ordering/quoting.md). Customers see it on the order's **Timeline** tab. When your team notifies a customer, they get an email and sign in to their account to reply.## Set up quick links to ordersSparkLayer can take a customer or sales agent straight to an order or quote when they click a link. This helps in these cases:| Scenario | Example | | --- | --- | | [Company users](https://docs.sparklayer.io/help/customers/company-users.md) | A main user opens an order to approve from an email about a limited user's order. | | [Quoting Engine](https://docs.sparklayer.io/help/ordering/quoting.md) | A customer or sales agent opens a quote from an email. | | [Orders](https://docs.sparklayer.io/help/dashboard/orders.md) | You open an order from **Orders** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/activity)), or **SparkLayer Wholesale > Orders** in the Shopify app in SparkLayer. |To turn this on, add a one-line script to your store's code. It must load for every visitor, signed in or not.If a customer or sales agent is already signed in, they're taken to the order whether or not the script is added.**Shopify:** 1. In your Shopify admin, go to **Online Store > Themes** ([open in the Shopify admin](https://admin.shopify.com/themes)). 2. Edit the code of your live theme and open `theme.liquid`. 3. Add this line just before the closing `` tag, then save: ```html title="theme.liquid" ``` **Other platforms:** Add this line to your website's code, just before the closing `` tag: ```html ```## Reorder or hide sectionsYou can change the order of the sections in My Account, for example to move **Address Book** higher up. You don't need code.1) Go to **Storefront > Options** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options** in the Shopify app and open **My Account**. 2) Under **Account sections, in order**, drag the sections into the order you want. Each one shows whether it's **Visible**. 3) Click **Save and publish**.See [Storefront options](https://docs.sparklayer.io/help/storefront/storefront-options.md#my-account-sections).### For developers: reorder or hide sections in the Core ScriptYour developer can set the order and hidden sections in the `display` section of your [Core Script](https://docs.sparklayer.io/help/storefront/storefront-options.md#add-a-core-script-setting) instead. They use the names in code from the [Sections](#sections) table: list the sections in `order`, and add any to hide to `hide`.**Core Script code for your developer** To set the order, list the sections in the order you want: ```javascript title="Core Script" display: { sectionConfiguration: { 'my-account': { order: [ 'recent-activity', 'shopping-lists', 'financials', 'my-details', 'reports', 'address-book', 'company-users', ], hide: [], }, }, }, ``` To hide sections, add them to `hide`. This example hides the reports, address book and company users sections: ```javascript title="Core Script" display: { sectionConfiguration: { 'my-account': { order: [ 'recent-activity', 'shopping-lists', 'my-details', 'reports', 'address-book', 'company-users', ], hide: [ 'reports', 'address-book', 'company-users', ], }, }, }, ```### Hide sections for some customersYou can show different sections to different customers, for example to hide **Recent Activity** from limited users. This needs a developer: they build the `order` or `hide` list in your platform's template code.**Shopify:** Use Liquid to hide sections based on the customer's [company user](https://docs.sparklayer.io/help/customers/company-users.md) role. This example hides **Recent Activity** from limited users: ```javascript title="Core Script" display: { sectionConfiguration: { 'my-account': { hide: [ {% if customer.metafields.sparklayer.role == 'limited-customer' %} 'recent-activity', {% endif %} ], }, }, }, ``` The same approach works with customer tags: ```javascript title="Core Script" display: { sectionConfiguration: { 'my-account': { hide: [ {% if customer.tags contains 'b2b-vip' %} 'recent-activity', // Hide recent activity if the customer is b2b-vip {% endif %} ], }, }, }, ``` **Other platforms:** Use your platform's own template logic to output the `hide` (or `order`) list for each customer, in the same format as the examples above.## Add your own contentWith [custom slots](https://docs.sparklayer.io/help/storefront/interfaces/custom-slots.md), you can add your own content at the top of My Account. For example, a welcome message or a promotion customers see as soon as they sign in.To add it, go to **Storefront > Options > Custom slots** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Custom slots** in the Shopify app and add the `spark-slot-my-account` slot. It then appears as a **Custom Slot** section in the account sections list, where you can drag it into place. If you set the section order in the Core Script, your developer adds `spark-slot-my-account` to the `order` list above to choose where it sits.For other options, see [Storefront](https://docs.sparklayer.io/help/storefront.md).## FAQs**Why can't a customer see an order in My Account?** By default, My Account lists completed orders and purchases that exist only in SparkLayer, such as quotes. Draft orders in your store aren't shown. Orders placed outside SparkLayer, such as phone orders, only appear if you send them with the [SparkLayer API](https://docs.sparklayer.io/developers/api.md). On Shopify, orders you created in the admin or imported show once they have the `b2b` tag and the order import metafield: see [Show imported or manual orders in My Account](https://docs.sparklayer.io/help/guides/show-imported-orders.md). **Why weren't all the products added when a customer reordered?** Products that aren't available, for example because they're out of stock, aren't added unless you've allowed customers to order unavailable products. **Can I link straight to My Account?** Yes. Add `#spark-account` to the end of any URL on your store, for example `https://www.yourstore.com/#spark-account`. --- # Product detail URL: https://docs.sparklayer.io/help/storefront/interfaces/product-detail Add the SparkLayer product detail interface to product pages so B2B customers see their price, stock and pack sizes and order one or many variants. > **Quick summary** > > - The product detail interface replaces the price and "add to cart" area on your product pages for signed-in B2B customers. Retail visitors see your page as normal. > - It shows the customer's own price (including quantity pricing), the RRP, SKU, stock and quantity rules, and lists every variant in a table so customers can order several at once. > - On Shopify it's added automatically on supported themes, or as the **SparkLayer - Product Page** app block. On other platforms, you add one line of code to your product page template. On Wix, it's added to product pages automatically. > - It's included on every plan. Our team can install it for you free of charge. ## How it works The product detail interface is one of SparkLayer's [frontend interfaces](https://docs.sparklayer.io/help/storefront/interfaces.md). When a signed-in B2B customer opens a product page, it takes the place of your theme's price and "add to cart" area. It adapts to the product. A simple product gets a single quantity box, and a product with variants (for example colour and size) gets a table of variants. With the product detail interface, customers can: - See their own price, any quantity pricing, and the RRP if you show it. - See the SKU (product code), barcode and stock availability, including pre-orders. - Choose a quantity that follows your [quantity rules](https://docs.sparklayer.io/help/storefront/quantity-rules.md), such as pack sizes. - Order several variants at once and add them to their cart with one click. To see what customers see, explore the product interfaces in [our interactive demo](https://www.figma.com/proto/5FPCY5hSGl7mlwjsjMZI2t/SparkLayer-Interfaces?page-id=0%3A1\&type=design\&node-id=86-36708\&viewport=554%2C-398%2C0.33\&t=34VlPwbCqpvQOTsh-8\&scaling=min-zoom\&starting-point-node-id=35%3A7920\&hide-ui=1). Ordering from a product page: 1. **Check the price**: "From" shows the best price; each row shows the price at its quantity 2. **Set quantities**: Steppers move a pack at a time; **Qty rules apply** lists the rules 3. **Add to Cart**: Adds every line with a quantity and opens My Cart ### Products with variants For a product with variants, such as styles or colours, customers see the variants in a table, so they can order several at once: | Part | What it shows or does | | --- | --- | | Price | **From:** the lowest price any quantity break reaches, then the RRP (for example "From: $4.75 MSRP: $9.99"). **Qty discount pricing available** appears under it when the product has quantity pricing. | | Variant options | A table row for each variant, under a column named for the option (for example **Style**). For products with a second option, a list to choose it (for example **Size**). | | Variant details | Each variant's thumbnail (a larger copy appears on hover), name, SKU and barcode (**Code**). | | **Price** column | The variant's price at the row's quantity, its RRP, its pack price (for example "Pack (6): $40.50") and its volume deal: see [Volume pricing](#volume-pricing). | | **Stock** column | A coloured dot and the stock count, such as **100+**. Hover over the dot for the status, such as **In stock**. | | **Qty** column | A stepper for each variant (**−**, the quantity, **+**) that moves one pack at a time, with **Qty rules apply** under it when rules are set. See [Quantity rules](#quantity-rules). | | Stock key | Under the table: **In stock**, **Low stock**, **Last stock**, **Out of stock** and **Pre-order**, each in its own colour. | | **Add to Cart** | Adds every variant with a quantity to the order, and shows the total. See [Add to Cart](#add-to-cart). | | Shopping list and heart | Save the product to a [shopping list](https://docs.sparklayer.io/help/ordering/shopping-lists.md) or to [favourites](https://docs.sparklayer.io/help/ordering/favourites.md). | A variant with no stock shows as **Out of stock** and can't be ordered, unless you've allowed customers to buy out-of-stock products. For products with two or more option types and many options, the [product matrix interface](https://docs.sparklayer.io/help/storefront/interfaces/product-matrix.md) shows every combination in one grid. ### Products without variants For a product with a single option to buy, customers see these parts: | Part | What it shows or does | | --- | --- | | Price | **From:** the lowest price any quantity break reaches, then the RRP if set (for example "From: $6.99 MSRP: $14.99"). | | Product code | **Product Code** with the SKU, and **Code** with the barcode if the product has one. | | Stock | Stock availability, for example **In stock** with how many are available, or **Pre-order** with its due date or a note such as "Awaiting date from supplier". | | Quantity pricing table | If the product has quantity pricing, each break with its **Qty**, **Price** and **Savings**. For a product sold by unit of measure, each row names the unit, for example "1 (single)", "5 (case)" and "10 (pallet)". | | Quantity | A stepper beside **Add to Cart**, opening at one unit, that applies your quantity rules. **Qty rules apply** appears under it when rules are set. | | **Add to Cart** | Adds the product to the order. The button shows the total for the chosen quantity, for example **Add to Cart ($10.00)**. | ### Volume pricing Each variant row says, in words, what its quantity pricing is worth. The text is underlined with dots because customers can click it. It opens the variant's **Qty discount pricing** table, with each break's **Qty**, **Price** and **Savings**. Clicking a row of that table sets the quantity to that break, in whole packs. | The row says | When | | --- | --- | | "From $4.75 at 2+ packs" | The best price needs more than one pack. Breaks are rounded up to whole packs and counted in packs. | | "$4.75 each by the pack" | One pack already reaches the best price. | | "From $4.75 for 10+" | The product has no pack size. | | "Saving 15%" | The row's quantity has reached a break. Savings are whole percentages, rounded. | On a product sold by unit of measure, the break is stated per unit, for example "From $3.99 per unit". ### Quantity rules The interface applies your quantity rules as customers choose quantities. A pack size is set per variant. A minimum or maximum is set per product and counted across all its variants: for example, a minimum of 36 can be met with 12 of each of 3 styles. See [Quantity rules](https://docs.sparklayer.io/help/storefront/quantity-rules.md). - **Qty rules apply** under each stepper opens a **Quantity rules** box: the **Pack size** ("Orders go in multiples of 6"), the **Minimum** and **Maximum** across all variants, and where the customer stands, for example "6 chosen · add 30 more". - The label turns amber while the minimum isn't met. - A typed quantity is rounded up to whole packs: 7 of a pack of 6 becomes 12. - At the maximum, **+** stops and a typed quantity is capped. ### Add to Cart **Add to Cart** is greyed out until the customer chooses a quantity, and while the quantity rules aren't met. Hovering over it tells the customer why, for example "Please select a quantity" or "Add 30 more to reach the minimum of 36". Once the rules are met, the button shows the total, for example **Add to Cart ($34.50)**. Clicking it adds every chosen line to the cart and opens [My Cart](https://docs.sparklayer.io/help/storefront/interfaces/my-cart.md). To change the button text, see [How products are shown](https://docs.sparklayer.io/help/storefront/product-display.md#change-the-add-to-cart-button-text). ## Add the interface to your store This section is for you, the merchant. To have our team install the product detail interface for you, free of charge, click **Request installation** at **Storefront > Widgets** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/frontend/core)), or **SparkLayer Wholesale > Storefront > Widgets** in the Shopify app. Or add it yourself: **Shopify:** There are 2 ways to add the product detail interface on Shopify: 1. **Theme setup:** go to **Home > Setup > Theme setup** in the SparkLayer Dashboard, or **SparkLayer Wholesale > Setup > Theme setup** in the Shopify app. Under **Optional blocks**, click **Add** next to **Product block**. Shopify's theme editor opens at that block: put it where you want the interface to appear, and save. See [Theme setup](https://docs.sparklayer.io/help/platforms/shopify/theme-setup.md). **More detail** In the theme editor, the block is called **SparkLayer - Product Page**. You can also add it yourself: go to **Online Store > Themes** ([open in the Shopify admin](https://admin.shopify.com/themes)), click **Customize**, open a product page and add the block. 2. **Code (for your developer):** if your theme doesn't support app blocks, or you'd rather use code, add this line to your product page template: ```html ``` **Other platforms:** Your developer adds this line to your product page template: ```html ``` Replace `product.id` with the variable your platform uses for the product's ID. See the install guide for your platform under [Platforms](https://docs.sparklayer.io/help/platforms.md). On Wix, the interface is added to your product pages automatically when you install SparkLayer. Once it's added, every signed-in B2B customer sees the interface on your product pages and can start ordering. ## Change what it shows You can change many parts of the interface, such as showing all variants at once, and showing the RRP, stock and barcodes. See [How products are shown](https://docs.sparklayer.io/help/storefront/product-display.md). ## FAQs **Why does a variant show as unavailable?** A variant with no stock shows as unavailable, unless your setup allows customers to buy out-of-stock products. See [Stock display](https://docs.sparklayer.io/help/storefront/stock-display.md). **Do retail customers see the product detail interface?** No. It only appears for customers signed in as B2B customers. Everyone else sees your theme's normal product page. --- # Product matrix URL: https://docs.sparklayer.io/help/storefront/interfaces/product-matrix Use the SparkLayer product matrix to show every colour and size of a product in one table so B2B customers can order in bulk, and apply it with tags. > **Quick summary** > > - The product matrix interface shows every variant of a product in one table (a matrix), for example colours down the side and sizes across the top, so B2B customers can order many combinations at once. > - Use it for products with 2 or more variant option types and many options. For other products, the [product detail interface](https://docs.sparklayer.io/help/storefront/interfaces/product-detail.md) works better. > - You (or your developer) add it to your product page template with one line of code. On Shopify, you can use a product tag to show it only on some products. > - It's included on every plan. ## How it works The product matrix interface is one of SparkLayer's [frontend interfaces](https://docs.sparklayer.io/help/storefront/interfaces.md). It replaces parts of your product page with a table that shows every variant of the product in a single view. Each cell is one combination, for example a cream sweatshirt in small, with its price, stock and a quantity box. Customers fill in the quantities they want and click **Add to Cart** once. You can see it working on our [example product page](https://demo.sparklayer.io/collections/b2b-grid-mode/products/example-running-shoes). With the product matrix, customers can: - See every combination of a product's options at once. - Enter quantities for many variants and add them all to the order in one go. - See which variants are in stock, low on stock or out of stock before they order. Each part of the matrix shows customers something different: | Part | What it shows | | --- | --- | | **Product pricing** | The customer's B2B price and, if you show it, the RRP. | | **Variants** | A matrix of every available variant. The first option (for example **Colour**) runs down the side with an image of each, and the second (for example sizes) runs across the top. | | **Stock level** | A coloured dot in each cell showing the variant's stock status, for example in stock, low stock, out of stock or pre-order. Out-of-stock cells can't be ordered. | | **Quantity** | A quantity box in each cell that applies your [quantity rules](https://docs.sparklayer.io/help/storefront/quantity-rules.md). | | **Quantity pricing** | Any quantity pricing, shown in an information pop-up on each cell. | | **SKU** | The product code, shown in the same information pop-up. | | **Add to Cart** | Adds every variant with a quantity to the order, and shows the total. | ### Products with more than two option types If a product has more than 2 option types, the extra options appear inside the table as an extra row of column headings. For example, a T-shirt with **Colour**, **Size** and a logo option shows each size (Small, Medium, Large) split into **With Logo** and **No Logo** columns, with a row for each colour. ## Add the interface to your store This section is for you and your developer. Adding the product matrix means a small change to your theme's code, so your developer or agency usually does it. They add this line to your product page template: ```html ``` If your platform uses a different variable for the product's ID, replace `product.id` with it. See the install guide for your platform under [Platforms](https://docs.sparklayer.io/help/platforms.md). Once it's added, every signed-in B2B customer sees the matrix on that page and can start ordering. The matrix needs room. Place it where customers can see the whole table, for example below the product image and description, set to the full width of the page. ### Show the matrix on some products only (Shopify) **Shopify only:** To use the matrix only for certain products, tag those products. Your developer then chooses the interface in your theme code: 1. In your Shopify admin, add a tag such as `b2b-product-matrix` to each product that should use the matrix. 2. Go to **Online Store > Themes** ([open in the Shopify admin](https://admin.shopify.com/themes)) and edit the code of your theme. 3. Open your product page section, for example `sections/main-product.liquid`, and add this Liquid code where the interface should appear. Tagged products then show the matrix, and all other products show the [product detail interface](https://docs.sparklayer.io/help/storefront/interfaces/product-detail.md). ```html {% if product.tags contains 'b2b-product-matrix' %} {% else %} {% endif %} {% if product.tags contains 'b2b-product-matrix' %} {% else %} {% endif %} ``` On other platforms, use your platform's own way of adding custom code to product templates. ## Change what it shows To show restock dates in the matrix, or for the display options that apply to all the product interfaces, see [How products are shown](https://docs.sparklayer.io/help/storefront/product-display.md#show-variants-as-a-matrix-matrix-mode). ## FAQs **Should I use the product matrix or the product detail interface?** Use the product matrix for products with 2 or more variant option types (such as colour and size) and a large number of options. For simpler products, use the [product detail interface](https://docs.sparklayer.io/help/storefront/interfaces/product-detail.md). **Where can customers see quantity pricing and the SKU in the matrix?** Both are in the information pop-up on each cell of the table. --- # Product card URL: https://docs.sparklayer.io/help/storefront/interfaces/product-card Applies to: Shopify, BigCommerce, WooCommerce, Magento Add the SparkLayer product card interface to collection pages so B2B customers see their price, variants and stock and order without opening a product. > **Quick summary** > > - With the product card interface, signed-in B2B customers see their own price, choose a variant and quantity, and add products to their order without opening the product page. > - It replaces the price and "add to cart" area on your product cards: the product tiles on collection (category) pages, product recommendations and anywhere else your store lists products. > - On Shopify it's added automatically on supported themes, or as the **SparkLayer - Product Card** app block. On other platforms, you add one line of code to your product card template. > - It's included on every plan. It isn't available on Wix, where product prices on gallery pages are hidden instead (see [Wix limitations](https://docs.sparklayer.io/help/platforms/wix/limitations.md)). ## How it works The product card interface is one of SparkLayer's [frontend interfaces](https://docs.sparklayer.io/help/storefront/interfaces.md). It takes the place of the price and "add to cart" button on each product card. B2B customers can then see their pricing and start building an order while they browse. With the product card, customers can: - See their B2B price and, if you show it, the RRP. - See the best volume price and open the product's quantity pricing. - Choose a variant from a drop-down list (one list per option, such as colour and size). - Choose a quantity that follows your quantity rules, and add the product to their order. Your theme's card still shows the product photo, title and any tags above it. The interface adds these parts, top to bottom: | Part | What it shows or does | | --- | --- | | **Price** | The customer's B2B price, with **From:** when the price depends on the variant or quantity, and, optionally, the RRP (for example "From: $4.99 MSRP: $9.99"). | | **Volume break** | The best quantity price, for example "From $8.30 at 8+ packs" or "From $3.99 per unit", underlined with dots. Clicking it opens the quantity pricing table (**Qty**, **Price** and **Savings**) as wide as the card. Clicking a row sets the quantity to that break. Breaks are rounded up to whole packs and counted in packs. | | **Stock and pack size** | One line with the stock status (for example **In stock** · **100+**, or **Pre-order** with a due date) and the pack rule, such as **Packs of 6**. | | **Variants** | A drop-down list for each option, such as colour and size. | | **Quantity** | A stepper that applies your [quantity rules](https://docs.sparklayer.io/help/storefront/quantity-rules.md), opening at the pack size. Each click moves one pack. | | **Add** | Adds the product to the order and opens My Cart. The button shows the total for the chosen quantity, for example **Add $71.40**. | | Heart | Saves the product to [favourites](https://docs.sparklayer.io/help/ordering/favourites.md). | | **SKU** | The product code, and the barcode, if you've turned them on. See [How products are shown](https://docs.sparklayer.io/help/storefront/product-display.md#customise-product-cards). | ### Cards line up in a grid On a collection page, the cards in a row line up. Each card's price, volume break, stock, variants, quantity and **Add** button sit at the same height as its neighbours'. This holds even when one product has 2 variant lists and another has none. A card on its own, outside a grid, is laid out as a simple column. To see what customers see, explore the product interfaces in [our interactive demo](https://www.figma.com/proto/5FPCY5hSGl7mlwjsjMZI2t/SparkLayer-Interfaces?page-id=0%3A1\&type=design\&node-id=86-36708\&viewport=554%2C-398%2C0.33\&t=34VlPwbCqpvQOTsh-8\&scaling=min-zoom\&starting-point-node-id=35%3A7920\&hide-ui=1). ## Add the interface to your store This section is for you, the merchant. To have our team install the product card interface for you, free of charge, click **Request installation** at **Storefront > Widgets** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/configuration/frontend/core)), or **SparkLayer Wholesale > Storefront > Widgets** in the Shopify app. Or add it yourself: **Shopify:** There are 2 ways to add the product card interface on Shopify: 1. **Theme setup:** go to **Home > Setup > Theme setup** in the SparkLayer Dashboard, or **SparkLayer Wholesale > Setup > Theme setup** in the Shopify app. Under **Optional blocks**, click **Add** next to **Product card block**. Shopify's theme editor opens at that block: put it where you want the interface to appear, and save. See [Theme setup](https://docs.sparklayer.io/help/platforms/shopify/theme-setup.md). **More detail** In the theme editor, the block is called **SparkLayer - Product Card**. You can also add it yourself: go to **Online Store > Themes** ([open in the Shopify admin](https://admin.shopify.com/themes)), click **Customize**, open a collection or product page and add the block. 2. **Code (for your developer):** if your theme doesn't support app blocks, or you'd rather use code, add this line to the file that renders product cards on your collection pages: ```html ``` **Other platforms:** Your developer adds this line to the template that renders product cards on your collection pages: ```html ``` Replace `product.id` with the variable your platform uses for the product's ID. See the install guide for your platform under [Platforms](https://docs.sparklayer.io/help/platforms.md). Once it's added, every signed-in B2B customer sees the interface on your product cards and can start ordering. ## Change what it shows You can change what the product card shows. It can show stock, the SKU or the barcode, hide variant drop-downs, or show products as table rows (quick buy mode). See [Customise product cards](https://docs.sparklayer.io/help/storefront/product-display.md#customise-product-cards) in Product display. ## FAQs **Can I use the product card interface on Wix?** **Wix only:** No. Wix doesn't support the product card interface, so prices on gallery and other product listing pages are hidden for B2B customers. Customers see their prices and order on product pages instead. See [Wix limitations](https://docs.sparklayer.io/help/platforms/wix/limitations.md). --- # Product price URL: https://docs.sparklayer.io/help/storefront/interfaces/product-price Show signed-in B2B customers their own price or the RRP anywhere on your product or collection pages with the SparkLayer product price snippet. > **Quick summary** > > - The product price interface shows a signed-in B2B customer their own price, or the RRP, for a product anywhere on your store, such as collection (category) pages or product pages. > - Use it alongside the other product interfaces, or instead of them when you want full control over where prices appear. > - Your developer or agency adds it with one line of code per price in your theme: `spark-product-price` for the B2B price and `spark-product-rrp` for the RRP. > - It's included on every plan. On an existing theme, you also need to hide the prices your theme shows to B2B customers. ## How it works The product price interface is one of SparkLayer's [frontend interfaces](https://docs.sparklayer.io/help/storefront/interfaces.md). It only shows a price: unlike the [product card](https://docs.sparklayer.io/help/storefront/interfaces/product-card.md) and [product detail](https://docs.sparklayer.io/help/storefront/interfaces/product-detail.md) interfaces, there's no quantity box or "add to cart" button. For example, a collection page can show customers "$9.99 RRP: $19.99" under each product name, using your theme's own layout. There are 2 prices you can show: | Price | What it shows | | --- | --- | | **B2B pricing** | The signed-in customer's own B2B price. | | **RRP pricing** | The RRP you've set for the product. See [How prices are shown](https://docs.sparklayer.io/help/pricing/pricing-display.md). | To see what customers see, explore the product interfaces in [our interactive demo](https://www.figma.com/proto/5FPCY5hSGl7mlwjsjMZI2t/SparkLayer-Interfaces?page-id=0%3A1\&type=design\&node-id=86-36708\&viewport=554%2C-398%2C0.33\&t=34VlPwbCqpvQOTsh-8\&scaling=min-zoom\&starting-point-node-id=35%3A7920\&hide-ui=1). ## Add the interface to your store This section is for your developer or agency. They add the line for each price you want to your theme's template, for example your product page or product card template. You can use both together, and place them anywhere on your store. ```html ``` ```html ``` If your platform uses a different variable for the product's ID, replace `product.id` with it. See the install guide for your platform under [Platforms](https://docs.sparklayer.io/help/platforms.md). Once it's added, every signed-in B2B customer sees their prices. On an existing theme, also hide the theme's own prices and anything else you don't want B2B customers to see. See the [Frontend integration guide](https://docs.sparklayer.io/developers/frontend.md). ## Change what it shows To show RRP, quantity pricing or unit prices, see [How prices are shown](https://docs.sparklayer.io/help/pricing/pricing-display.md). For other options, see [Storefront](https://docs.sparklayer.io/help/storefront.md). --- # Custom slots (targets) URL: https://docs.sparklayer.io/help/storefront/interfaces/custom-slots Add your own messages, promotions and links inside SparkLayer's My Account, My Cart and checkout with custom slots, with ready-made examples to copy. > **Quick summary** > > - Custom slots (also called targets) let you show B2B customers your own messages inside SparkLayer's [frontend interfaces](https://docs.sparklayer.io/help/storefront/interfaces.md). For example, a promotion at the top of My Account or a message on each cart line. > - There are 8 slots, covering My Account, My Cart, each cart line, the **Shipping** and **Review & Pay** checkout steps, the order complete screen and the purchase summary. > - You turn a slot on without code at **Storefront > Options > Custom slots** in the SparkLayer Dashboard ([open](https://app.sparklayer.io/storefront/options)), or **SparkLayer Wholesale > Storefront > Options > Custom slots** in the Shopify app. The content itself is a small block of HTML (a `