# Enabling Pickup
Source: https://storekit.com/docs/enabling-pickup
Turn on click-and-collect pickup in storekit so customers can order ahead for collection at your venue, with pickup managed from store settings.
Enable click-and-collect pickup on your storekit store so customers can place orders for collection from your venue. You can turn pickup on or off at any time from your store settings.
Pickup is a checkbox in the **Fulfillment types** group on the **Operations** settings page, alongside **Delivery**. The full path is **Stores** → \[your store] → **Settings** → **Operations** → **Fulfillment types**.
There is no **Fulfillment** entry in the store settings menu, and no separate collection-point page. **Pickup** is set on **Operations**.
## How Enabling Pickup Works
* Pickup appears as a fulfilment option at checkout
* Customers can choose pickup/collection before placing an order
* Pickup orders appear in your storekit orders dashboard (paper bag icon)
* Delivery can remain enabled separately
From your storekit dashboard, go to **Stores**, select the store you want to update, and open **Settings**.
From the settings menu, open **Operations**.
Under **Fulfillment types** — the first group on the **Operations** page — tick **Pickup** ("Offer pickup/collection orders").
You can also untick **Pickup** if you want to disable pickup/collection orders for this store.
Click **Save** to apply the change.
## When to Enable Pickup
Enable pickup when:
* You want customers to place collection orders through your storekit store
* The venue is ready to prepare pickup orders
* Customers can collect orders directly from the venue
* You have the correct address (pickup location) set under **Stores** → \[your store] → **Settings** → **General**
## When to Disable Pickup
Disable pickup when:
* The venue only wants to accept delivery orders
* Pickup/collection is temporarily unavailable
* The venue is too busy to handle pickup orders
* Pickup setup (pre-orders) is still being configured
Pickup only controls whether customers can choose pickup before placing an order. It does not affect whether delivery is enabled for the same store.
**On a dine-in store the Fulfillment types checkboxes are not shown.** If the store takes in-store (order-and-pay) orders, the **Fulfillment types** group is not rendered on **Operations** at all, and **Delivery Zones** and **Pre-Orders** are missing from the settings menu too. There is no dashboard control that adds pickup or delivery to such a store — [contact storekit support](/docs/getting-started/contact-support) to have it changed.
## Related
* [Enabling Delivery](/docs/guides/fulfillment/delivery/enabling-delivery) — enable delivery orders for your store
* [Configure fulfillment methods and order scheduling](/docs/getting-started/launch/configure-fulfillment) — all fulfilment settings in one place
* [Managing Live Orders](/docs/guides/orders/managing-live-orders) — handle incoming orders in real time
* [Orders Overview](/docs/guides/orders/overview) — how orders flow through storekit
# Contact Support
Source: https://storekit.com/docs/getting-started/contact-support
Reach the storekit support team via live chat, WhatsApp, email, or phone. Find response times, hours of operation, and the best channel for urgent issues.
Our support team is available **20 hours a day, 7 days a week** to help you with any questions or issues.
## Contact Methods
The fastest way to reach us. Click the chat widget in your storekit dashboard for instant support.
Message us on WhatsApp for quick responses and easy communication.
Send us an email at **[cs@storekit.com](mailto:cs@storekit.com)** and we'll get back to you as soon as possible.
Call us on **020 3318 9890** to speak directly with our team.
## Support Hours
| Day | Hours |
| --------------- | ----------------------- |
| Monday - Sunday | 8:00 AM - 1:00 AM (GMT) |
For the fastest response, use **Live Chat** in your dashboard. Our average response time is under 5 minutes during support hours.
## Is storekit Down? Check Platform Status
Before you troubleshoot your own setup, check [status.storekit.com](https://status.storekit.com). It shows any incident storekit is currently investigating, and you can subscribe there to get updates by email as the incident progresses.
While an incident is active:
* The dashboard, **Live Orders** and your customer ordering pages may be slow or fail to load. This is not caused by your device or network, so checking cables, switching browser or clearing your cache will not help.
* Your POS and in-store tills keep working — they do not depend on storekit to take payments or serve customers over the counter.
* If you already have a support chat open, our replies are also sent to your account email address, so you will see them even if you cannot load the dashboard.
* We publish progress on the status page rather than giving individual ETAs, because the timeline usually depends on the upstream provider we are waiting on.
After service is restored, things can be intermittent for a short while as systems stabilise — a page that fails on first load may work on a retry. If problems continue for you once the status page shows the incident resolved, contact us with your store name and what you are seeing.
## The Dashboard Says "Something Went Wrong"
Sometimes a dashboard action stops with a dialog titled **Something went wrong**, saying "Sorry, something went wrong and our developers have been notified. Try refreshing the page and trying again, or reach out on live chat for help".
This means the request your dashboard sent failed on storekit's side, not on your device. Our engineers are alerted automatically when it happens, so you do not need to report it for us to know about it — but telling us still helps, because the alert does not say which store or which action you were working on.
The dialog gives you three buttons:
* **Refresh Page** — reloads the dashboard. Worth trying first: many of these failures are momentary and the action succeeds on a second attempt.
* **Get Help** — opens live chat with the reference already filled into the message.
* **Close** — dismisses the dialog and leaves the page as it is. Assume the action did not save.
### Send Us the Reference Code
Under the message, the dialog shows a **Reference:** row with a short code in monospaced text, and a copy button next to it (hover it and it reads **Copy reference ID**). That code identifies the exact request that failed, so when you paste it into live chat we can pull up the log for it immediately instead of asking you to reproduce the problem.
To send it:
1. Click the copy button next to the code, or select the code and copy it manually.
2. Click **Get Help**, or open live chat from the dashboard.
3. Paste the code, and add what you were doing when it appeared (the store, the page, and the action).
The dialog deliberately does not show the technical reason for the failure — that detail is only visible to internal storekit accounts. There is no way to work out the cause from what the dialog shows you, and no setting on your side to change in response to it. If anyone tells you the error means something specific (a missing field, a permission, a browser problem), that is a guess: send us the reference and we will read the actual log.
If the dashboard was unreachable or unusually slow when the dialog appeared, also check [status.storekit.com](https://status.storekit.com) — during an incident these failures are a symptom of the incident rather than a separate problem.
## Developers and API Access
storekit's API is in early access and is granted case by case, so support cannot enable it for you over chat. Request it with the [storekit MCP/API Access Request](https://t09czsyu90l.typeform.com/to/G6rIJWNv) form, describing what you're building, which stores or account it's for, the data or actions you need, and your expected volume.
If you only need to receive events from your stores, [webhooks](/docs/developers/webhooks/overview) are available today without a request — see [Developer Introduction](/docs/developers/introduction).
## Before You Contact Us
To help us resolve your issue quickly, please have the following ready:
* Your **store name** or **store URL**
* A clear description of the issue
* Any relevant **order numbers** or **screenshots**
* The **Reference** code from any **Something went wrong** error you saw
* Steps you've already tried to resolve the issue
# 3. Build Your Menu
Source: https://storekit.com/docs/getting-started/launch/build-your-menu
Add your menu to storekit by importing from another platform, syncing from your POS, uploading a CSV spreadsheet, or building it manually in the dashboard.
There are several ways to get your menu into storekit. Choose the method that best fits your situation.
Menus are per store, and the choice of how to build a menu only appears while a store has no menu — so pick a method before you create one. If you have already started a menu and want to import instead, see [Managing Menus](/docs/guides/menu/managing-menus).
**Using a POS system?** If you're planning to connect a POS like Zonal, Lightspeed, or Deliverect, you may want to skip this step and [set up your POS integration first](/docs/guides/menu/pos-menu-sync). Your menu will sync automatically from the POS.
## Choose Your Method
Already on Deliveroo, Toast, Just Eat, or another platform? Import your existing menu.
Connect your POS system and sync your menu automatically.
Upload a spreadsheet with your products for bulk import.
Create your menu from scratch in the dashboard.
## Import from Existing Platforms
If you already have a menu on another platform, we can import it for you. Supported sources include:
| Delivery Platforms | POS / Ordering Systems | Website Builders |
| ------------------ | ---------------------- | ---------------- |
| Deliveroo | Clover | Google Business |
| Just Eat | Revel | Squarespace |
| Uber Eats | Toast | Wix |
| Foodhub | SkyTab | |
| Ritual | RedCat | |
| | Flipdish | |
| | Gloria Food | |
| | Mr Yum | |
| | Popmenu | |
This is the fastest way to get started if you have an existing menu on any of these platforms.
Contact storekit support or use the menu import option in your dashboard to request an import from your delivery platform.
Share the URL of your restaurant on the delivery platform (e.g., your Deliveroo restaurant page).
Once imported, review the menu in your dashboard. Check that categories, products, prices, and modifiers are correct.
Add high-quality images, update descriptions, and add any missing allergen information. Imported menus may not include all details.
Menu imports typically complete within a few minutes. In some cases, imports can take up to 24-48 hours. You can continue setting up other parts of your store while waiting.
## Sync from POS
If you use a POS system, sync your menu instead of building it manually:
| Integration Type | How It Works |
| ---------------------------------------- | ---------------------------------------------------- |
| **Push sync** (Deliverect, Stream) | Menu changes sync automatically from your POS |
| **Pull sync** (Zonal, Lightspeed, Syrve) | Trigger syncs manually or on a schedule |
| **Manual linking** (TISSL, Comtrex) | Create menu in storekit, link products via PLU codes |
[Full POS Menu Sync guide →](/docs/guides/menu/pos-menu-sync)
## CSV Import
For bulk import from a spreadsheet:
1. Download the CSV template from **Menu > Import**
2. Fill in your products with names, prices, descriptions, and categories
3. Upload the completed CSV file
4. Review and confirm the import
[CSV Import guide →](/docs/guides/menu/csv-import)
## Build Manually
To create your menu from scratch:
1. Go to **Menu** in the dashboard
2. Create **Categories** to organise your products (e.g., Starters, Mains, Drinks)
3. Add **Products** to each category with name, price, description, and image
4. Set up **Modifier Groups** for customisation options (sizes, toppings, sides)
5. Add **Allergen & Dietary** information for each product
For detailed instructions on each step, see the [Menu guide](/docs/guides/menu/overview).
### Quick Tips
* **Images matter** - Products with photos convert significantly better. See [Product Photography](/docs/guides/menu-engineering/product-photography).
* **Front-load descriptions** - Only the first \~60 characters show on the menu list.
* **Allergens are required** - In the UK and EU, allergen information is a legal requirement.
## After Import
Whichever method you use, review your menu before going live:
* [ ] All products have correct prices
* [ ] Images are high-quality and appetising
* [ ] Modifiers have correct min/max settings
* [ ] Allergen information is complete and accurate
* [ ] Products are in the right categories and order
## Next Step
With your menu ready, [configure fulfillment options →](/docs/getting-started/launch/configure-fulfillment)
# 4. Configure fulfillment methods and order scheduling
Source: https://storekit.com/docs/getting-started/launch/configure-fulfillment
Configure fulfillment for your storekit store including pickup, delivery, dine-in, and catering. Set delivery zones, prep times, and order method options.
Configure how customers receive their orders. You can offer pickup, delivery, dine-in, or any combination.
## Fulfillment Methods
storekit supports five fulfillment methods:
| Method | Internal Name | Description |
| --------------------- | ------------------ | ------------------------------------------ |
| **Pickup** | `Pickup` | Customers collect from your location |
| **Delivery** | `Delivery` | You deliver to the customer's address |
| **Dine-in** | `InStore` | Customers order to their table via QR code |
| **Catering Pickup** | `CateringPickup` | Large orders collected by the customer |
| **Catering Delivery** | `CateringDelivery` | Large orders delivered to an event |
When a customer visits your store, they're prompted to choose their fulfillment method (if multiple are enabled). This selection determines available time slots, minimum order values, and delivery fees.
## Where Pickup and Delivery Are Switched On
Both are checkboxes in the **Fulfillment types** group on one page: **Stores** → \[your store] → **Settings** → **Operations**. **Fulfillment types** is the first group on the **Operations** page, and it contains exactly two checkboxes — **Delivery** ("Offer delivery orders (we do not provide drivers or driver management)") and **Pickup** ("Offer pickup/collection orders"). Tick or untick them and click **Save**.
There is no **Fulfillment** entry in the store settings menu. The full list is **General**, **Design & Branding**, **Opening Hours**, **Operations**, **Packaging**, **Delivery Zones**, **Store Notices**, **Pre-Orders**, **Direct Printing**, **Tables**, **Payments**, **Kiosks & Terminals**, **Gratuity**, **Translation Overrides**, **Feedback** and **Automations** — pickup and delivery live under **Operations**. Some of those entries are store-dependent: **Delivery Zones** and **Pre-Orders** only on pickup/delivery stores, **Tables** only on dine-in stores, and **Packaging**, **Kiosks & Terminals**, **Translation Overrides** and **Automations** only when the feature is enabled for your account.
**On a dine-in store the Fulfillment types checkboxes are not shown at all.** If your store takes in-store (order-and-pay) orders, the whole **Fulfillment types** group is hidden on **Operations**, and **Delivery Zones** and **Pre-Orders** are not in the settings menu either. There is no dashboard control that converts a dine-in store into a pickup or delivery store — the store type is chosen when the store is created (**Takeaway**, **Dine-In** or **Digital Menu** on **Create your store**). To add pickup or delivery to an existing dine-in store, [contact storekit support](/docs/getting-started/contact-support).
## Enable Pickup
Pickup is the simplest option:
1. Go to **Stores** → \[your store] → **Settings** → **Operations**
2. Under **Fulfillment types**, tick **Pickup**, then click **Save**
3. Configure pickup settings:
| Setting on **Operations** | Description |
| -------------------------------------------------- | ----------------------------------------------------------------------- |
| **Preparation time** → **Pickup** | How long to prepare pickup orders (affects the earliest available slot) |
| **Order limits** → **Pickup orders** → **Minimum** | Minimum basket value for pickup orders |
| **Order limits** → **Pickup orders** → **Maximum** | Maximum basket value (leave at 0 for no limit) |
## Enable Delivery
To offer delivery:
1. Go to **Stores** → \[your store] → **Settings** → **Operations**
2. Under **Fulfillment types**, tick **Delivery**, then click **Save**
3. Configure delivery settings:
| Setting on **Operations** | Description |
| ---------------------------------------------------- | ---------------------------------------------------------------- |
| **Delivery Fee** | Base fee charged on delivery orders (delivery zones override it) |
| **Order limits** → **Delivery orders** → **Minimum** | Minimum basket value for delivery |
| **Order limits** → **Delivery orders** → **Maximum** | Maximum basket value (leave at 0 for no limit) |
| **Preparation time** → **Delivery** | Estimated time to prepare delivery orders |
### Delivery Zones
For distance-based pricing and delivery areas:
1. Go to **Stores** → \[your store] → **Settings** → **Delivery Zones**
2. Click **Add new zone**
3. Configure the zone, then click **Create zone**:
| Setting | Description |
| ------------------------ | ------------------------------------------------------------------------------ |
| **Name** | Name for the zone (e.g. "Zone 1") |
| **Driving distance** | Maximum distance from your store, in miles or kilometres based on your country |
| **Delivery Fee** | Fee for this zone (enter 0 to not charge a fee) |
| **Minimum spend amount** | Minimum basket for this zone |
Zones can be drawn by driving distance, as a polygon, or from postcodes — see [Delivery Zones](/docs/guides/fulfillment/delivery/delivery-zones) for the other zone types.
When a customer enters their address, the system calculates distance from your store and determines which zone applies. If they're outside all zones, delivery is unavailable for that address.
Create multiple zones with increasing fees based on distance. For example: 0-2 miles = free delivery, 2-4 miles = £2.50, 4-6 miles = £4.00.
### Third-Party Delivery
If you use a delivery service:
1. Go to **Stores** → \[your store] → **Settings** → **Integrations**
2. Connect your delivery provider ([Uber Direct](/docs/guides/integrations/delivery/uber-direct), [Shipday](/docs/guides/integrations/delivery/shipday), [Nash](/docs/guides/integrations/delivery/nash), etc.)
3. Orders are automatically dispatched to drivers
## Enable Dine-in (InStore)
Dine-in is not a checkbox under **Fulfillment types** — there is no **Dine-in** toggle anywhere in store settings. A store accepts in-store orders because it was created as a **Dine-In** store; switching an existing store over is not self-serve, so [contact storekit support](/docs/getting-started/contact-support).
On a dine-in store, set up table ordering:
1. Go to **Stores** → \[your store] → **Settings** → **Tables** (this entry only appears on dine-in stores) and set up table areas and tables
2. Generate QR codes for each table
When customers scan a table's QR code:
* The table is automatically selected
* Orders include the table number/name
* Pay-at-table can be enabled for bill splitting
Table areas can have their own settings (e.g., enable/disable pay-at-table per area).
You can configure a **table descriptor** to customise how tables are referred to (e.g., "Table", "Booth", "Room").
## Enable Catering
For large event orders with separate fulfillment options.
Catering is not a checkbox under **Fulfillment types** either — the group contains only **Delivery** and **Pickup**. Catering fulfillment is enabled by storekit on request: [contact storekit support](/docs/getting-started/contact-support).
Catering orders have their own:
* Pickup and delivery options (`CateringPickup` and `CateringDelivery`)
* Minimum order values (typically higher)
* Lead time requirements
* Pre-order date selection
## Order Scheduling
Let customers choose when they want their order:
| Option | Description |
| -------------- | -------------------------------------------- |
| **ASAP only** | Orders prepared immediately |
| **Pre-orders** | Customers select a future date and time slot |
| **Both** | Customer chooses ASAP or scheduled |
When ASAP is enabled, customers can place orders up to the configured lead time (default **45 minutes**) before the first available delivery or pickup slot. If your first slot starts before your venue's stated opening time, customers may be able to order before you officially open. For example, if your first delivery slot is 4:00 PM and ASAP is enabled with a 45-minute lead time, a customer could place an order as early as 3:15 PM — even if your venue opens at 5:00 PM. To prevent pre-opening orders, either disable ASAP or set your first slot to at least your opening time plus the lead time (e.g., 5:45 PM for a 5:00 PM opening with a 45-minute lead time). See [How ASAP Delivery Interacts with Opening Hours](/docs/guides/store-settings/opening-hours#how-asap-delivery-interacts-with-opening-hours) for more detail.
Pre-order settings are configured separately for pickup and delivery, with different available days for each.
## Minimum Order Values
Minimum and maximum spend are set under **Order limits** on **Operations** (turn on **Limit order values**). The rows shown depend on the store type: a pickup/delivery store shows **Delivery orders** and **Pickup orders**, a dine-in store shows **In-store orders**. Each row has a **Minimum** and a **Maximum** column, and there is a separate **Minimum items** limit. Delivery minimums can also be overridden per zone under **Delivery Zones**.
If a customer's basket is below the minimum, they see a message showing how much more they need to spend.
## Next Step
Now configure your payment methods → [Set up payments](/docs/getting-started/launch/set-up-payments)
# 6. Connect a cloud receipt printer
Source: https://storekit.com/docs/getting-started/launch/connect-printing
Connect a Star Micronics CloudPRNT receipt printer to storekit so kitchen tickets print automatically when new orders arrive at your venue.
Connect a cloud printer to automatically print order tickets when orders come in. This step is optional - you can manage orders directly from the dashboard or via POS integration.
## Do You Need a Printer?
| Use Case | Recommendation |
| ---------------------------- | ----------------------------------------------------------------- |
| High volume kitchen | Yes - printed tickets are faster |
| Low volume / single operator | Optional - use the dashboard |
| Multiple prep stations | Yes - with [split printing](/docs/guides/printing/split-printing) |
| POS integration | Often not needed - orders go directly to POS |
## Supported Printers
storekit works with **Star Micronics** cloud-enabled thermal printers using CloudPRNT technology.
Popular models include:
* Star TSP143IV (Ethernet/Wi-Fi)
* Star TSP654II (Ethernet)
* Star mC-Print3 (Ethernet/Wi-Fi/Bluetooth)
When purchasing a printer, ensure it supports CloudPRNT. Look for "CloudPRNT" in the model specifications. The printer must have network connectivity (Wi-Fi or Ethernet) to communicate with storekit's servers.
## Setting Up a Printer
Your Star printer must be connected to your router via an ethernet (LAN) cable for reliable cloud printing. WiFi-only setups are not recommended and may fail to connect. A USB connection to a till, laptop or tablet does not connect the printer to storekit — orders are fetched from the cloud over your network, never over USB. Ensure you have a LAN cable available before starting setup. If your router is not near the printer, use a long LAN cable, network switch, or a 4G router with a LAN port.
Connect your printer to your network via Ethernet and power it on. The printer needs internet access to receive orders from storekit.
Go to **Stores** → your store → **Settings** → **Direct Printing** and click **Add Printer**.
Enter your printer's MAC address (found on a test print — hold the FEED button while powering on the printer) and give it a descriptive name (e.g., "Kitchen Printer", "Bar Printer").
Set print options:
* Paper width (80mm is standard for receipts)
* Number of copies per order
* Auto-print or manual print
Click **Test Print** to verify the connection and check the output format.
## What Prints
Order tickets include:
* Order number
* Customer name and contact details
* Fulfillment type (Pickup, Delivery, Dine-in) and requested time
* Table number (for dine-in orders)
* Items with modifiers and special instructions
* Order notes
* Payment status
You can customise print names for products using the [Print Name](/docs/guides/printing/print-name) feature.
## Auto Print vs Manual Print
| Mode | Description |
| ---------------- | -------------------------------------------------- |
| **Auto print** | Tickets print automatically when orders are placed |
| **Manual print** | Print tickets on-demand from the dashboard |
[Learn more about auto vs manual printing →](/docs/guides/printing/auto-vs-manual)
## Split Printing
If you have multiple prep stations (e.g., kitchen and bar), set up split printing:
1. Add multiple printers with descriptive names
2. Assign menu categories to each printer
3. Orders automatically split by category
**Example:**
* Kitchen printer → Food categories
* Bar printer → Drinks categories
[Learn more about split printing →](/docs/guides/printing/split-printing)
## Fallback Printing
Configure a backup printer in case your primary printer goes offline:
1. Add a secondary printer
2. Set it as the fallback for your primary printer
3. If the primary fails, orders automatically route to the fallback
[Learn more about fallback printing →](/docs/guides/printing/fallback-printing)
## Troubleshooting
### Printer Not Connecting
* Check the printer is powered on and connected to the network
* Verify the MAC address is entered correctly
* Ensure the printer has internet access (not just local network)
* Check your router/firewall isn't blocking outbound connections
### Orders Not Printing
* Verify the printer is set as active in settings
* Check the printer has paper and no error lights
* Send a test print from the dashboard
* Check if orders are going to a different printer (if using split printing)
[Full troubleshooting guide →](/docs/guides/printing/troubleshooting)
## Next Step
You're almost ready! [Test your store and go live →](/docs/getting-started/launch/test-and-go-live)
# 1. Create Your Store
Source: https://storekit.com/docs/getting-started/launch/create-your-store
Create your first storekit store by entering your business name, address, contact details, and branding. The first step in launching your online ordering site.
Create your storekit account and set up your first store with your business details.
## Sign Up
1. Go to [dashboard.storekit.com](https://dashboard.storekit.com)
2. Click **Sign Up**
3. Enter your email and create a password
4. Verify your email address
## Create Your First Store
After signing up, you'll be prompted to create your first store:
Enter your business name as you want customers to see it. This appears in the header of your ordering page and in order confirmation emails.
Your store URL is automatically generated from your name (e.g., `order.storekit.com/your-business-name`).
Start typing your business name or address to search Google Places. If your business is found, we'll automatically fill in:
* Business address
* Phone number
* Opening hours
If your business appears in the Google Places suggestions, select it to save time. You can always edit the details afterwards.
Confirm or enter your full business address including street, city, and postcode. This is:
* Displayed to customers on your store page
* Used as the origin point for delivery distance calculations
* Shown on Google Maps for pickup directions
Confirm or add your business phone number. This is required for payment provider verification and may be displayed to customers.
Currency and timezone are automatically set based on your store address. You can change these if needed. They determine:
* How prices are displayed (symbol and formatting)
* When your opening hours start and end
* Timestamps on orders and reports
## Store Settings
After creation, customise your store's appearance and behaviour in **Store Settings**:
### Branding
| Setting | Description |
| ------------------ | ---------------------------------------------- |
| **Logo** | Displayed in the store header and order emails |
| **Header Image** | Banner image shown at the top of your menu |
| **Primary Colour** | Used for buttons, links, and accent elements |
| **Favicon** | Browser tab icon for your store |
### Store Information
| Setting | Description |
| -------------------- | ----------------------------------- |
| **Description** | Short text shown on your store page |
| **Meta Title** | Browser tab title and SEO title |
| **Meta Description** | SEO description for search results |
| **Google Maps URL** | Custom link for directions |
### Checkout Settings
Configure what customer information is collected at checkout for each fulfillment method:
| Field | Options |
| ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------- |
| **Email** | **Required**, **Disabled** or **Optional** |
| **Phone** | **Enabled**, **Disabled**, **Validated** (with format check) or **Optional** - there is no Required option; Enabled is the mandatory setting |
| **First name** / **Last name** | toggle on or off |
| **Company Name** | **Required**, **Disabled** or **Optional** |
| **VAT Number** | **Disabled**, **Optional (validated)**, **Required (validated)**, **Optional (free text)** or **Required (free text)** |
[Full option-by-option behaviour →](/docs/guides/guest-data/overview)
You can set different checkout requirements for pickup vs delivery. For example, require phone numbers for delivery orders but make them optional for pickup.
## Multiple Stores
If you operate multiple locations, create additional stores from the dashboard. Each store has its own:
* Menu and pricing
* Opening hours
* Fulfillment settings (pickup, delivery, dine-in)
* Payment configuration
* Branding and design
All stores under one account share the same login and can be managed from a single dashboard. You can also set up a [brand page](/docs/guides/integrations/overview) that lets customers select from multiple locations.
## Next Step
Once your store is created, [set your opening hours →](/docs/getting-started/launch/set-opening-hours)
# 2. Set Opening Hours
Source: https://storekit.com/docs/getting-started/launch/set-opening-hours
Set storekit opening hours, configure multiple time slots for lunch and dinner service, and customise hours per fulfillment method like delivery or pickup.
Configure when customers can place orders. Your store will only accept orders during the hours you set.
## Setting Opening Hours
1. Go to **Store Settings > Opening Hours**
2. For each day of the week (Monday through Sunday), set your opening and closing times
3. Toggle days off if you're closed
4. Click **Save**
Hours are stored in `HH:mm:ss` format and displayed to customers in 12-hour format (e.g., "11:00 am - 10:00 pm").
## Multiple Time Slots
If you close during the day (e.g., between lunch and dinner), add multiple time slots per day:
* **Lunch:** 11:00 am - 2:30 pm
* **Dinner:** 5:00 pm - 10:00 pm
Click **Add time slot** to add additional periods for the same day. Customers will see all available time slots when selecting a pickup or delivery time.
## Different Hours by Fulfillment Type
You can set different hours for different fulfillment methods:
| Fulfillment | Example Use Case |
| ------------ | ---------------------------------- |
| **Pickup** | Accept pickup orders all day |
| **Delivery** | Only deliver during dinner service |
| **Dine-in** | Match your restaurant floor hours |
To set separate hours:
1. Go to **Store Settings > Opening Hours**
2. Click the fulfillment type tab (Pickup, Delivery, etc.)
3. Configure hours for that specific method
If your delivery hours are shorter than pickup, customers outside delivery hours will only see pickup as an option. The system automatically adjusts available fulfillment methods based on current time and configured hours.
## Prep Time
Set how long you need to prepare orders:
1. Go to **Store Settings > Fulfillment**
2. Set **Prep time** for pickup/dine-in orders
3. Set **Prep + delivery time** for delivery orders (includes travel time)
This affects the earliest time slot customers can select. If it's 12:00 and prep time is 15 minutes, the earliest available slot is 12:15.
The estimated time is displayed to customers on the menu and at checkout.
## Pre-orders
Allow customers to order ahead for future dates:
1. Go to **Store Settings > Pre-orders**
2. Enable **Pre-orders**
3. Configure available pre-order days separately for pickup and delivery
When pre-orders are enabled, customers can:
* Select a future date from the available days
* Choose a specific time slot within your opening hours
* Place orders outside of current opening hours (for future fulfillment)
If **Always open for pre-orders** is enabled, customers can place future orders even when your store is currently closed.
## Temporary Closures
To temporarily close your store:
* **Snooze** - Close for a set period (30 mins, 1 hour, etc.)
* **Close for today** - Stop accepting orders for the rest of the day
* **Holiday mode** - Close for multiple days
Access these from the **Open/Closed** toggle in the dashboard header. When closed, customers see a "Closed" message and cannot place orders.
## Next Step
Now that your hours are set, [build your menu →](/docs/getting-started/launch/build-your-menu)
# 5. Set Up Payments
Source: https://storekit.com/docs/getting-started/launch/set-up-payments
Enable storekit Payments powered by Adyen to accept cards, Apple Pay, Google Pay, Klarna, and local methods. Connect a bank account to start receiving payouts.
Set up storekit Payments to accept card payments and receive payouts to your bank account.
## storekit Payments
storekit Payments is powered by Adyen, a global payment processor. It supports:
* **Cards** - Visa, Mastercard, Amex, Maestro
* **Digital wallets** - Apple Pay, Google Pay
* **Regional methods** - Klarna, iDEAL, Bancontact, TWINT, Alipay, and more
For merchants in South Africa, storekit uses [Yoco](/docs/guides/payments/yoco) as the payment provider instead of Adyen.
## Getting Started
Go to **Stores** → your store → **Settings** → **Payments** and click **Create a new platform account**.
Choose your business type:
* **Business** - Limited Company, LLP, or PLC
* **Sole Trader** - Self-employed individual
Provide your business information. For UK companies, we'll look up details from Companies House automatically.
Review and accept the terms of service.
Complete identity and business verification. You'll need:
* Photo ID (passport or driving licence)
* Bank account details for payouts
* Business registration details (for companies)
## Verification
Verification is required to receive payouts. Most verifications complete within minutes, but some may take 24-48 hours.
| What's Verified | For Sole Traders | For Companies |
| ------------------------ | ---------------- | ------------- |
| Identity | ✓ | ✓ |
| Bank account | ✓ | ✓ |
| Business registration | - | ✓ |
| Beneficial owners (25%+) | - | ✓ |
You must complete verification before you can accept payments. [Learn more about verification →](/docs/guides/payments/storekit-payments-setup)
## Payouts
Once verified, funds are paid out to your bank account:
* **Schedule** - Daily (business days, T+2 settlement)
* **Time** - 5:00 AM local time
* **Currency** - Your local currency
[Learn more about payouts →](/docs/payouts/overview)
## Payment Methods
After setup, these payment methods are automatically enabled:
| Method | Availability |
| --------------------------------- | ------------------ |
| Cards (Visa, Mastercard, Maestro) | All stores |
| American Express | Enabled by default |
| Apple Pay | Apple devices |
| Google Pay | Android/Chrome |
### Regional Payment Methods
Additional methods can be enabled based on your region:
* [**Klarna**](/docs/guides/payments/klarna) - Buy now, pay later (UK, EU)
* [**iDEAL**](/docs/guides/payments/ideal) - Netherlands
* [**Bancontact**](/docs/guides/payments/bancontact) - Belgium
* [**TWINT**](/docs/guides/payments/twint) - Switzerland
* [**Alipay**](/docs/guides/payments/alipay) - International customers from China
[Contact support](/docs/getting-started/contact-support) to enable regional payment methods.
### Cash / Pay Later
For dine-in orders or pickup, your store can be set up with non-card payment options:
* **Cash** - Customer pays in person (no online payment required)
* **Add to bill** - For pay-at-table, orders are added to an open bill
These options appear at checkout based on the fulfillment method and store settings. Neither is a dashboard setting — cash is configured per fulfillment method by [support](/docs/getting-started/contact-support). See [cash and pay-on-collection orders](/docs/guides/payments/cash-payments).
## Tips & Service Charges
Optionally enable tips at checkout:
1. Go to **Store Settings > Payments**
2. Enable **Tips**
3. Configure tip settings for regular orders and pay-at-table separately
You can set suggested tip percentages or allow custom amounts. Service charges can be added automatically to all orders.
[Learn more about tips →](/docs/guides/payments/tips-service-charges)
## Next Step
With payments configured, [connect a printer →](/docs/getting-started/launch/connect-printing) or skip to [testing your store](/docs/getting-started/launch/test-and-go-live).
# 7. Test & Go Live
Source: https://storekit.com/docs/getting-started/launch/test-and-go-live
Run through the pre-launch checklist, place a test order to verify your setup, and publish your storekit store so customers can start placing real orders.
Before launching, test your store to ensure everything works correctly. Then go live and start accepting real orders.
## Pre-Launch Checklist
Before testing, verify these are complete:
* [ ] Store details entered (name, address, phone number)
* [ ] Opening hours configured for each day
* [ ] Menu built with categories, products, and prices
* [ ] Fulfillment methods enabled (Pickup, Delivery, Dine-in)
* [ ] Payments set up and verification completed
* [ ] Printer connected (if using direct printing)
* [ ] Allergen information added (legal requirement in UK/EU)
## Testing Your Store
### Place a Test Order
1. Open your store URL: `order.storekit.com/your-store-slug`
2. Select a fulfillment method (you'll be prompted if multiple are enabled)
3. Browse the menu and add items with modifiers
4. Proceed to checkout
5. Enter customer details and complete payment
6. Verify the order confirmation page
Use a real card for testing - you'll receive the funds and can refund the test order afterwards. Test payments process the same as real orders.
### What to Check
| Area | What to Verify |
| ----------------- | ------------------------------------------------------------------ |
| **Menu** | Products display correctly with images, prices, descriptions |
| **Modifiers** | Required modifiers enforce selection, prices calculate correctly |
| **Cart** | Items add/remove properly, totals include modifiers and fees |
| **Fulfillment** | Pickup/delivery selection works, delivery zones validate correctly |
| **Pre-orders** | Time slot selection works (if enabled) |
| **Checkout** | Customer details form works, payment completes |
| **Dashboard** | Order appears in your orders list immediately |
| **Printing** | Ticket prints automatically (if using auto-print) |
| **Notifications** | You receive order notification email |
### Test Different Scenarios
* **Fulfillment types** - Test pickup, delivery, and dine-in separately
* **Pre-orders** - Select a future date/time if scheduling is enabled
* **Delivery zones** - Test addresses inside and outside your delivery area
* **Minimum orders** - Try checkout below minimum to verify the warning message
* **Payment methods** - Test cards, Apple Pay, Google Pay
* **Devices** - Test on mobile (primary) and desktop
## Refunding Test Orders
After testing, refund your test orders:
1. Go to **Orders** in the dashboard
2. Find the test order
3. Click **Refund**
4. Confirm the refund amount
Funds return to the original payment method within 5-10 business days.
[Learn more about refunds →](/docs/guides/payments/refunds-payouts)
## Going Live
Once testing is complete:
### 1. Open Your Store
Your store is controlled by the **Open/Closed** toggle in the dashboard header. Make sure it's set to **Open** during your operating hours.
When closed, customers see a "Closed" message and cannot place orders (unless pre-orders are enabled with "Always open for pre-orders").
### 2. Share Your Store Link
Your store is available at:
```
https://order.storekit.com/your-store-slug
```
Share this link:
* On your website (add an "Order Online" button)
* In social media bios (Instagram, Facebook, etc.)
* On Google Business Profile
* Via QR codes printed in-store
* In email signatures and marketing materials
### 3. Add to Google Business Profile
Add your ordering link to Google so customers can order directly from search results:
1. Go to your Google Business Profile
2. Add the order link under "Order online"
3. Customers see an "Order" button in Google Search and Maps
[Learn more about Google Business Profile →](/docs/guides/increasing-sales/google-business-profile)
## After Launch
### Monitor Orders
* Keep the dashboard open during service
* Enable browser notifications for new orders
* Set up email notifications as backup
* Configure auto-accept if you want orders confirmed automatically
### Review Analytics
Track your store performance:
* Order volume and revenue
* Popular products
* Peak ordering times
* Fulfillment method breakdown
### Gather Feedback
Enable [customer feedback](/docs/guides/marketing/customer-feedback) to collect reviews after orders. Pay attention to:
* Customer questions or confusion
* Common modification requests
* Delivery time accuracy
* Any technical issues
### Iterate
Based on feedback:
* Adjust menu descriptions for clarity
* Tweak prep times based on actual performance
* Update product photos
* Add frequently requested modifiers
* [Snooze unavailable items](/docs/guides/menu/availability-snoozing) rather than deleting them
## Need Help?
* Browse the [full documentation](/docs/) for detailed guides
* [Contact support](/docs/getting-started/contact-support) for assistance
* Check [system status](https://status.storekit.com) if experiencing issues
Congratulations - your storekit store is live!
# Quick Start Guide
Source: https://storekit.com/docs/getting-started/quick-start-guide
Step-by-step setup guide to launch your storekit store. Create the store, build a menu, set hours, configure payments and fulfillment, and go live fast.
This guide walks you through the essential steps to launch your storekit store. Most stores can be set up and taking orders within an hour.
## What You'll Need
Before you start, have these ready:
* Your business details (name, address, phone number)
* Your menu (products, prices, descriptions)
* Bank account details (for receiving payouts)
* Logo and brand colour (optional but recommended)
## Setup Steps
Sign up at [dashboard.storekit.com](https://dashboard.storekit.com) and create your first store. You'll enter your business name, URL slug, address, currency, and timezone.
[Detailed guide →](/docs/getting-started/launch/create-your-store)
Configure when your store accepts orders. Set opening and closing times for each day of the week, with support for multiple time slots (e.g., lunch and dinner service). You can set different hours for pickup vs delivery.
[Detailed guide →](/docs/getting-started/launch/set-opening-hours)
Create categories to organise your products, then add items with prices, descriptions, and images. Set up modifier groups for customisation options (sizes, toppings, etc.) and add allergen/dietary information.
[Detailed guide →](/docs/getting-started/launch/build-your-menu)
Enable the fulfillment methods you want to offer:
* **Pickup** - customers collect from your location
* **Delivery** - you deliver to customer addresses (with optional delivery zones)
* **Dine-in** - table ordering via QR codes
* **Catering** - large orders with separate pickup/delivery options
Set prep times, minimum order values, and delivery fees.
[Detailed guide →](/docs/getting-started/launch/configure-fulfillment)
Connect storekit Payments (powered by Adyen) to accept cards, Apple Pay, and Google Pay. Complete identity verification to receive payouts to your bank account.
[Detailed guide →](/docs/getting-started/launch/set-up-payments)
Set up a Star Micronics cloud printer to automatically print order tickets. Skip this if you'll manage orders from the dashboard or use a POS integration.
[Detailed guide →](/docs/getting-started/launch/connect-printing)
Place test orders to verify the customer experience, payment flow, and order notifications. When ready, open your store and share your link.
[Detailed guide →](/docs/getting-started/launch/test-and-go-live)
## Your Store URL
Once created, your store is available at:
```
https://order.storekit.com/your-store-slug
```
You can also connect a custom domain like `order.yourbusiness.com`.
## Quick Wins
After the basics are set up, consider these improvements:
Stores with images see higher conversion rates
Let customers add tips at checkout
Create promo codes and automatic promotions
Send orders directly to your till system
## Need Help?
* Browse the [full documentation](/docs/) for detailed guides
* [Contact support](/docs/getting-started/contact-support) for assistance
* Check [system status](https://status.storekit.com) if experiencing issues
# Set up a catering store for advance group orders
Source: https://storekit.com/docs/getting-started/store-types/catering-services
Configure storekit for catering services and large group orders. Enable advance scheduling, lead times, minimum order values, and dedicated catering menus.
# Delivery & Pickup Store
Source: https://storekit.com/docs/getting-started/store-types/delivery-pickup-store
Set up a storekit Delivery & Pickup store so customers can order online for collection, delivery, or both, with ASAP or scheduled fulfilment.
## How Delivery & Pickup Stores Work
* Customers order from your online store
* You can enable pickup, delivery, or both
* Customers can order ASAP or schedule orders in advance if [pre-orders](/docs/guides/orders/advanced/pre-orders) are enabled
* Orders appear in your storekit order dashboard
* Integrated stores can send orders to a connected POS or delivery partner
* Payments can be taken online once storekit Payments is activated
## Before You Start
Before going live, make sure you have:
* Your store profile and basic store information
* Opening hours
* Pickup and/or delivery settings
* A menu
* Payment setup
* Delivery zones, if you offer delivery
* Drivers or a 3rd-party courier integration (delivery)
* A way to receive and manage incoming orders
## How to Set Up a Delivery & Pickup Store
From your storekit dashboard, go to **Stores**.
Open the store you want to set up, or create a new store if one has not been created yet.
Add the key information customers will see on your online store.
This can include:
* Store name
* Store description
* Website
* Logo
* Social links
* Store address
* Contact details
Go to **Store Settings > Opening Hours** and set the days and times your store is open.
Opening hours help control when customers can place orders and when fulfilment slots are available.
Go to **Store Settings > Operations**.
Under fulfilment settings, choose whether this store should accept:
* Pickup orders
* Delivery orders
* Both pickup and delivery
Pickup and delivery can be enabled separately, depending on how your venue operates.
For the full setup steps, see:
* [**Enabling Pickup**](/docs/enabling-pickup)
* [**Enabling Delivery**](/docs/guides/fulfillment/delivery/enabling-delivery)
Save your changes once updated.
Go to **Store Settings > Pre-orders** if you want customers to order in advance.
Pre-orders let customers choose a future pickup or delivery time. You can configure pickup and delivery separately, including slot length, capacity, scheduling notice, and available times.
More info available [here](/docs/guides/orders/advanced/pre-orders)
Set up the menu customers will order from.
For standalone stores, you can create your menu in storekit.
For integrated stores, your menu may need to be created or synced from your POS or integration partner.
Make sure your menu is accurate before going live, including:
* Categories
* Items
* Prices
* Modifiers
* Availability
Go to **Store Settings > Payments** and activate storekit Payments.
You may need to submit business, owner, and bank details before payments can be approved.
Customers can only pay online once payments have been activated.
If your store accepts delivery orders, go to **Store Settings > Delivery Zones**.
Delivery zones control where you deliver and can include delivery fees or minimum order values depending on your setup.
You can create delivery zones using options such as:
* Driving distance
* Polygon
* Circle
* Postcode
Before going live, place a test order to confirm the customer journey works as expected.
Check that:
* The correct fulfilment options appear at checkout
* Pickup and delivery slots are available
* Menu items and prices are correct
* Payment is working
* The order appears in the storekit order dashboard
* Any connected POS, printer, or integration receives the order correctly
Use a real card for testing - you’ll receive the funds and can refund the test order afterwards. Test payments process the same as real orders.
[How to place a test order](/docs/getting-started/launch/test-and-go-live)
Once the store is ready, share your store URL or QR code with customers.
You can use your store URL on your website, social media, email campaigns, or printed materials.
When setup and testing are complete, enable the store so customers can start placing orders.
## Integrated Stores
If your store is connected to a POS or integration partner, some setup steps may happen outside storekit.
For example:
* Menus may need to be created or published from your POS
* Orders may print from your POS printer
* Delivery partners may need separate configuration
* Item availability or pricing may be controlled by the integration
Check the integration setup before going live.
Pickup and delivery are enabled from **Store Settings > Operations**. You can enable either option individually or use both together.
Place a test order before going live to confirm orders are received correctly in storekit and any connected POS, printer, or integration.
For integrated stores, some menu, printing, and order settings may be controlled by your POS or integration partner rather than storekit.
## Troubleshooting
#### Customers cannot choose pickup or delivery
Check that the fulfilment type is enabled under **Store Settings > Operations**.
Also check your opening hours and pre-order settings if customers are trying to order for a future time.
#### Customers cannot place delivery orders
Check that delivery is enabled under **Store Settings > Operations**.
If delivery zones are configured, make sure the customer’s address is covered by an active delivery zone.
If no delivery zones are configured, customers may be able to place delivery orders from any address, depending on your store setup.
Also check your opening hours and pre-order settings if customers are trying to place an order for a future time.
#### Orders are not printing or reaching the POS
Check whether the store is integrated with a POS or order partner.
For integrated stores, test orders should be checked in both storekit and the connected POS or integration system.
## Related
* [**Enabling Pickup**](/docs/enabling-pickup) — enable collection orders for your store
* [**Enabling Delivery**](/docs/guides/fulfillment/delivery/enabling-delivery) — enable delivery orders for your store
* [**Pre-orders**](/docs/guides/orders/advanced/pre-orders) — let customers order for a future date or time
* [**Delivery Zones**](/docs/guides/fulfillment/delivery/delivery-zones) — configure where delivery is available
* [**Tips & Service Charges**](/docs/guides/payments/tips-service-charges) — set up tips, fixed fees, or service charges
* [**Refunds & Payouts** ](/docs/guides/payments/refunds-payouts)— process refunds and understand payout impact
# Dine-In (Order & Pay)
Source: https://storekit.com/docs/getting-started/store-types/dine-in-order-and-pay
Set up a dine-in Order & Pay store so customers can scan a QR code, browse the menu, and pay from their phone while seated at the table.
An Order & Pay store lets customers scan a QR code, browse the menu, place an order, and pay from their phone while seated at the venue.
This store type is best for dine-in venues that want customers to order directly from their table, reduce queueing, and send orders into the venue’s normal preparation workflow.
Order & Pay is available on the **storekit+** subscription. If you need to enable Order & Pay or confirm whether your store is eligible, contact storekit Support.
Order & Pay requires a **storekit+** subscription. Contact storekit Support if you need to enable this store type or confirm whether your store is eligible.
## How Order & Pay Stores Work
* Customers scan a QR code from their table or area
* Customers browse the dine-in menu from their phone
* Customers place and pay for their order through storekit
* Orders appear in the storekit order dashboard
* Orders can be sent to a connected POS or printer, depending on your setup
* Staff prepare and serve the order as part of the venue’s dine-in workflow
## Before You Start
Before going live, make sure you have:
* An active **storekit+** subscription
* Store profile details ready, including name, description, logo, address, website, and contact details
* Opening hours confirmed
* Order notification settings confirmed
* Fees, tips, and service charge settings confirmed
* A dine-in menu ready for customers to order from
* Table numbers, zones, or areas confirmed
* QR codes created for each table or area (one generic table selector QR is also possible)
* storekit Payments activated
* POS integration confirmed, if orders need to be sent to your POS
* Printing or kitchen routing configured, if used
* A staff process for monitoring and managing incoming orders
## How to Set Up an Order & Pay Store
From your storekit dashboard, go to **Stores**.
Open the store you want to set up, or create a new store if one has not been created yet.
Add the key information customers will see on your online store.
This can include:
* Store name
* Store description
* Website
* Logo
* Social links (Instagram)
* Store address
* Contact details
* Opening hours
* Order notification settings
* Fees, tips, and service charge settings
Order & Pay needs to be enabled for your store.
If you cannot see the Order & Pay setup options, contact storekit Support to confirm whether your store is eligible and enabled on the correct subscription.
Create or sync the menu customers will order from.
For standalone stores, you can create your menu directly in storekit by adding items and categories manually.
Depending on your setup, menus may also be created from a spreadsheet, PDF, or website import.
For integrated stores, your menu may need to be synced or published from your POS or integration partner.
Before going live, check:
* Categories
* Items
* Prices
* Modifier groups and options
* Availability
* Images and descriptions, if used
* Allergens or dietary information, if used (recommended)
Order & Pay orders are paid through **storekit Payments**.
Go to **Store Settings > Payments** and activate payments.
You may need to submit business, owner, and bank details before payments can be approved. This can include:
* Legal business or trading name
* Applicant or executive details
* Business owner details, if applicable
* Bank proof dated within the last 12 months
Customers can only pay through Order & Pay once payments have been activated.
Go to your store settings and confirm whether tips or service charges should be applied.
Tips are optional amounts customers can choose at checkout.
Service charges are configured as part of your store setup. Fixed service charges can be managed from **Store Settings > Operations**, while percentage-based service charges for Order & Pay stores need to be configured by storekit Support.
Order & Pay stores cannot have both percentage-based service charges and tips enabled at the same time.
Set up the table numbers, zones, or areas customers will order from.
Each QR code should direct the customer to the correct store and table or area, so staff know where the order should be served.
Order & Pay works best when each table or area has a unique QR code.
Each QR code should direct the customer to the correct store and table or area, so staff know where the order should be served.
Before printing or sharing QR codes, test that each code opens the correct store, menu, and table or area.
If you need branded QR codes or printed table materials, contact your account manager or storekit Support.
storekit also provides free downloadable QR codes from the dashboard. These are standard QR codes you can download and print yourself.
Bespoke QR plaques use dynamic QR codes, which are different from the free downloadable QR codes available in the storekit dashboard. Make sure you are using the correct QR code type before printing or ordering materials.
If orders need to be sent to a POS, printer, or kitchen display system, check that routing is configured correctly.
This may include:
* POS location mapping
* Printers
* Kitchen display screens
* Printing profiles
* Production centres
* Category or item routing
* Table information on printed tickets
Before going live, place test orders from different QR codes.
Check that:
* The QR code opens the correct store
* The correct table or area is attached to the order
* The menu, prices, modifiers, tips, and service charges are correct
* Payment is completed through storekit
* The order appears in the storekit order dashboard
* The order reaches the POS, printer, or kitchen display system if connected
* Staff can identify where the order should be served
Once setup and testing are complete, enable your store so customers can start placing orders.
Place QR codes on the tables or areas customers will use, and monitor the first live orders closely to confirm the dine-in workflow is working as expected.
## What Customers Can Do
With Order & Pay, customers can:
* Scan a QR code from their table or area
* Browse the menu from their phone
* Add items and modifiers to their order
* Add tips, if enabled
* Pay through storekit
* Place additional orders from the same table or area, if needed
## What Staff Need to Check
Staff should know how to:
* Monitor incoming Order & Pay orders
* Check the table or area attached to each order
* Confirm whether the order has been paid
* Prepare and serve orders through the venue’s normal workflow
* Handle failed, cancelled, or refunded orders
* Escalate POS, printing, or payment issues if needed
Order & Pay requires a **storekit+** subscription. Contact storekit Support if you need to enable this store type or confirm whether your store is eligible.
Always test your QR codes before going live to confirm they open the correct store, menu, and table or area selection flow.
Order & Pay stores cannot have both percentage-based service charges and tips enabled at the same time. If a percentage-based service charge is enabled, tipping is automatically disabled.
## Troubleshooting
#### Customers cannot open the menu
Check that the QR code points to the correct store and that the store is live.
If the QR code was created for a specific table or area, make sure that table or area still exists and is active.
#### The wrong table is showing on the order
Check how the QR code is configured.
For table-specific QR codes, make sure the QR code is linked to the correct table or area.
For a generic table-selector QR code, make sure customers are selecting the correct table or area before placing their order.
If QR codes were moved between tables, replace or relabel them so the correct table is attached to each order.
#### Orders are not reaching the POS
Check that the POS integration is connected and that the correct POS location is mapped.
Also check whether the order failed because of missing items, modifier issues, unavailable products, or POS connection errors.
#### Orders are reaching the POS but not printing
Check your POS printing setup.
This may include printers, kitchen display screens, printing profiles, production centres, or item/category routing.
#### Customers cannot pay using card/Apple Pay
Check that storekit Payments is active and that the available payment methods are configured correctly.
If payments are still pending verification, customers will be able to place cash orders only.
Once payments are active, cash ordering is normally switched off for the store. There is no cash toggle in the dashboard, so [contact support](/docs/getting-started/contact-support) if cash is still offered at checkout — see [cash and pay-on-collection orders](/docs/guides/payments/cash-payments).
#### Tips or service charges look wrong
Check your tips and service charge settings.
Tips are managed from **Store Settings > Gratuity**. Fixed service charges are managed from **Store Settings > Operations**. Percentage-based service charges for Order & Pay stores need to be configured by [storekit Support](/docs/getting-started/contact-support).
## Related
* [**Tips & Service Charges** ](/docs/guides/payments/tips-service-charges)— set up tips, fixed fees, or service charges
* [**POS-Connected Store**](/docs/getting-started/store-types/pos-connected-store) — set up a store connected to your POS
* [**POS Integration Overview**](/docs/guides/integrations/overview) — understand how POS integrations work
* [**Order Injection**](/docs/guides/integrations/pos/order-injection) — send storekit orders to your POS
* [**Tables and Areas**](/docs/guides/fulfillment/dine-in-tables) — set up table numbers, zones, or areas
* [**Order Batching**](/docs/guides/orders/advanced/order-batching) — control how Order & Pay orders are grouped
* [**Refunds & Payouts**](/docs/guides/payments/refunds-payouts) — process refunds and understand payout impact
* [**Managing Live Orders**](/docs/guides/orders/managing-live-orders) — handle incoming orders in real time
# Dine-In (Pay at Table)
Source: https://storekit.com/docs/getting-started/store-types/dine-in-pay-at-table
Set up Pay at Table for restaurants and bars so dine-in guests can scan a QR code, view their itemized bill, and pay from their phone via the POS.
Pay at Table (PAT) lets dine-in guests scan a QR code at their table, view their bill, and pay from their phone. Orders are placed through your venue's normal workflow (POS, waitstaff), and storekit handles the payment step — no card machines, no waiting for the bill.
This is different from [Order & Pay](/docs/getting-started/store-types/dine-in-order-and-pay), where customers also browse the menu and place orders through storekit. With Pay at Table, storekit only handles the bill and payment.
Pay at Table requires a **storekit+** subscription and a compatible POS integration. Contact [storekit Support](/docs/getting-started/contact-support) if you need to confirm whether your store is eligible.
## How Pay at Table Works
1. Staff take orders and send them to the POS as normal
2. When ready to pay, the guest scans a QR code at their table
3. The guest sees their itemized bill on their phone in real-time
4. The guest pays using card, Apple Pay, or Google Pay
5. Payment syncs to your POS and the bill closes automatically
The entire payment process takes under 30 seconds.
## Before You Start
Before enabling Pay at Table, make sure you have:
* An active **storekit+** subscription
* A compatible POS integration connected and working (see [POS Integration Overview](/docs/guides/integrations/overview))
* Table numbers or areas configured in your POS and in storekit
* storekit Payments activated
* QR codes ready to generate for each table
* A staff process for monitoring payment status
## How to Set Up Pay at Table
Pay at Table requires a **storekit+** subscription.
If you are not sure whether your store has the correct subscription, contact [storekit Support](/docs/getting-started/contact-support) with your store name and the venues you want to enable.
Pay at Table requires a compatible POS integration so that bills can sync to storekit in real-time.
Go to **Stores** → your store → **Settings** → **Integrations** and connect your POS system.
For POS-specific setup steps, see the relevant guide under [POS Integrations](/docs/guides/integrations/overview).
Not all POS systems support Pay at Table. Check the integration guide for your POS to confirm compatibility before proceeding.
Go to **Store Settings > Payments** and activate storekit Payments.
For the full setup steps, see [**Set Up Payments**](/docs/getting-started/launch/set-up-payments).
Guests cannot pay through Pay at Table until payments have been activated.
Configure your table numbers, zones, or areas so that each QR code links to the correct table and bill.
For detailed setup steps, see [**Dine-in & Tables**](/docs/guides/fulfillment/dine-in-tables).
Make sure table numbers in storekit match the table numbers in your POS — mismatched tables will prevent bills from syncing correctly.
Go to **Store Settings > Gratuity** and configure whether tips should appear at checkout.
Tip suggestions are shown to guests on the payment screen. You can configure the suggested amounts or disable tips entirely.
Digital tipping typically increases gratuity compared to traditional card machine prompts.
Each table needs a unique QR code that links to that table's bill.
From your storekit dashboard, go to the table setup section and generate QR codes for each table. You can download and print these QR codes yourself.
Before printing, test that each QR code opens the correct store and table.
storekit provides free downloadable QR codes from the dashboard. If you need branded QR plaques, contact your account manager or [storekit Support](/docs/getting-started/contact-support). Bespoke plaques use dynamic QR codes, which are different from the free downloadable codes.
Before going live, make sure staff understand:
* How to check whether a table has paid (via POS or storekit dashboard)
* How to handle partial payments and split bills
* What to do if a payment fails or does not appear
* That guests pay from their phone — no card machine is needed for Pay at Table orders
For more detail on checking payment status, see [**Checking Payments**](/docs/guides/pay-at-table/checking-payments).
Before going live, test the full flow with a real card:
* Place an order through the POS as normal
* Scan the table QR code from a phone
* Confirm the correct bill and items appear
* Complete a payment using a real card
* Verify the payment appears on the POS and in the storekit dashboard
* Test split payments, if you plan to offer them
Use a real card for testing — you'll receive the funds and can refund the order afterwards.
Once setup and testing are complete, place QR codes on every table and enable Pay at Table for your store.
Monitor the first live payments closely to confirm the flow is working as expected.
## Customer Experience
From the guest's perspective, Pay at Table works like this:
1. **Dine as normal** — order through waitstaff, enjoy the meal
2. **Scan the QR code** — when ready to pay, scan the code on the table with their phone camera
3. **View the bill** — see an itemized bill that updates in real-time as items are added in the POS
4. **Choose how to pay** — pay the full bill, split by item, or split evenly with others at the table
5. **Add a tip** — choose a tip amount, if enabled
6. **Pay** — tap to pay with card, Apple Pay, or Google Pay
7. **Done** — receive a digital receipt by email and leave when ready
Guests do not need to download an app or create an account.
## Multi-Store Setup
Pay at Table is enabled per store. If you operate multiple venues, you need to set up Pay at Table for each store individually.
For each store:
1. Confirm the storekit+ subscription is active
2. Connect the correct POS integration and location
3. Set up tables and generate QR codes specific to that store
4. Activate payments
5. Test the flow at each venue before going live
If you need to enable Pay at Table across many locations, contact [storekit Support](/docs/getting-started/contact-support) with the list of store names and venues. The support team can help coordinate a multi-site rollout.
## Troubleshooting
#### Guest scans the QR code but no bill appears
Check that:
* The table has an open bill on the POS
* The POS integration is connected and syncing correctly
* The QR code is linked to the correct table
* The store is live and Pay at Table is enabled
#### Payment does not appear on the POS
There may be a short sync delay. Check the storekit dashboard to confirm the payment was successful. If the payment shows as complete in storekit but is missing from the POS, see [**Checking Payments**](/docs/guides/pay-at-table/checking-payments) for reconciliation steps.
#### Guest paid the wrong table's bill
Make sure QR codes are clearly placed and match the correct table number. If QR codes were moved between tables, replace or relabel them.
#### Tips or service charges look incorrect
Check your tip and service charge settings in **Store Settings > Gratuity** and **Store Settings > Operations**.
## Related
* [**Pay at Table Overview**](/docs/guides/pay-at-table/overview) — detailed feature overview and benefits
* [**Checking Payments**](/docs/guides/pay-at-table/checking-payments) — verify payment status from POS or dashboard
* [**Dine-in & Tables**](/docs/guides/fulfillment/dine-in-tables) — set up table numbers, zones, or areas
* [**POS Integration Overview**](/docs/guides/integrations/overview) — understand how POS integrations work
* [**Order & Pay**](/docs/getting-started/store-types/dine-in-order-and-pay) — alternative dine-in mode where customers also order through storekit
* [**Tips & Service Charges**](/docs/guides/payments/tips-service-charges) — set up tips, fixed fees, or service charges
* [**Refunds & Payouts**](/docs/guides/payments/refunds-payouts) — process refunds and understand payout impact
* [**Contact Support**](/docs/getting-started/contact-support) — get help from the storekit team
# POS-Connected Store
Source: https://storekit.com/docs/getting-started/store-types/pos-connected-store
Connect storekit to your POS system so orders, menus, printing, and payments flow into your venue workflow. Available on the storekit+ subscription.
## Supported POS Systems
storekit supports POS integrations for selected systems, including:
* [Centegra](/docs/guides/integrations/pos/centegra)
* [Lightspeed K-Series](/docs/guides/integrations/pos/lightspeed/overview)
* [PointOne](/docs/guides/integrations/pos/pointone)
* [TISSL](/docs/guides/integrations/pos/tissl)
* [Toast](/docs/guides/integrations/pos/toast/overview)
* [Zonal / Aztec](/docs/guides/integrations/pos/zonal)
POS integration availability depends on your store setup, subscription, and the features supported by each POS.
For POS-specific setup steps, see the relevant POS integration guide.
## How POS-Connected Stores Work
* Customers place orders through storekit or a connected ordering channel
* Orders can be sent to your connected POS
* The POS may send orders to kitchen printers or a kitchen display system
* Menus may be synced from your POS or managed in storekit, depending on the integration
* Payments are normally processed through storekit, except for [Pay at Table](/docs/getting-started/store-types/dine-in-pay-at-table) setups where payment may be taken externally through the venue’s POS or card machine.
For more detail on integration types and supported POS features, see [**POS Integration Overview**.](/docs/guides/integrations/overview)
## Before You Start
Before going live, make sure you have:
* An active **storekit+** subscription
* Access to your storekit dashboard
* Access to your POS account or back office
* The correct POS location or site details
* A menu ready to import, sync, or link
* Payment setup confirmed
* Printing or kitchen routing configured in the POS, if used
* A process for testing orders before launch
## How to Set Up a POS-Connected Store
From your storekit dashboard, go to **Stores**.
Open the store you want to connect, or create a new store if one has not been created yet.
Go to **Stores** → your store → **Settings** → **Integrations**.
Select the POS integration you want to connect and enter the required details.
The setup required depends on your POS. Some integrations may need an API key, site ID, location ID, or other account details.
For more information, see the relevant POS integration guide.
Make sure the storekit store is connected to the correct POS location.
This is important for order routing, menu sync, printing, and reporting.
Set up the menu customers will order from.
Depending on the POS integration, your menu may be:
* Synced from your POS
* Imported into storekit
* Managed directly in storekit
* Linked to POS product IDs or PLUs
* Managed through an integration partner
For more detail, see [**POS Menu Sync**.](/docs/guides/menu/pos-menu-sync)
Before going live, check that the menu is correct.
Review:
* Categories
* Items
* Prices
* Modifier groups and options
* Availability
* Images and descriptions, if used
* Product IDs or PLUs, if required
Go to **Store Settings > Operations**.
Choose which fulfilment types this store should support, such as:
* Pickup
* Delivery
* Dine-in / Order & Pay
Pickup and delivery can be enabled separately.
For detailed setup steps, see [**Enabling Pickup**](/docs/enabling-pickup) and [**Enabling Delivery**](/docs/guides/fulfillment/delivery/enabling-delivery).
For POS-connected stores, payments are normally processed through **storekit Payments**.
The main exception is **Pay at Table**, where the customer may pay externally through the venue’s POS card machine or another in-venue payment method, depending on the setup.
Before going live, confirm:
* storekit Payments is active
* The correct payment methods are available at checkout
* Pay at Table payment behaviour is understood, if used
* Staff know where to check whether an order or bill has been paid
If orders print through your POS, check that printing and routing are configured correctly in the POS.
This may include:
* Printers
* Kitchen display screens
* Printing profiles
* Production centres
* Category or item routing
Before going live, place test orders for each order type you plan to support.
Test as many items and modifiers from different categories as needed (e.g., drinks and food are routed to the correct printers).
Check that:
* The order appears in storekit
* The order reaches the correct POS location
* Items, modifiers, notes, discounts, tips, and service charges are correct
* Pickup, delivery, or table details are included
* Pre-order times are passed correctly, if used
* Order/item notes are displayed
* Printing or kitchen routing works as expected
* Payment status is correct
Once testing is complete, enable the store or connected channel so customers can start placing orders.
Continue monitoring the first live orders to confirm the POS integration is working as expected.
## What May Be Controlled by the POS
For POS-connected stores, some settings may be controlled outside storekit.
This can include:
* Menu items
* Prices
* Modifiers
* Availability
* Tax settings
* Printing
* Kitchen routing
* Table or bill details
If something does not update in storekit, check whether it needs to be changed in the POS first and then synced.
POS integrations require a **storekit+** subscription. Contact storekit Support if you need to upgrade your plan or confirm whether your store is eligible.
Always place test orders before launch to confirm orders reach the correct POS location and include the right items, modifiers, prices, and fulfilment details.
If the wrong POS location is connected, orders may be sent to the wrong venue or fail to send.
## Troubleshooting
#### Menu changes are not appearing in storekit
Check where the menu is managed.
If the menu is controlled by the POS, update the menu in the POS first, then run a menu sync if required.
For more detail, see [**POS Menu Sync**](/docs/guides/menu/pos-menu-sync).
#### Orders are not reaching the POS
Check that the POS integration is connected and that the correct POS location is mapped.
Also check whether the order failed because of missing items, modifier issues, unavailable products, or POS connection errors.
#### Orders are reaching the POS but not printing
Check your POS printing setup.
This may include printers, kitchen display screens, printing profiles, production centres, or item/category routing.
#### Prices or modifiers look different
Check whether prices and modifiers are managed in storekit, the POS, or an integration partner.
Some integrations use POS-side pricing, while others use storekit menu settings.
#### Pre-orders are not showing correctly in the POS
Check whether your POS integration supports pre-orders and whether scheduled order times are passed through. This is often called **order buffering** in storekit and integrated POS systems.
Place a test pre-order before going live.
## Related
* [**POS Integration Overview**](/docs/guides/integrations/overview) — understand how POS integrations work
* [**POS Menu Sync** ](/docs/guides/menu/pos-menu-sync)— import or update menu data from your POS
* [**Order Injection**](/docs/guides/integrations/pos/order-injection) — send storekit orders to your POS
* [**Fallback Printing** ](/docs/guides/printing/fallback-printing)— automatically print orders when POS order injection fails
* [**Enabling Pickup**](/docs/enabling-pickup) — enable pickup/collection orders for your store
* [**Enabling Delivery**](/docs/guides/fulfillment/delivery/enabling-delivery) — enable delivery orders for your store
* [**Pre-orders**](/docs/guides/orders/advanced/pre-orders) — let customers order for a future date or time
# Supported Regions
Source: https://storekit.com/docs/getting-started/supported-regions
Reference for the countries, languages, and currencies supported by storekit, including which regions support storekit Payments and local payment methods.
storekit is available in multiple countries with support for local languages and payment processing.
## Supported Countries
| Country | Language Support | Payments |
| ------------------- | ------------------------- | -------- |
| 🇬🇧 United Kingdom | ✓ English | ✓ GBP |
| 🇮🇪 Ireland | ✓ English | ✓ EUR |
| 🇩🇪 Germany | ✓ German | ✓ EUR |
| 🇦🇹 Austria | ✓ German | ✓ EUR |
| 🇨🇭 Switzerland | ✓ German, French, Italian | ✓ CHF |
| 🇫🇷 France | ✓ French | ✓ EUR |
| 🇧🇪 Belgium | ✓ French, Dutch | ✓ EUR |
| 🇳🇱 Netherlands | ✓ Dutch | ✓ EUR |
| 🇪🇸 Spain | ✓ Spanish | ✓ EUR |
| 🇮🇹 Italy | ✓ Italian | ✓ EUR |
| 🇵🇹 Portugal | ✓ Portuguese | ✓ EUR |
| 🇬🇷 Greece | ✓ Greek | ✓ EUR |
| 🇭🇷 Croatia | ✓ English | ✓ EUR |
| 🇨🇾 Cyprus | ✓ English | ✓ EUR |
| 🇪🇪 Estonia | ✓ English | ✓ EUR |
| 🇱🇻 Latvia | ✓ English | ✓ EUR |
| 🇱🇹 Lithuania | ✓ English | ✓ EUR |
| 🇱🇺 Luxembourg | ✓ French, German | ✓ EUR |
| 🇲🇹 Malta | ✓ English | ✓ EUR |
| 🇸🇰 Slovakia | ✓ Slovak | ✓ EUR |
| 🇸🇮 Slovenia | ✓ English | ✓ EUR |
| 🇸🇪 Sweden | ✓ Swedish | ✓ SEK |
| 🇩🇰 Denmark | ✓ English | ✓ DKK |
| 🇳🇴 Norway | ✓ English | ✓ NOK |
| 🇫🇮 Finland | ✓ English | ✓ EUR |
| 🇵🇱 Poland | ✓ Polish | — |
| 🇺🇸 United States | ✓ English | ✓ USD |
| 🇨🇦 Canada | ✓ English, French | ✓ CAD |
| 🇦🇺 Australia | ✓ English | ✓ AUD |
| 🇳🇿 New Zealand | ✓ English | ✓ NZD |
| 🇲🇽 Mexico | ✓ Spanish | — |
| 🇿🇦 South Africa | ✓ English | ✓ ZAR |
| 🇦🇱 Albania | ✓ English | ✓ ALL |
| 🇧🇬 Bulgaria | ✓ English | ✓ EUR |
| 🇹🇷 Turkey | ✓ Turkish | — |
| 🇲🇦 Morocco | ✓ French | — |
## Supported Languages
storekit's ordering experience is fully translated into:
* English (UK, US)
* German (Germany, Austria)
* French
* Spanish (Spain, Mexico)
* Italian
* Dutch
* Portuguese
* Swedish
* Polish
* Greek
* Turkish
* Chinese (Simplified, Traditional)
* Slovak
Store dashboards are available in English. The customer-facing ordering experience supports all listed languages.
## Supported Currencies
Payment processing is available for the following currencies:
| Currency | Code | Regions |
| ------------------ | ---- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| British Pound | GBP | United Kingdom |
| Euro | EUR | Ireland, Germany, Austria, France, Belgium, Netherlands, Spain, Italy, Portugal, Greece, Finland, Croatia, Cyprus, Estonia, Latvia, Lithuania, Luxembourg, Malta, Slovakia, Slovenia, Bulgaria |
| US Dollar | USD | United States |
| Canadian Dollar | CAD | Canada |
| Australian Dollar | AUD | Australia |
| New Zealand Dollar | NZD | New Zealand |
| Swiss Franc | CHF | Switzerland |
| Swedish Krona | SEK | Sweden |
| Danish Krone | DKK | Denmark |
| Norwegian Krone | NOK | Norway |
| South African Rand | ZAR | South Africa |
| Albanian Lek | ALL | Albania |
## Expanding to a New Region
If you're looking to launch in a country not listed above, [contact our team](/docs/getting-started/contact-support) to discuss availability and timelines.
# What is storekit?
Source: https://storekit.com/docs/getting-started/what-is-storekit
Learn what storekit is and how the QR code ordering and payment platform helps restaurants, bars, and hospitality venues take orders without an app or download.
storekit is a mobile ordering and payment platform built for restaurants, bars, and hospitality venues. Customers place orders through a QR code (in-venue) or a shared link (off-premise) — no app download required.
## How It Works
Customers scan a QR code at your venue or open your ordering link on their phone. They browse your digital menu, place an order, and pay — all from their device.
## Ordering Modes
storekit supports three core ordering modes:
| Mode | Description |
| ------------------------- | --------------------------------------------------------------------------------- |
| **Order & Pay** | Dine-in ordering where customers order and pay from their table via QR code |
| **Collection & Delivery** | Takeaway ordering for pickup or delivery, accessible via a shared link or QR code |
| **Pay at Table** | Bill settlement where customers view and pay their bill directly from their phone |
## What You Get
* **Fully customisable digital menu** — products, categories, modifiers, images, and allergen information
* **Back-office dashboard** — manage orders, view reports, configure settings, and control your menu in real-time
* **No customer app required** — your menu works in any mobile browser
## Key Benefits
* **Increase revenue** — upsell with modifiers, suggested items, and promotions
* **Reduce wait times** — customers order directly without queuing
* **Streamline operations** — orders flow straight to your kitchen via dashboard, POS, or printer
* **Capture customer data** — collect emails and phone numbers at checkout for marketing
* **Integrate with your stack** — connect to POS systems, delivery providers, and analytics tools
## Next Steps
Set up your store and start taking orders
See where storekit is available
# Auto-Applied Discounts
Source: https://storekit.com/docs/guides/discounts/auto-applied
Set up auto-applied discounts that activate at checkout without requiring a code. Reward customers automatically when their order matches your conditions.
Auto-applied discounts activate automatically when a customer's order meets the configured conditions. No code is needed — the discount appears in the cart without any action from the customer.
Auto-applied discounts require storekit+
## How It Works
1. You create a discount and toggle **Auto apply** on
2. While the discount is active — enabled, within its date range, on an allowed day and time, and matching the order type — it attaches to any basket that meets the minimum spend. If several auto-applied discounts qualify at once, only one is attached — storekit picks by type, not by value (see [Buy X Get Y →](/docs/guides/discounts/buy-x-get-y#combining-with-other-settings))
3. The discount value is then worked out from the basket. Category and product restrictions are applied at that point, so only eligible items are discounted
Attaching and calculating are two separate steps, and that ordering matters when the discount is restricted to part of the menu — see [Restricted Discounts and Baskets With No Eligible Items](#restricted-discounts-and-baskets-with-no-eligible-items).
## Benefits
* **Frictionless savings** - Customers don't need to find or remember a code
* **Encourages bigger baskets** - Customers see the discount potential and add more items
* **Perfect for targeted promotions** - Apply to specific items or categories seamlessly
* **Higher conversion** - Removing the code entry step reduces checkout friction
## Creating an Auto-Applied Discount
1. Go to **Marketing → Discounts** in the sidebar
2. Click **Create Discount**
3. Choose the **Type** (**Percentage**, **Fixed**, or **Free delivery**)
4. Enter the **Value**
5. Toggle **Auto apply** on
6. To limit the discount to part of the menu, click **Manage Restrictions** under **Stores**
7. Configure any additional restrictions
8. Click **Create Discount**
## Targeting Options
Scope is set per store under **Stores** → **Manage Restrictions** → **Restrict by**:
| Scope | Description | Example |
| -------------------------------- | ---------------------------------------------------- | --------------------------- |
| No restrictions | Discount applies to the entire order | 10% off all orders over £20 |
| **Restrict by** → **Categories** | Only items in the selected categories are discounted | 20% off desserts |
| **Restrict by** → **Products** | Only the selected products are discounted | 50% off featured item |
Redemption limits do not work with auto-applied discounts. If you need to limit the number of times a discount can be used, use a [code-based discount](/docs/guides/discounts/discount-codes) instead.
## Restricted Discounts and Baskets With No Eligible Items
A restricted auto-applied discount attaches to the basket whenever it is active, whether or not the basket contains any of the items it covers. Eligibility is applied when the value is calculated, not when the discount is chosen, so a basket with no eligible items gets a discount worth £0.00 rather than no discount at all.
**Example:** a Happy Hour discount is 20% off the Cocktails category, auto-applied, valid daily from 5pm. A customer orders two Margherita Pizzas for collection at 6pm and no drinks. The discount attaches to their order, no item is eligible, and the order total is unchanged.
What each side sees for that order:
| Where | What is shown |
| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Customer's basket on the menu | No discount line. The line only appears once the discount reduces the total |
| Customer's basket at checkout | A **Discount code** line, with the code shown as applied. For a percentage discount it reads **Discount code** (20%) with a value of £0.00. For a fixed-amount discount it shows the discount's face value (for example -£5.00) even though the total is unchanged |
| Merchant's view of the order | A **Discount** line with the discount code and a value of (£0.00) |
Nothing is deducted from the items, and the customer pays their full price. The order still counts towards the discount's usage total. In **All Orders**, the **Discounted** filter only returns orders where the discount reduced the total, so a £0.00 order is not counted as discounted.
### Delivery Fees Are Discounted Separately
Menu restrictions cover items, not the delivery fee, so on a delivery order the same discount can still reduce the fee when no item is eligible:
* A percentage discount takes its percentage off the delivery fee as well, unless **Exclude delivery fee from discount** is toggled on for it. The Happy Hour example ordered for delivery would take 20% off the fee, and the total would drop by that much
* A fixed-amount discount larger than the basket subtotal has the remainder taken off the delivery fee, again unless **Exclude delivery fee from discount** is on
Turn **Exclude delivery fee from discount** on if a restricted discount should only ever affect the items it covers.
There is no setting that makes an auto-applied discount attach only when the basket contains eligible items, and no way to hide the zero-value line at checkout. If the discount must be invisible unless it actually applies, use a [code-based discount](/docs/guides/discounts/discount-codes) instead: nothing is shown until the customer enters the code.
## Combining with Other Settings
* [**Minimum spend**](/docs/guides/discounts/minimum-spend-maximum-discount) - Only apply when the order reaches a certain value
* [**Maximum discount**](/docs/guides/discounts/minimum-spend-maximum-discount) - Cap the discount amount on larger orders
* [**Availability limits**](/docs/guides/discounts/limiting-availability) - Restrict to specific days, hours, or order types
* [**Scheduling**](/docs/guides/discounts/scheduling) - Automatically activate and deactivate the promotion
## Auto-Applied vs Code-Based
| Feature | Auto-Applied | Code-Based |
| ----------------- | -------------------------------- | ------------------------------------ |
| Customer action | None | Enter code at checkout |
| Visibility | Automatic in cart | Must know the code |
| Best for | Site-wide offers, category deals | Targeted campaigns, influencer codes |
| Redemption limits | Not supported | Supported |
Use auto-applied discounts for promotions you want every eligible customer to receive, and [discount codes](/docs/guides/discounts/discount-codes) for exclusive offers where you want to control distribution.
# Buy X Get Y Discounts
Source: https://storekit.com/docs/guides/discounts/buy-x-get-y
Run buy-one-get-one (BOGO) promotions in storekit. Discount a second item when a customer buys more than one of the same eligible product or category.
Buy X Get Y is storekit's buy-one-get-one (BOGO) discount. When a customer buys
more than one item from an eligible product or category, the cheaper item is
discounted — by a set percentage, or made free.
Buy X Get Y discounts require storekit+
## How It Works
You choose a set of eligible items — either specific products or a whole
category. The discount only ever applies **within that set**:
1. storekit looks at every eligible item in the basket, counting quantities
(three of the same drink counts as three items).
2. Those items are paired up, most expensive first. In each pair the more
expensive item is charged at full price and the cheaper item is discounted.
3. The discount on the cheaper item is a percentage you choose — up to 100%,
which makes it free.
Because the deal pairs items **within the same eligible set**, the reward is
always another one of the qualifying items. The customer sees the reduced price
in their basket automatically once they have added enough eligible items.
## Examples
These are the shapes Buy X Get Y can actually produce. In every case the
qualifying item and the reward come from the **same** product or category.
| Eligible items | Result | Use case |
| -------------------------------------- | ----------------------------------------- | ----------------------- |
| Any product in the **Pizzas** category | Buy one pizza, get a second pizza 50% off | Encourage larger orders |
| Any product in the **Coffee** category | Buy one coffee, get a second coffee free | Classic 2-for-1 |
| A specific cocktail | Two of that cocktail for the price of one | Happy-hour BOGO |
| Any product in the **Sides** category | Buy two sides, get the cheaper one free | Move add-on stock |
## What the Kitchen and Your POS Receive
The deal changes the price, not the basket. The customer adds both units
themselves, so the order line carries the full quantity and the kitchen sees two
of the item. Two identical units arrive as one line with a quantity of two; if
the customer picks different modifiers or types a different note on each, they
arrive as two separate lines.
The saving is applied to the order, not to the line. Items are sent to your POS
at their full price, and the discount arrives against the order — as an
order-level total on most integrations, or as a separate discount line on TISSL.
Either way the ticket never reads "second one free" beside the item.
There is no way to attach a preparation instruction to an item on an order sent
to your POS. Products have no kitchen-note or prep-note field in the dashboard,
and a discount cannot add one, so nothing tells the kitchen to "prepare 2"
beyond the quantity on the line. The only note that travels with an item is one
the customer types: set **Item Notes** to **Expanded** or **Collapsed** at
**Stores** → your store → **Settings** → **Operations**, and the note they add
is sent with that item — see
[Order Injection →](/docs/guides/integrations/pos/order-injection).
The real risk is a customer adding one unit and expecting two, so tell them what
to do. Add a notice at **Stores** → your store → **Settings** →
**Store Notices** explaining that they must add two of the item to get the deal
— see [Store notices →](/docs/guides/store-settings/store-notices).
Some stores instead duplicate the product and rename the copy ("Buy one get one
free") so the offer is spelled out on the ticket. That is a manual workaround
rather than a storekit feature: you maintain two versions of the item, sales
split across both in your reports, and on a POS-linked menu the duplicate has to
exist in your POS as well.
## What Buy X Get Y Cannot Do
Buy X Get Y is a buy-one-get-one on the *same* eligible items. It **cannot**
give a free or discounted item that is different from the item the customer
bought, and there is no "conditional bundle" discount in storekit. In
particular, you cannot configure:
* **A different reward item** — e.g. "buy 2 pizzas, get a free dip". The reward
is always another one of the eligible items, never a separate product.
* **A cross-category trigger and reward** — e.g. "buy any main, get a free
starter", or "buy a burger, get a free side". The trigger and the reward are
the same set.
* **A fixed quantity threshold** — e.g. "buy exactly 3, get the 4th free". The
deal pairs eligible items automatically (the cheaper of every two is
discounted); it is not a "buy N to unlock" rule.
* **Auto-adding the reward** — the customer must add the items themselves. The
discount recalculates the price of items already in the basket; it never puts
an extra item in the cart, so the kitchen only ever receives what the customer
added: add one, and the ticket says one.
### Building "buy 2 pizzas, get a free dip"
Because that is a *different-item* reward, use one of these instead:
* **A bundle product** — create a single menu product (for example "2 Pizzas +
Dip") priced as the bundle, using modifiers to let the customer pick their
pizzas. This is the reliable way to give a specific free extra with a
purchase.
* **A [minimum-spend discount](/docs/guides/discounts/minimum-spend-maximum-discount)** —
if the goal is simply to reward larger orders, set a percentage or fixed
discount that only applies once the basket reaches a spend threshold. This
does not add a specific free item, but it rewards the larger order.
## Setting Up
The Buy X Get Y type is **not** available to select in the dashboard discount
form — it is configured by the storekit team. To set one up:
1. Decide on the eligible product(s) or category
2. Choose whether the cheaper item is free or at a reduced percentage
3. Contact support with your requirements
4. The team will configure the discount for your store
Contact your storekit support team to configure Buy X Get Y discounts for your store.
## Combining with Other Settings
Buy X Get Y discounts can be combined with:
* **[Availability limits](/docs/guides/discounts/limiting-availability)** - Restrict to specific days, hours, or order types
* **[Scheduling](/docs/guides/discounts/scheduling)** - Run the promotion for a set period
* **[Redemption limits](/docs/guides/discounts/limiting-redemptions)** - Control how many times the deal can be used
Only one storekit discount applies per order, so a Buy X Get Y deal does not
stack with a code the customer enters or with another eligible promotion. When
several automatic discounts qualify, storekit chooses by type rather than by
value — free delivery on a delivery order first, then a fixed amount, then a
percentage, and Buy X Get Y last — so another automatic promotion wins even when
the deal would save the customer more. Rewards from a connected loyalty provider
are calculated by that provider and sit outside this rule: a Piggy reward in the
basket takes the place of the storekit discount, while a Como benefit is deducted
alongside it.
# Delivery Fee in Discounts
Source: https://storekit.com/docs/guides/discounts/delivery-fee-inclusion
Choose whether the delivery fee is included in or excluded from a storekit discount calculation. Control how much customers save and protect your margins.
When creating a discount, you can choose whether the delivery fee is included in or excluded from the discount calculation. This setting affects how the discount amount is calculated and what the customer ultimately pays.
## How It Works
| Setting | Behaviour | Best For |
| ------------------------ | ---------------------------------------------- | ------------------------------------- |
| **Include delivery fee** | Delivery fee is part of the discountable total | Maximising perceived customer savings |
| **Exclude delivery fee** | Discount applies to product total only | Protecting delivery fee revenue |
## Configuring the Setting
1. Go to **Marketing → Discounts** in the sidebar
2. Click **Create Discount** or edit an existing discount
3. In the discount settings, choose whether to **include** or **exclude** the delivery fee
4. Click **Create Discount** (or **Save Discount** when editing)
## Impact on Percentage Discounts
This setting is most important for [percentage discounts](/docs/guides/discounts/percentage-discounts), where it directly affects the calculated amount.
### Example
A 20% discount on an order with a £30 product total and a £5 delivery fee:
| Setting | Discountable Amount | Discount (20%) | Customer Pays |
| ------------------------ | ------------------------- | -------------- | ------------- |
| **Include delivery fee** | £35 (products + delivery) | £7 | £28 |
| **Exclude delivery fee** | £30 (products only) | £6 | £29 |
## Impact on Fixed Discounts
For [fixed discounts](/docs/guides/discounts/fixed-discounts), this setting affects whether the delivery fee counts toward the order total when evaluating [minimum spend](/docs/guides/discounts/minimum-spend-maximum-discount) requirements.
## Impact on Free Delivery Discounts
This setting does not affect [free delivery discounts](/docs/guides/discounts/free-delivery), as those always remove the full delivery fee regardless.
Excluding the delivery fee from discount calculations is a simple way to protect your delivery margin while still offering attractive discounts on products.
# Discount Codes
Source: https://storekit.com/docs/guides/discounts/discount-codes
Create percentage, fixed amount, and free delivery discount codes in storekit. Set custom rules, redemption limits, and expiry dates for any promotion.
Discount codes let customers enter a code at checkout to receive a discount. This guide covers creating and managing discount codes.
## Creating a Discount Code
1. Go to **Marketing → Discounts** in the sidebar
2. Click **Create Discount**
3. Enter a **Discount code** (minimum 3 characters, letters and numbers only) — or click **Generate**
4. Choose the **Type**:
* **Percentage** (e.g., 10% off)
* **Fixed** (e.g., £5 off)
* **Free delivery**
5. Enter the **Value**
6. Select the stores the code applies to under **Stores**
7. Configure any restrictions (see below)
8. Click **Create Discount**
To change an existing code, open it from the **Discounts** list (click its row) and click **Save Discount**.
## Discount Code Rules
* Minimum 3 characters
* Letters and numbers only (no spaces or special characters)
* Case insensitive (SAVE20 = save20)
* Must be unique
## Restrictions
### Availability
Limit when the discount can be used:
* **Days** - Only valid on specific days (e.g., weekends)
* **Time period** - Only valid during certain hours (e.g., 12pm-3pm for lunch deals), or leave **All day** on
* **Start date** / **End date** - Valid between specific dates
### Products and Categories
Under **Stores**, click **Manage Restrictions** to limit the code to selected products or selected categories in a store. See [Give one product away free](#give-one-product-away-free-with-a-code) for the full walkthrough.
### Order Requirements
* **Minimum spend** - Order must meet a minimum value
* **Order types** - Limit to **Delivery**, **Pickup**, or **InStore**
### Limits
* **Total redemptions** - Maximum times the code can be used across all customers
* **Per-customer redemptions** - Maximum times each customer can use the code
* **Maximum discount amount** - Caps the cash value of the discount on a single order (shown for **Percentage** codes only)
### Delivery Fee
Choose whether the discount:
* Applies before or after the delivery fee
* Includes the delivery fee in percentage calculations
## Managing Discounts
### Viewing Usage
Click on a discount to see:
* Total redemptions
* Revenue impact
* Recent orders using the code
### Editing Discounts
Click a discount's row in the **Discounts** list to open it, change its settings, then click **Save Discount**. Changes apply to future orders only.
### Deactivating Discounts
Open the discount and click **Deactivate** to stop it being used. It stays in your list (filter the list by **Archived** to find it) and can be brought back with **Activate**.
There is no way to delete a discount in the dashboard — **Deactivate** is the only removal action.
## Give One Product Away Free with a Code
This recipe covers the common "free coffee" promotion: a code that takes one named product to £0 without giving away anything else in the basket. It is also the safe way to handle products whose price is built out of modifier options.
### 1. Create the code and set the type
1. Go to **Marketing → Discounts** in the sidebar and click **Create Discount**
2. Enter the **Discount code** (for example `RCSEPT2627`)
3. Set **Type** to **Percentage** and **Value** to `100`
4. Under **Stores**, select every store where the code should work
### 2. Restrict the code to the product
1. Under **Stores**, click **Manage Restrictions**
2. Pick the **Store** you are configuring
3. Set **Restrict by** to **Products** (choose **Categories** only if every item in a category should be free)
4. Tick the product(s) that should be free — for example the Americano and the Tea
5. Click **Save Restrictions** and repeat for each store
Restrictions can only target products **or** categories on a given store, not both. Choose **Products** when a single named item should be free — a category restriction makes every item in that category free.
**Manage Restrictions** is greyed out in two situations:
* **No tooltip** — no store is ticked yet. Select at least one store under **Stores** first.
* **Tooltip "Product and category restrictions are available on storekit plus"** — restrictions are a storekit+ feature. If you already subscribe to storekit+ and still see this, [contact support](/docs/getting-started/contact-support) to have it enabled on your account, then refresh the page.
### 3. Understand what a product restriction actually discounts
A product-restricted percentage discount applies to the **full price of each matching item, including its modifier options** — not just the product's base price.
That is deliberate: many menus put the real price in the modifiers (a Tea priced at £0.00 with a required size modifier option that carries the £2.50). Including modifiers is the only way a 100% code takes such an item to £0.
The side effect is the trap to watch for: any **paid** extra attached to the same item is discounted too. If the customer adds a £2.50 brownie as a modifier on the Tea, a 100% code makes the brownie free as well. There is no per-modifier control and no "exclude modifiers" switch in the dashboard.
### 4. Cap the damage with Maximum discount amount
In the **Limits** section, turn on **Maximum discount amount** and enter the most the code should ever be worth on one order — the highest price the free item can legitimately reach, for example `2.50`.
The cap is applied to the calculated discount for the whole order, after the percentage is worked out. So on a 100% Tea code capped at £2.50:
| Basket | Discount before cap | Discount applied | Customer pays |
| ----------------------------------- | ------------------- | ---------------- | ----------------- |
| Tea (£2.50 in modifiers) | £2.50 | £2.50 | £0.00 for the Tea |
| Tea + paid brownie modifier (£2.50) | £5.00 | £2.50 | £2.50 |
| 2 × Tea | £5.00 | £2.50 | £2.50 |
**Maximum discount amount** only appears when **Type** is **Percentage**. Without it, a 100% product-restricted code makes every matching item — and every paid extra on it — free, however many the customer adds.
Set a **Minimum spend** in the same **Limits** section if the customer must buy something else to qualify.
### 5. Limit who can use it and when
* **Per-customer redemptions** — set this to cap each customer (for example `4` uses each). Leave **Total redemptions** off if any number of customers may use the code. See [Limiting redemptions](/docs/guides/discounts/limiting-redemptions).
* **Schedule** — set **Start date** and **End date** to run the code for one month only. See [Scheduling discounts](/docs/guides/discounts/scheduling).
* **Availability** — use **Days**, **Time period** / **All day**, and **Order types** to narrow the offer further.
### Worked example
A merchant wanted nine monthly codes (`RCSEPT2627` through `RCMAY2627`), each giving a free Americano or Tea over a minimum spend, up to 4 times per customer, with no limit on the number of customers:
| Setting | Value |
| ----------------------------------------- | ------------------------------------------------- |
| **Type** | **Percentage** |
| **Value** | `100` |
| **Manage Restrictions** → **Restrict by** | **Products** → Americano, Tea |
| **Minimum spend** | The qualifying order value |
| **Maximum discount amount** | `2.50` (stops a paid brownie modifier being free) |
| **Total redemptions** | Off — unlimited customers |
| **Per-customer redemptions** | `4` |
| **Start date** / **End date** | First and last day of that month |
Each monthly code has to be created by hand: [bulk import](/docs/guides/discounts/bulk-import) cannot set product restrictions or **Maximum discount amount**. Open the previous month's code and use **Create Discount** on a fresh form with the same settings, changing only the code and dates.
## Tips
* **Use memorable codes** - SUMMER20 is better than XYZ123
* **Set expiry dates** - Prevent old codes from being used indefinitely
* **Limit redemptions** - Protect against excessive use
* **Track performance** - Review which discounts drive the most orders
* **Test before sharing** - Place a test order to verify the discount works as expected
## Troubleshooting
Check the following:
1. **Is the code active?** — The discount must be toggled on in Discounts.
2. **Has it exceeded its usage limit?** — Check total redemptions against the configured maximum.
3. **Does the order meet the minimum spend?** — The subtotal must reach the required value.
4. **Is the code within its valid date range?** — Verify the start and end dates are current.
Product and category restrictions are a storekit+ feature, and the button stays greyed out with the tooltip **Product and category restrictions are available on storekit plus** until the feature is switched on for your account. If you already subscribe to storekit+, [contact support](/docs/getting-started/contact-support) and ask for product and category restrictions to be enabled, then refresh the page.
If the button is greyed out with no tooltip, select at least one store under **Stores** first.
If the code is already live, click **Deactivate** while you wait — without restrictions it discounts the whole basket. Once the button is enabled, open the code, add the restrictions, click **Save Discount**, then click **Activate**. See [Editing Discounts](#editing-discounts).
The code may be targeting specific products or categories only. Check the targeting settings for the discount — if product-level targeting is enabled, the discount only applies to matching items in the cart, not the entire order total.
# Fixed Monetary Discounts
Source: https://storekit.com/docs/guides/discounts/fixed-discounts
Offer a set monetary amount off the order total with fixed-value discounts in storekit. Predictable cost, easy for customers to understand at a glance.
Fixed monetary discounts reduce the order total by a specific amount. They're straightforward for customers to understand and give you predictable control over the discount cost.
A fixed discount applies its **full value on every order** it is used on. For example, a £100 discount takes £100 off each qualifying order — it does not work like store credit or deplete a running balance. To limit your total exposure, set a [per-customer or global usage limit](/docs/guides/discounts/limiting-redemptions).
## Creating a Fixed Discount
1. Go to **Marketing → Discounts** in the sidebar
2. Click **Create Discount**
3. Enter a **discount code** (minimum 3 characters, letters and numbers only)
4. Select **Fixed** as the discount type
5. Enter the **discount amount** (e.g., £5)
6. Configure any restrictions (see below)
7. Click **Create Discount** (or **Save Discount** when editing)
## When to Use Fixed Discounts
Fixed discounts are particularly effective for:
| Use Case | Example |
| -------------------------- | ----------------------------- |
| **First order incentive** | £5 off your first order |
| **Spend threshold reward** | £10 off orders over £50 |
| **Simple promotions** | £3 off any order this weekend |
| **Partner deals** | £7 off with a unique code |
## Combining with Other Settings
* [**Minimum spend**](/docs/guides/discounts/minimum-spend-maximum-discount) - Require a minimum order value to prevent the discount exceeding the order total
* [**Availability limits**](/docs/guides/discounts/limiting-availability) - Restrict to specific days, hours, or order types
* [**Redemption limits**](/docs/guides/discounts/limiting-redemptions) - Control how many times the discount can be used
* [**Delivery fee inclusion**](/docs/guides/discounts/delivery-fee-inclusion) - Choose whether the delivery fee counts toward the discountable total
## Examples
### First Order Incentive
* **Code:** WELCOME5
* **Amount:** £5 off
* **Per-customer limit:** 1
* **Use case:** Encourage new customers to place their first order
### Spend Threshold
* **Code:** SAVE10
* **Amount:** £10 off
* **Minimum spend:** £25
* **Use case:** Increase average order value by rewarding larger orders
When using fixed discounts, set a [minimum spend](/docs/guides/discounts/minimum-spend-maximum-discount) that is meaningfully higher than the discount amount. This protects your margins and encourages customers to add more to their order.
# Free Delivery Discounts
Source: https://storekit.com/docs/guides/discounts/free-delivery
Remove the delivery fee at checkout with free delivery discounts in storekit. One of the most effective ways to boost takeaway and delivery conversion.
Free delivery discounts remove the delivery fee at checkout, making delivery orders more attractive to customers. They're one of the most effective ways to boost takeaway and delivery sales.
## Creating a Free Delivery Discount
1. Go to **Marketing → Discounts** in the sidebar
2. Click **Create Discount**
3. Enter a **discount code** (minimum 3 characters, letters and numbers only)
4. Select **Free Delivery** as the discount type
5. Configure any restrictions (see below)
6. Click **Create Discount** (or **Save Discount** when editing)
## How It Works
When a customer applies a free delivery discount code (or the discount is [auto-applied](/docs/guides/discounts/auto-applied)), the delivery fee is removed from their order total at checkout. The discount only affects the delivery fee — product prices remain unchanged.
## Combining with Other Settings
* [**Auto-applied**](/docs/guides/discounts/auto-applied) - Remove the need for a code so delivery is automatically free when conditions are met
* [**Minimum spend**](/docs/guides/discounts/minimum-spend-maximum-discount) - Require a minimum order value before free delivery applies
* [**Availability limits**](/docs/guides/discounts/limiting-availability) - Restrict to specific days, hours, or order types
* [**Redemption limits**](/docs/guides/discounts/limiting-redemptions) - Control how many times the discount can be used
* [**Scheduling**](/docs/guides/discounts/scheduling) - Automatically activate and deactivate free delivery during set periods
## Examples
### Always-on Free Delivery
* **Code:** FREEDELIVERY
* **Minimum spend:** £15
* **Use case:** Encourage delivery orders above a certain value
### Promotional Free Delivery
* **Code:** DELIVER0
* **Availability:** Weekdays only
* **Use case:** Boost quieter weekday delivery orders
### Auto-applied Free Delivery
* **Auto apply:** On
* **Minimum spend:** £30
* **Use case:** Reward larger orders with free delivery automatically
Free delivery is especially effective during quieter periods. Combine it with [day and hour restrictions](/docs/guides/discounts/limiting-availability) to target slow times without giving away delivery fees during peak hours.
# Government & Seasonal Scheme Discounts
Source: https://storekit.com/docs/guides/discounts/government-scheme-discounts
Set up auto-applied, scheduled discounts for government schemes like UK Holiday Activities and Food (HAF) or seasonal 'kids eat free' offers.
Some local authorities and government bodies run seasonal programmes that subsidise meals — for example the UK **Holiday Activities and Food (HAF)** programme or council-backed **"kids eat free"** summer schemes. You can set these up in storekit so the discount activates and expires automatically, applies at checkout without a code, and only covers qualifying menu items.
## What You'll Need
| Requirement | Why |
| ------------------------------------- | ----------------------------------------------------------------------------------- |
| **storekit+** plan | Scheduling and auto apply are storekit+ features |
| **Scheme dates** | The start and end dates provided by the scheme organiser |
| **Qualifying products or categories** | Which meals or menu sections are covered by the scheme |
| **Discount value** | The amount or percentage the scheme subsidises (e.g. 100% off, or a fixed £ amount) |
## Step 1 — Create the Discount
1. Go to **Marketing → Discounts** in the sidebar
2. Click **Create Discount**
3. Choose the discount type that matches the scheme:
* **Fixed discount** — if the scheme covers a set amount (e.g. £15 per meal). See [Fixed Discounts](/docs/guides/discounts/fixed-discounts).
* **Percentage discount** — if the scheme covers a percentage (e.g. 100% off qualifying items). See [Percentage Discounts](/docs/guides/discounts/percentage-discounts).
4. Enter the **discount value** as specified by the scheme
## Step 2 — Schedule the Discount
Set the discount to activate and deactivate automatically so it matches the scheme period exactly.
1. In the **Schedule** section, set the **start date** to the first day of the scheme
2. Set the **end date** to the last day of the scheme
3. The discount will only be usable between these dates — no manual toggling needed
For full details see [Scheduling Discounts](/docs/guides/discounts/scheduling).
If the scheme only runs on certain days of the week (e.g. weekdays only), combine scheduling with [day and hour restrictions](/docs/guides/discounts/limiting-availability) to narrow it further.
## Step 3 — Enable Auto-Apply
Turn on auto apply so customers receive the discount automatically at checkout — they won't need to enter a code.
1. Toggle **Auto apply** on
2. The discount will appear in the customer's cart as soon as their order meets the conditions
For full details see [Auto-Applied Discounts](/docs/guides/discounts/auto-applied).
Auto apply requires storekit+. If you don't see the toggle, check that your venue is on the storekit+ plan.
## Step 4 — Target Qualifying Products
Most schemes only cover specific meals. Use targeting to restrict the discount to the right items.
### Option A — Target by Category
Best when an entire menu section qualifies (e.g. a "Kids Meals" category).
1. Under **Stores**, click **Manage Restrictions**
2. Set **Restrict by** to **Categories** and tick the categories that contain qualifying items, then click **Save Restrictions**
### Option B — Target by Product
Best when only individual items qualify.
1. Under **Stores**, click **Manage Restrictions**
2. Set **Restrict by** to **Products**, search for and tick each qualifying product, then click **Save Restrictions**
If you don't already have a dedicated category for scheme-eligible items, consider creating one (e.g. "HAF Eligible Meals"). This makes targeting straightforward and lets you add or remove items in one place. See [Categories](/docs/guides/menu/categories).
## Step 5 — Review and Save
Before saving, double-check:
* [ ] Discount **type and value** match the scheme requirements
* [ ] **Schedule** start and end dates are correct
* [ ] **Auto apply** is toggled on
* [ ] **Targeting** covers exactly the qualifying products or categories
Click **Create Discount**. Place a test order to confirm the discount applies as expected.
## Optional Settings
Depending on the scheme rules you may also want to configure:
| Setting | When to use | Link |
| --------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
| **Day / hour restrictions** | Scheme only applies on certain days or during certain hours | [Limiting Availability](/docs/guides/discounts/limiting-availability) |
| **Order type restrictions** | Scheme only applies to dine-in, takeaway, or delivery | [Limiting Availability](/docs/guides/discounts/limiting-availability) |
| **Minimum spend** | Scheme requires a minimum order value | [Minimum Spend & Maximum Discount](/docs/guides/discounts/minimum-spend-maximum-discount) |
| **Maximum discount** | You want to cap the discount amount per order | [Minimum Spend & Maximum Discount](/docs/guides/discounts/minimum-spend-maximum-discount) |
## Troubleshooting
Auto apply is a storekit+ feature. There is no subscription or plan page in the dashboard, so you cannot check your plan yourself — [contact support](/docs/getting-started/contact-support) or your account manager to confirm whether your venue is on **storekit+** and to upgrade. Published plans are listed on the [storekit pricing page](https://www.storekit.com/pricing).
Work through this checklist:
1. **Is the discount toggled on?** — Open the discount in **Discounts** and check it is active.
2. **Are the schedule dates correct?** — The current date must fall between the start and end dates. Dates use your venue's configured timezone.
3. **Does the order contain qualifying items?** — If targeting is set to specific categories or products, only those items trigger the discount.
4. **Is another discount already applied?** — Only one discount applies per order by default. If a customer has entered a code, the auto-applied scheme discount may not stack.
5. **Are day/hour restrictions blocking it?** — If you added availability limits, make sure the current day and time fall within the allowed window.
Check your targeting settings. If you selected **Specific categories**, any product added to that category is automatically included — even items added after the discount was created. Switch to **Specific products** targeting if you need exact control over which items qualify.
Verify the **end date** in the schedule section. If the date is correct, clear your browser cache and refresh. Times are interpreted in your venue's configured timezone — ensure the end time accounts for this.
# Limiting Discount Availability
Source: https://storekit.com/docs/guides/discounts/limiting-availability
Restrict storekit discounts to specific days, hours, fulfillment types, or order channels. Target the right customers at the right time without manual toggling.
Control when and how customers can use your discounts by setting availability restrictions. Limit discounts to specific days, hours, and order types to target the right customers at the right time.
## Availability Settings
| Setting | What It Controls | Example |
| ---------------- | ----------------------------------------- | -------------------------------- |
| **Days of week** | Which days the discount is valid | Weekends only (Saturday, Sunday) |
| **Time range** | Which hours the discount is valid | 4pm - 6pm (happy hour) |
| **Order type** | Which order types the discount applies to | Delivery only |
## Configuring Availability
1. Go to **Marketing → Discounts** in the sidebar
2. Click **Create Discount** or edit an existing discount
3. In the **Availability** section, configure the desired restrictions
4. Click **Create Discount** (or **Save Discount** when editing)
## Day Restrictions
Limit the discount to specific days of the week. Useful for:
* **Weekend deals** - Saturday and Sunday only
* **Weekday lunch specials** - Monday to Friday
* **Mid-week boost** - Tuesday and Wednesday to drive quieter days
Select one or more days. If no days are selected, the discount is valid every day.
## Hour Restrictions
Set a time range during which the discount is valid. Useful for:
* **Happy hour** - 4pm to 6pm
* **Lunch deals** - 11am to 2pm
* **Late night offers** - 9pm to midnight
Set both a start time and end time. If no times are set, the discount is valid all day.
An auto-applied happy hour discount attaches to every basket inside its time window, including baskets with none of the items it covers. It is worth £0.00 on those items — [what the customer and the order show →](/docs/guides/discounts/auto-applied#restricted-discounts-and-baskets-with-no-eligible-items)
## Order Type Restrictions
Restrict the discount to specific order types:
| Order Type | Description |
| ------------ | ------------------------------------------ |
| **InStore** | Orders placed for eating in the restaurant |
| **Pickup** | Orders collected by the customer |
| **Delivery** | Orders delivered to the customer |
Select one or more order types. If none are selected, the discount applies to all order types.
## Combining Restrictions
All availability restrictions work together. A discount is only valid when **all** configured conditions are met.
**Example:** A discount set to weekends only, 5pm-9pm, delivery orders would only apply to delivery orders placed between 5pm and 9pm on Saturdays and Sundays.
Use availability restrictions alongside [scheduling](/docs/guides/discounts/scheduling) for maximum control. Scheduling sets the overall date range, while availability settings control the specific days and times within that range.
# Limiting Discount Redemptions
Source: https://storekit.com/docs/guides/discounts/limiting-redemptions
Cap how many times a discount can be used overall and per customer. Manage promotion spend, prevent abuse, and run limited-time offers without surprise costs.
Redemption limits let you control how many times a discount can be used. Set a total cap across all customers, a per-customer limit, or both to manage your promotion spend.
Discount limits are **count-based only**. The system tracks how many times a code has been used, not the total monetary amount redeemed. There is no store-credit or balance-tracking feature for discounts. A fixed discount (e.g. €100 off) applies the full amount on every qualifying order — it does not deplete a running balance.
## Redemption Limit Types
| Limit | What It Controls | Example |
| ---------------------------- | ------------------------------------ | ------------------------ |
| **Total redemptions** | Maximum uses across all customers | First 100 customers only |
| **Per-customer redemptions** | Maximum uses per individual customer | Once per customer |
## Configuring Redemption Limits
1. Go to **Marketing → Discounts** in the sidebar
2. Click **Create Discount** or open an existing discount from the list
3. In the **Limits** section, turn on **Total redemptions** and/or **Per-customer redemptions** and set the values
4. Click **Create Discount** (or **Save Discount** when editing)
Leave **Total redemptions** off when any number of customers may use the code, and use **Per-customer redemptions** alone to cap each individual.
## Total Redemptions
Set a maximum number of times the discount can be used across all customers. Once the limit is reached, the discount can no longer be applied.
Use cases:
* **Limited offers** - "First 50 orders get 20% off"
* **Budget control** - Cap the total number of discounted orders
* **Scarcity promotions** - Create urgency with limited availability
## Per-Customer Redemptions
Set a maximum number of times each individual customer can use the discount. This prevents a single customer from using the same discount repeatedly.
Use cases:
* **One-time welcome offers** - £5 off your first order (limit: 1 per customer)
* **Monthly rewards** - Use up to 3 times per customer
* **Fair usage** - Prevent abuse of generous discounts
## Combining Both Limits
You can set both limits together for precise control.
**Example:** A discount with 200 total redemptions and a per-customer limit of 2 means the discount can be used up to 200 times in total, but each customer can only use it twice.
Redemption limits do not apply to [auto-applied discounts](/docs/guides/discounts/auto-applied). If you need to limit redemptions, use a code-based discount instead.
## Combining with Other Settings
* [**Availability limits**](/docs/guides/discounts/limiting-availability) - Restrict to specific days, hours, and order types
* [**Scheduling**](/docs/guides/discounts/scheduling) - Set a date range for the discount
* [**Minimum spend**](/docs/guides/discounts/minimum-spend-maximum-discount) - Require a minimum order value
* [**Give one product away free with a code**](/docs/guides/discounts/discount-codes#give-one-product-away-free-with-a-code) - A free-item promotion that pairs a per-customer cap with a **Maximum discount amount**
# Minimum Spend & Maximum Discount
Source: https://storekit.com/docs/guides/discounts/minimum-spend-maximum-discount
Protect storekit margins with discount thresholds. Require a minimum spend before discounts apply and cap the maximum discount value per order at checkout.
Minimum spend and maximum discount settings give you precise control over your discount economics. Require customers to reach a spending threshold before a discount applies, and cap the total discount to protect your margins.
## Minimum Spend
Set a minimum order value that must be reached before the discount can be applied. If the order total is below the threshold, the discount will not apply.
### Configuring Minimum Spend
1. Go to **Marketing → Discounts** in the sidebar
2. Click **Create Discount** or open an existing discount from the list
3. In the **Limits** section, turn on **Minimum spend** and enter the value
4. Click **Create Discount** (or **Save Discount** when editing)
### Use Cases
| Minimum Spend | Discount | Purpose |
| ------------- | ------------- | --------------------------------------- |
| £15 | Free delivery | Encourage larger delivery orders |
| £25 | £5 off | Incentivise orders above a target value |
| £50 | 20% off | Reward high-value orders |
## Maximum Discount
Cap the total discount amount that can be applied to a single order. This is particularly important for [percentage discounts](/docs/guides/discounts/percentage-discounts) where the discount scales with order size.
### Configuring Maximum Discount
1. Go to **Marketing → Discounts** in the sidebar
2. Click **Create Discount** or open an existing discount from the list
3. In the **Limits** section, turn on **Maximum discount amount** and enter the value
4. Click **Create Discount** (or **Save Discount** when editing)
**Maximum discount amount** is only shown when **Type** is **Percentage**.
### Example
A 20% discount with a £15 maximum discount cap:
| Order Total | Calculated Discount (20%) | Applied Discount | Savings |
| ----------- | ------------------------- | ---------------- | ----------------- |
| £30 | £6 | £6 | Full 20% |
| £50 | £10 | £10 | Full 20% |
| £75 | £15 | £15 | Full 20% (at cap) |
| £100 | £20 | £15 | Capped at £15 |
## Combining Both Settings
Use minimum spend and maximum discount together for well-controlled promotions.
**Example:** 20% off with a £50 minimum spend and a £15 maximum discount cap. Customers must spend at least £50 to qualify, and the discount will never exceed £15 regardless of order size.
For percentage discounts, always consider setting a maximum discount cap. Without one, a 20% discount on a £200 order would give £40 off, which may exceed your intended promotion budget.
## Combining with Other Settings
* [**Availability limits**](/docs/guides/discounts/limiting-availability) - Restrict to specific days, hours, and order types
* [**Redemption limits**](/docs/guides/discounts/limiting-redemptions) - Control how many times the discount can be used
* [**Delivery fee inclusion**](/docs/guides/discounts/delivery-fee-inclusion) - Choose whether the delivery fee counts toward the minimum spend
* [**Give one product away free with a code**](/docs/guides/discounts/discount-codes#give-one-product-away-free-with-a-code) - Using **Maximum discount amount** to stop paid modifier extras being given away
# Discounts Overview
Source: https://storekit.com/docs/guides/discounts/overview
Drive sales and reward customers with the storekit discounts engine. Build percentage, fixed, free delivery, and Buy X Get Y promotions with custom rules.
Discounts are a powerful way to drive sales, attract new customers, and reward loyal ones. storekit offers a range of discount options to suit your business needs.
## Types of Discounts
### Percentage Discounts
Offer a discount based on a percentage of the order total. Perfect for site-wide sales, seasonal promotions, or customer appreciation deals.
**Example:** 20% off all orders
### Fixed Monetary Discounts
Provide a set amount off the total order price. Great for offering incentives without affecting your overall margins too much.
**Example:** £5 off your order
### Free Delivery Discounts
Remove the delivery fee to encourage more online orders. Especially useful for boosting takeaway and delivery sales.
### Buy X Get Y Discounts
Buy-one-get-one (BOGO) promotions. When a customer buys more than one item from an eligible product or category, the cheaper item is discounted or made free. The reward is always another one of the same eligible items — it can't be a different product. See [Buy X Get Y](/docs/guides/discounts/buy-x-get-y) for what it can and can't do.
**Examples:**
* Buy 1 pizza, get a second pizza 50% off
* Buy 1 coffee, get a second coffee free
Buy X Get Y discounts require storekit+
### Auto-applied Discounts
Discounts that apply automatically at checkout without customers needing to enter a code. Perfect for seamless promotions on specific items or categories.
Auto-applied discounts require storekit+
## Discount Settings
Control exactly how your discounts work:
| Setting | Description |
| ---------------------- | --------------------------------------------------------------------- |
| **Availability** | Restrict to specific days and hours (e.g., weekends only, happy hour) |
| **Order types** | Limit to **Delivery**, **Pickup**, or **InStore** orders |
| **Minimum Spend** | Set a minimum order value required |
| **Maximum Discount** | Cap the total discount amount per order |
| **Total Redemptions** | Limit how many times the discount can be used overall |
| **Per-Customer Limit** | Limit how many times each customer can use the discount |
| **Delivery Fee** | Include or exclude delivery fee from the discount calculation |
## Additional Features
### Bulk Import
Upload multiple discounts at once using CSV import. Ideal for businesses running multiple promotions simultaneously.
### Scheduled Discounts
Plan discounts in advance so they automatically activate and deactivate at specified times.
Scheduled discounts require storekit+
## Creating a Discount
1. Go to **Marketing → Discounts** in your dashboard
2. Click **Create Discount**
3. Choose the discount type
4. Configure settings and restrictions
5. Save and activate
The dashboard form's type options are **Percentage**, **Fixed** and **Free delivery**. Buy X Get Y is not selectable there — it's configured by the storekit team (see [Buy X Get Y](/docs/guides/discounts/buy-x-get-y)).
See [Discount Codes](/docs/guides/discounts/discount-codes) for step-by-step instructions.
## Troubleshooting
### Can't create a discount
* Discount code must be at least 3 characters
* Use only letters and numbers
* Remove any spaces at the beginning or end
### Discount says it can't be used today
Check that your discount availability settings include the current day. Discounts can be limited to specific days of the week.
### Customer says code isn't working
Verify:
* The discount hasn't reached its redemption limit
* The order meets the minimum spend requirement
* The order type (**Delivery**/**Pickup**/**InStore**) is eligible
* The discount is within its valid date range
# Percentage Discounts
Source: https://storekit.com/docs/guides/discounts/percentage-discounts
Set up percentage-off discounts in storekit. Ideal for site-wide sales, category promotions, customer appreciation offers, and limited-time seasonal campaigns.
Percentage discounts reduce the order total by a set percentage. They're ideal for site-wide sales, category promotions, and customer appreciation offers.
## Creating a Percentage Discount
1. Go to **Marketing → Discounts** in the sidebar
2. Click **Create Discount**
3. Enter a **Discount code** (minimum 3 characters, letters and numbers only)
4. Select **Percentage** as the **Type**
5. Enter the **Value** (e.g., 20 for 20% off)
6. Configure any restrictions (see below)
7. Click **Create Discount**
## Applying to Specific Items
Percentage discounts can be scoped to different parts of your menu:
| Scope | Description | Example |
| ----------------------- | ------------------------------------------------ | ---------------------- |
| **Entire order** | Discount applies to all items in the order | 20% off all orders |
| **Specific categories** | Only items in selected categories are discounted | 15% off pizzas |
| **Specific products** | Only selected products are discounted | 10% off new menu items |
Category and product scopes are set under **Stores** → **Manage Restrictions**. If the discount is also auto-applied, the scope does not decide whether it attaches to the basket: it attaches to baskets in its active window and discounts no items when nothing in the basket is eligible — see [Restricted discounts and baskets with no eligible items →](/docs/guides/discounts/auto-applied#restricted-discounts-and-baskets-with-no-eligible-items). A 100% product-scoped discount gives that item away free — see [Give one product away free with a code](/docs/guides/discounts/discount-codes#give-one-product-away-free-with-a-code), which also covers what happens when the item's price sits in its modifier options.
## Combining with Other Settings
Percentage discounts work well with additional restrictions to protect your margins:
* [**Minimum spend**](/docs/guides/discounts/minimum-spend-maximum-discount) - Require a minimum order value before the discount applies
* [**Maximum discount**](/docs/guides/discounts/minimum-spend-maximum-discount) - Cap the total discount amount to prevent excessive reductions on large orders
* [**Availability limits**](/docs/guides/discounts/limiting-availability) - Restrict to specific days, hours, or order types
* [**Redemption limits**](/docs/guides/discounts/limiting-redemptions) - Control how many times the discount can be used
## Examples
### Site-wide Sale
* **Code:** SAVE20
* **Percentage:** 20%
* **Scope:** Entire order
* **Use case:** A weekend promotion to boost overall sales
### Category Promotion
* **Code:** PIZZA15
* **Percentage:** 15%
* **Scope:** Pizzas category
* **Use case:** Drive sales for a specific menu section
### Controlled Promotion
* **Code:** VIP10
* **Percentage:** 10%
* **Minimum spend:** £30
* **Maximum discount:** £10
* **Use case:** Reward higher-value orders while capping your discount liability
For large percentage discounts, always set a [maximum discount cap](/docs/guides/discounts/minimum-spend-maximum-discount) to protect your margins on high-value orders.
# Promotions
Source: https://storekit.com/docs/guides/discounts/promotions
Run auto-applied promotions that activate at checkout without a code. Configure trigger conditions and roll out seamless offers to every eligible customer.
Promotions are discounts that apply automatically at checkout without customers needing to enter a code. They're perfect for seamless offers that you want every eligible customer to receive.
Promotions require storekit+
## How Promotions Work
Unlike discount codes, promotions:
* Apply automatically when conditions are met
* Don't require customers to know or enter a code
* Show the discount applied in the cart automatically
* Can target specific products or categories
## Creating a Promotion
1. Go to **Marketing → Discounts** in the sidebar
2. Click **Create Discount**
3. Configure your discount type and value
4. Toggle **Auto apply** on
5. Set your targeting and restrictions
6. Click **Create Discount** (or **Save Discount** when editing)
## Targeting Options
Targeting is set per store under **Stores** → **Manage Restrictions** → **Restrict by**.
### No Restrictions
The promotion applies to the entire order. Use for site-wide sales.
### Restrict by Categories
Target products in selected categories only. Useful for:
* "20% off all desserts"
* "15% off every starter"
Targeting only reduces the price of matching items; it can't give a free *different* item (e.g. a free starter for buying a main). For buy-one-get-one on the same item see [Buy X Get Y](/docs/guides/discounts/buy-x-get-y).
### Restrict by Products
Target individual products. Useful for:
* Highlighting slow-moving items
* New product launches
* Loss leaders to drive traffic
## Use Cases
### Happy Hour
Create a time-limited promotion:
* 20% off drinks
* Available 4pm-7pm
* Weekdays only
### Lunch Special
Encourage midday orders:
* £2 off orders over £10
* Available 11am-2pm
### Weekend Deals
Boost weekend sales:
* 15% off all orders
* Saturday and Sunday only
### Category Promotion
Promote specific menu sections:
* 25% off starters
* Encourages add-on purchases
### New Item Launch
Draw attention to new products:
* 50% off new burger
* Limited time only
## Promotion vs Discount Code
| Feature | Promotion | Discount Code |
| ------------------------ | -------------------------------- | ------------------------------------ |
| Customer action required | None | Enter code |
| Visibility | Automatic in cart | Must know code |
| Best for | Site-wide offers, category deals | Targeted campaigns, influencer codes |
| Exclusivity | Available to everyone | Only those with the code |
## Stacking
By default, only one discount applies per order. If multiple promotions are eligible, the one providing the greatest value to the customer is applied.
Use discount codes for exclusive offers (influencer partnerships, email subscribers) and promotions for offers you want everyone to see.
## Managing Promotions
### Priority
When multiple promotions could apply, storekit automatically selects the best one for the customer. You don't need to set priority manually.
### Pausing a Promotion
Open the promotion and click **Deactivate** to temporarily disable it (find it again with the **Archived** filter, then click **Activate**). This is useful for:
* Seasonal promotions between seasons
* Promotions you want to reuse later
### Scheduling
Set start and end dates to automatically activate and deactivate promotions. Plan your promotional calendar in advance.
## Tips
* **Clear naming** - Name promotions descriptively (e.g., "Summer 2024 - 20% off desserts")
* **Set end dates** - Avoid promotions running indefinitely
* **Monitor margins** - Track the cost of promotions against increased sales
* **Combine with marketing** - Promote your offers on social media and in-store
* **Test first** - Place a test order to verify the promotion applies correctly
## Troubleshooting
Work through this checklist:
1. **Is the promotion toggled ON?** — Check the promotion status in Discounts.
2. **Does the order meet the minimum spend?** — The subtotal must reach the threshold before the discount applies.
3. **Is the promotion within its scheduled dates?** — Verify the start and end dates haven't passed or aren't in the future.
4. **Does the order contain items from the targeted categories/products?** — If targeting is set, only matching items trigger the promotion.
5. **Is another discount already applied?** — Stacking is disabled by default; only one discount applies per order.
Check your category or product targeting settings. If the promotion targets a category, any item added to that category is automatically included — even newly added items. To exclude specific products, switch to product-level targeting instead.
Clear your browser cache and refresh the page. If the promotion still appears, verify that the end date is set correctly and accounts for your timezone — times are interpreted in your venue's configured timezone.
# Scheduling Discounts
Source: https://storekit.com/docs/guides/discounts/scheduling
Plan storekit discounts in advance with start and end dates. Schedule promotions to activate and deactivate automatically without staff intervention.
Scheduled discounts let you set start and end dates so promotions activate and deactivate automatically. Plan your promotional calendar in advance without needing to manually toggle discounts on and off.
Scheduled discounts require storekit+
## How It Works
When you set a schedule on a discount:
1. The discount remains inactive until the **Start date**
2. It activates automatically at the scheduled start
3. It deactivates automatically at the **End date**
4. No manual intervention is needed
## Setting Up a Schedule
1. Go to **Marketing → Discounts** in the sidebar
2. Click **Create Discount** or open an existing discount from the list
3. In the **Schedule** section, turn on **Start date** and set the date and time
4. Turn on **End date** and set the date and time
5. Click **Create Discount** (or **Save Discount** when editing)
The discount will only be usable between the start and end dates.
## Use Cases
| Scenario | Start | End | Example |
| ---------------------- | ------------ | --------------- | ---------------------------------- |
| **Flash sale** | Friday 6pm | Sunday midnight | Weekend-only 25% off |
| **Seasonal promotion** | 1st December | 31st December | Christmas menu discount |
| **Event-based offer** | Event day | Day after event | Match day special |
| **New launch** | Launch date | 2 weeks later | 50% off new item for first 2 weeks |
## Combining with Other Settings
Scheduling works alongside other discount settings:
* [**Availability limits**](/docs/guides/discounts/limiting-availability) - Add day and hour restrictions within the scheduled period
* [**Redemption limits**](/docs/guides/discounts/limiting-redemptions) - Cap total uses during the promotion window
* [**Minimum spend**](/docs/guides/discounts/minimum-spend-maximum-discount) - Require a minimum order value
* [**Give one product away free with a code**](/docs/guides/discounts/discount-codes#give-one-product-away-free-with-a-code) - Run a free-item offer for one month at a time
Combine scheduling with [day and hour restrictions](/docs/guides/discounts/limiting-availability) for precise control. For example, schedule a promotion for the entire month of December but restrict it to weekends between 5pm and 9pm.
# Catering Setup
Source: https://storekit.com/docs/guides/fulfillment/catering-setup
Set up catering pickup and delivery in storekit for large orders. Configure lead times, minimum spend, advance scheduling, and dedicated catering menus.
Content coming soon.
# Delivery Zones
Source: https://storekit.com/docs/guides/fulfillment/delivery/delivery-zones
Define storekit delivery zones using driving distance, polygon shapes drawn on a map, or postcode lists. Set per-zone delivery fees, minimums, and prep times.
# Set Up Delivery Zones
Define where you deliver and set fees by area.
## Prerequisites
* Delivery is enabled in Operations settings
* Your store address is set correctly (zones are calculated from this point)
## Choose Your Zone Type
| Type | Best for |
| ---------------- | --------------------------------------------- |
| Driving distance | Quick setup, circular coverage |
| Polygon | Precise boundaries (neighborhoods, postcodes) |
| Postcode | UK/IE venues with postcode-based delivery |
## Steps
* Enter a radius (e.g., 3 miles)
* Set delivery fee and minimum order
## Verify It Works
## Export Delivery Zones
You can export your delivery zones in multiple formats for use in mapping tools, logistics planning, or external systems:
1. Go to **Store Settings** > **Delivery Zones**
2. Click **Export**
3. Choose your format:
* **GeoJSON** — For mapping applications and GIS tools
* **CSV** — For spreadsheets and data analysis
* **KML** — For Google Earth and Google Maps
Exports are available at both the venue level (single store) and account level (all stores).
## Troubleshooting
* **Address shows "out of zone"?** → Check your store coordinates are correct
* **Wrong fee applied?** → See [zone priority rules](#) in Reference
→ *For field definitions, see [Delivery Zones Reference](#)*
# Enabling Delivery
Source: https://storekit.com/docs/guides/fulfillment/delivery/enabling-delivery
Turn on delivery in storekit so customers can order food and drinks to their address, managed alongside pickup in your store's Operations settings.
## How Enabling Delivery Works
* Customers can choose pickup or delivery before placing an order
* Delivery orders appear in your storekit order dashboard (motorcycle logo)
* Pickup/collection can remain enabled separately
## How to Enable Delivery
The full path is **Stores** → \[your store] → **Settings** → **Operations** → **Fulfillment types**.
From your storekit dashboard, go to **Stores** and select the pickup store you want to update. Open **Settings**.
From the settings menu, open **Operations**. There is no **Fulfillment** entry in that menu — fulfilment types live on the **Operations** page.
Under **Fulfillment types** — the first group on the **Operations** page — tick **Delivery** ("Offer delivery orders (we do not provide drivers or driver management)").
You can also untick **Delivery** to disable delivery orders for this store.
Click **Save** to apply the change.
**On a dine-in store the Fulfillment types checkboxes are not shown.** If the store takes in-store (order-and-pay) orders, the **Fulfillment types** group is not rendered on **Operations** at all, and **Delivery Zones** and **Pre-Orders** are missing from the settings menu too. There is no dashboard control that adds delivery or pickup to such a store — [contact storekit support](/docs/getting-started/contact-support) to have it changed.
## When to Enable Delivery
Enable Delivery when:
* You want to accept delivery orders on your storekit store
* The venue is ready to prepare delivery orders
* A delivery process, courier setup, or third-party delivery arrangement is already in place
3rd-party courier integrations are available via storekit+. Click [here](https://t09czsyu90l.typeform.com/to/gMpZl4lZ) to get a demo.
## When to Disable Delivery
Disable Delivery when:
* The venue only wants to accept pickup/collection orders
* Delivery is temporarily unavailable
* The venue is too busy to handle delivery orders
* Delivery setup is still being configured
Delivery only controls whether customers can choose delivery before placing their order. storekit does not provide drivers or driver management from this setting.
## Related:
* [Enabling Pickup](/docs/enabling-pickup)
* [Delivery Zones](/docs/guides/fulfillment/delivery/delivery-zones)
* [Configure fulfillment methods and order scheduling](/docs/getting-started/launch/configure-fulfillment)
# Set up dine-in tables, areas, and QR codes
Source: https://storekit.com/docs/guides/fulfillment/dine-in-tables
Create dine-in tables and areas in storekit, print table QR codes for guest ordering and Pay at Table, and request table number redirects.
Tables link QR codes to specific seating positions so that dine-in orders and Pay at Table payments are routed to the correct location. Each table has a number, belongs to an area, and has its own QR code.
## How Tables Work
1. **You create tables** in the dashboard and organise them into areas
2. **Each table gets a QR code** that encodes the table number
3. **Customer scans the QR** and their order is automatically tagged with that table
4. **Kitchen and staff see the table number** on incoming orders and bills
Tables are used by both **Order & Pay** (customers browse the menu and place orders) and **Pay at Table** (customers view and settle an existing POS bill).
## Setting Up Tables
### Creating Tables
1. Go to **Stores** → your store → **Settings** → **Tables**
2. Click **+ Add area** to create a seating zone (e.g. "Main Floor", "Terrace", "Bar")
3. Inside the area, click the add button — labelled **+ Add** followed by your store's table wording (**Table** by default, or e.g. **Room** if your store renames it)
4. Enter the table number and repeat for each table
5. Click **Save**
Use logical numbering that matches the physical labels on your tables. This makes it easier for staff to identify where orders should go.
### Editing Tables
You can change both the table number your customers see and the **POS ID** the till uses.
1. Go to **Stores** → your store → **Settings** → **Tables**
2. Click the table's name to edit it, then press Enter to save
3. To change the **POS ID**, switch to **Grid view** with the icon buttons above the list — there are two, **Accordion view** and **Grid view**, named on hover — then click the table's **POS ID** cell, type the new value and press Enter
The **POS ID** is the internal POS system table ID, required if your POS uses table IDs to route orders — it is what sends an order to the right table on the till, and it is separate from the name customers see. **Accordion view** shows the current value next to each table as `POS: 12`; an empty **POS ID** cell means none is set. You can also set it when you create a table, in the **POS ID** field, and in bulk through the **Table import** CSV, which has a **POS ID** column.
If orders are landing on the wrong table on the till for one part of your venue, correct those tables' POS IDs here. On a POS-synced floorplan this is usually faster and safer than re-importing the floorplan — see [Lightspeed Dine-in: Floor Plan & Tables](/docs/guides/integrations/pos/lightspeed/dine-in).
### Deactivating or Removing Tables
1. Go to **Stores** → your store → **Settings** → **Tables**
2. Click the delete icon next to the table you want to remove
3. Confirm the deletion
Deactivating or snoozing a table does not remove it from a generic table-selector QR. Customers can still select it, but they will see that the table is not accepting orders.
To hide the table from the selector entirely, delete it. Deleting invalidates any printed QR code for that table, so remove or replace the physical code. Alternatively, use table-specific QR codes, which take customers directly to a pre-selected table instead of showing the generic selector.
### Importing Tables From Your POS
If your POS owns the floorplan, import it instead of creating tables by hand. Each integration has its own sync control on its settings page under **Stores** → your store → **Settings** → **Integrations**:
| POS | Where | Control |
| ----------------------- | ------------------------------ | ------------------ |
| **Toast POS** | **Sync Actions** section | **Sync Floorplan** |
| **Tissl** | Top of the settings page | **Sync floorplan** |
| **Lightspeed K-Series** | **Fetch Lightspeed Floorplan** | **Sync floorplan** |
| **Zonal** | Bottom of the settings page | **Sync tables** |
For Toast, **Sync Floorplan** imports your tables and service areas from Toast POS on demand — use it after changing the floorplan in Toast instead of re-entering tables by hand. Imported tables then appear under **Settings** → **Tables**.
The sync buttons live on the POS integration page, not on the **Tables** page, and are disabled while the integration is switched off. Integrations without a sync control (for example Centegra) need tables created in storekit with the matching POS ID.
## Areas
Areas group tables into logical zones. They serve two purposes:
* **Organisation** — keep your table list manageable across different sections of the venue
* **Category restrictions** — show different menu categories depending on where the customer is seated (e.g. drinks-only at the bar)
See [Table Area Category Restrictions](/docs/guides/menu/table-area-restrictions) for details on restricting menu categories by area.
## QR Codes for Tables
Each table has a unique QR code that links directly to that table's ordering page. When a customer scans it, their session is automatically associated with the correct table number.
### Downloading Table QR Codes
1. Go to the **QR Codes** section in your dashboard
2. Download individual table QR codes or all at once
3. Print and place them on the corresponding tables
For general QR code guidance (store-level codes, printing tips, branded designs), see [QR Codes](/docs/guides/store-settings/qr-codes).
Always test each QR code after placing it on a table. Scan with a phone to confirm it links to the correct table number.
### Table Number Redirects
If you need to redirect a QR code from one table number to another (e.g. table 23 should now point to table 25), this currently requires a backend change.
Table number redirects cannot be done from the dashboard. [Contact storekit support](/docs/getting-started/contact-support) to set up a redirect. Provide the venue name, the current table number on the QR code, and the table number you want it to point to.
This is useful when:
* You renumber physical tables but don't want to reprint QR codes
* You merge or rearrange seating areas
* A QR code is permanently affixed (e.g. engraved or embedded in the table)
## Tips
* **Match physical and digital** — keep table numbers in the dashboard consistent with physical table markers
* **Spare QR codes** — print a few extras for each table in case of damage
* **Staff training** — ensure staff know which area each table belongs to, especially when category restrictions are active
* **Test after changes** — whenever you add, edit, or remove tables, scan the QR codes to verify everything works
## Related Guides
Download and print QR codes for your store and tables
Let guests view and pay their bill from their phone
Show different menu categories by seating area
Configure when customers can place orders
# Availability & Snoozing
Source: https://storekit.com/docs/guides/menu/availability-snoozing
Control when storekit products, categories, and your store are available. Snooze items temporarily, hide out-of-stock products, or pause your store.
Control when products, categories, and your entire store are available for ordering.
## Unavailable Product Options
By default, an unavailable product still appears on your ordering page — greyed out, not tappable, with **Currently sold out** in place of its description. If you want unavailable items taken off the menu completely instead, change **Unavailable Product Options**.
This is a **per-menu** setting. It is not set per product and not set per store, so it changes how *every* unavailable item on that menu is displayed.
Go to **Menus** in the left-hand navigation and click **Edit** on the menu.
Click **Settings** in the menu builder header. The **Menu Settings** panel slides in from the right.
Under **Unavailable Product Options**, pick one of the two options:
* **Disable** — *Visible but greyed out*. This is the default.
* **Hide** — *Completely removed*.
Click **Save changes**. A **Menu Settings saved** confirmation appears.
### What the customer sees
| Setting | Unavailable product | Unavailable modifier option |
| --------------------- | ----------------------------------------------------------------------------------------- | ------------------------------------------- |
| **Disable** (default) | Shown in its category, greyed out and not selectable, described as **Currently sold out** | Shown in the modifier group, not selectable |
| **Hide** | Not in the menu at all | Not in the modifier group at all |
**Hide** applies whether the item is unavailable permanently or temporarily: the **Available** toggle off, [snoozed](#snoozing-products), an **Available After** date in the future, or **Track Inventory** stock at zero. A snoozed item disappears while the snooze runs and comes back when it ends.
The one exception is [Availability by Day](#availability-by-day): items unavailable only because of the day of the week always show greyed out, even on **Hide**.
**Hide** removes products and modifier options, not categories. A category whose items are all unavailable still appears on the ordering page, with nothing under it. If you want the whole section gone, use the category's own availability settings — see [Categories](/docs/guides/menu/categories#availability).
On **Hide**, unavailable options are taken out of their modifier group. If that empties a required group (minimum of 1 or more), the product cannot be ordered: it stays in its category but shows greyed out as **Currently sold out**, even though its own **Available** toggle is still on. See [Why a product shows as sold out when its modifiers are unavailable](/docs/guides/menu/nested-modifiers#why-a-product-shows-as-sold-out-when-its-modifiers-are-unavailable).
### POS-synced menus
**Unavailable Product Options** is a storekit display setting and works the same way on a menu synced from a POS or menu platform — set it in **Menu Settings** as above.
What differs is where availability comes from: on a POS-managed menu (Deliverect, Toast, Zonal, Stream, Lightspeed K-Series, 3S POS) the items and their availability are driven by the POS, so to make an item unavailable you mark it unavailable or out of stock there and let it sync. See [POS Menu Sync](/docs/guides/menu/pos-menu-sync).
## Product Availability
### Toggle Available
Each product has an **Available** toggle in the menu builder. When off, the product cannot be ordered. Whether it then disappears from your ordering page or stays visible but greyed out depends on [Unavailable Product Options](#unavailable-product-options) for that menu — by default it stays visible and greyed out.
Use this for:
* Permanently discontinued items
* Seasonal items out of season
* Items you're not ready to sell yet
### Snoozing Products
Snoozing temporarily hides a product for a set period. Unlike toggling availability, snoozing automatically restores the product when the snooze period ends.
To snooze a product:
1. Click the **eye icon** next to the product in your menu
2. Select a duration:
* 15 minutes
* 1 hour
* 2 hours
* 6 hours
* Tomorrow 8AM
* Indefinitely
3. Or pick a specific date/time
4. Click **Snooze**
Snoozed products show an indicator in the menu builder. Click **Unsnooze** to restore availability immediately.
Use snoozing when you've run out of an item temporarily. It's faster than editing the product and remembering to turn it back on later.
### Snooze Reporting
All snooze events are automatically logged and available in the **Reports** section. The snooze report shows:
* Total number of snoozes in the selected period
* Total time items were snoozed
* Average snooze duration
* Daily breakdown of snooze activity
* Individual snooze events with:
* Venue and menu item details
* User who initiated the snooze (for manual snoozes)
* Source (manual, Deliverect, Lightspeed, Zonal)
* Start and end times
* How the snooze ended (manual, expired, or replaced)
Filter the report by:
* Date range
* Venue
* Snooze source (manual vs. automatic)
This helps identify:
* Frequently out-of-stock items
* Peak snooze times
* Items that may need inventory adjustments
* Integration-triggered snoozes from your POS
### Available After
Schedule when a product becomes orderable using **Available After**. Until the specified date and time the product cannot be ordered — greyed out, or removed from the menu if the menu is set to **Hide** (see [Unavailable Product Options](#unavailable-product-options)).
Use this for:
* Launching new items at a specific time
* Preparing seasonal menus in advance
* Coordinating with marketing campaigns
### Inventory Tracking
Enable **Track Inventory** to set stock levels. When inventory reaches zero, the product automatically shows as unavailable.
1. Toggle **Track Inventory** on
2. Enter the current stock count
3. Stock decreases with each order
Use for:
* Daily specials with limited quantities
* Items with supply constraints
* Flash sales with limited stock
### Availability by Day
**Beta feature** - This feature is currently in beta. If you'd like to use it, please ask us on live chat.
Set which days of the week a product is available. Useful for:
* Weekend brunch items
* Weekday lunch specials
* Items requiring advance preparation
Select the days when the product should be available. On other days it cannot be ordered: it shows greyed out as **Currently sold out**, regardless of the menu's [Unavailable Product Options](#unavailable-product-options) setting.
## Store Snoozing
Temporarily disable ordering for your entire store:
1. Click the **snooze icon** in the store header
2. Select a duration:
* 5 minutes
* 10 minutes
* 30 minutes
* 1 hour
* 2 hours
* 12 hours
3. Or pick a specific date
4. Select a reason for disabling orders
5. Click **Disable orders**
Your store shows as closed to customers until the snooze period ends or you manually re-enable it.
Store snoozing affects all order types. Customers cannot place any orders while the store is snoozed, unless pre-orders during snooze is enabled in your pre-order settings.
To re-enable early:
1. Click the snooze icon again
2. Click **Enable orders**
### Snooze Reasons
When snoozing your store, select a reason:
* Too busy
* Technical issue
* Staff shortage
* Emergency
* Other
This helps track why your store was unavailable.
## Modifier Option Availability
Modifier options have an **In Stock** toggle. When off, the option cannot be selected but remains configured — it stays visible and greyed out, or is removed from the modifier group if the menu is set to **Hide** (see [Unavailable Product Options](#unavailable-product-options)).
Use for temporarily unavailable toppings, sizes, or add-ons without deleting them.
### A Product Shows as Sold Out After You Made Its Options Unavailable
A required modifier group (minimum of 1 or more) with no available options takes the whole **product** out of use, not just the group — and that includes required [nested modifier groups](/docs/guides/menu/nested-modifiers), which belong to the product even though customers only see them after picking the parent option. So turning **In Stock** off for every option of a required nested group affects every product using that group: on **Hide** those products show as **Currently sold out**, and on **Disable** (the default) they still look orderable but cannot be added to the basket.
For the full behaviour, how to trace it in the dashboard, and what to change on a POS-managed menu, see [Why a product shows as sold out when its modifiers are unavailable](/docs/guides/menu/nested-modifiers#why-a-product-shows-as-sold-out-when-its-modifiers-are-unavailable).
## Summary
| Level | Method | Automatic Restore | Use Case |
| ------- | --------------------------- | -------------------- | ------------------------------------------------------------- |
| Product | Toggle Available | No | Permanent removal |
| Product | Snooze | Yes | Temporarily out of stock |
| Product | Available After | Yes (appears) | Scheduled launch |
| Product | Track Inventory | Yes (when restocked) | Limited quantities |
| Product | Available Days | Yes (daily) | Day-specific items |
| Store | Snooze | Yes | Emergency/capacity issues |
| Menu | Unavailable Product Options | n/a | Grey out (**Disable**) or remove (**Hide**) unavailable items |
For category availability options (Available After, Category Hours), see [Categories](/docs/guides/menu/categories#availability).
# Create and schedule menu categories
Source: https://storekit.com/docs/guides/menu/categories
Group storekit menu products into categories with names, descriptions, images, and time-based hours so sections appear at the right time of day.
Categories group your products into sections that customers can browse. They appear as tabs or sections on your menu.
## Creating a Category
1. Go to **Menus** in the sidebar and open a menu with **Edit**
2. Click **Add Category**
3. Enter a name and optional description
4. Click **Create Category**
## Category Fields
| Field | Description |
| -------------------- | ------------------------------------------------ |
| **Name** | Displayed on your menu. Keep it short: 1-3 words |
| **Description** | Brief context shown under the category name |
| **Image** | Displayed on category cards in the menu |
| **Navigation Image** | Displayed in the category navigation bar |
| **Available After** | Schedule when the category becomes visible |
### Category Images
Categories support two images:
* **Image** - Shown on category cards when browsing the menu. Use a larger, detailed image that represents the category.
* **Navigation Image** - Shown in the category navigation bar at the top of the menu. Use a smaller, simpler image or icon.
Both are optional but help customers navigate your menu visually.
## Editing Categories
Click the **settings icon** next to a category name to open the category editor. Here you can update all fields and access additional settings.
### Hide From Navigation
On the **Details** tab, toggle **Hide from navigation** to hide a category from the navigation bar while keeping it visible in the main menu. Products remain fully accessible - they just won't have a navigation shortcut.
Use this to keep the navigation bar clean and easy to browse, especially for dine-in venues with many categories.
### Category ID
Every category has a read-only **Category ID**. Open the category editor and scroll to the bottom of the edit panel - it's the last item, just above the save button. It's a long identifier shown in a monospace font; click it to select the whole value, then copy it.
Use it when you need to reference a specific category, for example targeting a **View Category** CTA on a [Menu Story](/docs/guides/marketing/stories), raising a support request, or working with the API.
The **Category ID** is generated by storekit and can't be edited. Products have their own [**Product ID**](/docs/guides/menu/products#product-id).
## Availability
Control when a category and its products are visible to customers.
### Available After
Schedule when a category becomes visible using **Available After**. The category and all its products are hidden until the specified date and time.
Use this to:
* Prepare seasonal menus in advance
* Launch new categories at a specific time
* Coordinate with marketing campaigns
### Category Hours
Categories can have their own opening hours, independent of your store hours:
1. Click the settings icon next to the category name
2. Go to the **Availability** tab
3. Toggle off **Category always available**
4. Set opening and closing times for each day, or toggle **Closed** for days it should be unavailable
When a category is outside its hours, it's hidden from your menu along with all its products, even if the individual products are marked as available.
Category hours are a **weekly** schedule: setting a category to **Closed** on Wednesday closes it every Wednesday, not just the coming one. There is no way to close a single category for one specific date. [Special Opening Hours](/docs/guides/store-settings/opening-hours#special-opening-hours) do apply to a single date, but they close the **whole store** on that date, not one category.
When you toggle off **Category always available**, you must set opening hours for each day you want the category to be visible. If no hours are configured, the category will be hidden from your menu on all days.
**Examples:**
* Breakfast menu: 7am-11am
* Lunch specials: 12pm-3pm
* Happy hour: 4pm-7pm
* Late night menu: 10pm-2am
Category hours work independently of store hours. If your store is open but a category is outside its hours, that category won't be visible.
After creating a new category with custom hours, verify it appears on your live store by placing a test order or previewing the menu during the configured hours. This ensures your hours are set correctly and customers can see the category as expected.
You can set multiple time slots per day if needed (e.g., 7am-11am and 5pm-9pm for a brunch category that also serves dinner).
#### Category hours vs pickup and delivery time slots
Category hours only control **when a category is visible and orderable**. They are evaluated against the **current time** — the moment the customer is browsing — so the category disappears once the clock passes its closing time.
Category hours do **not** restrict which pickup or collection time a customer can then choose at checkout. A Breakfast category set to 07:30–10:45 stops the category showing after 10:45, but a customer browsing at 09:00 can still select any pickup slot your store offers that day (for example up to 14:30) unless you also limit the collection times.
To limit **when an order can actually be collected**, configure the pickup or delivery time windows under **Pre-Orders** — see [Pre-orders](/docs/guides/orders/advanced/pre-orders). There is no single "this item is only collectable before X" setting; the collection window is the combination of the category's hours and the pickup/delivery time windows.
**Customers can still pick a collection time after my category closes.** This is expected — category hours only decide when the category is *shown*, not which collection times are offered. To stop collection after a category closes, set matching pickup or delivery time windows under **Stores** → your store → **Settings** → **Pre-Orders** (for example a **Pickup times** window of 07:30–10:45), or [block specific timeslots](/docs/guides/orders/advanced/block-timeslot). See [Pre-orders](/docs/guides/orders/advanced/pre-orders#limiting-when-an-order-can-be-collected) for the full walkthrough.
### Troubleshooting: items not showing on the menu
If products are marked as available but don't appear on your menu, check the category's [Availability settings](#availability). Confirm that the current time is within the category hours and that its **Available After** date and time have passed.
For POS-synced menus, products may sync from your POS, but category availability is still controlled in storekit. Check the category settings in storekit when synced products are missing.
### Printing
Assign categories to specific printers for split printing. For example, send all "Drinks" orders to the bar printer and "Food" orders to the kitchen printer.
See [Split Printing](/docs/guides/printing/split-printing) for setup instructions.
### Table Area Restrictions
For dine-in stores, you can restrict categories to specific table areas. This is useful for:
* Pool-side menu only available at pool tables
* VIP menu only available in VIP section
## Reordering Categories
The order categories appear in the menu builder is the order customers see. How you reorder them depends on the device you're using.
Open the menu from **Menus** → **Edit** first.
### On a computer (mouse)
Drag a category by its row — grab the row where the category name is shown (the drag icon sits to the left of the name) and drop it in the new position. The new order saves automatically as soon as you drop it; you'll see a **Category order updated** confirmation. There is no separate publish step for the order — once it's saved, customers see the new order.
### On a phone, tablet or touchscreen
Drag and drop is disabled on phones, tablets and touchscreen laptops. If you try to drag a category on a touch device, nothing moves and no error is shown.
On those devices, use the **Sort categories** tool instead:
1. Open the **More actions** menu (the icon with three dots, next to **Settings**)
2. Click **Sort categories**
3. Use the up and down arrows next to each category to move it
4. Click **Save edits**
**Sort categories** only appears on touch devices — on a computer you reorder by dragging instead.
### The order is set per menu
Category order is stored separately for each menu. If a store has more than one menu — for example an eat-in menu and a collection menu — reordering categories on one menu does **not** change the other. Open each menu from **Menus** → **Edit** and set the order on every menu you want to change.
### Reordering products within a category
On a computer, drag a product row up or down within its category to reorder it; like categories, the new order saves automatically on drop.
The same touch limitation applies: product drag and drop is disabled on phones, tablets and touchscreen laptops, and there is **no** Sort tool for products (unlike categories). To reorder products, use a computer with a mouse.
### Troubleshooting: I dragged a category and nothing happened
Drag and drop is disabled on phones, tablets and touchscreen laptops, so the category won't move and no error appears. Either switch to a computer with a mouse, or use the **Sort categories** tool from the **More actions** menu as described in [On a phone, tablet or touchscreen](#on-a-phone-tablet-or-touchscreen).
## Deleting Categories
To delete a category:
1. Click the settings icon next to the category name
2. Go to the **Delete** tab
3. Click **Delete category**
Deleting a category will also delete all products within it. This cannot be undone.
## Multi-language Support
If you've enabled multiple languages, click the translation icon next to text fields to add translations.
See [Translations](/docs/guides/store-settings/translations) for setup.
## Tips
* **Keep names short** - "Starters" not "Starters & Small Plates"
* **Use descriptions** - Help customers understand what's in each section
* **Limit categories** - 5-8 categories is ideal; too many overwhelms customers
* **Order strategically** - Put high-margin categories first
# Compare At Price
Source: https://storekit.com/docs/guides/menu/compare-at-price
Show original prices crossed out next to the current price in storekit to highlight discounts. Visual savings cues create urgency and improve conversion rates.
Compare at price displays an original price crossed out next to the current price, making discounts more visible to customers. This creates urgency and shows customers exactly how much they're saving.
## How It Works
When you set a compare at price on a product:
* The compare at price appears struck through
* The current price displays next to it
* Customers see both prices side by side
For example, a product with a £12.00 price and £15.00 compare at price displays as: ~~£15.00~~ £12.00
## Setting Compare At Price
1. Go to your [storekit dashboard](https://dashboard.storekit.com)
2. Navigate to **Menu**
3. Click into a **Category**
4. Click the product you want to edit
5. In the **Compare At Price** field, enter the original (higher) price
6. Click **Save**
The compare at price should be higher than the current price. If they're the same or the compare at price is lower, the display won't make sense to customers.
## Use Cases
### Limited-Time Promotions
Run a weekend sale by temporarily lowering your product price and setting the original as the compare at price. After the promotion, remove the compare at price and restore the original price.
### Happy Hour Pricing
Highlight happy hour discounts by showing the regular price crossed out next to the reduced price.
### Seasonal Sales
During holiday promotions, use compare at price to show customers exactly how much they're saving on featured items.
### Launch Offers
When introducing new products, offer an introductory price with the future regular price shown as the compare at price.
## Removing Compare At Price
To remove the crossed-out price:
1. Open the product in your dashboard
2. Clear the **Compare At Price** field
3. Click **Save**
The product will display only its current price.
## Tips
* **Don't overuse** - If every item shows a discount, the effect diminishes
* **Be honest** - Only show genuine previous prices to maintain customer trust
* **Time-box promotions** - Set calendar reminders to remove compare at prices when promotions end
* **Consider perception** - Large discounts (30%+) are more attention-grabbing than small ones
# Cost Price
Source: https://storekit.com/docs/guides/menu/cost-price
Track product cost prices in storekit to enable margin analysis, profitability reporting, and AI-powered menu engineering. Never shown to customers.
The cost price field lets you record your cost for each product. This data is never shown to customers and is used for internal reporting and upcoming AI features.
## Setting Cost Price
1. Go to your [storekit dashboard](https://dashboard.storekit.com)
2. Navigate to **Menu**
3. Click into a **Category**
4. Click the product you want to edit
5. Enter your cost in the **Cost** field
6. Click **Save**
Include all costs that go into producing the item - ingredients, packaging, and any per-item labour costs.
## Upcoming: AI-Powered Upsells
Cost data will power advanced AI upsell models that optimise for margin, not just revenue. By understanding your costs, the AI can:
* Recommend high-margin items during checkout
* Suggest add-ons that maximise profitability
* Prioritise upsells based on contribution margin rather than price alone
Adding cost data now means you'll be ready when these features launch.
## Best Practices
* **Keep costs updated** - Review and update costs quarterly or when supplier prices change
* **Be consistent** - Use the same cost calculation method across all products
* **Include everything** - Factor in packaging, waste, and any per-unit costs
# Course Assignments
Source: https://storekit.com/docs/guides/menu/course-assignments
Assign storekit products to courses (starter, main, dessert) for dine-in POS integration. Drive ordered kitchen flow on KDS, printers, and table service.
Course assignments control which POS course a product is sent to when orders are placed for dine-in. This allows kitchen display systems and printers to organise items by course (starters, mains, desserts) rather than in the order they were added to the cart.
Course assignments only apply to dine-in orders. Delivery and pickup orders ignore this setting.
## Supported POS Systems
| POS | How Courses Work |
| ----------------------- | ------------------------------------------------------------------------ |
| **Lightspeed K-Series** | Item-level course number (0, 1, 2, etc.) sent with each product |
| **TISSL** | Venue-level default course applied to all items |
| **Zonal (Aztec)** | Item-level course ID, or selectable via a "Select Course" modifier group |
## Setting Course Assignments
### Lightspeed K-Series
Each product can have its own course number:
1. Go to your [storekit dashboard](https://dashboard.storekit.com)
2. Navigate to **Menu**
3. Click into a product
4. In the **Course** field, enter the course number (e.g., `0` for starters, `1` for mains, `2` for desserts)
5. Click **Save**
Course numbers typically start at 0. Check your Lightspeed configuration to confirm which numbers map to which courses.
### TISSL
TISSL uses a venue-level default course for all items. Configure this in your TISSL integration settings, or [contact support](/docs/getting-started/contact-support) for assistance.
### Zonal (Aztec)
Zonal (Aztec) supports two approaches:
1. **Item-level**: Set the course ID directly on each product
2. **Modifier-based**: A "Select Course" modifier group lets customers choose when items are served
When syncing menus from Zonal (Aztec), course information is imported automatically from your Zonal menu configuration.
## Use Cases
### Multi-Course Dining
For restaurants offering set menus or multi-course experiences:
* Assign starters to course 0
* Assign mains to course 1
* Assign desserts to course 2
The kitchen receives items grouped by course, allowing proper timing of preparation.
### Fire-on-Demand
Some POS systems support "fire on demand" where courses are held until the server triggers them. Course assignments ensure items are grouped correctly for this workflow.
## Troubleshooting
**Items not appearing in correct course:**
* Verify the course number matches your POS configuration
* Check that the order is for dine-in (courses are ignored for delivery/pickup)
* Ensure your POS integration is configured to use course data
# CSV Import
Source: https://storekit.com/docs/guides/menu/csv-import
Import a storekit menu from a CSV or Excel spreadsheet: the template, the columns you can map, and why modifiers and tax rates can't be imported.
A spreadsheet import builds a store's categories and products in one go, so you don't type a long menu into the dashboard by hand. It covers products only — modifiers, modifier groups and tax rates are added afterwards in the menu builder.
The import is only available for a store that has **no menu**. If the store already has one, archive it first — see [Replacing a store's menu](/docs/guides/menu/managing-menus#replacing-a-stores-menu).
## Importing a Menu
Go to **Stores**, click **Create a menu** on the store card, then **Spreadsheet Import**. On the **Import from a spreadsheet** page, click **Download Excel file** or **Download CSV file**.
One row per product, using the columns in the table below. Keep category names spelled consistently — categories are matched by name, so "Starters" and "Starter" create two categories.
Click **Import** on the same page and choose your file. A file is required; you cannot type rows in by hand.
The uploader — headed **Menu import** — asks you to match each column in your file to a storekit field, then shows your rows so you can fix anything it flags as invalid. This part of the screen comes from our import tool, so its buttons are its own.
Submit the reviewed rows. storekit creates a menu called **CSV Import Menu** for that store and opens it in the menu builder. Rename it from **Settings** → **Name** if you want something else.
## Columns You Can Import
| Column | Required | Notes |
| --------------------------- | -------- | ------------------------------------------------------------------- |
| **Category Name** | Yes | Categories are matched by name, so keep spelling consistent |
| **Product Name** | Yes | |
| **Product description** | No | |
| **Product Price** | Yes | The product's base price. Numbers only — no currency symbol |
| **Product Inventory Count** | No | Whole number stock count |
| **Product sorting** | No | Whole number; 0 is the top of the category |
| **Product PLU / SKU** | No | |
| **Allergens** | No | One or more tags from the fixed list below, comma-separated |
| **May contain allergens** | No | Same fixed allergen list |
| **Dietary tags** | No | One or more tags from the fixed dietary list below, comma-separated |
| **Is Popular?** | No | Yes/no — highlights the item on your menu |
| **Product Image URL** | No | Link to an image storekit can download |
| **Product POS ID** | No | Only needed for direct POS integrations |
That list is the whole import. There is no column for modifiers, modifier groups or tax rates.
### Allergen Tags
The allergen list is fixed. **Allergens** and **May contain allergens** accept only these values: Celery, Gluten, Crustaceans, Fish, Eggs, Lupin, Milk, Molluscs, Mustard, Nuts, Peanuts, Sesame, Soya, Sulphites, Almonds, Barley, Brazil Nuts, Cashew, Hazelnuts, Kamut, Macadamia, Oats, Pecan, Pistachio, Rye, Spelt, Walnuts, Wheat, Sugared Drink, Dairy, Lentils, Queensland Nuts, Shellfish, Treenuts, Sources of gluten.
### Dietary Tags
**Dietary tags** accepts only these values: Alcohol, Halal, Kosher, Vegan, Vegetarian, Tobacco, E-cigarette, Vapes, Smokeless tobacco, No allergens, Gluten Free, Sugar Free, Lactose Free.
## Modifiers Cannot Be Imported
Modifiers, modifier groups and tax rates can't be imported from a spreadsheet. The import takes one file of products — a second file of modifiers cannot be uploaded, and there is no modifier or tax column to map. Add them after the import.
After the products land:
* Add modifier groups per product from **Menus** → **Edit** → the product → **Modifiers**. Groups are shared, so build a group once and attach it to other products with **Use an existing group** — see [Modifiers](/docs/guides/menu/modifiers#reusing-modifier-groups).
* Set **Tax Rate** on each product in the product panel — see [Products](/docs/guides/menu/products).
* To edit many products at once, use **Grid View** from **More actions** in the menu builder.
The menu **Export CSV** does produce a separate `Modifiers_` file, but it is for reviewing your modifiers in a spreadsheet — it cannot be imported back in. See [Seeing All Your Modifier Groups](/docs/guides/menu/modifiers#the-menu-csv-export).
## Troubleshooting
The store already has a menu, so the import options are out of reach. Archive the existing menu, reload the **Stores** page, then click **Create a menu** — see [Replacing a store's menu](/docs/guides/menu/managing-menus#replacing-a-stores-menu).
Prices must be numbers, so strip currency symbols and thousands separators. **Product Inventory Count** and **Product sorting** must be whole numbers. Allergen and dietary values must match the fixed lists above exactly, comma-separated, with nothing extra in the cell.
Header names don't have to match ours — you map each column to a storekit field during the import. Give every column a single header row, and check that **Category Name**, **Product Name** and **Product Price** are all mapped before continuing.
Categories are created from **Category Name** as written. Fix the spelling in your file and import again into a fresh menu, or move the products in the menu builder.
## Related Guides
Replace, archive and un-archive a store's menu
Prices, images, tax rates and product details
Add modifier groups after importing
How allergen and dietary tags appear to customers
# Custom Filters
Source: https://storekit.com/docs/guides/menu/custom-filters
Help customers find the right items on large menus with custom storekit filters for diet, calorie range, ingredients, and preferences. Reduce abandonment.
**Early access** — Custom Filters is currently in early access. If you'd like to enable it for your store, please reach out to us on live chat.
**storekit+ required** — Custom Filters are available on storekit+ and higher subscription plans.
Large menus can feel overwhelming. Customers scroll past dozens of items looking for something that fits their diet, nutritional goals, or preferences — and sometimes give up before they order. Custom Filters solve this by letting customers instantly narrow down your menu to exactly what they're looking for.
Whether your customers are counting calories, avoiding gluten, or looking for high-protein meals, Custom Filters put them in control — and help you turn more browsers into buyers.
## How It Works
You define the filters, and storekit takes care of the rest. When a customer taps a filter, the menu instantly updates to show only the products that match. No page reloads, no waiting — it just works.
Filters appear in two places:
* **Filter bar** — Quick-access buttons shown directly on the menu page for one-tap filtering
* **Filters modal** — A dedicated panel where customers can browse and combine multiple filters at once
Customers can stack filters to get more specific results. When multiple filters are active, only products matching **all** of them are shown.
## Why It Matters
* **Reduce decision fatigue** — Customers find what they want faster, especially on menus with 50+ items
* **Increase conversion** — When customers can quickly find dishes that match their needs, they're more likely to order
* **Stand out** — Most online ordering platforms don't offer this level of personalisation
* **Cater to health-conscious diners** — Nutrition-based filters appeal to the growing number of customers who care about what they eat
## Example Filters
Here are some examples of filters you could create:
| Filter | What It Does |
| ------------------- | ------------------------------------------- |
| **Light Bites** | Shows meals below a calorie threshold |
| **Protein Packed** | Shows meals meeting a minimum protein level |
| **Low Sugar** | Shows meals with sugar below a set amount |
| **Plant Based** | Shows items tagged as vegetarian |
| **Gluten Friendly** | Shows items tagged as gluten-free |
These are just examples — filters are fully customisable to suit your menu and your customers.
## Filter Types
Custom Filters support different ways of matching products:
* **Nutrition-based** — Filter by calories, protein, sugar, fibre, or any other nutritional value on your products
* **Tag-based** — Filter by tags you've already added to your products (e.g. "vegan", "gluten-free")
* **Combined** — Create filters that require multiple conditions to be met at once (e.g. a calorie range *and* a minimum protein level)
## What Customers See
When Custom Filters are enabled, customers see filter buttons above the menu. Tapping a filter immediately hides products that don't match, making it easy to browse a large menu without scrolling through items that aren't relevant.
If no products match the selected filters, a friendly message is shown with an option to clear all filters.
## Getting Started
Custom Filters are configured for your store by the storekit team during early access. To get started:
1. **Decide on your filters** — Think about what your customers care about most (nutrition, dietary preferences, meal types, etc.)
2. **Make sure your products have the right data** — Filters work best when your products have complete [nutritional information](/docs/guides/menu/nutrition-info) and [tags](/docs/guides/menu/tags-allergens)
3. **Reach out to us** — Contact us on live chat and we'll set up your filters
Custom Filters work alongside the existing dietary and allergen filters. Customers can use both at the same time.
# Deposits
Source: https://storekit.com/docs/guides/menu/deposits
Add bottle deposits, container charges, or Pfand to storekit products. Refundable charge displayed separately from the price for transparency at checkout.
The deposit field adds a refundable charge to products, typically used for bottle deposits (Pfand) or reusable container schemes. The deposit amount is displayed separately from the product price, making it clear to customers what portion is refundable.
## How It Works
When a product has a deposit:
* The deposit amount is added to the product's total price
* Customers see "Includes bottle deposit: £X.XX" on the product page
* The deposit is included in the order total
## Setting Up Deposits
1. Go to your [storekit dashboard](https://dashboard.storekit.com)
2. Navigate to **Menu**
3. Click into a product
4. In the **Deposit** field, enter the deposit amount
5. Click **Save**
Enter the deposit in your currency's main unit (e.g., 0.25 for 25p or €0.25).
## Regional Requirements
Bottle deposit schemes are mandatory in several regions:
| Region | Typical Deposit |
| ---------------------------- | ------------------------------------ |
| **Germany** (Pfand) | €0.08 - €0.25 depending on container |
| **Netherlands** (Statiegeld) | €0.15 - €0.25 |
| **Sweden** (Pant) | 1-2 SEK |
| **Norway** | 2-3 NOK |
Check your local regulations for specific requirements.
## POS Integration
Deposits sync automatically when importing menus from supported POS systems:
* **Deliverect**: Imports deposit from `supplementalInfo.deposit`
* **PointOne**: Imports deposit field directly
For other POS systems, set deposits manually in the dashboard.
## Use Cases
### Bottle Deposits
Required by law in many European countries for:
* Glass bottles
* Plastic bottles
* Aluminium cans
### Reusable Container Schemes
Some restaurants use deposits for:
* Reusable takeaway containers
* Reusable coffee cups
* Meal prep containers
### Equipment Rental
Deposits can also be used for:
* Picnic equipment rental
* Catering equipment deposits
# Free Modifiers
Source: https://storekit.com/docs/guides/menu/free-modifiers
Offer customers a set number of free modifier selections before charging for additional choices. Common for pizza toppings, salad bars, and bowls.
Free modifiers let you offer customers a set number of complimentary selections from a modifier group before charging for additional choices. This is commonly used for pizza toppings, salad add-ons, or drink customisations.
## How It Works
When you set a free modifier count on a modifier group:
1. The first N selections are free (no additional charge)
2. Selections beyond the free limit are charged at their listed price
3. Pricing updates automatically as customers add or remove selections
### Example
A pizza with `freeModifiers: 3` on the "Extra Toppings" group:
| Selection | Price Charged |
| -------------------------- | ------------- |
| 1st topping (Pepperoni) | Free |
| 2nd topping (Mushrooms) | Free |
| 3rd topping (Olives) | Free |
| 4th topping (Extra Cheese) | £1.50 |
| 5th topping (Jalapeños) | £1.50 |
## Setting Up Free Modifiers
This feature requires support to enable for your account. [Contact support](/docs/getting-started/contact-support) to request access.
Once enabled, provide support with:
1. The modifier group name or ID
2. The number of free selections to allow
## Use Cases
### Pizza Toppings
"Choose up to 3 toppings included, additional toppings £1.50 each"
* Set `freeModifiers: 3` on the toppings modifier group
### Build-Your-Own Bowls
"Includes 4 ingredients, extras charged separately"
* Set `freeModifiers: 4` on the ingredients modifier group
### Coffee Customisations
"First flavour shot free, additional shots 50p"
* Set `freeModifiers: 1` on the flavour shots modifier group
### Salad Bar
"Choose 5 toppings with your salad"
* Set `freeModifiers: 5` on the toppings modifier group
## POS Integration
### Zonal (Aztec)
When importing menus from Zonal (Aztec), the "inclusive" count from choice groups is automatically mapped to `freeModifiers`. If any modifier in the group has a supplemental price, the inclusive count is set to 0 (all selections are charged).
## Pricing Logic
The system automatically applies free allocations to the **most expensive** selections first, ensuring customers always get the best deal:
1. All selected modifiers are sorted by price (highest first)
2. Free allocations are applied starting with the most expensive items
3. Cheaper items are charged if selections exceed the free limit
### Example
With `freeModifiers: 2` and these selections:
* Bacon (£2.00)
* Cheese (£1.50)
* Peppers (£0.50)
Result:
* Bacon: **Free** (most expensive)
* Cheese: **Free** (second most expensive)
* Peppers: **£0.50** (charged)
Customers don't need to think about selection order - the system always optimises to give them the maximum discount automatically.
# Inventory Management
Source: https://storekit.com/docs/guides/menu/inventory-management
Track storekit stock levels for products and modifiers to prevent overselling. When inventory hits zero, items show as unavailable to customers online.
Inventory tracking lets you set stock levels for products and modifiers. When stock reaches zero, the item automatically shows as unavailable to customers, preventing overselling.
## Enabling Inventory for Products
1. Go to **Menu** > **Edit Menu**
2. Click on the product you want to track
3. Toggle **Track Inventory** on
4. Enter the current stock count
5. Click **Save**
Stock decreases automatically with each order. When inventory reaches zero, the product shows as unavailable — by default it stays on the menu greyed out and marked **Currently sold out**, or it is removed entirely if the menu's [Unavailable Product Options](/docs/guides/menu/availability-snoozing#unavailable-product-options) is set to **Hide**.
## Enabling Inventory for Modifiers
Modifier options also support inventory tracking:
1. Edit the modifier option
2. Toggle **Track Inventory** on
3. Set the stock count
4. Click **Save**
When a modifier option runs out, it becomes unavailable — by default it stays in the modifier group greyed out and not selectable, or it is removed from the group entirely if the menu's [Unavailable Product Options](/docs/guides/menu/availability-snoozing#unavailable-product-options) is set to **Hide**. If it was the only option in a required modifier group on **Hide**, the parent product disappears from the menu too.
## Restocking
To reset stock levels:
1. Edit the product or modifier option
2. Update the stock count to the new quantity
3. Click **Save**
The item becomes available again immediately once stock is above zero.
## Use Cases
| Scenario | Example |
| ------------------ | ----------------------------------------------- |
| **Daily specials** | Set stock count each morning for limited dishes |
| **Limited items** | Track high-demand items with supply constraints |
| **Flash sales** | Cap availability for promotional items |
| **Seasonal stock** | Manage items with limited seasonal supply |
For products that share ingredients (e.g., pizza dough used across multiple pizzas), use shared inventory to track a single stock pool. Counts are manual and don't reset overnight. See [Shared Inventory](/docs/guides/tips-tricks/shared-inventory).
## Inventory vs Snoozing
Inventory tracking automatically marks items as unavailable when stock runs out. For manually hiding items temporarily, use [Availability & Snoozing](/docs/guides/menu/availability-snoozing) instead.
| Method | Automatic | Use Case |
| -------------------- | ------------------------------- | ------------------------ |
| **Track Inventory** | Yes — unavailable at zero stock | Quantity-limited items |
| **Snooze** | Yes — restores after duration | Temporarily out of stock |
| **Toggle Available** | No — manual restore | Permanent removal |
# Managing Menus
Source: https://storekit.com/docs/guides/menu/managing-menus
How menus are assigned to stores in storekit, how to replace a store's menu by archiving the old one, and how to archive or un-archive a menu.
Every menu in storekit belongs to **one store**. This page explains where menus are listed, how to replace the menu a store uses, and how archiving works.
## Menus are per store
A menu is created for a single store and stays attached to it. You cannot point a second store at a menu built for another store, and a store cannot select a menu from a list of existing menus.
To use the same items in another store, build or import the menu again for that store. A [CSV import](/docs/guides/menu/csv-import) is usually the quickest way to recreate the same items in a second store.
## Where menus are listed
Go to **Menus** in the left-hand navigation. Each card shows:
* The menu name, with an **Archived** or **Inactive** label where it applies
* **The store the menu belongs to**, on the line directly underneath the menu name
* How many items and categories it has, when it was last synced (POS menus) and when it was created
* **Edit** to open the menu builder
Use **Search menus...** at the top of the page to filter by menu name.
You can also see a store's menus on the **Stores** page: each store card lists its menus, with an **Edit** link next to each one.
### Show archived menus
Archived menus are hidden from the **Menus** list. If the account has any, a **Show archived menus** link appears at the bottom of the list — click it to include them. Archived menus stay greyed out and carry an **Archived** label.
If you see no such link, there are no archived menus to show.
## Replacing a store's menu
The page that asks how you want to build your menu (**Now, let's setup your menu**, with the **Automatic Upload**, **Enter Manually** and **Spreadsheet Import** options) is only reachable while the store has **no menu**. On the **Stores** page, the **Create a menu** link appears on a store card only when that store has no menus.
This is why you cannot get back to the import options once a menu exists — even if that menu is the empty one created by **Enter Manually**. To start again:
Open the menu from **Menus** → **Edit**, then archive it as described below.
Go to **Stores** and refresh the page so the store's menu list is up to date. The **Create a menu** link reappears on the store card.
Click **Create a menu** and pick how to build it: **Automatic Upload** (import from an existing online menu or website), **Enter Manually** (build it in the menu builder) or **Spreadsheet Import** (a CSV or Excel file).
While a store has no active menu, customers have nothing to order from its ordering page. Archive the old menu only when you are ready to build or import the replacement.
## Menu-level settings
Some settings belong to the menu rather than to a product or a store. Open them from **Menus** → **Edit** → **Settings**, which slides in the **Menu Settings** panel:
* **Name** — the menu name shown in the dashboard
* **Unavailable Product Options** — whether unavailable items are **Disable** (*Visible but greyed out*, the default) or **Hide** (*Completely removed*) on your ordering page. See [Availability & Snoozing](/docs/guides/menu/availability-snoozing#unavailable-product-options)
* **Image** — an optional image for the menu
* **Archive** / **Un-archive** Menu — see below
Click **Save changes** to apply the name, unavailable product option and image.
## Archiving and un-archiving a menu
1. Go to **Menus** and click **Edit** on the menu
2. Click **Settings**
3. At the bottom of the panel, click the **Archive** Menu button
4. Confirm the prompt
Archiving removes the menu from the active list — it does not delete it. To bring it back, show archived menus, open the menu, click **Settings** and click the **Un-archive** Menu button.
## Check the store before you build
After creating a menu, confirm the store name shown under the menu name on the **Menus** list is the store you meant. Adding a lot of items to a menu attached to the wrong store means rebuilding them.
A menu cannot be moved between stores from the dashboard. If a menu ends up attached to the wrong store, [contact support](/docs/getting-started/contact-support) — we can look at it for you.
## Bulk-Editing a Menu in Grid View
**Grid View** shows a whole menu as a spreadsheet, one row per product, so you can change the same field on many products without opening each product panel. It is the fastest way to update **Tax Rate %** across a menu — for example when VAT rates change or when the wrong rate was applied on import.
To open it, go to **Menus** → **Edit** on the menu, click the **More actions** button at the top of the menu builder and choose **Grid View**.
Grid View is enabled per account. If the **Grid View** option is missing from the actions menu, [contact support](/docs/getting-started/contact-support) and ask for it to be turned on.
Click a cell to edit it in place. Each change is saved to the product as soon as you leave the cell — you will see **Product updated successfully** confirm each save, and there is no separate save step.
Product columns:
| Group | Columns |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| Identity | **Category** and **Modifier Groups** (read-only), **Name**, **Description**, **Printer Name**, **Course** |
| Pricing and tax | **Price**, **Compare at Price**, **Tax Rate %**, **Delivery Tax Rate %** |
| POS codes | **PLU**, **SKU**, **POS ID** |
| Availability | **Available**, **Popular**, **Track Inventory**, **Inventory** |
| Content | **Image**, **Video**, **Allergens**, **Ingredients** |
| Nutrition | **Calories (kcal)**, **Salt (g)**, **Carbs (g)**, **Carbs Sugars (g)**, **Fats (g)**, **Fat Saturates (g)**, **Fibre (g)**, **Protein (g)** |
Expand a product row to edit its modifier groups (**Name**, **Description**, **Min Selection**, **Max Selection**, **PLU**, **POS ID**, **Print as Items**) and, under each group, its options (**Name**, **Price**, **POS ID**, **Course**, **PLU**, **Available**, **Popular**, **Track Inventory**, **Inventory**, **Ingredients**, **Image**).
On a POS-synced menu, Grid View only lets you change **Available**, **Course**, **Video**, **Ingredients** and the nutrition columns. Other cells are reverted with the message **You cannot edit items here. Please make changes in your POS system** — see [POS Menu Sync](/docs/guides/menu/pos-menu-sync).
The [CSV import](/docs/guides/menu/csv-import) has no tax-rate column, so re-importing a spreadsheet is not a way to change tax rates in bulk — use Grid View, or edit each product's **Tax Rate** in its [product settings](/docs/guides/menu/products).
## Related Guides
How categories, products, and modifiers fit together
Bulk import products from a spreadsheet
Sync your menu with your POS system
Control when items are available
Edit a single product's price, tax rate and settings
# Modifiers
Source: https://storekit.com/docs/guides/menu/modifiers
Let customers customise storekit products with modifier groups. Configure options, min/max selections, free choices, pricing, and required vs optional.
Modifiers let customers customise products. They're organised into **modifier groups** - each group contains options and rules about how many can be selected.
## Examples
| Modifier Group | Options | Rules |
| ---------------- | ------------------------------- | ------------------------ |
| Choose your size | Small, Medium, Large | Required, pick exactly 1 |
| Add toppings | Pepperoni, Mushrooms, Olives... | Optional, pick up to 5 |
| Select your base | White rice, Brown rice, Noodles | Required, pick 1 |
| Extra sauces | Ketchup, Mayo, BBQ... | Optional, pick any |
## Creating a Modifier Group
1. Go to **Menus** → **Edit** on the menu, then click a product to open the editor
2. Go to the **Modifiers** tab
3. Under **Add a modifier group**, click **Create a new group**
4. Enter a **Name** (e.g., "Choose your size")
5. Click **Add an option** for each option and give it a name and a **Price**
6. Set how many options customers can choose under **How many options can customers choose?**
7. Click **Save Modifiers**
## Modifier Group Settings
### Name & Description
| Field | Description |
| --------------- | --------------------------------------------- |
| **Name** | Shown to customers (e.g., "Choose your size") |
| **Description** | Optional extra context |
| **SKU / PLU** | For POS integration |
### Selection Rules
Set how many options customers must/can choose:
| Setting | Example | Behaviour |
| --------------- | --------------- | -------------------------- |
| Min: 1, Max: 1 | Choose a size | Required, pick exactly one |
| Min: 0, Max: 3 | Add toppings | Optional, pick up to 3 |
| Min: 2, Max: 4 | Pick your sides | Required, pick 2-4 |
| Min: 0, Max: 10 | Extra sauces | Optional, pick any number |
Set **Min: 0** to make a modifier group optional. Set **Min: 1** or higher to make it required.
### Allow Multiple of Same Option
Enable **Allow customers to select an option more than once** for cases like:
* "2x extra cheese"
* "3x bacon"
You can optionally set a specific limit per option.
### Free Modifiers
Set a number of **Free Modifiers** to give customers a certain number of free selections before charging. Useful for:
* "First 3 toppings free, then £0.50 each"
* "Includes 2 sauces, extra sauces £0.30"
## Modifier Options
Each option within a group has:
| Field | Description |
| ------------------ | -------------------------------- |
| **Name** | Option name shown to customers |
| **Price** | Additional cost (can be £0) |
| **Original Price** | For showing discounts on options |
| **POS ID** | For POS integration |
| **Tax Rate** | Override default tax |
| **Default Qty** | Pre-select this option |
| **In Stock** | Toggle availability |
### Default Quantity
Pre-select options by setting a default quantity. The total of all default quantities cannot exceed the group's maximum.
### Option Availability
Toggle **In Stock** off to temporarily hide an option without deleting it.
### Tags & Allergens
Modifier options can have their own allergen information, dietary tags, and nutrition data. When a customer selects options, the combined allergen information from the product and all selected modifiers is shown.
See [Tags & Allergens](/docs/guides/menu/tags-allergens) for details.
## Pricing Variants with Modifiers
Some products come in variants that cost different amounts - for example ravioli "classici" at £6 and ravioli "grigliati" at £7. Instead of creating a separate product for each variant, set a base price and use a required modifier group where each option carries the price difference.
1. Set the product's [**Price**](/docs/guides/menu/products) to your cheapest variant (e.g., £6)
2. Add a modifier group named for the choice (e.g., "Type")
3. Set the selection rules to **Min: 1, Max: 1** so it's required and the customer picks exactly one
4. Add one option per variant, with the **Price** set to the difference from the base price:
| Option | Price | Customer Pays |
| --------- | ----- | -------------------- |
| Classici | £0.00 | £6.00 (base only) |
| Grigliati | £1.00 | £7.00 (base + £1.00) |
The customer always sees the correct total for the variant they choose, and you manage one product instead of several.
The option matching your base price should be **£0.00** - its price is already included in the product's base price.
## Display Settings
### Initial Display Setting
**Initial display setting** controls how the modifier group appears on the product page:
| Setting | Behaviour |
| ------------- | ----------------------------------------------------------------------------------------------------- |
| **Expanded** | Options visible immediately (default) |
| **Collapsed** | Options hidden behind a tap/click |
| **Hidden** | Group not shown to the customer at all. Greyed out until storekit support enables it for your account |
### Print as Products
Enable **Print modifier options as products** to print each selected modifier on its own line on receipts, rather than as sub-items under the product.
## Reusing Modifier Groups
You can attach existing modifier groups to multiple products:
1. Open a product's **Modifiers** tab
2. Under **Add a modifier group**, click **Use an existing group**
3. Find the group in the list and click **Add group to product**
Changes to a shared modifier group affect all products using it — the dashboard says so on that screen: "Use an existing modifier group. Note that any changes made to a shared modifier group will be applied against all products".
Editing a shared modifier group updates it everywhere it's used. Create a new group if you need different options for specific products.
## Seeing All Your Modifier Groups
There is no page in the dashboard that lists every modifier group. Groups belong to the products that use them: you create and edit a group from any product it is on (**Menus** → **Edit** → the product → **Modifiers**), and because groups are shared, editing one from a single product changes it for every product using it — see [Reusing Modifier Groups](#reusing-modifier-groups).
Two ways to review your groups without opening every product one by one.
### The Existing-Group List
On any product, **Modifiers** → **Use an existing group** lists every modifier group on that menu, with its **SKU** and an **items** link showing the group's options. Groups already on the product you opened read **Already added**.
The list is per menu and read-only: use it to check what exists, then open the group from a product that uses it to change anything. Click **Go Back** to leave without attaching a group.
### The Menu CSV Export
To review every group and option in a spreadsheet, export the menu:
Go to **Menus** → **Edit** on the menu you want.
Click **More actions** (the icon with three dots, next to **Settings**).
Click **Export CSV**, choose **CSV for Excel, Number, or other spreadsheet programs** or **Plain CSV file**, then confirm with the **Export** button.
The download is a `Menu.zip` holding two files. The one whose name starts with `Modifiers_` is the modifier list: one row per modifier option, with the group it belongs to in the **Modifier Group** and **Modifier Group ID** columns and the option's own name, **Price**, **PLU**, **SKU**, allergens and availability alongside it. The other file lists your products, where **Modifier Groups** is the number of groups on each product rather than their names.
The columns are fixed — the export dialog only chooses between the two CSV formats. The modifier file covers one menu at a time and only includes groups attached to at least one product on it, so a group you created and never attached will not appear.
## Reordering
* Drag modifier groups to change their order on the product
* Drag options within a group to change their order
## Deleting Modifier Groups
1. Open the group from a product's **Modifiers** tab
2. Click **Remove Group**
This removes the group from the current product. If it's shared with other products, it remains on those products.
## Tips
* **Name groups clearly** - "Choose your size" not "Size options"
* **Order options logically** - Smallest to largest, or most popular first
* **Use £0 options** - For substitutions or preferences (e.g., "No onions")
* **Set sensible limits** - Too many options overwhelms customers
* **Use free modifiers** - Encourages customisation without complexity
# Multi Max
Source: https://storekit.com/docs/guides/menu/multi-max
Use Multi Max in storekit to control how many of a single modifier option a customer can pick — separate from the group's overall maximum selection limit.
Multi Max controls how many of a single modifier option a customer can select. This is different from the group's `max` setting, which limits total selections across the entire group.
## How It Works
When `multiMax` is greater than 1 on a modifier group:
* A quantity stepper appears next to each selected modifier
* Customers can add multiple of the same option (e.g., 3x Extra Cheese)
* Each unit is priced and charged individually
### Example
A burger with a "Extras" modifier group:
| Setting | Value |
| ------------ | ---------------------------- |
| **max** | 5 (total extras allowed) |
| **multiMax** | 3 (max per individual extra) |
Customer can select:
* 3x Extra Cheese
* 2x Extra Bacon
* Total: 5 extras ✓
But not:
* 4x Extra Cheese (exceeds multiMax of 3) ✗
## Max vs Multi Max
| Setting | Controls | Example |
| ------------ | --------------------------------- | ------------------------- |
| **max** | Total selections across the group | "Choose up to 4 toppings" |
| **multiMax** | Quantity per individual option | "Up to 2 of each topping" |
When both are set:
* `max: 6, multiMax: 2` → Customer can pick up to 6 total toppings, but no more than 2 of any single topping
* `max: 0, multiMax: 3` → No total limit, but max 3 of each option
Set `multiMax: 1` (the default) when customers should only be able to add each option once, like pizza base choices or drink sizes.
## Use Cases
### Extra Toppings
Allow multiple portions of premium toppings:
* "Add up to 3 portions of any topping"
* Each portion charged separately
### Shot-Based Drinks
Coffee shops offering multiple espresso shots:
* `multiMax: 4` for espresso shots
* Customer can order a quad-shot latte
### Sauces & Sides
Let customers load up on their favourites:
* "Extra sauce portions available"
* `multiMax: 3` for each sauce option
### Protein Add-Ons
Bowl or salad builders:
* "Double or triple your protein"
* `multiMax: 3` for chicken, tofu, etc.
## Setting Up Multi Max
1. Go to your [storekit dashboard](https://dashboard.storekit.com)
2. Navigate to **Menu**
3. Click into a product, then open a **Modifier Group**
4. Set the **Multi Max** value (e.g., 3 to allow up to 3 of each option)
5. Click **Save**
# Nested modifiers: setup, POS support, and nesting depth
Source: https://storekit.com/docs/guides/menu/nested-modifiers
Configure nested modifier groups in storekit for build-your-own menus, with per-POS support and nesting depth guidance for Toast, Deliverect, Stream, and Zonal.
Nested modifiers allow you to display additional modifier groups only when a customer selects a specific option. This keeps your menu clean and guides customers through complex customisation flows.
## How It Works
When a customer selects a modifier option that has nested modifiers attached, additional modifier groups appear below. If they change their selection, the nested groups update accordingly.
**Example: Build Your Burger**
1. Customer sees "Choose your patty" with options: Beef, Chicken, Veggie
2. Customer selects "Beef"
3. A new modifier group appears: "How would you like it cooked?" with options: Rare, Medium, Well Done
4. If customer changes to "Veggie", the cooking preference disappears (not applicable)
## Common Use Cases
| Scenario | Parent Modifier | Nested Modifier |
| ----------------------------- | -------------------------------- | ------------------------------------------- |
| **Burger cooking preference** | Patty type (Beef/Chicken/Veggie) | Cooking preference (only for Beef) |
| **Pizza size extras** | Size (Small/Medium/Large) | Extra toppings (different options per size) |
| **Drink customisation** | Drink type (Coffee/Tea/Smoothie) | Milk options (only for Coffee/Tea) |
| **Meal deals** | Main course selection | Side options specific to that main |
## Supported Integrations
Nested modifiers are supported when syncing menus from:
* **Deliverect**
* **Stream**
* **Toast**
* **Zonal Aztec**
On a menu synced from a POS or menu management system, nested modifiers are configured there and sync automatically to storekit. On a menu you build in storekit, attach them per option: click the pencil icon on a modifier option to open the **Edit modifier** panel, then use the **Sub-Modifiers** tab.
## Nesting Depth
How many levels of nesting sync across depends on the integration.
| Integration | Nesting depth |
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Deliverect** | A single level of nesting today (one modifier group nested under a modifier option). Deeper levels are not synced yet. |
| **Toast** | Multiple levels — Toast menus sync nested groups recursively, so there is no fixed limit built in. Around two levels is what we've tested and recommend. |
| **Stream** | Nested modifier groups sync as configured in Stream. |
| **Zonal Aztec** | Nested modifier groups sync as configured in Aztec. |
Very deep nesting (three or more levels) is not guaranteed. Even where the integration has no hard limit, deeply nested structures are harder for customers to complete and can behave unexpectedly. Keep nesting shallow — one or two levels — for the most reliable experience.
## Customer Experience
Nested modifiers provide a cleaner checkout experience:
* Customers only see relevant options based on their selections
* Reduces overwhelm from too many choices at once
* Guides customers through logical customisation steps
* Prevents invalid combinations (e.g., cooking preference for a veggie burger)
## How Selections Are Handled
When a parent modifier selection changes:
1. Any nested modifier groups for the previous selection are hidden
2. Selections in those hidden groups are cleared
3. New nested modifier groups for the current selection appear
4. Required nested modifiers must be completed before checkout
If a nested modifier group is required, customers must complete it before adding the item to their basket. Make sure your menu structure accounts for this.
## Why a product shows as sold out when its modifiers are unavailable
A modifier group with a minimum of 1 or more is required: the customer cannot order the product without a valid selection in it. If a required **top-level** group has **no available options left**, the product itself becomes unavailable — not just that group.
Required **nested** groups behave differently. Because nested groups only appear after the customer picks a parent option, the ordering page does not pre-emptively grey out the product. Instead, the product stays orderable — but when the customer picks the parent option that reveals the empty required nested group, they cannot complete the item and cannot add it to the basket.
A real case: an "Add Polpette" option on a pasta dish revealed a required nested group with two options, chicken and beef meatballs. Both meatball options went unavailable, which left the required nested group with no options. On **Hide**, every pasta dish using it showed as sold out. On **Disable**, the pasta still looked orderable but customers who selected "Add Polpette" could not add it to their basket.
### What the customer sees
What happens on the ordering page depends on the menu's [Unavailable Product Options](/docs/guides/menu/availability-snoozing#unavailable-product-options) setting, because that is what decides whether unavailable options are still listed in the group:
| Setting | Behaviour for a required top-level group with no options left | Behaviour for a required nested group with no options left |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Disable** (default) | Unavailable options stay in the group, greyed out and labelled **(Currently unavailable)**. The product itself shows greyed out with **Currently sold out** in place of its description. | Unavailable options stay in the nested group, greyed out. The product still looks orderable on the product list. Customers who select the parent option that reveals the empty nested group cannot complete the item and cannot add it to the basket. |
| **Hide** | Unavailable options are removed from the group. That empties the required group, so the product shows greyed out with **Currently sold out** in place of its description. The product is not removed from the menu. | Unavailable options are removed from the nested group. That empties it, so the product shows greyed out with **Currently sold out** in place of its description. The product is not removed from the menu. |
A required group that has no options configured at all — for example a group that synced from the POS with none — is different only on **Hide**: the product is dropped from the menu entirely, rather than shown greyed out with **Currently sold out**.
Nothing in the dashboard flags the product: its own availability is untouched, so it still shows as available in the menu builder. The unavailability is worked out when the ordering page loads, from the state of the product's required groups.
### How to spot it
Go to **Menus**, click **Edit** on the menu, click the product, and open the **Modifiers** tab of the **Edit product** panel. Each row of the **Group** / **Options** table is a modifier group attached to this product; click **Edit** on a row to open the group.
In the group, look under **How many options can customers choose?**. There are two number fields: the first is the minimum, the second the maximum. A minimum of 1 or more makes the group required.
Each row of the group's table is an **Option** with an **In Stock** toggle. If every option is toggled off — or the table is empty and only **Add an option** is offered — a required group here cannot be satisfied, and the product is unavailable.
Nested groups appear in the product's **Modifiers** list exactly like ordinary groups — the dashboard does not label a group as nested. To see the nesting, click the pencil icon on a modifier option's row to open the **Edit modifier** panel and go to its **Sub-Modifiers** tab. The **Sub-Modifier Group** column lists the groups that option reveals, each with its (minimum - maximum) range; **No sub-modifier groups added** means the option reveals none.
### On POS-managed menus, fix it in the POS
On a POS-managed menu (Deliverect, Toast, Zonal, Stream, Lightspeed K-Series, 3S POS) the modifier structure, each group's minimum and each option's availability all come from the POS, and every sync writes the POS values back over anything you change in storekit. So for a Toast menu delivered through Stream, make the change in Toast:
* mark at least one option in the required nested group available again, or
* set that group's minimum to 0 so it is no longer required, or
* restructure it as described below
Then let the menu reach storekit again:
* **Stream** and **Deliverect** push the menu when it is published in the source system. There is no sync button in storekit for those integrations.
* **Lightspeed K-Series**, **Zonal** and **Toast** menus have a **Sync** button on the menu's row in **Menus**.
Either way, the menu row in **Menus** shows **Synced** with how long ago the last sync ran — use it to confirm the new data arrived.
### Prefer an optional standalone group to a required nested one
Where the nested choice is really part of an optional extra, model the extra as one optional group instead of an option that reveals a required group:
| Structure | When both meatball options are unavailable |
| ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ |
| "Add Polpette" **option**, revealing a required nested group with chicken / beef meatballs | The nested group cannot be satisfied, so every product using it is unavailable |
| "Add Polpette" **group** with a minimum of 0, containing chicken / beef meatballs as its options | Nothing to add, and the product stays orderable |
Keep required minimums for choices the customer must make about the product itself (size, base, cooking preference), not for add-ons.
## Troubleshooting
### Nested Modifiers Not Appearing
If nested modifiers aren't showing:
* Verify your POS/menu system has nested modifiers configured correctly
* Check that the menu has synced recently
* Ensure you're using a supported integration (Deliverect, Stream, Toast, or Zonal Aztec)
### A Product Shows as Sold Out but Looks Available in the Dashboard
Check its required modifier groups, including nested ones — see [Why a product shows as sold out when its modifiers are unavailable](#why-a-product-shows-as-sold-out-when-its-modifiers-are-unavailable).
### Wrong Modifiers Showing
If incorrect nested modifiers appear:
* Review the parent-child relationships in your POS system
* Re-sync your menu after making changes
* Check that modifier group IDs are correctly linked
For further assistance, [contact support](/docs/getting-started/contact-support).
# Nutrition Information
Source: https://storekit.com/docs/guides/menu/nutrition-info
Add calorie counts and nutritional information to storekit menu items and modifiers to inform customer choices and meet regional menu labelling regulations.
Adding nutrition information to your products and modifiers helps customers make informed choices and may be a legal requirement in some regions.
## Adding Nutrition to Products
1. Go to **Menu** > **Edit Menu**
2. Click on the product you want to edit
3. Open the **Tags & Allergens** tab
4. Scroll to the **Nutrition** section and expand the dropdown
5. Fill in the relevant fields
6. Click **Save**
## Adding Nutrition to Modifiers
Modifier options can also have nutritional data:
1. Edit the modifier option
2. Open the **Tags & Allergens** section
3. Expand the **Nutrition** dropdown
4. Fill in the relevant fields
5. Click **Save**
## Available Fields
| Field | Unit |
| ----------------- | ----- |
| **Calories** | kcal |
| **Fat** | grams |
| **Saturated Fat** | grams |
| **Carbohydrates** | grams |
| **Sugar** | grams |
| **Protein** | grams |
| **Salt** | grams |
Nutritional values are displayed on the product detail page when customers view the item.
When a customer selects modifier options, the combined nutritional information from the product and all selected modifiers is shown.
In the UK and EU, providing accurate nutritional information may be a legal requirement for certain food businesses. Check your local regulations.
## Tips
* **Be accurate** — Ensure values reflect actual serving sizes
* **Update regularly** — Adjust when recipes or portions change
* **Include modifiers** — Customers rely on complete data when customising items
For managing allergens and dietary tags alongside nutrition, see [Tags & Allergens](/docs/guides/menu/tags-allergens).
# Menu Overview
Source: https://storekit.com/docs/guides/menu/overview
Understand the storekit menu hierarchy of categories, products, and modifiers and how they fit together to build the customer ordering experience.
Each menu belongs to a single store. For how menus are listed, replaced and archived, see [Managing Menus](/docs/guides/menu/managing-menus).
Your menu is built from three components:
```
Menu
└── Categories (e.g., "Starters", "Mains", "Drinks")
└── Products (e.g., "Margherita Pizza", "Coca Cola")
└── Modifiers (e.g., "Choose your size", "Add toppings")
```
## Categories
Categories group your products into sections. Customers see these as tabs or sections on your menu.
**Examples:** Starters, Mains, Desserts, Drinks, Sides
[Learn more about Categories →](/docs/guides/menu/categories)
## Products
Products are the items customers add to their cart. Each product belongs to one category and has a name, price, and optional details like images, allergens, and nutritional information.
**Examples:** Margherita Pizza, Chicken Burger, Chocolate Cake
[Learn more about Products →](/docs/guides/menu/products)
## Modifiers
Modifiers let customers customise products. They're grouped into modifier groups with rules about how many options can be selected.
**Examples:**
* "Choose your size" (required, pick one)
* "Add toppings" (optional, pick up to 5)
* "Select your base" (required, pick one)
[Learn more about Modifiers →](/docs/guides/menu/modifiers)
## Quick Start
1. **Create a category** - Go to **Menus** → **Edit** → **More actions** → **Add category**
2. **Add products** - Click **Add product** in the category
3. **Add modifiers** - Open a product → **Modifiers** tab → **Create a new group**
## Related Guides
Assign, replace, and archive a store's menu
Manage allergens, dietary tags, and nutrition
Control when items are available
Bulk import products from a spreadsheet
Sync your menu with your POS system
## Advanced Functionality
For more complex menu setups, explore these advanced features:
* [Compare At Price](/docs/guides/menu/compare-at-price) - Show promotional pricing with original prices struck through
* [Cost Price](/docs/guides/menu/cost-price) - Track internal costs for margin analysis
* [Free Modifiers](/docs/guides/menu/free-modifiers) - Offer "first N free" modifier pricing
* [Multi Max](/docs/guides/menu/multi-max) - Allow multiple quantities per modifier option
* [Nested Modifiers](/docs/guides/menu/nested-modifiers) - Show conditional modifiers based on selections
* [Course Assignments](/docs/guides/menu/course-assignments) - Assign items to courses for POS integration
* [Deposits](/docs/guides/menu/deposits) - Add bottle deposits (Pfand) to products
* [Removal Modifiers](/docs/guides/menu/removal-modifiers) - Let customers remove default ingredients
# POS Menu Sync
Source: https://storekit.com/docs/guides/menu/pos-menu-sync
Sync your storekit menu from your POS using push, pull, or manual linking depending on your provider. Keep prices, items, and stock aligned across systems.
If you use a POS system or menu management platform, you can sync your menu to storekit instead of building it manually. How syncing works depends on your integration.
## Is Your Menu Synced From a POS, or Managed in storekit?
Answer this first: on a POS-managed menu the POS is the source of truth, so items are fixed in the POS and re-synced — changing product or category settings in storekit will not bring a missing item back.
1. Go to **Menus** in the storekit dashboard
2. Click **Edit** on the menu you want to check
3. Look at the row directly under the menu header
If the menu is synced from a POS or menu platform, that row names the provider — for example **Connected to Zonal** or **Managed by Deliverect**. If there is no such row, the menu is managed in storekit (but see [When there is no status row](#when-there-is-no-status-row) below).
Most providers also show **Synced** followed by a relative time and the menu version, for example "Synced 3 hours ago · v12". Hover that text to see the exact date and time of the last sync.
### What Each Status Row Means
| Status row | Provider | Sync controls in the same row |
| --------------------------- | ------------------- | ------------------------------------------------------------------------------------------------- |
| **Connected to Lightspeed** | Lightspeed K-Series | **View in POS** and **Sync** |
| **Connected to Zonal** | Zonal (Aztec) | **Sync menu** and **Sync price & availability** |
| **Connected to Toast** | Toast | **View in POS** and **Sync** |
| **Connected to PointOne** | PointOne | **Sync menu** |
| **Connected to TISSL** | TISSL | **Sync stock** only — there is no menu sync button for TISSL |
| **Connected to 3S POS** | 3S POS | None — where other providers show buttons, this row shows the text **Managed externally** |
| **Managed by Deliverect** | Deliverect | None — the row shows the text **Menu synced externally** instead of buttons |
| **Synced to OpenTable** | OpenTable | **Sync to OpenTable**. This pushes your storekit menu out to OpenTable; it does not import a menu |
The provider text is on the left of the row; for 3S POS and Deliverect the second string (**Managed externally** / **Menu synced externally**) appears in the same row where the sync buttons would be, so both strings are visible at once.
Where no sync button is shown for your provider, there is no self-serve way to re-sync the menu from the dashboard — [contact support](/docs/getting-started/contact-support) and ask for a re-sync.
### When There Is No Status Row
Stream, Syrve, Comtrex and Centegra menus show no status row above the menu, so the absence of a row does not by itself prove the menu is managed in storekit. To check whether a POS is connected to the store:
1. Go to **Stores** in the storekit dashboard
2. Select your store
3. Click **Settings**
4. Open the **Integrations** tab
5. Look for your POS card (for example **Syrve**, **Comtrex**, **Centegra**, **Tissl**, **Toast POS**, **Zonal**, **Lightspeed K-Series**, **PointOne** or **Deliverect**) and check whether it is marked **Connected**
Stream has no merchant-facing integration card. If you believe your menu comes from Stream, [contact support](/docs/getting-started/contact-support) to confirm.
## Items or Whole Categories Missing From the Online Menu
Follow [Is Your Menu Synced From a POS, or Managed in storekit?](#is-your-menu-synced-from-a-pos-or-managed-in-storekit) above. Do not start with availability toggles — if the menu is POS-managed, they are not the cause.
Use the sync control for your provider in the status row (for Zonal, **Sync menu**; for Lightspeed K-Series and Toast, **Sync**; for PointOne, **Sync menu**). When it finishes, check the **Synced** time and version in the same row to confirm the sync went through — the relative time should now read as just-synced and the version number should have increased.
If the items are still missing after a successful sync, they are missing on the POS side: confirm in your POS that each item is on the specific POS menu the store is linked to, is available or in stock, and is assigned to a category. Items that are unmapped or unavailable in the POS do not appear in storekit.
If your provider has no sync button (TISSL, 3S POS, Deliverect, Stream), [contact support](/docs/getting-started/contact-support) and ask for a re-sync.
For individual items, check product availability, snoozing and **Available After** — see [Availability & Snoozing](/docs/guides/menu/availability-snoozing#product-availability).
For a whole category missing at once, check the category's availability and hours — see [Category Availability](/docs/guides/menu/categories#availability) and [items not showing on the menu](/docs/guides/menu/categories#troubleshooting-items-not-showing-on-the-menu).
Category availability and hours are always controlled in storekit, even on a POS-managed menu. If a whole section is missing at a particular time of day, check the category hours in storekit first.
## Sync Types
Different integrations use different sync methods:
| Type | How It Works | Integrations |
| ------------------ | ----------------------------------------------------------------- | ---------------------------------------------------------- |
| **Push** | The POS or menu platform sends menu changes to storekit | Deliverect, Stream |
| **Pull** | storekit fetches the menu from the POS on demand or on a schedule | Lightspeed K-Series, Zonal, Toast, Syrve, PointOne, 3S POS |
| **Manual Linking** | Products are created in storekit and linked to POS IDs | TISSL, Comtrex, Centegra |
3S POS menus are pulled by storekit but have no dashboard sync button — the row above the menu shows **Managed externally**. TISSL syncs stock only (**Sync stock**); the menu itself is built in storekit and linked by PLU. OpenTable is not in this table because it is outbound only: storekit pushes your menu to OpenTable with **Sync to OpenTable** and never imports a menu from it.
## Push Integrations
With push integrations, menu changes sync automatically whenever you update your menu in the source system.
### Deliverect
Deliverect pushes your menu to storekit automatically when changes are published. No action is required on your part.
1. Make menu changes in Deliverect
2. Publish the menu in Deliverect
3. Changes appear in storekit in 10-30 seconds
### Stream
Stream pushes menu data to storekit automatically. Menu updates sync when published in the Stream platform.
Push integrations provide the fastest sync times since changes are sent immediately when made.
## Pull Integrations
With pull integrations, you trigger menu syncs from the storekit dashboard or set up automated schedules.
### Manual Sync
To manually sync your menu:
1. Go to **Menus** in the storekit dashboard
2. Click **Edit** on the menu
3. In the row under the menu header, click the sync control for your provider:
* Lightspeed K-Series: **Sync**
* Zonal: **Sync menu** (or **Sync price & availability** for the lightweight update)
* Toast: **Sync**
* PointOne: **Sync menu**
* TISSL: **Sync stock** (stock levels only)
* OpenTable: **Sync to OpenTable** (pushes your menu to OpenTable)
4. Wait for the sync to complete, then check the **Synced** time and version in the same row
The sync fetches the latest menu data from your POS and updates storekit accordingly.
For Lightspeed K-Series, Zonal and Toast you can also sync from the menu list: go to **Menus** and click **Sync all menus**.
There is no menu sync button for 3S POS, Deliverect or Stream. Deliverect and Stream push menus to storekit, and 3S POS menus are synced outside the dashboard — for those, [contact support](/docs/getting-started/contact-support) if a menu looks out of date.
### Automated Sync Schedules
For pull integrations, sync schedules keep your menu up to date without manual intervention.
**Scheduled sync types:**
* **Menu** — a full menu sync, supported for Lightspeed K-Series, Zonal, Syrve and Toast
* **Menu Light (Zonal)** — Zonal only; updates prices and availability without rebuilding the menu
* **Stock Sync (TISSL)** — TISSL only; updates stock levels
Schedules are configured on the **Automations** page:
1. Go to **Stores** in the storekit dashboard
2. Select your store
3. Click **Settings**
4. Click **Automations**
5. Under **Sync Schedules**, click **Add sync schedule**
6. Choose the type (**Menu**, **Menu Light (Zonal)** or **Stock Sync (TISSL)**) and a frequency
7. Click **Save**
The frequency list is fixed: **Every hour**, **Every 2 hours**, **Every 4 hours**, **Every 6 hours**, **Every 12 hours**, **Daily at 6 AM**, **Daily at 9 AM**, **Daily at midnight**, or **Custom cron expression**. **Menu Light (Zonal)** and **Stock Sync (TISSL)** also offer **Every 5 minutes**, **Every 15 minutes** and **Every 30 minutes**.
**Automations** is only shown to accounts with the automations feature enabled. If you do not see it under **Settings**, [contact support](/docs/getting-started/contact-support) to have a sync schedule set up for you.
Schedule syncs for quiet periods like early morning to avoid any disruption during busy service times.
### Zonal Lightweight Sync
Zonal supports a "lightweight" sync option that only updates prices and availability without re-syncing the entire menu structure. This is faster and useful for frequent price updates.
## Manual Linking Integrations
Some integrations require you to create products in storekit and manually link them to your POS using product IDs (PLUs).
### TISSL
1. Create your menu in storekit
2. For each product, enter the TISSL PLU in the product settings
3. Orders will include the PLU for TISSL to recognise the item
### Comtrex
1. Create your menu in storekit
2. Link products using the Comtrex product ID
3. Orders are sent with the correct IDs for Comtrex processing
### Centegra
1. Create your menu in storekit
2. Link products using the Centegra product ID
3. Orders are sent with the correct IDs for Centegra processing
Manual linking gives you full control over your storekit menu design while maintaining POS compatibility for order processing.
## What Syncs
Depending on your integration, menu sync includes:
| Data | Description |
| ---------------- | -------------------------------------------------- |
| **Categories** | Menu sections and their order |
| **Products** | Items, prices, descriptions, images |
| **Modifiers** | Modifier groups and options |
| **Availability** | Which items are currently available |
| **Allergens** | Allergen and dietary information (where supported) |
## After Syncing
After a menu sync:
* Review the imported menu for accuracy
* Add images if not included from the POS
* Check modifier pricing and rules
* Set up any storekit-specific features (promotional pricing, deposits, etc.)
Some POS systems don't include all data (like images or detailed descriptions). You may need to enhance your menu in storekit after syncing.
## Troubleshooting
### Sync Not Starting
* Check your POS credentials are valid
* Verify the integration is connected in Store Settings
* Ensure you have menu data in your POS system
### Missing Products
Start with [Items or Whole Categories Missing From the Online Menu](#items-or-whole-categories-missing-from-the-online-menu) above to work out whether the menu is POS-managed or managed in storekit. For a POS-managed menu:
* Confirm products are published/active in your POS
* Check the product is assigned to a category in the POS menu the store is linked to
* Some integrations only sync specific menu types
### Incorrect Prices
* Verify prices in your POS system
* Check for tax-inclusive vs tax-exclusive settings
* Re-sync after making price changes in the POS
### Deleted Items Keep Reappearing After a Sync
For pull integrations (Lightspeed K-Series, Zonal, Toast, Syrve, PointOne, 3S POS), your **POS menu is the source of truth**. Each sync rebuilds the storekit menu from the linked POS menu, so deleting an item in storekit alone does not remove it — if the item still exists on the linked POS menu, the next sync re-adds it.
To remove an item permanently:
1. Remove or unpublish the item from the **specific POS menu the store is linked to** (see below) — not just from storekit
2. Make sure the item is off that exact menu, not only from another menu in your POS
3. Re-sync from storekit
If deleted items still linger after a re-sync, archive the storekit menu and re-sync to rebuild it cleanly from the POS.
### The Wrong Items Are Syncing / a Store Shows Items From Another Menu
Each storekit store is linked to **one specific POS menu**. If you have multiple POS menus and multiple stores, edits only affect the store linked to the POS menu you changed — editing a different POS menu has no effect on the store you're looking at.
* Confirm which POS menu the store is linked to, and make your changes on that menu
* For Lightspeed K-Series, the linked menu is set in **Stores** → your store → **Settings** → **Integrations** → **Lightspeed K-Series**, via the **Lightspeed Menu** selector
* For Toast, the linked menu is the **Toast Menu** selector — see [Choosing Which Toast Menu Your Store Serves](/docs/guides/integrations/pos/toast/menu-sync#choosing-which-toast-menu-your-store-serves)
* Other pull integrations expose the linked menu in the same integration settings
### An Item Shows Under the Wrong Name or Category
POS items can have both a **button name** (the label shown on the POS/till button) and a separate **display name** (in Lightspeed, the "friendly display name"). storekit shows the display name when one is set, and falls back to the button name otherwise — so what customers see in storekit can differ from the button label in your POS.
* If an item's name looks wrong, check the item's display name in the POS
* Where an item appears in storekit is controlled by the **category it is assigned to in the POS menu**. If an item shows in an unexpected category, check its category assignment in the POS
For further assistance, [contact support](/docs/getting-started/contact-support).
# Print Modifiers as Products
Source: https://storekit.com/docs/guides/menu/print-modifiers-as-products
Send modifier options to printers and POS systems as separate line items in storekit instead of indented under the parent product. Improves ticket clarity.
By default, modifiers appear indented under their parent product on tickets and in POS systems. The "Print Modifiers as Products" feature changes this behaviour, sending modifiers as separate line items instead.
This feature requires support to enable for your account. [Contact support](/docs/getting-started/contact-support) to request access.
## How It Works
When enabled on a modifier group:
* Modifiers in that group print as separate products on tickets
* The same modifiers are sent as individual items to connected POS systems
* Quantities are multiplied correctly (e.g., 2x Burger with Fries = 2x Fries as a separate line)
* If a modifier matches an existing product by POS ID or PLU, quantities are combined
### Example
**Without the feature:**
```
1x Burger
- Extra Cheese
- Fries
```
**With the feature enabled on the "Sides" modifier group:**
```
1x Burger
- Extra Cheese
1x Fries
```
## Use Cases
### Inventory Tracking
When your POS tracks stock at the modifier level, sending modifiers as products ensures accurate inventory counts. Each side dish or add-on decrements stock correctly.
### Kitchen Organisation
Some kitchens prefer sides and add-ons as separate ticket lines so different stations can work in parallel without scanning through nested modifiers.
### Combo Meals
For meal deals where sides are modifiers but need independent preparation, this feature ensures each component appears as its own line item.
## How Matching Works
When a modifier is converted to a product, the system checks if an identical product already exists in the order:
1. **Lookup**: The system searches the order for an existing item with the same identifier (POS ID or PLU, depending on your integration)
2. **Match found**: If a matching product exists and the modifier has the required identifier, quantities are combined. For example, if the order already has "1x Fries" and a burger modifier adds another portion, the result is "2x Fries"
3. **No match**: If no matching product is found, the modifier is added as a new line item
### Identifier Requirements
* **POS ID matching**: The modifier's POS ID must match an existing product's POS ID exactly
* **PLU matching**: The modifier's PLU must match an existing product's PLU exactly
* **Missing identifiers**: If a modifier lacks the required identifier, it always appears as a new line item rather than combining with existing products
### Example
A customer orders:
* 1x Fries (standalone product, POS ID: `FRIES-001`)
* 2x Burger with Fries (modifier POS ID: `FRIES-001`)
* 1x Burger with Onion Rings (modifier POS ID: `RINGS-001`)
**With matching (modifier POS ID matches product):**
```
3x Fries ← Combined: 1 standalone + 2 from burgers
2x Burger
1x Burger
1x Onion Rings ← New line: no standalone Onion Rings in order
```
**Without matching (modifier has no POS ID):**
```
1x Fries ← Standalone only
2x Burger
1x Burger
2x Fries ← Duplicate line: couldn't match to existing
1x Onion Rings ← Separate line
```
For accurate inventory tracking, ensure your modifier options share the same POS ID or PLU as the standalone product they represent. A "Fries" modifier should have the same identifier as your "Fries" product.
## Supported Integrations
This feature works with:
| Integration | Matching Method |
| ----------------------- | --------------- |
| **Cloud Printing** | POS ID |
| **TISSL** | POS ID |
| **Lightspeed K-Series** | PLU |
| **Comtrex** | POS ID |
| **3S POS** | POS ID |
## Requesting Access
[Contact support](/docs/getting-started/contact-support) to enable this feature. Provide:
1. Your account name
2. Which modifier groups should have this enabled
3. Your POS integration (if applicable)
Support will configure the setting on the relevant modifier groups.
# Add and configure menu products, modifiers, and tags
Source: https://storekit.com/docs/guides/menu/products
Add and configure products in your storekit menu with names, descriptions, images, prices, modifiers, and tags. The building blocks of your ordering page.
Products are the items customers add to their cart. Each product belongs to a category and can have modifiers for customisation.
## Creating Products
1. Click into a category
2. Click **Add Product**
3. Choose **New product** or **Duplicate product**
### Duplicate vs New
**Duplicate product** copies values from an existing product:
* Name, description, price, image, video
* Compare at price
* Tags and allergens
* Optionally: modifier groups
This saves time when creating similar items like burger variants.
## Product Fields
### Required
| Field | Description |
| ---------- | ----------------------------------------- |
| **Name** | The product name shown to customers |
| **Price** | In your store's currency |
| **POS ID** | Required if using Comtrex or Centegra POS |
### Optional
| Field | Description |
| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Description** | Product details (first \~60 characters show on menu) |
| **Print Name** | Override name on printed tickets |
| **Image** | Product photo (most image formats supported, up to 100 MB) |
| **Video** | Short video that plays on the product page |
| **Compare At Price** | Shows original price crossed out (for promotions) |
| **SKU / PLU** | Stock keeping unit or price lookup code |
| **Cost** | Your cost price (for reporting, not shown to customers) |
| **Tax Rate** | Override default tax rate for this product. To change tax rates for many products at once, use [Grid View](/docs/guides/menu/managing-menus#bulk-editing-a-menu-in-grid-view) |
| **Deposit** | Bottle deposit or similar charges |
### Product ID
Every product has a read-only **Product ID**. Open the product in the menu editor and scroll to the bottom of the edit panel - it's the last item, just above the save button. It's a long identifier shown in a monospace font; click it to select the whole value, then copy it.
Use it when you need to reference a specific product:
* Targeting a product from a [Menu Story](/docs/guides/marketing/stories) CTA (**Add to Basket** and **View Item** require it)
* Giving support an exact product to look at
* Working with the API, analytics, or event data
* Matching a product to a reward in a loyalty platform - for [Como](/docs/guides/increasing-sales/loyalty-programs#linking-products-to-como-rewards), storekit identifies each purchased product by its **PLU** first, then **SKU / PLU**, then **POS ID**, and uses the **Product ID** only when all three are blank (other platforms match differently - Piggy uses the **PLU** only). On a menu synced from a POS the **PLU** comes from the sync (for Toast it is the item's GUID), so Como usually sees a POS identifier rather than the **Product ID**. Product IDs are also per menu - the same dish listed on two menus is two products with two different Product IDs.
The **Product ID** is generated by storekit and can't be edited. It's separate from the **PLU**, **SKU / PLU** and **POS ID** fields - the POS-facing identifiers, which come from a POS menu sync or are entered manually (the **POS ID** field appears on Comtrex, Centegra and Tissl menus).
## Tags & Allergens
Add allergen information, dietary tags, and nutritional data in the **Tags & Allergens** tab.
See [Tags & Allergens](/docs/guides/menu/tags-allergens) for details on managing allergens, dietary tags, and nutrition.
## Availability
### Available After
Schedule when a product becomes visible. Use this to:
* Launch new items at a specific time
* Prepare seasonal menus in advance
* Coordinate with marketing campaigns
### Inventory Tracking
Enable **Track Inventory** and set stock levels. When inventory reaches zero, the product shows as unavailable.
Use for:
* Daily specials with limited quantities
* Items with supply constraints
* Flash sales
### Availability by Day
Set which days of the week a product is available. Useful for:
* Weekend brunch items
* Weekday lunch specials
* Items that require advance preparation
## Images & Media
### Product Images
Upload high-quality images for each product. Most image formats are supported (PNG, JPG, GIF, WebP, HEIC, and more) up to 100 MB.
Images are automatically optimised and served via CDN.
See [Product Photography](/docs/guides/menu-engineering/product-photography) for tips on capturing great food photos.
### Product Videos
Upload short videos that autoplay on the product detail page. Videos are automatically encoded for optimal streaming.
See [Videos](/docs/guides/menu-engineering/videos) for best practices.
## Organisation
### Reordering
On a computer, drag and drop products within a category to change their order. The new order saves automatically as soon as you drop it.
Drag and drop is disabled on phones, tablets and touchscreen laptops, and there is no Sort tool for products. To reorder products, use a computer with a mouse. See [Reordering categories](/docs/guides/menu/categories#reordering-categories) for the same limitation on categories.
### Print Order
Products can have a different order for printing. See [Print Order](/docs/guides/printing/print-order).
### Popular Flag
Mark products as **Popular** to:
* Display a "Popular" badge with a star icon on the product
* Show the product in a dedicated "Popular Items" section at the top of your menu
The **Popular** flag is separate from checkout upsells and algorithmic recommendations:
| Placement | How it works |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Popular** | You mark the product as **Popular**. It receives a badge and can appear in the **Popular Items** section on the menu. |
| **Upsell products** | You manually select products under **Stores → \[your store] → Settings → Operations → Upsell products**. They appear in a pre-checkout cross-sell modal. |
| **Suggested for you** | storekit generates recommendations algorithmically using the store, customer, and basket context. Marking a product as Popular does not select it for these recommendations. |
To choose products shown before checkout, see [Checkout Upsell Products](/docs/guides/store-settings/operations-settings#checkout-upsell-products).
For a POS-synced menu, including Lightspeed, create or update the product in the POS and sync it to storekit before selecting it as an upsell. See [POS Menu Sync](/docs/guides/menu/pos-menu-sync).
## Deleting Products
1. Click on the product to open the editor
2. Scroll to the bottom
3. Click **Delete Product**
Deleted products cannot be recovered. Order history referencing the product will show "Deleted Item".
## Multi-language Support
Click the translation icon next to text fields to add translations for other languages.
See [Translations](/docs/guides/store-settings/translations) for setup.
## Tips
* **Front-load descriptions** - Important info in first 60 characters
* **Complete allergen info** - Legal requirement in many regions
* **Use high-quality images** - They increase conversion rates
* **Set Compare At Price** for promotions - Shows discount clearly
* **Track inventory** for limited items - Prevents overselling
* **Share inventory across products** - Use modifiers to [track shared ingredients](/docs/guides/tips-tricks/shared-inventory) like pizza dough
# Removal Modifiers
Source: https://storekit.com/docs/guides/menu/removal-modifiers
Let customers remove default ingredients from storekit products with removal modifier groups. Show 'no onion' or 'no cheese' without cluttering the menu.
Removal modifier groups allow customers to remove standard ingredients from a product. Unlike regular modifiers that add options, removal modifiers represent ingredients that are included by default and can be taken away.
This feature requires support to enable for your account. [Contact support](/docs/getting-started/contact-support) to request access.
## How It Works
When a modifier group is marked as a removal type:
* Options represent ingredients that come standard with the product
* Customers select items they want **removed**
* Selected options are communicated to the kitchen as exclusions
### Example
A burger that comes with lettuce, tomato, onion, and pickles by default:
**Removal modifier group: "Remove Ingredients"**
* Lettuce
* Tomato
* Onion
* Pickles
Customer selects "Onion" and "Pickles" → Ticket shows: `No Onion, No Pickles`
## Why Use Removal Groups
### Cleaner Kitchen Tickets
Without removal groups, you'd need to list all default toppings as regular modifiers. If a customer orders a pizza with standard toppings, the ticket would list every single topping - even though nothing changed from the default. Kitchen staff would need to scan through a long list to spot any actual customisations.
With removal groups, tickets only show **deviations from the default**. A standard pizza prints with no modifiers listed. A customised pizza shows only what was removed: `No Olives, No Anchovies`.
### Clearer Customer Experience
Removal groups make it obvious to customers what's already included. Instead of wondering "do I need to add cheese?" they see a list of what comes standard and can simply uncheck anything they don't want.
### Alternative Approach
You can achieve similar results with regular modifier groups by pre-selecting all default options. However, removal groups are often clearer because:
* The group name signals intent ("Remove Ingredients" vs "Toppings")
* Customers immediately understand these items are included
* Less cognitive load than a pre-checked list of additions
## Use Cases
### Allergen Accommodation
Allow customers to remove allergen-containing ingredients:
* No nuts
* No dairy
* No gluten-containing items
### Dietary Preferences
Let customers customise based on preferences:
* No onions
* No cilantro
* No spicy sauce
### Default Toppings
For products with standard toppings that some customers may want removed:
* Pizza default toppings
* Sandwich standard ingredients
* Salad default components
## POS Integration
### Zonal (Aztec)
When syncing menus from Zonal (Aztec), removal modifier groups are automatically detected based on the presence of default selections in choice groups. The `isRemoval` flag is set automatically during import.
## Compared to Regular Modifiers
| Aspect | Regular Modifiers | Removal Modifiers |
| ------------------------- | ----------------- | -------------------- |
| **Default state** | Nothing selected | All items "included" |
| **Customer action** | Add options | Remove options |
| **Kitchen communication** | "Add X" | "No X" |
| **Typical pricing** | Often charged | Usually free |
# Show & Hide Modifier Groups
Source: https://storekit.com/docs/guides/menu/show-hide-modifiers
Toggle the visibility of storekit modifier groups on individual products. Hide groups from customers without losing the configuration for later use.
You can toggle the visibility of modifier groups on individual products. Hidden groups remain configured in the system but are not shown to customers on the menu.
## Toggling Modifier Group Visibility
1. Go to **Menu** > **Edit Menu**
2. Click on the product you want to configure
3. Open the **Modifiers** tab
4. Find the modifier group you want to show or hide
5. Toggle the visibility switch
6. Click **Save**
When a modifier group is hidden, customers will not see it when viewing or customising the product.
## Use Cases
| Scenario | Example |
| --------------------------- | ---------------------------------------------- |
| **Seasonal modifiers** | Hide summer toppings during winter |
| **Temporarily unavailable** | Hide a sauce group while out of stock |
| **Internal-only modifiers** | Keep kitchen notes hidden from customers |
| **Gradual rollout** | Prepare new options before making them visible |
Hiding a modifier group does not remove it from existing orders. Orders placed while the group was visible are unaffected.
## Hidden vs Deleted
Hiding a modifier group is non-destructive:
| Action | Visible to Customers | Configured in System | Reversible |
| ---------- | -------------------- | -------------------- | -------------------- |
| **Hide** | No | Yes | Yes — toggle back on |
| **Delete** | No | No | No — must recreate |
Prefer hiding over deleting when the modifier group may be needed again. This preserves your configuration and saves setup time.
For more on setting up modifier groups, see [Modifiers](/docs/guides/menu/modifiers).
# Table Area Category Restrictions
Source: https://storekit.com/docs/guides/menu/table-area-restrictions
Restrict which storekit menu categories appear in specific table areas. Show different parts of the menu in the bar, garden, or restaurant by QR code.
Category restrictions let you control which parts of your menu are visible based on where a customer is seated. Customers scanning a QR code at a restricted table only see the categories assigned to that area.
## Use Cases
| Scenario | Example |
| ----------------------- | ----------------------------------------------------------- |
| **Bar vs restaurant** | Show drinks only at bar tables, full menu in the restaurant |
| **Pool or garden area** | Restrict to a limited outdoor menu |
| **VIP areas** | Offer an exclusive menu for VIP seating |
| **Events** | Show a special event menu for designated tables |
## Setting Up Restrictions
1. Go to your **Table/Area Settings**
2. Select the area you want to configure
3. Choose which categories are available for that area
4. Click **Save**
Customers scanning the QR code at tables within the restricted area will only see the allowed categories. All other categories are hidden.
## How It Works
* Each table belongs to an area
* Each area can have category restrictions applied
* When a customer scans a table QR, only the permitted categories for that area are displayed
* Products within hidden categories are not visible or orderable
Category restrictions require tables and areas to be set up first. See [Dine-in Tables](/docs/guides/fulfillment/dine-in-tables) for setup instructions.
## Unrestricted Areas
If no category restrictions are set on an area, all menu categories are shown by default. Restrictions are opt-in — you only need to configure them for areas with limited menus.
Combine category restrictions with [Availability by Day](/docs/guides/menu/availability-snoozing) to further refine what's shown at different times and locations.
# Tags & Allergens
Source: https://storekit.com/docs/guides/menu/tags-allergens
Manage allergens, dietary tags (vegan, gluten-free), and nutrition info in storekit at the product and modifier level. Inform customers and meet regs.
Allergen and nutritional information can be added to both products and modifier options. This information is displayed to customers and helps them make informed choices.
## Allergens
Accurate allergen information is a legal requirement in many regions.
### Allergen States
storekit provides a three-state allergen system:
| State | Meaning |
| --------------- | --------------------------------- |
| **Contains** | Definitely contains this allergen |
| **May Contain** | May have traces of this allergen |
| **Free** | Does not contain this allergen |
The allergen summary at the top of the section shows exactly what customers will see.
### Supported Allergens
The 14 major allergens (UK/EU regulations):
Celery, Gluten, Crustaceans, Fish, Eggs, Lupin, Milk, Molluscs, Mustard, Nuts, Peanuts, Sesame, Soya, Sulphites
Plus extended allergens: Almonds, Barley, Brazil Nuts, Cashew, Hazelnuts, Macadamia, Oats, Pecan, Pistachio, Rye, Spelt, Walnuts, Wheat, Dairy, Lentils, Shellfish, Treenuts.
### Quick Actions
* **Search allergens** - Filter the allergen list by name
* **Mark all Free** - Reset all allergens to "Free" state
Allergen regulations vary by country. In the UK and EU, businesses must provide allergen information for the 14 major allergens.
For guidance on building an effective allergen management process, see our [Allergen Strategy](/docs/guides/compliance/allergen-strategy) guide.
## Dietary Tags
Toggle dietary tags to indicate:
* Vegan
* Vegetarian
* Halal
* Kosher
* Gluten Free
* Sugar Free
* Lactose Free
These appear as badges on your menu, helping customers quickly identify suitable items.
## Flags
Special flags for compliance:
* **Alcohol** - Required for age-restricted items. Triggers age verification where required.
## Nutrition
Expand the **Nutrition** section to add nutritional values per serving:
| Field | Unit |
| ---------------------- | ----- |
| Calories | kcal |
| Salt | grams |
| Carbohydrates | grams |
| Carbohydrates (sugars) | grams |
| Fats | grams |
| Fats (saturates) | grams |
| Fibre | grams |
| Protein | grams |
Nutritional information is displayed on the product detail page.
## Ingredients
Add ingredients as a comma-separated list. These are displayed on the product detail page below the nutritional information.
## Applies To
Tags, allergens, nutrition, and ingredients can be set on:
* **Products** - Edit the product → Tags & Allergens tab
* **Modifier options** - Edit the modifier option to access allergen settings
When a customer selects modifier options, the combined allergen information from the product and all selected modifiers is shown at checkout.
# Visual & Digital Menu
Source: https://storekit.com/docs/guides/menu/visual-menu
Create a view-only digital menu in storekit with no ordering or checkout. Customers browse via QR code or link — ideal for in-venue dine-in menus.
A visual menu lets customers browse your full menu without placing orders. It provides a digital menu experience — viewable via QR code or link — without enabling checkout.
## When to Use a Visual Menu
| Scenario | Description |
| --------------------------------- | ------------------------------------------------------- |
| **Not ready for online ordering** | Display your menu digitally while you set up operations |
| **In-venue display** | Show your menu on screens or tablets |
| **Social media sharing** | Share a browsable menu link with followers |
| **Menu preview** | Let customers view your offerings before visiting |
## Setting Up a Visual Menu
1. Create your store and configure your menu as normal — add categories, products, images, and descriptions
2. Go to **Store Settings**
3. Set the store to **Visual Menu** mode
Your menu is now live as a view-only experience. Customers can browse all products, view images and descriptions, but cannot add items to a cart or check out.
## How Customers Access It
Customers can view your visual menu by:
* **Scanning a QR code** printed at your venue
* **Clicking a link** shared via your website or social media
## What Customers See
All of the following are visible on a visual menu:
* Categories and products
* Product images and descriptions
* Prices
* Allergen and dietary information
There is no cart, checkout, or payment flow.
## Upgrading to Full Ordering
When you're ready to accept orders, you can upgrade your store to a full ordering mode at any time:
1. Go to **Store Settings**
2. Switch from Visual Menu to **Order & Pay** or **Takeaway**
3. Complete your payment setup
4. Your menu is now fully operational with ordering enabled
Starting with a visual menu is a low-commitment way to digitise your menu. You can upgrade to ordering whenever you're ready — no need to rebuild anything.
# Auto Ready
Source: https://storekit.com/docs/guides/orders/advanced/auto-ready
Automatically mark storekit orders as ready for pickup at their estimated time. Removes the manual step of staff updating each order during busy service.
Auto Ready automatically updates orders to "Ready for Pickup" status when their estimated time arrives. This removes the need for staff to manually mark each order as ready.
## How It Works
1. Customer places an order with an estimated ready time
2. storekit schedules an automatic status update for that time
3. When the time arrives, the order is marked as "Ready"
4. Customer receives their "order ready" notification
### Timing Logic
The timing is calculated as follows:
| Scenario | When order is marked ready |
| --------------------------- | -------------------------------- |
| Order has an estimated time | At the estimated time |
| No estimated time set | 30 minutes after order is placed |
For example:
* Order placed at 12:00 with estimated time 12:25 → marked ready at 12:25
* Order placed at 12:00 with no estimated time → marked ready at 12:30
## When to Use Auto Ready
Auto Ready works best for:
* **High-volume operations** - When manually marking each order is impractical
* **Consistent prep times** - When you reliably hit your estimated times
* **Self-service pickup** - Where customers collect without staff interaction
Only enable Auto Ready if your kitchen consistently meets estimated times. Customers will be notified their order is ready even if it isn't.
## When NOT to Use Auto Ready
Do not enable Auto Ready if:
* **You already mark orders as ready manually** - You'll create duplicate "order ready" notifications and confuse customers
* **You have a POS integration that manages order status** - POS systems like Lightspeed, Zonal, or Square that sync order lifecycle updates will conflict with Auto Ready
* **Your prep times vary significantly** - If some orders take 10 minutes and others take 45, Auto Ready will notify customers at the wrong time
If your POS already sends order status updates to storekit, those updates will mark orders as ready at the correct time. Enabling Auto Ready on top of this creates race conditions where customers may receive multiple notifications or see incorrect status.
## Configuration
1. Go to **Store Settings > Operations**
2. Find **Auto Ready**
3. Select which fulfillment methods should use Auto Ready:
* Pickup
* Delivery
* In-Store
* Catering Pickup
* Catering Delivery
4. Save changes
You can enable Auto Ready for some fulfillment methods and not others. For example, enable it for Pickup orders but manually manage Delivery orders.
## Best Practices
1. **Set accurate prep times** - Auto Ready relies on your estimated times being accurate
2. **Monitor during busy periods** - Disable temporarily if you're running behind
3. **Train staff** - Ensure kitchen knows orders will auto-update and customers will be notified
4. **Use with order displays** - Pair with customer-facing displays so customers can see their order status
## Disabling Auto Ready
To disable, return to **Store Settings > Operations** and deselect all fulfillment methods from Auto Ready, or remove specific methods you want to manage manually.
# Blocking Pre-Order Timeslots
Source: https://storekit.com/docs/guides/orders/advanced/block-timeslot
Stop pre-orders during periods you can't fulfil, such as bank holidays or private events, by adjusting pre-order times, days, and capacity in storekit.
Prevent customers from placing pre-orders during periods when you can't fulfil them by adjusting the days, times, and capacity available in your pre-order settings.
There is no way to block a single timeslot on one specific date (for example, only 12:00–12:30 on 1 August). Pre-order availability is controlled by weekly schedules and capacity settings, which repeat every week. To close a **whole date**, use [Special Opening Hours](/docs/guides/store-settings/opening-hours#special-opening-hours) — but read the caveat under [What You Can't Do](#what-you-cant-do) first. See that section for the closest workarounds, or [contact support](/docs/getting-started/contact-support) if you need help with a one-off closure.
## When to Restrict Timeslots
Restricting pre-order availability is useful for:
* **Fully-booked periods** — no capacity for additional orders
* **Special events** — private functions or catered events
* **Holidays** — partial closures or reduced service
* **Operational constraints** — planned maintenance or staffing gaps
## Where Pre-Order Settings Live
All of the options below are on the **Pre-Orders** page ("Slots, capacity & scheduling"): go to **Stores** → your store → **Settings** → **Pre-Orders**. There is no separate timeslot management section. Pickup and delivery are configured separately using the **Pickup** and **Delivery** tabs, and every change must be applied with the **Save** button at the bottom of the page.
## What You Can Do
### Remove a recurring time window from a weekday
Under **Pickup times** (or **Delivery times** on the Delivery tab), each weekday has one or more time windows, and slots are only generated inside those windows.
Go to **Stores** → your store → **Settings** → **Pre-Orders**.
Select the **Pickup** or **Delivery** tab, depending on which fulfilment type you want to restrict.
Under **Pickup times** (or **Delivery times**), find the weekday and adjust its windows. To remove a period in the middle of the day, split it into two windows: for example, replace **09:00–17:00** with **09:00–12:00** and use **Add another time interval** to add **14:00–17:00**, leaving 12:00–14:00 with no slots.
To remove a whole day, turn on that day's **Unavailable** toggle — closed days show a **Closed** badge.
Click **Save** at the bottom of the page.
Changes to **Pickup times** and **Delivery times** are part of the weekly schedule, so they repeat **every week**. If you only need the change for one date, remember to restore the original times afterwards.
### Limit orders to specific dates only
The **Specific pre-order days** section lets you choose exact dates on which pre-orders are accepted. This is an **allow-list**: once any dates are selected, customers can only pre-order for those dates, and all other days become unavailable — it is not a way to block individual dates while keeping the normal weekly schedule.
This works well if you only take pre-orders for a handful of known dates (for example, event days or seasonal openings).
### Limit capacity per slot
The slot settings at the top of each tab (**Pickup details** / **Delivery details**) include **Capacity per slot** controls such as the number of orders per slot. These limits apply to **every day** — they can't be changed for a single date. See [Order Limits](/docs/guides/orders/advanced/order-limits) for details.
## What You Can't Do
Blocking one timeslot on a single date while keeping your normal schedule is **not currently possible** in the dashboard. The closest workarounds are:
* **To close a whole date**, add a dated row under [Special Opening Hours](/docs/guides/store-settings/opening-hours#special-opening-hours) with **Open Time** and **Close Time** both set to 00:00. Every pre-order for that date is then rejected — but the date's slots still appear in the customer's scheduling view, and the order only fails at checkout, so remove that weekday's windows as well if the date is close enough that customers are already booking it. (If **Also accept pre-orders outside of opening hours** is on, the override still rejects dated pre-orders but no longer blocks same-day ordering on that date — see the [Special Opening Hours caveats](/docs/guides/store-settings/opening-hours#special-opening-hours).)
* **For a short one-off closure**, snooze your store from the dashboard for the affected period — this pauses new orders while snoozed. Note that if **Allow pre-orders when store is snoozed** is turned on at the top of the Pre-orders page, customers can still place pre-orders during a snooze — turn it off first if you want the snooze to block pre-orders too. See [Disable Ordering](/docs/guides/orders/disable-ordering).
* **For a recurring quiet period**, split or shorten the weekday's window under **Pickup times** / **Delivery times** as described above, and restore it after the date has passed.
* **If you only fulfil pre-orders on certain dates**, use **Specific pre-order days** to allow only those dates.
If none of these fit your situation, [contact support](/docs/getting-started/contact-support) and we'll help you find the best option.
## What Customers See
Times outside your configured windows, dates excluded by **Specific pre-order days**, and slots that have reached their capacity all appear as unavailable in the customer's scheduling view — customers cannot select them when placing a pre-order.
## Related
* [Pre-orders](/docs/guides/orders/advanced/pre-orders) — full guide to pre-order settings, slots, and troubleshooting
* [Order Limits](/docs/guides/orders/advanced/order-limits) — capacity and value limits per slot
* [Disable Ordering](/docs/guides/orders/disable-ordering) — temporarily pause all new orders
* [Orders Overview](/docs/guides/orders/overview) — learn about order types and fulfillment
# Blocked orders log: review rejected checkout attempts
Source: https://storekit.com/docs/guides/orders/advanced/blocked-orders
Review the storekit Blocked Orders log to see orders rejected at checkout. Understand why customers were blocked and recover lost revenue from edge cases.
The Blocked Orders log shows orders that customers attempted to place but were rejected by the system. These are orders that never reached your kitchen - they were blocked at checkout for a specific reason.
## Viewing Blocked Orders
Go to **Reports > Logs** in the dashboard to see the blocked orders log. Each entry shows:
* **Date** - When the order attempt occurred
* **Block reason** - Why the order was rejected
* **Order type** - Pickup, Delivery, or Dine-in
* **Total** - The order value
* **Items** - What was in the cart
* **Customer** - Who attempted the order
## Block Reasons
### Availability Issues
| Reason | Description |
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| `sold_out` | One or more items are snoozed or out of stock |
| `venue_closed` | Store is not accepting orders at this time |
| `time_slot_expired` | Pre-order time has passed or is too soon |
| `preorder_outside_special_hours` | Pre-order falls outside special opening hours |
| `item_unavailable_today` | Item is not available on this day |
| `order_cutoff_reached` | The chosen slot is no longer bookable because its scheduling notice or preparation time has elapsed (this is not a configurable cut-off setting) |
### Order Value Issues
| Reason | Description |
| -------------------------- | ---------------------------------------- |
| `min_delivery_value_error` | Order below minimum for delivery |
| `min_pickup_value_error` | Order below minimum for pickup |
| `min_in_store_value_error` | Order below minimum for dine-in |
| `max_delivery_value_error` | Order exceeds maximum for delivery |
| `max_pickup_value_error` | Order exceeds maximum for pickup |
| `max_in_store_value_error` | Order exceeds maximum for dine-in |
| `min_item_quantity_error` | Order doesn't meet minimum item quantity |
### Slot Limits
| Reason | Description |
| ----------------------------------- | ----------------------------------------- |
| `slot_quantity_limit_exceeded` | Too many orders in this time slot |
| `slot_monetary_limit_exceeded` | Revenue limit for this slot reached |
| `slot_item_quantity_limit_exceeded` | Item quantity limit for this slot reached |
### Payment & Discount Issues
| Reason | Description |
| --------------------------- | ----------------------------------------------- |
| `bad_total` | Cart total doesn't match (usually a sync issue) |
| `invalid_discount` | Discount code is invalid or expired |
| `gift_card_error` | Gift card processing failed |
| `piggy_voucher_error` | Piggy voucher is invalid or expired |
| `como_error` | Como loyalty reward issue |
| `como_insufficient_balance` | Not enough Como points |
### Other Issues
| Reason | Description |
| ------------------------- | --------------------------------------- |
| `missing_customer_fields` | Required customer info not provided |
| `bill_closed` | Dine-in bill is already closed |
| `delivery_too_far` | Delivery address outside delivery zones |
| `modifier_not_found` | Selected modifier no longer exists |
## Using the Blocked Orders Log
The log helps you identify:
1. **Menu sync issues** - Frequent `sold_out` blocks may indicate your menu availability isn't updating correctly
2. **Slot capacity** - `slot_*_exceeded` blocks show when you're hitting operational limits
3. **Pricing mismatches** - `bad_total` blocks can indicate caching or sync issues
## Exporting Data
Click **Export** to download the blocked orders as a CSV file for further analysis.
# Moving Orders
Source: https://storekit.com/docs/guides/orders/advanced/move-orders
Reschedule a storekit pre-order to a different date or time when the original schedule no longer works. Keep customers informed without cancelling.
Move a pre-order to a different date or time when the original schedule no longer works.
## When to Move an Order
Moving an order is useful when:
* **Customer requests a change** — the customer contacts you to reschedule
* **Operational reasons** — staffing changes or capacity adjustments
* **Rescheduling due to issues** — supply problems or unexpected closures
## How to Move an Order
Go to **Orders** → **All Orders** and search for the order, then click it to open the order page.
On the order page, the fulfillment line shows the scheduled date and time as underlined text (for example `Pickup at Aug 7th, 12:30`). Click it to open **Change this order's date & time slot**.
Pick a **Day**, then a **Time slot**. Each slot shows how many orders, items and value are already booked into it, and slots at capacity are marked `(Full)`.
Tick the follow-up actions you need: **Cancel pre-order print jobs**, **Re-queue pre-order print jobs**, and — where the integration is connected — **Cancel & rebook orkestro delivery**, **Cancel & rebook PedalMe delivery** or **Reschedule deliverect order**.
Click **Save changes**. The customer is emailed (and texted, if SMS notifications are on) about the new time.
Other than the integrations listed above, the change is not pushed to external systems. The modal states: *"This won't update any external systems like your POS or delivery system."*
## Limitations
Moving an order only changes the scheduled pre-order slot. The following are not possible.
### You Cannot Move an Order to the Past
An order can only be moved to a **future** date and time that still has an available slot. The **Day** dropdown only offers today and later dates, and if you save a time that has already passed, the change is rejected with **Time slot expired** — *"Sorry, the time slot you selected is no longer available."*
There is no way to move an order onto a date or time that has already passed, and no way to backdate an order so it appears in an earlier day's figures.
### Only Scheduled Pre-Orders Can Be Moved
The clickable date and time only appears on orders that have a scheduled pre-order slot. ASAP orders have no scheduled slot, so there is nothing to click and there is no way to turn an ASAP order into a scheduled one — the customer has to place a new order with the slot they want.
### Days and Slots Must Already Be Open
You can only choose from days and slots the store is already accepting pre-orders for. If the day you want is missing, or the slot list shows `Sorry, no slots left today`, change the store's availability first (**Stores** → \[your store] → **Settings** → **Pre-Orders**) and then move the order. There is no way to place an order into a closed day or a full slot from this modal.
### Completed Orders Cannot Be Rescheduled
Once an order has been completed, rescheduling it has no effect on the fulfillment that already happened — and because the new time must be in the future, there is no way to move a finished order back to when it was actually collected or delivered. Correct a mistake with a refund or a new order instead.
### Orders Cannot Be Merged
There is no way to merge two orders into one, and no way to move items from one order into another. Each order stays separate with its own order code, payment and receipt. If a customer wants everything together, cancel and refund one order and ask them to re-order the items on the other.
## Related
* [Orders Overview](/docs/guides/orders/overview) — learn about order types and fulfillment
* [Managing Live Orders](/docs/guides/orders/managing-live-orders) — handle incoming orders in real-time
# Order Batching
Source: https://storekit.com/docs/guides/orders/advanced/order-batching
Group multiple storekit orders from the same table into a single consolidated kitchen ticket. Reduce ticket noise and give the kitchen a complete table view.
Order batching combines multiple orders from the same table into one consolidated order before sending to the kitchen or POS. This reduces ticket noise and gives the kitchen a complete view of what a table has ordered.
## How It Works
Without batching, each time a guest at a table orders something, a separate ticket prints in the kitchen. With batching enabled:
1. Guest places first order → order is held in a batch
2. Guest places second order → added to the same batch
3. After the timeout period, the batch closes
4. All orders merge into one ticket and send to kitchen/POS
```
Without batching: With batching:
┌─────────────┐ ┌─────────────┐
│ Ticket #1 │ │ Ticket #1 │
│ 1x Burger │ │ 1x Burger │
└─────────────┘ │ 1x Fries │
┌─────────────┐ │ 2x Beer │
│ Ticket #2 │ │ 1x Wings │
│ 1x Fries │ → └─────────────┘
└─────────────┘
┌─────────────┐ (Single consolidated
│ Ticket #3 │ ticket after timeout)
│ 2x Beer │
└─────────────┘
┌─────────────┐
│ Ticket #4 │
│ 1x Wings │
└─────────────┘
```
## When Orders Are Batched
Orders are grouped into the same batch when:
* **Same table** - Orders must be from the same table
* **Within timeout window** - Orders placed within the configured timeout period
* **In-Store fulfillment only** - Batching only applies to dine-in orders
Pickup and Delivery orders are never batched - they always go straight to the kitchen.
## Smart Batch Closing
storekit uses a smart algorithm to determine when to close a batch, balancing speed with consolidation.
### How It Works
The system monitors whether anyone at the table is still browsing the menu or building an order:
* **Someone still ordering?** → Batch stays open (up to the timeout limit)
* **Everyone finished?** → Batch closes immediately
This means if one person places an order and no one else at the table has the menu open, the batch closes straight away - no unnecessary waiting. But if others are still deciding, the system waits for them.
### Example
```
12:00:00 - Alice orders a burger (batch opens)
12:00:05 - System detects Bob has menu open → batch stays open
12:01:30 - Bob orders fries (added to batch)
12:01:35 - No one else browsing → batch closes immediately
12:01:35 - Merged order sent to kitchen
```
Compare this to a simple 5-minute timeout where the kitchen would wait until 12:05:00 - that's over 3 minutes saved.
### Timeout Limit
If guests keep browsing, the batch won't stay open forever. There's a maximum timeout (up to 5 minutes) after which the batch closes regardless. This ensures orders always reach the kitchen in a reasonable time.
| Timeout | Best for |
| --------------- | -------------------------- |
| 1-2 minutes | Fast-casual, quick top-ups |
| 3 minutes | Standard table service |
| 5 minutes (max) | Groups ordering together |
## Merged Order Contents
When a batch closes, orders are intelligently merged:
| Element | How it's merged |
| ------------------ | ---------------------------------------------------- |
| **Items** | Combined, with quantities summed for identical items |
| **Modifiers** | Items with different modifiers kept separate |
| **Totals** | All order totals, tips, and service charges summed |
| **Notes** | Only included when **Include order notes** is on |
| **Customer names** | Only listed when **Include customer names** is on |
### Item Merging Example
```
Order 1: 1x Burger (no onions)
Order 2: 1x Burger (extra cheese)
Order 3: 1x Burger (no onions)
Merged result:
- 2x Burger (no onions) ← quantities combined
- 1x Burger (extra cheese) ← kept separate (different modifier)
```
## Configuration
### Store-Wide Settings
Go to **Stores** → \[your store] → **Settings** → **Operations** and find the **Order batching** section:
| Setting | Description | Default |
| -------------------------- | ----------------------------------------------------- | ------- |
| **Enable order batching** | Turn batching on/off | Off |
| **Batch timeout** | Minutes before batch closes | 5 |
| **Include order notes** | Show individual customer notes on the combined ticket | Off |
| **Include customer names** | List who ordered what on the combined ticket | Off |
The **Order batching** section only appears for dine-in stores — batching applies to In-Store orders only.
### Disabling Batching for Specific Tables
The store-level **Batch timeout** picker only offers 1–5 minutes; to switch batching off for the whole store, turn off **Enable order batching**. For individual tables or sections, set that table's batch timeout to 0 instead — orders from those tables go straight to the kitchen without waiting, while the rest of the store keeps batching.
This is useful for bar seating or quick-service areas where guests typically order one item at a time.
## Customer Notes on Batched Tickets
When batching is enabled, customer notes are **stripped from the merged ticket** unless **Include order notes** is turned on. This is the most common reason a kitchen or bar stops seeing notes after batching is switched on: the customer types a note at checkout, the note is saved on the order, but the consolidated ticket sent to the kitchen, printer or POS contains no notes at all.
**Include order notes** controls both:
* The general order note each guest typed at checkout (prefixed with the guest's first name on the merged ticket)
* Item-level notes, which are merged into the same notes block as `Item name: note`
### Order notes aren't reaching the kitchen or bar
Work through these in order:
Go to **Stores** → \[your store] → **Settings** → **Operations** → **Order Notes** and make sure it is set to **Optional** or **Mandatory**. **Hidden** disables order notes entirely, so customers never get a note field at checkout.
In the same page, under **Order batching** → **Merged ticket contents**, turn on **Include order notes**. With batching on and this toggle off, notes are removed from the merged ticket even though they appear on the order in the dashboard.
Zonal only accepts customer notes as a line item. Without an **Order Note Product ID** in the Zonal integration settings, notes are dropped on the way to the POS. See [Zonal order notes](/docs/guides/integrations/pos/zonal#order-notes).
Open the order in the dashboard and confirm the note is on it. If the note is on the order but missing from the ticket, the problem is in the steps above; if it is missing from the order too, the customer never entered one (or **Order Notes** is set to **Hidden**).
Changing **Include order notes** only affects orders batched after you save. Tickets already sent to the kitchen aren't reprinted.
### Notes and split printing
A general order note isn't tied to a specific item, so it prints on **every** station ticket for that order. With split printing, each printer receives only the items from its assigned categories, but the order note appears on each of those tickets — so a note like "nut allergy" reaches the kitchen and the bar. A printer that receives none of the order's items doesn't print a ticket at all, so it won't see the note either.
## Integration with POS Systems
When a batch closes, the merged order is sent to your connected systems:
* **POS systems** - Deliverect, Lightspeed, Zonal, Tissl, PointOne, Comtrex, Ikentoo
* **Printers** - CloudPRNT enabled printers
The POS receives one order containing all items from the batch, making it easier to manage the table's bill.
## Send to Kitchen
When batching is enabled, guests see a **Send to Kitchen** button after placing their order. This allows them to close the batch early instead of waiting for the timeout.
The button appears with a countdown timer showing how long until the batch auto-closes. If the guest knows they're done ordering, they can tap the button to immediately send all orders to the kitchen.
This is useful when:
* A guest is ordering alone and doesn't need the full timeout
* The table has finished ordering and wants their food sooner
* A quick top-up order that should go straight through
## Best Practices
1. **Match timeout to service style** - Fast-casual needs shorter timeouts than fine dining
2. **Enable customer names** - Helps kitchen identify who ordered what at large tables
3. **Turn on Include order notes** - Otherwise allergy and preparation notes never reach the kitchen
4. **Train staff** - Ensure servers know batches will be held before going to kitchen
5. **Consider bar vs table** - Use table-specific timeouts for different seating areas
# Order Limits
Source: https://storekit.com/docs/guides/orders/advanced/order-limits
Set minimum and maximum order values, quantities, and per-order rules in storekit. Manage kitchen capacity, protect profitability, and prevent abuse.
Control checkout eligibility by setting minimum spend, maximum spend, and quantity requirements. These limits help manage kitchen capacity, ensure order profitability, and prevent abuse.
## Monetary Limits
Set minimum and maximum order values for each fulfilment method on the **Order limits** card at **Stores** → your store → **Settings** → **Operations**. The card has a **Minimum** and a **Maximum** column, with one row per fulfilment method.
Which rows you see depends on how the store takes orders. Order-and-pay stores show a single **In-store orders** row; every other store shows **Delivery orders** and **Pickup orders**.
### Minimum Order Value
Require customers to spend a minimum amount before checkout. If their basket is below the minimum, they see a message showing how much more they need to spend.
| Row and column | Applies To |
| --------------------------------- | ------------------------------------------- |
| **Pickup orders** → **Minimum** | Pickup, curbside and catering pickup orders |
| **Delivery orders** → **Minimum** | Delivery and catering delivery orders |
| **In-store orders** → **Minimum** | Dine-in (in-store) orders |
**Use cases:**
* Ensure orders are profitable after payment processing fees
* Cover fixed costs like packaging
* Encourage larger orders
Delivery zones can override the store-wide minimum delivery amount. Use this to require higher minimums for distant deliveries where costs are higher.
### Maximum Order Value
Cap the maximum order value to prevent unusually large orders that may be fraudulent or exceed your capacity.
| Row and column | Applies To |
| --------------------------------- | ------------------------------------------- |
| **Pickup orders** → **Maximum** | Pickup, curbside and catering pickup orders |
| **Delivery orders** → **Maximum** | Delivery and catering delivery orders |
| **In-store orders** → **Maximum** | Dine-in (in-store) orders |
**Use cases:**
* Fraud prevention for high-value orders
* Kitchen capacity management
* Directing large orders to catering flow
### Configuring Monetary Limits
1. Go to **Stores** → your store → **Settings** → **Operations**
2. Find the **Order limits** card and turn on **Limit order values**
3. Enter the **Minimum** and **Maximum** amounts for each row. Leave a value at 0 for no limit
4. Click **Save**
The limits apply to the basket subtotal (before delivery fees, tips, and service charges).
Use **Tags excluded from minimum spend** on the same card to stop items carrying a given tag counting towards the minimum order value — useful when you don't want a bottle of water or a bag of crisps to get a customer over the line.
## Quantity Limits
### Minimum Items
**Minimum items** on the **Order limits** card requires a minimum number of items in the basket before checkout. It is the only item control on the card, it applies to every fulfilment method, and it is checked before the monetary limits. This is useful for:
* Catering orders that require volume
* Bundle or meal deal enforcement
* Preventing single-item orders during busy periods
### Maximum Items
There is no maximum-items-per-order setting in the dashboard. **Order limits** has **Minimum items** and nothing that caps the number of items in a single order — to stop unusually large orders, use the **Maximum** order value instead.
The closest control is slot-level throttling for pre-orders, at **Stores** → your store → **Settings** → **Pre-Orders** → the **Pickup** or **Delivery** tab → **Advanced: slot-level throttling**, which caps a time slot at a number of total items. It is not a per-order cap:
* It counts every order already in the slot, not one basket.
* The first order into an empty slot always goes through, however large it is. Only orders after that one are checked.
So a customer can always place a single order of any size, and the cap cannot be used to enforce a per-order item limit. See [Why are some timeslots missing?](/docs/guides/orders/advanced/pre-orders#why-are-some-timeslots-missing) for a worked example.
## How Limits Are Displayed
When a customer's basket doesn't meet the requirements, the checkout button is replaced with the reason and disabled until the basket qualifies:
* **Below minimum spend** — "Please spend at least £15.00". The basket goal bar can also show "Spend £4.50 more to reach the minimum order"
* **Above maximum spend** — "Please spend less than £150.00"
* **Below minimum items** — "Minimum 3 items required"
## Per-Fulfillment Limits
Different fulfillment methods can have different limits:
| Fulfillment | Typical Minimum | Typical Maximum |
| ----------- | ----------------------------- | ------------------------ |
| Pickup | Lower or none | Standard |
| Delivery | Higher (covers delivery cost) | Standard |
| Dine-in | Lower or none | Lower (kitchen capacity) |
| Catering | Much higher | Much higher |
This allows you to:
* Make pickup attractive with no minimum
* Cover delivery costs with a higher delivery minimum
* Set high minimums for catering to ensure order size
## Zone-Specific Minimums
For delivery, you can set a different minimum order value per [delivery zone](/docs/guides/fulfillment/delivery/delivery-zones) with **Minimum spend required** and **Minimum spend amount** on the zone:
* **Zone 1 (0-2 miles)** - £10 minimum
* **Zone 2 (2-4 miles)** - £15 minimum
* **Zone 3 (4-6 miles)** - £20 minimum
Zone-specific minimums override the store-wide delivery minimum when the customer's address falls within that zone.
## Best Practices
1. **Start lower** - You can always increase minimums; reducing them is easier for customers to accept
2. **Consider your costs** - Factor in payment fees, packaging, and labour when setting minimums
3. **Match delivery effort** - Higher minimums for distant deliveries offset driver costs
4. **Communicate clearly** - Customers see exactly how much more they need to spend
5. **Test the experience** - Place test orders at various basket values to verify messaging
# Order Code Generation
Source: https://storekit.com/docs/guides/orders/advanced/order-sequence-policy
Configure how storekit generates short order codes used at pickup, on tickets, and in customer comms. Choose sequential, daily reset, or randomised.
Order codes are short identifiers used to reference orders at pickup, on printed tickets, and in customer communications. storekit supports different generation strategies to suit your operational needs.
## What Are Order Codes?
Each order receives a random code (e.g., "A1B2", "7X9K") that:
* Appears on the customer's order confirmation screen
* Prints on kitchen tickets
* Is used to call out orders for collection
* Helps staff quickly identify orders
## Code Types
storekit offers two order code formats:
### Alphanumeric (Default)
Random alphanumeric codes like `A7X2`, `K9B4`, `M3P8`.
| Pros | Cons |
| -------------------------- | ---------------------------------------- |
| Short and easy to call out | Codes can repeat |
| No predictable pattern | Some characters sound similar (B/D, M/N) |
| Works well at any volume | |
**Best for:** Most operations - simple, clean codes that work well for verbal callouts.
### Numeric Sequence
Sequential numbers like `0001`, `0002`, `0003`.
With numeric codes, you choose a **reset policy** - when the sequence restarts:
| Reset | Behaviour | Best For |
| ---------- | ---------------------------- | ------------------------------------------------------ |
| **Daily** | Resets to 1 each day | High-volume operations, seeing daily order count |
| **Weekly** | Resets to 1 each week | Operations referencing orders across days |
| **Never** | Never resets, counts forever | Tracking lifetime order count, guaranteed unique codes |
| Pros | Cons |
| ------------------------------------ | ----------------------------------------- |
| Easy to call out verbally | Numbers get long over time (with "Never") |
| Shows order volume at a glance | Predictable pattern |
| Customers find them easy to remember | |
**Best for:** Quick-service restaurants, cafes, and operations that want to see order counts.
## Order Code Prefixes
Add a prefix to your order codes to make them instantly identifiable and easier to reconcile across systems.
### Why Use Prefixes?
**Distinguish from other platforms**
If you receive orders from multiple channels (storekit, Deliveroo, Just Eat, Uber Eats), they may use similar code formats. A prefix makes it immediately clear where an order originated:
* `SK-A7X2` - storekit order
* `A7X2` - Could be Deliveroo, Just Eat, etc.
**Easier reconciliation**
When matching orders across your POS, accounting software, or reporting tools, prefixes help filter and identify storekit orders quickly.
**Multi-location identification**
For brands with multiple sites, prefixes distinguish which location received the order:
* `NYC-0042` - New York
* `LON-0042` - London
* `MAN-0042` - Manchester
### Configuring Prefixes
1. Go to **Store Settings > Operations**
2. Find **Order Code Prefix**
3. Enter your preferred prefix (e.g., "SK", "WEB", or your store code)
4. Save changes
The prefix appears before the generated code, typically separated by a hyphen.
Keep prefixes short (2-4 characters) to avoid making codes too long to call out or display.
## Configuring Order Codes
1. Go to **Store Settings > Operations**
2. Find **Order Sequence Policy**
3. Choose your code type:
* **Alphanumeric** (default) - random codes
* **Numeric** - sequential numbers with reset policy (Daily, Weekly, or Never)
4. Optionally set a prefix
5. Save changes
## Multi-Location Considerations
For brands with multiple locations:
* **Use prefixes** - Add location codes (e.g., "NYC-", "LON-") to distinguish orders
* **Separate sequences** - Each location maintains its own sequence
* **Shared format** - Keep the same strategy across locations for consistency
## Best Practices
1. **Match your callout method** - If you call order numbers verbally, use short codes
2. **Consider your volume** - High volume needs more unique codes
3. **Avoid ambiguity** - Remove characters that sound alike when called out
4. **Test thoroughly** - Place orders and verify codes appear correctly everywhere
5. **Train staff** - Ensure everyone knows how to read and call out codes
## Troubleshooting
### Duplicate Codes
If you're seeing the same codes causing confusion:
* **Alphanumeric codes** can repeat - this is normal. Consider adding a prefix to help distinguish orders.
* **Numeric codes with Daily/Weekly reset** will repeat after the reset period. Switch to "Never" if you need unique codes.
* Verify timezone settings match your operation (affects when daily/weekly resets occur).
### Confusion at Pickup
If customers can't find their orders:
* Consider adding a prefix to distinguish storekit orders from other platforms
* Train staff on clear verbal callout technique
* Display codes prominently on tickets and screens
# Pre-orders: schedule future pickup and delivery
Source: https://storekit.com/docs/guides/orders/advanced/pre-orders
Enable pre-orders in storekit so customers can schedule pickup or delivery for a future time, with separate settings and slot throttling per fulfilment.
Enable pre-orders to let customers place orders in advance for a future pickup or delivery time. This helps you manage demand, prepare ahead for busy periods, and control how many future orders can be accepted per time slot.
Pre-orders are managed from your store settings and can be configured separately for pickup and delivery.
## How Pre-orders Work
* Customers can choose a future date and time at checkout
* Pickup and delivery have separate pre-order settings
* Customers can only choose from the days and times you make available
* Pre-orders appear in your storekit order dashboard like regular orders
* Advanced slot-level throttling can limit the total number of items and total order value allowed in a slot
## Before You Set Up Pre-orders
Before enabling pre-orders, check your store [opening hours](/docs/guides/store-settings/opening-hours).
If your opening hours are not set, your store may be treated as open 24 hours by default.
## How to Enable Pre-orders
From your storekit dashboard, go to **Stores** and select the store you want to update.
From the settings menu, open **Pre-Orders**.
Turn on **Accept pre-orders**.
This allows customers to order in advance for a future date and time.
If **Also accept pre-orders outside of opening hours** is enabled, customers can place future orders even when your store is currently closed.
The order must still be for an available pickup or delivery time.
Use the **Pickup** and **Delivery** tabs to configure each fulfilment type separately.
Pickup and delivery can have different slot lengths, capacity limits, scheduling rules, and available times.
Choose how each day should be split into time slots.
For example, you can split the day into **15-minute** slots so customers choose from times such as 08:00–08:15, 08:15–08:30, and so on.
Use **Also let customers order for ASAP without picking a slot** if you want customers to place immediate orders as well as scheduled pre-orders.
If this is turned off, customers must choose an available time slot.
The ASAP option only appears on the current day, and only when the next available time slot is within the threshold set just below the toggle: *Show the ASAP option when the next available slot is within \[N] of the current time.* The choices are fixed — **Always (no limit)**, **15 minutes**, **30 minutes**, **45 minutes**, **1 hour**, **1.5 hours**, **2 hours** — and it defaults to **45 minutes**. If the next available slot is further away than the threshold, customers have to choose a scheduled time instead. The threshold applies to every fulfilment type for the store.
Because ASAP availability is based on the first fulfillment slot — not your venue's opening time — customers may be able to place ASAP orders up to a full threshold (45 minutes by default) before the first slot. If that slot is earlier than your opening time, orders can arrive before you officially open. See [How ASAP Delivery Interacts with Opening Hours](/docs/guides/store-settings/opening-hours#how-asap-delivery-interacts-with-opening-hours) for how to prevent this.
Under **Capacity per slot**, set how many orders can be accepted in each time slot.
For example, setting this to **1** means only one order can be accepted per slot.
Use **Advanced: Slot-level throttling** if you need more control over how much can be accepted in each slot.
This lets you limit a slot by:
* total number of items
* total order value
These limits are checked **across all orders in the slot**, not per individual order.
The first order in an empty slot will always go through, even if it exceeds these limits. The limits are then applied to any additional orders placed in the same slot.
If you need to restrict the value of a single order, use the **Maximum** value on the **Order limits** card at **Stores** → your store → **Settings** → **Operations** instead. There is no per-order item cap in the dashboard.
Under **Scheduling**, choose:
* How many days ahead customers can order
* How much notice customers need before the earliest available pickup or delivery time
The control reads: *Customers can order up to \[N] days ahead and need at least \[N] day(s) notice.* For example, if customers can order up to **7 days ahead** and need at least **1 day notice**, a customer ordering on Monday would see Tuesday as the earliest available fulfilment day.
**There is no "order cut-off" setting in storekit.** Same-day availability is controlled by the notice figure above: set it to **0** so *need at least 0 days notice* and customers can order for same-day pickup or delivery. Any value of **1** or more removes today entirely, so nothing can be ordered for the current day. There is no per-store or per-product cut-off time — see [Customers can't order for today](#customers-cant-order-for-today) if same-day orders are unexpectedly unavailable.
Use **Preview: what customers will see** to check the time slots that will appear at checkout.
The preview generates slots from the slot length and the windows of the first available day, so it shows the most slots a day can offer. It does not apply preparation time, capacity already used, or snoozes — see [Troubleshooting: expected time slots are missing](#troubleshooting-expected-time-slots-are-missing) if the live checkout offers fewer slots than the preview.
Under **Pickup times** or **Delivery times**, choose which days and times customers can place pre-orders.
You can expand each day and add the available time windows for that fulfilment type.
Click **Save** to apply the change.
Customers will only see pre-order options once the setting has been saved.
## Pickup and Delivery Settings
Pickup and delivery are configured **separately**.
Use the **Pickup** tab to control collection pre-orders, including pickup time slots and pickup capacity.
Use the **Delivery** tab to control delivery pre-orders, including delivery time slots and delivery capacity.
This lets you offer different availability for each fulfilment type.
## Limiting When an Order Can Be Collected
A common point of confusion is the difference between **menu category hours** and **pickup or delivery time windows**. They control two different things:
* **Category hours** (set per category on the menu — see [Category Hours](/docs/guides/menu/categories#category-hours)) decide **when a category is visible and orderable**. They are evaluated against the **current time**, so they stop customers *placing* new orders for that category outside its hours. This is the setting to use if you want to stop new orders during a period — for example pausing a category during a lunch rush. Category hours do **not** restrict which pickup or collection time the customer can then choose.
* **Pickup and delivery time windows** (under **Pre-Orders**) decide **when an order can actually be collected or delivered**. These are the windows customers pick their slot from.
To limit when an order can be collected, add the appropriate time windows for each day:
1. Go to **Stores** → your store → **Settings** → **Pre-Orders**.
2. Open the **Pickup** or **Delivery** tab.
3. Under **Pickup times** or **Delivery times**, expand the day and set its time window. You can add more than one window per day with **Add another time interval** — for example **07:30–10:45** and **11:00–14:30** — so slots are only offered inside those intervals.
To close a single slot rather than a whole window, [block specific timeslots](/docs/guides/orders/advanced/block-timeslot).
There is currently no single "this item is only collectable before X" setting. The times a customer can order for are the combination of the category's hours (when the category can be ordered) and the pickup or delivery time windows (when it can be collected). Set both to match if you want a category to be orderable and collectable only within the same period. For example, Breakfast category hours of 07:30–10:45 stop new breakfast orders after 10:45, but a **Pickup times** window of 07:30–10:45 is what stops customers choosing a later collection time.
## What Customers Can Do
When pre-orders are enabled, customers can:
* Select a future date and time from the available slots
* Choose pickup or delivery if both fulfilment types are enabled
* Place orders outside current opening hours if this setting is enabled
* Place ASAP orders if ASAP ordering is enabled (based on preparation time)
## When to Use Pre-orders
Use pre-orders when:
* Customers need to order ahead for pickup or delivery
* Your venue prepares food in advance
* You want to accept orders outside current opening hours
* You need better control over future order volume
* You offer catering, large orders, or scheduled fulfilment
## Understanding Slot Times in Your Dashboard
When a customer places a pre-order, the time shown in the order details is the **start** of the delivery or pickup window they selected — not the end.
For example, if your store uses 30-minute slots and an order shows **12:00**, the customer's delivery window is **12:00–12:30**.
This time is referred to as the **requested fulfilment time** — it is the beginning of the slot the customer chose at checkout.
You can change the scheduled time for a pre-order by clicking the time shown in the order details and selecting a different available slot.
## Troubleshooting: expected time slots are missing
Pre-order slots are **generated from one place only**: the time windows saved for that weekday under **Pickup times** or **Delivery times**. Everything else — preparation time, capacity, snoozes — can only *remove* slots from that list; nothing adds slots back.
Walk these checks in order. Unless stated otherwise, every setting is at **Stores** → your store → **Settings** → **Pre-Orders**.
Pickup and delivery have completely separate windows, slot lengths and capacity settings — use the **Pickup** and **Delivery** tabs.
In-store ordering (QR / table) uses the **Pickup times** windows, but takes its preparation time from the **Delivery** figure in step 4.
Under **Pickup times** (or **Delivery times**), expand the day. Slots exist only inside the windows saved there, so two windows leave a hard gap between them — **09:00–12:00** plus **13:00–17:00** offers nothing between 12:00 and 13:00.
A day whose **Unavailable** toggle is on shows a **Closed** badge and offers no slots at all.
Slots are cut from the **start** of each window in steps of the slot length, and only whole steps are offered:
* A window shorter than one slot produces **no slots** — 12:00–12:05 with **10-minute** slots gives nothing.
* A remainder too short for another whole slot is dropped — 12:00–12:45 with **10-minute** slots ends with the 12:30–12:40 slot, and the last five minutes are unbookable.
For today only, storekit takes the current time, adds your preparation time, and removes every slot that starts before it. Preparation time is not on the Pre-Orders page: it lives at **Stores** → your store → **Settings** → **Operations** → **Preparation time**, which has a **Delivery** row and a **Pickup** row (order-and-pay stores show a single **Average prep time** row instead).
* **Pickup** slots use the **Pickup** figure.
* **Delivery** slots use the **Delivery** figure **plus a fixed 15 minutes** of travel allowance. That 15 minutes is not configurable and appears nowhere in the dashboard.
* Even with a figure of **0**, the earliest slot is still about **5 minutes** away — storekit applies a five-minute floor.
* If preparation time pushes the earliest slot past midnight, today has **no** slots at all.
**"Capacity is unlimited and my prep time is 0, but the first slots of the day are still missing."** If the missing block is roughly an hour, you are almost certainly looking at delivery: a **Delivery** preparation time of **45** minutes plus the fixed 15-minute travel allowance removes the first hour of the day. The **Pickup** figure has no effect on delivery slots, so setting pickup to 0 changes nothing there — lower the **Delivery** figure instead. Preparation time only trims **today**, so if tomorrow's list is complete and today's starts late, this is the cause.
Under **Scheduling**, *Customers can order up to \[N] days ahead and need at least \[N] day(s) notice.* A notice value of **1** or more removes today entirely, and nothing is bookable beyond the days-ahead value. See [Customers can't order for today](#customers-cant-order-for-today).
**Specific pre-order days** is an allow-list: as soon as any dates are selected, only those dates are bookable and every other day disappears. Dates in the past are ignored.
While the store is snoozed, pre-orders are only offered if **Allow pre-orders when store is snoozed** is on — and then every slot that starts **before the snooze ends** is removed, and the earliest bookable date moves past the snooze. With that setting off, a snoozed store offers no pre-order slots at all. A store that is offline accepts no orders of any kind. See [Disable Ordering](/docs/guides/orders/disable-ordering).
A slot disappears once it is full: **Accept up to \[N] orders per slot** under **Capacity per slot**, plus the total-items and revenue caps under **Advanced: slot-level throttling**.
* Orders that are rejected or archived stop counting; refunded and cancelled orders still count.
* A checkout started in the last **5 minutes** also holds the slot until it completes or drops off.
* The item and revenue caps add the **current customer's basket** to the running total, so the same slot can show for a small basket and be hidden for a large one. See [Why are some timeslots missing?](#why-are-some-timeslots-missing) for a worked example.
* On the **Delivery** tab an individual day can override the defaults: expand the day and open **Slot overrides** (**Slot duration**, **Max orders per slot**, **Max items per slot**, **Revenue cap per slot**). Days with an override show a **Custom** badge.
Weekly [opening hours](/docs/guides/store-settings/opening-hours) and dated [Special Opening Hours](/docs/guides/store-settings/opening-hours#special-opening-hours) are **not** used to build the slot list, so they are never the reason a slot is absent. They are checked when the customer submits the order: a pre-order outside a dated special-hours window is rejected at checkout, and the customer sees no message explaining why. If slots are present but orders fail, look there rather than at your Pre-Orders windows.
Hours do block ordering at the store level, though: while your store is closed, it takes no orders at all unless **Also accept pre-orders outside of opening hours** is on. That hides the whole ordering flow rather than individual slots.
ASAP is only offered on the **current day**, and only when the first available slot falls inside the threshold. Both controls are on the fulfilment tab: **Also let customers order for ASAP without picking a slot**, then *Show the ASAP option when the next available slot is within \[N] of the current time*. The threshold list is fixed — **Always (no limit)**, **15 minutes**, **30 minutes**, **45 minutes**, **1 hour**, **1.5 hours**, **2 hours** — it defaults to 45 minutes and applies to every fulfilment type for the store.
**Preview: what customers will see** renders the slot length against the windows of the **first available day** only. It deliberately ignores preparation time, capacity already used, snoozes and opening hours, so it shows the *maximum* set of slots.
If a slot appears in the preview but not at checkout, the cause is one of steps 4–8 — start with preparation time. When a day's slots have all been filtered out, customers see "Sorry, no slots left today" in the time dropdown.
Availability is cached in the customer's browser, so after saving a change a customer may need to **hard refresh** the ordering page before the new slots appear.
## Troubleshooting
#### Customers can't order for today
If same-day orders won't go through, there is no order cut-off setting to change — storekit has no cut-off time control anywhere in the dashboard. Instead, check these settings, in this order, under **Stores** → your store → **Settings** → **Pre-Orders** (check the **Pickup** and **Delivery** tabs separately):
1. **Days notice is 1 or more.** Under **Scheduling** the control reads *Customers can order up to \[N] days ahead and need at least \[N] day(s) notice.* If the notice value is **1** or more, today is removed and the earliest available day is tomorrow (or later). Set it to **0** to allow same-day pickup or delivery.
2. **The day's pickup or delivery end time has already passed.** Each day's time window (the **to** end time under **Pickup times** or **Delivery times**) only generates slots up to that time. If it is already later than the day's end time, no more slots appear for today.
3. **The day is set to Unavailable.** If a day's **Unavailable** toggle is on, no slots are offered for that day at all.
4. **"Specific pre-order days" does not include today.** If you have set specific pre-order days, only those dates are bookable — if today is not listed, it is closed to pre-orders.
5. **Preparation time pushes past the last slot.** The fulfilment prep time is added to the current time to find the earliest slot. If that earliest slot falls after the day's last window, today has no bookable slots left.
Pre-order availability is cached in the customer's browser. After you change any of these settings and save, a customer may need to **hard refresh** the ordering page (or reopen it) before the newly available days and slots appear.
#### Why are some timeslots missing?
For the full list of filters that can remove a slot, walk [Troubleshooting: expected time slots are missing](#troubleshooting-expected-time-slots-are-missing). Two settings are the usual cause: the **slot value cap** in slot-level throttling, and the **per-day pickup or delivery end times**.
**1. The slot has hit its value cap (slot-level throttling)**
If you set a total order value limit under **Advanced: Slot-level throttling**, storekit adds up the value of **every order already in that slot** and hides the slot when the new customer's basket would push the running total over the limit.
Two things make this easy to misread:
* The check depends on the **incoming basket's value**, so the same slot can still show for a customer with a small basket while being hidden for a customer with a large one — at the exact same time.
* The limit is only enforced **once the slot already has at least one order**. The first order into an empty slot always goes through, even if it alone exceeds the limit.
**Worked example — value cap of £100 on a slot**
* The 12:00–12:30 slot already holds orders totalling **£80**.
* A customer with a **£30** basket does **not** see the slot: £80 + £30 = £110, which is over £100.
* A customer with a **£15** basket **does** see it: £80 + £15 = £95, which is under £100.
* If the slot had been **empty**, even a £250 basket would have gone through — the cap only starts applying after the first order lands.
The same logic applies to the total-items limit. These caps count every non-rejected order in the slot, so a slot can look "empty" to you while still being full by value. To restrict a single order's size instead of a whole slot, use the **Maximum** value on the **Order limits** card at **Stores** → your store → **Settings** → **Operations** — see [Order Limits](/docs/guides/orders/advanced/order-limits#monetary-limits). There is no per-order item cap anywhere in the dashboard, so the total-items limit here cannot stand in for one.
**2. The day's pickup or delivery times end before your opening hours**
Pre-order slots are generated **only** from the time windows you add per day under the **Pickup times** or **Delivery times** section of each tab — not from your opening hours. If a day's pickup or delivery window ends earlier than your store closes, no slots appear for the rest of the evening, even though the store is open.
If evening slots are missing for one fulfilment type or one day, check that day's window under the **Pickup** or **Delivery** tab. For example, a Friday pickup window of **09:00–17:00** produces no slots after 17:00, even if your [opening hours](/docs/guides/store-settings/opening-hours) run until 22:00. Extend that day's end time to cover the evening. Remember pickup and delivery are configured separately, so a gap can affect one but not the other.
#### How do I limit how many of one specific product can be pre-ordered?
Capacity per slot and slot-level throttling limit every order in a slot **combined** — they cannot cap how many of one specific product are sold.
To restrict how many of a single product go out (on pre-orders or otherwise), turn on **Track Inventory** for that product and set its stock count. The product is hidden automatically once it reaches zero, while the rest of your menu stays available. See [Inventory Management](/docs/guides/menu/inventory-management).
#### Customers cannot see pre-order slots
Check that **Accept pre-orders** is enabled and that the relevant pickup or delivery times have been added.
Also check that the fulfilment type is enabled under **Settings > Operations**.
#### Customers cannot see delivery pre-order slots
Check that delivery is enabled under **Stores** → your store → **Settings** → **Operations** → **Fulfillment**.
If the store is set to pickup only, customers will not see delivery as a fulfilment option even if delivery pre-order times have been added.
#### Customers cannot select the expected time
Check your slot length, capacity per slot, scheduling notice, and pickup or delivery times.
If a slot has reached its capacity, it will no longer be available for new orders.
Pickup and delivery pre-orders are configured separately. Make sure you check both tabs if your store accepts both fulfilment types.
#### Does refunding or cancelling an order free up the slot?
**Refunding** an order returns the customer's payment, but it does **not** reopen the pre-order slot. The order still counts towards that slot's capacity, so the slot can stay unavailable even after the refund goes through.
**Cancelling** an order does not reopen the slot either — cancelled orders are still counted against the slot.
A pre-order slot only stops counting an order when that order is **rejected (declined)** or archived. When an order is rejected, its capacity is released **immediately** on storekit's side, so the slot can be booked again straight away. This is separate from the **3–5 business days** it usually takes for a refunded payment to appear back on the customer's statement.
To reopen the exact slot for a test or replacement order, reject the original order rather than only refunding it, or move the order to a different time by clicking its scheduled time in the order details (see [Understanding Slot Times in Your Dashboard](#understanding-slot-times-in-your-dashboard)). Moving the order frees the slot it used to occupy.
#### A slot still isn't available after a refund
Even once capacity has been released, a slot may still not appear for a new order. Common reasons:
* **The slot has been filled by other orders.** Capacity is counted across every order in the slot, including **capacity per slot** and the **slot-level throttling** limits for total items and total order value — not just the refunded order.
* **The slot is in the past or too soon.** Slots that have already passed, or that fall inside your scheduling notice (lead time) or preparation time, will not show. Slots also can't be booked beyond how many days ahead you allow.
* **Your store is closed right now.** Opening hours don't remove individual slots from the list, but unless **Also accept pre-orders outside of opening hours** is enabled, a closed store takes no orders at all while it is closed. See [Know what opening hours do — and don't do](#troubleshooting-expected-time-slots-are-missing).
* **A very recent order is still holding the slot.** An order placed in the last few minutes that hasn't finished payment can briefly reserve the slot before it either completes or drops off.
If a slot should be free but still won't appear, [contact support](/docs/getting-started/contact-support).
## Related
* [**Opening Hours**](/docs/guides/store-settings/opening-hours) — manage when your store is open for orders
* [**Enabling Pickup**](/docs/enabling-pickup) — enable pickup/collection orders for your store
* [**Enabling Delivery**](/docs/guides/fulfillment/delivery/enabling-delivery) — enable delivery orders for your store
* [**Delivery Zones**](/docs/guides/fulfillment/delivery/delivery-zones) — configure where delivery is available
* [**Managing Live Orders**](/docs/guides/orders/managing-live-orders) — handle incoming orders in real time
# Archiving Orders
Source: https://storekit.com/docs/guides/orders/archiving-orders
Archive completed storekit orders to keep your dashboard focused on active orders. Archived orders remain searchable in reports without cluttering live queues.
Archiving moves completed orders out of the main order view, keeping your dashboard focused on active orders during busy periods.
## How Archiving Works
* Archived orders are removed from the default order list view
* Archived orders retain all data — they are not deleted
* You can still find archived orders using search and filters
## How to Archive an Order
From your order list, click on a completed order to open its details.
Click **Archive** to move the order out of the main view.
## When to Archive
Archiving is useful for:
* Keeping the live orders view clean during busy service periods
* Removing completed orders you no longer need to reference immediately
* Organising your order history
Archived orders are never deleted. You can always find them by searching for the order code, customer name, or filtering by date.
## Related
* [Managing Live Orders](/docs/guides/orders/managing-live-orders) — handle incoming orders in real-time
* [Orders Overview](/docs/guides/orders/overview) — how orders flow through storekit
# Temporarily Disable Ordering
Source: https://storekit.com/docs/guides/orders/disable-ordering
Temporarily pause your storekit store from accepting new orders without changing opening hours. Ideal for unexpected closures or reaching capacity.
You can temporarily stop your store from accepting new orders without changing your opening hours. This is useful when you need to pause operations quickly.
## How to Pause Ordering
From your store dashboard, toggle off ordering or use the pause button. Your store will immediately stop accepting new orders.
When ordering is paused, customers visiting your store see a message indicating that the store is not currently accepting orders.
## When to Use
Temporarily disabling ordering is useful for:
* **Unexpected rush** — kitchen is overwhelmed and needs to catch up
* **Staff shortage** — not enough team members to handle incoming orders
* **Kitchen issues** — equipment problems or supply disruption
* **Special events** — private functions or maintenance periods
## Resuming Orders
When you're ready to start accepting orders again, toggle ordering back on from your dashboard. Orders will resume immediately.
Pausing ordering starts **immediately** — it is not a way to schedule a closure for a future date. For a date you already know about (a bank holiday, a private event, an early close next Friday), add a dated row under [Special Opening Hours](/docs/guides/store-settings/opening-hours#special-opening-hours), which overrides your weekly hours for that date only and leaves the rest of your schedule intact.
## Related
* [Opening Hours](/docs/guides/store-settings/opening-hours) — configure your regular operating schedule
* [Special Opening Hours](/docs/guides/store-settings/opening-hours#special-opening-hours) — close or change hours for one specific date
* [Managing Live Orders](/docs/guides/orders/managing-live-orders) — handle incoming orders in real-time
# Kitchen Display
Source: https://storekit.com/docs/guides/orders/kitchen-display
Run the storekit Kitchen Display: a full-screen ticket board that shows live orders by due time and lets staff bump tickets through each stage.
The Kitchen Display is a full-screen ticket board for the kitchen. It shows every open order for the stores you choose, ordered by when it is due, and lets staff move each ticket along with a single tap. Open it on a tablet or wall screen and leave it running — it updates in real time as orders arrive and change.
## Opening the Screen
1. Go to **Orders** → **Kitchen Display**.
2. The first time, the screen asks you to **Choose stores**. Pick the stores this screen should show, then click **Save**. Nothing loads until at least one store is chosen.
3. Click **Fullscreen** to hide the browser chrome. **Exit** takes you back to the dashboard.
The header shows how many tickets are on the board and, on the right, **Completed**, **Fullscreen**, **Settings** and **Exit**.
## How the Board Works
Tickets are split into three groups by order status:
| Group | Statuses | Where it appears |
| ---------- | -------------------------------------------------------------------- | ----------------------------------------------- |
| Production | Pending, Accepted, Preparing (plus orders still syncing to your POS) | The main queue in the middle, soonest due first |
| Ready | Ready for Pickup, Out for Delivery | The **Ready** rail on the right |
| Completed | Completed, Delivered | Behind the **Completed** button in the header |
### The queue
The queue holds everything the kitchen still has to make, ordered by due time. When more tickets exist than fit on one page, the rest are backlog: use **Previous** and **Next** at the bottom, or the left and right arrow keys, to move through them.
The chips above the queue give a running count of where things stand: **Overdue**, **Due in 5m** (the number matches your **Warn before due** setting) and **Later**.
Pre-orders join the queue ahead of their slot so the kitchen can start on time. How far ahead is controlled by **Show pre-orders ahead by (min)**; until then a scheduled ticket is not shown.
### Anatomy of a ticket
Each ticket has a coloured head and a body:
* **Head** — the order number (or table number for dine-in), the time it was placed and the customer's name on the left; on the right, a countdown to when it is due and the target time itself (**Ready**, **Pickup**, **Driver pickup** or **Delivery**). For deliveries the countdown runs against the courier pickup, with the customer's delivery time underneath. A new ticket flashes briefly when it lands.
* **Fulfilment line** — **Dine in**, **Pickup**, **Delivery**, **Catering pickup** or **Catering delivery**.
* **Timing line** — how long the ticket has been in the kitchen and, where the menu has prep times, how long it needs, so a chef can tell whether a ticket is behind or simply big.
* **Items** — quantity and name, with each modifier on its own line beneath it. Item-level notes appear as highlighted lines; an order-level note appears in a **Note** box. If **Show allergens on tickets** is on, allergens tagged on the products are listed in a red strip. Only tagged allergens appear — an empty strip does not mean a dish is allergen-free.
The head changes colour as the due time approaches: neutral while there is time, amber once it is within the **Warn before due (min)** window, and red once it is past the **Late after due (min)** threshold. The countdown then shows how late the ticket is rather than resetting.
### The Ready rail
Tickets that have been marked ready or dispatched move to the **Ready** rail on the right, where front of house can see what is waiting to be handed over. Each card shows the order code, item count, fulfilment type and customer, with a button to complete it. Click the item count to open the full order details. The rail can be collapsed with the arrow at its top; **Ready rail order** decides whether the soonest-due or the most recently plated ticket sits at the top.
### All-day counts
The **All day** rail on the left totals every item still to be made across the whole queue, so the kitchen can batch prep — three margheritas across three tickets show as one line. It can be collapsed with the arrow at its top, or hidden entirely with **Show all-day counts**.
### Completed
Click **Completed** in the header to see tickets finished in the last few minutes (set by **Keep done tickets for (min)**). Each shows an **Undo** button. Older orders are in **Orders** → **All Orders**. Click **Completed** again to return to the queue.
### Staying in sync
The board receives orders over a live connection and also re-checks periodically. If it has not heard anything for a minute a banner appears saying the board may be missing orders, with a **Try now** button to refresh. If a bump fails to save, the ticket shows **Could not update that ticket** and stays where it was.
## Bumping Tickets
In the queue, the whole ticket head is the bump button — tap it to move the order to its next status. Ready-rail and Completed cards have a labelled button instead. The action depends on the order:
| Order state | Fulfilment | Action | Result |
| --------------------- | -------------------------------- | -------------------- | --------------------------------------------------------------------------- |
| Pending | Any | **Accept** | Confirms the order. It stays in the queue as Accepted. |
| Accepted / Preparing | Dine in, Pickup, Catering pickup | **Ready** | Moves to the **Ready** rail. The customer is notified their order is ready. |
| Accepted / Preparing | Delivery, Catering delivery | **Out for delivery** | Moves to the **Ready** rail as dispatched. |
| Ready for Pickup | Dine in, Pickup, Catering pickup | **Collected** | Completes the order. |
| Out for Delivery | Delivery, Catering delivery | **Delivered** | Completes the order. |
| Completed / Delivered | Any | **Undo** | Returns the ticket to the **Ready** rail. |
If **Ask how long until ready** is on, tapping **Ready** on a collection order opens a sheet asking **When will it be ready?** — choose **Now** or a number of minutes. The customer is told either way and the ticket moves to the Ready rail showing **ready in** that many minutes.
Orders that failed to reach your POS (Failed or Retrying) stay in the queue so the kitchen can see them, but their head is disabled and they cannot be bumped until the sync succeeds. Manage those from **Orders** → **Live Orders**.
## Settings
Click **Settings** in the header. Settings are saved on the device only, so each kitchen screen can be set up differently. **Reset** returns them to the defaults; **Save** applies your changes.
| Setting | What it does | Default |
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------- |
| **Stores** | Only orders for these stores appear on this screen. | None selected |
| **Ticket layout** | How tickets are arranged on a page. **Tiled** shows the most tickets; **One per column** and **Two rows** show fewer, larger tickets and scroll the ones too long for their space. | **Tiled** |
| **Keep done tickets for (min)** | How long completed tickets remain in the **Completed** view. | 10 |
| **Show pre-orders ahead by (min)** | How far before their slot scheduled orders join the queue. | 60 |
| **Warn before due (min)** | When a ticket turns amber and counts under **Due in**. | 5 |
| **Late after due (min)** | How long after the due time a ticket turns red and counts as **Overdue**. | 0 |
| **Text size** | **Small**, **Medium** or **Large**. Larger text fits fewer tickets on a page. | **Medium** |
| **Colour** | **Dark mode** suits a screen on a wall above the line; **Light mode** suits a bright counter where a dark screen turns into a mirror. | **Dark mode** |
| **Show items on tickets** | Turn off for a pass-only screen that just needs order codes and timing. | On |
| **Show allergens on tickets** | Lists the allergens tagged on each product. | Off |
| **Show all-day counts** | Shows or hides the **All day** rail. | On |
| **Ask how long until ready** | Prompts for a wait time when you tap **Ready** on a collection. | Off |
| **Ready rail order** | **Soonest due first** keeps a ticket in the place it held in the queue; **Latest due first** puts what was just plated at the top. | **Soonest due first** |
| **Play a sound for new orders** | Chime when a ticket arrives, with a **Sound volume** slider. Browsers block sound until the screen has been touched, so tap **Test sound** once when you set a screen up. If the board shows **Tap to turn sound on**, tap it. | On |
The option lists for **Ticket layout**, **Text size**, **Colour** and **Ready rail order** are fixed; there are no other choices.
## Related
* [Managing Live Orders](/docs/guides/orders/managing-live-orders) — the dashboard view for accepting, rejecting and refunding orders.
* [Order Statuses](/docs/guides/orders/order-statuses) — what each status means.
# Managing Live Orders
Source: https://storekit.com/docs/guides/orders/managing-live-orders
Manage storekit orders from the dashboard, your POS terminal, or via direct kitchen printing, and compare workflows for different operations.
storekit offers multiple ways to manage orders depending on your operation. You can use the dashboard, integrate with a POS system, or rely on direct printing - or combine all three.
**There is no storekit app to download for merchants on iOS or Android.** Orders are managed in the dashboard at `dashboard.storekit.com`, which works in any browser — including the browser on a phone or tablet, so there is nothing to install. Any storekit app you find in the App Store or Google Play is a customer-facing ordering app (App Studio) built for a brand's own customers; it cannot be used to receive or manage orders.
## Ways to Manage Orders
| Method | Best for | How it works |
| ------------------- | ----------------------- | --------------------------------- |
| **Live Orders** | Active order management | Real-time feed of today's orders |
| **All Orders** | History and reporting | Searchable list of all orders |
| **POS Integration** | Kitchen workflow | Orders sent directly to your POS |
| **Direct Printing** | Kitchen tickets | Orders auto-print to your printer |
Most operations use a combination - for example, POS integration for the kitchen plus the dashboard for customer service queries.
## Live Orders
The Live Orders view is your real-time command centre for managing active orders.
**Orders > Live Orders**
### What You See
* Real-time feed of today's orders
* Connection status indicator (green = connected)
* Audio alert when a new order arrives, while the page is open ([troubleshooting](#troubleshooting))
* Order cards showing status, items, customer, and timing
### Connection & Real-Time Updates
Live Orders relies on a persistent real-time connection to deliver new orders to your screen automatically.
* **Green dot** — you are connected and orders will appear automatically.
* **Red dot with "Connection Error"** — the connection has dropped. New orders will **not** appear until the connection is restored.
If the indicator is not green, first check [status.storekit.com](https://status.storekit.com) to rule out a platform incident — during an incident no local troubleshooting will help. Otherwise:
1. Check your internet connection is active.
2. Refresh the browser page.
3. Try a different browser (Chrome or Edge recommended).
4. Clear the browser cache and reload.
**Tablet and kiosk users:** Disable battery saver and auto-sleep modes on your device. These features can suspend the browser tab in the background and break the real-time connection, which prevents new orders from appearing.
For the most reliable experience, keep the Live Orders tab as the **active foreground tab** on any device dedicated to order management.
### Order Actions
Click an order to open the detail panel where you can:
| Action | When to use |
| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Accept** | Confirm you're preparing the order |
| **Reject order** | Decline the order. The customer is notified, but the payment is not refunded automatically — see [Order Statuses](/docs/guides/orders/order-statuses#rejected) |
| **Preparing** | Mark order as in progress |
| **Ready for Pickup** | Notify customer their order is ready |
| **Out for Delivery** | Hand off to driver |
| **Complete** | Close the order |
Open an order and click **More actions** for further per-order actions. Which items appear depends on the order and your store's setup; two useful ones are:
| Action | When to use |
| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Resend order to POS** | The order never reached your POS. Re-queues the injection so it is sent again — only shown on orders with no POS receipt at stores with a POS integration connected |
| **Email receipt** | Resend the order confirmation email to the customer. The **Resend order receipt** window lets you send it to a different email address if they gave you the wrong one |
Fix whatever stopped the order syncing (for example the POS terminal being off) before you use **Resend order to POS**, otherwise the retry fails the same way. See [POS Troubleshooting](/docs/guides/integrations/pos/advanced/troubleshooting) for the full flow.
### Filtering Orders
Click **Filters** to narrow down by:
* **Venues** (for multi-location accounts)
* **Fulfillment methods** — **In Store**, **Delivery**, or **Pickup**
* **Order status**
* **Table Area** and **Table** (for in-store orders)
* **Show failed orders only**
The fulfillment filters are fixed: **In Store**, **Delivery**, and **Pickup**. Enabling catering does not add a catering option to these filters. Catering orders show their fulfillment method in the **Type** column of **All Orders**, and scheduled catering orders are listed under **Orders** → **Calendar**.
### Operations Sidebar
Click **Operations** to access quick actions:
* Snooze menu items across venues
* View snoozed items
* Quick venue switching
### Full-Screen Mode
Click the expand button to enter full-screen mode - useful for dedicated order display screens in the kitchen.
### Pre-Orders and Future Orders
Live Orders only shows orders for **today**. Pre-orders scheduled for future dates do not appear here.
To view and accept pre-orders, switch to the **All Orders** view instead. You can filter by date to find upcoming scheduled orders.
## All Orders
The All Orders view shows your complete order history with powerful search and export features.
**Orders > All Orders**
### Features
* Search by order code, customer name, or email
* Filter by date range, venue and **Order status**
* Filter by fulfillment method using the **All orders** dropdown above the list — **All Orders**, **In Store**, **Delivery**, or **Pickup**
* Filter by discount (orders with or without a discount applied)
* Sort by any column
* Select multiple orders for bulk actions
* Export to CSV
### Bulk Actions
Select multiple orders to:
* Accept all pending orders at once
* Complete multiple orders at once
* Export selected orders
### Exporting Orders
Set the date range and filters you want in **All Orders** first, or tick specific orders — the export uses your current view. Then click **Export** and choose a format: **Expanded** gives each product in an order its own row, **Compact** summarises each order in a single row and omits the product columns. There is no field picker; storekit emails the CSV to the address you are signed in with.
Both formats include the **Order id** and **Order Code** columns — see [Order and payment identifiers](/docs/guides/reports/transactions-report#order-and-payment-identifiers) for which is which.
## POS Integration
With a POS integration, orders are sent directly to your point-of-sale system. The kitchen works from the POS rather than the storekit dashboard.
### How It Works
1. Customer places order on storekit
2. Order is automatically sent to your POS
3. Kitchen prepares order from POS tickets
4. Order status syncs back to storekit
### Supported POS Systems
* Lightspeed K-Series
* Zonal
* Tissl
* PointOne
* Deliverect (middleware for multiple POS systems)
* And more
### When to Use POS Integration
* Your kitchen already works from POS tickets
* You need unified reporting across all order sources
* You want order items to sync to your existing inventory
With POS integration, you typically don't need to manage orders in the storekit dashboard - the POS handles the kitchen workflow.
## Direct Printing
Direct printing automatically sends order tickets to your kitchen printer when orders are placed.
### How It Works
1. Customer places order
2. Ticket prints automatically (**Auto print**) or when you click **Print** on the order (**Manual print**)
3. Kitchen prepares from printed ticket
4. You update status in dashboard (or via POS)
### Print Modes
Each printer is set to one of two modes. The list is fixed:
| Mode | Behaviour |
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Auto print** | Prints as soon as the order is placed, whether it is **Pending** or already **Accepted**. Pre-orders print at the scheduled time minus the printer's **Buffer**. |
| **Manual print** | Prints only when you click **Print** on the order. |
There is no "print on accept" mode: accepting an order does not trigger a print. See [Auto vs Manual Printing](/docs/guides/printing/auto-vs-manual).
**Auto Accept off — how do you know an order has arrived?** The new-order sound plays on an open Live Orders page, the order appears as **Pending**, and an **Auto print** printer prints the ticket straight away. The order still needs **Accept** before the customer sees it as accepted — the printed ticket is not an acceptance.
### Split Printing
Route different categories to different printers:
* Food items → Kitchen printer
* Drinks → Bar printer
* Desserts → Pastry station
See [Direct Printing](/docs/guides/printing/printer-setup) for setup instructions.
## Choosing Your Workflow
### Dashboard Only
Best for: Small operations, new stores, or those without POS systems.
* Manage everything from Live Orders
* Print tickets manually or use auto-print
* Simple setup, no integrations needed
### POS Integration
Best for: Established kitchens with existing POS workflows.
* Orders flow directly to POS
* Kitchen works from familiar system
* Dashboard used for customer service only
### Dashboard + Printing
Best for: Operations wanting dashboard control with kitchen tickets.
* Accept orders in dashboard
* Tickets print for kitchen
* Full visibility and control
### Full Integration
Best for: Multi-location brands with complex operations.
* POS integration for kitchen
* Dashboard for customer service and reporting
* Printing as backup
* All channels synced
## Troubleshooting
**Orders not appearing?**
1. Check the connection status indicator in Live Orders — it should be green.
2. Refresh the page to re-establish the real-time connection.
3. Switch to **All Orders** to verify whether the order exists — it may be a pre-order scheduled for a future date.
**Audio alerts not working?**
The new-order sound plays once per new order while the Live Orders page is open. It does not repeat or keep ringing until you acknowledge the order, and there is no on/off switch or volume control for it in the dashboard — it plays whenever an order arrives on an open Live Orders page. Work through these in order:
1. Turn the device volume up. On an iPhone or iPad, also check the hardware silent switch — it silences browser sound even when the volume is up.
2. Make sure the browser tab itself is not muted (right-click the tab and look for **Unmute site**), and that the dashboard is allowed to play sound in the browser's per-site sound settings.
3. Click once anywhere on the Live Orders page after loading it. Browsers block sound until the page has been interacted with, so a screen nobody has touched since it loaded stays silent. A **Sound notification unavailable** message in the dashboard means the browser refused to play the sound — click the page, and the next order will play it.
4. Use **Google Chrome** (or Edge) on the device that watches orders. This is what fixes most reported "no sound" cases: other browsers — especially in-app or embedded browsers — apply stricter audio rules.
5. Keep the tab open and in the foreground. The sound only plays for orders that arrive while Live Orders is on screen: if the tab is closed, switched away from, or the device sleeps, no sound plays, and nothing replays when you come back to it. On a dedicated tablet, disable battery saver and auto-sleep.
6. Check what your store network allows. The sound is an audio file the dashboard downloads from storekit's CDN (`ucarecdn.com`) rather than something built into the page, so a locked-down store network, firewall, or content filter can block it. If it cannot be downloaded the dashboard shows **Sound cannot be loaded**, and falls back to a very short, quiet tone that is easy to miss in a busy kitchen. Allow `ucarecdn.com` on the network.
**Orders arrive but nobody notices?**
Do not rely on the browser sound alone on a shared tablet — it needs that tab to stay awake and in the foreground. Add a second route that does not depend on it:
* [Direct printing](/docs/guides/printing/printer-setup) — a ticket prints for every order.
* Order emails to your team — **Stores** → your store → **Settings** → **Operations** → **Order Notifications** → **Sent to you** → **Email & Browser**. See [Operations Settings](/docs/guides/store-settings/operations-settings#order-notifications).
* Customer-facing SMS and email are separate from staff alerts — see [Customer Order Notifications](/docs/guides/notifications/customer-communication).
# Order Statuses
Source: https://storekit.com/docs/guides/orders/order-statuses
Reference for every storekit order status from pending and accepted through to ready, completed, and refunded. Understand what each status means for your team.
Every storekit order moves through a series of statuses as it progresses from checkout to fulfilment. This page explains what each status means, what triggers it, and what action (if any) you need to take.
## Status Lifecycle
A typical order follows this path:
**Pending** → **Accepted** → **Preparing** → **Ready for Pickup** / **Out for Delivery** → **Completed**
Not every order passes through every status. The exact flow depends on your fulfillment method (pickup, delivery, or dine-in) and whether you use a POS integration.
## All Order Statuses
### Pending
| | |
| ------------------- | --------------------------------------------------------------------------------------- |
| **Definition** | The order has been placed and payment captured, but the venue has not yet confirmed it. |
| **Triggered by** | Customer completing checkout. |
| **Action required** | Accept or reject the order from Live Orders, your POS, or let auto-accept handle it. |
If you have **auto-accept** enabled, orders skip Pending and move straight to Accepted.
### Accepted
| | |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| **Definition** | The venue has confirmed the order and committed to fulfilling it. |
| **Triggered by** | A team member clicking **Accept** in the dashboard or POS, or auto-accept. |
| **Action required** | Begin preparing the order. If you use direct printing, the kitchen ticket prints at this point (unless set to auto-print on order placement). |
### Preparing
| | |
| ------------------- | ----------------------------------------------------------------------------------------- |
| **Definition** | The kitchen is actively working on the order. |
| **Triggered by** | A team member marking the order as **Preparing** in the dashboard or POS. |
| **Action required** | Continue preparation. Mark as **Ready for Pickup** or **Out for Delivery** when finished. |
### Ready for Pickup
| | |
| ------------------- | ------------------------------------------------------------------------------------------------------------ |
| **Definition** | The order is prepared and waiting for the customer to collect it. |
| **Triggered by** | A team member marking the order as **Ready for Pickup**. |
| **Action required** | The customer is notified automatically. Hand over the order when they arrive, then mark it as **Completed**. |
### Out for Delivery
| | |
| ------------------- | ------------------------------------------------------------------------------------------------------------- |
| **Definition** | The order has been handed to a delivery driver and is on its way to the customer. |
| **Triggered by** | A team member or delivery integration marking the order as dispatched. |
| **Action required** | None — the customer can track delivery progress. The order moves to **Delivered** once drop-off is confirmed. |
### Delivered
| | |
| ------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| **Definition** | The delivery driver has dropped off the order to the customer. This is the final successful state for delivery orders. |
| **Triggered by** | The delivery provider or a team member confirming drop-off. |
| **Action required** | None. The order is closed. |
### Completed
| | |
| ------------------- | ------------------------------------------------------------------------------------------------------------- |
| **Definition** | The order has been fulfilled and collected. This is the final successful state for pickup and dine-in orders. |
| **Triggered by** | A team member marking the order as **Complete**. |
| **Action required** | None. The order is closed. |
### Rejected
| | |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Definition** | The venue declined the order. The customer is notified, and stock the order held is added back for items you track inventory on. Rejecting does not refund the payment. |
| **Triggered by** | A team member clicking **Reject order** in the dashboard, or a rejection sent from your POS. |
| **Action required** | Refund the customer yourself if they paid. Consider contacting them if the rejection was due to a temporary issue (e.g. item out of stock) so they can reorder. |
Rejecting an order does not move any money. The order is closed and the customer is told it can't be fulfilled, but the payment they already made stays with you until someone issues a refund.
For a card order paid through storekit payments, the dashboard asks **Do you want to refund the payment also?** immediately after you reject. Click **Yes** to open the refund window and complete the refund; if you click **No**, or the order was paid another way (for example PayPal or a gift card), no prompt appears and nothing is refunded.
To refund a rejected order later, open it and click **Refund** in the **Payment** section — the button keeps working after rejection. See [Refunds & Payouts](/docs/guides/payments/refunds-payouts#refunding-a-rejected-order).
### Failed
| | |
| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Definition** | The order failed to inject into your POS system. |
| **Triggered by** | A connectivity or integration error preventing the order from reaching your POS — for example, an internet outage, POS downtime, or a mapping error. |
| **Action required** | Check your POS connection and retry. You may need to enter the order manually into your POS. See [POS Troubleshooting](/docs/guides/integrations/pos/advanced/troubleshooting) for detailed steps. |
**"Failed" does not mean the payment failed.** Payments are captured independently by the payment processor (Adyen) at checkout, before the order is sent to your POS. A "Failed" status only means the order could not be delivered to your POS system.
To verify the payment was received:
1. Open the order in your storekit dashboard and check the **Payments** section.
2. Alternatively, log in to your [Adyen dashboard](https://ca-live.adyen.com) and search for the transaction by order reference.
If the payment is confirmed, the customer has been charged — you just need to fulfil the order manually or retry the POS injection once connectivity is restored.
### Refunded
| | |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Definition** | The order has been fully refunded to the customer. |
| **Triggered by** | A team member issuing a refund from the dashboard. Refunds are always issued by hand — no status change refunds an order for you. |
| **Action required** | None. The refund is processed back to the customer's original payment method. Refund timelines depend on the customer's bank (usually 3–5 business days). |
### Archived
| | |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| **Definition** | The order has been moved to the archive. Archived orders are hidden from the default Live Orders view but remain accessible in All Orders. |
| **Triggered by** | A team member archiving the order, or automatic archiving after a configured period. |
| **Action required** | None. You can unarchive an order at any time from All Orders. See [Archiving Orders](/docs/guides/orders/archiving-orders) for details. |
## Quick Reference
| Status | Payment captured? | Needs action? | Visible in Live Orders? |
| -------------------- | :------------------: | :--------------------------: | :---------------------: |
| **Pending** | Yes | Accept or reject | Yes |
| **Accepted** | Yes | Prepare the order | Yes |
| **Preparing** | Yes | Continue preparation | Yes |
| **Ready for Pickup** | Yes | Hand to customer | Yes |
| **Out for Delivery** | Yes | None | Yes |
| **Delivered** | Yes | None | No (configurable) |
| **Completed** | Yes | None | No (configurable) |
| **Rejected** | Yes — refund by hand | Refund the customer | No |
| **Failed** | Yes | Retry POS or fulfil manually | Yes |
| **Refunded** | Refunded | None | No |
| **Archived** | Varies | None | No |
## Troubleshooting
Don't panic — your payments are safe. "Failed" means the order could not be sent to your POS due to the connectivity loss. Payments are captured by Adyen at checkout, independently of the POS injection.
**What to do:**
1. Restore your internet connection.
2. Go to **Live Orders** in your dashboard — failed orders are still visible.
3. Check each failed order's **Payments** section to confirm payment was received.
4. Once your POS is back online, retry the injection or enter the orders manually.
5. If the problem persists after connectivity is restored, see [POS Troubleshooting](/docs/guides/integrations/pos/advanced/troubleshooting).
The order may have been placed successfully but failed to reach your POS. Check **All Orders** in the dashboard (not just Live Orders) and search by the customer's name or email. If the order appears with a **Failed** status, the payment was captured — follow the steps above to fulfil it manually.
If you cannot find the order at all, check your [Adyen dashboard](https://ca-live.adyen.com) for the transaction. Contact [storekit support](/docs/getting-started/contact-support) if you need help reconciling.
Yes. Open the order in your dashboard and use the status buttons to move it forward (e.g. Accept → Preparing → Ready). You cannot move an order backwards to a previous status.
The customer is notified immediately that the order can't be fulfilled, and stock the order held is added back for items you track inventory on. The payment is not refunded automatically.
For card orders paid through storekit payments, the dashboard asks **Do you want to refund the payment also?** right after you reject — click **Yes** to open the refund window. Otherwise open the order and click **Refund** in the **Payment** section. To check whether a rejected order was already refunded, look at the **Payment** section: a red refund count next to the payment method means at least one refund exists, and expanding the section lists every refund.
Refunds are processed immediately on the storekit side. However, the funds usually take 3–5 business days to appear in the customer's account depending on their bank or card provider.
**Completed** means the order was fulfilled successfully. **Archived** means the order has been moved out of the default view to keep your order list tidy. An archived order can be in any final state (completed, rejected, refunded). You can view and unarchive orders from **All Orders** at any time.
## Related Pages
* [Managing Live Orders](/docs/guides/orders/managing-live-orders) — accepting, rejecting, and progressing orders
* [Archiving Orders](/docs/guides/orders/archiving-orders) — managing your order history
* [POS Troubleshooting](/docs/guides/integrations/pos/advanced/troubleshooting) — diagnosing failed POS injections
* [Checking Payments](/docs/guides/pay-at-table/checking-payments) — verifying payment status
* [Refunds & Payouts](/docs/guides/payments/refunds-payouts) — how refunds are processed
# Orders Overview
Source: https://storekit.com/docs/guides/orders/overview
Learn how orders flow through storekit from customer checkout to fulfilment. Covers order statuses, accept and reject actions, and managing live order queues.
Orders are the core of your storekit store. When a customer completes checkout, an order is created and flows through your system until fulfilled.
## Order Lifecycle
Every order moves through a series of statuses:
```
Pending → Accepted → Preparing → Ready/Out for Delivery → Complete
```
| Status | Description |
| -------------------- | --------------------------------------------------- |
| **Pending** | Order placed, waiting for confirmation |
| **Accepted** | You've confirmed the order |
| **Preparing** | Order is being prepared |
| **Ready for Pickup** | Order ready for customer collection (pickup orders) |
| **Out for Delivery** | Order handed to driver (delivery orders) |
| **Complete** | Order fulfilled and closed |
| **Rejected** | Order declined by the store |
| **Cancelled** | Order cancelled |
## What's in an Order
Each order contains:
* **Customer details** - Name, email, phone (based on your [checkout settings](/docs/getting-started/launch/create-your-store#checkout-settings))
* **Fulfillment method** - Pickup, Delivery, Dine-in, or Catering
* **Items** - Products with modifiers and special instructions
* **Timing** - ASAP or scheduled date/time
* **Payment** - Amount, method, and status
* **Delivery address** - For delivery orders
* **Table** - For dine-in orders
## Order Types by Fulfillment
Orders behave differently based on fulfillment method:
| Fulfillment | Key Differences |
| ------------ | ------------------------------------------------------------------------- |
| **Pickup** | Customer collects from your location. Shows collection code. |
| **Delivery** | Includes delivery address and fee. May integrate with delivery providers. |
| **Dine-in** | Linked to a table. Can be added to an open bill for pay-at-table. |
| **Catering** | Larger orders, typically pre-orders with longer lead times. |
## Receiving Orders
Orders appear in your dashboard immediately when placed. You can also receive notifications via:
* **Dashboard** - Live order feed, with an audio alert for each new order that arrives while the Live Orders page is open in the browser (see [audio alerts not working](/docs/guides/orders/managing-live-orders#troubleshooting))
* **Kitchen Display** - Full-screen ticket board for the kitchen, ordered by due time (see [Kitchen Display](/docs/guides/orders/kitchen-display))
* **Email** - Order notification to your configured email
* **Printing** - Auto-print tickets to connected printers
* **POS** - Orders sent directly to your point-of-sale system
## Managing Orders
Handle incoming orders in real-time
Run a ticket board in the kitchen
Keep your dashboard organised
Temporarily pause your store
## Order Codes
Each order has a random **order code** (e.g., "A1B2") displayed to customers. Use this to:
* Identify orders at pickup
* Verify delivery handoffs
* Reference orders in customer communication
See [Order Codes](/docs/guides/orders/advanced/order-sequence-policy) to configure code format, reset policy, and prefixes.
## Related
* [Direct Printing](/docs/guides/printing/printer-setup) - Auto-print order tickets
* [Fulfillment Settings](/docs/getting-started/launch/configure-fulfillment) - Configure how orders are fulfilled
# VAT Invoices & Receipts
Source: https://storekit.com/docs/guides/orders/vat-invoices
Download a VAT invoice for an individual storekit order from the dashboard, including what the PDF contains and the tax-rate prerequisites.
When a customer asks for a VAT receipt (also called a VAT invoice) for a specific order, you can generate and download one yourself from the order's detail page. The invoice is a PDF built from that single order.
This page is about receipts for **customer orders**. If you are looking for your own monthly storekit **software / subscription invoice**, that is a different document and cannot be downloaded from the dashboard — see [Software & Subscription Invoices](/docs/guides/account/software-invoices).
## Download an Invoice
Go to **Orders** and open the order you need an invoice for — for example by searching for the order code under **All Orders**.
On the order detail page, select **More actions** (top right) to open the dropdown menu.
Choose **Invoice**. The PDF downloads to your device as `Order_#_invoice.pdf`, where `` is the order's code.
The invoice is downloaded to your device only. storekit does not automatically email it to the customer — once you have the PDF, send it to them yourself (for example, as a reply in the same email or chat thread).
## What the Invoice Contains
The PDF is generated from the order and includes:
* Your **store name** and logo
* A **receipt reference** (the order's ID) and the order **date**
* **Customer details** captured on the order — name, email, and phone, plus the company name, PO number, and customer VAT number when those were provided
* Your store's address and its **VAT / Tax number**
* A **line-by-line breakdown** of the items ordered, including any discount, tip, service charge, and delivery fee
* A **VAT** total line and the **order total**
On delivery orders the VAT line is calculated from each item's delivery tax rate rather than its standard rate, and for UK stores it also includes VAT on the delivery fee. If a delivery invoice shows less VAT than you expect, the delivery tax rates on those products are likely missing.
## Prerequisites
For the Invoice action to work — and for the receipt to show correct VAT — the following must be in place before you download.
### Every item must have a tax rate
An invoice can only be generated once **every item on the order has a tax rate set**. If any item is missing a tax rate, selecting **Invoice** shows this message and no PDF is produced:
> This order can't be invoiced yet. Please add tax rates to the products in this order — invoices will be available once every item has a tax rate set.
Tax rates are recorded on the order at the moment it is placed, so this affects orders that were taken before the products had tax rates configured — setting a rate now applies to future orders only and does not make an existing order invoiceable.
Where item tax rates come from depends on how your menu is managed:
* **POS-managed menus** — tax rates are imported from your POS during a menu sync (Lightspeed K-Series, Deliverect, PointOne, Toast, Tissl and others send them). If they are missing, correct the tax rates in your POS and re-sync the menu.
* **Menus managed in storekit** — the per-product tax rate field is not available in the standard product editor, so [contact support](/docs/getting-started/contact-support) and the team can set the tax rates on your products for you.
Either way, if you need an invoice for an order that has already been placed without tax rates, [contact support](/docs/getting-started/contact-support).
### Your store's VAT / Tax number must be set
The VAT / Tax number printed on the invoice comes from your store settings. If it is blank, the invoice will still generate but that field will be empty, so set it before issuing VAT receipts.
To set it, go to **Stores → \[your store] → Settings → General** and, under the **Legal** section, fill in the **VAT / Tax ID** field (e.g. `GB123456789`). This value is shown on customer receipts and invoices as your tax identifier.
## Collecting Customer VAT Details
If your customers are businesses that need their own VAT number and company name on the invoice, turn those checkout fields on at **Stores → \[your store] → Settings → Operations**, in the **Checkout fields** section. Enable **VAT Number** (and **Company name**) for the fulfillment methods you want, then save.
Once collected, they appear on the invoice as **Customer VAT Number** and alongside the customer's details.
## Related
* [Software & Subscription Invoices](/docs/guides/account/software-invoices) — your own monthly storekit software invoice
* [Managing Live Orders](/docs/guides/orders/managing-live-orders) — handle incoming orders in real-time
* [Orders Overview](/docs/guides/orders/overview) — how orders flow through storekit
* [Contact Support](/docs/getting-started/contact-support) — reach the team for help with tax rates
# Check Pay at Table payment status from POS or dashboard
Source: https://storekit.com/docs/guides/pay-at-table/checking-payments
Verify storekit Pay at Table payment status from your POS or dashboard. Handle partial payments, split bills, and confirm full settlement before close.
When guests pay via Pay at Table, you have multiple ways to confirm payment status. This guide covers how to check if a payment is complete, partial, or pending.
## From Your POS
The primary way to check payment status is through your point of sale system:
* **Real-time sync** - When a guest pays via QR code, the payment appears on your POS immediately
* **Bill closes automatically** - Once fully paid, the table's check closes
* **Partial payments shown** - If guests split the bill, you'll see each payment as it comes in
Check your POS screen to see:
* Remaining balance on the table
* Individual payments made
* Whether the bill is fully settled
## From the storekit Dashboard
For a complete view of all Pay at Table bills and their payments:
1. Click **Tables** in the left-hand menu
2. Pick the store from the store selector at the top right
3. Click **View payments** on a bill to see its payment status
The dashboard shows:
| Status | Meaning |
| ----------- | ----------------------------------- |
| **Paid** | Bill fully settled |
| **Partial** | Some items paid, balance remaining |
| **Pending** | Payment initiated but not completed |
| **Failed** | Payment attempt unsuccessful |
### Where to Find Pay at Table Payments
QR / Pay at Table payments don't always appear in the same place as regular online orders, so it helps to know where to look:
* **Tables** - Open **Tables**, select the table (or bill), and click **View payments** to see the individual payments made against that bill, including splits and tips. Bills that have already been settled are under **closed bills** - see [Finding a Past Bill](#finding-a-past-bill).
* **Orders** - Pay at Table bills are not orders. They do not appear in **Orders** → **All Orders**, and the fulfillment filter there has exactly four fixed options - **All Orders**, **In Store**, **Delivery** and **Pickup** - with no Pay at Table option.
The **Analytics → Accounting → All Transactions** report only appears when **storekit Payments** is enabled on your account. If you don't see an **Accounting** section in your dashboard, your store isn't using storekit Payments, and you should locate Pay at Table payments under **Tables** instead. See [storekit Payments Setup](/docs/guides/payments/storekit-payments-setup) to enable it.
## Finding a Past Bill
A guest asks about a bill from earlier in the week, or you need to confirm that a table paid before you cash up. Every settled Pay at Table bill is kept under **Tables**, and you can filter the list by store, date and table.
Click **Tables** in the left-hand menu. If you have more than one store, pick the store from the selector at the top right - the list only ever shows one store at a time. The page opens on **Open bills**; click **closed bills** next to it to switch to settled bills.
The date picker appears beside **closed bills** and the list only shows bills closed within it. Pick a preset (**Today**, **Yesterday**, **This month**, **Last month**, **This year**, **Last year** or **All time**) or choose your own start and end dates and times.
Type the table number into the **search by table** box at the top of the page. The search matches the table name exactly, so enter `12`, not `table 12`. Tick **storekit payments only** to show only bills with a storekit payment against them.
Each row shows **Table #**, **Opened**, **Closed**, **Waiter**, **Items**, **Left to pay** and **Total**. Match the amount and the **Closed** time, then click **View payments** to see every payment, split and tip on that bill.
If the bill is not where you expect it, widen the date range before assuming it is missing. The list filters on the time the bill was **closed**, and a bill opened late one evening can close after midnight; a guest's "last Friday" is often a Thursday. **Last month** or **All time** with the table search is the quickest way to find a bill when you are unsure of the day.
A past bill will not turn up anywhere else in the dashboard:
* **Orders** → **All Orders** lists online orders only. Pay at Table bills are settled against your POS check, not placed as storekit orders, so the archived and rejected toggles there will not surface them.
* **Analytics** → **Accounting** → **All Transactions** lists card transactions, not bills, and only exists on accounts using storekit Payments. It is useful for matching a card's last four digits to a payment, but to see the bill itself use **Tables** → **closed bills** → **View payments**.
## Payment Notifications
Set up notifications to alert staff when payments are made:
1. Go to **Settings** → **Notifications**
2. Enable **Pay at Table alerts**
3. Choose notification method (dashboard, email, or both)
You'll receive alerts for:
* Full payment completed
* Partial payment received
* Payment failed
## Understanding Payment States
### Fully Paid
The entire bill has been settled. The table is ready to be cleared and reset.
### Partially Paid
Some guests have paid their portion, but a balance remains. This commonly happens when:
* Guests are splitting the bill
* Someone is paying for specific items only
* A group is paying in rounds
Check the remaining balance on your POS before allowing guests to leave.
### Payment Pending
A payment has been initiated but not yet confirmed. This can occur when:
* The guest's bank requires additional verification
* Network delays are causing slow processing
* The payment is being processed
Wait a few moments - most pending payments resolve within seconds.
### Payment Failed
The payment attempt was unsuccessful. Common reasons:
* Insufficient funds
* Card declined
* Network error
The guest will see an error on their phone and can retry with a different payment method.
## Understanding Bank Statement Entries
Occasionally a guest reports that their bank statement shows **two entries** for a single Pay at Table payment, even though storekit shows only **one** successful transaction. This is normal card-processing behaviour, not a double charge.
Card payments are typically processed in two stages:
| Entry | What it is | What happens |
| --------------------------- | --------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
| **Pending / authorisation** | A temporary hold placed on the guest's card when they pay, confirming the funds are available | Shows as *pending* on the statement; no money has actually moved yet |
| **Capture / settlement** | The actual charge that collects the funds | Shows as a completed transaction; this is the payment storekit records |
The guest's bank may display both the initial authorisation and the final capture side by side for a short time. The pending authorisation is **not** an extra charge and **drops off automatically after a few days** once it expires or is reconciled against the capture. Only one payment is ever collected, which is why storekit shows a single successful transaction.
If storekit shows **one** successful payment for the bill (check **Tables** → **View payments**), the guest has been charged once. A second pending line on their bank statement is the authorisation and will disappear on its own — usually within a few days, depending on the guest's bank.
If the guest is worried, reassure them that the pending entry is a temporary hold, not a charge, and ask them to check again after a few days. For anything that still looks like a genuine duplicate charge after the pending entry clears, see [Refunds & Payouts](/docs/guides/payments/refunds-payouts) or [contact support](/docs/getting-started/contact-support).
## Declined on the Bank Statement but Paid in storekit
This is a **different case** to the pending authorisation above. Here the guest's bank record shows the payment as **declined**, yet the bill is paid and the order was accepted and fulfilled. Typically the guest sees two lines for the same visit: a declined attempt, and a successful charge for the same amount.
### Why It Happens
A card payment can be refused by the guest's card issuer on the first attempt (insufficient funds at that moment, a fraud or velocity check, a 3-D Secure or CVC problem) and then succeed on a later attempt with the same card. The declined attempt still shows on the guest's statement or banking-app notifications even though it collected no money — only the successful attempt does.
The successful second attempt comes from one of two places:
* **The payment provider retried it.** storekit's card payments are processed by Adyen, and a retry performed on the provider's side is not visible to storekit as a separate payment — storekit records only the result it is given.
* **The guest paid again.** They retried on their phone, on the same card or a different one, and that attempt succeeded.
storekit does not re-submit a declined card itself, and there is **no retry setting in the dashboard**. Each payment attempt is sent once, with an idempotency key that stops the same attempt from being charged twice, and a refusal from the card issuer is recorded as a failed payment — never as a paid one. So a paid bill in storekit is always backed by a payment that the card network actually approved.
### Which Record Is Authoritative
storekit is the record of what was actually collected for the bill. A declined line on a bank statement is a record of an *attempt*, not of money moving. If storekit shows the bill paid, take it as paid — and confirm it hop by hop:
Go to **Tables**, select the table (or bill), and click **View payments**. Each payment is listed with **Time**, **Payment**, **Paid**, **POS Status** and **Total**.
The **Paid** column shows **Paid**, **Pending** or **Failed** for each attempt. A **Paid** badge is a payment the card issuer approved. Hover a **Failed** badge to see the reason the issuer gave for that attempt.
If your account uses storekit Payments (see the note above — without it there is no **Accounting** section), click **Analytics**, select **Accounting**, then click **All Transactions**. Set the date range to the day of the visit. The **Status** filter has exactly two options, **Success** and **Failed**, and the failure reason is shown next to a failed status. The **Details** column shows the card's last four digits, and **Reference** links back to the bill, so you can match the guest's card and amount to the attempts recorded.
Seeing a **Failed** attempt and a **Success** attempt of the same amount, minutes apart, is the expected picture for this case: the first attempt was refused, the second was approved, and only the approved one was collected. If the retry happened on the provider's side, storekit will show the successful payment only — the declined attempt exists on the guest's statement but was never a storekit payment.
### What to Tell the Guest
* The declined entry is a **failed attempt**, not a charge — no money left their account for it.
* Some banks show refused attempts on the statement or send a push notification for them; these usually disappear from the statement, and any short-lived hold releases on its own.
* They have been charged **once** for the bill. Give them the amount and time of the successful payment from **View payments** so they can match it on their statement.
It is worth contacting support when the records genuinely do not line up — for example a declined entry with **no** matching successful payment anywhere in storekit while the guest's balance has still gone down, two **Success** transactions for the same bill in **All Transactions**, or a guest whose statement total for the visit is more than the bill. Have the **ID** and **Reference** values from **All Transactions** ready and [contact support](/docs/getting-started/contact-support). If the bill is paid in storekit and the guest was charged once, there is nothing to reconcile.
## What To Do If Payment Doesn't Appear
If a guest claims to have paid but you don't see it:
1. **Check your POS** - There may be a short delay in syncing
2. **Ask to see confirmation** - Guests receive a confirmation screen after payment
3. **Check the dashboard** - View the transaction in your storekit dashboard
4. **Verify the table** - Ensure they scanned the correct table's QR code
Never let a guest leave without confirming payment. If in doubt, check the dashboard or ask to see their payment confirmation screen.
## Bill Payment Sync Failures
When a guest pays successfully via Pay at Table but the payment fails to sync to your POS, you'll receive an email notification. This ensures you never miss a payment that needs manual reconciliation.
### What the Email Contains
The bill payment failure notification includes:
* **Bill details** - Bill ID and venue name
* **Payment information** - Payment ID and transaction details
* **Error reason** - Specific technical details about why the sync failed
* **Reference IDs** - Both storekit and POS bill IDs for reconciliation
* **Quick actions** - Direct link to view the bill in your dashboard
The customer has already paid successfully. The failure is only with syncing the payment to your POS. You may need to manually reconcile this payment in your POS system.
### What to Do When You Receive This Email
1. **Check the error details** - The email includes specific information about why the sync failed
2. **View the bill in dashboard** - Click the link in the email to see full payment details
3. **Manually reconcile in POS** - If needed, manually mark the bill as paid in your POS
4. **Contact support** - Our support team is automatically notified and can help resolve recurring issues
### Common Sync Failure Reasons
| Reason | What It Means | Action |
| ---------------------------- | ---------------------------- | ---------------------------------------- |
| **Connection timeout** | Unable to reach POS API | Check POS system is online and connected |
| **Authentication error** | POS credentials invalid | Verify integration settings |
| **Bill not found** | Bill doesn't exist in POS | Check bill was created correctly |
| **Payment already recorded** | POS already has this payment | No action needed, verify in POS |
Support is automatically notified of all bill payment sync failures and can help resolve persistent issues.
## Handling Disputes
If a payment dispute arises:
1. Check the transaction in your storekit dashboard
2. Note the transaction ID and timestamp
3. [Contact support](/docs/getting-started/contact-support) with the details
All Pay at Table transactions have a full audit trail for reference.
## Tips for Staff
* **Check POS regularly** - Especially during busy periods
* **Confirm before clearing** - Always verify payment before resetting a table
* **Know the delay** - Payments typically appear within 2-3 seconds
* **Train on partial payments** - Ensure staff understand split bill scenarios
# Pay at Table Overview
Source: https://storekit.com/docs/guides/pay-at-table/overview
Pay at Table lets dine-in guests view the bill and pay from their phone. Faster table turns, no card machines, and no waiting on staff to bring the bill.
Pay at Table transforms the end of a dining experience. Guests scan a QR code at their table to view their bill and pay instantly from their phone - no waiting for staff, no card machines, no friction.
## How It Works
1. **Guest scans QR code** - Each table has a unique QR code linked to that table's bill
2. **Bill appears on phone** - The guest sees their itemized bill in real-time
3. **Guest pays** - They pay using Apple Pay, Google Pay, or card
4. **Bill closes automatically** - Payment syncs to your POS and the table is marked as paid
The entire process takes under 30 seconds.
## Benefits
### For Guests
* **No waiting** - Pay whenever ready, no flagging down staff
* **Split bills easily** - Pay for specific items or split evenly
* **Digital receipts** - Receive receipts via email, no paper needed
* **Tip how they want** - Choose tip amount without pressure
### For Your Venue
* **Faster table turns** - Guests leave when ready, not when you can process payment
* **Reduced labor** - Staff focus on service, not payment processing
* **Higher tips** - Digital tipping typically increases gratuity
* **Fewer walkouts** - Payment is completed before guests leave
* **No card machine queues** - Peak times run smoother
### For Staff
* **More time for service** - Less time running card machines
* **Instant payment confirmation** - Know immediately when a table has paid
* **No payment disputes** - Digital trail for every transaction
## Key Features
| Feature | Description |
| ---------------------------- | ---------------------------------------------- |
| **Real-time bill sync** | Bill updates as items are added in POS |
| **Split payments** | Guests can pay for their items or split evenly |
| **Tipping** | Customizable tip suggestions |
| **Digital receipts** | Email receipts, reducing paper waste |
| **Multiple payment methods** | Cards, Apple Pay, Google Pay |
| **POS integration** | Payments sync directly to your point of sale |
## Requirements
To use Pay at Table, you need:
* storekit Pay at Table subscription
* Compatible POS integration (see [POS Systems](/docs/guides/integrations/overview))
* QR codes for each table
* Internet connection
## Getting Started
Set up the integration between storekit and your point of sale system
Create your table layout in the dashboard
Generate and print unique QR codes for each table
Brief your team on how to handle Pay at Table payments
Enable Pay at Table and start accepting payments
## Digital Receipts
With Pay at Table, guests receive digital receipts instead of printed ones:
* **Instant delivery** - Emailed immediately after payment
* **Eco-friendly** - Reduces paper waste
* **Always accessible** - Guests can retrieve receipts anytime
* **Expense-ready** - Easy to forward for business expenses
If a guest requires a printed receipt, staff can print one from the POS on request.
## Related Guides
How to verify payment status, and find a past bill under **Tables** → **closed bills**
Setting up your table layout
# Alipay
Source: https://storekit.com/docs/guides/payments/alipay
Accept payments from Chinese customers and tourists with Alipay in your storekit store. Tap into a billion-user wallet and reduce friction for visiting guests.
Alipay is China's leading digital payment platform with over 1 billion users. Enabling Alipay helps you serve Chinese tourists and customers who prefer to pay with their Alipay wallet.
## How It Works
When a customer selects Alipay at checkout:
1. Customer chooses Alipay as their payment method
2. They're redirected to Alipay to log in and confirm payment
3. Payment is authorised instantly
4. Customer returns to your store with order confirmed
Customers can pay using their Alipay app or by scanning a QR code.
## Benefits for Your Business
| Benefit | Description |
| --------------------------- | ------------------------------------------------------------ |
| **Reach Chinese customers** | Tap into the world's largest consumer market |
| **Instant payment** | Funds are confirmed immediately at checkout |
| **Mobile-first** | Optimised for mobile payments via the Alipay app |
| **Trusted by customers** | Alipay is the preferred payment method for Chinese consumers |
## Availability
Alipay is available for customers with Chinese Alipay accounts. Payments can be made in:
| Currency | Description |
| ----------------- | ----------------------------------------------------- |
| **CNY** | Chinese Yuan (converted from your local currency) |
| **GBP, EUR, USD** | Customers pay in CNY, you receive your local currency |
Currency conversion is handled automatically. You receive funds in your local currency while customers pay in CNY.
## Enabling Alipay
Alipay requires manual activation by our team. To enable Alipay:
1. [Contact support](/docs/getting-started/contact-support)
2. Request Alipay activation for your store
3. Our team will enable Alipay on your account
4. Alipay will appear as a payment option at checkout
Alipay is particularly useful for businesses in tourist areas or those serving Chinese customers. If you're unsure whether Alipay is right for your business, our team can advise.
## Customer Experience
Alipay provides a seamless mobile payment experience:
* **Mobile users** - Redirected to the Alipay app to confirm payment
* **Desktop users** - Shown a QR code to scan with their Alipay app
Payment confirmation is instant, and customers are returned to your store immediately after authorising the payment.
## Refunds
Refunds to Alipay work the same as other payment methods. When you issue a refund, funds are returned to the customer's Alipay wallet.
## Learn More
Visit [Alipay Global](https://global.alipay.com/) to learn more about accepting Alipay payments.
# American Express
Source: https://storekit.com/docs/guides/payments/amex
American Express is enabled by default on storekit stores alongside Visa and Mastercard. Learn about availability, processing fees, and disabling Amex.
American Express (Amex) is accepted by default on all storekit stores, allowing customers to pay with their Amex cards alongside Visa and Mastercard.
## Availability
American Express is enabled by default for all stores and works in all regions where storekit Payments is available.
## Disabling American Express
Some merchants prefer not to accept Amex due to higher processing fees. To disable Amex for your store, [contact support](/docs/getting-started/contact-support).
Amex can be disabled on a per-store basis. If you have multiple stores, let support know which stores you'd like to disable it for.
## Why Disable Amex?
| Reason | Consideration |
| ----------------- | ---------------------------------------------------------------------- |
| **Higher fees** | Amex typically charges higher processing fees than Visa/Mastercard |
| **Customer base** | If few of your customers use Amex, the higher fees may not be worth it |
## Why Keep Amex Enabled?
| Reason | Consideration |
| ----------------------- | ------------------------------------------------------- |
| **Customer preference** | Some customers exclusively use Amex for rewards |
| **Higher spending** | Amex cardholders often have higher average order values |
| **Business customers** | Many corporate cards are Amex |
If you're unsure, we recommend keeping Amex enabled. The convenience for customers often outweighs the slightly higher processing fees.
# Bancontact
Source: https://storekit.com/docs/guides/payments/bancontact
Accept Bancontact payments in storekit, the most popular payment method in Belgium used by over 80% of consumers. Supports both card and Bancontact mobile app.
Bancontact is Belgium's national payment scheme, used by over 80% of Belgian consumers. storekit supports both Bancontact card payments and the Bancontact mobile app flow.
## Payment Methods
### Bancontact Card
Customers can pay using their Bancontact co-branded debit card. These cards display both the Bancontact logo and a Maestro or Visa logo, and are issued by all Belgian banks.
* Customer enters their card details at checkout
* Payment is processed directly from their bank account
* Instant confirmation
### Bancontact Mobile (Payconiq)
Customers can also pay using the Bancontact app on their phone:
1. Customer selects Bancontact at checkout
2. They scan a QR code or receive a push notification
3. They confirm the payment in the Bancontact app using their PIN or biometrics
4. Payment is confirmed in real-time
The mobile flow is increasingly popular in Belgium, especially for younger customers. It's fast, secure, and doesn't require entering any card details.
## Why Bancontact Matters in Belgium
| Stat | Detail |
| --------------------- | ------------------------------------------------------ |
| **80%+ adoption** | The dominant payment method for Belgian consumers |
| **17+ million cards** | More Bancontact cards than people in Belgium |
| **Trusted** | Backed by all major Belgian banks |
| **Low cost** | Lower transaction fees than international card schemes |
If you're operating in Belgium, Bancontact is essential. Belgian customers expect to see it as a payment option and often prefer it over Visa or Mastercard.
## Availability
| Region | Currency |
| ------- | -------- |
| Belgium | EUR |
## Enabling Bancontact
**Bancontact is automatically enabled for all Belgian stores.** There's nothing you need to do - it will appear as a payment option for customers in Belgium once your store is set up.
If Bancontact isn't appearing at checkout for your Belgian store, [contact support](/docs/getting-started/contact-support) to verify your store's region settings.
## Customer Experience
Bancontact provides a seamless payment experience for Belgian customers:
* **Familiar** - The payment method they use every day
* **Fast** - Card or mobile payments complete in seconds
* **Secure** - Strong authentication via PIN or biometrics
* **No extra accounts** - Works with their existing bank account
## Learn More
Visit [Bancontact](https://www.bancontact.com/en) to learn more about Belgium's national payment scheme.
# Cash and pay-on-collection orders
Source: https://storekit.com/docs/guides/payments/cash-payments
How cash and pay-on-collection orders work in storekit: what customers see, how orders reach your POS, Send Cash as Paid, and reconciling cash.
Cash — often described to customers as paying on collection — means the customer places the order online but hands over the money to your staff at collection, delivery or at the table.
storekit never takes or holds that money. The order is recorded with the payment type **Cash**, no card is charged, and no payout is generated for it. Collecting the cash, and checking that it was collected, is entirely down to your team.
## What the customer sees
At checkout, a store with cash enabled shows a **Pay cash** option alongside the card payment form. Selecting it and clicking **Place order** sends the order straight through — the customer is not asked for card details, and the order is confirmed as soon as your store accepts it.
## Turning cash on or off
**storekit+ required** — cash is available on storekit+ and higher subscription plans, and only support can switch it on. There is no subscription or plan page in the dashboard, so you cannot check your plan yourself: [contact support](/docs/getting-started/contact-support) or your account manager to confirm whether your store is on **storekit+** or **storekit++** and to upgrade. Published plans are listed on the [storekit pricing page](https://www.storekit.com/pricing).
Cash is stored per fulfillment method — pickup, delivery and in-store are separate settings on your store. A store whose storekit Payments application is still pending verification can only take cash until payments go live, whatever plan it is on; see [set up payments](/docs/getting-started/launch/set-up-payments).
There is no cash setting anywhere in the dashboard. **Stores** → your store → **Settings** → **Payments** does not contain a cash toggle, and neither does any other settings page. To turn cash on or off for a fulfillment method, [contact support](/docs/getting-started/contact-support) and say which method (pickup, delivery or in-store) you want changed.
## Sending cash orders to your POS
By default a cash order is sent to your POS with **no payment attached**, so the check stays open and your staff settle it on the POS when the customer pays.
Some POS integrations have a setting that changes this — the order is sent with a payment already applied, so it lands on the POS marked as paid.
| POS | Setting | Where |
| ----------------------- | ------------------------------ | ----------------------------------------------------------------------------------- |
| **Toast POS** | **Send Cash as Paid** | **Stores** → your store → **Settings** → **Integrations** → **Toast POS** |
| **Deliverect** | **Send Cash as Paid** | **Stores** → your store → **Settings** → **Integrations** → **Deliverect** |
| **Lightspeed K-Series** | **Send cash payments as paid** | **Stores** → your store → **Settings** → **Integrations** → **Lightspeed K-Series** |
For Toast, the helper text under the toggle reads "When enabled, cash orders will be sent to Toast as paid." The order is sent with a payment for the full order total, using the alternate payment type configured for the integration.
With **Send Cash as Paid** switched on, the customer still has to pay you in cash — but nothing on the POS will say so. The check shows the balance settled and a ticket or receipt printed from the POS can show an amount due of zero, which reads as "already paid" to whoever hands the order over.
Only use it if your accounting expects cash orders to arrive pre-settled on the POS. If you want your staff to see an open balance and take payment at handover, switch the toggle **off** and save. Existing orders are not changed — the setting only affects orders sent to the POS after the change.
If your POS is not in the table above, or you cannot see the toggle for the one that is, the behaviour is fixed for your store and can only be changed by [support](/docs/getting-started/contact-support). Toast's add-to-bill batching, which appends an unpaid cash in-store order to an existing table check instead of opening a new one, also has no dashboard toggle and is support-managed.
## Troubleshooting
### The ticket says the customer already paid, but they chose cash
This is almost always **Send Cash as Paid** for your POS integration. The order really is a cash order in storekit — storekit collected nothing — but it was pushed to the POS with a payment attached, so the POS reports it as settled and shows nothing due.
To confirm and fix:
1. Open the order from **Orders** → **All Orders**. Click the total to open the payment popover: a cash order lists **Payment type:** as Cash. It also has no card icon next to the total in the orders list, and does not get the green **Paid** badge next to the **Total** that online-paid orders get.
2. If the order is cash but the POS says paid, turn off the cash-as-paid setting for your POS (see the table above) so future orders arrive with an open balance.
3. Keep taking the cash at handover in the meantime — the POS being marked as paid does not mean storekit has the money.
### How do I stop taking online card payments?
You cannot switch card payments off yourself once storekit Payments is live. **Stores** → your store → **Settings** → **Payments** only connects and manages the payment account (**Activate Payments**, **Manage account**) — there is no card, Apple Pay or Google Pay switch there or on any other settings page, and enabling cash adds the **Pay cash** option alongside card rather than replacing it.
What does work:
* Stop taking orders indefinitely — **Stores** → your store → **Settings** → **General** → **Store availability**. The toggle itself has no label; it sits next to "Store is enabled", and switching it off changes that line to "Store is closed" and **Orders are blocked regardless of opening hours**. The store stays closed until you switch it back on.
* Stop taking orders for a set period — [snooze the store](/docs/guides/menu/availability-snoozing#store-snoozing) instead, which blocks orders for the duration you choose and re-enables ordering automatically when the snooze ends.
* If what you actually want is cash-only ordering for a fulfillment method, [contact support](/docs/getting-started/contact-support) and say so — how payment is collected per fulfillment method is support-managed.
### How will we know if a customer does not pay?
storekit cannot detect an unpaid cash order, because it never expects a payment for one. Only your staff know whether the money changed hands, so reconcile from your own records:
* **Per order** — the payment popover on each order shows the payment type, and hovering the total of a cash order in the orders list reads "Order not paid online, or no balance due."
* **Per day** — **Analytics** → **Reports** → **Z-Report** has a **Cash Payments** column alongside **Card Payments**. That figure is what your till should contain for the period, before any cash refunds.
* If a customer leaves without paying, you can still collect the money with a [payment link](/docs/guides/payments/payment-links). Stores with both payment links and catering enabled get a shortcut on the order itself — a **No online payment collected** panel with a **Send Payment Link** button. Every other store creates the link the normal way from **Payments** → **Payment Links**.
## Related
* [Payment methods](/docs/guides/payments/payment-methods)
* [Payment links](/docs/guides/payments/payment-links)
* [Refunds and payouts](/docs/guides/payments/refunds-payouts)
# iDEAL
Source: https://storekit.com/docs/guides/payments/ideal
Accept iDEAL payments in your storekit store, the leading online payment method in the Netherlands used for over 60% of all Dutch e-commerce transactions.
iDEAL is the leading online payment method in the Netherlands, used for over 60% of all Dutch e-commerce transactions. It allows customers to pay directly through their bank, making it fast, secure, and familiar.
## How It Works
When a customer selects iDEAL at checkout:
1. Customer chooses iDEAL as their payment method
2. They select their bank from the list
3. They're redirected to their bank's secure login
4. Customer confirms the payment in their banking environment
5. Payment is confirmed in real-time and order is placed
The entire process takes just a few seconds and uses the customer's trusted banking app or website.
## Why iDEAL Matters in the Netherlands
| Stat | Detail |
| --------------------- | ------------------------------------------------ |
| **60%+ market share** | The dominant payment method for Dutch e-commerce |
| **All major banks** | Supported by every Dutch bank |
| **Trusted** | Customers pay in their own banking environment |
| **Instant** | Real-time payment confirmation |
If you're operating in the Netherlands, iDEAL is essential. Dutch customers expect to see it as a payment option and many prefer it over card payments.
## Availability
| Region | Currency |
| ----------- | -------- |
| Netherlands | EUR |
## Enabling iDEAL
**iDEAL is automatically enabled for all Dutch stores.** There's nothing you need to do - it will appear as a payment option for customers in the Netherlands once your store is set up.
If iDEAL isn't appearing at checkout for your Dutch store, [contact support](/docs/getting-started/contact-support) to verify your store's region settings.
## Customer Experience
iDEAL provides a seamless payment experience for Dutch customers:
* **No card details required** - Customers pay directly from their bank account
* **Familiar interface** - They use their own bank's trusted environment
* **Instant confirmation** - Payments are confirmed in real-time
* **Mobile friendly** - Works with banking apps on any device
## Supported Banks
iDEAL is supported by all major Dutch banks, including:
* ABN AMRO
* ASN Bank
* bunq
* ING
* Knab
* Rabobank
* RegioBank
* SNS
* Triodos Bank
* Van Lanschot
## Learn More
Visit [iDEAL](https://www.ideal.nl/en) to learn more about the Netherlands' favourite payment method.
# Klarna
Source: https://storekit.com/docs/guides/payments/klarna
Enable Klarna buy now, pay later in storekit including Pay in 3 instalments and Pay in 30 days. Drive larger basket sizes and improve checkout conversion rates.
Klarna allows your customers to buy now and pay later, spreading the cost over instalments. This can help drive larger purchases and improve conversion rates.
## How It Works
When Klarna is enabled, customers see it as a payment option at checkout. They can choose to:
* **Pay in 3** - Split the cost into 3 interest-free instalments
* **Pay in 30 days** - Delay payment for up to 30 days
* **Financing** - Spread payments over a longer period (availability varies by region)
Klarna handles the credit check and approval instantly during checkout.
## Benefits for Your Business
| Benefit | Description |
| ----------------------- | ----------------------------------------------------------------------------------------------------- |
| **No credit risk** | Klarna takes on all credit risk. You get paid upfront regardless of missed or late customer payments. |
| **Same payout timing** | Klarna orders are paid out on the same schedule as card payments. |
| **Drive larger orders** | Customers are more likely to add items when they can spread the cost. |
| **No setup fee** | There's no cost to enable Klarna on your store. |
## Pricing
Klarna transactions are charged at **3.9% + 20p** per transaction.
This rate may vary based on your agreement. Contact your account manager for details.
## Availability
Klarna is available in the following regions:
| Region | Currencies |
| -------------- | ----------------------- |
| United Kingdom | GBP |
| Europe | EUR, SEK, NOK, DKK, CHF |
| United States | USD |
| Australia | AUD |
## Enabling Klarna
To activate Klarna on your store:
1. [Contact support](/docs/getting-started/contact-support) or reach out to your account manager
2. Our team will enable Klarna for your account
3. Klarna will automatically appear as a payment option at checkout
## Customer Experience
At checkout, customers who select Klarna are redirected to complete their payment:
1. Customer selects Klarna at checkout
2. Klarna performs an instant credit check
3. If approved, customer confirms payment terms
4. Order is placed and you receive payment
Klarna approval is instant in most cases. If a customer isn't approved, they can still complete their order using another payment method.
## Learn More
Visit [Klarna for Business](https://www.klarna.com/uk/business/) to learn more about how Klarna can help grow your business.
# Create and share storekit payment links
Source: https://storekit.com/docs/guides/payments/payment-links
Create shareable storekit payment links to collect one-off or reusable payments from customers. Send via email, SMS, or chat — no order required at checkout.
Use payment links to collect payments outside of the standard order flow. Share a link via email or SMS and your customer pays directly through a hosted checkout page — no order required.
## Link types
Payment links come in two types:
| Type | Description |
| ------------ | -------------------------------------------------------------------------------- |
| **One-off** | Deactivates automatically after a single successful payment |
| **Reusable** | Stays active and accepts multiple payments (optionally up to a configured limit) |
## Amount types
| Type | Description |
| ------------ | ------------------------------------------------------------------------------------------- |
| **Fixed** | A set amount the customer must pay |
| **Variable** | The customer enters the amount at checkout, optionally within a min/max range you configure |
## Creating a payment link
The **Payments > Payment Links** section is only visible in your dashboard after storekit Payments has been activated on your store. If you don't see it, activate payments first via **Store Settings > Payments > Activate Payments**. See [Set up payments](/docs/getting-started/launch/set-up-payments) for full setup instructions.
Go to **Payments > Payment Links** in your dashboard and click **Create link**.
Fill in the link details:
* **Title** — displayed to the customer at checkout (required)
* **Description** — optional context shown below the title
* **Reference** — an internal reference for your records (e.g. an invoice number)
* **Type** — one-off or reusable
* **Amount type** — fixed or variable
* **Amount** — required for fixed links; enter in your store's currency
* **Min / Max amount** — optional bounds for variable links
* **Max payments** — optional cap on total payments for reusable links
* **Expiry date** — optional date after which the link becomes inactive
* **Image** — optional image displayed on the checkout page
* **Customer details** — optionally collect business name, customer name, email, and phone at checkout (see [Customer detail collection](#customer-detail-collection))
Choose what happens after a successful payment:
* **Thank you page** — show a customisable thank-you message (default)
* **Redirect** — send the customer to a URL of your choice
Once created, copy the link URL or use the **Send** option to deliver it by email or SMS.
## Sending a link
You can send a payment link directly from the dashboard:
1. Open the payment link from **Payments > Payment Links**
2. Click **Send**
3. Enter the customer's email address or phone number
4. Click **Send link**
The customer receives a message with a direct link to the checkout page.
## Link statuses
| Status | Description |
| ------------ | ----------------------------------------------------------------------- |
| **Active** | The link is live and accepting payments |
| **Inactive** | The link has been manually deactivated, or a one-off link has been paid |
| **Expired** | The link's expiry date has passed |
## Deactivating a link
To stop a link from accepting payments, open it from **Payments > Payment Links** and click **Deactivate**. Deactivated links return a "no longer active" message to anyone who visits them.
## Customer detail collection
You can configure a payment link to collect customer information at checkout. Each field can be set independently to one of three modes:
| Mode | Description |
| ---------- | ------------------------------------------------------ |
| `disabled` | The field is not shown at checkout (default) |
| `optional` | The field is shown but not required |
| `required` | The field must be filled in before payment can proceed |
The available fields are:
* **Business name** — the customer's company or trading name
* **Customer name** — the customer's full name
* **Email** — the customer's email address
* **Phone** — the customer's phone number
Collected details are stored against each payment record and visible in the **Transactions** tab.
## QR codes
Every payment link has a QR code that encodes the checkout URL. You can download the QR code as a PNG image from the payment link detail page, or generate it via the API or MCP `get-payment-link-qr` tool.
The QR code is useful for printing on invoices, receipts, or physical signage so customers can scan and pay directly.
## Refunds
You can issue a refund for any payment collected via a payment link:
1. Open the payment link from **Payments > Payment Links**
2. Go to the **Transactions** tab
3. Select the payment you want to refund
4. Click **Refund** and enter the amount
Partial refunds are supported. The payment status updates to **Partially refunded** or **Fully refunded** accordingly.
## Viewing transactions
Each payment link has a **Transactions** tab showing all payments received, including the amount, currency, payment reference, and any customer details collected.
## Payment link IDs
Payment links use a `plink_` prefixed ID (for example, `plink_019dbc4d828174419d9ff9fae24aea7b`). Use this ID when referencing a link via the API or webhooks.
## Webhook events
storekit fires the following webhook events for payment links:
| Event | Description |
| ------------------------------- | ----------------------------------------------------------------- |
| `payment_link.created` | Fired when a new payment link is created |
| `payment_link.paid` | Fired when a payment is successfully collected via a payment link |
| `payment_link.refund.created` | Fired when a refund is initiated for a payment link payment |
| `payment_link.refund.succeeded` | Fired when the payment gateway confirms a refund succeeded |
| `payment_link.refund.failed` | Fired when the payment gateway rejects a refund |
See [Webhook Events](/docs/developers/webhooks/webhook-events) for full payload references.
## API & MCP access
Payment links are available via the storekit API and MCP tools. You can:
* List payment links (filter by venue, status, or type)
* Get a single payment link by ID
* Create a new payment link
* Generate a QR code for a payment link (`get-payment-link-qr`)
See the [Developer Introduction](/docs/developers/introduction) for more on API and MCP access.
# Payment methods supported by storekit
Source: https://storekit.com/docs/guides/payments/payment-methods
Payment methods available in storekit checkout, including cards, saved cards, Apple Pay, Google Pay, Klarna, and local options like iDEAL and TWINT.
storekit supports a variety of payment methods to meet your customers' preferences. Some methods are available to all stores by default, while others are region-specific.
## Default Payment Methods
These payment methods are available to all stores:
### Cards
Accept all major credit and debit cards:
* Visa
* Mastercard
* American Express
* Maestro
Card payments are processed securely through our payment provider with full PCI compliance.
If a customer's bank record shows a card payment as declined while the order is paid and accepted in storekit, the first attempt was refused and a later one succeeded — see [declined on the bank statement but paid in storekit](/docs/guides/pay-at-table/checking-payments#declined-on-the-bank-statement-but-paid-in-storekit).
### Apple Pay
Customers on iOS devices and Safari can pay with Apple Pay for a fast, secure checkout using Face ID or Touch ID.
### Google Pay
Customers on Android devices and Chrome can pay with Google Pay using their saved cards.
Apple Pay and Google Pay significantly reduce checkout friction and can improve conversion rates, especially on mobile.
### Cash (pay on collection)
Where cash is enabled, the customer sees a **Pay cash** option at checkout and pays your staff at collection, delivery or at the table. storekit never processes or holds that money, and no payout is generated for a cash order.
Cash is set per fulfillment method (pickup, delivery, in-store) and there is no cash toggle in the dashboard — [contact support](/docs/getting-started/contact-support) to turn it on or off.
**storekit+ required** — cash is available on storekit+ and higher subscription plans. A store whose storekit Payments application is still pending verification can take cash until payments go live, whatever plan it is on. Published plans are listed on the [storekit pricing page](https://www.storekit.com/pricing).
There is also no way to switch card payments off once storekit Payments is live — enabling cash adds **Pay cash** alongside card rather than replacing it. See [cash and pay-on-collection orders](/docs/guides/payments/cash-payments) for the plan requirement in full, how cash orders reach your POS, how to reconcile them, and what to do instead of turning card payments off.
## Regional Payment Methods
Additional payment methods are automatically enabled based on your store's country when you complete [storekit Payments setup](/docs/guides/payments/storekit-payments-setup).
### Automatically Enabled by Country
When you set up storekit Payments, the following payment methods are automatically configured based on your business location:
| Country | Additional Payment Methods |
| --------------- | -------------------------------- |
| **Netherlands** | iDEAL |
| **Belgium** | Bancontact (with mobile support) |
| **Sweden** | Swish |
| **Norway** | Vipps |
| **Denmark** | MobilePay |
| **Switzerland** | TWINT |
All countries receive Visa, Mastercard, American Express, Apple Pay, and Google Pay by default.
### Available Regional Methods
| Method | Regions | Currencies | Description |
| ---------------------------------------------------- | ------------------------- | -------------------------------------- | --------------------------------------------------------------- |
|
**iDEAL** | Netherlands | EUR | The leading Dutch payment method, used for 60%+ of e-commerce. |
|
**Bancontact** | Belgium | EUR | Belgium's most popular payment method. Direct bank payments. |
| **Swish** | Sweden | SEK | Sweden's leading mobile payment app. |
| **Vipps** | Norway | NOK | Norway's most popular mobile payment solution. |
| **MobilePay** | Denmark | DKK | Denmark's leading mobile payment app. |
|
**TWINT** | Switzerland | CHF | Switzerland's most popular mobile payment app. |
|
**Klarna** | UK, Europe, US, Australia | EUR, GBP, USD, SEK, NOK, DKK, CHF, AUD | Buy now, pay later. Customers spread the cost over instalments. |
|
**Alipay** | China | CNY, EUR, GBP, USD | Digital wallet popular with Chinese customers. |
|
**China UnionPay** | China | CNY, EUR, GBP, USD | China's largest card network with 8+ billion cards issued. |
|
**Diners Club** | Global | Multiple | International card network accepted in 200+ countries. |
## Enabling Payment Methods
### Default Methods
Cards, Apple Pay, and Google Pay are automatically available once you've completed [storekit Payments setup](/docs/guides/payments/storekit-payments-setup).
### Regional Methods
Regional payment methods are automatically enabled based on your store's country when you complete storekit Payments setup. No additional configuration is required.
If you need to enable additional payment methods not automatically configured for your country (such as Klarna, Alipay, or UnionPay), [contact support](/docs/getting-started/contact-support).
## Saved Cards (Stored Payment Methods)
Logged-in customers can save their card during checkout and reuse it for future orders. When a customer ticks "Save for my next payment" at checkout, their card is securely tokenised by our payment provider — no card details are ever stored by storekit. On their next order, the saved card appears at the top of the payment options for a faster checkout.
Saved cards are currently only available in storekit App Studio native apps, where customers have an account and are logged in. Guest checkout on the web is unaffected — guests simply won't see the option to save a card.
## Payment Method Display
Payment methods are displayed at checkout based on:
* **Customer's device** - Apple Pay only shows on Apple devices, Google Pay on Android/Chrome
* **Customer's location** - Regional methods show based on the customer's country
* **Order value** - Some methods have minimum or maximum transaction limits
# Refunds & Payouts
Source: https://storekit.com/docs/guides/payments/refunds-payouts
Issue full or partial refunds to a customer's original payment method, track payout impacts, and resolve disputes using ARN transaction references.
## How Refunds Work
* Refunds are returned to the customer’s original payment method
* You can issue a full refund or a partial refund
* You can refund selected items, tips, service charges, or a custom amount
* Refunds cannot be reversed once processed
* Refunds usually take **3–5 business days** to appear in the customer’s account
* Refunded amounts are reflected in your reports and payout calculations
For pre-orders, refunding does **not** free up the slot capacity — the order still counts against the slot. To reopen a pre-order slot, reject the order or move it to a different time. See [Pre-orders](/docs/guides/orders/advanced/pre-orders#does-refunding-or-cancelling-an-order-free-up-the-slot) for details.
## How to Refund an Order
From your storekit dashboard, go to **Orders**.
Before issuing a refund, check that the order has been paid.
Paid orders show a **Paid** status and the payment method used by the customer.
In the payment section, click **Refund**.
This opens the **Refund Order** window.
In the refund window, choose what you want to refund.
You can:
* Select specific items
* Adjust item quantities
* Refund the service charge
* Refund the tip
* Refund the delivery fee
* Toggle **Full refund**
* Enter a custom **Refund Amount**
Use **Select reason for refund** to choose the reason for the refund.
Only you and other staff can see this reason.
Check the refund amount carefully, then click **Refund**.
**This action cannot be reversed.**
## Refunding a Rejected Order
Rejecting an order does not refund it. The customer is told the order can't be fulfilled, but their payment stays with you until someone issues a refund, so a rejected order needs the same manual refund as any other order.
For a card order paid through storekit payments, the dashboard asks **Do you want to refund the payment also?** immediately after you reject it. Click **Yes** to open the **Refund Order** window and finish the refund there; click **No** and nothing is refunded. Orders paid another way — PayPal or a gift card, for example — never show that prompt.
To check whether a rejected order has already been refunded, open the order and look at the **Payment** section:
* A red count next to the payment method (for example "1 refund") means at least one refund exists. Click the payment to expand it and the **Refunds** list shows each refund's amount, reason, result and acquirer reference; a refund that did not go through is struck through and tagged **Failed**, so it did not reach the customer
* No count means nothing has been refunded yet — click **Refund** to issue one. **Refund** keeps working after an order is rejected
* If **Refund** is greyed out with the tooltip "Full amount already refunded", the whole order has been refunded and there is nothing left to return
Refunds on rejected orders clear like any other refund: usually **3–5 business days** to reach the customer's bank.
## Understanding Partial Refund Display
After a partial refund is issued, the order's line items and quantities remain unchanged — the original order details are preserved for record-keeping. The refund is shown as a separate financial adjustment, not by modifying line items.
The order may display amounts in red or with strikethrough to indicate the refunded portion. This is expected behavior, not an error.
To reconcile partial refunds:
* In the sidebar, click **Analytics** to expand the section, then select **Accounting**. On the Accounting page, click **Daily Summary** where refunds are reflected in net totals
* View the individual order's payment section which shows the full refund history
If you need to see which specific items were refunded, check the order's Activity Log which records all refund actions with timestamps.
## Refund Timing
Refunds are processed from storekit once confirmed, but they may not appear in the customer’s account immediately.
Most refunds take **3–5 business days** to clear, depending on the customer’s bank.
## The Refund Email Customers Receive
When a refund succeeds, storekit emails the customer automatically. There is nothing to send by hand, and no dashboard setting turns this email on or off.
* The subject is "Your order #CODE was refunded", using the order's code. For a Pay at Table bill payment the subject is "Your bill was refunded"
* It is sent from your store's own name and email address, in the store's language
* It shows your store logo and brand colour, the order code, the usual order summary with the **Total**, and a **Refunded** row with the refunded amount
* It is sent when the payment provider confirms the refund, not the moment you click **Refund**, so it can reach the customer shortly after you issue the refund
Nothing is emailed to the customer if the refund failed — a refund shown struck through and tagged **Failed** in the order's **Refunds** list never reached them, and the failure notice goes to the store instead. Nothing is sent either when the order has no customer email address, or when the store itself has no email address configured.
There is no way to re-send the refund email. Opening the order and choosing **More actions** → **Email receipt** re-sends the order confirmation receipt, not the refund email, and **More actions** → **Invoice** produces the order's VAT invoice — those are the only documents you can send or generate yourself. If a customer needs written confirmation of the refund, see [Requesting a refund letter](#requesting-a-refund-letter).
## How Refunds Affect Payouts
When a refund is processed, the refunded amount is deducted from the funds available for payout.
If there is enough available balance, the refund is deducted from that balance.
If the original payment has already been paid out, or there is not enough available balance, the refund may be deducted from a future payout instead.
Because refunds reduce the net available for a day, a payout won't match the Daily Summary **Net Revenue** for a day on which refunds occurred. To match a payout to a sales day step by step, see [Reconciling a Payout with Daily Summary](/docs/guides/reports/fee-report#reconciling-a-payout-with-daily-summary).
## How Refunds Appear in Reports
Refunds are shown in your storekit reports so you can track money returned to customers and reconcile your payouts.
Use your reports to check:
* Which orders were refunded
* Whether the refund was full or partial
* The refund amount
* The date the refund was processed
* How the refund affected payout totals
Refunds cannot be reversed once processed. Check the payment, refund amount, and selected items carefully before confirming the refund.
Refunds usually take **3–5 business days** to appear in the customer’s account, depending on their bank.
If a refund is issued after the original payment has already been paid out, the refunded amount may be deducted from a future payout.
## Refund Disputes & Transaction References
If a customer disputes a refund or claims they have not received it, you can use the transaction references available in your storekit dashboard to help resolve the issue.
### What references are available
When you view a refund in the order detail or in **Analytics > Accounting > All Transactions**, the following data is shown:
* **Transaction ID** — the unique identifier for the refund in storekit
* **Acquirer Reference Number (ARN)** — the reference assigned by the payment processor that tracks the refund through the card network. The customer's bank can use this to locate the refund on their end
* **Refund status** — whether the refund is pending, completed, or failed
* **Date** — when the refund was processed
* **Amount** — the refunded amount and currency
### Using the Acquirer Reference Number (ARN)
The ARN is the most useful reference when a customer's bank cannot locate a refund. You can find the ARN on the refund transaction in the order detail or in the All Transactions report.
Share the ARN with the customer so they can provide it to their bank. This allows the bank to trace the refund through the card network and confirm whether it has been received.
### Requesting a refund letter
If a customer needs written confirmation of a refund — for example, to share with their bank or for their own records — they can request a refund letter from storekit. Contact storekit support and we will provide a letter confirming the refund details.
## Troubleshooting
#### The customer has not received their refund
Refunds can take **3–5 business days** to appear in the customer’s account.
If the refund has already been processed in storekit, ask the customer to allow this time for their bank to return the funds.
#### My payout is lower than expected
Check whether any refunds, fees, or adjustments were deducted from the payout.
Refunds processed before payout can reduce the amount paid out to your bank account.
#### A refund was issued after the payout
If the original payment has already been paid out, the refund may be deducted from a future payout.
Check your reports to confirm when the refund was processed and how it affected later payout totals.
#### I only need to refund one item
Open the refund window and select the specific item you want to refund.
You can also adjust the quantity if the customer ordered more than one of the same item.
## Related
* [**Payment Links**](/docs/guides/payments/payment-links) — create and manage payment links
* [**All Transactions Report**](/docs/payments/transactions) — view payment and refund activity
* [**Fee Report & Daily Summary**](/docs/guides/reports/fee-report) — review fees, revenue, and payout totals
* [**A Payout Hasn't Arrived**](/docs/guides/reports/fee-report#a-payout-hasnt-arrived) — checklist for a missing or late payout
* [**Managing Live Orders**](/docs/guides/orders/managing-live-orders) — handle incoming orders in real time
# storekit Payments Setup
Source: https://storekit.com/docs/guides/payments/storekit-payments-setup
Set up storekit Payments powered by Adyen to accept cards, digital wallets, and local methods. Connect a bank account, complete KYC, and get paid out.
storekit Payments is our integrated payment solution, powered by Adyen. It allows you to accept card payments, Apple Pay, Google Pay, and regional payment methods, with funds paid out directly to your bank account.
## Before You Start
Before setting up storekit Payments, make sure you have:
* A valid phone number added to your store's [general settings](/docs/guides/store-settings/opening-hours)
* Your business registration details (for limited companies)
* Bank account details for payouts
* ID documents for verification (passport or driving licence)
## Business Types
storekit Payments supports two business types:
| Type | Description | Best For |
| --------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------ |
| **Business** | Limited Company, LLP, or PLC | Registered companies with Companies House (UK) or equivalent |
| **Sole Trader** | Self-employed individual trading under their own name or a business name | Freelancers, sole proprietors, unincorporated businesses |
## Setting Up Your Account
Go to **Stores** → your store → **Settings** → **Payments** and click **Create a new platform account**. Select whether you're a Business or Sole Trader.
**For Businesses (Limited Companies):**
* Enter your registered legal business name
* For UK companies, we'll look up your details from Companies House automatically
**For Sole Traders:**
* Enter your legal business name
* Optionally add a "Doing business as" name if you trade under a different name
* Enter your first and last name
* Provide your registered business address
Review and accept the storekit Payments terms of service. You'll also need to confirm your business doesn't fall under the [restricted services list](https://www.adyen.com/legal/list-restricted-prohibited).
After initial setup, you'll be redirected to complete the verification process (see below).
## Verification Process
To comply with financial regulations, we need to verify your identity and business. The verification requirements depend on your business type.
### For Sole Traders
| Verification | What's Needed |
| ------------------------- | -------------------------------------- |
| **Identity verification** | Photo ID (passport or driving licence) |
| **Bank account** | Bank account details for payouts |
### For Businesses (Limited Companies)
| Verification | What's Needed |
| ------------------------- | ---------------------------------------------------------------------- |
| **Business verification** | Company registration number (looked up automatically for UK companies) |
| **Bank account** | Business bank account details for payouts |
| **Beneficial owners** | Details of anyone who owns 25% or more of the business |
| **Directors/Executives** | At least one director or executive must complete identity verification |
**Beneficial owners** are individuals who own or control 25% or more of your business. This includes shareholders, partners, or anyone with significant control. You'll need to provide their name, date of birth, and address.
### Identity Verification
For identity verification, you'll need to provide:
* **Photo ID** - Passport or driving licence
* **Selfie** - A photo of yourself holding your ID (in some cases)
The verification is completed through a secure online process. Most verifications are approved within minutes, but some may take up to 24-48 hours.
### Requirements by Country
Verification requirements vary by country. Here's what you'll need for key markets:
| Country | Individual ID | Business Registration | Tax ID |
| ------------------ | --------------------------------------- | ------------------------------------ | --------------------- |
| **United Kingdom** | Passport or Driving Licence | Companies House Number | UTR (optional) |
| **Germany** | Personalausweis or Passport | Handelsregisternummer (HRB) | Steuernummer |
| **Netherlands** | Passport or ID Card | KVK Number | BTW-nummer |
| **France** | Passport or Carte d'identité | SIREN/SIRET | Numéro TVA |
| **Ireland** | Passport or Driving Licence | CRO Number | Tax Reference |
| **Switzerland** | Passport or ID Card | UID (CHE number) | MWST-Nummer |
| **Belgium** | Passport or ID Card | BCE/KBO Number | BTW/TVA |
| **Austria** | Passport or Personalausweis | Firmenbuchnummer | UID-Nummer |
| **United States** | Passport, Driver's License, or State ID | EIN (Employer Identification Number) | SSN or ITIN |
| **Australia** | Passport or Driver Licence | ABN (Australian Business Number) | TFN (Tax File Number) |
| **New Zealand** | Passport or Driver Licence | NZBN (New Zealand Business Number) | IRD Number |
| **Canada** | Passport or Driver's License | Business Number (BN) | GST/HST Number |
For businesses, you'll also need to provide details of beneficial owners (25%+ shareholders) and at least one director must complete identity verification.
### Bank Account Verification
You'll need to provide your bank account details for payouts:
**For UK accounts:**
* Account holder name
* Sort code
* Account number
**For European accounts:**
* Account holder name
* IBAN
* BIC/SWIFT code
The bank account must be in the name of the business (for companies) or the individual (for sole traders). We cannot pay out to third-party accounts.
## Verification Status
You can check your verification status at any time in **Store Settings > Payments**. Common statuses include:
| Status | Meaning |
| ------------------- | --------------------------------------------------------- |
| **Pending** | Verification is being processed |
| **Action Required** | Additional information or documents needed |
| **Verified** | All verifications complete - you can accept payments |
| **Failed** | Verification failed - check the error message for details |
## Processing Payments Before Verification
By default, you must complete verification before you can accept payments. This ensures compliance with financial regulations and protects both you and your customers.
In rare cases, we may allow stores to process payments before verification is complete. However, if verification is never fully completed, you take on responsibility for any associated risks. [Contact support](/docs/getting-started/contact-support) if you have an urgent need to start processing before verification.
## Updating Your Details
Go to **Stores** → your store → **Settings** → **Payments** and click **Edit account setup** to reopen the secure verification process and update your business and identity details. Some changes may require re-verification.
Your payout bank account cannot be changed there. Bank changes go through our support team and need bank proof — see [Changing Your Bank Account](/docs/payouts/bank-accounts#changing-your-bank-account).
## Multiple Stores
If you have multiple stores, you can connect them to the same storekit Payments account if they're operated by the same legal entity. You only need to complete verification once.
If your stores are operated by different legal entities (different companies), you'll need to set up separate storekit Payments accounts for each.
## Troubleshooting
### Error when creating payment account
If you see an error when trying to create your storekit Payments account, check the following:
* **Store address not complete** — All address fields including postcode are required. Go to **Store Settings > General** and ensure your full address is filled in.
* **Phone number missing** — A valid phone number must be added to your store's general settings before you can create a payment account.
* **Browser cache issue** — Try opening an incognito/private browsing window and attempting the setup again.
If the error persists after completing all required fields, [contact support](/docs/getting-started/contact-support) with your store name and the exact error message so we can investigate further.
### Verification stuck or rejected
If your verification is taking longer than expected or has been rejected:
* Check that your ID document is not expired
* Ensure the name on your ID matches the name you entered during setup exactly
* Re-upload documents if the photos are blurry or partially obscured
* Allow up to 48 hours for manual review in cases where automatic verification cannot be completed
If your verification has been stuck in "Pending" for more than 48 hours, [contact support](/docs/getting-started/contact-support) with your store name and we'll check the status with our payment provider.
### Can't connect pay-in account
If you're unable to connect your bank account for payouts:
* Ensure you've completed the KYC (identity) verification step first — bank account connection is only available after verification
* Double-check that your bank account details are correct (sort code and account number for UK, or IBAN for European accounts)
* If you see a generic error, try logging out of your storekit dashboard and logging back in, then retry the connection
The bank account must be in the name of the business (for companies) or the individual (for sole traders). Third-party accounts cannot be connected.
### Bank Account Rejected
If your bank account is rejected:
* Verify the account details are correct
* Ensure the account is in the name of the business or individual
* Check the account accepts incoming payments
For further assistance, [contact support](/docs/getting-started/contact-support).
# Tips & Service Charges
Source: https://storekit.com/docs/guides/payments/tips-service-charges
Configure tips and service charges in storekit so customers can add gratuity at checkout and you can apply fixed or percentage-based service fees.
## How Tips Work
Tips, also called **Gratuity**, let customers leave an optional amount when placing an order.
You can choose whether tipping is disabled, percentage-based, or smart.
## Tip Options
storekit supports different tipping options:
* **Disabled** — customers are not shown a tipping option at checkout
* **Percentage tips** — customers can choose from percentage-based tip options
* **Smart tips** — customers are shown fixed tip amounts based on the order total
## How to Set Up Tips
From your storekit dashboard, go to **Stores** and select the store you want to update.
Open **Settings**.
From the settings menu, open **Gratuity**.
Choose how you want tipping to work for this store.
You can disable tipping, enable percentage tips, or enable smart tips.
Click **Save** to apply the change.
Customers will only see the selected tipping option once the setting has been saved.
## Percentage Tips
Use **percentage tips** if you want customers to choose a tip based on a percentage of their order total.
This is useful when you want the tip amount to scale with the value of the order.
## Smart Tips
Use **smart tips** if you want storekit to show fixed tip amounts based on the customer’s order total.
This helps keep suggested tip amounts simple and easy for customers to choose.
## How Service Charges Work
Service charges are extra charges that can be added to customer orders.
storekit supports two common types of service charge:
* **Fixed service charge** — a fixed amount added to eligible orders
* **Percentage-based service charge** — a percentage of the order total, commonly used for Order & Pay stores
For Order & Pay stores, percentage-based service charges and tips cannot be enabled at the same time. If a percentage-based service charge is enabled, tipping is automatically disabled.
Unlike tips, service charges are not freely chosen by the customer at checkout. They are configured as part of your store setup and applied based on your service charge settings.
## Fixed Service Charges
Fixed service charges can be managed from your store’s **Operations** settings.
Use this when you want to add a fixed fee to orders, such as:
* Service charge
* Bag fee
* Packaging fee
* Handling fee
You can also rename the charge so customers see the correct label at checkout.
For example, you can rename a fixed service charge to **Bag fee** if the charge is used for packaging or carrier bags.
## How to Set Up a Fixed Service Charge
From your storekit dashboard, go to **Stores** and select the store you want to update.
Open **Settings**.
From the settings menu, open **Operations**.
In the service charge settings, enter the fixed amount you want to charge.
Update the service charge name if you want customers to see a different label at checkout.
For example, you can rename it to **Bag fee** or **Packaging fee**.
Click **Save** to apply the change.
Customers will only see the service charge once the setting has been saved.
## Percentage-based Service Charges
Percentage-based service charges are calculated as a percentage of the order total.
These are commonly used for **Order & Pay** stores where the venue wants to apply a standard percentage-based charge to customer orders.
Percentage-based service charges need to be configured by [storekit Support](/docs/getting-started/contact-support).
## Tips vs Service Charges
Tips and service charges are different:
* **Tips** are optional and chosen by the customer
* **Fixed service charges** are fixed amounts configured in **Operations**
* **Percentage-based service charges** are configured by storekit Support for Order & Pay stores
* Tips can be managed from your store’s **Gratuity** settings
* Fixed service charges can be renamed, for example to **Bag fee** or **Packaging fee**
* Order & Pay stores cannot have both percentage-based service charges and tips enabled at the same time
## When to Use Tips
Use tips when:
* You want customers to choose whether to leave an extra amount
* You want to offer optional gratuity at checkout
* You want customers to choose from percentage or fixed suggested amounts
## When to Use Fixed Service Charges
Use fixed service charges when:
* You want to add a fixed fee to eligible orders
* You need to charge for bags, packaging, or handling
* You want the same amount added each time
* You want to control the label shown to customers at checkout
## When to Use Percentage-based Service Charges
Use percentage-based service charges when:
* Your venue applies a standard percentage-based charge
* You want the charge to scale with the order total
* You are using an Order & Pay setup that requires a configured service charge
Tips can be managed from **Store Settings > Gratuity**. Fixed service charges can be managed from **Store Settings > Operations**.
Fixed service charges can be renamed, for example to **Bag fee** or **Packaging fee**, so customers see the correct label at checkout.
Order & Pay stores cannot use percentage-based service charges and tips at the same time. If a percentage-based service charge is enabled, tipping must be disabled.
## Troubleshooting
#### Customers cannot see the tipping option
Check that tipping is enabled under **Store Settings > Gratuity**.
If tipping is disabled, customers will not be shown a tip option at checkout.
#### I need to change a fixed service charge
Go to **Store Settings > Operations** and update the fixed service charge amount or label.
Save your changes once updated.
#### I need to change a percentage-based service charge
[Contact storekit Support](/docs/getting-started/contact-support) with the store name, the percentage you want to apply, and when you want the change to take effect.
Percentage-based service charge changes for Order & Pay stores need to be configured by the storekit team.
#### I want to remove a service charge
For fixed service charges, go to **Store Settings > Operations** and remove the charge.
For percentage-based service charges, [contact storekit Support](/docs/getting-started/contact-support).
#### Tips are showing but the service charge is not
Tips and service charges are managed separately.
Tips are controlled from **Gratuity** settings. Fixed service charges are controlled from **Operations**. Percentage-based service charges may need to be configured by storekit Support depending on your store setup.
Order & Pay stores cannot have both percentage-based service charges and tips enabled at the same time
## Related
* [**Refunds & Payouts** ](/docs/guides/payments/refunds-payouts)— understand how refunds affect customer payments and payouts
* [**Payment Links**](/docs/guides/payments/payment-links) — create and manage payment links
* [**Orders Overview**](/docs/orders/managing-orders) — how orders flow through storekit
* [**Managing Live Orders**](/docs/guides/orders/managing-live-orders) — handle incoming orders in real time
# TWINT
Source: https://storekit.com/docs/guides/payments/twint
Accept TWINT payments in your storekit store, Switzerland's most popular mobile payment app. Automatically enabled for Swiss stores at no extra setup cost.
TWINT is Switzerland's leading mobile payment app, used by millions of Swiss consumers for everyday purchases. It's automatically enabled for all Swiss stores.
## How It Works
When a customer selects TWINT at checkout:
1. Customer chooses TWINT as their payment method
2. They're prompted to open the TWINT app on their phone
3. The payment request appears in their app
4. Customer confirms with their TWINT PIN or biometrics
5. Payment is completed and order is placed
The entire process takes just a few seconds.
## Why TWINT Matters in Switzerland
| Stat | Detail |
| -------------------- | ---------------------------------------------------- |
| **5+ million users** | Over half of Switzerland's population uses TWINT |
| **Trusted** | Backed by major Swiss banks |
| **Fast** | No card details to enter - just confirm in the app |
| **Preferred** | Many Swiss customers prefer TWINT over card payments |
If you're operating in Switzerland, TWINT is essential. Swiss customers expect to see it as a payment option.
## Availability
| Region | Currency |
| ----------- | -------- |
| Switzerland | CHF |
## Enabling TWINT
**TWINT is automatically enabled for all Swiss stores.** There's nothing you need to do - it will appear as a payment option for customers in Switzerland once your store is set up.
If TWINT isn't appearing at checkout for your Swiss store, [contact support](/docs/getting-started/contact-support) to verify your store's region settings.
## Customer Experience
TWINT provides a seamless mobile payment experience:
* **No card details required** - Customers pay directly from their bank account via the app
* **Instant confirmation** - Payments are confirmed in real-time
* **Familiar interface** - Swiss customers already use TWINT for peer-to-peer payments, parking, and retail
## Learn More
Visit [TWINT](https://www.twint.ch/en/) to learn more about Switzerland's favourite payment app.
# Yoco
Source: https://storekit.com/docs/guides/payments/yoco
Set up the Yoco payment integration for storekit stores in South Africa. Step-by-step instructions to start accepting card payments through Yoco's network.
Yoco is a leading payment provider in South Africa, offering simple and affordable card payments for businesses of all sizes. storekit integrates directly with Yoco for South African stores.
Yoco is a standalone payment integration, completely separate from storekit Payments (Adyen). For now, South African stores use Yoco instead of storekit Payments.
## How It Works
When a customer checks out at a Yoco-enabled store:
1. Customer completes their order and proceeds to payment
2. They're redirected to Yoco's secure checkout page
3. Customer enters their card details or pays with a saved card
4. Payment is processed by Yoco
5. Customer is redirected back to your store with confirmation
## Connecting Yoco
Unlike other payment methods, Yoco requires you to enter your API secret key in storekit:
If you don't already have one, [sign up for Yoco](https://www.yoco.com/za/) and complete their onboarding process.
Log in to the [Yoco App](https://app.yoco.com/) and navigate to **Sales > Payment Gateway**. You'll see your **Test Secret Key** and **Live Secret Key**.
In your storekit dashboard, go to **Store Settings > Yoco** and paste your secret key.
* Use the **Test Secret Key** while setting up and testing
* Switch to the **Live Secret Key** when you're ready to accept real payments
Once configured, Yoco will automatically appear as the payment method at checkout.
## Features
| Feature | Supported |
| ----------------- | --------- |
| Card payments | Yes |
| Refunds | Yes |
| Webhooks | Yes |
| Line item details | Yes |
## Availability
| Region | Currency |
| ------------ | -------- |
| South Africa | ZAR |
## Refunds
Refunds for Yoco orders work the same as other payment methods:
1. Go to the order in your storekit dashboard
2. Click **Refund**
3. Enter the refund amount
4. The refund is processed through Yoco and the customer is notified
Refunds are processed directly through Yoco's API. The refund will appear in the customer's account according to Yoco's standard processing times.
## Payouts
Yoco handles payouts directly to your South African bank account. Payout timing and fees are determined by your Yoco account settings, not storekit.
To view your payouts and transaction history, log in to your [Yoco Portal](https://portal.yoco.com/).
## Disconnecting Yoco
If you need to remove your Yoco integration:
1. Go to **Store Settings > Yoco** in your storekit dashboard
2. Remove your secret key
3. Save the settings
Removing your Yoco secret key will prevent your store from accepting payments until you re-enter it or set up an alternative payment method.
## Troubleshooting
### Invalid Secret Key
If your secret key isn't working:
* Ensure you're copying the full key from the Yoco App
* Check you're using the correct key (Test vs Live)
* Verify your Yoco account is fully verified and active
### Payments Not Working
If payments aren't processing:
* Check you've entered the **Live Secret Key** (not Test) for real payments
* Verify your Yoco account status in the [Yoco App](https://app.yoco.com/)
* Ensure your store is set to the South Africa region
For further assistance, [contact support](/docs/getting-started/contact-support).
## Learn More
Visit [Yoco](https://www.yoco.com/za/) to learn more about accepting payments in South Africa.
# Auto vs Manual Printing
Source: https://storekit.com/docs/guides/printing/auto-vs-manual
How storekit's Auto print and Manual print modes work, how they combine with Auto Accept, and which to choose so your kitchen never misses an order ticket.
Every printer under **Stores** → your store → **Settings** → **Direct Printing** is set to **Auto print** or **Manual print**. This decides *when* a ticket prints. It is separate from **Auto Accept**, which decides whether an order is accepted for you — the two settings do not affect each other.
## The Two Print Modes
| Mode | When the ticket prints |
| ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Auto print** | As soon as the order is placed, whether or not it has been accepted. Pre-orders print at the scheduled time minus the printer's **Buffer**; with a buffer of 0 they print straight away. |
| **Manual print** | Only when you open the order in the dashboard and click **Print**. Nothing prints on its own. |
Accepting an order does not trigger a print in either mode. There is no "print on accept" option.
If you use order batching, the merged ticket prints when the batch closes rather than per order — see [Order Batching](/docs/guides/orders/advanced/order-batching).
## Auto Accept Is a Separate Setting
**Auto Accept** lives under **Stores** → your store → **Settings** → **Operations**. When **Auto accept orders** is on, a new order is accepted immediately; when it is off, the order arrives as **Pending** in Live Orders and waits for you to click **Accept**. Either way, an **Auto print** printer prints the ticket on its own schedule — immediately for a standard order, and at the scheduled time minus the **Buffer** for a pre-order.
The table below describes a standard (non-pre-order, unbatched) order:
| Auto Accept | Print mode | What the kitchen sees |
| ----------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------- |
| On | **Auto print** | Ticket prints immediately; the order shows as **Accepted**. Nothing to do in the dashboard. |
| On | **Manual print** | Order is accepted, but no ticket until staff open it and click **Print**. |
| Off | **Auto print** | Ticket prints immediately while the order still shows as **Pending** in Live Orders. Someone must still click **Accept**. |
| Off | **Manual print** | Nothing prints and nothing is accepted until staff act on the order in Live Orders. |
**Auto Accept off — how do you know an order has arrived?** The new-order sound plays on an open Live Orders page, the order appears as **Pending**, and an **Auto print** printer prints the ticket straight away. The printed ticket is not an acceptance: the customer only sees the order as accepted once you click **Accept**. See [Managing Live Orders](/docs/guides/orders/managing-live-orders).
## Choosing a Mode
* **Auto print** suits kitchens that work from paper: the ticket is the alert, and nobody has to watch a screen for it to print.
* **Manual print** suits venues that review every order on screen first, or that print only occasionally — for example a tablet-led counter that prints a ticket for large orders.
* If you turn **Auto Accept** off to review orders before committing to them, keep the printer on **Auto print** so the kitchen still sees the ticket immediately, and accept from Live Orders.
To change the mode, go to **Stores** → your store → **Settings** → **Direct Printing**, open the printer and choose **Auto print** or **Manual print**. See [Printer Setup](/docs/guides/printing/printer-setup) for the full list of printer settings.
# Fallback Printing
Source: https://storekit.com/docs/guides/printing/fallback-printing
Automatically print storekit orders if your POS integration fails. Fallback printing ensures orders still reach the kitchen when the POS connection drops out.
If you're integrated with a POS system, orders normally flow directly to your POS for preparation and printing. But what happens when that connection fails? Fallback printing ensures orders still reach your kitchen.
## The Problem
POS integrations can fail for various reasons:
* POS server is down or unreachable
* Network issues between storekit and your POS
* POS rejects the order (menu sync issues, item not found)
* Timeout during busy periods
When this happens, the order is paid and confirmed to the customer - but your kitchen doesn't know about it. This leads to missed orders, unhappy customers, and lost revenue.
## The Solution: Fallback Printing
With a storekit cloud printer connected, you can configure orders to print automatically when they fail to reach your POS.
**How it works:**
1. Customer places an order
2. storekit attempts to send the order to your POS
3. If the POS accepts it → Order flows through your normal POS workflow
4. If the POS fails → Order prints immediately on your storekit printer
This gives you a safety net - even if your POS is down, you'll still receive a printed ticket.
## Setting Up Fallback Printing
Simply [connect a storekit cloud printer](/docs/guides/printing/printer-setup) to your store. Once connected, failed POS orders will automatically print - no additional configuration required.
The printer should be set to **manual print** mode (the default). This means regular orders won't print (your POS handles those), but failed orders will print automatically as a fallback.
Position the printer somewhere visible - like the pass or expediting station - so staff immediately notice when a fallback ticket appears.
## What Gets Printed
Fallback tickets include:
* All order details (items, modifiers, quantities)
* Customer details and contact info
* Fulfillment method and time
* **Clear "POS FAILED" warning** so staff know this order bypassed normal flow
The ticket format matches your regular storekit print settings.
## Best Practices
### Always Have a Fallback
Even if your POS integration is rock-solid, connect a storekit printer as insurance. The cost of a printer is nothing compared to missing orders.
### Position the Fallback Printer Strategically
Put it somewhere visible - not tucked away in a corner. Staff need to notice when a fallback ticket prints.
### Train Your Team
Staff should know:
* What a fallback ticket looks like
* That it means the POS didn't receive the order
* To manually enter it into the POS if needed for reporting
* To alert a manager if fallback tickets become frequent
### Review Failed Orders Daily
Don't just print and forget. Review your failed orders report regularly to catch integration issues before they become major problems.
Fallback printing is a safety net, not a long-term solution. If you're seeing frequent fallback tickets, see [Troubleshooting](/docs/guides/printing/troubleshooting) to diagnose the underlying issue.
# Print Name
Source: https://storekit.com/docs/guides/printing/print-name
Override the printed name of storekit products and modifiers on kitchen tickets. Use abbreviations, internal codes, or kitchen-specific terminology for clarity.
Print Name lets you display a different name on kitchen tickets than what customers see on your menu. This is useful for abbreviations, internal codes, or kitchen-specific terminology.
Print Name only applies to **Direct Printing** (cloud printing). POS integrations use the regular product name.
## How It Works
When a product or modifier has a print name set:
* Customers see the regular **Name** on your online menu
* Direct printing tickets display the **Print Name** instead
### Example
| Field | Value |
| -------------- | --------------------------------------------------- |
| **Name** | Grilled Chicken Caesar Salad with Parmesan Croutons |
| **Print Name** | GC Caesar |
* Menu shows: "Grilled Chicken Caesar Salad with Parmesan Croutons"
* Ticket shows: "GC Caesar"
## Setting Print Name
1. Go to your [storekit dashboard](https://dashboard.storekit.com)
2. Navigate to **Menu**
3. Click into a product
4. In the **Print Name** field, enter the kitchen-friendly name
5. Click **Save**
Leave Print Name empty to use the regular product name on tickets.
## Where Print Name Applies
Print Name can be set on:
| Item Type | Effect |
| ------------------- | ---------------------------------- |
| **Products** | Overrides product name on tickets |
| **Modifiers** | Overrides modifier name on tickets |
| **Modifier Groups** | Overrides group header on tickets |
## Use Cases
### Abbreviations
Shorten long menu names for faster ticket reading:
* "Southern Fried Chicken Burger" → "SFC Burger"
* "Extra Large" → "XL"
* "Gluten Free Bun" → "GF Bun"
### Internal Codes
Match your existing kitchen terminology:
* "The Big Breakfast" → "BB1"
* "Chef's Special Pasta" → "CSP"
### Station Indicators
Include prep station hints:
* "Margherita Pizza" → "MARG \[OVEN]"
* "Fresh Orange Juice" → "OJ \[BAR]"
## Best Practices
* **Keep it short** - Tickets have limited space; aim for 15-20 characters max
* **Be consistent** - Use the same abbreviation patterns across your menu
* **Train staff** - Ensure kitchen team knows the abbreviations
* **Test first** - Print a test order to verify names display correctly
# Print Order
Source: https://storekit.com/docs/guides/printing/print-order
Rearrange the order items appear on storekit kitchen tickets without changing the customer-facing menu. Print drinks before food or group items by station.
By default, items print on tickets in the same order they appear in your menu. But for kitchen efficiency, you might want a different arrangement - for example, printing drinks before food even if they appear lower on your menu.
The print order setting lets you control how items are arranged on tickets without changing your menu's customer-facing order.
## Setting Up Print Order
1. Go to your [storekit dashboard](https://dashboard.storekit.com)
2. Navigate to **Menu**
3. Click the **printer icon** at the top of the page (next to the Collapse button)
4. Drag categories and items into the order you want them to print
5. Changes save automatically
Click the three-line icon beside the printer icon to switch back to the normal menu editing view.
## Example Use Cases
### Drinks Before Food
If you have one printer and want drinks to print at the top of the ticket (so the bar can start preparing while the kitchen reads the rest):
1. Open the print order view
2. Drag all drink categories to the top
3. Leave food categories below
### Prep Order
Arrange items by preparation time - items that take longest to prepare at the top, quick items at the bottom. This helps kitchen staff prioritise.
### Station Grouping
Even without split printing, you can group items by station:
1. Grill items together
2. Fryer items together
3. Cold items together
## Print Order vs Menu Order
| Setting | Affects | Use Case |
| --------------- | ----------------------------- | ------------------------------------ |
| **Menu order** | What guests see on your store | Organised for browsing and upselling |
| **Print order** | How items appear on tickets | Organised for kitchen efficiency |
You can have a completely different arrangement for each without affecting the other.
## Print Order vs Split Printing
* **Print order** controls the sequence of items on a single ticket
* **Split printing** sends different categories to different printers
These features work together. If you use split printing, each printer's ticket will follow the print order you've set for the categories assigned to it.
# Set up a Star Micronics cloud printer
Source: https://storekit.com/docs/guides/printing/printer-setup
Set up Star Micronics CloudPRNT receipt printers with storekit over WiFi or ethernet to print kitchen and order tickets automatically.
storekit integrates with Star Micronics cloud printers to print order tickets automatically or on-demand. Printers connect to your network via WiFi or ethernet (hardwired is recommended for reliability) and receive jobs from the cloud - no cables to your computer required.
## When to Use Direct Printing
Connect a printer if:
* **You're not POS-integrated** - Orders need to reach your kitchen somehow
* **You want fallback reliability** - Print orders automatically when your POS integration fails (see [Fallback Printing](/docs/guides/printing/fallback-printing))
If you're POS-integrated, your POS typically handles printing. But connecting a storekit printer as a fallback ensures you never miss an order if the POS connection drops.
## Using Printers from a Third-Party POS or EPOS
If you already run a third-party POS or EPOS system that came with its own receipt or kitchen printers (for example, hardware supplied alongside an order-aggregator integration), you don't connect those printers to storekit directly.
When you're [POS-integrated](/docs/guides/integrations/pos/overview), storekit injects each order straight into your POS, and your POS drives its own printers and kitchen displays. Non-Star printers stay on the POS side and keep printing exactly as they do for your other channels — there's nothing to set up in storekit's **Settings → Direct Printing** for them.
Only **Star Micronics CloudPRNT** printers can connect directly to storekit (see [Supported Printers](#supported-printers) below). Printers from other brands, such as Epson, must be driven by your POS/EPOS. You can still add a Star CloudPRNT printer to storekit as a [fallback](/docs/guides/printing/fallback-printing) if you'd like a backup for when the POS connection drops.
## Supported Printers
storekit supports **Star Micronics CloudPRNT** printers only for direct auto-printing. The models below are the ones you can select through **Stores** → your store → **Settings** → **Direct Printing**. Epson and other printer brands cannot connect directly to storekit — if you use a different brand, it must be driven by a POS/EPOS system (see [Using Printers from a Third-Party POS or EPOS](#using-printers-from-a-third-party-pos-or-epos) above).
| Model | Type | Notes |
| ------------------- | ---------- | -------------------------------------------------------------- |
| **Star TSP100IV** | Thermal | Recommended - fast, reliable, easy setup |
| **Star MC Print 3** | Thermal | Compact design, front-loading paper |
| **Star MC Print 2** | Thermal | Budget-friendly option |
| **Star SP742** | Dot matrix | Kitchen printer - heat/splash resistant (CloudPRNT model only) |
You can buy pre-configured printers ready for storekit from [Commandear](https://commandear.com/products/storekit-configures-star-tsp143iv-receipt-printer).
## What You'll Need
Before starting, make sure you have the following:
1. **A Star Micronics printer** — one of the supported models listed above
2. **An ethernet (LAN) cable** — for connecting the printer to your router
3. **A router with internet access** — the printer connects to storekit via the cloud
4. **The Star Quick Setup Utility app** on your phone or tablet:
* [iOS (iPhone/iPad)](https://apps.apple.com/us/app/star-quick-setup-utility/id1549088652)
* [Android](https://play.google.com/store/apps/details?id=com.starmicronics.starquicksetuputility)
## Before You Start
Run through this checklist to avoid common setup problems:
Connect one end of the ethernet cable to the printer's LAN port and the other end to a spare port on your router (or network switch).
Plug in the power cable and switch the printer on. You should see a blue or green light on the front panel.
Make sure the device running the Star Quick Setup Utility is connected to the same WiFi network that your router provides — not a guest network or mobile data.
If your router is far from where you want the printer, use a long ethernet cable, a network switch, or a 4G router with a LAN port placed near the printer.
## Setup Steps
Your Star printer must be connected to your router via an ethernet (LAN) cable for reliable cloud printing. WiFi-only setups are not recommended and may fail to connect. A USB connection to a till, laptop or tablet does not connect the printer to storekit — orders are fetched from the cloud over your network, never over USB. Ensure you have a LAN cable available before starting setup. If your router is not near the printer, use a long LAN cable, network switch, or a 4G router with a LAN port.
### Step 1: Connect Printer via Ethernet (LAN Cable)
1. Plug one end of the ethernet cable into the **LAN port** on the back of your printer
2. Plug the other end into a spare port on your router
3. Power on your printer — wait for the light to turn blue or green
4. Open the **Star Quick Setup Utility** app on your phone or tablet
5. Select your printer model from the list
6. Follow the on-screen prompts to finish the network connection
The printer must be on the same WiFi network as your venue's internet connection. Guest networks or networks with client isolation may not work.
### Step 2: Get the MAC Address
The MAC address is a unique identifier for your printer. You'll need it to register the printer with storekit.
**To perform a self-print test:**
1. Turn off the printer
2. Hold down the **FEED** button
3. While holding FEED, turn the printer back on
4. Release the button when the test page starts printing
The MAC address is printed on the test page in the format `00:11:62:XX:XX:XX`.
storekit identifies a directly connected printer by its MAC address. There is no printer IP field in the dashboard, and storekit does not store the printer's IP address. Your router assigns the IP; use a DHCP reservation in the router if it must stay fixed. If a POS drives the printer, its IP is configured in that POS's back office, not in storekit — ask your POS account administrator or POS support if you cannot access it.
For detailed self-print instructions for your specific model, see the [Star Micronics documentation](https://www.star-m.jp/products/s_print/mcprint3/manual/en/basicOperations/testPrint.htm).
### Step 3: Add Printer in storekit
1. Open your [storekit dashboard](https://dashboard.storekit.com)
2. Go to **Stores** → your store → **Settings** → **Direct Printing**
3. Click **Connect new printer**
4. Select your printer model
5. Enter a name (e.g., "Kitchen Printer", "Bar Printer")
6. Enter the MAC address from the test print under **MAC Address**
7. Configure your print settings (see below)
8. Click **Add printer**
The printer will appear as "Pending confirmation" until it successfully connects to storekit's cloud print service.
### Step 4: Confirm Connection
Once the printer connects:
1. Click **Connect printer** next to the pending printer
2. The printer will print a confirmation receipt. If it does not, click **Send again** on the **Confirmation code** screen
3. Enter the code from the receipt under **Confirmation code**, then click **Confirm printer**
4. Status will change to **Online**
You can click the printer icon anytime to send a test print.
## Printer Settings
| Setting | Options | Description |
| ------------------------ | -------------- | --------------------------------- |
| **Name** | Text | Display name shown in dashboard |
| **Text size** | Medium / Large | Font size on printed tickets |
| **Print item prices** | On / Off | Show prices for each item |
| **Print admin comments** | On / Off | Include internal notes on tickets |
| **Auto / Manual print** | Auto / Manual | When to print (see below) |
| **Copies** | 1-4 | Number of copies per order |
| **Buffer** | 0-720 minutes | Delay for pre-orders |
## Auto vs Manual Printing
### Auto Print
Orders print automatically as soon as they're placed, whether or not you have accepted them yet. Pre-orders print at the scheduled time minus the printer's **Buffer**, or immediately if the buffer is 0. Best for:
* High-volume venues
* Kitchens that work from printed tickets
* Reducing manual steps in order flow
### Manual Print
Orders only print when you click **Print** on the order in the dashboard. Best for:
* Low-volume venues
* When you prefer to review orders on screen first
* Venues using tablets as the primary order display
Accepting an order never triggers a print in either mode. For how printing and **Auto Accept** combine, see [Auto vs Manual Printing](/docs/guides/printing/auto-vs-manual).
## Pre-Order Buffer
The buffer setting delays printing for pre-orders until closer to the collection/delivery time.
**Example:** A customer places an order at 10am for 2pm collection.
* **Buffer = 0**: Prints immediately at 10am
* **Buffer = 30**: Prints at 1:30pm (30 minutes before collection)
* **Buffer = 60**: Prints at 1pm (60 minutes before collection)
A 30-60 minute buffer works well for most kitchens - long enough to prepare the order, short enough that tickets don't pile up.
If pre-orders aren't printing as expected, see the [Pre-Order Printing troubleshooting guide](/docs/guides/printing/troubleshooting#pre-order-printing) for common issues and solutions.
## Printer Status
The dashboard shows real-time printer status:
* 🟢 **Online** - Printer connected and ready
* 🔴 **Offline** - Printer not reachable
If a printer shows offline:
1. Check the printer is powered on
2. Verify it's connected to WiFi (check printer's network light)
3. Ensure the printer is on the same network as when it was set up
4. Try power cycling the printer
## Common Issues
| Problem | What to Check |
| ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Printer not found in the app** | Ensure the ethernet cable is firmly plugged in at both ends (printer and router). Confirm your router has internet — try loading a webpage on your phone. Make sure your phone is on the same network as the router. |
| **Test receipt not printing** | Check that paper is loaded correctly and the paper cover is fully closed. Open the cover, reseat the roll, and close until it clicks. |
| **Printer showing a red light** | A steady red light means the cover is open; a flashing red light means out of paper. Paper jams can also cause a red light. Open the cover, clear any jammed paper, reload the roll, and close the cover firmly. |
| **Printer stuck on "Pending confirmation"** | The printer hasn't reached storekit's cloud yet. Verify the ethernet cable connection and that your router has internet access. Power cycle the printer and wait 2 minutes. |
For more advanced troubleshooting — including LED status codes, network diagnostics, and pre-order printing issues — see the full [Printer Troubleshooting Guide](/docs/guides/printing/troubleshooting).
## Need Help?
If you've tried the steps above and your printer still isn't working, our support team can walk you through it over the phone.
Call **020 3318 9890** — available 8 AM – 1 AM GMT, 7 days a week.
# Split Printing
Source: https://storekit.com/docs/guides/printing/split-printing
Route storekit order items to different printers based on menu category. Send drinks to the bar printer and food to the kitchen for faster service.
Split printing sends different parts of an order to different printers. This is essential for venues where drinks are prepared at the bar and food is prepared in the kitchen.
## How It Works
When an order comes in containing items from multiple categories:
* **Drinks** print at the bar printer
* **Food** prints at the kitchen printer
* **Desserts** print at the pastry station
Each printer only receives the items relevant to that station, reducing confusion and speeding up preparation.
Split printing requires two or more connected printers. See [Printer Setup](/docs/guides/printing/printer-setup) to connect additional printers.
## Setting Up Split Printing
### Step 1: Connect Multiple Printers
Before configuring split printing, ensure you have at least two printers connected:
1. Open your [storekit dashboard](https://dashboard.storekit.com)
2. Select your store
3. Go to **Settings** → **Direct Printing**
4. Verify you have two or more printers showing as **Online**
If you only have one printer, [add another printer](/docs/guides/printing/printer-setup) first.
### Step 2: Assign Categories to Printers
1. Go to **Menu** in your dashboard
2. Click on a category (e.g., "Drinks")
3. Select the **Printing** tab
4. Tick the printer(s) that should receive orders from this category
5. Click **Save changes**
6. Repeat for each category
### Example Setup
| Category | Printer |
| ---------------- | ------- |
| Starters | Kitchen |
| Mains | Kitchen |
| Desserts | Kitchen |
| Soft Drinks | Bar |
| Alcoholic Drinks | Bar |
| Coffee | Bar |
## Default Behaviour
**No printers assigned to category:** The category prints to **all** printers. Every printer receives items from that category.
**Printers assigned to category:** The category **only** prints to the assigned printer(s).
You only need to configure categories you want to route to specific printers. Leave other categories unconfigured and they'll continue printing to all printers.
## Common Setups
### Restaurant (Kitchen + Bar)
| Category | Printer |
| -------------------- | --------------- |
| All food categories | Kitchen Printer |
| All drink categories | Bar Printer |
### Cafe (Kitchen + Coffee Station)
| Category | Printer |
| ----------------------- | --------------- |
| Food, Pastries | Kitchen Printer |
| Hot Drinks, Cold Drinks | Coffee Station |
### Large Kitchen (Multiple Stations)
| Category | Printer |
| ---------------- | -------------- |
| Starters, Salads | Cold Station |
| Mains, Sides | Hot Station |
| Desserts | Pastry Station |
| Drinks | Bar |
## Printing to Multiple Printers
A category can be assigned to multiple printers. This is useful when:
* You want a **master copy** at a pass/expediting station
* Multiple stations prepare items from the same category
* You need backup copies for busy periods
To print a category to multiple printers, simply tick multiple printers in the category's Printing settings.
## Tips
**Start simple.** Begin with two printers (kitchen + bar) and add more stations as needed. It's easier to add complexity than to debug a complicated setup.
* **Label your printers clearly** - Use descriptive names like "Kitchen" and "Bar" rather than "Printer 1" and "Printer 2"
* **Test after setup** - Place a test order with items from different categories to verify routing
* **Check all categories** - Make sure every category is assigned to at least one printer
* **Consider expediting** - Some venues assign all categories to a "Pass" printer for the expeditor
# Troubleshoot Star printer connectivity and order printing
Source: https://storekit.com/docs/guides/printing/troubleshooting
Diagnose and fix common storekit printing problems with the interactive troubleshooter. Reference Star printer LED status codes for connectivity issues.
## Diagnostic Tool
Answer a few questions to diagnose your issue:
***
## LED Indicators
Star printers have LED indicators that show printer status:
| LED | Status | Meaning |
| ----------- | -------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| **Power** | Steady blue | Printer is on and working |
| **Power** | Off | No power - check connections |
| **Network** | Steady green | Connected to network |
| **Network** | Flashing green | Trying to connect to network |
| **Network** | Off | No network connection |
| **Error** | Steady red | Printer cover is open |
| **Error** | Flashing red | Out of paper |
| **Network** | Off, USB cable plugged into a computer | Not connected to storekit - USB is not supported, see [Printer is connected by USB](#printer-is-connected-by-usb) |
Bluetooth and USB connections are not supported by storekit. A CloudPRNT printer must connect to the venue network through WiFi or ethernet. If the printer works over Bluetooth with another device, that does not confirm its storekit connection is working.
## Quick Power Cycle
If your printer has steady blue and green lights but isn't printing, try a power cycle:
1. Turn the printer off
2. Unplug the power cord from the wall
3. Wait 30 seconds
4. Plug back in and turn on
If queued orders start printing, the printer is back online.
## Connection Issues
### Power LED is off
* Check the power cable is connected to both the printer and wall outlet
* Disconnect and reconnect the power cable
* Try a different power outlet
* Press the power button - it should show a steady blue light
### Network LED is off or flashing
1. Power off the printer
2. Check the ethernet cable connection to your router (or WiFi signal strength)
3. Disconnect and reconnect the network cable
4. Power on the printer
5. If still flashing, check your internet connection is working
No network connection = no orders printed. Always ensure your router is online and the printer is properly connected.
### Printer is connected by USB
storekit prints through Star CloudPRNT: the printer fetches its jobs from the cloud over your venue's internet connection. A USB cable to a laptop, till or tablet does not connect the printer to storekit, so a USB-only printer shows no tickets even though its Power LED is on and the computer can see it.
1. Unplug the USB cable from the computer
2. Connect the printer's **LAN** port to your router with an ethernet cable
3. Power the printer off and on again
4. Confirm the Network LED shows steady green
5. Go to **Stores** → your store → **Settings** → **Direct Printing** and send a test print
### BT Routers
BT (British Telecom) has rolled out a network policy that can block the connection between BT routers and the storekit cloud printing service. This affects many BT Hub and BT Smart Hub models.
**Symptoms:**
* Printer shows **online** in the dashboard but orders intermittently stop printing
* Power-cycling the printer temporarily fixes it, but the issue recurs — often within hours
* Test prints may work fine, then real orders fail to print shortly after
**Workarounds (in priority order):**
Connect the printer to a **5G mobile router** instead of the BT router. This bypasses BT's network filtering entirely and is the most reliable fix. You'll need a 5G router and a SIM card with a data plan — the printer uses very little data, so a small plan is sufficient.
Connect the printer to the BT router via an **ethernet cable** rather than WiFi. Wired connections are more stable and less affected by BT's network management features.
Log in to the BT Hub admin page (usually at `192.168.1.254`) and whitelist the printer's MAC address. This prevents the router from deprioritising or blocking the printer's connection. You can find the printer's MAC address on the network status printout (hold the **FEED** button while powering on).
**Additional BT router tips:**
* **Disable Smart Setup / Complete Wi-Fi** — this feature can interfere with printer connections by automatically moving devices between bands or access points. Turn it off in your BT router admin panel under **Advanced Settings** → **Wireless**
* **Power-cycle the printer** (off, unplug for 30 seconds, plug back in) to temporarily restore printing while you apply one of the fixes above
* If none of the above resolves the issue, consider replacing the BT router with a non-BT router for the network the printer connects to
For general printer setup steps, see the [printer setup guide](/docs/guides/printing/printer-setup).
## Orders Not Printing
### Printer shows online but orders don't print
* Check the printer is set to **Auto print**. A **Manual print** printer never prints on its own — it only prints when you click **Print** on the order. Printing does not depend on **Auto Accept**: an **Auto print** printer prints when the order is placed, whether or not it has been accepted. See [Auto vs Manual Printing](/docs/guides/printing/auto-vs-manual).
* Check the **buffer setting** isn't delaying pre-orders
* Verify the printer is assigned to the relevant categories (for split printing)
* Try sending a test print from the dashboard
### Some items not printing
* For split printing: check the category is assigned to an online printer
* Ensure the printer has paper
* Place a test order to confirm routing
### Customer order notes missing from tickets
The order prints, but the customer's note (allergy, preparation request, delivery instruction) is not on the kitchen or bar ticket:
1. Check order notes are switched on — go to **Stores** → \[your store] → **Settings** → **Operations** → **Order Notes** and set it to **Optional** or **Mandatory**. **Hidden** removes the note field from checkout entirely.
2. If you use order batching, turn on **Include order notes** — under **Order batching** → **Merged ticket contents** on the same page. When batching is on and this toggle is off, notes are stripped from the merged ticket even though they still show on the order in the dashboard. See [Customer notes on batched tickets](/docs/guides/orders/advanced/order-batching#customer-notes-on-batched-tickets).
3. For Zonal (Aztec), set an **Order Note Product ID** — Zonal only accepts notes as a line item, so without it the note never reaches the POS or its tickets. See [Zonal order notes](/docs/guides/integrations/pos/zonal#order-notes).
4. Note that the **Print admin comments** toggle in printer settings controls admin comments added in the dashboard, not customer order notes.
A general order note isn't tied to an item, so it prints on every station ticket generated for that order — a printer that receives none of the order's items prints no ticket at all.
### Delayed Printing
If orders are printing but arriving later than expected, work through this checklist:
1. Check if order batching is enabled — go to **Stores** → \[your store] → **Settings** → **Operations** → **Order batching** and check the **Batch timeout** value (1–5 minutes). Turn off **Enable order batching** to send every order straight to the kitchen. See the [Order Batching guide](/docs/guides/orders/advanced/order-batching) for more details.
2. **Check the Pre-Order Buffer** in your printer settings — a non-zero buffer delays printing for pre-orders.
3. **Check your internet provider** — slow or unreliable connections can delay order delivery to the printer (see [BT Routers](#bt-routers) above).
## Intermittent Printing (Works Sometimes, Then Stops)
If your printer works for a while then randomly stops printing — and resumes after a power cycle — this is usually a **network stability issue**, not a printer hardware problem. Your router may be dropping the printer's connection periodically.
### Diagnose the issue
1. **Check your router's DHCP lease time** — short lease times can cause the printer to lose its IP address. Set the lease time to **24 hours** or longer in your router's admin panel
2. **Assign a static IP to the printer** — this prevents the router from reassigning the printer's address:
* Find the printer's current IP address on the network status printout (hold the **FEED** button while powering on)
* Open your router's admin panel and reserve that IP for the printer's MAC address
3. **Whitelist the printer's MAC address** in your router settings to prevent the router from deprioritising or disconnecting it
4. **Check for WiFi interference** — move the printer closer to the router or switch to an ethernet connection
Use the free **Star Quick Setup Utility** app ([iOS](https://apps.apple.com/app/star-quick-setup-utility/id1549088652) / [Android](https://play.google.com/store/apps/details?id=com.starmicronics.starquicksetup)) to verify your printer's network connection status and view its current IP address, signal strength, and connection type.
If you're using a BT router, see the [BT Routers](#bt-routers) section — BT has a network policy that commonly causes intermittent printing failures.
## Multiple Networks / Router Switching
If your printer works on one router but stops working when you switch to a different router or network, the issue is almost always a **network configuration mismatch** between the two routers. Even if both networks have internet access, differences in how they handle local traffic can break printer communication.
### Why this happens
| Cause | Explanation |
| --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Different subnets** | If the printer is on `192.168.1.x` but your device is on `192.168.0.x`, they can't see each other — even if both are connected to the same physical router |
| **AP isolation (client isolation)** | Many routers enable AP isolation by default, which prevents devices on the same WiFi network from communicating with each other. This blocks the device-to-printer connection |
| **Firewall rules blocking print ports** | Some routers block traffic on port **9100** (RAW printing) or port **515** (LPR/LPD) by default, preventing print jobs from reaching the printer |
### Step-by-step fix
Check the printer's IP address by holding the **FEED** button while powering on to print a network status sheet. Then check your device's IP address in its WiFi/network settings. Both should share the same first three octets (e.g. both on `192.168.1.x`). If they differ, connect both to the same router or VLAN.
Log in to your router's admin panel and look for **AP Isolation**, **Client Isolation**, or **Wireless Isolation** (usually under **Wireless** → **Advanced Settings**). Turn it off so devices on the same network can communicate with each other. Save and restart the router.
In your router's admin panel, check the firewall or access control settings for any rules blocking the printer's IP address or ports **9100** and **515**. Add an exception for the printer's IP if needed. Some routers label this under **Port Filtering** or **Access Control**.
After switching routers, the printer may receive a new IP address via DHCP. Reserve the printer's IP in the new router's DHCP settings to prevent it from changing. See [Intermittent Printing](#intermittent-printing-works-sometimes-then-stops) for detailed steps.
### Star Micronics cloud printers
Star Micronics cloud printers (used with storekit's cloud printing service) require an outbound internet connection to receive orders — they don't rely on local network printing alone. When moving to a new network, the printer must be able to reach Star's cloud servers.
If the printer's Network LED shows steady green but orders aren't printing on the new network, the router may be blocking outbound traffic to Star's servers.
Confirm the printer can reach **`*.starmicronics.com`** on **port 443** (HTTPS) from the new network:
1. Check the router isn't using a restrictive outbound firewall or content filter that blocks unknown domains
2. If your router has a whitelist/allowlist mode, add `*.starmicronics.com` on port 443
3. Ensure DNS resolution is working — the printer needs to resolve Star's hostnames. Try using a public DNS server (e.g. `8.8.8.8`) in the router's WAN settings if the default DNS is unreliable
Use the **Star Quick Setup Utility** app ([iOS](https://apps.apple.com/app/star-quick-setup-utility/id1549088652) / [Android](https://play.google.com/store/apps/details?id=com.starmicronics.starquicksetup)) to verify the printer's connection status after moving it to a new network. If the app can see the printer but orders don't flow, the issue is likely an outbound firewall rule.
### BT router users
If the new router is a BT Hub or BT Smart Hub, you may also be affected by BT's network policy that blocks cloud printing connections. See the [BT Routers](#bt-routers) section above for specific workarounds including using a separate mobile router, switching to ethernet, and whitelisting the printer's MAC address.
## Split Printing Issues
### Items printing on all printers
The category hasn't been assigned to specific printers. Go to **Menu** → select the category → **Printing** tab and tick only the printer(s) you want.
### Items printing on wrong printer
* Review the category's Printing settings
* Untick printers you don't want receiving that category
## Print Quality Issues
### Faded or light printing
* Check paper is loaded correctly (thermal side facing out)
* Clean the print head with isopropyl alcohol
* Replace paper roll if old or stored in humid conditions
### Text too small
Try the **Large** text size setting in your printer settings.
## Factory Reset
Only factory reset as a last resort. The printer will need to be set up from scratch.
If nothing else works:
**Step 1: Delete the printer from storekit**
1. Go to your [storekit dashboard](https://dashboard.storekit.com)
2. Navigate to **Stores** → your store → **Settings** → **Direct Printing**
3. Click the trashcan icon next to the printer to delete it
**Step 2: Reset the printer**
1. Turn the printer off
2. Insert a pen into the **RESET** hole on the back of the printer
3. While holding the RESET button, press and release the **POWER** button
4. Continue holding RESET until the green Network LED flashes
5. Release the RESET button
6. Press the **FEED** button to select the LAN interface
7. Hold down FEED to confirm
8. The printer resets to factory defaults
**Step 3: Set up again**
[Set up the printer again](/docs/guides/printing/printer-setup) from the beginning.
## Email Notifications
storekit automatically sends email notifications when your printers go offline or come back online, helping you stay informed about printer status.
### Printer Offline Notifications
When a printer fails to check in for 5 minutes, you'll receive an email that includes:
* **Printer details** - Printer name, model, and MAC address
* **Offline timestamp** - When the printer went offline
* **Quick actions** - Direct link to view printer status in your dashboard
### Printer Online Notifications
When a printer reconnects after being offline for at least 5 minutes, you'll receive a confirmation email with:
* **Printer details** - Printer name and model
* **Online timestamp** - When the printer reconnected
* **Status confirmation** - Verification that the printer is ready to receive orders
### Ensuring You Receive Notifications
Make sure your venue email address is configured correctly:
1. Go to **Stores** → your store → **Settings** → **General**
2. Verify your email address is correct
3. Add multiple email addresses if needed (the first address will receive notifications)
Printer status notifications help you catch connectivity issues before they impact order fulfillment. If you receive an offline notification, check your printer's power and network connection immediately.
## Pre-Order Printing
Pre-order tickets differ from live order tickets — they print at a **scheduled time** based on your buffer setting, not immediately when the order is placed. For example, a pre-order placed at 10am for 2pm collection with a 30-minute buffer will print at 1:30pm.
See [Pre-Order Buffer](/docs/guides/printing/printer-setup#pre-order-buffer) for how to configure this timing.
### Pre-orders aren't printing
Go to **Stores** → your store → **Settings** → **Direct Printing** → select your printer → check the **Buffer** value. A non-zero buffer delays printing until closer to the fulfillment time. Set to `0` if you want pre-orders to print immediately.
Pre-orders print when the buffer window is reached — if the printer is offline at that moment, the ticket won't print. Check your [printer status notifications](#email-notifications) for any offline alerts around the expected print time.
### Pre-order ticket shows wrong date/time
* **Check timezone settings** — go to **Stores** → your store → **Settings** → **General** and verify the timezone matches your venue's physical location. An incorrect timezone will offset all printed times.
## Test Print Issues
### The confirmation code is rejected
The dashboard shows **Incorrect code** and “Sorry, the code you have provided is incorrect. Please try again.” A common cause is that the confirmation receipt came from a printer whose MAC address does not match the pending printer in storekit.
Go to **Stores** → your store → **Settings** → **Direct Printing**. Re-run the printer self-print by switching it off, holding **FEED**, and switching it on. Compare the MAC address on that ticket character-for-character with the MAC shown for the pending printer on the **Direct Printing** page. A replacement printer or a second printer on the bench is a common reason for a mismatch.
Select the delete icon beside the pending printer and confirm **Disconnect Printer**. Click **Connect new printer**, enter the MAC from the new self-print under **MAC Address**, then click **Add printer**. A pending printer's MAC address cannot be edited.
In the printer's CloudPRNT settings, make sure the server URL is exactly `https://print.api.storekit.com/print`, with no leading or trailing space.
On the **Direct Printing** page, click **Connect printer**. If the confirmation receipt does not print, click **Send again** on the **Confirmation code** screen. Enter the new receipt code and click **Confirm printer**.
### Test print works but real orders don't print
For split printing, go to **Menu** → select the category → **Printing** tab and verify the category is assigned to the correct printer. A test print bypasses category assignment, so it can succeed even when categories aren't linked to the printer.
If the printer is set to **Manual print**, orders won't print until you click **Print** on the order in the dashboard. Switch to **Auto print** if you want orders to print automatically when they are placed. Accepting an order does not trigger a print in either mode — see [Auto vs Manual Printing](/docs/guides/printing/auto-vs-manual).
### Test print fails
Turn the printer off, unplug the power cord, wait 30 seconds, then plug back in and turn on. See [Quick Power Cycle](#quick-power-cycle).
Verify the ethernet cable is firmly connected to the printer's **LAN** port and your router, and confirm the Network LED shows a steady green light. A USB cable to a computer does not connect the printer to storekit. See [Connection Issues](#connection-issues).
Go to **Stores** → your store → **Settings** → **Direct Printing** and confirm the printer appears and shows as **Online**. If it's missing, [add it again](/docs/guides/printing/printer-setup#step-3-add-printer-in-storekit).
## Still Having Issues?
1. Send a test print from the dashboard to confirm connectivity
2. Note any error lights or messages
3. Check for printer status email notifications
4. [Contact storekit support](/docs/getting-started/contact-support) with your store name and description of the issue
# storekit documentation: online ordering guides and APIs
Source: https://storekit.com/docs/index
Launch and grow online ordering with storekit. Guides for menu setup, payments, fulfillment, integrations, webhooks, and developer APIs.
# How can we help?
Everything you need to set up online ordering, manage your menu, accept payments, and grow your hospitality business.
# Set up and change your storekit payout bank account
Source: https://storekit.com/docs/payouts/bank-accounts
Add and manage your storekit payout bank account, with format requirements for UK, European IBAN, and US ACH accounts. Where customer payments arrive.
Your payout bank account is where storekit sends your funds. This guide explains how to set up and change your bank account.
## Setting Up Your Bank Account
Your bank account is set up during the [storekit Payments onboarding process](/docs/guides/payments/storekit-payments-setup). You'll need to provide:
**For UK accounts:**
* Account holder name
* Sort code
* Account number
**For European accounts:**
* Account holder name
* IBAN
* BIC/SWIFT code
**For US accounts:**
* Account holder name
* Routing number
* Account number
## Bank Account Requirements
Your payout bank account must:
* Be in the name of the business (for companies) or the individual (for sole traders)
* Accept incoming payments
* Be located in a supported country
We cannot pay out to third-party accounts. The account holder name must match your business or personal name exactly.
## Changing Your Bank Account
For security reasons, there is no way to change your payout bank account in the dashboard. **Stores** → your store → **Settings** → **Payments** shows your account status and an **Edit account setup** button for your business and identity details, but bank changes go through our support team.
To change your payout bank account:
A bank statement or a bank welcome letter for the new account, dated within the last 12 months, showing all of:
* Account holder name (your business or your own name — see [Bank Account Requirements](#bank-account-requirements))
* Account number and sort code for UK accounts, IBAN for European accounts, or routing and account numbers for US accounts
* The bank's logo
Send the document, together with the exact name of the store as it appears under **Stores**, through the chat in your dashboard or by email to [cs@storekit.com](mailto:cs@storekit.com). The request must come from an authorised user of the storekit account — we do not act on requests from anyone else.
Our team verifies the document and updates the account. Payouts are paused while the new account is verified — see the [Verification Timeline](/docs/payouts/overview#verification-timeline) for how long this takes. You'll receive confirmation once the update is complete.
Send the proof before your old account closes so funds are not held up.
## Multiple Stores
If you operate multiple stores, you can set up different payout accounts for each store. However, all accounts must belong to the same legal entity that owns that store.
If your stores are operated by different legal entities (e.g., separate companies), each store can be connected to its own entity with its own bank account. [Contact support](/docs/getting-started/contact-support) to set this up.
When changing bank accounts across several stores, send one proof document per legal entity or bank account, and list every store each account applies to, using the exact store names shown under **Stores** in your dashboard. Stores that are not named in the request are not updated.
## Verification
When you add or change a bank account, we may need to verify it. This can include:
* **Bank statement** - A recent statement showing the account holder name
* **Instant verification** - Connecting via your bank's secure login (where available)
During verification, payouts are paused and funds accumulate until the new account is confirmed. For full details on verification timing, what happens to pending payouts, and how to check your status, see the [Verification Timeline](/docs/payouts/overview#verification-timeline).
## Troubleshooting
### Payout Failed
If a payout fails, check that:
* Your bank account details are correct
* The account is still active and accepts incoming payments
* The account holder name matches your business/personal name
### Account Rejected
If your bank account is rejected during setup:
* Verify all details are entered correctly
* Ensure the account is in your name (not a third party)
* Try a different account if you have one
For further assistance, [contact support](/docs/getting-started/contact-support).
# How storekit payouts work: timing, fees, and verification
Source: https://storekit.com/docs/payouts/overview
Understand how storekit transfers collected order payments to your bank account. Covers payout requirements, timing, fees, and settlement reconciliation.
Payouts transfer the funds you've collected from customer orders to your bank account. This guide explains how payouts work and what to expect.
## How Payouts Work
When customers pay for orders, the funds are collected by storekit Payments. These funds are then paid out to your registered bank account according to your [payout schedule](/docs/payouts/payout-schedule).
Each payout includes:
* **Order payments** - Funds collected from completed orders
* **Refunds** - Any refunds issued are deducted from your payout
* **Fees** - Processing fees are deducted automatically
## Payout Requirements
To receive payouts, you must:
1. **Complete verification** - Your storekit Payments account must be fully verified
2. **Have a valid bank account** - A verified bank account must be connected
3. **Have a positive balance** - Funds must be available after deducting refunds and fees
## Viewing Your Payouts
You can view your payout history in **Analytics** → **Accounting** → **Payouts**. There is no payouts page under **Stores** → your store → **Settings** → **Payments**. Each payout shows:
| Column | Description |
| ------------------------- | ----------------------------------------------------------------------------- |
| **Amount** | Net amount paid to your bank |
| **Bank Account** | The account the payout was sent to |
| **Store** | The store the payout relates to |
| **Status** | The payment provider's status for the transfer, or `N/A` if none was returned |
| **Created** | When the payout was created |
| **Estimated Arrival** | When the bank is expected to credit the money |
| **Statement Description** | The description attached to the transfer |
| **ID** | The transfer ID, for support enquiries |
If a payout you expected is missing or late, see [A Payout Hasn't Arrived](/docs/guides/reports/fee-report#a-payout-hasnt-arrived).
## Minimum Payout Amount
There is no minimum payout amount. However, if your balance is negative (due to refunds exceeding sales), the payout will be held until your balance is positive.
## Verification Timeline
When you update your bank account or payment details, a verification period is required before payouts resume to the new account.
### What Triggers Verification
Verification is triggered when you:
* Add a new bank account during onboarding
* Change your payout bank account details
* Update business or identity information linked to your payment account
### What Happens During Verification
During the verification period:
* **Payouts are paused** — No payouts are sent while verification is in progress
* **Funds continue to accumulate** — Customer payments are still collected and held securely in your account balance
* **Queued payouts are released** — Once verification completes, all accumulated funds are paid out according to your normal [payout schedule](/docs/payouts/payout-schedule)
Verification typically takes **1–3 business days**. In some cases — such as when additional documentation is requested — it may take longer.
### What to Expect After Changing Payment Details
#### When the new account becomes active
Your new bank account becomes active as soon as verification is complete. You will receive a confirmation, and the next scheduled payout will be sent to the updated account.
#### Whether pending payouts transfer to the new account
Yes. Any payouts that accumulated during the verification period are sent to the **new** bank account once it is verified. No funds are sent to the previous account after the change is processed.
#### How to check verification status
You can check your verification status in **Store Settings > Payments**. The status will show one of:
| Status | Meaning |
| ------------------- | ----------------------------------------------- |
| **Pending** | Verification is in progress |
| **Action required** | Additional information or documents are needed |
| **Verified** | Verification is complete and payouts are active |
If your status shows **Action required**, follow the prompts in your dashboard or [contact support](/docs/getting-started/contact-support) for guidance.
If verification is not completed promptly, payouts will remain paused. Ensure any requested documents — such as a bank statement — are submitted as soon as possible to avoid delays.
For more detail on how refunds interact with payouts during a verification hold, see the [Refunds & Payouts guide](/docs/guides/payments/refunds-payouts).
## Next Steps
* [Payout Schedule](/docs/payouts/payout-schedule) - Understand when you'll receive payouts
* [Bank Accounts](/docs/payouts/bank-accounts) - Manage your payout bank account
* [Refunds & Payouts](/docs/guides/payments/refunds-payouts) - Learn how refunds affect your payouts
# Payout Schedule
Source: https://storekit.com/docs/payouts/payout-schedule
Learn the default daily settlement schedule for storekit payouts, the timing of bank transfers, and the alternative weekly or monthly payout frequency options.
Your payout schedule determines how often funds are transferred to your bank account. This guide explains the default schedule and available options.
## Default Schedule
By default, payouts are made **daily on business days** with a **T+2 settlement period**.
This means:
* Funds from Monday's orders are paid out on Wednesday
* Funds from Tuesday's orders are paid out on Thursday
* Funds from Friday's orders are paid out on the following Tuesday (skipping the weekend)
**T+2** means funds are paid out two business days after the transaction date. This is standard for card payments and allows time for transaction processing and fraud checks.
## Payout Time
Payouts are initiated at **5:00 AM local time** each business day. Depending on your bank, funds typically arrive in your account within a few hours.
## Alternative Schedules
If daily payouts don't suit your business, you can request an alternative schedule:
| Schedule | Description | Best For |
| ------------------- | ------------------------- | ---------------------------------- |
| **Daily** (default) | Payout every business day | Most businesses - steady cash flow |
| **Weekly** | Payout once per week | Simplified reconciliation |
| **Monthly** | Payout once per month | Accounting alignment |
Weekly payouts are typically made on Mondays. Monthly payouts are typically made on the 1st business day of each month.
## Requesting a Schedule Change
To change your payout schedule or payout time, [contact support](/docs/getting-started/contact-support).
Please include:
* Your store name
* Preferred schedule (daily, weekly, or monthly)
* Preferred payout time (if different from 5:00 AM)
## Public Holidays
Payouts are not processed on public holidays in your country. If a scheduled payout falls on a public holiday, it will be processed on the next business day.
## Delayed Payouts
Payouts may be delayed if:
* Your account verification is incomplete
* Your bank account details are incorrect
* There's a negative balance due to refunds
* Additional review is required for large transactions
If your payout is delayed, check your verification status in **Store Settings > Payments** or [contact support](/docs/getting-started/contact-support).
# Dashboard Language
Source: https://storekit.com/docs/guides/account/dashboard-language
Change the display language of the storekit admin dashboard so you and your team can work in the language you prefer. Per-user setting, no impact on customers.
You can change the language of your storekit dashboard to match your preference.
## Changing Your Dashboard Language
1. Go to your [storekit dashboard](https://dashboard.storekit.com)
2. Click your profile in the bottom-left sidebar
3. Go to **Profile**
4. Find the **Language** dropdown
5. Select your preferred language
6. Changes save automatically
## Supported Languages
The storekit dashboard is available in:
* English
* Español (Spanish)
* Español - Latinoamérica (Latin American Spanish)
* Français (French)
* Deutsch (German)
* Nederlands (Dutch)
* Italiano (Italian)
* Português (Portuguese)
* Polski (Polish)
* Svenska (Swedish)
* Norsk (Norwegian)
* Dansk (Danish)
* Suomi (Finnish)
* Eesti (Estonian)
* Magyar (Hungarian)
* Slovenčina (Slovak)
* Srpski (Serbian)
* Türkçe (Turkish)
* Українська (Ukrainian)
* Ελληνικά (Greek)
* Afrikaans
* 中文 简体 (Simplified Chinese)
* 中文 繁體 (Traditional Chinese)
## Dashboard Language vs Store Language
| Setting | What it affects |
| ---------------------- | ------------------------------------------------ |
| **Dashboard language** | The admin interface you use to manage your store |
| **Store language** | What your customers see when ordering |
These are independent settings. You can manage your store in German while your customers order in English, for example.
See [Translations](/docs/guides/store-settings/translations) to configure your customer-facing store language.
## Per-User Setting
Dashboard language is set per user. Each team member can choose their own preferred language without affecting others.
## Timezone
You can also set your timezone in the Profile settings. This affects how times are displayed throughout the dashboard.
# Account Structure
Source: https://storekit.com/docs/guides/account/overview
Understand the account, brand, and store hierarchy in storekit. Each store has its own menu, hours, and settings, all rolled up under a single owner account.
storekit uses a simple hierarchy to organise your business:
```
Account (your business)
├── Store 1
├── Store 2
└── Store 3
```
## Account
Your account is the top level and represents your business. It contains:
* All your stores (venues)
* Team members
* Account-wide settings
## Stores
Each store is a separate ordering destination with its own:
* Menu and pricing
* Opening hours
* Fulfillment options (delivery, pickup, dine-in)
* Printer configuration
* Payment settings
* Branding
Multi-location businesses should create one store per physical location. Each store gets its own unique ordering URL.
## Switching Between Stores
If you have multiple stores:
1. Click the store selector in the sidebar
2. Select the store you want to manage
3. The dashboard updates to show that store's data
## Which Name Appears Where
storekit keeps several separate names, and each one controls different screens. Changing one does not change the others.
| Name field | Where you change it | Where it appears | Who sees it |
| ----------------- | ------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | ----------------- |
| Account name | Cannot be changed in the dashboard — contact support | The name at the top of the **Dashboard** page, beside the home icon | You and your team |
| **Store name** | **Stores** → the store → **Settings** → **General** | Your store's ordering pages, plus order confirmation emails and payment receipts | Customers |
| **Internal name** | **Stores** → the store → **Settings** → **General** | The store's card on the **Stores** page and the heading above that store's settings pages, replacing the store name wherever it is set | You and your team |
| Brand **Name** | **Brands** → the brand → **Edit Brand** (only on accounts that have **Brands**) | The browser tab title and link previews of the brand's store-selection page | Customers |
The **Store name** field is described in the dashboard as "The name shown to customers on your store", and **Internal name** as "Use a different name in the dashboard to distinguish between stores. Customers will not see this."
## The Name At The Top Of The Dashboard Is The Account Name
The name shown at the top of the **Dashboard** page is your account name — it is not the name of any store. Renaming a store under **Stores** → the store → **Settings** → **General** changes what customers see on that store, but it never changes that heading, so the old business name stays there after you save.
There is no field in the dashboard for editing the account name: the settings navigation has **Profile**, **Members** and **Developers** (and **Brands** on accounts that use brands), with no account page. To change the name at the top of the dashboard, contact support.
## Account Settings
Access account settings by clicking your profile in the bottom-left of the sidebar, then navigating to the settings pages:
* **Profile** - Your personal details, language, and timezone
* **Members** - Manage team members
* **Brands** - Brand settings (if applicable)
# Password Reset
Source: https://storekit.com/docs/guides/account/password-reset
Reset your storekit account password from the login screen, recover access if you've been locked out, and help team members regain access to their accounts.
## Resetting Your Password
If you've forgotten your password:
1. Go to [dashboard.storekit.com/reset](https://dashboard.storekit.com/reset)
2. Enter your email address
3. Click **Send reset email**
4. Check your email for the reset link
5. Click the link and enter your new password
Password reset links expire. If yours has expired, you'll see "Reset timed out, please request a new password reset" - simply request a new link.
## Password Requirements
Your password must be at least 6 characters long.
## Not Receiving Reset Emails?
If the reset email doesn't arrive:
* Check your spam/junk folder
* Verify you're using the correct email address (the one you registered with)
* Wait a few minutes - emails can sometimes be delayed
* Request another reset link
If you still can't access your account, [contact storekit support](/docs/getting-started/contact-support).
## Helping Team Members
If a team member is locked out, ask them to use the **Forgot password?** link on the login page. You cannot reset another user's password for them - each person must reset their own via email.
# Software & Subscription Invoices
Source: https://storekit.com/docs/guides/account/software-invoices
How storekit software and subscription fees are invoiced, where to review charges in the dashboard, and how to request monthly invoices.
Your storekit bill has two separate parts, and they are documented in two different places:
| What you want | Where it comes from |
| --------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| A **VAT receipt for one customer order** | Download it yourself from the order — see [VAT Invoices & Receipts](/docs/guides/orders/vat-invoices) |
| Your **monthly storekit software / subscription invoice** | Issued by storekit's finance team — see below |
This page covers the second one: the invoice for the storekit software itself.
## How Software Fees Are Billed
* Software and subscription fees are invoiced **monthly in arrears** — the invoice for July's fees is issued in August, once the month it covers has ended.
* Depending on your agreement, the fees are either **deducted from your storekit payouts** or **collected by Direct Debit**.
* Payment-processing (transaction) fees are billed separately from software fees. They are taken per transaction as your payouts are settled — see [Fee Report & Daily Summary](/docs/guides/reports/fee-report).
Because software fees are charged in arrears, the amount collected in any given month relates to the **previous** month's usage. When you compare a collection against your own records, check the period the invoice covers rather than the date the money left your account.
A Direct Debit collection looks different from a payout on your bank statement: a payout is a **credit** into your account for a day's net card sales, while a Direct Debit is a **debit** out of your account for the amount of an invoice, and it is not netted against any payout. If you are invoiced separately for more than one store or item, each invoice may be collected as its own debit, so several debits from storekit on the same day are normal — match each one to an invoice rather than to a day's sales. Nothing collected by Direct Debit appears in **Daily Summary** or **All Transactions**.
## There Is No Invoice Download in the Dashboard
The storekit dashboard has no billing, subscription, or invoices page — there is no self-serve button anywhere in the dashboard that downloads your monthly software invoice, and no Subscription entry under **Settings**. The only **Invoice** action in the dashboard is the per-order VAT receipt on an order's **More actions** menu. To get a copy of a software invoice, request it from storekit (see [below](#request-a-copy-of-your-software-invoice)).
## Review the Underlying Charges
You cannot download the software invoice yourself, but you can review the payment activity and processing fees behind your payouts. Both reports live under the **Accounting** section.
In the sidebar, click **Analytics**, then select **Accounting**.
Under the Transactions heading, click **Daily Summary**. Each row shows **Gross Revenue**, **Fees** and **Net Revenue** for a day, so you can see the fees deducted before payout. See [Fee Report & Daily Summary](/docs/guides/reports/fee-report).
Under the same heading, click **All Transactions** for a per-payment log, including the **Fee** charged on each transaction. See [All Transactions Report](/docs/guides/reports/transactions-report).
**Accounting** is only available to accounts with storekit Payments enabled. If you do not see it under **Analytics**, confirm that storekit Payments has been set up for your account in **Stores → \[your store] → Settings → Payments**.
**Daily Summary** and **All Transactions** show **payment-processing fees only**. Neither report includes your software or subscription fee, so the figures there will not add up to your monthly software invoice. Use them to reconcile payouts, not to reconstruct the software bill.
Some accounts also have a **Fee Statements** report in the **Accounting** section, which generates a PDF fee breakdown for a chosen month. It is not enabled for most accounts, so if you cannot see it, that is expected — and it covers payment-processing fees, not software fees, so it is still not your software invoice.
## Request a Copy of Your Software Invoice
Email the finance/accounts team and ask for the invoice for the month you need:
* **[accounts@storekit.com](mailto:accounts@storekit.com)** — billing and invoice queries
* **[cs@storekit.com](mailto:cs@storekit.com)** — general support, if you are not sure who to ask ([other contact options](/docs/getting-started/contact-support))
Include the following so the invoice can be found first time:
* Your **account or business name** and the **store name(s)** it covers
* The **month(s)** you need the invoice for
* The email address the invoice should be sent to
* Whether you need a one-off copy or want invoices emailed each month from now on
## Billing Problems
If a payment for your software fees fails, a red banner appears across the top of the dashboard:
> There's a billing issue with your account, please contact [accounts@storekit.com](mailto:accounts@storekit.com)
Email **[accounts@storekit.com](mailto:accounts@storekit.com)** to resolve it. The banner stays until the account is brought back up to date; it is not something you can clear from the dashboard yourself.
## Related
* [VAT Invoices & Receipts](/docs/guides/orders/vat-invoices) — download a VAT receipt for a single customer order
* [Fee Report & Daily Summary](/docs/guides/reports/fee-report) — reconcile daily revenue, processing fees and payouts
* [All Transactions Report](/docs/guides/reports/transactions-report) — per-transaction payment and fee detail
* [Contact Support](/docs/getting-started/contact-support) — all the ways to reach the team
# Team Members
Source: https://storekit.com/docs/guides/account/users
Invite team members to your storekit account, assign roles like admin or staff, and control which stores and features each user can access from the dashboard.
Invite your team to storekit and control which stores they can access.
## Inviting Team Members
1. Go to your [storekit dashboard](https://dashboard.storekit.com)
2. Click your profile in the bottom-left sidebar
3. Go to **Members**
4. Click **Invite member**
5. Enter their details:
* **Name** (required)
* **Email address** (required)
* **Phone number** (optional)
6. Choose store access:
* **All venues** - Access to every store in your account
* **Specific venues** - Select which stores they can see
7. Click **Invite user**
The team member will receive an email invitation to join your account.
## Access Levels
| Role | Can do |
| ---------- | ------------------------------------------- |
| **Owner** | Full access including removing team members |
| **Member** | Access to assigned stores and features |
Each account must have at least one Owner.
## Store-Level Access
When inviting a user, you can restrict which stores they can access:
* **Grant access to all venues** - They see every store
* **Specific venues** - Select individual stores they can access
Users will only see stores they've been granted access to in the dashboard.
## Changing a Member's Store Access
There is no direct way to edit an existing member's store access from the dashboard. To update which stores a team member can access, remove them and re-invite with the correct access:
1. Go to **Members**
2. Hover over the user and click **Remove**
3. Click **Invite member**
4. Re-enter their details
5. Choose **Specific venues** and tick the stores they should access
6. Click **Invite user**
The member will receive a new invitation email.
To change a member from limited store access to **all stores**, contact support via the chat widget in your dashboard.
## Removing Team Members
Only account Owners can remove team members:
1. Go to **Members**
2. Hover over the user you want to remove
3. Click **Remove**
Removed users immediately lose access. You'll need to re-invite them if needed.
## Email Already In Use
If you see "email already in use" when inviting someone, that email is already registered with storekit. The person may:
* Already have access to your account
* Have their own separate storekit account
Contact them to confirm, or use a different email address.
# Bulk Import Discounts
Source: https://storekit.com/docs/guides/discounts/bulk-import
Upload many storekit discount codes at once with a CSV import. Save time creating large batches of unique codes for partnerships, gift cards, and events.
Bulk import lets you upload multiple discount codes at once using a CSV file. Save time when creating large batches of discounts for promotions, partnerships, or events.
## When to Use Bulk Import
* **Unique single-use codes** - Generate individual codes for a marketing campaign
* **Event-specific promotions** - Create codes for attendees or participants
* **Partner deals** - Set up unique codes for each partner or influencer
* **Loyalty rewards** - Distribute personalised discount codes to loyal customers
## Importing Discounts
1. Go to **Marketing → Discounts** in the sidebar
2. Click **Import** — this opens the **Import discounts from a spreadsheet** page
3. Optionally start from a template with **Download Excel file** or **Download CSV file**
4. Click **Import** again — the button on this page opens the file picker — then upload your CSV or Excel file
5. Match each column in your file to a field, fix any rows the importer flags as invalid, and confirm
## CSV Columns
Each row creates one discount code. These are the only fields the importer accepts — anything else in your file is ignored.
| Column | Required | Accepted values |
| ----------------------------- | -------------- | ---------------------------------------------------------------------------------------------------------------------- |
| **Code** | Yes | The code customers type at checkout. Stored lowercase, matched case-insensitively |
| **Description** | No | Free text, shown in the dashboard only |
| **Type** | Yes | `fixed`, `percent`, or `freedelivery` |
| **Discount value** | Yes | A number. For `fixed`, the currency amount (`5` = £5). For `percent`, tenths of a percent (`200` = 20%, `1000` = 100%) |
| **Limit availability** | No | Weekday names, e.g. `monday,tuesday`. Must contain at least one of `monday`–`sunday`. Leave blank for every day |
| **Time availability - start** | With end | 24-hour `HH:mm`, e.g. `11:30` |
| **Time availability - end** | With start | 24-hour `HH:mm`, e.g. `15:00` |
| **Minimum spent** | No | Currency amount, e.g. `20` for a £20 minimum spend |
| **Usage limit** | No | Whole number — total redemptions across all customers. Blank or `0` means unlimited |
| **Exclude delivery charge** | No | Checkbox — excludes the delivery fee from the discount |
| **Fulfillment methods** | No | Any of `instore`, `pickup`, `delivery` (comma-separated). Blank allows all three |
| **Excluded payment types** | No | `Adyen` and/or `Cash` |
| **Venue Ids** | Yes | Numeric store IDs, separated by a comma |
| **startDate** | With endDate | The date the code becomes usable |
| **endDate** | With startDate | The date the code stops being usable |
`percent` values are in tenths of a percent, not whole percent: `200` imports as 20% off and `100` imports as 10% off. Import one row first and check the discount reads as expected in the **Discounts** list before importing the whole file.
Ensure your CSV file is correctly formatted before uploading. Incorrectly formatted files may fail to import or create discounts with unintended settings.
## What Import Cannot Set
The importer only covers the fields listed above. It cannot create:
* Product restrictions — the **Manage Restrictions** → **Products** selection
* Category restrictions — the **Manage Restrictions** → **Categories** selection
* **Maximum discount amount** — the cap on a percentage discount's cash value
* **Per-customer redemptions** — the importer has no column for it, so imported codes only get a total **Usage limit**
* **Auto apply** discounts
So a promotion that gives one named product away free — which needs a product restriction, and a **Maximum discount amount** to stop paid modifier extras being free too — has to be created by hand for each code. See [Give one product away free with a code](/docs/guides/discounts/discount-codes#give-one-product-away-free-with-a-code).
## Use Cases
### Marketing Campaign
Create hundreds of unique single-use codes (e.g., SUMMER001, SUMMER002) for a marketing email campaign. Each recipient gets their own code, allowing you to track which customers redeem the offer.
### Influencer Partnerships
Generate unique codes for each influencer (e.g., CHEF-ANNA, CHEF-JAMES) to track which partnerships drive the most orders and revenue.
### Event Promotions
Create a batch of codes for an event or sponsorship, giving each attendee a unique discount to use after the event.
When creating unique codes for tracking purposes, use a consistent naming convention. Prefixing codes with the campaign or partner name (e.g., SUMMER-001, PARTNER-ANNA) makes it easier to identify and analyse performance later.
# Live Chat Widgets
Source: https://storekit.com/docs/guides/increasing-sales/chat-widgets
Convert more visitors into customers by adding a live chat widget to your storekit store. Answer questions in real time and rescue catering inquiries.
Adding a live chat widget to your storekit store lets customers ask questions before they order. For complex orders - especially catering - this can be the difference between a lost visitor and a high-value sale.
## Why Live Chat Works
Customers abandon orders when they have unanswered questions:
* "Do you offer gluten-free options for the whole menu?"
* "Can I customise the platters for my event?"
* "What's the lead time for a catering order?"
A chat widget lets you answer these questions instantly, while the customer is still on your site and ready to buy.
Studies show that visitors who use live chat are **3x more likely to convert** than those who don't. For high-value orders like catering, the ROI on chat support is substantial.
## Best For
Live chat is particularly valuable for:
| Store Type | Why Chat Helps |
| ---------------------- | ------------------------------------------------------------------------------ |
| **Catering** | Large orders require custom quotes, dietary accommodations, delivery logistics |
| **Corporate ordering** | B2B customers expect a consultative sales process |
| **Complex menus** | Stores with many customisation options or dietary variations |
| **High-value items** | Expensive orders where customers want reassurance |
| **New stores** | Building trust with first-time customers |
## Supported Chat Integrations
storekit has built-in support for four chat platforms. Enable them directly from your dashboard - no code required.
### Intercom
[Intercom](https://www.intercom.com) is a premium customer messaging platform with powerful automation.
**Best for:** Established businesses wanting advanced features
* AI-powered chatbots for common questions
* Saved replies for fast responses
* Customer data integration
* Mobile apps for on-the-go support
* Pricing: From \$39/month
**To enable:** Add your Intercom App ID under **Stores** → your store → **Settings** → **Integrations**.
### tawk.to
[tawk.to](https://www.tawk.to) is a completely free live chat solution.
**Best for:** Small businesses and those just starting out
* 100% free forever
* Unlimited agents
* Mobile apps included
* Customisable widget
* Optional paid add-ons (hired agents, video chat)
**To enable:** Add your tawk.to Property ID and Widget ID under **Stores** → your store → **Settings** → **Integrations**.
### Superchat
[Superchat](https://www.superchat.com) unifies WhatsApp, Instagram, Facebook, and web chat.
**Best for:** Businesses already using WhatsApp for customer communication
* WhatsApp Business integration
* Multi-channel inbox
* Team collaboration
* German-based (GDPR compliant)
* Pricing: From €89/month
**To enable:** Add your Superchat Application Key under **Stores** → your store → **Settings** → **Integrations**.
### Front
[Front](https://front.com) is a shared inbox platform that includes live chat.
**Best for:** Teams who want chat integrated with their existing email workflow
* Shared inbox for all channels
* Team collaboration and assignments
* CRM integrations
* Analytics and reporting
* Pricing: From \$19/month
**To enable:** Add your Front Chat ID under **Stores** → your store → **Settings** → **Integrations**.
## Quick Comparison
| Platform | Price | Best For |
| ------------- | ------------ | --------------------------------- |
| **tawk.to** | Free | Getting started, budget-conscious |
| **Front** | From \$19/mo | Teams using shared inbox |
| **Intercom** | From \$39/mo | Automation and AI chatbots |
| **Superchat** | From €89/mo | WhatsApp-first businesses |
If you're unsure, start with **tawk.to**. It's completely free and you can always upgrade to a paid platform later.
## Catering-Specific Tips
For catering stores, live chat can dramatically increase conversions. Here's how to maximise its impact:
### Pre-Written Responses
Create saved replies for common catering questions:
* Minimum order sizes
* Lead time requirements
* Delivery radius and fees
* Dietary accommodation options
* Payment terms for large orders
* Setup and serving options
### Proactive Messages
Configure your chat to proactively reach out on key pages:
```
"Planning an event? We'd love to help you build the perfect menu.
Ask us anything!"
```
Trigger this message after 30-60 seconds on your catering menu page.
### Qualification Questions
Use initial bot messages to qualify leads:
1. "What type of event are you planning?"
2. "How many guests?"
3. "When is your event?"
This gives you context before the conversation starts and helps prioritise high-value enquiries.
### Quote Requests
For large orders, use chat to gather requirements and provide custom quotes:
* Take details via chat
* Follow up with a formal quote by email
* Include a direct link to a pre-built cart if possible
## Best Practices
Aim to respond within 1-2 minutes during business hours. Slow responses lose sales.
Display your response hours clearly. Use away messages outside business hours.
Install the mobile app so you can respond on the go. Most customers are on mobile too.
Always get email or phone for follow-up. Chat conversations can disconnect.
### Operating Hours
Be realistic about when you can respond:
* Set clear "online" hours in your widget
* Use auto-responders outside hours: "We're currently closed but will reply first thing tomorrow"
* Consider a chatbot for basic FAQs when you're offline
### What to Avoid
* **Don't ignore chats** - A dead chat is worse than no chat
* **Don't over-automate** - Bots frustrate customers with complex questions
* **Don't hide contact info** - Chat should supplement, not replace, other contact methods
## Measuring Success
Track these metrics to understand chat's impact:
| Metric | What It Tells You |
| ---------------------- | --------------------------------------------------- |
| **Chat-to-order rate** | % of chat conversations that result in orders |
| **Response time** | How quickly you're answering (aim for under 2 mins) |
| **Satisfaction score** | Post-chat ratings from customers |
| **Revenue influenced** | Order value from customers who chatted |
| **Common questions** | Topics to address in your FAQ or menu descriptions |
If you're seeing the same questions repeatedly, consider updating your menu descriptions or adding an FAQ section to reduce support load while still capturing the sales.
## Getting Started
If you're new to live chat, here's a simple path:
1. **Sign up for tawk.to** - It's free and full-featured
2. **Get your Property ID and Widget ID** - Found in your tawk.to dashboard
3. **Add to storekit** - Enter the IDs in your store's **Integrations** tab, as above
4. **Set your hours** - Be honest about availability
5. **Create 5-10 saved replies** - Cover your most common questions
6. **Monitor for 2 weeks** - See what questions come in
7. **Iterate** - Adjust your menu/FAQ based on common queries
For catering stores, live chat often pays for itself with a single converted enquiry. The question isn't whether you can afford chat support - it's whether you can afford to lose those high-value orders to unanswered questions.
# Google Business Profile
Source: https://storekit.com/docs/guides/increasing-sales/google-business-profile
Add your storekit ordering link to your Google Business Profile to drive online orders directly from Google Search and Maps without paying any commission fees.
Adding your storekit store to your Google Business Profile is a free and powerful way to increase visibility, attract more customers, and drive online orders directly from Google Search and Maps.
## Why It Matters
When customers search for your restaurant or browse Google Maps, your Business Profile is often the first thing they see. By adding your storekit ordering link, you can:
* **Capture hungry customers** at the moment they're ready to order
* **Avoid third-party fees** by directing customers to your own ordering system
* **Increase visibility** in local search results
* **Build trust** with a complete, professional profile
## Step 1: Claim Your Google Business Profile
If you haven't already, claim your business listing at [Google Business Profile](https://www.google.com/business/).
1. Search for your business name
2. Choose one of the following:
* **Claim and verify** if your business is listed but unclaimed
* **Request access** if someone else has already claimed it
* **Add your business** if it isn't already listed
After verification, you can update your business information including opening hours, contact details, photos, and location.
If you have multiple locations, you'll need to claim each one separately since Google's listings are location-based. The same applies if you sync Google reviews with storekit: each storekit store is linked to its own Google location — see [Linking each store to its Google location →](/docs/review-management#linking-each-store-to-its-google-location).
## Step 2: Add Your Ordering Link
Once you have access to your Business Profile:
1. Go to your Business Profile on Google Search or Maps
2. Click **Edit profile**
3. Navigate to the **More** tab
4. Find **Order online links** or **Online ordering**
5. Click **Add link**
6. Enter your storekit store URL (e.g., `https://order.storekit.com/your-store`)
7. Save your changes
## Step 3: Set storekit as Your Preferred Ordering Option
To ensure customers order directly through your storekit store rather than third-party apps:
1. In your Business Profile, go to **Online ordering** settings
2. Find storekit in your list of ordering providers
3. Click **Set as preferred**
4. Toggle to make it the preferred option for both **pickup** and **delivery**
This ensures your storekit link appears prominently when customers click "Order Online" from your profile.
## Tips for Success
Ensure your Google Business hours match your storekit opening hours to avoid customer confusion.
Profiles with photos get 42% more requests for directions and 35% more clicks to websites.
Engage with customer reviews to build trust and improve your local ranking. You can reply to Google reviews from storekit — see [Review management →](/docs/review-management).
Share updates, offers, and events to keep your profile active and engaging.
## Need Help?
If you're having trouble setting up your Google Business Profile, our support team is here to help. Reach out via the chat widget or email us at [support@storekit.com](mailto:support@storekit.com).
# API & Webhooks
Source: https://storekit.com/docs/guides/integrations/api-webhooks
Use the storekit API and webhook system to build custom integrations, automate workflows, and connect storekit to internal tools or third-party platforms.
Webhooks push your store's activity — new orders, payment and payout updates, store and printer status — to any other system in real time as an HTTP `POST` request. They are how you connect storekit to software that storekit does not integrate with natively: your own back office, a CRM, a kitchen or delivery tool, or an automation platform.
There is **no native integration for arbitrary third-party tools** (for example Blinq). If a tool is not documented under Integrations in these docs, storekit has no built-in connector for it. Webhooks are the supported route, either built by your own developer or by the tool's vendor.
## Webhooks Require a Subscription
Webhooks are a paid feature. If your account does not include them, the webhooks page shows an overview panel titled **Build custom integrations with Webhooks** with an **Upgrade to enable webhooks** button instead of the setup screen. If you see that button, [contact support](/docs/getting-started/contact-support) to discuss adding webhooks to your plan.
## Where Webhooks Live in the Dashboard
1. In the dashboard sidebar, go to **Settings** → **Developers**
2. In the **Webhooks** panel — "Send realtime storekit data to external services and custom integrations" — click **Enable Webhooks**
3. Once webhooks are enabled, that same button reads **Manage Webhooks**
There is no **Webhooks** entry directly under **Settings**. Webhooks are reached through **Settings** → **Developers**, which is also where **API Keys** live for accounts with API access.
## Endpoints Are Managed in an Embedded Portal
After you enable webhooks, storekit shows a secure webhooks portal embedded in the page. Everything endpoint-related happens inside that embedded portal rather than in storekit's own screens:
* Registering endpoint URLs and choosing which event types each one receives
* Viewing delivery attempts, payloads and response codes
* Sending test events, retrying failed deliveries and replaying missed ones
* Copying the signing secret used to verify payloads
## Next Steps
How webhooks work, acknowledgements and security basics.
Enable webhooks, register an endpoint and test it.
Every event type storekit can send, with example payloads.
Direct API access, which is in early access and granted case by case.
# Cyclone Couriers delivery integration for Ireland
Source: https://storekit.com/docs/guides/integrations/delivery/cyclone
Connect Cyclone Couriers to storekit for last-mile bike, scooter, and car delivery across Ireland. Orders dispatch automatically when customers check out.
Cyclone is a courier delivery service providing last-mile delivery in Ireland. The storekit integration automatically dispatches orders to Cyclone.
## Overview
* **Coverage**: Ireland only
* **Vehicle types**: Bikes, scooters, cars
## Setup
1. Contact Cyclone to set up a business account
2. Obtain your API credentials
3. In storekit, go to **Stores** → your store → **Settings** → **Integrations**
4. Select **Cyclone** and enter your credentials
5. Save changes
Make sure your account has valid billing / payment details before you start taking delivery orders. If billing details are missing or a payment fails, can refuse to create delivery jobs even though storekit accepts and charges the order — check this in your account first if an order is paid but no delivery appears, then [contact support](/docs/getting-started/contact-support) with the order so we can look into it and, where possible, arrange the delivery manually.
## How It Works
1. Customer places a delivery order
2. storekit sends order details to Cyclone
3. Cyclone assigns a driver and fulfills the delivery
## Order Data Sent
When an order is dispatched, storekit sends:
| Field | Description |
| ----------------- | ---------------------------- |
| `pickupAddress` | Your store address |
| `deliveryAddress` | Customer's delivery address |
| `customerName` | Customer name |
| `customerPhone` | Customer phone number |
| `orderValue` | Order total |
| `itemCount` | Number of items |
| `notes` | Delivery instructions |
| `pickupTime` | When the order will be ready |
## Who Is Responsible for the Delivery
storekit passes each delivery order to Cyclone, which assigns and manages the driver who collects and delivers it. Late pickups, no driver being assigned, or damage in transit are handled by Cyclone, not by storekit. storekit support can raise a claim or refund request with Cyclone on your behalf, but any refund or compensation is subject to their approval. To start this, [contact support](/docs/getting-started/contact-support).
# First Delivery dispatch aggregation
Source: https://storekit.com/docs/guides/integrations/delivery/first-delivery
Connect First Delivery to storekit to dispatch orders through DoorDash, Uber, Relay and own-fleet couriers with automatic dispatch and live tracking.
First Delivery ([firstdelivery.com](https://firstdelivery.com/)) is a delivery aggregator: a single account dispatches your orders across its network of courier providers (such as DoorDash, Uber and Relay, plus own-fleet couriers) according to First's routing for the area. The storekit integration automatically sends accepted delivery orders to First for dispatch and receives live status updates back onto the customer's order page.
## Overview
* **Aggregated dispatch**: One connection reaches First's whole courier network
* **Auto-dispatch**: Orders are sent to First automatically when you accept them
* **Live tracking**: Courier status updates flow back to the storekit order page
* **Coverage by location**: Which couriers a venue can use depends on the First merchant location (its address and territory), not on anything storekit sends
First Delivery decides which courier network fulfils each job based on the merchant location you connect. storekit does not choose the courier — it dispatches the order and relays the status First reports.
## Before You Start
You need:
* A First Delivery account with an **API key** (from your First account)
* A complete venue address in storekit (used to match or create your First merchant location)
* Delivery enabled on the store (see [Enabling Delivery](/docs/guides/fulfillment/delivery/enabling-delivery))
## Setup
1. In storekit, go to **Stores** → your store → **Settings** → **Integrations**
2. Select **First Delivery**
3. On the **First Delivery Settings** page, paste your key into **API key** and click **Load merchants**
Loading merchants also validates the key — if First rejects it, you'll be asked to check the key and try again.
4. Under **Merchant location**, choose the merchant that matches this venue. If no locations are found for your key, use **Create this venue as a new First location** (see below).
5. Set **Integration status** to enabled — the toggle reads *"Enabled - dispatching orders to First Delivery"* when on.
6. Click **Save**.
You must select a **Merchant location** before saving. Saving without one shows *"Select a merchant location first"* and the settings are not stored.
Make sure your account has valid billing / payment details before you start taking delivery orders. If billing details are missing or a payment fails, can refuse to create delivery jobs even though storekit accepts and charges the order — check this in your account first if an order is paid but no delivery appears, then [contact support](/docs/getting-started/contact-support) with the order so we can look into it and, where possible, arrange the delivery manually.
### Creating a First Location From Your Venue
If your API key has no existing merchant location for this venue, click **Create this venue as a new First location** under **Merchant location**. storekit creates a live location record at First from this venue's details and selects it for you.
Creating a First location is live and **can't be undone** — storekit asks you to confirm first. First assigns the location to the delivery zone (cohort) that covers the venue's address.
If First can't create the location, storekit shows the reason:
| Message | What it means |
| --------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| *"This venue doesn't have a usable address in storekit. Add one before creating a First location."* | The venue has no address First can use — add one under **Stores** → your store → **Settings** → **General** first. |
| *"First has no delivery zone covering this venue. Please contact First to extend coverage."* | The venue falls outside every First delivery zone. First must extend coverage before you can provision here. |
| *"First couldn't locate this venue's address. Please check the venue address and try again."* | First could not geocode the address — correct the venue address and retry. |
If the merchant you pick looks like it's in a different place from your venue, storekit warns that the selected merchant's address doesn't appear to match — picking the wrong location sends couriers to the wrong site, so double-check before saving.
### Replacing the API Key
Once a key is saved, the **API key** field shows *"API key saved ●●●●"* with a **Replace key** button. Click **Replace key** to enter a new key, then **Load merchants** to validate it and refresh the merchant list.
## How It Works
1. A customer places a delivery order on your storekit store
2. When you accept the order, storekit dispatches it to First Delivery
3. First routes the job to a courier in its network for the merchant location's area
4. Courier status updates arrive back at storekit and show on the customer's order page
5. If the order is cancelled in storekit, storekit cancels the First delivery too
### Pickup Timing
First's pickup time is when the courier collects from your venue, so storekit works it back from the customer's estimated delivery time by the delivery leg. Scheduled orders need a pickup more than about 20 minutes out; anything sooner is dispatched as ASAP.
### Delivery Status Updates
storekit maps First's courier statuses onto the tracking states customers see, including:
| First status | Customer-facing state |
| ------------------- | --------------------- |
| Runner assigned | Driver assigned |
| En route to pickup | Heading to the store |
| Picked up | Collected |
| En route to dropoff | Out for delivery |
| Arrived at dropoff | Arriving |
| Completed | Delivered |
| Cancelled | Delivery cancelled |
## Related
* [Enabling Delivery](/docs/guides/fulfillment/delivery/enabling-delivery) — turn on delivery orders for your store
* [Integrations Overview](/docs/guides/integrations/overview) — all available integrations
* [Managing Live Orders](/docs/guides/orders/managing-live-orders) — handle incoming delivery orders
# Nash multi-courier delivery orchestration integration
Source: https://storekit.com/docs/guides/integrations/delivery/nash
Connect Nash to storekit to orchestrate deliveries across multiple courier networks. Nash automatically routes each order to the best available driver near you.
Nash is a delivery orchestration platform that connects you to multiple courier networks through a single integration. Nash automatically routes orders to the best available driver across providers.
## Overview
* **Coverage**: Global
* **Multi-provider**: Access multiple courier networks
* **Smart routing**: Automatic provider selection
## Connected Providers
Nash connects to courier networks including:
* DoorDash Drive
* Uber Direct
* Stuart
* Roadie
* Local courier fleets
* And more
## Setup
1. Sign up for a Nash account at nash.io
2. Add your billing / payment details in your Nash account
3. Connect your preferred courier providers in Nash
4. Obtain your Nash API key
5. In storekit, go to **Stores** → your store → **Settings** → **Integrations**
6. Select **Nash** and enter your API key
7. Configure routing preferences
8. (Optional) Set a custom pickup phone number if different from your venue phone
9. Save changes
Nash cannot create a delivery job until valid billing / payment details are held
in your Nash account. Nash bills you directly for its per-delivery platform fee
plus the courier provider's fees (see [Pricing](#pricing)) — storekit does not
pay the courier on your behalf. If billing details are missing, expired or a
payment fails, orders are still accepted and paid in storekit but no delivery is
created. See [No Delivery Job Was Created](#no-delivery-job-was-created).
### Pickup Phone Number
By default, Nash uses your venue's phone number as the pickup contact. You can override this with a different number in the Nash integration settings.
This is useful when:
* Your delivery coordinator uses a different number
* You want drivers to contact a specific department
* Your venue phone doesn't accept calls during delivery hours
The phone number must be in E.164 format (e.g., +442012345678).
## How It Works
1. Customer places a delivery order
2. storekit sends order to Nash
3. Nash evaluates available providers
4. Best provider is selected based on your rules
5. Driver is assigned and tracked
6. Customer sees live tracking
## Order Data Sent
| Field | Description |
| ----------------- | --------------------------------- |
| `pickupAddress` | Store address with coordinates |
| `deliveryAddress` | Customer address with coordinates |
| `customerName` | Customer name |
| `customerPhone` | Customer phone |
| `customerEmail` | Customer email |
| `orderValue` | Order total |
| `items` | Item details for sizing |
| `notes` | Special instructions |
| `pickupTime` | Ready time |
| `deliverBy` | Required delivery time |
## Routing Rules
Configure how Nash selects providers:
### Priority-Based
Set provider priority order:
1. First choice: Cheapest available
2. Second choice: Fastest available
3. Fallback: Any available
### Cost Optimisation
Nash selects the cheapest option that meets your requirements:
* Maximum delivery time
* Minimum driver rating
* Vehicle type requirements
### Speed Optimisation
Prioritise fastest delivery:
* Select provider with shortest ETA
* Pay premium for speed when needed
### Round-Robin
Distribute orders across providers:
* Balance volume across partners
* Test provider performance
* Meet volume commitments
## Customer Experience
Regardless of which provider fulfills the delivery, customers see:
* Consistent tracking experience
* Driver details and photo
* Live map tracking
* Accurate ETA
* Direct driver contact
## Fallback Handling
If the primary provider can't fulfill:
1. Nash automatically tries next provider
2. Process continues until driver assigned
3. You're notified if all providers fail
4. Manual intervention options available
## Where to Check a Delivery in the Dashboard
Every Nash delivery is tracked on its order in storekit. To see live status and courier contact details:
1. Open the order from the dashboard
2. On the order, find the delivery tracker (the step indicator showing **Pending → Assigned → En route → At dropoff → Delivered**, with a **Pickup ETA** or **Dropoff ETA** at the top)
3. Select **Details** to open the **Delivery details** modal
The **Delivery details** modal shows:
| Field | What it tells you |
| ----------------------------------------------- | -------------------------------------------------------------------------------------------- |
| Status badge | The current delivery status (e.g. `Not Assigned Driver`, `Canceled By Provider`) |
| Courier | Courier name, phone number (tap to call), photo and vehicle |
| Timeline | Each milestone with times, plus pickup and dropoff ETAs and how they compare to the estimate |
| Fleet | The courier network Nash routed the order to |
| Final price (inc. tax) / Final price (exc. tax) | The delivery price charged for the job |
| Failure reason | Why a delivery was cancelled, expired or failed (shown only when applicable) |
| Provider ID | Nash's job reference — quote this when contacting support |
| View in provider dashboard | Opens the job in the provider dashboard |
| Cancel delivery | Cancels the job, shown only while the delivery can still be cancelled |
## Troubleshooting
### No Delivery Job Was Created
If an order is accepted and paid in storekit but no delivery ever appears — no delivery tracker progress, and nothing in the **Delivery details** modal — the job was most likely never created by Nash, usually because of billing:
* Check your Nash account for missing, expired or failed billing / payment details. Nash bills you directly for its platform fee plus the courier fees (see [Pricing](#pricing)), so it cannot dispatch a courier without valid payment details on file
* Check your email (including spam) for messages from Nash about billing or payment failures — this notice can arrive days before deliveries stop being created, and there is no warning about it in the storekit dashboard
* Once the billing details are fixed in Nash, new delivery jobs are created automatically again — no change is needed in storekit
* In the meantime, [contact support](/docs/getting-started/contact-support) with the order: we can create the outstanding delivery job manually so the order still gets collected
### No Driver Assigned Yet
While Nash is still searching for a driver, the delivery sits on the **Pending** step and the **Delivery details** status reads `Not Assigned Driver` (the same "we are still looking for a driver" state as a newly `Created` or `Scheduled` job).
* Nash keeps searching and can automatically reassign the job across your connected courier networks until a driver accepts
* Watch the delivery tracker and **Pickup ETA** on the order rather than preparing the food too early — a driver may not arrive for a little while after the order is ready
* If your kitchen has not started, hold off on cooking until a driver is assigned and the **Pickup ETA** looks realistic, so hot food isn't left waiting
* If no driver is assigned as the pickup window approaches, [contact support](/docs/getting-started/contact-support) with the **Provider ID** from the **Delivery details** modal
### Driver Is Late to Pick Up
If a driver has been assigned but pickup is running late:
* Check the live status on the order — the delivery tracker step, the **Pickup ETA**, and the timeline in the **Delivery details** modal show where the courier is and whether the ETA has slipped
* Contact the courier directly: open **Delivery details** and tap the courier's phone number in the **Courier** section
* If you can't reach the courier or the delay is significant, [contact support](/docs/getting-started/contact-support) with the **Provider ID** so we can follow up with Nash and the courier
### Delivery Cancelled or Failed
The **Delivery details** status badge (and the **Delivery cancelled** banner on the order) shows how a delivery ended:
* **Cancelled** (`Canceled By Provider`, `Canceled By Customer`) — the courier network, Nash or the customer cancelled the job. A job Nash reassigns to another provider also shows as `Canceled By Provider` on the original attempt
* **Expired** (`Expired`) — no driver was found within the allowed window
* **Failed** (`Failed`) — the delivery could not be completed
* **Returned** (`Returned`, `Return In Progress`) — the order is being, or has been, returned to your store
Where Nash provides one, the reason appears in the **Failure reason** field of the **Delivery details** modal. If a delivery is cancelled or fails and you need help resolving it, [contact support](/docs/getting-started/contact-support).
## Who Is Responsible for the Delivery
storekit passes each delivery order to Nash; Nash then selects and manages the courier network that collects and delivers the order. This means the outcome of a delivery — including late pickups, no driver being assigned, or damage in transit — is handled by the courier partner performing the delivery, not by storekit.
If something goes wrong, storekit support can raise a claim or refund request with Nash on your behalf. Any refund or compensation is subject to the courier partner's approval, so we can't guarantee an outcome, an amount or a timeline. To start this, [contact support](/docs/getting-started/contact-support) with the order and the **Provider ID** from the **Delivery details** modal.
## Pricing
Nash charges:
* Per-delivery platform fee
* Plus courier provider fees
You control:
* Maximum delivery cost
* Customer delivery charge
* Subsidy amount
## Best Practices
Connect 2-3 providers for redundancy
Test different routing rules to optimise cost/speed
Configure maximum costs to control spending
Review analytics to identify best providers
# Orkestro fleet and on-demand courier delivery integration
Source: https://storekit.com/docs/guides/integrations/delivery/orkestro
Connect Orkestro to storekit to manage your own delivery drivers or route orders to on-demand courier networks. Live tracking and dispatch from one platform.
Orkestro is a delivery management platform that helps you manage your own driver fleet or connect to on-demand couriers. The storekit integration provides seamless order dispatch and tracking.
## Overview
* **Fleet management**: Manage your own drivers
* **On-demand couriers**: Connect to courier networks
* **Hybrid model**: Use both for flexibility
## Setup
1. Sign up for an Orkestro account
2. Set up your fleet or connect courier providers
3. Obtain your Orkestro API key
4. In storekit, go to **Stores** → your store → **Settings** → **Integrations**
5. Select **Orkestro** and enter your API key
6. Configure dispatch settings
7. Save changes
Make sure your account has valid billing / payment details before you start taking delivery orders. If billing details are missing or a payment fails, can refuse to create delivery jobs even though storekit accepts and charges the order — check this in your account first if an order is paid but no delivery appears, then [contact support](/docs/getting-started/contact-support) with the order so we can look into it and, where possible, arrange the delivery manually.
## Fleet Options
### Own Drivers
Manage your in-house delivery team:
* Add drivers to Orkestro
* Drivers use Orkestro driver app
* Full control over assignments
* Track all drivers in real-time
### On-Demand Couriers
Connect to courier networks:
* Stuart
* Gophr
* Addison Lee
* Local providers
### Hybrid
Use your fleet when available, overflow to couriers:
* Own drivers handle peak hours
* Couriers cover gaps
* Automatic load balancing
## Order Data Sent
| Field | Description |
| ----------------- | --------------------------- |
| `pickupAddress` | Store address |
| `deliveryAddress` | Customer address |
| `customerName` | Customer name |
| `customerPhone` | Customer phone |
| `orderTotal` | Order value |
| `items` | Item list with quantities |
| `notes` | Delivery instructions |
| `pickupTime` | Ready for collection time |
| `deliveryWindow` | Required delivery timeframe |
## Dispatch Modes
### Automatic Dispatch
Orders automatically assigned based on:
* Driver location and availability
* Current workload
* Delivery route efficiency
* Scheduled delivery time
### Manual Dispatch
Control assignments yourself:
* View available drivers
* Assign specific orders to drivers
* Batch multiple orders per driver
* Optimise routes manually
### Scheduled Dispatch
For pre-orders and catering:
* Queue orders for future dispatch
* Release to drivers at set time
* Batch by delivery area
## Customer Experience
### Live Tracking
Customers see:
* Assigned driver name and photo
* Real-time location on map
* Accurate ETA updates
* Direct contact option
### Notifications
Automatic updates:
* Driver assigned
* Driver en route
* Arriving soon
* Delivered
## Driver App
Your drivers use the Orkestro driver app:
* Receive order notifications
* Navigate to pickup and delivery
* Update order status
* Capture proof of delivery
* Communicate with customers
## Route Optimisation
Orkestro optimises multi-drop routes:
* Batch nearby deliveries
* Calculate optimal order
* Reduce total drive time
* Balance driver workload
## Pricing
Orkestro pricing includes:
* Platform subscription
* Per-delivery fees (for on-demand)
* Driver app licenses (for own fleet)
## Best Practices
Group deliveries by area for efficiency
Allow enough time for drivers to complete routes
Track metrics to identify improvements
Ensure drivers know the app and process
# PedalMe cargo bike delivery integration for London
Source: https://storekit.com/docs/guides/integrations/delivery/pedalme
Connect PedalMe to storekit for sustainable electric cargo bike delivery across London. Eco-friendly last-mile delivery dispatched automatically at checkout.
PedalMe is a London-based cargo bike courier service offering sustainable last-mile delivery. The storekit integration automatically dispatches orders to PedalMe riders.
## Overview
* **Coverage**: London only
* **Vehicle type**: Electric cargo bikes
* **Best for**: Catering and bulk orders
## Setup
1. Contact PedalMe to set up a business account
2. Obtain your API credentials from PedalMe
3. In storekit, go to **Stores** → your store → **Settings** → **Integrations**
4. Select **PedalMe** and enter your credentials
5. Save changes
Make sure your account has valid billing / payment details before you start taking delivery orders. If billing details are missing or a payment fails, can refuse to create delivery jobs even though storekit accepts and charges the order — check this in your account first if an order is paid but no delivery appears, then [contact support](/docs/getting-started/contact-support) with the order so we can look into it and, where possible, arrange the delivery manually.
## How It Works
1. Customer places a delivery order
2. storekit sends order details to PedalMe
3. PedalMe assigns a rider
4. Customer sees rider details and live tracking
5. Order is delivered
## Order Data Sent
When an order is dispatched, storekit sends:
| Field | Description |
| ----------------- | ---------------------------- |
| `pickupAddress` | Your store address |
| `deliveryAddress` | Customer's delivery address |
| `customerName` | Customer name |
| `customerPhone` | Customer phone number |
| `orderValue` | Order total |
| `items` | List of items |
| `notes` | Delivery instructions |
| `pickupTime` | When the order will be ready |
## Size Brackets
PedalMe uses size brackets to determine pricing and vehicle requirements. Configure size brackets in your storekit settings to categorise orders:
* **Small** - Standard bike delivery
* **Medium** - Cargo bike required
* **Large** - Large cargo bike or multiple trips
Size brackets are calculated based on the items in the order.
## Customer Experience
Customers see real-time updates on their order status page:
* Rider name and photo
* Live location on map
* Estimated arrival time
* Option to call the rider
## Sustainability
PedalMe deliveries are zero-emission, helping you:
* Reduce carbon footprint
* Appeal to eco-conscious customers
* Support sustainable urban logistics
## Who Is Responsible for the Delivery
storekit passes each delivery order to PedalMe, which assigns and manages the rider who collects and delivers it. Late pickups, no rider being assigned, or damage in transit are handled by PedalMe, not by storekit. storekit support can raise a claim or refund request with PedalMe on your behalf, but any refund or compensation is subject to their approval. To start this, [contact support](/docs/getting-started/contact-support).
# Shipday dispatch and route optimisation
Source: https://storekit.com/docs/guides/integrations/delivery/shipday
Connect Shipday to storekit to dispatch orders to your own delivery drivers with route optimisation, smart batching, live tracking, and customer ETAs.
Shipday is a delivery management platform designed for restaurants managing their own drivers. The storekit integration automatically sends orders to Shipday for dispatch and tracking.
## Overview
* **Coverage**: Global
* **Fleet management**: Manage your own delivery drivers
* **Driver app**: Free mobile app for drivers
* **Route optimisation**: Smart batching and routing
## Setup
1. Sign up for Shipday at shipday.com
2. Add your drivers to Shipday
3. Obtain your API key from Shipday settings
4. In storekit, go to **Stores** → your store → **Settings** → **Integrations**
5. Select **Shipday** and enter your API key
6. Save changes
Make sure your account has valid billing / payment details before you start taking delivery orders. If billing details are missing or a payment fails, can refuse to create delivery jobs even though storekit accepts and charges the order — check this in your account first if an order is paid but no delivery appears, then [contact support](/docs/getting-started/contact-support) with the order so we can look into it and, where possible, arrange the delivery manually.
### Webhook Setup (Driver Tracking)
To receive real-time driver tracking updates from Shipday, you need to configure a webhook inside your Shipday account:
1. In Shipday, go to **Integrations** → **API credentials**
2. Click **Add API Link**
3. Set the **URL** to:
```
https://api.order.storekit.com/shipday/webhook
```
4. Set the **Token** to: `x`
5. Save the webhook
Driver tracking requires both a paid Shipday subscription and a storekit+ subscription.
## How It Works
1. Customer places a delivery order
2. storekit sends order to Shipday
3. Order appears in Shipday dispatch dashboard
4. Dispatcher assigns to driver (or auto-dispatch)
5. Driver receives order in Shipday driver app
6. Customer tracks delivery on storekit order page
## Order Data Sent
| Field | Description |
| ----------------- | ------------------------ |
| `orderNumber` | storekit order reference |
| `pickupAddress` | Store address |
| `deliveryAddress` | Customer full address |
| `customerName` | Customer name |
| `customerPhone` | Customer phone |
| `customerEmail` | Customer email |
| `orderTotal` | Order value |
| `tip` | Customer tip amount |
| `items` | List of items ordered |
| `notes` | Delivery instructions |
| `readyTime` | When order will be ready |
## Dispatch Options
### Manual Dispatch
Assign orders yourself:
1. View incoming orders in Shipday
2. See available drivers on map
3. Assign order to specific driver
4. Driver receives notification
### Auto-Dispatch
Let Shipday assign automatically:
* Based on driver location
* Considers current workload
* Optimises for efficiency
* Configurable rules
### Batching
Group multiple orders per driver:
* Nearby deliveries batched together
* Route optimised automatically
* Reduces total drive time
* Increases deliveries per hour
## Driver App
Drivers use the free Shipday driver app:
### Features
* Receive order notifications
* View order details and items
* Navigate to pickup and delivery
* Update order status
* Capture proof of delivery
* Track earnings
### Status Updates
Drivers update status as they progress:
1. Accepted
2. Arrived at store
3. Picked up
4. Arrived at customer
5. Delivered
## Customer Experience
### Live Tracking
Customers see on their order status page:
* Driver name and photo
* Real-time GPS location
* Estimated arrival time
* Driver contact option
### Tracking Link
Optionally send customers a Shipday tracking link via SMS.
## Route Optimisation
Shipday optimises delivery routes:
* Shortest total distance
* Considers traffic conditions
* Respects delivery time windows
* Balances driver workload
## Proof of Delivery
Capture delivery confirmation:
* Photo of delivered order
* Customer signature
* GPS location stamp
* Timestamp
## Pricing
Shipday offers:
* **Free tier**: Basic features, limited orders
* **Paid plans**: Advanced features, higher volume
No per-delivery fees - flat monthly subscription.
## Best Practices
Ensure drivers know the app before going live
Sync kitchen prep with driver dispatch
Set clear boundaries for your delivery area
Schedule enough drivers for busy periods
# Uber Direct white-label courier delivery integration
Source: https://storekit.com/docs/guides/integrations/delivery/uber-direct
Use Uber Direct as a white-label courier in storekit. Customers order from your store and an Uber driver delivers — without Uber branding or Uber Eats fees.
Uber Direct is Uber's white-label delivery service that lets you use Uber's driver network for your own deliveries. Customers order from your store and an Uber driver delivers, without Uber branding.
## Overview
* **Coverage**: UK and Switzerland (one storekit credential pool per region — see below)
* **Driver network**: Access to Uber's extensive driver pool
* **White-label**: Your branding, not Uber's
**Do I need my own Uber Direct account?** No. You do not sign up at uber.com, complete Uber's business verification or obtain API credentials. storekit holds the Uber Direct credentials and enables the integration on your storekit account; you then create an Uber Direct organisation for your business from the dashboard and switch it on per store.
## Setup
Uber Direct is enabled per storekit account. Everything is done from **Stores** → your store → **Settings** → **Integrations** → **Uber Direct**.
If the page shows **Deliver with Uber Direct**, the integration is not yet enabled on your account. Click **Request Uber Direct integration** (or [contact support](/docs/getting-started/contact-support)). Once storekit enables it, the page title changes to **Uber Direct Settings**.
Under **Account Credentials**, choose a **Credential Pool** and click **Connect to Uber Direct**. The list is fixed:
| Credential Pool | Use it for |
| --------------- | ------------------------------------------------------------------------------------------------- |
| **UK Standard** | UK stores taking regular delivery orders |
| **UK Catering** | UK stores taking catering orders (larger drop-offs, delivered against the order's scheduled time) |
| **Switzerland** | Swiss stores |
You can connect more than one pool (for example **UK Standard** and **UK Catering**) with **Connect another pool**. There are no API key fields to fill in.
Under **Organization**, fill in **Organization Name**, **Contact First Name**, **Contact Last Name**, **Contact Email**, **Contact Phone** (international format, e.g. `+441234567890`), **Street Address**, **Street Address Line 2**, **City**, **State / Region**, **Postcode / Zip** and **Country Code**, then click **Create Organization**. Your business name, email and store address are pre-filled where storekit already has them.
This organisation is created under storekit's Uber Direct account and is what Uber bills for your deliveries. It is account-wide: every store on the account uses it unless a store has its own customer ID.
Under **Venue Settings**, select the **Credential Pool** the store should use, leave **Customer ID (optional)** blank unless storekit has given you a store-specific one, switch on **Enable Uber Direct** and click **Save**. Repeat on each store that should deliver with Uber.
If saving fails with **Please create an organization in account settings first, or enter a customer ID manually.**, go back to step 3.
Uber Direct only handles delivery orders, so the store also needs delivery enabled and a delivery zone with a fee. See [Enabling Delivery](/docs/guides/fulfillment/delivery/enabling-delivery) and [Delivery Zones](/docs/guides/fulfillment/delivery/delivery-zones).
**Billing.** Uber bills the organisation created in step 3 directly for each delivery; storekit does not add the courier cost to your storekit invoice. Billing is activated on Uber's side after the organisation is created, and Uber tells storekit when it is active — there is nowhere in the storekit dashboard to enter payment details for Uber Direct. If an order is paid but no delivery appears after setup, the most likely cause is that billing is not active yet: [contact support](/docs/getting-started/contact-support) with the order number and we will check the organisation's status with Uber and, where possible, arrange the delivery manually.
## How It Works
1. A customer places a delivery order on your store.
2. When the order is **accepted**, storekit requests a delivery from Uber Direct with a pickup time based on the store's prep time (or, for pre-orders, the scheduled delivery time).
3. Uber assigns the nearest available driver.
4. The customer tracks the delivery on your order status page.
5. The driver delivers the order.
## Order Data Sent
| Field | Description |
| ----------------------- | ----------------------------------------------------------------------------------------- |
| Pickup address | Store address, coordinates and phone number |
| Pickup notes | "Collect order #\" |
| Drop-off address | Customer delivery address and coordinates |
| Customer name and phone | From the order |
| Drop-off notes | The delivery notes the customer typed at checkout |
| Items | Item names, quantities and prices |
| Order value | Order total excluding delivery fee, service charge and tip |
| Timing | Pickup-ready time from the store's prep time; for pre-orders, the scheduled delivery time |
Standard deliveries are set to be handed over at the door, with the driver taking a photo as proof of delivery and leaving the order at the door if the customer cannot be reached. Catering deliveries instead use a PIN code the customer gives the driver, and are returned to the store if they cannot be delivered.
There are no Uber Direct dispatch-timing, pickup-instruction, delivery-requirement or tipping settings in the storekit dashboard. Dispatch always happens on acceptance, and what the customer pays for delivery is set by your [delivery zones](/docs/guides/fulfillment/delivery/delivery-zones), not by Uber's courier fee.
## Customer Experience
### Live Tracking
Customers see on your order status page:
* Driver name and photo
* Real-time location on map
* Estimated arrival time
* Option to contact driver
### Delivery Updates
Real-time status updates:
* Driver assigned
* Driver heading to store
* Driver arrived at store
* Order picked up
* Driver en route to customer
* Delivered
## Troubleshooting
### No Delivery Created for a Paid Order
* Check **Enable Uber Direct** is on for that store and the store's **Credential Pool** is one you connected.
* Check the organisation shows **Organization connected** under **Organization**. If not, create it (step 3 above).
* Billing on the organisation may not be active yet with Uber — [contact support](/docs/getting-started/contact-support) with the order number.
### No Drivers Available
If no drivers accept, Uber keeps searching. If the delivery is eventually cancelled, [contact support](/docs/getting-started/contact-support) so we can arrange the delivery manually where possible.
### Driver Cancellation
If a driver cancels, Uber reassigns the delivery and the customer sees an updated ETA.
## Who Is Responsible for the Delivery
storekit passes each delivery order to Uber Direct, which selects and manages the driver who collects and delivers it. Late pickups, no driver being assigned, or damage in transit are handled by the courier performing the delivery, not by storekit. storekit support can raise a claim or refund request with Uber Direct on your behalf, but any refund or compensation is subject to their approval. To start this, [contact support](/docs/getting-started/contact-support).
## Best Practices
The pickup time sent to Uber comes from your store's prep time — keep it realistic to avoid drivers waiting
Drivers call the store's phone number if they cannot find you
Package orders to survive transport
Keep zones within a distance Uber can serve reliably
# Glu gift card redemption
Source: https://storekit.com/docs/guides/integrations/glu
Accept Glu gift cards and membership credit in storekit. Guests redeem their balance at online checkout or on a bill, with partial balances and split payments.
Glu lets your guests redeem their Glu gift cards and membership credit when placing an order or paying a bill online. The integration connects at the account level with your Glu API key and is then enabled per venue, adding a gift card code input to the checkout flow.
## Capabilities
### Gift Card Redemption
Once enabled, guests can enter a Glu gift card code at checkout with two redemption modes:
| Mode | Description |
| ---------------------- | -------------------------------------------------------------------------------------------------------------- |
| **Full redemption** | The gift card balance covers the whole order, and the order is paid entirely with the card. |
| **Partial redemption** | Only the amount needed is deducted from the gift card. The remaining balance stays on the card for future use. |
### Supported Payment Scenarios
Apply gift cards during checkout for delivery, pickup, or dine-in orders
Apply gift cards when paying a bill online through a storekit payment link
### Split Payments
When a gift card doesn't cover the full amount:
1. The gift card balance is applied first
2. The remaining balance is charged to another payment method (card, Apple Pay, etc.)
This lets guests use gift cards of any value without needing an exact match.
### Balance Enquiry
The card's remaining balance is looked up and validated before redemption, so guests can see the available balance when they apply their card. If the balance doesn't cover the requested amount, the redemption is declined and nothing is deducted.
### Refunds
When an order paid with a Glu gift card is refunded, the gift card redemption is reversed and the balance is restored to the card automatically. Glu supports full refunds of a gift card transaction only — partial refunds of a gift card redemption are not supported.
If an order fails after the gift card has been charged, the redemption is reversed automatically so the guest's balance is not lost.
Glu handles redemption only. Purchasing new gift cards and topping up existing cards are not supported through storekit.
## How It Works
1. Guest enters their Glu gift card code at checkout
2. storekit looks up the card and returns the available balance
3. The requested amount is deducted from the card
4. Any remaining order total is charged to another payment method
5. The order or bill is updated, and the redemption is recorded in your reports
## What You'll Need
Before connecting, make sure you have:
* A **Glu account**. Don't have one? [Create one here](https://admin.glu.io/).
* Your Glu **API key**, available from the Glu admin portal.
Glu is available on eligible storekit plans. If **Glu** does not appear under **Stores** → your store → **Settings** → **Integrations**, [contact support](/docs/getting-started/contact-support) to have it enabled for your account. Only one gift card provider can be active per venue.
## Configuration
### 1. Connect your account
1. Go to **Stores** → your store → **Settings** → **Integrations** → **Glu**
2. Click **Connect to Glu**
3. Enter your **API Key**, then click **Connect**
Your API key is verified with Glu when you connect. If it's rejected, you'll see a **Connection failed** message — check the key in your Glu admin portal and try again.
### 2. Enable Glu for a venue
Once your account is connected, configure each venue that should accept gift cards:
1. Turn on **Integration enabled for this venue**
The gift card code input appears at checkout for that venue as soon as it's enabled. To stop accepting gift cards at a venue, turn the venue switch off — your account stays connected, so you can turn it back on at any time.
# Leat gift cards and vouchers
Source: https://storekit.com/docs/guides/integrations/leat-gift-cards
Let customers pay with a Leat (formerly Piggy) gift card at storekit checkout and on table bills, with full or partial redemption and split payments.
Leat (formerly Piggy) lets your customers pay with a Leat gift card balance when placing an order or settling a bill in storekit. storekit looks up the card balance with Leat, deducts the amount redeemed, and leaves any remaining balance on the card for next time.
This guide covers Leat **gift cards**. Leat's loyalty points and rewards are a separate part of the same integration — see [Loyalty programs](/docs/guides/increasing-sales/loyalty-programs).
## Capabilities
### Gift Card Redemption
| Mode | Description |
| ---------------------- | ------------------------------------------------------------------------------------------------------------ |
| **Full redemption** | The gift card covers the whole amount, up to its available balance. |
| **Partial redemption** | Only the amount you apply is deducted from the card; the remaining balance stays on the card for future use. |
### Supported Payment Scenarios
Apply a Leat gift card during checkout for delivery, pickup, or dine-in orders
Use a Leat gift card when settling the bill at pay-at-table venues
### Split Payments
When a gift card doesn't cover the full amount:
1. The gift card balance is applied first
2. The remaining balance is charged to another payment method (card, Apple Pay, etc.)
This lets customers use gift cards of any value without needing an exact amount.
## How It Works
1. The customer enters their Leat gift card code at checkout or on their bill
2. storekit looks up the card with Leat and returns the available balance
3. The customer confirms how much to redeem
4. storekit records the redemption against the Leat gift card for the connected shop
5. Any remaining balance stays on the card
If the requested amount is more than the card holds, storekit reports **Insufficient gift card balance** and nothing is deducted.
## Prerequisites
* A Leat account with API credentials (**Client Id** and **Client Secret**) from your Leat portal
* At least one Leat **shop**
* Gift cards issued in Leat, linked to a gift card program your shop can access
## Connect Leat
Go to **Stores** → your store → **Settings** → **Integrations**, then select **Leat**.
On the **Leat Loyalty Settings** page, click **Connect to Leat**. Enter your **Leat Client Id** and **Leat Client Secret**, then click **Save**. Once connected, the page shows **Connected to Leat**.
Choose the Leat shop for this venue under **Shops**. Gift card redemptions are recorded against this shop.
Turn on **Enable Leat**, then turn on **Enable gift cards**.
Click **Save**.
## Checking a Balance
Customers can check a Leat gift card balance before redeeming — storekit looks up the card with Leat and shows the available balance at checkout, so they know how much the card will cover before they confirm.
## Related
* [Loyalty programs](/docs/guides/increasing-sales/loyalty-programs) — Leat loyalty points and rewards
* [Voucher Connect gift card and voucher redemption](/docs/guides/integrations/voucher-connect) — an alternative gift card provider
* [Integrations Overview](/docs/guides/integrations/overview)
# Acteol
Source: https://storekit.com/docs/guides/integrations/marketing/acteol
Sync storekit customer and order data to Acteol, the hospitality CRM platform. Build comprehensive guest profiles and power marketing automation campaigns.
Acteol (an Access company) is a hospitality CRM platform for guest data management and marketing automation. The storekit integration syncs customer and order data to build comprehensive guest profiles.
## Setup
1. Contact your Acteol account manager to enable the storekit integration
2. Obtain your Acteol API credentials
3. In storekit, go to **Stores** → your store → **Settings** → **Integrations**
4. Enter your Acteol credentials
5. Save changes
## Synced Data
When a customer places an order, the following data is sent to Acteol:
### Guest Profile
| Field | Acteol Field |
| ----------------- | ------------ |
| Email | `email` |
| First name | `firstName` |
| Last name | `lastName` |
| Phone | `mobile` |
| Marketing consent | `optIn` |
### Transaction Data
| Field | Description |
| ------------------ | --------------------------- |
| `transactionId` | Order ID |
| `transactionDate` | Order date and time |
| `transactionValue` | Order total |
| `transactionType` | Delivery / Pickup / Dine-in |
| `locationId` | Store ID |
| `locationName` | Store name |
### Order Items
| Field | Description |
| ----------------- | ---------------- |
| `productName` | Item name |
| `productCategory` | Category name |
| `quantity` | Quantity ordered |
| `price` | Item price |
### Customer Metrics
| Metric | Description |
| ------------------- | ----------------------------- |
| `lifetimeValue` | Total spend across all orders |
| `orderCount` | Number of orders placed |
| `averageOrderValue` | Average transaction value |
| `firstTransaction` | First order date |
| `lastTransaction` | Most recent order date |
## Profile Matching
Acteol matches storekit customers with existing profiles using:
1. **Email address** (primary match)
2. **Phone number** (secondary match)
This creates a unified view across all your customer touchpoints.
## Use Cases
### Single Customer View
Combine data from multiple sources:
* Online orders (storekit)
* In-venue POS transactions
* Reservations
* WiFi logins
* Loyalty programme
### RFM Segmentation
Segment customers by Recency, Frequency, and Monetary value:
| Segment | Criteria |
| ------------- | ------------------------------- |
| **Champions** | Recent, frequent, high spend |
| **Loyal** | Frequent, good spend |
| **At Risk** | Previously frequent, now lapsed |
| **Lost** | Long time since last order |
### Automated Campaigns
Set up triggered marketing:
* Welcome series for new customers
* Birthday offers
* Anniversary of first order
* Win-back for lapsed customers
* VIP recognition for top spenders
### Cross-Channel Attribution
Track customer journey across channels:
* First discovered via social media
* Signed up through WiFi
* First order via storekit
* Became regular customer
## Reporting
Access combined reporting in Acteol:
* Customer acquisition by source
* Lifetime value by channel
* Campaign performance
* Location comparisons
## Related
View and export customer data
Collect customer reviews
# Airship
Source: https://storekit.com/docs/guides/integrations/marketing/airship
Connect Airship to storekit to send push notifications, SMS, and in-app messages based on order events. Power lifecycle messaging and re-engagement campaigns.
Airship is a customer engagement platform for push notifications, SMS, and in-app messaging. The storekit integration sends customer and order data to power your messaging campaigns.
## Setup
1. Log in to your Airship account
2. Go to **Settings** → **Project Details**
3. Copy your **App Key** and **App Secret**
4. In storekit, go to **Stores** → your store → **Settings** → **Integrations**
5. Enter your Airship credentials
6. Save changes
## Synced Data
When a customer places an order or submits feedback, the following data is sent to Airship:
### Customer Profile
| Field | Description |
| ------------ | ---------------------- |
| `email` | Customer email address |
| `first_name` | First name |
| `last_name` | Last name |
| `phone` | Phone number |
### Order Attributes
| Attribute | Description |
| ------------------ | ------------------------ |
| `order_count` | Total orders placed |
| `total_spent` | Lifetime spend |
| `last_order_date` | Most recent order date |
| `last_order_value` | Most recent order amount |
| `store_id` | Store ID |
| `store_name` | Store name |
### Events
| Event | Trigger |
| ----------------- | ------------------------------ |
| `order_placed` | Customer completes an order |
| `order_accepted` | Order is accepted by the store |
| `order_ready` | Order is ready for pickup |
| `order_delivered` | Order is delivered |
### Customer Feedback
When customers submit reviews, feedback is automatically synced to Airship with:
| Field | Description |
| ----------- | ------------------------------------------------------ |
| `type_id` | Feedback sentiment (1=positive, 2=negative, 3=neutral) |
| `source_id` | Always set to 1 (website) |
| `unit_id` | Your Airship unit ID |
| `comments` | Customer review text and additional ratings |
| `ratings` | Food rating, Service rating, and NPS score |
**Rating Categories:**
* **Food** - Quality and taste rating (1-5 stars)
* **Service** - Staff and service rating (1-5 stars)
* **NPS** - Net Promoter Score calculated from overall rating (0-10 scale)
* **Atmosphere** - Included in comments section
* **Value for money** - Included in comments section
Feedback is classified as:
* **Positive** (type\_id: 1) - 4-5 star ratings
* **Negative** (type\_id: 2) - 1-2 star ratings
* **Neutral** (type\_id: 3) - 3 star ratings
Review data is synced in real-time when customers submit feedback. All rating categories are properly mapped to ensure accurate sentiment analysis in Airship.
## Use Cases
### Order Updates
Send real-time push notifications for order status:
1. Create automation triggered by `order_accepted`
2. Send push: "Your order has been confirmed!"
3. Create automation for `order_ready`
4. Send push: "Your order is ready for pickup"
### Promotional Push
Drive orders with targeted push notifications:
1. Segment by `last_order_date` > 7 days
2. Send push with limited-time offer
3. Deep link to your ordering page
### Location-Based Messaging
For customers near your store:
1. Set up geofence around your location
2. Trigger message when customer enters zone
3. Promote lunch specials or happy hour
### Re-engagement
Win back lapsed customers:
1. Segment: no order in 30+ days
2. Send personalised push with offer
3. Follow up with email if no response
### Feedback-Based Campaigns
Respond to customer feedback automatically:
1. Segment by negative feedback (1-2 stars)
2. Send personalised apology with discount code
3. Track redemption to measure recovery
Or reward positive feedback:
1. Segment by positive feedback (4-5 stars)
2. Thank customers with loyalty points
3. Encourage them to share on social media
## Channel Priority
Configure which channels to use for different message types:
| Message Type | Recommended Channel |
| ------------- | ------------------- |
| Order updates | Push notification |
| Promotions | Push + Email |
| Surveys | Email |
| Urgent alerts | SMS |
## Related
View and export customer data
Collect customer reviews
# Google Tag Manager
Source: https://storekit.com/docs/guides/integrations/marketing/google-tag-manager
Connect Google Tag Manager to your storekit store to track customer behaviour, measure conversions, and manage analytics and marketing tags.
Connect your store to Google Tag Manager (GTM) to track customer behaviour, measure conversions, and manage analytics tags.
Meta tracking is configured separately. See [Meta Pixel and Conversions API](/docs/guides/integrations/marketing/meta-tracking).
## What's Tracked
storekit pushes standard e-commerce events to the GTM data layer:
| Event | Description |
| --------------- | ------------------------------------- |
| **Page view** | Customer views a page on your store |
| **Add to cart** | Customer adds a product to their cart |
| **Checkout** | Customer begins the checkout process |
| **Purchase** | Customer completes an order |
## Setup
Google Tag Manager is configured separately for each store.
1. Go to **Stores** → your store → **Settings** → **Integrations** → **Google Tag Manager**
2. Enter your **Google Tag Manager ID** (format: `GTM-XXXXXXX`) and click **Save**
Repeat for each store you want tracked.
## Use Cases
| Use Case | Platform | Description |
| ----------------------- | -------- | ------------------------------------------------------- |
| **Conversion tracking** | GTM | Measure how many visits result in orders |
| **ROI measurement** | GTM | Track revenue generated from specific campaigns |
| **Custom analytics** | GTM | Send events to Google Analytics, Hotjar, or other tools |
## Google Tag Manager
GTM acts as a container for all your tracking tags. Once your GTM Container ID is added to storekit, you can manage all tags, triggers, and variables from the GTM dashboard without editing your store settings.
### Verifying Your Setup
After adding your GTM Container ID:
1. Install the **GTM Preview** browser extension
2. Open your store in preview mode
3. Verify that tags fire on page views, add to cart, and purchase events
### Reconciling with Google Analytics
The purchase event storekit pushes to the GTM data layer carries two order identifiers:
| Data layer field | Value |
| ---------------- | ------------------------------------------------------------------------------ |
| `transaction_id` | The storekit order id, for example `KhDx6jUFP` |
| `order_code` | The short order code shown as `#A7X2` in the dashboard, when the order has one |
So a transaction ID in Google Analytics is the order id. Open that order by putting the value at the end of the order page URL (`/orders/KhDx6jUFP`) — searching for it in **All Orders** returns nothing, because that search box matches order codes only.
To match a batch of Google Analytics transactions against your orders:
In the sidebar, click **Orders**, then **All Orders**, and set the date range and filters you want to export.
Click **Export**, then choose **Expanded**. storekit emails the CSV to the address you are signed in with.
Match the Google Analytics transaction ID against the CSV's **Order id** column; the **Order Code** column next to it gives the code your team uses for the same order.
**Expanded** gives each product in an order its own row, so an order id repeats once per product. **Compact** summarises each order in a single row and omits the product columns; both formats include **Order id** and **Order Code**, so pick **Compact** if you only need order totals.
The **ID** column in **Analytics** → **Accounting** → **All Transactions** is the payment provider's reference for the charge, not the Google Analytics transaction ID. That report's CSV export does contain the order id, in its **Reference ID** column — see [Order and payment identifiers](/docs/guides/reports/transactions-report#order-and-payment-identifiers).
Test your tags thoroughly after setup. Use GTM Preview mode to verify that expected events fire before relying on them for reporting or campaigns.
# Klaviyo
Source: https://storekit.com/docs/guides/integrations/marketing/klaviyo
Send real-time storekit customer and order data to Klaviyo for email and SMS marketing automation. Power abandoned cart, win-back, and post-order flows.
Klaviyo is an email and SMS marketing platform designed for e-commerce. The storekit integration sends real-time customer behaviour and order data to power your marketing campaigns.
## Setup
Klaviyo uses two keys, and storekit saves them in different places: the private key on your storekit account, the public key on the individual store.
1. Log in to your Klaviyo account
2. Go to **Settings** → **API Keys**
3. Copy your private API key (it starts with `pk_`) and your public API key / site ID (a short code such as `aBcXyz`)
4. In storekit, go to **Stores** → your store → **Settings** → **Integrations** → **Klaviyo**
5. Paste the private key into **Private API Key** and click **Connect to Klaviyo**
6. Paste the public key into **Public API Key / site ID**
7. Optionally choose a Klaviyo list under **Lists**
8. Click **Save**
## Scope: One Store at a Time
The **Klaviyo Integration** page always belongs to one store, even though part of what you enter on it is shared:
* **Private API Key** is saved on your storekit account. You enter it once, on any store, and every store in the account can then use it. The field shows **Connected** on every store afterwards.
* Connecting also switches Klaviyo on for **every store in the account**: each store gets its own **Enabled** / **Disabled** toggle, and that toggle starts out **Enabled**. This is why order data can appear in Klaviyo for stores you never opened.
* **Public API Key / site ID** and **Lists** are saved on the single store you are editing. They are not copied to your other stores — repeat those steps on each store you want covered.
* A store sends nothing at all while its toggle is set to **Disabled**, whatever keys are saved.
What each key controls:
| Data | Needs |
| --------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| Order events (**Placed Order**, **Ordered Product**, and the fulfilled, cancelled and refunded events) | Account **Private API Key** + that store's toggle set to **Enabled** |
| On-site browsing events (**Active on Site**, **Viewed Product**, **Added to Cart**, **Started Checkout**) | The store's own **Public API Key / site ID** + that store's toggle set to **Enabled** |
So a store with no **Public API Key / site ID** still sends order events, but sends no browsing events — abandoned cart and browse abandonment flows stay empty for that store.
### Check Which Stores Are Connected
There is no single screen in the dashboard that lists every store's integration status, and there is no account-level Klaviyo page — you check one store at a time:
1. Go to **Stores**
2. Click the store you want to check
3. Click **Settings**
4. Find **Klaviyo** in the integrations list at the bottom of the page (the **Marketing** filter narrows the list)
5. Read the badge on the **Klaviyo** row: **Connected** means Klaviyo is switched on for this store; **Account connected** means your account holds a Klaviyo key but the integration is not switched on for this store
6. Click **Klaviyo** and check whether **Public API Key / site ID** is filled in, to confirm the store also sends browsing events
7. Repeat for every store
**Run historical orders sync** is account-wide, not per store: it sends past orders for every store in the account whose toggle is **Enabled**, and the completed status is shared, so it only runs once per account.
## Tracked Events
The integration automatically tracks customer behaviour on your store:
### Active on Site
Triggered when a customer visits your store.
| Property | Description |
| ----------- | ----------------------------------------- |
| `AccountId` | Your storekit account ID |
| `VenueId` | ID of the store that sent the event |
| `VenueSlug` | URL slug of the store that sent the event |
`VenueId` and `VenueSlug` identify the store an individual event came from. They do not mean every store is sending data — a store only appears in Klaviyo once it is set up as described in [Scope: One Store at a Time](#scope-one-store-at-a-time).
### Viewed Product
Triggered when a customer views a product.
| Property | Description |
| -------------- | ----------------- |
| `ProductId` | Product ID |
| `ProductName` | Product name |
| `ProductPrice` | Product price |
| `ProductImage` | Product image URL |
### Added to Cart
Triggered when a customer adds an item to their cart.
| Property | Description |
| -------------- | ----------------- |
| `ProductId` | Product ID |
| `ProductName` | Product name |
| `ProductPrice` | Product price |
| `ProductImage` | Product image URL |
### Started Checkout
Triggered when a customer begins the checkout process.
| Property | Description |
| ---------- | ------------------- |
| `Currency` | Order currency code |
| `Value` | Cart total value |
## Customer Identification
When a customer enters their email at checkout, they are automatically identified in Klaviyo. This links their browsing behaviour to their profile.
## Order Data
When an order is completed, storekit sends complete order data to Klaviyo including:
* Customer details (name, email, phone)
* Order items and quantities
* Order total and discounts
* Fulfillment method
* Marketing consent status
### Placed Order
Triggered once when an order is completed.
| Property | Description |
| --------- | ---------------------- |
| `OrderId` | Unique order ID |
| `Value` | Order total |
| `Items` | Array of ordered items |
### Ordered Product
Triggered once per line item when an order is completed. Use this event to build product-level flows such as reorder reminders and cross-sell campaigns.
| Property | Description |
| ---------------- | ---------------------------------------------------------------------------- |
| `OrderId` | Unique order ID |
| `ProductID` | Product ID |
| `PLU` | Product PLU code |
| `ProductName` | Product name |
| `Quantity` | Quantity ordered |
| `ItemPrice` | Unit price (excluding modifiers) |
| `BaseTotal` | Unit price × quantity |
| `ModifiersTotal` | Total modifier cost × quantity |
| `Modifiers` | Array of modifier details (ID, name, price, PLU, quantity, charged quantity) |
| `value` | Row total including modifiers |
## Use Cases
### Abandoned Cart Emails
Create flows triggered by "Started Checkout" without a subsequent order:
1. In Klaviyo, create a new Flow
2. Set trigger to "Started Checkout"
3. Add a time delay (e.g., 1 hour)
4. Add condition: has not "Placed Order" since starting flow
5. Send recovery email with cart contents
### Browse Abandonment
Re-engage customers who viewed products but didn't purchase:
1. Create flow triggered by "Viewed Product"
2. Add time delay
3. Exclude customers who placed an order
4. Send personalised product recommendations
### Post-Purchase Campaigns
* Thank you emails
* Review requests
* Reorder reminders
* Cross-sell recommendations
### Customer Segmentation
Build segments based on:
* Purchase frequency
* Average order value
* Product categories purchased
* Time since last order
## Related
View and export customer data
Collect customer reviews
# Mailchimp
Source: https://storekit.com/docs/guides/integrations/marketing/mailchimp
Sync storekit customer data to your Mailchimp audience automatically. Power email campaigns, newsletters, and segmented marketing flows for repeat business.
Mailchimp is an email marketing platform for creating and sending campaigns. The storekit integration automatically syncs customer data to your Mailchimp audience.
## Setup
1. Log in to your Mailchimp account
2. Go to **Account** → **Extras** → **API keys**
3. Generate a new API key
4. Note your **Audience ID** (found in Audience → Settings → Audience name and defaults)
5. In storekit, go to **Stores** → your store → **Settings** → **Integrations**
6. Enter your Mailchimp API Key and Audience ID
7. Save changes
## Synced Data
When a customer places an order, the following data is sent to Mailchimp:
### Contact Information
| Field | Mailchimp Field |
| ---------- | --------------- |
| Email | `EMAIL` |
| First name | `FNAME` |
| Last name | `LNAME` |
| Phone | `PHONE` |
### Custom Fields
| Field | Description |
| ------------- | ------------------------- |
| `ORDER_COUNT` | Total number of orders |
| `TOTAL_SPENT` | Lifetime spend |
| `LAST_ORDER` | Date of most recent order |
| `STORE_NAME` | Store they ordered from |
### Marketing Consent
Only customers who opt-in to marketing are added to your Mailchimp audience. Customers who don't consent are not synced.
## Tags
Customers are automatically tagged in Mailchimp based on:
* **Store name** - Which store they ordered from
* **Order type** - Delivery, Pickup, or Dine-in
* **First order** - New customers are tagged
## Use Cases
### Welcome Series
Send automated emails to new customers:
1. Create an automation triggered by new subscriber
2. Filter by "First order" tag
3. Send welcome email with menu highlights
### Re-engagement Campaigns
Win back lapsed customers:
1. Create a segment: `LAST_ORDER` more than 30 days ago
2. Send a "We miss you" campaign with an offer
### VIP Campaigns
Target your best customers:
1. Segment by `ORDER_COUNT` > 5 or `TOTAL_SPENT` > £100
2. Send exclusive offers or early access to new items
### Location-Based Campaigns
For multi-store operations:
1. Segment by store name tag
2. Send store-specific promotions or updates
## Sync Frequency
Customer data syncs to Mailchimp:
* **Immediately** when a new customer places their first order
* **Daily** for updates to existing customer profiles (order count, total spent)
## Related
View and export customer data
Configure checkout data collection
# Meta Pixel and Conversions API
Source: https://storekit.com/docs/guides/integrations/marketing/meta-tracking
Set up Facebook and Instagram conversion tracking on your storekit store with a Meta Pixel and secure server-side Purchase events via the Conversions API.
Use Meta tracking to measure how Facebook and Instagram ads contribute to visits, checkout activity, and orders on your storekit store.
storekit's recommended setup uses:
* A Meta Pixel or dataset ID to identify the correct data source
* Browser events for customer activity such as page views and checkout
* The Meta Conversions API (CAPI) for authoritative server-side Purchase events, when enabled for your store
## Before you start
You need:
* Access to your organisation's Meta Business Portfolio or Business Suite
* Permission to manage the Pixel or dataset in Meta Events Manager
* The storekit store URL you want to measure
* Approval from the person responsible for your privacy notice, cookie consent, and advertising measurement
Meta increasingly displays website event sources as **datasets** in Events Manager. A dataset linked to a Pixel may use the same ID. Meta documents the relationship in [About datasets in Meta Events Manager](https://www.facebook.com/business/help/750785952855662).
## Do you need a Meta app?
You do not normally need to create your own Meta app for a manual storekit setup.
Meta recommends generating the access token through Events Manager. Meta's documented **Manage Integrations** flow creates the required Conversions API app and system user without App Review. A custom app is generally only needed for an organisation building its own OAuth-based onboarding or managing many advertisers programmatically.
See Meta's current [Conversions API getting started guide](https://developers.facebook.com/docs/marketing-api/conversions-api/get-started/) before creating credentials, because Meta may change labels or permission requirements.
## 1. Select or create the Meta data source
In [Meta Events Manager](https://www.facebook.com/events_manager2), select the Pixel or dataset that should receive events from this store.
Use the same data source for browser and server events. Creating separate data sources for the same storefront makes attribution and deduplication harder.
Record its Pixel or dataset ID. Do not confuse this with an ad account ID, Business Portfolio ID, or Meta app ID.
## 2. Add the ID to storekit
The Meta Pixel integration is configured separately for each store.
In the storekit dashboard, go to **Stores** → your store → **Settings** → **Integrations** → **Meta Pixel**.
Enter the ID in **Meta Pixel ID**.
Click **Save**.
Repeat these steps for every store that should send events to the same or a different Meta data source.
## 3. Generate a Conversions API access token
In your Meta Business account, open Events Manager and select the Pixel or dataset. Then open **Settings**, find **Conversions API**, and under **Set up manually** choose **Generate access token**.
Meta notes that the token option is only visible to users with sufficient business permissions. If the option is missing, ask a Meta Business administrator to complete the step or grant the required access.
Return to the storekit **Meta Pixel** integration, enter the token in **Conversions API access token**, and click **Save**. Server-side tracking is enabled when both the Pixel ID and access token are saved.
Treat the access token as a password. Paste it only into **Conversions API access token**. Do not put it in a support ticket, shared document, analytics tag, browser code, screenshot, or chat message.
## 4. Understand which events are sent
The current setup can include:
| Delivery | Events | Notes |
| ------------------ | ------------------------------------------------------- | ---------------------------------------------------------------------------------- |
| Browser Meta Pixel | `PageView`, `AddToCart`, `InitiateCheckout`, `Purchase` | Enabled by the **Meta Pixel ID** setting |
| Conversions API | `Purchase` | Enabled when both **Meta Pixel ID** and **Conversions API access token** are saved |
Server-side Purchase values come from the completed storekit order rather than values supplied by the browser. Customer identifiers may be normalised and SHA-256 hashed before delivery; website context such as IP address, browser user agent, and source URL may also be sent to support matching and attribution.
## 5. Test before running campaigns
### Check browser events
1. Install Meta's **Meta Pixel Helper** browser extension
2. Open the storekit store
3. Visit a menu, add an item, and begin checkout
4. Confirm that the expected events use the intended Pixel or dataset ID
### Check server events
Meta's **Test Events** tool requires a temporary `test_event_code` to be included in the server request. Ask storekit support to coordinate this test; there is no dashboard field for the code.
In your Meta Business account, open Events Manager, select the Pixel or dataset, and then open **Test Events**.
1. Provide the generated test code through the secure process agreed with storekit support
2. Place a test order
3. Confirm that Meta receives a server-side `Purchase`
Remove the test code after verification. Meta warns that Test Events can still be used for ads measurement, so use a genuine controlled test rather than repeatedly sending production orders with a test code.
You can also check **Overview** in Events Manager after a real order to confirm that production events are arriving.
## Prevent duplicate Purchase events
Duplicate Purchase events can inflate reported revenue and campaign performance.
* Do not add a second Meta `Purchase` tag through Google Tag Manager
* Do not install another Meta Pixel plugin on the same store
* Use the same Pixel or dataset for browser and server delivery
* Coordinate the browser-to-server rollout with storekit support
Meta deduplicates matching browser and server events only when they carry the same event name and event ID. If Events Manager shows separate Browser and Server Purchase events rather than a deduplicated event, pause campaign decisions based on those totals and contact storekit support.
## Privacy and consent
Server-side delivery does not remove your privacy obligations or replace cookie and consent controls.
Before enabling Meta tracking:
* Confirm the lawful basis for advertising measurement in every region where you operate
* Update your privacy and cookie notices to describe Meta and server-side conversion measurement
* Make sure your consent configuration matches the advice of your legal or privacy team
* Avoid sending data that your organisation has not approved for advertising use
* Review Meta's Business Tools Terms and data-processing requirements
## Recommended rollout
1. Configure one non-critical store first
2. Verify the Pixel or dataset ID
3. Check browser events before enabling server delivery
4. Enter the Conversions API access token and save the integration
5. Complete a controlled test order
6. Confirm one Purchase is counted, with no duplicate revenue
7. Compare storekit orders with Meta reporting over several days
8. Roll out to the remaining stores
## Troubleshooting
### The access-token option is missing
You may not have sufficient Meta Business permissions. Ask an administrator to check your access to the Pixel or dataset and follow Meta's current getting-started guide.
### No server Purchase appears
Confirm that:
* Both **Meta Pixel ID** and **Conversions API access token** are saved
* The Pixel or dataset ID matches the selected Meta data source
* The test order completed successfully
* Events Manager is showing the expected date range and data source
### Revenue is higher than storekit
Look for duplicate Browser and Server Purchase events, custom GTM Purchase tags, another Pixel plugin, or the same test order being submitted more than once.
### Events have low match quality
Complete the test with realistic customer details, check that the storefront is supplying a normal browser user agent and source URL, and review Meta's diagnostics for missing parameters.
## Related
Configure GTM separately from Meta tracking
Understand the customer information stored in storekit
# Stampede
Source: https://storekit.com/docs/guides/integrations/marketing/stampede
Connect storekit customer data to Stampede for hospitality CRM and WiFi marketing. Enrich guest profiles and run automated email and SMS campaigns at scale.
Stampede is a hospitality CRM and WiFi marketing platform. The storekit integration syncs customer and order data to enrich your guest profiles and power automated marketing.
## Setup
1. Log in to your Stampede account
2. Go to **Stores** → your store → **Settings** → **Integrations**
3. Generate an API key for storekit
4. In storekit, go to **Stores** → your store → **Settings** → **Integrations**
5. Enter your Stampede API key
6. Save changes
## Synced Data
When a customer places an order, the following data is sent to Stampede:
### Guest Profile
| Field | Description |
| ------------------ | ----------------------- |
| `email` | Customer email address |
| `firstName` | First name |
| `lastName` | Last name |
| `phone` | Phone number |
| `marketingConsent` | Marketing opt-in status |
### Order Data
| Field | Description |
| ------------ | ---------------------------- |
| `orderId` | Unique order ID |
| `orderDate` | Date and time of order |
| `orderTotal` | Order total amount |
| `orderType` | Delivery, Pickup, or Dine-in |
| `items` | List of ordered items |
| `storeId` | Store ID |
| `storeName` | Store name |
### Aggregated Metrics
| Metric | Description |
| ------------------- | ------------------------- |
| `totalOrders` | Lifetime order count |
| `totalSpend` | Lifetime revenue |
| `averageOrderValue` | Average order amount |
| `firstOrderDate` | Date of first order |
| `lastOrderDate` | Date of most recent order |
## Profile Enrichment
If you use Stampede WiFi, customer profiles are automatically matched:
* WiFi login email matches order email
* Combined view of visits and orders
* Richer segmentation options
## Use Cases
### Visit + Order Campaigns
Target customers based on both WiFi visits and orders:
1. Segment: visited 3+ times, ordered 0 times
2. Send offer to convert visitors to customers
3. Track conversion through orders
### Loyalty Recognition
Identify and reward your best customers:
1. Segment by combined visit + order frequency
2. Send VIP offers or exclusive access
3. Recognise high-value guests in-venue
### WiFi Capture to Order
Convert WiFi signups into orders:
1. Trigger automation when guest logs into WiFi
2. Send welcome email with first-order offer
3. Track orders from WiFi-captured emails
### Lapsed Customer Recovery
Re-engage customers who've stopped visiting:
1. Segment: last order 30+ days, previously regular
2. Send "We miss you" campaign
3. Include personalised offer based on past orders
## Attribution
Track which marketing campaigns drive orders:
* UTM parameters captured on orders
* Match campaigns to conversions
* Measure ROI by channel
## Related
View and export customer data
Configure checkout data collection
# OpenTable
Source: https://storekit.com/docs/guides/integrations/opentable
Connect OpenTable reservations with your storekit Order & Pay or Pay at Table setup. Create a unified guest experience from booking through payment in one flow.
The OpenTable integration links your reservation system with storekit's Order & Pay or Pay at Table setup, creating a seamless guest experience from booking to payment.
## Benefits
| Benefit | Description |
| ------------------------------- | --------------------------------------------- |
| **Seamless guest experience** | Reservations and ordering in one unified flow |
| **Reservation-linked ordering** | Connect orders to specific reservations |
| **Consolidated operations** | Manage bookings and orders from fewer systems |
## How It Works
Once connected, reservation data from OpenTable can be linked to storekit orders. This allows your team to associate incoming orders with the guest's reservation for a more personalised service experience.
## Setup
To enable the OpenTable integration:
1. Contact storekit support to request activation
2. Provide your OpenTable account details
3. storekit configures the connection between your accounts
4. Reservation data becomes available alongside your storekit orders
The OpenTable integration requires an active OpenTable account and a storekit store with Order & Pay or Pay at Table enabled.
## Menu Sync
Once connected, you can sync your storekit menu to OpenTable:
1. Go to **Integrations** > **OpenTable** in your storekit dashboard
2. Click **Sync Menu** to push your latest menu to OpenTable
3. The sync happens immediately when triggered from the admin panel
Menu syncs ensure your OpenTable listings reflect your current storekit menu, including items, prices, and availability.
For setting up pay-at-table functionality, see [Pay at Table Overview](/docs/guides/pay-at-table/overview).
# Operations
Source: https://storekit.com/docs/guides/integrations/operations
Connect storekit to operations and workflow tools to streamline daily processes including kitchen displays, inventory, scheduling, and management reporting.
Content coming soon.
# Integrations Overview
Source: https://storekit.com/docs/guides/integrations/overview
Connect storekit to your existing tools and workflows including POS, delivery, marketing, loyalty, and analytics platforms. Browse all available integrations.
storekit is designed to work seamlessly with your existing technology stack. We take an open approach to integrations, building connections that are reliable, well-maintained, and genuinely useful for hospitality businesses.
## Our Approach
### Two-Way Sync
We don't believe in one-way data dumps. Our integrations are built for **bi-directional communication** wherever possible:
* **Menu sync** pulls products from your POS and pushes availability updates back
* **Order flow** sends orders to your systems and receives status updates
* **Inventory** reflects real-time stock levels across platforms
This means your storekit menu stays in sync with your POS without manual updates, and your POS always has the latest order information.
### Reliability First
Integrations only work if they're reliable. We invest heavily in:
* **Retry logic** - Failed requests are automatically retried with exponential backoff
* **Monitoring** - We track integration health and proactively fix issues
* **Graceful degradation** - If an integration is temporarily unavailable, orders continue to flow
* **Audit logs** - Full visibility into what data was sent and received
### Built for Hospitality
Every integration is designed specifically for hospitality workflows. We understand the nuances of menu management, order timing, kitchen operations, and customer expectations.
## Integration Categories
Sync menus, send orders, and track inventory with your point of sale
Connect delivery fleets for automated dispatch and tracking
Send customer data to your email and marketing platforms
Integrate rewards programs and gift card systems
## Available Integrations
### POS Systems
| Integration | Menu Sync | Order Push | Inventory |
| ------------------------------------------------------------------------ | --------- | ---------- | --------- |
| [Toast](/docs/guides/integrations/pos/toast/overview) | ✓ | ✓ | ✓ |
| [Zonal (Aztec)](/docs/guides/integrations/pos/zonal) | ✓ | ✓ | ✓ |
| [Lightspeed K-Series](/docs/guides/integrations/pos/lightspeed/overview) | ✓ | ✓ | ✓ |
| [TISSL](/docs/guides/integrations/pos/tissl) | ✓ | ✓ | - |
### Delivery Providers
| Integration | Auto-Dispatch | Live Tracking | Driver Details |
| ------------------------------------------------------------- | ------------- | ------------- | -------------- |
| [Uber Direct](/docs/guides/integrations/delivery/uber-direct) | ✓ | ✓ | ✓ |
| [Shipday](/docs/guides/integrations/delivery/shipday) | ✓ | ✓ | ✓ |
| [Nash](/docs/guides/integrations/delivery/nash) | ✓ | ✓ | ✓ |
| [Orkestro](/docs/guides/integrations/delivery/orkestro) | ✓ | ✓ | ✓ |
| [Pedalme](/docs/guides/integrations/delivery/pedalme) | ✓ | ✓ | ✓ |
| [Cyclone](/docs/guides/integrations/delivery/cyclone) | ✓ | ✓ | ✓ |
### Marketing Platforms
| Integration | Customer Sync | Order Events | Segmentation |
| ---------------------------------------------------------- | ------------- | ------------ | ------------ |
| [Klaviyo](/docs/guides/integrations/marketing/klaviyo) | ✓ | ✓ | ✓ |
| [Mailchimp](/docs/guides/integrations/marketing/mailchimp) | ✓ | ✓ | - |
| [Airship](/docs/guides/integrations/marketing/airship) | ✓ | ✓ | ✓ |
| [Stampede](/docs/guides/integrations/marketing/stampede) | ✓ | ✓ | - |
| [Acteol](/docs/guides/integrations/marketing/acteol) | ✓ | ✓ | - |
## Request an Integration
Don't see what you need? We're always evaluating new integrations based on customer demand.
Tell us which integrations would help your business. Popular requests get prioritised for development.
When requesting a new integration, it helps to include:
* The platform or service you want to connect
* Your use case and what data needs to flow
* How many of your venues would use it
## Build Your Own
For custom requirements, our [Webhooks](/docs/developers/webhooks/overview) let you build your own integrations. Receive real-time events for orders, payments, feedback, and more.
# PLU Mapping Guide
Source: https://storekit.com/docs/guides/integrations/pos/advanced/plu-mapping
Best practices for mapping products between storekit and your POS using PLU codes. Avoid common pitfalls and ensure orders flow accurately to the kitchen.
PLU (Price Look-Up) codes are unique identifiers that link products between storekit and your POS system. Correct PLU mapping ensures orders flow accurately to your kitchen.
## Understanding PLU Codes
A PLU code is a number or alphanumeric code that uniquely identifies a product in your POS. When storekit sends an order to your POS, it includes the PLU code so the POS knows exactly which item was ordered.
### Example PLU Mapping
| storekit Product | POS PLU | POS Name |
| --------------------------- | ------- | ---------- |
| Margherita Pizza | 1001 | MARG-12 |
| Pepperoni Pizza | 1002 | PEPP-12 |
| Extra Cheese (modifier) | 2001 | MOD-CHEESE |
| Gluten Free Base (modifier) | 2002 | MOD-GF |
## When PLU Mapping Is Required
PLU mapping is required for **manual linking integrations** where menus aren't automatically synced:
* TISSL
* Comtrex
* Centegra
* Other PLU-based integrations
For **automatic sync integrations** (Zonal, Lightspeed), PLU mapping happens automatically during menu sync.
## Setting Up PLU Mapping
### Step 1: Export PLU List from POS
Get a complete list of PLU codes from your POS:
1. Log into your POS back office
2. Export or print your product list with PLU codes
3. Include modifiers and variants
Create a spreadsheet with columns for: POS PLU, POS Name, storekit Product Name, Category. This becomes your reference document.
### Step 2: Add PLUs to storekit Products
For each product:
1. Go to **Menu** in your storekit dashboard
2. Click on a product to edit
3. Find the **PLU** or **POS Settings** field
4. Enter the exact PLU code
5. Save the product
### Step 3: Map Modifiers
Modifiers need PLUs too:
1. Go to your modifier groups
2. Edit each modifier option
3. Enter the PLU code for each option
4. Save changes
### Step 4: Verify Mappings
Before going live:
1. Review your PLU spreadsheet
2. Check every storekit product has a PLU
3. Verify PLUs match exactly (case-sensitive for some systems)
4. Test with sample orders
## PLU Mapping Best Practices
### Keep a Master Reference
Maintain a spreadsheet that maps:
* storekit product ID/name
* POS PLU code
* POS product name
* Last updated date
* Notes
Update this document whenever you make changes.
### Use Consistent Naming
When creating products in storekit, use naming that makes PLU matching easier:
| Instead of | Use |
| -------------------- | ----------------------- |
| "The Classic Burger" | "Classic Burger (1001)" |
| "Large Fries" | "Fries - Large (2050)" |
Including PLU in the internal name helps during audits.
### Handle Variants Correctly
Products with size or variant options often have different PLUs:
| Product | Variant | PLU |
| ------- | ------- | ---- |
| Latte | Small | 3001 |
| Latte | Medium | 3002 |
| Latte | Large | 3003 |
In storekit, you can either:
* Create separate products for each size
* Use modifiers with individual PLUs
### Plan for Modifiers
Modifiers typically fall into categories:
| Type | PLU Strategy |
| ---------------------------------------- | --------------------------------------------- |
| **Add-ons** (extra cheese) | Unique PLU per add-on |
| **Removals** (no onions) | May not need PLU, or use specific removal PLU |
| **Substitutions** (swap chips for salad) | PLU for the substitution item |
Some POS systems handle removals differently. Check with your POS provider how to configure "no X" modifiers.
### Document Special Cases
Note any unusual mappings:
* Products with multiple PLUs (combos)
* Time-based PLUs (lunch vs dinner pricing)
* Location-specific PLUs (multi-venue setups)
## Common PLU Mapping Issues
### Mismatched PLUs
**Problem:** Order shows wrong item in POS
**Cause:** PLU in storekit doesn't match POS
**Solution:**
1. Check the PLU on the storekit product
2. Verify against your POS product list
3. Correct any mismatches
4. Test with a new order
### Missing PLUs
**Problem:** Order fails or items missing
**Cause:** Product in storekit has no PLU assigned
**Solution:**
1. Identify products without PLUs
2. Look up correct PLU in POS
3. Add PLU to storekit product
4. Save and test
### PLU Not Found in POS
**Problem:** Error indicates PLU doesn't exist
**Cause:**
* PLU was deleted from POS
* Typo in PLU code
* PLU exists in different location/menu
**Solution:**
1. Verify PLU exists in POS
2. Check for typos (extra spaces, wrong characters)
3. Confirm PLU is active and visible
4. Update storekit if PLU changed
### Modifier PLUs Failing
**Problem:** Base product works but modifiers fail
**Cause:** Modifier PLUs missing or incorrect
**Solution:**
1. Check all modifier options have PLUs
2. Verify modifier PLUs exist in POS
3. Test each modifier individually
## Multi-Venue PLU Management
If you have multiple venues:
### Same POS, Same Menu
* PLUs are typically consistent
* Use the same PLU mapping across venues
### Same POS, Different Menus
* PLUs may differ per venue
* Maintain separate PLU mappings per venue
* Document venue-specific codes
### Different POS Systems
* Each venue needs its own PLU setup
* Maintain separate reference documents
* Consider standardising where possible
## PLU Audit Checklist
Run this audit before going live and periodically after:
* [ ] All products have PLUs assigned
* [ ] All modifiers have PLUs assigned
* [ ] PLUs match exactly with POS (no typos)
* [ ] PLU reference document is current
* [ ] Test orders work correctly
* [ ] Price points are accurate
* [ ] Modifiers appear correctly on tickets
* [ ] New items added since last audit are mapped
## Maintaining PLU Mappings
### When Adding New Items
1. Create product in POS first
2. Note the assigned PLU
3. Create product in storekit with PLU
4. Update your reference document
5. Test the new item
### When Removing Items
1. Remove from storekit (or mark unavailable)
2. Update your reference document
3. Optionally remove from POS
### When PLUs Change
1. Update storekit product with new PLU
2. Update reference document
3. Test affected products
4. Note the change date for troubleshooting
For further assistance, [contact support](/docs/getting-started/contact-support).
# POS Troubleshooting
Source: https://storekit.com/docs/guides/integrations/pos/advanced/troubleshooting
Diagnose and resolve common POS integration issues in storekit including missing orders, menu sync errors, mapping problems, and connection timeouts.
## Diagnostic Tool
Answer a few questions to diagnose your issue:
***
This guide covers common issues with POS integrations and how to resolve them.
## Connection Issues
### Integration Won't Connect
**Symptoms:**
* "Connection failed" error when setting up
* Unable to save integration settings
* Test connection fails
**Solutions:**
1. **Verify credentials**
* Double-check API keys, secrets, and site IDs
* Ensure no extra spaces in copied credentials
* Confirm credentials haven't expired
2. **Check POS status**
* Verify your POS system is online
* Ensure cloud connectivity is enabled
* Check for POS system outages
3. **Network issues**
* Confirm your venue has internet connectivity
* Check firewall settings aren't blocking API calls
* Try from a different network if possible
4. **Contact your POS provider**
* Verify API access is enabled on your account
* Request new credentials if existing ones don't work
### Connection Drops Intermittently
**Symptoms:**
* Integration works sometimes but not always
* Orders occasionally fail to inject
* Sync completes sometimes but fails others
**Solutions:**
1. **Check internet stability**
* Unstable connections cause intermittent failures
* Consider a backup internet connection
2. **Review POS uptime**
* Some POS systems restart overnight
* Check if failures correlate with maintenance windows
3. **Monitor API limits**
* Some POS systems have rate limits
* Reduce sync frequency if hitting limits
## Menu Sync Issues
### Menu Not Syncing
**Symptoms:**
* Sync button does nothing
* Products don't appear after sync
* Sync runs but menu is empty
**Solutions:**
1. **Check integration is connected**
* Go to **Stores** → your store → **Settings** → **Integrations**
* Verify the POS shows as connected
2. **Verify menu in POS**
* Ensure products are active/published
* Check products are assigned to categories
* Confirm the menu type is correct
3. **Try manual sync**
* Use the sync button in the Menu section
* Wait for sync to complete fully
* Check for error messages
### Products Missing After Sync
**Symptoms:**
* Some products sync but others don't
* Modifiers are missing
* Categories are incomplete
**Solutions:**
1. **Check product status in POS**
* Products must be active/enabled
* Products need to be assigned to a menu
* Check product visibility settings
2. **Review menu structure**
* Products outside categories may not sync
* Some integrations only sync specific menu types
* Verify the correct menu is selected
3. **Check for sync errors**
* Review any error messages after sync
* Individual products may fail while others succeed
### Prices Are Wrong
**Symptoms:**
* Synced prices don't match POS
* Prices are doubled or halved
* Tax appears incorrectly
**Solutions:**
1. **Tax settings mismatch**
* Check if POS prices include tax
* Verify storekit tax settings match
* Ensure tax rates are configured correctly
2. **Currency issues**
* Confirm currency settings match
* Check for decimal place differences
3. **Re-sync after changes**
* Prices won't update until you sync
* Trigger a manual sync after price changes in POS
## Order Injection Issues
### Orders Not Appearing in POS
**Symptoms:**
* Customer receives confirmation
* Order shows in storekit dashboard
* Order never appears in POS
**Solutions:**
1. **Check integration status**
* Verify integration is enabled
* Check for disconnection warnings
2. **Review order in dashboard**
* Look at order details for errors
* Check POS injection status field
3. **Verify POS is online**
* Check terminal is powered on
* Confirm network connectivity
* Try placing an order directly in POS
4. **Check PLU codes (manual linking)**
* Ensure all items have valid PLUs
* Verify PLUs exist in POS system
5. **Check for email notifications**
* If order injection fails, you'll receive an email notification
* The email includes the specific error reason and order details
* Check your venue email address is configured correctly
### Orders Appearing Late
**Symptoms:**
* Orders arrive in POS minutes/hours late
* Pre-orders arrive at wrong times
* ASAP orders are delayed
**Solutions:**
1. **Check injection settings**
* Review pre-order injection timing
* Verify ASAP orders are set to immediate
2. **Network latency**
* Slow connections delay injection
* Check overall network performance
3. **POS queue issues**
* Some POS systems queue incoming orders
* Check POS settings for order processing
### Items Missing from Orders
**Symptoms:**
* Order appears but items are missing
* Modifiers don't show
* Partial order in POS
**Solutions:**
1. **PLU mapping issues**
* Missing PLUs cause items to fail
* Check all products and modifiers have PLUs
2. **Product mismatch**
* Item may have been deleted from POS
* Re-sync menu to update mappings
3. **Modifier configuration**
* Verify modifiers are linked correctly
* Check modifier group settings
### Wrong Items on Orders
**Symptoms:**
* POS shows different items than ordered
* Quantities are wrong
* Modifiers applied to wrong items
**Solutions:**
1. **PLU codes incorrect**
* Wrong PLU maps to wrong product
* Audit PLU mappings against POS
2. **Duplicate PLUs**
* Same PLU used for multiple products
* Ensure PLUs are unique
3. **Recent menu changes**
* Products may have been remapped
* Re-sync and verify mappings
## Discount & Loyalty Issues
### Discounts Not Applying
**Symptoms:**
* Loyalty discounts don't appear
* Promotional pricing not working
* Customer balance not reflected
**Solutions:**
1. **Verify discount is active**
* Check promotion is enabled in POS
* Confirm date range is current
* Verify terms are met
2. **Customer qualification**
* Check customer is enrolled in loyalty
* Verify customer meets discount criteria
* Confirm online orders are eligible
3. **Integration settings**
* Some discounts need explicit enablement
* Check discount sync settings
### Wrong Discount Amounts
**Symptoms:**
* Discount applied but amount is wrong
* Percentage calculated incorrectly
* Discount appears twice
**Solutions:**
1. **Check discount rules**
* Verify discount calculation method
* Check for stacking rules
2. **Tax interaction**
* Confirm discount applies before/after tax
* Check both systems use same method
## Email Notifications for Failed Syncs
storekit automatically sends email notifications when orders or payments fail to sync to your POS, ensuring you never miss critical information.
### Failed Order Notifications
When an order fails to sync to your POS, you'll receive an email that includes:
* **Order details** - Customer name, order ID, and payment method
* **Error reason** - Specific technical details about why the sync failed
* **Order items** - A summary of what was ordered (with images when available)
* **Quick actions** - Direct link to view the order in your dashboard
Failed order emails are sent even if the customer has already paid online, ensuring you never miss an order that needs manual attention.
#### What to Do When You Receive a Failed Order Email
1. **Check the error reason** - The email includes specific details about why the sync failed
2. **View the order in dashboard** - Click the link in the email to see full order details
3. **Fix the underlying cause** - For example, switch the POS terminal or iPad app back on, or unsnooze a required modifier that is missing from the order
4. **Resend the order to your POS yourself** - Open the order, click **More actions**, then **Resend order to POS**. The dashboard confirms with **Queued POS order injection retry** and the order is sent to your POS again
5. **Manually enter the order** - If the retry still fails, enter the order directly into your POS as a fallback
6. **Contact support** - If the issue persists, our support team has already been notified and can help resolve it
**Resend order to POS** only appears on orders that have not reached the POS yet, at stores with a POS integration connected. Once the order has reached the POS the action disappears. Always fix the cause first — resending before that will fail for the same reason.
### Bill Payment Failure Notifications
When a Pay at Table payment succeeds but fails to sync to your POS, you'll receive an email notification. This is critical because the customer has already paid, but your POS may not reflect it.
The notification includes:
* **Bill details** - Bill ID and venue name
* **Payment information** - Payment ID and transaction details
* **Error reason** - Specific technical details about why the sync failed
* **Reference IDs** - Both storekit and POS bill IDs for reconciliation
* **Quick actions** - Direct link to view the bill in your dashboard
Bill payment failure emails indicate the customer has already paid successfully. You may need to manually reconcile this payment in your POS to avoid discrepancies.
#### What to Do When You Receive a Bill Payment Failure Email
1. **Check the error details** - The email includes specific information about why the sync failed
2. **View the bill in dashboard** - Click the link to see full payment details
3. **Manually reconcile in POS** - Mark the bill as paid in your POS if needed
4. **Contact support** - Our team is automatically notified and can help with recurring issues
### Ensuring You Receive Notifications
Make sure your venue email address is configured correctly:
1. Go to **Store Settings** in your dashboard
2. Navigate to **Store Details**
3. Verify your email address is correct
4. Add multiple email addresses if needed (the first address will receive notifications)
## Getting Help
If you've tried these solutions and still have issues:
1. **Gather information**
* Note the specific error messages
* Record the order ID(s) affected
* Take screenshots if possible
* Check for failed order email notifications
2. **Check POS provider status**
* Look for system-wide issues
* Contact POS support for their end
3. **Contact storekit support**
* Provide order IDs and error details
* Share integration settings (not credentials)
* Forward any failed order email notifications
[Contact support](/docs/getting-started/contact-support) for further assistance.
# Centegra
Source: https://storekit.com/docs/guides/integrations/pos/centegra
Connect Centegra POS to storekit for order injection. Link products with PLUs to send online orders to your existing tills, with tables mapped by POS ID.
Centegra is an enterprise POS system commonly used in hospitality. The storekit integration enables automatic order injection. Menu management uses manual product linking - you build your menu in storekit and link products to their Centegra IDs.
## What You Get
* **Order injection** - Online orders sent directly to Centegra
* **Table mapping** - Route dine-in orders to a Centegra Location and table by POS ID
* **Manual product linking** - Full control over your online menu presentation
## Getting Started
### What You'll Need
Contact your Centegra account manager to get:
* **Secure Key** - Your company-level API key
* **Site ID** - Identifies your specific location
You'll also need to configure venue-specific settings in the storekit dashboard after connecting.
### Connecting Centegra
1. Go to **Stores** → your store → **Settings** → **Integrations** in your storekit dashboard
2. Select **Centegra**
3. Enter your **Secure Key**
4. Click **Connect**
### Selecting Your Site
After connecting at the account level:
1. Go to **Stores** → your store → **Settings** → **Integrations** → **Centegra**
2. Select your Centegra **Site** from the available options
3. The Site ID is saved for order routing
### Configuring Venue Settings
Each venue requires specific Centegra settings:
| Setting | Description |
| ------------------- | --------------------------------------------- |
| **Location** | The area/location within your site for orders |
| **Till** | Which till receives online orders |
| **Till Secure Key** | Authentication key for the selected till |
| **Clerk** | The clerk ID used for online orders |
| **Media** | Payment media type for online payments |
| **Source** | Source identifier for online orders |
| **Price Level** | Which price level to use for order items |
All settings must match valid values in your Centegra system. Incorrect configuration will cause orders to fail.
## Linking Products
Centegra uses **manual product linking** - products aren't automatically synced from your POS.
### How It Works
1. Create your menu in storekit with categories, products, and modifiers
2. For each product, enter its **Centegra Product ID** in the POS ID field
3. For each modifier, enter its **Centegra Product ID**
4. When orders are placed, storekit sends the Product IDs to Centegra
### Finding Product IDs
Your Centegra Product IDs can be found in:
* The Centegra back office under Products
* Product export reports
* By contacting your Centegra support team
### Linking Modifiers
Modifiers also need Product IDs from Centegra:
1. Go to your modifier groups in storekit
2. For each modifier option, enter its Centegra Product ID
3. Modifiers are sent as child items linked to their parent product
## How Orders Work
### Order Flow
1. Customer places order on your storekit store
2. Order is validated with Centegra (`TransactionValidate`)
3. If valid, order is submitted (`Transaction`)
4. Order appears in Centegra on the configured till
5. Customer receives confirmation with transaction ID
If an order fails to sync to Centegra, you'll receive an email notification with the error details and a direct link to the order in your dashboard.
### Order Types
| Online Order | Centegra Transaction Type |
| ------------ | ------------------------- |
| Pickup | Type 2 |
| Delivery | Type 3 |
### What Centegra Receives
Each order includes:
* External transaction ID (timestamp-based)
* Location, till, and clerk IDs
* All items with Product IDs, quantities, and prices
* Modifiers as child items linked to parents
* Calculated discounts distributed across items
* Payment details with media ID
* Customer name, email, phone
* Order reference number
* Preparation start time (for scheduling)
* Order notes
### Discounts
When a discount is applied:
* The discount amount is distributed proportionally across all items
* Each item shows its unit price, gross total, and discount amount
* Centegra receives the full discount breakdown
### Tips
Tips are handled as a negative payment line item, keeping the order total accurate while tracking gratuity separately.
## Tables and Dine-In Routing
The Centegra settings page has no floorplan or table sync button. Create your areas and tables in storekit (see [dine-in tables](/docs/guides/fulfillment/dine-in-tables)) and give each table the matching Centegra POS ID, so dine-in orders route to the right table within the configured **Location**.
## Troubleshooting
### Connection Issues
**"Secure Key not found"**
* Verify your Secure Key is entered correctly at the account level
* Contact Centegra support to confirm your API access
**"Site not found"**
* Check the Site ID matches your location in Centegra
* Ensure your Secure Key has access to this site
### Order Issues
**Orders failing validation**
* Check all venue settings are configured (location, till, clerk, etc.)
* Verify the Till Secure Key is correct
* Ensure all products have valid Centegra Product IDs
**"Product doesn't have posId"**
* The failing item is missing its Centegra Product ID
* Edit the product in storekit and add the POS ID
**"Modifier doesn't have posId"**
* A modifier option is missing its Product ID
* Edit the modifier and add the Centegra Product ID
### Wrong Items or Prices
* Verify Product IDs match between storekit and Centegra
* Check the Price Level setting is correct for your online menu
* Ensure tax rates are configured on products
### Dine-In Orders Not Reaching the Right Table
* Confirm your venue has a valid Site ID (posId)
* Check the **Location** selected in the storekit Centegra settings exists in Centegra
* Verify each storekit table carries the POS ID of the matching Centegra table
## Go-Live Checklist
Before launching:
* [ ] Secure Key entered at account level
* [ ] Venue settings configured (location, till, clerk, media, source, price level)
* [ ] All products have Centegra Product IDs
* [ ] All modifiers have Centegra Product IDs
* [ ] Place a test pickup order
* [ ] Verify order appears on the correct till in Centegra
* [ ] Check items, modifiers, and prices are correct
* [ ] Test a delivery order with full address
* [ ] Create tables in storekit with their Centegra POS IDs (if using dine-in)
## Supported Features
| Feature | Supported |
| ---------------------- | :-------: |
| Automatic menu sync | ✗ |
| Manual product linking | ✓ |
| Product images | ✗ |
| Allergens | ✗ |
| Nutrition info | ✗ |
| Nested modifiers | ✗ |
| Subcategories | ✗ |
| Stock status | ✗ |
Centegra uses manual product linking. Create your menu in storekit and enter the Centegra Product ID for each item.
| Feature | Supported |
| -------------------------- | :-------: |
| Order injection | ✓ |
| Pre-orders | ✓ |
| Order buffering | ✗ |
| Basket validation | ✗ |
| Auto-snooze sold out items | ✗ |
| Discounts | ✓ |
| Tips | ✓ |
| Service charge | ✗ |
| Custom order notes | ✓ |
| Delivery details | ✓ |
| Feature | Supported |
| --------------------------- | :-------: |
| Live bill sync | ✗ |
| Apply payments to bill | ✗ |
| Split payments | ✗ |
| Track POS terminal payments | ✗ |
| Add to existing bill | ✗ |
| Feature | Supported |
| ----------------------- | :-------: |
| Floor plan sync | ✗ |
| Real-time stock updates | ✗ |
| Multi-site support | ✓ |
## Related
* [POS Integration Overview](/docs/guides/integrations/pos/overview)
* [PLU Mapping Guide](/docs/guides/integrations/pos/advanced/plu-mapping)
* [Troubleshooting POS Issues](/docs/guides/integrations/pos/advanced/troubleshooting)
# Connecting Lightspeed
Source: https://storekit.com/docs/guides/integrations/pos/lightspeed/connect
Authorise storekit with Lightspeed K-Series over OAuth, pick your business location, create the required product codes, and turn the integration on.
Connecting Lightspeed links one storekit store to one Lightspeed K-Series business location. You authorise storekit in Lightspeed, choose the location, then configure the store's settings and enable the integration.
## Prerequisites
* An active Lightspeed K-Series subscription with API access
* Lightspeed back office credentials for the business you're connecting
* The Lightspeed integration enabled on your storekit account
If **Lightspeed K-Series** does not appear in your **Integrations** list, the integration isn't enabled for your account yet — [contact storekit support](/docs/getting-started/contact-support).
## Connect Your Location
Go to **Stores** → your store → **Settings** → **Integrations**, then select **Lightspeed K-Series**.
Click **Connect to Lightspeed**. You're taken to Lightspeed to sign in and authorise storekit's access.
You return to storekit on the **Select your Lightspeed location:** screen, which lists every business and location on the account. Click the one that matches this store. You'll see a **Lightspeed Connected!** confirmation and land back on the Lightspeed settings page.
In your Lightspeed back office, create the products storekit uses for delivery fees, service charges and discounts (see below), then paste their SKUs into the settings page.
Work through the settings on the page — at minimum select a **Lightspeed Menu**, set your **Account Profile Codes** and choose a **Payment Method**. Menu, order, stock and dine-in options each have their own guide.
Switch **Integration Status** on. The label next to it reads *Enabled - sending orders to Lightspeed* when the store is live.
Click **Save**.
Each storekit store connects to a single Lightspeed business location. For multi-site accounts, repeat this for every store.
## Product Codes You Need in Lightspeed
storekit adds delivery fees, service charges and discounts to an order as ordinary Lightspeed line items, so the matching products must exist in Lightspeed first. Set each one on **Stores** → your store → **Settings** → **Integrations** → **Lightspeed K-Series**:
| Setting | What it's for | Default used if left empty |
| ------------------------------------- | -------------------------------------------------------- | -------------------------- |
| **Delivery Product Code (SKU)** | Line item for the delivery fee on delivery orders | `STOREKIT_DELIVERY` |
| **Service Charge Product Code (SKU)** | Line item for the service charge | `STOREKIT_SERVICE_CHARGE` |
| **Discount Product Code (SKU)** | Negative line item used to pass a discount to Lightspeed | `STOREKIT_DISCOUNT` |
If the SKU doesn't exist in Lightspeed, any order carrying that charge will be rejected by Lightspeed and shows as failed in storekit. Create the products before you go live.
## Other Connection Settings
* **Payment Method** — the Lightspeed payment method online orders are recorded against. The dropdown is populated from your Lightspeed payment methods; if nothing is selected storekit sends `STOREKIT`.
* **Language** — which Lightspeed locale storekit reads product names and descriptions from. Options come from the locales configured on your Lightspeed business.
* **Integration Status** — the master switch. When it's off, storekit keeps the authorisation but sends nothing to Lightspeed (*Disabled - not sending orders to Lightspeed*).
* **Disconnect Auth** — removes storekit's Lightspeed authorisation. Use it if you need to re-authorise, or when moving a store to a different Lightspeed location; you'll need to click **Connect to Lightspeed** again afterwards.
Changes on this page only take effect once you click **Save** — including the toggles.
## Next Steps
Import your Lightspeed menu into storekit
Set account profiles and order behaviour
# Lightspeed Dine-in: Floor Plan & Tables
Source: https://storekit.com/docs/guides/integrations/pos/lightspeed/dine-in
Import your Lightspeed K-Series floor plan into storekit so in-store ordering and pay-at-table use the same areas and table numbers as the POS.
For dine-in and pay-at-table, storekit needs the same tables as the POS. Syncing the floor plan imports your Lightspeed areas and tables, keeping the Lightspeed table numbers so orders and bills land on the right table.
## Sync the Floor Plan
Go to **Stores** → your store → **Settings** → **Integrations** → **Lightspeed K-Series**.
Under **Fetch Lightspeed Floorplan**, click **Sync floorplan** and confirm.
Review the imported areas and tables under **Stores** → your store → **Settings** → **Tables**.
## What Gets Imported
For each Lightspeed floor plan, storekit creates an area with the Lightspeed area name and ID. For each table in it, storekit creates a table with:
* the Lightspeed table description as its name
* the Lightspeed table number as its POS ID — this is what storekit sends as the table number on in-store orders
* the Lightspeed default client count as its covers
* the Lightspeed active/inactive state
New areas are created accepting both in-store ordering and pay-at-table, and a QR short link is generated for every new table.
## Re-syncing
Run **Sync floorplan** again after changing the floor plan in Lightspeed:
* New areas and tables are added.
* Renamed tables, changed covers, changed active state and tables moved between areas are updated.
* Areas and tables that no longer exist in Lightspeed are removed, unless you've archived them in storekit.
Tables are matched on the Lightspeed table number. If you renumber a table in Lightspeed, storekit treats it as a new table — the old one is removed and its QR code stops working, so reprint QR codes after renumbering.
There's no automatic floor plan sync — it runs when you click **Sync floorplan**.
### The Sync Always Covers the Whole Store
**Sync floorplan** fetches every Lightspeed floor plan for the store and reconciles all of them in one pass. There is no way to sync a single area, floor plan or table: the dashboard has one control, **Sync floorplan**, and it is store-wide. So a change you made to one Lightspeed floor plan cannot be brought over on its own.
That matters if you've adjusted tables by hand in storekit, because a re-sync reconciles them too:
* Lightspeed wins for the table name, covers, active state and which area the table sits in. Values you changed in storekit are overwritten with what Lightspeed holds.
* A table's POS ID comes from the Lightspeed table number and is only written when storekit first creates the table. Tables are matched on it, so a POS ID you changed to something that no longer matches a Lightspeed table number makes the table look deleted in Lightspeed: it is removed (unless archived) and a new table is created for the Lightspeed one, with a new QR code.
* Areas and tables you added in storekit that don't exist in Lightspeed are removed.
If the POS IDs are wrong for one area only, correct those tables in storekit rather than re-syncing — edit each table's **POS ID** under **Stores** → your store → **Settings** → **Tables**, as described in [Editing Tables](/docs/guides/fulfillment/dine-in-tables#editing-tables). Re-syncing to fix one area re-imports every floor plan and overwrites hand-adjusted tables across the whole store.
## Next Steps
Let guests pay their Lightspeed bill
General dine-in setup in storekit
# Lightspeed Menu Sync
Source: https://storekit.com/docs/guides/integrations/pos/lightspeed/menu-sync
Import your Lightspeed K-Series menu into storekit: choose which menu to sync, run manual or scheduled syncs, and control images, descriptions and language.
storekit builds your storekit menu from a menu you've published in Lightspeed. Lightspeed stays the source of truth: every sync replaces the storekit menu content with what Lightspeed returns.
## Choose the Lightspeed Menu
Go to **Stores** → your store → **Settings** → **Integrations** → **Lightspeed K-Series** and pick the menu in **Lightspeed Menu**, then click **Save**. The dropdown lists the menus available on the connected business location; **No menu** means nothing is linked yet and syncing won't work.
## Run a Sync
Go to **Menus** and open the menu linked to this store.
At the bottom of the menu you'll see **Connected to Lightspeed** with the time of the last sync and the menu version, a **View in POS** link that opens the menu in the Lightspeed back office, and a **Sync** button. Click **Sync**.
A progress bar reports each stage (fetching the Lightspeed menu, pre-uploading images, updating the menu) and finishes with a summary of how many categories, products and modifiers were inserted, updated and deleted.
The **Connected to Lightspeed** bar only appears when the store's POS provider is Lightspeed and the menu is linked to a Lightspeed menu.
To sync every Lightspeed menu on the account at once, click **Sync all menus** on the **Menus** page.
### Scheduled Syncs
To re-sync automatically, go to **Stores** → your store → **Settings** → **Automations** → **Sync Schedules** and click **Add sync schedule**. Give it a **Name**, set **Kind** to **Menu**, and pick a **Schedule** (or enter a **Custom cron expression**). The page shows the next run time for each schedule. Click **Save**.
Schedule menu syncs for quiet hours — a sync rewrites menu content, and customers browsing mid-sync may briefly see items appear or disappear.
## What Gets Imported
| Data | Imported |
| ------------------------------------------------------------- | -------------------------------------------------------------------- |
| Categories (menu entry groups) | Yes |
| Products, with name, price and SKU (used as the storekit PLU) | Yes |
| Descriptions | Yes — HTML is stripped (can be disabled) |
| Images | Yes, re-hosted by storekit (can be disabled) |
| Translations for every Lightspeed locale | Yes |
| Tax rates | Yes |
| Allergen codes and the alcohol flag, as item tags | Yes |
| Production instructions, as modifier groups | Yes |
| Sub-items and menu deals, as modifiers | Yes |
| Tables, floor plan | No — see [Dine-in](/docs/guides/integrations/pos/lightspeed/dine-in) |
Production instructions become a free (zero-price) modifier group named after the Lightspeed production instruction group. Groups that permit multiple selections import as multi-select; the rest allow one choice.
## Sync Options
All of these live on **Stores** → your store → **Settings** → **Integrations** → **Lightspeed K-Series**:
* **Don't update menu images** — keeps images already on storekit items instead of overwriting them from Lightspeed. New items import with no image.
* **Don't update menu description** — keeps descriptions and translations already in storekit. New items import with no description.
* **Import Sub-screens as categories** — flattens Lightspeed sub-screens into their own storekit categories. With it off, items inside a sub-screen are imported into the parent category.
* **Specify account profile when syncing menu** — loads the menu using a specific Lightspeed account profile, so online prices come from that profile rather than the default. Choose **No profile** to use the default pricing.
* **Language** — which Lightspeed locale storekit reads names and descriptions from. If the item has no text for that locale, storekit falls back to `en`.
## Limitations
* **Items with customised pricing are skipped.** Lightspeed items whose pricing strategy makes the price positive, negative or a percentage of the total can't be represented as a fixed price, so they're left out of the import.
* **The `integration` menu entry group is skipped** — it's where the storekit delivery, discount and service-charge products live, and they shouldn't appear on your customer-facing menu.
* **A sync mirrors Lightspeed.** Categories, products and modifiers that are no longer in the Lightspeed menu are removed from the storekit menu, so manual additions in storekit don't survive a sync (apart from images and descriptions preserved by the two options above).
* **No lightweight/price-only sync**, no category availability hours, and no portions or sizes. Courses are set in storekit, not imported — see [course assignments](/docs/guides/menu/course-assignments).
* **Item availability is not set by the menu sync** — stock and sold-out state arrive separately, see [Stock & Availability](/docs/guides/integrations/pos/lightspeed/stock-and-availability).
## Next Steps
How synced items reach Lightspeed on an order
Fix sync failures and mapping problems
# Lightspeed Orders & Routing
Source: https://storekit.com/docs/guides/integrations/pos/lightspeed/orders
How storekit injects orders into Lightspeed K-Series: account profile routing for pickup, delivery, in-store and add-to-bill, payments, discounts, and retries.
storekit queues every online order for Lightspeed as soon as it's placed — you don't need to accept it first. Pre-orders can be held back with **Buffer Orders**.
## How an Order Reaches Lightspeed
| Order type | Lightspeed order | Extra details sent |
| ----------- | ------------------------ | ------------------------------------------------------------------------------------------ |
| Pickup | To-go order | Collection code, collection time in the order note |
| Delivery | To-go order | Delivery address, delivery fee line item, collection code, delivery time in the order note |
| In store | Local order | Table number (the table's Lightspeed POS ID) |
| Add to bill | Existing Lightspeed bill | The bill's account identifier instead of a new order |
Every order also carries the customer's name, email and phone number, the items with their SKUs and modifiers, the tip, and the generated order note.
The collection code Lightspeed shows is the storekit order code — Lightspeed limits it to 8 characters.
## Account Profile Routing
Under **Account Profile Codes** on **Stores** → your store → **Settings** → **Integrations** → **Lightspeed K-Series** you map each fulfillment type to a Lightspeed account profile. The four rows are fixed: **Pickup**, **Delivery**, **In Store** and **Add to Bill**. Each dropdown lists the account profiles from your Lightspeed business location.
If a row is left unset, storekit sends the account profile code `storekit`, which must exist in Lightspeed. When an order goes onto an existing bill, the **Add to Bill** profile takes priority over the fulfillment-type profile.
## Payment, Discounts and Charges
* **Payment Method** — the Lightspeed payment method the order's payment is recorded against. Defaults to `STOREKIT` when nothing is selected.
* **Send cash payments as paid** — off by default: cash orders are sent with no payment applied, so staff see an open balance and settle it when the customer pays. Turn it on to send cash orders as already paid. Card and other prepaid orders are always sent as paid. See [cash and pay-on-collection orders](/docs/guides/payments/cash-payments).
* **Discount Product Code (SKU)** — used for a negative discount line item. If the storekit discount code has a **POS ID** matching a Lightspeed discount code, storekit applies that native Lightspeed discount to the order's items instead of adding the line item. Free-delivery discounts add no discount line at all, because the £0 delivery line already reflects the waived fee.
* **Service Charge Product Code (SKU)** — line item used for the order's service charge.
* **Delivery Product Code (SKU)** — line item used for the delivery fee on delivery orders.
* **Don't send customer email address to Lightspeed** — sends an empty email address, for venues that don't want customer emails in the POS. Name and phone number are still sent.
These product codes must exist in your Lightspeed menu. A missing SKU makes Lightspeed reject the whole order.
On in-store orders, storekit also sends each item's [course number](/docs/guides/menu/course-assignments) so Lightspeed can fire the order by course.
## Order Notes
**Order Note Template** on the Lightspeed settings page controls the note sent with each order (up to 250 characters). Click **Insert Variable** to see the available variables, and **Preview** to check the result with sample data. storekit appends the collection or delivery time to the note automatically.
## Pre-Order Buffering
By default a pre-order is sent to Lightspeed straight away, which can clutter the kitchen hours ahead of time. To delay it:
1. Turn on **Buffer Orders**.
2. Optionally set **Buffer (in minutes)** (0–720) — the order is injected that many minutes before the requested fulfillment time.
With **Buffer Orders** on and **Buffer (in minutes)** empty, storekit uses the store's normal prep-time calculation to decide when to inject. Orders without a requested time are never buffered.
15–30 minutes is a good starting point for a busy kitchen.
## Add to Bill
For in-store orders on tables in an area that accepts pay-at-table, **Add to bill batching for all orders** sends every order onto the table's open Lightspeed bill rather than creating a separate order. The **Add to Bill** account profile is used, and the payment is left off the order because it's settled against the bill. See [Pay at Table](/docs/guides/integrations/pos/lightspeed/pay-at-table).
## When an Order Fails
Lightspeed reports the outcome of each order by webhook:
* **Success** — the order is marked **Accepted** in storekit and the Lightspeed receipt reference is stored.
* **Failure** — storekit re-queues the order and retries. An immediate order is marked **Failed** after 5 attempts; a pre-order keeps retrying until its requested time is close, then is marked **Failed**. Once the order is **Failed**, the failure reason is stored against it, the store is emailed, and a failed-order ticket prints if the store has printers. Orders being added to an existing bill, and failures whose reason is that the item could not be added, are not retried — they are marked **Failed** on the first failure.
* If the failure reason is a sales restriction, storekit also snoozes the affected items — see [Stock & Availability](/docs/guides/integrations/pos/lightspeed/stock-and-availability).
storekit also gives Lightspeed a deadline for accepting the order that scales with how far away a pre-order is: one minute for immediate orders, up to six hours for orders more than a week out.
If Lightspeed rejects storekit's access (a 403), the order fails with *"Our access to your Lightspeed account has been disabled, please re-enable the integration user or speak to support"* — see [Troubleshooting](/docs/guides/integrations/pos/lightspeed/troubleshooting).
### The Failed-Order Email
The email is sent once, when the order is finally marked **Failed** — not on each retry — with the subject `Lightspeed Issue: Order # for store: ` and the failure reason in the body. It goes to the store's **Email address** list on **Stores** → your store → **Settings** → **General** (the first address as the recipient, the rest as blind copies), and to nobody else: the email you log in to the dashboard with receives nothing unless it is in that list. If that list is empty, no email is sent. See [I'm not getting failed-order emails](/docs/guides/integrations/pos/lightspeed/troubleshooting#im-not-getting-failed-order-emails).
Any other failure reason is Lightspeed's own message, stored word for word. The three you're most likely to see are *"Not processed before validity ended"* (the Active Device was offline — see [Orders Failing: Till Offline](/docs/guides/integrations/pos/lightspeed/till-offline)), *"…one of the items in the order has a Disconnected status in Lightspeed"* (Lightspeed does not treat an item in the order as active on the location — see [Troubleshooting](/docs/guides/integrations/pos/lightspeed/troubleshooting#an-order-failed-because-an-item-has-a-disconnected-status-in-lightspeed)) and *"Failed to sync order Validation failed for method … placeToGoOrder …"* on the order's timeline (Lightspeed rejected the order's contents before accepting it, so the retry and email rules above never start — see [Troubleshooting](/docs/guides/integrations/pos/lightspeed/troubleshooting#an-order-failed-with-validation-failed-for-method--placetogoorder)).
## Next Steps
Keep sold-out items off the menu
Bills, payments and add-to-bill
# Lightspeed K-Series
Source: https://storekit.com/docs/guides/integrations/pos/lightspeed/overview
Connect Lightspeed K-Series (iKentoo) to storekit to sync menus, inject online orders, keep stock in sync, and take pay-at-table payments.
Lightspeed K-Series (formerly iKentoo) is one of storekit's most complete POS integrations. Once connected, storekit imports your menu from Lightspeed, sends online orders straight into Lightspeed, receives stock and sales-restriction updates by webhook, and — for dine-in venues — imports your floor plan and supports pay-at-table.
This section is split into focused guides. Start with **Connecting Lightspeed**, then set up the areas you need.
Authorise storekit, pick your business location, and turn the integration on
Import your Lightspeed menu, choose sync options, and schedule syncs
How orders inject, account profile routing, SKUs, buffering, and retries
Stock webhooks, auto-snooze, and order readiness syncing
Import areas and tables from your Lightspeed floor plan
Let guests pay their Lightspeed bill from their phone
The most common failure — get the Active Device iPad back online and resend
Fix connection, menu, order, stock, and pay-at-table problems
## How the Connection Works
Lightspeed connects over OAuth. You click **Connect to Lightspeed**, sign in to Lightspeed and authorise storekit, then choose which business location this store maps to on the **Select your Lightspeed location:** screen. storekit stores the authorisation and uses it to load your Lightspeed menus, floor plans, payment methods, discounts and account profiles.
One storekit store connects to one Lightspeed business location. For multi-site setups, connect each store separately.
The Lightspeed integration is only available to accounts that have it enabled. If you don't see **Lightspeed K-Series** in your **Integrations** list, [contact storekit support](/docs/getting-started/contact-support) to have it turned on.
## How Orders Flow to Lightspeed
```
Customer places order on storekit
↓
storekit queues the order for dispatch (immediately, or buffered for a pre-order)
↓
storekit builds the Lightspeed order (items, modifiers, account profile, payment method)
↓
Pickup/delivery → to-go order | In store → local order | Add to bill → existing bill
↓
Lightspeed webhook reports SUCCESS/CLOSED → order marked Accepted, receipt reference stored
↓
Lightspeed webhook reports FAILURE → storekit retries, then marks the order failed and emails the store
```
Orders are queued as soon as they're placed — you don't have to accept them first. Pre-orders can be held back until closer to the fulfillment time with **Buffer Orders**.
## Supported Features
| Feature | Supported |
| ------------------------------ | :-------: |
| Manual menu sync | ✓ |
| Scheduled menu sync | ✓ |
| Lightweight sync (prices only) | ✗ |
| Product images | ✓ |
| Allergens | ✓ |
| Nested modifiers | ✓ |
| Subcategories (sub-screens) | ✓ |
| Production instructions | ✓ |
| Menu deals | ✓ |
| Multi-language content | ✓ |
| Account-profile pricing | ✓ |
| Category availability hours | ✗ |
| Portions / sizes | ✗ |
| Feature | Supported |
| --------------------------------------------------- | :-------: |
| Order injection | ✓ |
| Pre-orders | ✓ |
| Order buffering | ✓ |
| Automatic retries on failure | ✓ |
| Auto-snooze items after a sales-restriction failure | ✓ |
| Discounts (line item or native discount code) | ✓ |
| Tips | ✓ |
| Service charge | ✓ |
| Custom order notes template | ✓ |
| Course numbers (in-store orders) | ✓ |
| Delivery details | ✓ |
| Basket validation | ✗ |
| Feature | Supported |
| --------------------------- | :-------: |
| Live bill sync | ✓ |
| Apply payments to bill | ✓ |
| Partial and split payments | ✓ |
| Track POS terminal payments | ✓ |
| Gift card payment method | ✓ |
| Add to existing bill | ✓ |
| Feature | Supported |
| -------------------------------------- | :-------: |
| Floor plan sync | ✓ |
| Real-time stock updates (webhook) | ✓ |
| Order readiness sync (auto open/close) | ✓ |
| Multi-site support | ✓ |
## Related Guides
Compare Lightspeed with storekit's other POS integrations
How order injection works across POS providers
General menu-sync behaviour and limits
How cash and pay-on-collection orders reach the POS
# Lightspeed Pay at Table
Source: https://storekit.com/docs/guides/integrations/pos/lightspeed/pay-at-table
Let guests scan a QR code, see their live Lightspeed K-Series bill and pay it from their phone, with partial and split payments and add-to-bill orders.
With pay-at-table, a guest scans the QR code on the table, sees the open Lightspeed bill, and pays it (or part of it) from their phone. storekit takes the payment and reports it back to Lightspeed against the bill.
## How It Works
```
Guest scans the table QR code
↓
storekit fetches the open Lightspeed check for that table number
↓
Guest sees the live bill — items, service charge, discounts, amount due
↓
Guest pays all or part of it
↓
storekit reports the payment to Lightspeed against the check
↓
Lightspeed webhook confirms the payment → bill updated, closed when fully paid
```
The bill is kept in step with Lightspeed, so items added at the POS, payments taken on a POS terminal and changes to service charges or discounts are reflected on the guest's phone. Tax lines are synced with the check so the totals match the POS.
Pay-at-table needs the tables to match the POS. Import them first — see [Dine-in: Floor Plan & Tables](/docs/guides/integrations/pos/lightspeed/dine-in).
## Settings
On **Stores** → your store → **Settings** → **Integrations** → **Lightspeed K-Series**:
* **Payment Method PAT** — the Lightspeed payment method used for pay-at-table payments. If nothing is selected, storekit reports the payment as `APM`.
* **Gift Card Payment Method** — used instead of **Payment Method PAT** when the guest pays with a gift card or loyalty credit, so those settlements are reported separately in Lightspeed.
**Payment Method** (used for online orders) and **Payment Method PAT** are separate settings — keeping them as separate Lightspeed payment methods makes reconciliation much easier.
## Partial and Split Payments
Guests can pay part of the bill, and several guests can pay the same bill from their own phones. Each payment is reported to Lightspeed individually with its own reference and tip amount, and storekit closes the bill once the amount due reaches zero. Payments taken on the POS terminal in the meantime reduce what the guest is asked to pay.
If a payment fails, storekit marks it failed with the Lightspeed reason and flags the bill so staff can settle it on the POS.
## Adding Orders to an Open Bill
When **Add to bill batching for all orders** is on, in-store orders placed at a table in an area that accepts pay-at-table are added to that table's open Lightspeed check instead of creating a new order, and the **Add to Bill** account profile is used. Guests can then order several rounds and settle everything at once.
How storekit finds the bill:
* If storekit already has an open bill for the table, it confirms the check still matches in Lightspeed and adds the order to it. If the check has gone (settled at the POS), the stale bill is closed.
* If no bill exists yet, storekit waits briefly and re-checks Lightspeed so that two orders placed at the same moment go onto the same check rather than opening two.
Orders added to an existing bill are not retried if Lightspeed rejects them, and no payment is applied to the order itself — the balance is settled against the bill. Watch failed orders for these tables so a round doesn't go missing.
## Next Steps
Account profiles and order behaviour
Bill and payment problems
# Lightspeed Stock & Availability
Source: https://storekit.com/docs/guides/integrations/pos/lightspeed/stock-and-availability
Keep storekit availability in step with Lightspeed K-Series: enable the stock webhook, auto-snooze after sales-restriction failures, and sync order readiness.
Lightspeed pushes stock and readiness changes to storekit by webhook, so the online menu reflects what the kitchen can actually make.
## Stock Webhook
Turn on **Stock Webhook** on **Stores** → your store → **Settings** → **Integrations** → **Lightspeed K-Series**. The label next to the toggle confirms the state: *Enabled - stocks updated automatically* or *Disabled – stocks not updated*.
Once enabled, the toggle is locked on — it cannot be switched back off from the dashboard. [Contact support](/docs/getting-started/contact-support) if you need it removed.
When Lightspeed changes an item's stock count or restricts it, storekit matches the SKU to items on the connected business location and updates their inventory and availability, then clears the menu cache so customers see the change immediately. Items restricted in Lightspeed with no stock count left are hidden from the menu; items with a count are tracked down to zero.
## Auto-Snooze After a Failed Order
If Lightspeed rejects an order because of a sales restriction, storekit snoozes every affected item until 8am the next day, clears the menu cache, and records the snooze with the source `lightspeed`. That stops the same item failing order after order while nobody's watching the POS.
Snoozes appear in **Reports** → **Item Snooze** alongside manual snoozes, so you can see which items Lightspeed is rejecting.
## Order Readiness
Lightspeed can tell storekit that a location isn't ready to take online orders (for example the POS is offline or in an end-of-day state). Two settings control what storekit does with that:
* **Sync order readiness** — *"Automatically close the store when Lightspeed reports it is not ready for online orders, and reopen it when Lightspeed reports it is ready again."* With this off, storekit keeps taking orders regardless.
* **Order readiness emails** — *"Send an email to the venue when Lightspeed reports it is not ready for online orders."* On by default.
The readiness email has the subject ` - Lightspeed Not Ready` and goes to the addresses in **Email address** on **Stores** → your store → **Settings** → **General** — the first address as the recipient, the rest as blind copies. If that list is empty, nothing is sent. Two rules keep it from flooding your inbox:
* **One email per store every 30 minutes.** Further not-ready reports inside that window are dropped, even if the store closes and reopens several times.
* **Nothing while the store is closed.** If your opening hours (or a special-hours entry) say the store is closed right now, the email is suppressed — so an end-of-day POS shutdown doesn't email you every night. Stores with no opening hours configured are treated as always open for this check.
Neither the cooldown nor the closed-hours rule can be changed from the dashboard; the only switch is **Order readiness emails** itself. Failed *orders* are emailed separately, with different rules — see [Lightspeed Orders & Routing](/docs/guides/integrations/pos/lightspeed/orders#the-failed-order-email).
The store closure is recorded against the reason `lightspeed_not_ready`, and reopening clears it — so a Lightspeed-driven closure doesn't leave the store snoozed once the POS is back.
## Ready for Pickup Notifications
**Ready for pickup notifications** lets Lightspeed drive the customer's "your order is ready" message. When it's on and Lightspeed reports an order as ready for pickup, storekit moves the order to **Ready for pickup** and notifies the customer, instead of relying on storekit's own prep-time estimate.
## Next Steps
How the menu itself is imported
Stock isn't updating? Start here
# Orders Failing: Till Offline
Source: https://storekit.com/docs/guides/integrations/pos/lightspeed/till-offline
Fix the "Not processed before validity ended" Lightspeed K-Series error caused by the master iPad Active Device being offline, and resend the order.
This is the single most common Lightspeed order failure. It always comes back to the same thing: **Lightspeed only delivers an online order to one iPad — the Active Device — and that iPad wasn't online to take it.**
storekit sends the order to Lightspeed Cloud successfully, together with a window in which the order must reach the till. Lightspeed holds it for the Active Device configured to receive online orders. If that device is asleep, off, out of the Lightspeed app, logged out, off Wi-Fi or otherwise not talking to Lightspeed Cloud, the window closes and Lightspeed reports the order back to storekit as failed — the *validity* in the error message is that window.
The window scales with how far off the order is: **one minute for an order wanted now**, two minutes for a pre-order under an hour away, and up to six hours for one more than a week out. So an ASAP order gives a sleeping iPad no grace at all.
Nothing is wrong with your storekit setup, your menu or your SKUs. **The fix is to get the iPad back online, then resend the order.**
## Errors That Mean This
Open the order in storekit (**Live Orders** or **All Orders** → the order) and read the red banner: *Something went wrong sending this order to the POS: …*. Any of these reasons is the same problem:
| Error from Lightspeed | What it means |
| ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| `Not processed before validity ended` | The Active Device never collected the order before Lightspeed's window expired. By far the most common. |
| `Failed to process the order because the K-Series iPad App is off.` | Lightspeed knows the app on the Active Device isn't running. |
| `All active devices are offline, or none is configured to receive payments or orders` | No device is online, or no device is set to receive online orders at all. |
| `NIOCore.ChannelError 0` (often inside a longer Lightspeed message) | The Active Device's connection or session to Lightspeed's servers dropped. |
`Business location doesn't accept online orders at the moment.` and `Ordering_disabled` are **not** this problem — the iPad is online but online ordering has been switched off in the Lightspeed app. See [Online ordering switched off](#online-ordering-switched-off-in-lightspeed) below.
When the reason is exactly `Not processed before validity ended`, the order page shows a **Fix it** button next to the banner, which opens the *How to fix Lightspeed timeout errors* checklist with the same demo videos shown below. Every other reason shows **Get help** instead, which opens live chat.
## What storekit Does On Its Own
* storekit sends the order up to **5 attempts** in total — the original send plus four retries. While it's retrying, the order sits at status **Retrying** (shown as *Retrying x2*, *x3*… on the order).
* After the 5th failure the order is marked **Failed**, the store's failed-order email goes out (with the guidance for that error), and the order is printed as a failure if the store has printers.
* Orders being added to an existing bill are **never retried** — a failed add-to-bill has to be re-sent by hand or rung in on the POS.
So a till that comes back online within a couple of minutes often recovers by itself. A till that's offline for the rest of service will fail every order it's sent.
## Get the iPad Back Online
Do these on the Lightspeed **Active Device** — the master iPad configured to receive online orders — in this order:
1. **Wake the iPad and open the Lightspeed app.** It must be open in the foreground and logged in. An iPad sitting on the home screen, on a lock screen, or with the app backgrounded is offline as far as online orders are concerned.
2. **Check the iPad is charged and plugged in.** A dead or power-saving iPad is the most frequent root cause.
3. **Check the internet connection to Lightspeed Cloud.** In the Lightspeed app, tap the four dots at the bottom right and confirm the connection to Lightspeed Cloud is healthy. If it isn't, fix the Wi-Fi and reconnect.
4. **Apply any pending configuration update.** In the same four-dot view of the Lightspeed app, tap the refresh icon so the device pulls the latest configuration from Lightspeed.
5. **Confirm a device is actually set to receive online orders.** If you're seeing `All active devices are offline, or none is configured to receive payments or orders`, the Active Device assignment itself needs checking in Lightspeed — this is Lightspeed-side configuration, so [contact Lightspeed](https://www.lightspeedhq.com/) or [storekit support](/docs/getting-started/contact-support) if no device is assigned.
## Then Resend the Failed Order
Once the app is open and connected:
1. Open the failed order — **Live Orders** → the order, or **All Orders** → the order.
2. Click **More actions** → **Resend order to POS**. You'll see *Queued POS order injection retry*.
3. Watch the order status. It should move to **Accepted** once Lightspeed confirms it. If it fails again with the same reason, the device still isn't connected — go back through the checklist above.
**Resend order to POS** only appears while the order has no POS receipt reference. If the order already reached Lightspeed, there's nothing to resend — check the till. If the option is there but the resend is refused, see ["This order has already been sent to the POS"](#this-order-has-already-been-sent-to-the-pos) below.
Orders that were part of an add-to-bill round need the items ringing in on the POS, or a fresh order.
### "This order has already been sent to the POS"
Sometimes the resend is refused instead of queued: *This order has already been sent to the POS. Resending it would create a duplicate POS order.*
This means Lightspeed Cloud confirmed it received the order from storekit — on the original send or on one of the retries — and storekit recorded that confirmation against the order. storekit will not send an order Lightspeed has already accepted a second time, because Lightspeed would treat it as a new order and the till would print it twice.
The till can still be empty. Lightspeed Cloud accepts the order first and only then tries to hand it to the Active Device. If that iPad was offline while Lightspeed was trying, the delivery window closed with the order accepted on Lightspeed's side but never printed. Getting the iPad back online now does not replay it.
What to do:
1. Check whether Lightspeed has the order: look for it in the Lightspeed app's online-orders list on the Active Device, or in Lightspeed Back Office, using the storekit order number.
2. If it's there, the till has it — nothing more to do on the storekit side.
3. If it isn't, ring the items into Lightspeed by hand from the order details in storekit, so the kitchen gets the ticket and your end-of-day totals match. The customer has already paid through storekit (unless the order shows it was placed as a cash order), so do not take payment again.
4. Then go through [Get the iPad Back Online](#get-the-ipad-back-online) so the next order isn't lost the same way.
Clicking **Resend order to POS** again does nothing useful here. Each click queues another retry, and every one of them is refused with the same message. If you need the order on the till, key it in by hand.
## Confirm You're Recovered
* Place a small test order and check it lands on the till.
* Watch **Live Orders** for a few minutes — no new orders should go to **Retrying**.
* If you're getting failure emails for every order, treat the till as offline until a test order lands.
## Stop It Happening Again
The Lightspeed Active Device set to receive online orders should be treated as infrastructure, not a spare iPad:
* **Keep it permanently on charge.** This alone removes most of these failures.
* **Keep it on the Lightspeed app.** Don't use it for anything else, and don't let staff swipe out of the app.
* **Turn on Apple Guided Access** for that iPad so the Lightspeed app can't be left, and disable auto-lock.
* **Give it stable Wi-Fi.** If the till sits at the edge of coverage, the session drops intermittently and you'll see connectivity errors like `NIOCore.ChannelError 0`.
* **Don't take it home or off-site**, and don't rely on a device that's also someone's ordering handheld.
## Online Ordering Switched Off in Lightspeed
If the failure reason is `Business location doesn't accept online orders at the moment.` or `Ordering_disabled`, the iPad is online but online ordering is paused in the Lightspeed app. Resending won't help until it's turned back on:
1. Tap the four dots on the navigation bar (Status Preview tab).
2. Tap the shopping bag icon in the status menu.
3. Use the prompt to enable online orders.
Then resend the order with **More actions** → **Resend order to POS**.
## Still Failing
If the iPad is charged, open, logged in, connected and set to receive online orders, and orders still fail:
* Check **Integration Status** on **Stores** → your store → **Settings** → **Integrations** → **Lightspeed K-Series** reads *Enabled - sending orders to Lightspeed*.
* Check the other order failure causes in [Lightspeed Troubleshooting](/docs/guides/integrations/pos/lightspeed/troubleshooting) — a missing account profile or product code fails orders with a different reason.
* [Contact storekit support](/docs/getting-started/contact-support) with an example order number. Repeated timeouts on a healthy-looking device usually need Lightspeed to look at the device's session.
# Lightspeed Troubleshooting
Source: https://storekit.com/docs/guides/integrations/pos/lightspeed/troubleshooting
Fix common Lightspeed K-Series problems in storekit: authorisation errors, menu sync failures, rejected orders, missing product codes, and stock issues.
Common Lightspeed K-Series problems and how to fix them. If you're still stuck, [contact storekit support](/docs/getting-started/contact-support).
Orders failing with **"Not processed before validity ended"**, **"K-Series iPad App is off"** or **"All active devices are offline"** all mean the same thing — the Lightspeed Active Device wasn't online. That has its own page: [Orders Failing: Till Offline](/docs/guides/integrations/pos/lightspeed/till-offline). An order failing because an item *"has a Disconnected status in Lightspeed"* is a different problem — see [below](#an-order-failed-because-an-item-has-a-disconnected-status-in-lightspeed). A timeline entry reading *"Failed to sync order Validation failed for method … placeToGoOrder …"* is different again — Lightspeed rejected the order's contents — see [below](#an-order-failed-with-validation-failed-for-method--placetogoorder).
## Connection
### "Lightspeed K-Series" isn't in my Integrations list
The integration isn't enabled for your account. [Contact support](/docs/getting-started/contact-support) to have it turned on.
### Orders fail with "Our access to your Lightspeed account has been disabled"
Lightspeed is rejecting storekit's access. The integration user in Lightspeed has usually been disabled or had its permissions changed — re-enable it in the Lightspeed back office, then click **Disconnect Auth** and **Connect to Lightspeed** again on **Stores** → your store → **Settings** → **Integrations** → **Lightspeed K-Series**.
### I connected the wrong Lightspeed location
Click **Disconnect Auth**, then **Connect to Lightspeed**, and pick the right location on the **Select your Lightspeed location:** screen.
## Menu Sync
### There's no Sync button on the menu
The **Connected to Lightspeed** bar (with **View in POS** and **Sync**) only appears when the store's POS provider is Lightspeed and the menu is linked to a Lightspeed menu. Select the menu in **Lightspeed Menu** on the Lightspeed settings page and click **Save**.
### The sync fails part-way
The progress bar shows the stage that failed. Common causes:
* The menu no longer exists in Lightspeed, or is no longer available on the connected business location — re-pick it in **Lightspeed Menu**.
* The authorisation has expired or been revoked — reconnect (above).
* The account profile in **Specify account profile when syncing menu** no longer exists in Lightspeed — set it back to **No profile** or pick a current one.
### Some items didn't import
* Items whose Lightspeed pricing strategy makes the price positive, negative or a percentage of the total are deliberately skipped — they have no fixed price to import.
* Items inside sub-screens land in the parent category unless **Import Sub-screens as categories** is on.
* Products in the `integration` menu entry group (the storekit delivery, discount and service-charge products) are skipped on purpose.
### Names or descriptions are in the wrong language
Set **Language** to the Lightspeed locale you want. storekit falls back to `en` for items with no text in that locale.
### My storekit images or descriptions were overwritten
Turn on **Don't update menu images** and **Don't update menu description**. Everything else in the menu is rewritten from Lightspeed on every sync.
## Orders
### Orders fail with "Not processed before validity ended"
The Lightspeed Active Device — your master iPad — wasn't online to collect the order. See [Orders Failing: Till Offline](/docs/guides/integrations/pos/lightspeed/till-offline) for the full checklist and how to resend the order.
If the resend is refused with *"This order has already been sent to the POS"*, Lightspeed already accepted the order, even if the till hasn't printed it — see [what to do](/docs/guides/integrations/pos/lightspeed/till-offline#this-order-has-already-been-sent-to-the-pos) rather than clicking **Resend order to POS** again.
### Orders aren't reaching Lightspeed at all
* Check **Integration Status** is on — the label should read *Enabled - sending orders to Lightspeed*.
* Check the store is linked to the right business location.
* Open the order in storekit and read the failure reason recorded against it.
### Orders are rejected as soon as they're sent
* The account profile code must exist in Lightspeed. If a row under **Account Profile Codes** is empty, storekit sends `storekit` — either create that profile in Lightspeed or select a real one for **Pickup**, **Delivery**, **In Store** and **Add to Bill**.
* The delivery, discount and service-charge products must exist in Lightspeed with the SKUs set in **Delivery Product Code (SKU)**, **Discount Product Code (SKU)** and **Service Charge Product Code (SKU)** (defaults: `STOREKIT_DELIVERY`, `STOREKIT_DISCOUNT`, `STOREKIT_SERVICE_CHARGE`). A missing SKU fails the whole order.
* Item SKUs must still match. Re-sync the menu after changing SKUs in Lightspeed.
### An order failed because an item has a Disconnected status in Lightspeed
The failure reason reads *"…one of the items in the order has a Disconnected status in Lightspeed"*. This is Lightspeed's own message, stored word for word against the order: Lightspeed refused the order because it does not treat one of the items as an active, orderable item on the connected business location. The case storekit support has seen involved an item newly created in Lightspeed and imported by the previous day's menu sync.
It is **not** the till-offline failure. Nothing needs doing on the iPad — see [Orders Failing: Till Offline](/docs/guides/integrations/pos/lightspeed/till-offline) only if the reason is *"Not processed before validity ended"*.
Open the menu under **Menus** and click **Sync** in the **Connected to Lightspeed** bar so storekit picks up the current Lightspeed item. See [Menu Sync](/docs/guides/integrations/pos/lightspeed/menu-sync).
Click **View in POS** and confirm the item still exists in the menu storekit is linked to and is active on this business location. If it was deleted and recreated, the new item must be in that menu.
Open the order and click **More actions** → **Resend order to POS**. The order is sent again with the freshly synced item.
If the resend fails with the same reason, [contact storekit support](/docs/getting-started/contact-support) and quote the order number and item name. The link between the storekit item and the Lightspeed item may need to be rebuilt on our side — a support-run sync has resolved cases where a merchant-run sync did not.
The order is already confirmed to the customer, and if they paid online the money has been taken. If the order cannot be resent successfully, key it into Lightspeed by hand from the order details in storekit so the kitchen still receives it, and only collect payment at handover if the storekit order shows it was placed as a cash order.
### An order failed with "Validation failed for method … placeToGoOrder"
The order's timeline shows *"Failed to sync order Validation failed for method='public com.ikentoo.ape.dto.SubmissionResponseDto com.ikentoo.ape.controllers.OrderSubmissionController.placeToGoOrder(com.lightspeedhq.ape.dto.rest.ToGoOrder)'. Error count: N"*. This is Lightspeed's own response, stored word for word: Lightspeed refused to accept the order at all because something in what storekit sent — the customer details, an item or modifier code, the business location or the payment line — did not pass its checks. *Error count* is how many fields it objected to.
It is **not** the till-offline failure. The order never reached the iPad, so restarting the Lightspeed app or reloading the iPad changes nothing, and clicking **More actions** → **Resend order to POS** without changing anything sends the same contents and fails the same way. Because Lightspeed never took the order, the retry and failed-order email rules described in [When an Order Fails](/docs/guides/integrations/pos/lightspeed/orders#when-an-order-fails) do not run — the rejection is recorded on the order's timeline and the order does not print on the till.
Check these before resending:
* *An item in the order exists only in storekit.* An item or modifier added by hand in storekit has no Lightspeed code, so Lightspeed rejects the order. Create the item in the Lightspeed menu the store is linked to first, then open the menu under **Menus** and click **Sync** in the **Connected to Lightspeed** bar so storekit picks up its code, then resend. A sync on its own removes storekit-only items rather than creating them in Lightspeed — see [Menu Sync](/docs/guides/integrations/pos/lightspeed/menu-sync#limitations).
* *A modifier or item code no longer exists in Lightspeed.* If it was deleted, recreated or had its SKU changed in Lightspeed since the last sync, re-sync the menu so storekit sends the current code. The delivery, discount and service-charge SKUs under **Delivery Product Code (SKU)**, **Discount Product Code (SKU)** and **Service Charge Product Code (SKU)** must also still exist in Lightspeed.
* *The customer's phone number.* storekit passes the customer's phone number to Lightspeed in the field Lightspeed reserves for international-format (E.164) numbers. If the rejection is on a customer-details field, ask support to check whether the number on the order is what Lightspeed objected to.
If the resend fails with the same reason after the menu has been re-synced, [contact storekit support](/docs/getting-started/contact-support) and quote the order number. storekit stores only Lightspeed's summary line against the order; the field-by-field detail of what Lightspeed rejected is held in our logs, and support can read it and tell you which item or field to fix.
The order is already confirmed to the customer, and if they paid online the money has been taken. If it cannot be resent successfully, key it into Lightspeed by hand from the order details in storekit so the kitchen still receives it.
### An order failed because an item is restricted
Lightspeed refused the order under a sales restriction. storekit snoozes the affected items until 8am the next day and emails the store; check the item's stock or restriction in Lightspeed, then unsnooze it in storekit.
### Orders fail and then stop retrying
storekit sends an immediate order up to 5 attempts in total (the original send plus four retries) before marking it **Failed**. A pre-order is retried for as long as its requested time is still some way off, so a pre-order for later in the day can fail, retry and fail again every few minutes until it is finally marked **Failed** shortly before it is due. Orders being added to an existing bill, and failures reported as the item not being addable, are not retried at all. Once the cause is fixed, resend the order with **More actions** → **Resend order to POS**.
### I'm not getting failed-order emails
Orders show as **Failed** in the dashboard but no email arrives. Check these in order:
1. *The store's email addresses.* The failed-order email goes only to the addresses in **Email address** on **Stores** → your store → **Settings** → **General** — the first address is the recipient and the rest are blind copies. Nothing is sent to the email you log in to the dashboard with, to the account owner, or to other staff members unless their address is in that list. If the list is empty, no email is sent at all. Add the addresses that should be alerted and click **Save**. There is no separate setting in the dashboard for who receives failed-order emails.
2. *The order isn't finally failed yet.* The email is sent once, when storekit stops retrying and marks the order **Failed** — not on every failed attempt. An immediate order is emailed after its 5th failure; a pre-order is retried until shortly before its requested time, so an order that shows as retrying, or a pre-order for later today, has not been emailed yet. Orders added to an existing bill and "item could not be added" failures are emailed on the first failure because they are not retried.
3. *Your spam folder and sender.* The email comes from your storekit partner's sending address with the subject `Lightspeed Issue: Order # for store: `.
The *"Lightspeed Not Ready"* email is a different message with its own rules — see [The store keeps closing itself](#the-store-keeps-closing-itself) and [Order Readiness](/docs/guides/integrations/pos/lightspeed/stock-and-availability#order-readiness). It is deliberately rate-limited to one email per store every 30 minutes and is not sent while your opening hours say the store is closed, so a burst of readiness failures does not produce a burst of emails, and none arrive overnight.
While you sort out the emails, the failures are always visible in the dashboard:
* Open the order under **Orders** — a **Failed** order shows the banner *"Something went wrong sending this order to the POS:"* followed by Lightspeed's reason.
* On **Live Orders**, turn on **Show failed orders only** in the filters to list just the failed orders.
* **Logs** → **POS Errors** (page title **Integration Errors**) shows a per-day count of orders with a POS error and their totals, filterable by store and date range. It does not list the reason for each order — open the order for that.
* Do not look under **Logs** → **Blocked Orders**: that page lists orders storekit refused to create in the first place (rules and filters), not orders Lightspeed rejected.
If the addresses are right and a finally failed order still produced no email, [contact storekit support](/docs/getting-started/contact-support) with the order number — a copy of every failed-order email is kept on our side.
### Pre-orders arrive too early or too late
**Buffer Orders** controls this. With **Buffer (in minutes)** set, the order is injected that many minutes before the requested time; with it empty, storekit uses the store's prep-time calculation.
### The wrong table is used for in-store orders
storekit sends the table's POS ID as the Lightspeed table number. If only a few tables are wrong, correct their **POS ID** under **Stores** → your store → **Settings** → **Tables** — see [Editing Tables](/docs/guides/fulfillment/dine-in-tables#editing-tables). Re-run **Sync floorplan** only when the whole floor plan needs reconciling: it covers every area in the store and overwrites hand-adjusted tables, as described in [Floor Plan & Tables](/docs/guides/integrations/pos/lightspeed/dine-in#re-syncing).
## Stock & Availability
### Sold-out items are still orderable
* **Stock Webhook** must be on — the label should read *Enabled - stocks updated automatically*.
* storekit matches stock updates on SKU and on the connected business location, so an item whose SKU differs between systems won't update. Re-sync the menu.
### The store keeps closing itself
That's **Sync order readiness**: Lightspeed is reporting the location as not ready for online orders, so storekit closes the store and reopens it when Lightspeed reports it ready again. Turn the setting off if you don't want the POS driving store availability, and turn off **Order readiness emails** to stop the notifications. Those emails go to the store's **Email address** list, at most one every 30 minutes and only while the store is open — see [Order Readiness](/docs/guides/integrations/pos/lightspeed/stock-and-availability#order-readiness).
### Customers aren't told their order is ready
**Ready for pickup notifications** must be on for Lightspeed to drive the ready-for-pickup status.
## Pay at Table
### The guest sees no bill
* The table must exist in both systems with the same number — run **Sync floorplan**.
* There must be an open check on that table in Lightspeed.
### Payments fail
* Check **Payment Method PAT** points at a Lightspeed payment method that's still active. With nothing selected storekit reports payments as `APM`, which must exist in Lightspeed.
* Gift card and loyalty payments use **Gift Card Payment Method** — the same applies to it.
* The failure reason from Lightspeed is stored against the payment, and the bill is flagged so staff can settle it on the POS.
### A round of drinks didn't make it onto the bill
Orders added to an open bill aren't retried. Check the order's failure reason in storekit and add the items on the POS if needed.
For anything else, [contact support](/docs/getting-started/contact-support).
# Order Injection
Source: https://storekit.com/docs/guides/integrations/pos/order-injection
Learn how storekit injects online orders into your POS terminal automatically within seconds of checkout, eliminating double entry and re-keying for staff.
Order injection is the process of automatically sending online orders to your POS system. When a customer completes checkout, the order is transmitted to your POS within seconds, appearing on terminals and kitchen printers just like any other order.
## How Order Injection Works
```
Customer completes checkout
↓
Payment processed
↓
Order saved to storekit
↓
Order sent to POS API
↓
POS acknowledges receipt
↓
Order appears on terminal
↓
Kitchen ticket prints
```
The entire process typically completes in 2-5 seconds.
## Order Timing
When orders are injected depends on the fulfillment type and your configuration.
### ASAP Orders
Orders for immediate fulfillment are injected as soon as payment completes. The order appears in your POS right away.
### Pre-Orders / Scheduled Orders
For orders scheduled for a future time, injection timing depends on your settings:
| Setting | Behaviour |
| ----------------------- | ---------------------------------------------- |
| **Immediate injection** | Order sent to POS right after payment |
| **Delayed injection** | Order sent X minutes before the requested time |
Delayed injection is useful if you don't want pre-orders cluttering your kitchen queue hours in advance.
Buffering is set per POS integration, not once for the whole store, and not every POS exposes it. Each integration page below is at **Stores** → your store → **Settings** → **Integrations** → the integration.
| Integration | Injection-timing controls |
| ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Lightspeed K-Series** | **Buffer Orders**, plus **Buffer (in minutes)** (0-720). See [Lightspeed pre-order buffering →](/docs/guides/integrations/pos/lightspeed/orders#pre-order-buffering) |
| **Tissl** | **Buffer Orders** only — the delay comes from your prep time. See [TISSL orders →](/docs/guides/integrations/pos/tissl) |
| **Syrve** | **Buffer Orders** only — the delay comes from your prep time |
| **Deliverect** | **Buffer Orders**, plus **Buffer Delay (in minutes)** |
| **Toast POS** | Buffering is supported, but there is no buffer control on the **Toast POS Settings** page — storekit support sets the number of minutes. See [Toast orders →](/docs/guides/integrations/pos/toast/orders) |
| **Comtrex** | **Buffer Orders** is shown on the page but can't be edited — storekit support changes it |
| **Stream** | **Buffer Orders** and **Buffer Value** exist, but the **Stream** page isn't available in merchant dashboards — storekit support changes them |
| **Zonal** | No buffer setting — same-day pre-orders are injected straight away, and orders for a future day are held until 6am on the day. See [Zonal pre-order dispatch →](/docs/guides/integrations/pos/zonal#pre-order-dispatch) |
| **Centegra**, **3SPOS**, **PointOne** | No buffering — pre-orders are injected as soon as they're placed |
Where the delay comes from your prep time, the value is the one set at **Stores** → your store → **Settings** → **Operations** → **Preparation time** (**Delivery** and **Pickup**).
There is no injection-timing control at **Stores** → your store → **Settings** → **Pre-Orders** — that page covers slots, capacity and cut-offs only. For the integrations above where storekit support holds the setting, [contact support](/docs/getting-started/contact-support) with the number of minutes you want.
For busy kitchens, consider injecting pre-orders 15-30 minutes before the requested time. This gives enough prep time without overwhelming the queue.
## What's Included in Orders
Each order sent to your POS contains:
### Order Details
* Unique order ID
* Order timestamp
* Requested fulfillment time
### Items
* Product names and quantities
* Modifiers and customisations
* Item-level notes
* PLU/product codes (for linked integrations)
### Customer Information
* Name
* Phone number
* Email address
### Fulfillment Details
* Method (delivery, pickup, dine-in)
* Delivery address (if applicable)
* Table number (for dine-in)
* Special instructions
### Payment
* Payment status (paid/pending)
* Payment method
* Tip amount (if applicable)
Cash orders are sent without a payment attached, so the check stays open for staff to settle — unless the POS integration has a cash-as-paid setting enabled. See [cash and pay-on-collection orders](/docs/guides/payments/cash-payments).
## Error Handling
storekit is designed to handle POS communication failures gracefully.
### Automatic Retry
If the POS is temporarily unreachable:
1. storekit queues the order
2. Retries automatically with exponential backoff
3. Continues retrying until successful
4. Order eventually appears in POS
If an order fails to sync after all retry attempts, you'll receive an email notification with the specific error reason, order details, and a direct link to view the order in your dashboard.
Once the cause is fixed, resend a failed order from the order page with **More actions** → **Resend order to POS**. storekit refuses the resend with *"This order has already been sent to the POS"* if the POS has already confirmed receipt of it — sending it again would create a duplicate order on the till. For Lightspeed K-Series, where this can happen even though nothing printed, see [Orders Failing: Till Offline](/docs/guides/integrations/pos/lightspeed/till-offline#this-order-has-already-been-sent-to-the-pos).
### Customer Experience
Orders always complete successfully for the customer, even if POS injection is delayed:
* Payment is processed
* Customer receives confirmation
* Order appears in storekit dashboard
* You can manually enter the order if needed
Customers are never affected by temporary POS issues. Their order is confirmed and you'll always have it in your storekit dashboard.
### POS Connection Errors
If there's a persistent connection issue, customers may see a message asking them to contact staff. This only happens in specific scenarios like pay-at-table where POS connectivity is critical.
## Order Modifications
### Before POS Injection
If you need to modify an order before it's sent to the POS:
1. Find the order in your storekit dashboard
2. Make necessary changes
3. The modified order is sent to the POS
### After POS Injection
Once an order has been injected:
* Changes in storekit don't automatically update the POS
* Modify the order directly in your POS
* Process refunds through storekit if needed
## Integration-Specific Behaviour
Different POS integrations handle orders slightly differently.
### Zonal
* Orders appear as online orders in Aztec
* Full modifier support
* Discounts from Zonal loyalty are recorded
* Order notes appear on tickets
### Lightspeed K-Series
* Orders appear on your configured terminal
* Kitchen routing follows your Lightspeed setup
* Course assignments respected (if configured)
### TISSL (PLU-based)
* Products matched by PLU codes
* Ensure all products have valid PLUs
* Unmatched items may cause order failures
## Troubleshooting Order Injection
### Orders Not Appearing in POS
1. **Check integration status**: Verify the POS connection is active in Store Settings
2. **Check POS status**: Ensure your POS terminal is online
3. **Review order in dashboard**: Look for error messages on the order
4. **Check PLU codes**: For manual linking integrations, verify PLUs are correct
5. **Check email notifications**: If the order failed to sync, you'll receive an email with error details
### Delayed Orders
* Check your network connectivity
* Verify the POS API is responding
* Review any error messages in the dashboard
### Missing Items or Modifiers
* Ensure all products are mapped correctly
* Check modifier PLU codes (for TISSL/manual linking)
* Verify products exist in the POS
### Wrong Prices
* Check tax-inclusive vs tax-exclusive settings
* Verify prices match between systems
* Re-sync menu if using automatic sync
## Best Practices
### Test Before Going Live
Always test order injection thoroughly:
1. Place a test order with various items
2. Include modifiers and special requests
3. Verify everything appears correctly in the POS
4. Test different fulfillment methods
### Monitor Order Flow
* Regularly check that orders are flowing to POS
* Set up alerts for injection failures (if available)
* Review any failed orders promptly
### Keep Systems in Sync
* Sync menus regularly if using pull integrations
* Update PLU codes when adding new items
* Test after making menu changes
For further assistance, [contact support](/docs/getting-started/contact-support).
# POS Integration Overview
Source: https://storekit.com/docs/guides/integrations/pos/overview
Connect your point-of-sale system to storekit to sync menus, inject orders directly into the till, and keep stock aligned across online and in-venue channels.
Connecting your POS to storekit eliminates double-handling and keeps your systems in sync. Orders placed online flow directly to your existing kitchen workflow, and menu changes in your POS can automatically update your online menu.
## Why Connect a POS?
Without a POS integration, you're managing two separate systems:
* Manually entering online orders into your POS
* Updating menus in multiple places
* Reconciling sales across platforms
With a POS integration:
* **Orders inject directly** into your POS and kitchen printers
* **Menus stay synchronised** between systems
* **Inventory updates** reflect across platforms
* **Discounts and loyalty** from your POS apply to online orders
## Integration Types
Different POS systems integrate in different ways. Understanding these types helps you know what to expect.
### Push Integrations
The POS or menu platform automatically sends data to storekit whenever changes are made.
| Integration | How It Works |
| ----------- | ------------------------------------------------ |
| Deliverect | Publishes menu changes to storekit automatically |
| Stream | Pushes menu updates when published |
**Pros:** Fastest sync, no manual intervention needed\
**Cons:** Requires the source system to support push
#### Deliverect menu-sync-only mode
If you use Deliverect solely to manage and publish your menu — but send orders to a different POS — you can enable **menu-sync-only** mode on the Deliverect integration. When enabled:
* Menu changes published in Deliverect still sync to storekit automatically
* Orders are **not** dispatched to Deliverect; they go to your configured POS instead
* Deliverect channel status and busy-mode webhooks do not affect your venue's availability
This is useful when Deliverect acts as a menu management layer on top of another POS system. Contact [support](/docs/getting-started/contact-support) to enable menu-sync-only mode for your venue.
### Pull Integrations
storekit fetches data from your POS on demand or on a schedule.
| Integration | How It Works |
| ------------------- | --------------------------------- |
| Zonal (Aztec) | Pulls menu on demand or scheduled |
| Lightspeed K-Series | Pulls menu on demand or scheduled |
| Syrve | Pulls menu on demand |
| PointOne | Pulls menu on demand |
**Pros:** Works with most enterprise POS systems\
**Cons:** Changes aren't instant; requires sync trigger
### Manual Linking
Products are created in storekit and linked to your POS using product IDs (PLUs).
| Integration | How It Works |
| ----------- | ------------------------------ |
| TISSL | Products linked via PLU codes |
| Comtrex | Products linked via product ID |
| Centegra | Products linked via product ID |
**Pros:** Full control over online menu design\
**Cons:** More setup work; manual updates needed
## Feature Comparison
Not all integrations support every feature. Here's what each offers:
| Integration | Menu Sync | Order Injection | Pay at Table |
| ----------------------------------------------------- | ----------- | --------------- | ------------ |
| [Toast](/docs/guides/integrations/pos/toast/overview) | ✓ Automatic | ✓ | ✓ |
| Lightspeed K-Series | ✓ Automatic | ✓ | ✓ |
| PointOne | ✓ Automatic | ✓ | ✓ |
| Zonal | ✓ Automatic | ✓ | - |
| Centegra | Manual | ✓ | - |
| TISSL | Manual | ✓ | ✓ |
## How Orders Flow to Your POS
When a customer places an order on storekit:
```
Customer places order
↓
Payment processed
↓
Order sent to storekit backend
↓
Order injected to POS
↓
POS sends to kitchen printer/KDS
↓
Order confirmation returned
```
The entire flow typically takes 2-5 seconds. If the POS is temporarily unreachable, storekit queues the order and retries automatically.
Orders always complete for the customer even if POS injection is delayed. You'll see the order in your storekit dashboard and can manually enter it if needed.
If an order fails to sync to your POS, you'll receive an email notification with the error details and a direct link to the order. This ensures you never miss an order that needs manual attention, even if the customer has already paid online.
## Choosing the Right Approach
### Use Push Integration If:
* You already use Deliverect or Stream for aggregator management
* You want fully automated menu sync
* Your menu changes frequently
### Use Pull Integration If:
* You have an enterprise POS (Zonal, Lightspeed)
* You want scheduled sync at specific times
* You need tight inventory integration
### Use Manual Linking If:
* Your POS doesn't support API-based menu sync
* You want complete control over online menu presentation
* You have a simple, stable menu
## Getting Started
Full menu sync, order injection, floor plan, and pay at table
Full menu sync, order injection, and pay at table
Full menu sync, order injection, and pay at table
Full menu sync with basket validation
Manual product linking with floor plan sync
Manual product linking with pay at table
## Need a Different POS?
We're always evaluating new integrations. If your POS isn't listed:
1. Check if your POS works with Deliverect or Stream (middleware options)
2. [Submit a feature request](https://dashboard.storekit.com/feature-requests) with your POS details
3. Use our [Webhooks](/docs/developers/webhooks/overview) to build a custom integration
When requesting a new integration, include your POS name, version, and how many venues would use it. High-demand integrations get prioritised.
# PointOne
Source: https://storekit.com/docs/guides/integrations/pos/pointone
Connect storekit to PointOne cloud POS for automatic menu sync, order injection, and pay at table. Step-by-step instructions for the bi-directional integration.
PointOne is a cloud-based hospitality POS system. Connect it to storekit to automatically sync your menu, send online orders straight to your POS, and let customers pay their table bills from their phones.
## What You Get
* **Automatic menu sync** - Import your entire menu from PointOne with one click
* **Order injection** - Online orders appear directly in PointOne, no manual entry
* **Pay at table** - Customers scan a QR code to view and pay their bill
## Getting Started
### What You'll Need
Contact your PointOne account manager to get:
* **API Key** - Your unique access key
* **Site ID** - Identifies your specific location
### Connecting PointOne
1. Go to **Stores** → your store → **Settings** → **Integrations** in your storekit dashboard
2. Select **PointOne**
3. Enter your API Key and Site ID
4. Click **Save**
### Importing Your Menu
Once connected, click **Sync Menu** to import everything from PointOne. The sync brings in:
* Categories and subcategories
* Products with descriptions and images
* Modifier groups and options
* Allergen information
* Nutrition data (calories, fat, carbs, etc.)
* Category availability schedules
Product images are automatically optimised during import. The sync typically takes a few minutes depending on menu size.
### Keeping Your Menu Updated
When you make changes in PointOne:
1. Return to **Stores** → your store → **Settings** → **Integrations** → **PointOne**
2. Click **Sync Menu** to pull the latest changes
Only sync when you've made menu changes. Syncing too frequently isn't necessary and won't show different results.
## Menu Sync Details
### Prices
If you have different eat-in and takeaway prices in PointOne, storekit uses the **takeaway price** for online orders.
### Allergens
All 14 major allergens sync automatically from PointOne and display on your online menu, helping customers make informed choices.
### Category Hours
If certain categories are only available at specific times (like a breakfast menu), those schedules carry over from PointOne. Customers only see available items.
### Age-Restricted Items
Products marked as 18+ in PointOne are automatically flagged, ensuring age verification prompts appear at checkout.
## How Orders Work
### Order Flow
1. Customer places order on your storekit store
2. Order is sent to PointOne immediately
3. Order appears on your POS ready to prepare
4. Customer receives confirmation with their order number
### What's Included
Orders sent to PointOne contain everything your kitchen needs:
* All items and modifiers
* Customer name and contact details
* Delivery address (for delivery orders)
* Any discounts or promo codes applied
* Tips and service charges
* Special instructions
### Order Types
| Online Order | Appears in PointOne As |
| ------------ | ---------------------- |
| Pickup | Collection |
| Delivery | Delivery |
| Dine-in | Table order |
### Pre-orders
Scheduled orders are sent to PointOne with the requested date and time, so your team knows exactly when to prepare them.
## Pay at Table
Let dine-in customers view and pay their bill without waiting for staff.
### Setup
1. Ensure your tables are configured in both PointOne and storekit
2. Generate QR codes for each table in storekit
3. Place QR codes on tables
### Customer Experience
1. Customer scans the QR code at their table
2. Their current bill appears with all items
3. They can pay the full amount or split with others
4. Payment is applied to the bill in PointOne
### Bill Updates
The bill refreshes automatically, so if a customer orders another round before paying, the new items appear on their phone.
### Mixed Payments
If some guests pay via QR code and others pay at the till, everything stays in sync. PointOne tracks all payments regardless of how they're made.
## Troubleshooting
### Menu Sync Issues
**Some products are missing**
* Products need a name and a price greater than zero to sync
* Check that missing items meet these requirements in PointOne
**Empty categories don't appear**
* Categories must contain at least one product to display
* Add products to the category in PointOne and sync again
**Images didn't import**
* Ensure images are uploaded in PointOne
* Try syncing again - large images may take longer to process
### Order Issues
**Orders not appearing in PointOne**
* Check your internet connection
* Verify PointOne is online and accepting orders
* Contact support if orders consistently fail
**Wrong items on orders**
* Your menu may be out of sync
* Run a menu sync to ensure products match between systems
### Pay at Table Issues
**"No open bill" message**
* The table may not have an active bill yet
* Staff need to open a bill in PointOne before customers can view it
**Payment not showing in PointOne**
* Payments typically appear within seconds
* If delayed, check the bill is still open
* The system automatically retries failed payments
## Go-Live Checklist
Before launching, test the full flow:
* [ ] Menu sync completes without errors
* [ ] Products, modifiers, and prices are correct
* [ ] Place a test pickup order - verify it appears in PointOne
* [ ] Place a test delivery order with full address
* [ ] Test a pre-order for tomorrow
* [ ] Scan a table QR code and verify the bill loads
* [ ] Complete a test payment via QR code
* [ ] Confirm payment appears in PointOne
## Supported Features
| Feature | Supported |
| ------------------------------ | :-------: |
| Automatic menu sync | ✓ |
| Lightweight sync (prices only) | ✗ |
| Product images | ✓ |
| Allergens | ✓ |
| Nutrition info | ✓ |
| Nested modifiers | ✓ |
| Subcategories | ✓ |
| Category availability hours | ✓ |
| Portions / sizes | ✗ |
| Courses | ✗ |
| Stock status | ✓ |
| Feature | Supported |
| -------------------------- | :-------: |
| Order injection | ✓ |
| Pre-orders | ✓ |
| Order buffering | ✗ |
| Basket validation | ✗ |
| Auto-snooze sold out items | ✗ |
| Discounts | ✓ |
| Tips | ✓ |
| Service charge | ✓ |
| Custom order notes | ✓ |
| Delivery details | ✓ |
| Feature | Supported |
| --------------------------- | :-------: |
| Live bill sync | ✓ |
| Apply payments to bill | ✓ |
| Split payments | ✓ |
| Track POS terminal payments | ✓ |
| Add to existing bill | ✗ |
| Feature | Supported |
| ----------------------- | :-------: |
| Floor plan sync | ✗ |
| Real-time stock updates | ✗ |
| Multi-site support | ✓ |
## Related
* [POS Integration Overview](/docs/guides/integrations/pos/overview)
* [Order Injection](/docs/guides/integrations/pos/order-injection)
* [Pay at Table](/docs/guides/pay-at-table/overview)
* [Troubleshooting POS Issues](/docs/guides/integrations/pos/advanced/troubleshooting)
# Connecting Syrve
Source: https://storekit.com/docs/guides/integrations/pos/syrve/connect
Connect Syrve POS to storekit: add your Syrve API Login, pick an organization, enable the integration, and register webhooks for live updates.
Connecting Syrve links your storekit account to your Syrve organization. You enter your Syrve **API Login** once, then configure each store: pick the **Organization**, enable the integration, and map how orders should land on the POS.
## Prerequisites
* A Syrve Cloud account with API access
* Your Syrve **API Login** — the API credential for your organization, issued by Syrve or your Syrve reseller
* The Syrve integration enabled on your storekit account
If **Syrve** does not appear in your **Integrations** list, the integration isn't enabled for your account yet — [contact storekit support](/docs/getting-started/contact-support).
## Connect Your Organization
Go to **Stores** → your store → **Settings** → **Integrations**, then select **Syrve**.
On the **Syrve Settings** page, under **Syrve API Settings**, enter your credential in **API Login** and click **Save**. storekit validates it against Syrve before storing it — if Syrve can't be reached with it, you'll see an error and nothing is saved.
Turn on **Enable Syrve**.
Select the Syrve **Organization** this store belongs to. storekit then loads that organization's terminal groups, order types, payment types, discounts, tips types, cancel causes, and external menus so you can map them.
Click **Save**. An organization must be selected before the settings can be saved.
Once connected, the **Syrve API Settings** section collapses to a **Connected** state with your credential masked (only the last characters shown). Click **Edit** to view the section again, and use the pencil icon to replace the API Login.
The **API Login** is stored once for your whole storekit account — every store on the account connects to Syrve with it. The **Organization** and everything below it are per store.
## Set Up Webhooks
Webhooks let Syrve push order updates to storekit, so orders progress automatically as the kitchen works through them (and stock changes arrive as they happen).
Webhooks are registered for the saved **Organization** — save your settings before setting them up.
Under **Syrve Webhooks**, click **Setup webhooks**. storekit registers itself with Syrve and then re-reads the settings from Syrve to confirm — the green **Webhooks enabled** panel shows the destination and the enabled events.
Without webhooks, storekit still confirms each order made it onto the till (it checks for about 5 minutes after sending), but later kitchen statuses and live stock changes won't arrive — the yellow **Webhooks not configured** panel warns that orders will have to be progressed manually in storekit.
To stop Syrve pushing updates, click **Disable webhooks** (the same button, once webhooks are configured).
If you change the **Organization**, the webhook panel shows **Organization changed** — save your settings to see the webhook status for the new organization, and set webhooks up again if needed.
## What Connecting Changes
* Enabling Syrve sets this store's POS provider to Syrve. Orders are only dispatched once the **Organization** and a **Terminal Group** are set.
* After an organization is selected, the rest of the **Syrve Settings** page becomes available: **Syrve Menu**, **Syrve Order Complications**, and **Syrve Webhooks**.
## Next Steps
Import your Syrve external menu into storekit
Map order types, payments, and charges
## Related
* [Syrve POS Overview](/docs/guides/integrations/pos/syrve/overview)
* [Troubleshooting](/docs/guides/integrations/pos/syrve/troubleshooting)
# Syrve Dine-in: Table Orders
Source: https://storekit.com/docs/guides/integrations/pos/syrve/dine-in
How storekit's at-table orders open a tab on Syrve — table setup, the Table Order Type, and what to know about tabs on the till.
For dine-in venues, storekit sends at-table orders to Syrve as a **tab** on the till, named after the table, so staff can find and settle it like any other open order.
## Set It Up
Tables are managed in storekit — see [Dine-in tables](/docs/guides/fulfillment/dine-in-tables). There is no floor-plan import from Syrve.
Go to **Stores** → your store → **Settings** → **Integrations** → **Syrve**, and under **Syrve Order Complications** set **Table Order Type** — the dropdown offers Syrve's dine-in order types. Used for at-table orders, which open a tab on the POS.
Click **Save**.
## How Table Orders Land on the Till
* Each at-table order opens a **tab** on your **Terminal Group**, named after the storekit table and the order code (for example `Table 2-A1B2`), so staff can match the tab to the physical table at a glance.
* The number of diners is passed as the guest count.
* Payments, tips, discounts, and charges are recorded on the tab exactly as for [any other order](/docs/guides/integrations/pos/syrve/orders#payments).
## What's Different from Pickup & Delivery
**Cancelling** an at-table order in storekit does not close the tab on the POS — Syrve has no API for cancelling tabs. Void the tab on the till as well.
Kitchen status updates for table tabs don't move the storekit order forward the way delivery statuses do — a tab lives on the till until staff close it, and closing it marks the order **Complete** in storekit.
There is no pay-at-table for Syrve: guests order and pay through storekit, and the payment is recorded on the tab as externally processed.
## Related
* [Orders & Payments](/docs/guides/integrations/pos/syrve/orders)
* [Dine-in tables](/docs/guides/fulfillment/dine-in-tables)
* [Troubleshooting](/docs/guides/integrations/pos/syrve/troubleshooting)
# Syrve Menu Sync
Source: https://storekit.com/docs/guides/integrations/pos/syrve/menu-sync
Import a Syrve external menu into storekit, sync categories, items, sizes, modifiers, prices, and images, and schedule automatic re-syncs.
Menu sync pulls a Syrve **external menu** into storekit. You trigger it manually whenever the menu changes in Syrve, and you can also schedule it to run automatically.
## Sync Your Menu
Go to **Stores** → your store → **Settings** → **Integrations** → **Syrve**. Under **Syrve Menu**, pick the **External Menu** to import — the Syrve external menu imported into this store.
If your Syrve organization uses price categories, select the **Price Category** whose prices this store should use. Leave it unset to use base prices.
Click **Sync menu**. Your current selection is saved first, then the import runs in the background.
The store needs an active storekit menu before syncing, and an **External Menu** must be selected — the **Sync menu** button is disabled otherwise. External menus are created in Syrve Office (Syrve's back office); if the dropdown is empty, set one up there first.
### Syncing on a schedule
Syrve doesn't notify storekit when the menu changes, so re-run **Sync menu** after editing the menu in Syrve — or schedule it: under **Stores** → your store → **Settings** → **Automations**, click **Add sync schedule** and choose the **Menu** kind. The sync then runs automatically on your chosen schedule.
## What Gets Synced
| Data | Synced |
| ------------------------------------------------------- | --------------------------------------------------- |
| Categories | Yes |
| Items | Yes |
| Prices (per size, from the selected **Price Category**) | Yes |
| Descriptions | Yes |
| Images | Yes (re-hosted on storekit's CDN) |
| Sizes | Yes (as a required, single-choice **Size** group) |
| Modifier / option groups | Yes (including min/max and pre-selected quantities) |
| Stock / out-of-stock (stop list) | Yes |
| Nested modifiers | No |
| Allergens | No |
| Calories | No |
| Opening hours | No |
Only content that is **visible** in the Syrve external menu is imported — items, sizes, and modifier groups hidden in Syrve are skipped.
Menu sync **replaces** the menu with what Syrve returns — categories, items, and modifiers that are no longer in the external menu are removed from storekit. Make sure the external menu is correct in Syrve Office before syncing.
### Sizes
A Syrve product with sizes (for example a pizza sold in 9″/12″/14″) imports with a required, single-choice **Size** group, one option per size, each carrying its own price. The customer's size choice is passed to Syrve with the order.
### Prices
Prices come from Syrve, per size, using the selected **Price Category**. If Syrve returns no price for an item (a known gap in some Syrve external menus), the item imports at **£0** — fix the price in Syrve Office and re-sync. Because sync replaces prices, price changes belong in Syrve, not in storekit.
### Images
Item photos from the Syrve external menu are imported and re-hosted on storekit's CDN. An image you've set on an item in storekit yourself is never overwritten — only items without one get the Syrve photo.
### Products built from templates
Syrve products built from templates (common for pizzas with size-dependent modifier prices) are recognised automatically and sent to the till in the format Syrve requires — there's nothing to configure. Syrve prices these products itself on the check.
## Stock & Availability
As the last step of every sync, storekit reads Syrve's **stop list** and snoozes anything the kitchen has run out of — and with webhooks enabled, stop-list changes arrive live between syncs too. See [Stock & Availability](/docs/guides/integrations/pos/syrve/stock-and-availability) for how the stop list is applied.
## Related
* [Connecting Syrve](/docs/guides/integrations/pos/syrve/connect)
* [Stock & Availability](/docs/guides/integrations/pos/syrve/stock-and-availability)
* [Menu availability & snoozing](/docs/guides/menu/availability-snoozing)
* [Troubleshooting](/docs/guides/integrations/pos/syrve/troubleshooting)
# Syrve Orders & Payments
Source: https://storekit.com/docs/guides/integrations/pos/syrve/orders
Send storekit orders to a Syrve terminal group, map order and payment types, pass through tips, discounts and service charges, and get status updates.
When a customer places an order, storekit sends it to your Syrve terminal group. This page covers how orders are mapped and what you need to configure — everything here lives under **Syrve Order Complications** on the **Syrve Settings** page.
## When Orders Are Sent
Orders are sent to Syrve **as soon as they're placed**. The order shows as syncing while storekit waits for the till to confirm it, and is marked **Accepted** only once Syrve has the order — so an accepted order is one that's really on the POS.
Pre-orders are sent immediately by default, so they appear on the till as soon as they're placed. Turn on **Buffer Orders** to hold pre-orders and dispatch them closer to the scheduled time instead. A held pre-order can be pushed to the till early with **Resend order to POS** — the confirmation warns that this cancels the scheduled send.
## Terminal Group
Orders land on the **Terminal Group** you select — this is the till (or group of tills) in your Syrve organization.
A terminal group whose till is offline shows an **(asleep)** suffix in the dropdown. Orders sent to a sleeping terminal group are not picked up: Syrve times out after a few minutes and the order is marked **failed** in storekit. This is the most common Syrve order failure — see [Orders Failing: Till Asleep](/docs/guides/integrations/pos/syrve/till-offline).
## Order Types
Syrve requires an order type on every order. You map one per fulfillment method — each dropdown only offers Syrve order types of the matching kind:
* **Delivery Order Type** — used for delivery orders (Syrve's courier-delivery kind)
* **Pickup Order Type** — used for pickup orders (Syrve's customer-collection kind)
* **Table Order Type** — used for at-table orders, which open a tab on the POS (see [Dine-in](/docs/guides/integrations/pos/syrve/dine-in)); set it to **Not used** if the store doesn't take at-table orders
## Payments
storekit records the payment on the Syrve order so the till doesn't ask for it again:
| Setting | What it does |
| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Cash Payment Type** | The Syrve payment type used for cash orders — the till collects the cash as normal. |
| **Card Payment Type** | The Syrve payment type used for online payments. storekit has already captured the money, so it's recorded against this type as externally processed. |
If the payment type for an order's payment method isn't configured, the order is still sent — just without a payment, so staff have to close the payment on the till. Set both types before going live.
## Tips
Set **Tips Type** to have tips reach Syrve as tips, recorded separately from the payment. Without a tips type the tip stays inside the payment total — the money still reconciles, it's just not broken out as a tip on the POS.
## Discounts, Service Charges & Delivery Fees
| Setting | What it does |
| ------------------ | ---------------------------------------------------------------------------------------------------------------------------- |
| **Discount** | Order-level discounts are reported to Syrve under this discount. Set to **Not sent** to leave discounts off the Syrve order. |
| **Service Charge** | Service charges **and delivery fees** are sent to Syrve as one combined amount under this charge. |
Use a **flexible-sum** charge from Syrve Office as the **Service Charge**. Syrve's percent-based charges recalculate their own percent on the POS and ignore the amount storekit sends, so the figure on the check won't match the order. Syrve also only allows a single charge of this kind per order — which is why the service charge and delivery fee arrive combined.
## What Syrve Receives
Each order carries the customer's name and email, their phone number (converted to international format; the store's own phone number is used when the customer's can't be), the storekit order code, all items with their sizes and modifiers, any order notes as the order comment, the delivery address (for delivery orders), the payment, tip, discount and charges as configured above, and the scheduled time for pre-orders.
## Order-Status Updates
With [webhooks enabled](/docs/guides/integrations/pos/syrve/connect#set-up-webhooks), Syrve pushes kitchen progress back to storekit, which maps onto your order status:
| Syrve status | storekit status |
| --------------------------- | ----------------------------------------------------- |
| Cooking started | Preparing |
| Cooking completed / Waiting | Ready for pickup (pickup orders); Preparing otherwise |
| On way | Out for delivery |
| Delivered | Complete |
| Closed | Complete |
Statuses only move forward — a late or duplicate update never moves an order backwards.
An order **voided on the till** is *not* cancelled in storekit: a paid order must be cancelled (and refunded) in storekit, by you. storekit flags the order so staff can resolve it deliberately.
## Cancelling an Order
Cancelling a pickup or delivery order in storekit also cancels it on the POS, using the **Cancel Cause** you've selected (Syrve requires a cancel cause; pick one under **Syrve Order Complications**). At-table tabs can't be cancelled through the API — void the tab on the till.
## When an Order Fails to Reach the Till
If Syrve rejects an order — or the till never confirms it — the order is marked **failed** in storekit with the reason shown on the order. The customer's order still completes, so you never lose it.
Once the cause is fixed, open the order, use **Resend order to POS**, and confirm. One class of failure can't be recovered that way: an order that **timed out** on a [sleeping terminal group](/docs/guides/integrations/pos/syrve/till-offline) already exists inside Syrve in an error state, and Syrve rejects the re-send as a duplicate — ring it into the till manually.
Common causes and fixes are in [Troubleshooting](/docs/guides/integrations/pos/syrve/troubleshooting).
## Related
* [Connecting Syrve](/docs/guides/integrations/pos/syrve/connect)
* [Managing Live Orders](/docs/guides/orders/managing-live-orders)
* [Dine-in: Table Orders](/docs/guides/integrations/pos/syrve/dine-in)
# Syrve POS
Source: https://storekit.com/docs/guides/integrations/pos/syrve/overview
Connect Syrve POS to storekit to sync menus, send online orders to the till, mirror stop-list stock, and receive live kitchen status updates.
Syrve is a cloud POS. Once connected, storekit imports your menu from a Syrve **external menu**, sends online orders to your Syrve terminal group as they come in, keeps out-of-stock items off sale by mirroring Syrve's stop list, and progresses order statuses automatically as the kitchen works through them.
This section is split into focused guides. Start with **Connecting Syrve**, then set up the areas you need.
Enter your API Login, pick your organization, and enable the integration
Import your Syrve external menu and keep stock in sync with the stop list
How orders reach the till, payment and order-type mapping, and status updates
The stop-list mirror — after every sync and live over webhooks
At-table orders open a tab on the POS
The most common failure — wake the sleeping terminal group
Fix connection, menu, stock, and order problems
## How the Connection Works
Syrve connects with a single **API Login** — the API credential for your Syrve organization, issued by Syrve (or your Syrve reseller). You enter it once for your account, then per store you pick the Syrve **Organization**, the **External Menu** to import, and the **Terminal Group** orders should land on. storekit loads your Syrve order types, payment types, discounts, tips types, and cancel causes so you can map them.
The Syrve integration is only available to accounts that have it enabled. If you don't see **Syrve** in your **Integrations** list, [contact storekit support](/docs/getting-started/contact-support) to have it turned on.
## How Orders Flow to Syrve
```
Customer places order on storekit
↓
storekit sends the order to your Syrve terminal group
↓
The till confirms the order → order marked Accepted in storekit
↓
Syrve pushes kitchen progress back (Preparing → Ready → Complete)
```
Orders are sent to Syrve **as soon as they're placed** — the order shows as syncing until the till confirms it, and is only marked **Accepted** once Syrve has the order. If the till rejects it (or never confirms), the order is marked **failed** in storekit with the reason — the customer's order still completes, so it's never lost. The most common cause is a [sleeping terminal group](/docs/guides/integrations/pos/syrve/till-offline).
## Supported Features
| Feature | Supported |
| ------------------------------------- | :-------: |
| Manual menu sync (**Sync menu**) | ✓ |
| Scheduled sync (via **Automations**) | ✓ |
| Automatic sync on Syrve menu change | ✗ |
| Product images | ✓ |
| Sizes (as a required Size choice) | ✓ |
| Modifiers / option groups | ✓ |
| Nested modifiers | ✗ |
| Allergens | ✗ |
| Calories | ✗ |
| Price categories | ✓ |
| Stock / out-of-stock sync (stop list) | ✓ |
| Opening hours sync | ✗ |
| Feature | Supported |
| ----------------------------------------- | :--------------------------: |
| Order injection (on placement) | ✓ |
| Pre-orders | ✓ |
| Pre-order buffering (**Buffer Orders**) | ✓ |
| Order-type mapping per fulfillment method | ✓ |
| Cash and card payment mapping | ✓ |
| Tips (separate tips type) | ✓ |
| Order discount | ✓ |
| Service charge & delivery fee (combined) | ✓ |
| Custom order notes | ✓ |
| Delivery details | ✓ |
| Order-status updates back to storekit | ✓ (via webhooks) |
| Cancellation echo to Syrve | ✓ (pickup & delivery orders) |
| Automatic retries on failure | ✗ |
| Feature | Supported |
| ------------------------------------- | :--------------------------------: |
| At-table orders open a tab on the POS | ✓ |
| Floor plan / table sync from Syrve | ✗ (tables are managed in storekit) |
| Pay at table | ✗ |
| Cancellation echo for table tabs | ✗ (void on the till) |
## Related
* [POS Integration Overview](/docs/guides/integrations/pos/overview) — how POS integrations work in general
* [Managing Live Orders](/docs/guides/orders/managing-live-orders) — handle incoming orders
* [Dine-in tables](/docs/guides/fulfillment/dine-in-tables) — dine-in ordering in storekit
# Syrve Stock & Availability
Source: https://storekit.com/docs/guides/integrations/pos/syrve/stock-and-availability
Mirror Syrve's stop list into storekit after every menu sync and live over webhooks, so out-of-stock items come off sale as the kitchen 86s them.
Syrve's **stop list** — the till's out-of-stock list — is the source of truth for what's off sale. storekit mirrors it onto the online menu so customers can't order what the kitchen has run out of.
## When the Stop List Is Read
* **After every menu sync.** A fresh import says nothing about what the kitchen has 86'd, so storekit reads the stop list for your **Terminal Group** as the last step of every **Sync menu** run (manual or scheduled).
* **Live, over webhooks.** With [webhooks enabled](/docs/guides/integrations/pos/syrve/connect#set-up-webhooks), Syrve signals every stop-list change and storekit re-reads it immediately — an item 86'd on the till comes off sale online without waiting for a sync.
Without webhooks the stop list is only re-read on menu sync, so items 86'd mid-service stay orderable online. [Set up webhooks](/docs/guides/integrations/pos/syrve/connect#set-up-webhooks) if stock accuracy matters to you.
## How Stop-List Entries Are Applied
Syrve keeps items on the stop list in two states, and the **remaining count is the signal**, not the membership:
* **No stock remaining (or none tracked)** — the item is out of stock: storekit snoozes it, for items and modifier options alike.
* **A positive remaining count** — the kitchen still has some: the item **stays on sale**. storekit doesn't mirror the count itself — availability online is on/off.
An item comes back on sale when it drops off the stop list (or gets stock again). An item the stop list never mentions keeps whatever availability you've set on it in storekit.
If your Syrve organization runs several terminal groups and they disagree about an item, the stricter answer wins — storekit can't choose which till an order routes to, so an item any group has run out of goes off sale.
## Where Syrve Snoozes Show Up
Items snoozed from the stop list appear in **Reports** → **Item Snooze** alongside manual snoozes, attributed to Syrve — so you can see what the POS is taking off sale and when. They also fire the item out-of-stock webhook if you use [API webhooks](/docs/guides/integrations/api-webhooks).
## Stock Flows One Way
Syrve decides what's off sale. Snoozing or unsnoozing an item in storekit never changes the stop list in Syrve — manage the stop list on the till, as you normally would.
## Next Steps
How the menu itself is imported
Stock isn't updating? Start here
# Orders Failing: Till Asleep
Source: https://storekit.com/docs/guides/integrations/pos/syrve/till-offline
Fix the most common Syrve order failure: a sleeping terminal group. Understand the timeout error, wake the till, and recover the failed order.
This is the single most common Syrve order failure. It always comes back to the same thing: **Syrve Cloud holds the order for your terminal group, and the till wasn't online to collect it.**
storekit sends the order to Syrve Cloud successfully. If the till is off, out of the Syrve app, or disconnected from Syrve Cloud — what Syrve calls a **sleeping** terminal group — the order never lands, Syrve times out after a few minutes, and the order is marked **failed** in storekit.
Nothing is wrong with your storekit setup, your menu, or your mappings. **The fix is to get the till back online.**
## Errors That Mean This
Open the order in storekit (**Live Orders** or **All Orders** → the order) and read the red banner: *Something went wrong sending this order to the POS: …*. Either of these reasons is this problem:
| Error on the order | What it means |
| ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| A reason containing `Creation timeout expired` | Syrve's own timeout: no till in the terminal group collected the order in time. By far the most common. |
| `Timed out waiting for the Syrve POS to confirm the order (is the terminal awake?)` | storekit stopped waiting for a confirmation that never came — same root cause. |
You can see the same state before any order fails: on **Stores** → your store → **Settings** → **Integrations** → **Syrve**, a sleeping terminal group shows an **(asleep)** suffix next to its name in the **Terminal Group** dropdown.
## What storekit Does On Its Own
* storekit watches for Syrve's confirmation for about 5 minutes after sending (webhooks and polling both count).
* The first definitive failure marks the order **Failed** — there are no automatic re-sends for Syrve — the store's failed-order alert goes out, and the reason is recorded on the order.
* The customer's order still completes; you never lose it.
## Wake the Till
On the till (or tills) in the terminal group that receives online orders:
1. **Power the till on and open the Syrve POS app.** It must be running and logged in.
2. **Check its connection to Syrve Cloud.** A till that works locally but has lost its internet connection is still asleep as far as online orders are concerned — fix the network and let it reconnect.
3. Confirm the group is awake: reopen **Stores** → your store → **Settings** → **Integrations** → **Syrve** and check the **Terminal Group** dropdown no longer shows **(asleep)** against your group.
## Then Deal With the Failed Order
Every failed order offers a re-send: open it (**Live Orders** or **All Orders** → the order), click **More actions** → **Resend order to POS**, and confirm.
A re-send recovers orders that never reached Syrve — a configuration gap, or Syrve rejecting the request outright. An order that **timed out** on a sleeping till already exists inside Syrve in an error state, and Syrve rejects the re-send as a duplicate ("Order already exists") — ring that order into the till manually, or [contact support](/docs/getting-started/contact-support).
## Confirm You're Recovered
* Place a small test order and check it lands on the till.
* Watch **Live Orders** for a few minutes — new orders should move to **Accepted**, not **Failed**.
## Stop It Happening Again
Treat the till that receives online orders as infrastructure:
* **Keep it powered and on the Syrve app** for the whole of service — a till that's shut down overnight and opened late fails every early order.
* **Give it stable internet.** A till at the edge of Wi-Fi coverage drops its Syrve Cloud session intermittently.
* **Glance at the Terminal Group dropdown** when something feels off — the **(asleep)** suffix is your early warning before any order fails.
## Still Failing
If the till is on, logged in, connected, and the terminal group shows awake, but orders still fail:
* Check the other order failure causes in [Syrve Troubleshooting](/docs/guides/integrations/pos/syrve/troubleshooting) — a missing order type or a stale menu fails orders with a different reason.
* [Contact storekit support](/docs/getting-started/contact-support) with an example order number.
# Syrve Troubleshooting
Source: https://storekit.com/docs/guides/integrations/pos/syrve/troubleshooting
Fix common Syrve POS integration problems in storekit — connection errors, menu sync issues, £0 prices, stock mismatches, sleeping terminals, and failed orders.
Common Syrve integration problems and how to fix them. If you're still stuck, [contact storekit support](/docs/getting-started/contact-support).
## Connection
### "Syrve" isn't in my Integrations list
The integration isn't enabled for your account. [Contact support](/docs/getting-started/contact-support) to have it turned on.
### "We could not reach Syrve's API with the configured API key"
The saved **API Login** doesn't work — it's mistyped, revoked, or not yet issued for API access. Re-enter it under **Syrve API Settings** (use the pencil icon to replace it). storekit validates the credential against Syrve before saving, so a value that saves successfully is one that works.
### I can't save the settings
An **Organization** must be selected before the settings can be saved — the page prompts you to select one.
## Menu Sync
### The Sync menu button is disabled
* An **External Menu** must be selected.
* The store must have an active storekit menu.
### The External Menu dropdown is empty
External menus are created in Syrve Office. Set one up there (and make sure your **Organization** is the right one), then reopen the page.
### Items show £0
Syrve returned no price for those items — a known gap in some Syrve external menus. Fix the prices in Syrve Office and run **Sync menu** again. Setting the price in storekit isn't a durable fix: the next sync replaces it with what Syrve returns.
### Items or modifiers are missing
Only content **visible** in the Syrve external menu imports — items, sizes, and modifier groups hidden in Syrve are skipped, as are modifier groups with no visible options. Check the external menu in Syrve Office and re-sync.
### An item that's in stock shows as sold out (or vice versa)
Availability follows Syrve's **stop list** for your **Terminal Group** — see [Stock & Availability](/docs/guides/integrations/pos/syrve/stock-and-availability) for the exact rules (including why a stop-listed item with stock remaining stays on sale). Webhooks deliver stop-list changes live; without them, the list is only re-read on menu sync — run **Sync menu** to force a reconcile, and [set up webhooks](/docs/guides/integrations/pos/syrve/connect#set-up-webhooks) so it stays current.
## Orders
### Orders are failing to reach the till
A failed order is marked **failed** in storekit with the Syrve error on the order; the customer's order still completes. Common causes:
* **The terminal group is asleep** — the error mentions a timeout. This is the most common failure and has [its own guide](/docs/guides/integrations/pos/syrve/till-offline): wake the till, and note that Syrve rejects a re-send of a timed-out order as a duplicate — ring it in manually.
* **No order type for the fulfillment method** — set **Delivery Order Type**, **Pickup Order Type**, or **Table Order Type** under **Syrve Order Complications**, then open the order and use **Resend order to POS**.
* **The integration is only partly configured** — the **Organization** and **Terminal Group** must both be set; fix and resend.
* **An item can't be matched on the POS** — the menu on the till has changed since the last import. Run **Sync menu**, then resend.
### The payment isn't on the Syrve order
Set **Cash Payment Type** and **Card Payment Type** under **Syrve Order Complications**. Orders placed while one is missing are sent without a payment — staff have to close those on the till.
### The service charge on the check doesn't match the order
The selected **Service Charge** is a percent-based charge in Syrve, which recalculates its own percent on the POS and ignores the amount storekit sends. Use a **flexible-sum** charge from Syrve Office instead. Remember the delivery fee is folded into the same charge, so on delivery orders the combined figure is expected.
### Order statuses aren't updating in storekit
Status updates arrive by webhook. Check **Syrve Webhooks** on the **Syrve Settings** page — if the panel says **Webhooks not configured**, click **Setup webhooks**. If you've changed **Organization**, save and set webhooks up again.
### Syrve says the order was cancelled, but it's still live in storekit
That's deliberate: a ticket voided on the till does **not** cancel a paid storekit order behind your back. storekit flags the order; cancel (and refund) it in storekit if that's what should happen.
### A cancelled storekit order is still on the till
* Cancellation only reaches Syrve for pickup and delivery orders — at-table tabs must be voided on the till.
* A **Cancel Cause** must be selected under **Syrve Order Complications**; Syrve rejects cancellations without one.
## Related
* [Connecting Syrve](/docs/guides/integrations/pos/syrve/connect)
* [Menu Sync](/docs/guides/integrations/pos/syrve/menu-sync)
* [Orders & Payments](/docs/guides/integrations/pos/syrve/orders)
# TISSL
Source: https://storekit.com/docs/guides/integrations/pos/tissl
Connect TISSL POS to storekit for order injection and pay-at-table using manual product linking. Send online orders directly to your existing TISSL tills.
TISSL integration enables automatic order injection to your TISSL POS and full pay-at-table functionality. Unlike menu sync integrations, TISSL uses manual product linking via Product IDs (PLUs) - you build your menu in storekit and link products to their TISSL counterparts.
## Prerequisites
Before setting up TISSL:
* Active TISSL POS system
* TISSL API Key
* TISSL Organisation ID
* List of Product IDs for your menu items
* Admin access to your storekit dashboard
Contact TISSL support to obtain your API Key and Organisation ID. These are required for the integration.
## Setting Up the Connection
### Step 1: Connect TISSL
1. Go to **Stores** → your store → **Settings** → **Integrations** in your storekit dashboard
2. Find **TISSL** and click **Connect**
3. Enter your TISSL credentials:
* **API Key** - Your TISSL API authentication key
* **Organisation ID** - Your TISSL organisation identifier
4. Click **Connect**
storekit verifies the credentials by checking your TISSL live status before saving.
### Step 2: Select Your Site
After authentication:
1. storekit can fetch available sites from your TISSL organisation
2. Select the site that matches this storekit venue
3. The Site ID is saved for order routing
### Step 3: Configure Integration Settings
Configure the required TISSL settings:
| Setting | Description |
| ------------------------ | --------------------------------------- |
| **Order Type** | TISSL order type for online orders |
| **Payment Type** | Payment type for paid orders |
| **Course** | Default course for all items |
| **Delivery Fee Product** | Product ID for delivery charges |
| **Discount Product** | Product ID/name for discount line items |
| **Service Charge** | Service charge amount or percentage |
The Order Type, Payment Type, Course, and product IDs must exist in your TISSL system. Verify these settings before going live.
### Step 4: Link Products
For each product in your storekit menu:
1. Go to **Menu** and select a product
2. Find the **POS ID** field
3. Enter the exact Product ID from TISSL
4. Save the product
Repeat for all products and modifiers.
## How Product Linking Works
TISSL uses **manual linking** - products aren't synced automatically:
1. You create your menu in storekit
2. You enter the TISSL Product ID for each item
3. When orders are placed, storekit sends the Product IDs
4. TISSL matches IDs to products and processes the order
This gives you complete control over online menu presentation while maintaining POS compatibility.
### Linking Modifiers
Modifiers require both Product ID and Group ID:
1. Go to your modifier groups in storekit
2. For each modifier group, enter the TISSL **Group Name/ID**
3. For each modifier option, enter the TISSL **Product ID**
4. Save changes
storekit sends modifiers in the format TISSL expects:
* `modifierGroups`: Array of group names
* `modifiers`: Array with group name and modifier name pairs
## Order Injection
When a customer places an order, storekit sends it to TISSL's `/order` endpoint.
### Order Channels
| Fulfillment | TISSL Channel |
| ----------- | --------------- |
| Dine-in | Pay At Table |
| Pickup | Click & Collect |
| Delivery | Delivery |
### What TISSL Receives
Each order includes:
* Organisation ID and Site ID
* External order ID (storekit order ID)
* Order description (order code or table number)
* Customer count
* Order type
* Service charge settings
* All items with:
* Product ID
* Quantity
* Gross and net prices
* Course assignment
* Item notes
* Modifier groups and modifiers
* Payment items (for non-cash orders)
* Customer details with address
* Order notes
### Pre-Order Buffering
For scheduled orders, you can enable buffering:
* **Buffer Orders** - Enable to delay order injection
* Orders are held until closer to the fulfillment time
* Jitter is added to prevent simultaneous orders failing
TISSL can drop simultaneous orders for the same amount. The jitter (randomised delay based on order ID) helps prevent this.
### Delivery Fee & Discounts
When applicable, storekit adds line items for:
* **Delivery fee**: Uses the configured Delivery Fee Product ID
* **Discounts**: Uses the configured Discount Product ID with negative price
### Add to Existing Bill
For dine-in orders, storekit checks for an existing bill on the table:
* If found, the order is added to the existing bill
* If not, a new bill is created
Configure **All Orders Add To Bill** to control this behaviour.
## Pay at Table
TISSL supports full pay-at-table integration:
### How It Works
1. Customer scans QR code at table
2. storekit fetches the open bill from TISSL via `/order/table/{tableId}/{orgId}/{siteId}`
3. Customer views items and selects what to pay
4. Payment is processed and sent to TISSL via `/order/payment`
5. Bill status syncs in real-time
### Bill Synchronisation
storekit keeps bills in sync with TISSL:
* Items added/removed in TISSL update automatically
* Payments made at the POS are tracked
* Bills moved between tables are followed
* Service charges and discounts sync correctly
* Tax lines are synchronised per item
### Configuration
| Setting | Description |
| -------------------------- | ------------------------------------------ |
| **Payment Type** | Payment type for storekit payments |
| **Ignore Free Items** | Don't show zero-price items on the bill |
| **Auto-close Bills Delay** | Time before checking if bill is fully paid |
## Table Sync
Fetch your table layout from TISSL:
1. Go to **Stores** → your store → **Settings** → **Integrations** → **Tissl**
2. Click **Sync floorplan** and confirm
3. Trading zones and places are imported as areas and tables
Tables include:
* Zone/area name and ID
* Table name and ID
* Capacity
* Active status
## Integration Settings Reference
| Setting | Description | Default |
| -------------------------- | ----------------------------------- | ---------------------- |
| **Order Type** | TISSL order type object | Required |
| **Payment Type** | Payment type for online orders | Required |
| **Course** | Default course for items | No Course |
| **Delivery Fee** | Product for delivery charges | Required for delivery |
| **Discount** | Product/name for discounts | Required for discounts |
| **Service Charge** | Amount or percentage | 0 |
| **Buffer Orders** | Delay pre-order injection | false |
| **Remove Email** | Don't send customer email | false |
| **All Orders Add To Bill** | Add dine-in orders to existing bill | false |
| **Ignore Free Items** | Hide free items in bill view | false |
| **Order Note Template** | Custom template for order notes | None |
## Testing Your Integration
### Pre-Launch Checklist
1. **Connection**
* [ ] API Key and Organisation ID verified
* [ ] Site selected correctly
2. **Configuration**
* [ ] Order Type exists in TISSL
* [ ] Payment Type configured
* [ ] Course assigned
* [ ] Delivery Fee product created (if using delivery)
* [ ] Discount product created (if using discounts)
3. **Product linking**
* [ ] All products have TISSL Product IDs
* [ ] All modifiers have Product IDs
* [ ] Modifier groups have Group Names
4. **Order flow**
* [ ] Place test order
* [ ] Verify items appear correctly in TISSL
* [ ] Check modifiers display properly
* [ ] Confirm prices match
5. **Pay at table** (if using)
* [ ] Tables synced
* [ ] Open bill in TISSL
* [ ] View bill via storekit
* [ ] Complete test payment
## Troubleshooting
### Connection Failed
* Verify API Key is correct and active
* Check Organisation ID matches your account
* Confirm TISSL system is online (live status check)
### Orders Not Appearing
* Verify integration is enabled
* Check Site ID is correct
* Review order in dashboard for error messages
* Confirm Order Type and Payment Type exist in TISSL
### Missing Items
* Check Product IDs are entered correctly
* Verify products exist in TISSL
* Items without Product IDs are skipped with a warning
### Modifier Issues
* Ensure modifier groups have Group Names/IDs
* Verify modifier Product IDs exist in TISSL
* Check modifier group association
### Wrong Prices
* Prices are calculated including modifiers
* Verify tax settings match (storekit sends gross and net)
* Check service charge configuration
### Pay at Table Errors
* **"no\_open\_bills"**: No active bill on that table in TISSL
* **"already\_exists"**: Bill already processed/closed
* Check table POS ID matches TISSL table ID
## Limitations
With TISSL integration:
* **No automatic menu sync**: Build menu in storekit, link to TISSL IDs
* **No real-time stock sync**: Availability managed in storekit
* **Manual product mapping**: Maintain ID mappings for all items
For further assistance, [contact support](/docs/getting-started/contact-support).
## Supported Features
| Feature | Supported |
| ---------------------- | :-------: |
| Automatic menu sync | ✗ |
| Manual product linking | ✓ |
TISSL uses manual product linking. Create your menu in storekit and enter the TISSL Product ID for each item.
| Feature | Supported |
| -------------------------- | :-------: |
| Order injection | ✓ |
| Pre-orders | ✓ |
| Order buffering | ✓ |
| Basket validation | ✗ |
| Auto-snooze sold out items | ✗ |
| Discounts | ✗ |
| Tips | ✗ |
| Service charge | ✗ |
| Custom order notes | ✗ |
| Delivery details | ✓ |
| Feature | Supported |
| --------------------------- | :-------: |
| Live bill sync | ✓ |
| Apply payments to bill | ✓ |
| Split payments | ✓ |
| Track POS terminal payments | ✓ |
| Add to existing bill | ✓ |
| Feature | Supported |
| ----------------------- | :-------: |
| Floor plan sync | ✓ |
| Real-time stock updates | ✗ |
| Multi-site support | ✓ |
# Connecting Toast
Source: https://storekit.com/docs/guides/integrations/pos/toast/connect
Connect Toast POS to storekit by entering your Restaurant GUID, enabling the integration, and setting the required payment type and check discount.
Connecting Toast links a storekit store to one Toast restaurant. You enter your Toast **Restaurant GUID**, click **Connect**, and storekit loads your Toast configuration so you can map dining options, revenue centers, and payment settings.
## Prerequisites
* A Toast account with online ordering enabled
* Your Toast **Restaurant GUID** (the unique identifier for the restaurant)
* The Toast integration enabled on your storekit account
If **Toast POS** does not appear in your **Integrations** list, the integration isn't enabled for your account yet — [contact storekit support](/docs/getting-started/contact-support).
## Connect Your Restaurant
Go to **Stores** → your store → **Settings** → **Integrations**, then select **Toast POS**.
On the **Toast POS Settings** page, under **Connection**, enter your Toast restaurant identifier in **Restaurant GUID**.
Click **Connect**. storekit validates the restaurant with Toast and loads your dining options, revenue centers, service areas, payment types, menus, discounts, and service charges.
Turn on **Enable Toast POS** so orders are dispatched to Toast.
Under **Additional Settings**, set **Alternate Payment Type** and **Check Discount** — both are required once the integration is enabled (see below). Map your dining options too.
Click **Save**.
When **Enable Toast POS** is on, **Alternate Payment Type** and **Check Discount** are required. If either is missing, saving fails with "Please fill in all required fields" and the field is flagged. Set both before going live.
## Required Fields Explained
Both live under **Additional Settings** on the **Toast POS Settings** page:
* **Alternate Payment Type** — the Toast payment type storekit uses to record online payments on the check. storekit captures the card payment itself, then reports it to Toast as this payment type. Create a suitable payment type in Toast (for example one named for your online channel) and select it here.
* **Check Discount** — an open, check-level discount in Toast that storekit uses to apply any order discount to the check. Without it, storekit cannot pass discounts to Toast.
## What Connecting Changes
* Enabling Toast sets this store's POS provider to Toast and links it to your **Restaurant GUID**. Disabling it clears that link.
* After connecting, the rest of the **Toast POS Settings** page becomes available: **Dining Options**, **Revenue Centers**, **Additional Settings**, and **Sync Actions**.
## Next Steps
Import your Toast menu into storekit
Map dining options and revenue centers
## Related
* [Toast POS Overview](/docs/guides/integrations/pos/toast/overview)
* [Troubleshooting](/docs/guides/integrations/pos/toast/troubleshooting)
# Toast Dine-in: Floor Plan & Tables
Source: https://storekit.com/docs/guides/integrations/pos/toast/dine-in
Sync your Toast service areas and tables into storekit for dine-in ordering, and route dine-in orders to the right revenue center by service area.
For dine-in venues, storekit can import your Toast floor plan so table orders land on the right Toast table and route to the right revenue center.
## Sync Your Floor Plan
Go to **Stores** → your store → **Settings** → **Integrations** → **Toast POS**, and scroll to **Sync Actions**.
Click **Sync Floorplan**. storekit imports your Toast service areas and tables and reports how many new tables were added.
**Enable Toast POS** must be on for the **Sync Floorplan** button to be available.
## What Gets Imported
* **Service areas** become storekit areas (matched by their Toast identifier). New areas accept both pay-at-table and in-store orders by default.
* **Tables** are imported under their service area, using the Toast **table name** as the storekit table name.
* Newly imported tables automatically get a QR/short link for ordering.
Tables are only imported if they belong to a Toast **service area**. If Toast returns no service areas, nothing is imported — set up service areas in Toast first.
Table **capacity/seats** and Toast table **numbers** are **not** imported — only the area and the table **name**. If you rely on table numbers, make sure they're part of the table name in Toast. Tables or areas removed in Toast are archived in storekit (hidden), not deleted, so historical orders keep their table.
## Routing Dine-in Orders by Area
Once service areas are synced, you can use them in **Revenue Center Rules** (under **Revenue Centers**) to route orders from a given **Service Area** to a specific **Revenue Center**. See [Orders & Routing](/docs/guides/integrations/pos/toast/orders#revenue-centers).
## Getting Dine-in Orders onto the Right Table
A dine-in order only attaches to a Toast table when storekit has a synced table matching the Toast table. Run **Sync Floorplan** whenever you add or rename tables in Toast so new tables are linked.
## Related
* [Pay at Table](/docs/guides/integrations/pos/toast/pay-at-table)
* [Orders & Routing](/docs/guides/integrations/pos/toast/orders)
* [Dine-in tables](/docs/guides/fulfillment/dine-in-tables)
# Toast Menu Sync
Source: https://storekit.com/docs/guides/integrations/pos/toast/menu-sync
Import your Toast menu into storekit: categories, items, modifiers, prices, images, allergens, stock, opening hours, and packaging, on demand or automatically.
Menu sync pulls your menu from Toast into storekit. You can trigger it manually, and storekit also re-syncs automatically when your Toast menu changes and on a schedule.
## Sync Your Menu
Go to **Stores** → your store → **Settings** → **Integrations** → **Toast POS**, and scroll to **Sync Actions**.
Click **Sync Menu**. The sync is queued and runs in the background; you'll see progress as it imports.
You need an active storekit menu on the store before syncing, and **Enable Toast POS** must be on — the **Sync Menu** button is disabled otherwise.
## Choosing Which Toast Menu Your Store Serves
Under **Additional Settings**, **Toast Menu** decides which Toast menu the import reads from. Pick a menu and only that menu is imported; leave it unset and all your Toast menus are synced.
**Sync Menu** re-imports from whichever menu **Toast Menu** is already set to — it does not change the source. To serve a different Toast menu, change **Toast Menu** first, then sync.
Update the menu in Toast and make sure it is visible to ordering partners. Menus hidden from ordering partners are skipped, and storekit aborts the sync rather than emptying your storekit menu.
Go to **Stores** → your store → **Settings** → **Integrations** → **Toast POS**, and scroll to **Additional Settings**.
Open the **Toast Menu** dropdown and select the menu you want to serve. Clearing the dropdown syncs all your Toast menus instead.
Click **Save** at the bottom of the page.
Click **Sync Menu** under **Sync Actions**, or go to **Menus**, click **Edit** on the menu, and click **Sync** in the **Connected to Toast** row. Your store serves the new menu as soon as the sync finishes.
Switching menus rebuilds your storekit menu from the newly selected Toast menu. Categories and items that were only on the previous menu are removed from storekit, including any you added by hand.
A store serves one storekit menu, and the Toast import writes into it. If you need two menus live at the same time, you need two stores — [Managing Multiple Stores →](/docs/guides/store-settings/multiple-stores)
## Using One Toast Menu Across Multiple Stores
A storekit menu belongs to one store and can't be shared between stores, but the same Toast menu can be synced into as many stores as you like. Each store connects to Toast and syncs on its own. [Managing Menus →](/docs/guides/menu/managing-menus)
For every store that should serve the menu:
If the store has no menu yet, go to **Stores** → the store, click **Create a menu**, choose **Enter Manually** and click **Create a menu**. Leave it empty — the sync fills it. Without this step, **Sync Menu** fails with "This venue has no active menu to sync into".
Follow [Connecting Toast](/docs/guides/integrations/pos/toast/connect) for this store: enter the **Restaurant GUID**, click **Connect**, turn on **Enable Toast POS**, set **Alternate Payment Type** and **Check Discount**, and **Save**. Set **Toast Menu** under **Additional Settings** if you want a specific Toast menu.
Click **Sync Menu** under **Sync Actions**.
When you change the menu in Toast, storekit re-syncs each connected store automatically; to pull a change in immediately, click **Sync Menu** on each store — syncing one store does not update the others. Store-specific differences (a different **Toast Menu** per store, hours, availability) are set per store under **Additional Settings**.
## What Gets Synced
| Data | Synced |
| ------------------------------------ | ------------------------------------------------------- |
| Categories (including nested groups) | Yes |
| Items | Yes |
| Prices | Yes |
| Descriptions | Yes |
| Images | Yes (re-hosted on storekit's CDN) |
| Modifier / option groups | Yes |
| Nested modifiers | Yes |
| Allergens | Yes (items marked *contains* or *may contain / traces*) |
| Dietary tags | Yes |
| Alcohol flag | Yes |
| Stock / out-of-stock | Yes |
| Pre-modifiers | No |
| Calories | No |
Only menu content **visible to ordering partners** in Toast is imported. Items, groups, or menus hidden from ordering partners are skipped. If every selected menu is hidden from ordering partners, storekit aborts the sync rather than wiping your existing menu.
Menu sync **replaces** the menu with what Toast returns — categories, items, and modifiers that are no longer in Toast are removed from storekit. Make sure your Toast menu is correct and visible to ordering partners before syncing.
### Pricing limitations
Standard and menu-specific prices import correctly. Toast's size-based and sequence-based pricing can't be represented as a single price, so those items import at **£0** — set the price in storekit, or restructure the item in Toast. Pre-modifier groups are not supported and are skipped during import.
## Stock & Availability
After a full menu sync, storekit reconciles stock from Toast. Items marked out of stock in Toast are automatically snoozed in storekit, and come back when Toast reports them in stock again. Toast also pushes stock changes to storekit as they happen, so out-of-stock items are snoozed without waiting for a full sync.
### Sync Availability
Under **Additional Settings**, **Sync Availability** makes your storekit venue go online/offline automatically based on your Toast restaurant availability status.
## Opening Hours
storekit can import your opening hours from your Toast online ordering schedules.
* Turn on **Sync Opening Hours** under **Additional Settings** to keep hours in sync, or
* Click **Sync Hours** under **Sync Actions** to import them once now.
Hours import from your Toast **online ordering** schedules. Any day not covered by Toast is added as a closed day, and overnight hours (past midnight) are split across the two days. Syncing hours replaces your existing storekit opening hours.
## Packaging
If packaging is enabled on your account, a **Sync Packaging** action appears under **Sync Actions**. Click **Sync Packaging** to import your Toast packaging items into storekit; items removed from Toast are disabled.
## Related
* [Connecting Toast](/docs/guides/integrations/pos/toast/connect)
* [Menu availability & snoozing](/docs/guides/menu/availability-snoozing)
* [Troubleshooting](/docs/guides/integrations/pos/toast/troubleshooting)
# Toast Orders & Routing
Source: https://storekit.com/docs/guides/integrations/pos/toast/orders
How storekit injects orders onto Toast checks, maps dining options and revenue centers, applies discounts and payments, and receives status updates.
When you accept an online order, storekit builds a Toast check and posts it to Toast. This page covers how orders are routed and what you need to configure.
## When Orders Inject
Orders are dispatched to Toast **when you accept them** (not at payment). storekit sets the order to *syncing*, posts it to Toast, and on success marks it **Accepted** and stores the Toast check number. Pre-orders can be buffered so they reach Toast closer to the fulfillment time rather than days ahead.
## Dining Options
Toast requires a dining option on every order, so you map each storekit fulfillment method to a Toast dining option under **Dining Options**:
* **Default Dining Option**
* **Pickup Dining Option**
* **Delivery Dining Option**
* **In-Store Dining Option**
* **Curbside Dining Option**
storekit auto-suggests these from your Toast configuration when you connect, but you can change them. If an order's fulfillment method has no dining option (and no default), injection fails — always set at least the **Default Dining Option**.
## Revenue Centers
Under **Revenue Centers**, set a **Default Revenue Center** and, optionally, **Revenue Center Rules** to route orders to different revenue centers.
Click **Add Rule** to add a rule. Each rule matches on any combination of:
* **Fulfillment Method** — one of **Any**, **Delivery**, **Pickup**, **In-Store**, **Curbside**
* **Channel** — one of **Any**, **Web**, **PWA**, **App**, **Kiosk**
* **Service Area** — a Toast service area (from your synced floor plan)
and routes matching orders to the chosen **Revenue Center**. The first matching rule wins; if no rule matches, the **Default Revenue Center** is used. The **How does routing work?** link on the page opens an in-dashboard explainer.
## Payments, Discounts & Charges
These all live under **Additional Settings**:
| Setting | What it does |
| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Alternate Payment Type** | The Toast payment type used to record the online payment on the check. Required when enabled. |
| **Check Discount** | The open, check-level Toast discount used to apply an order discount. Required when enabled. |
| **Service Charge** | The Toast service charge applied for the order's service charge. |
| **Delivery Fee Service Charge** | The Toast service charge applied as the delivery fee on delivery orders. |
| **Send Order Tips as Service Charge** | When on, tips on dispatched orders are added to the **Service Charge** above instead of being recorded as a Toast tip. Requires **Service Charge** to be set. Orders only — pay-at-table tips are unaffected. |
| **Send Cash as Paid** | When on, cash orders are sent to Toast as paid. |
| **Use Check Number as Order Code** | When on, the storekit order code is replaced with the Toast check number. |
storekit records the payment on the check (amount and tip separately). Discounts only reach Toast if **Check Discount** is set; service charges and delivery fees only reach Toast if their respective service charge is set.
### Where Order Tips Land
By default the tip is recorded on the Toast payment as a tip, separate from the payment amount. If you'd rather the tip be reported as a service charge in Toast, turn on **Send Order Tips as Service Charge**: the tip is added to the **Service Charge** amount on the check, and the payment is recorded for the full order total with no Toast tip.
This setting applies to online orders dispatched to Toast only. Tips paid through [Pay at Table](/docs/guides/integrations/pos/toast/pay-at-table) are always recorded as Toast tips. With the setting on, a tipped dine-in order opens its own check rather than being appended to an open one (see [Add to Bill](/docs/guides/integrations/pos/toast/pay-at-table#add-to-bill)).
## Order Notes
Set an order note template under **Additional Settings** (the **Order Note Template** control). storekit attaches the composed note to the order's first item on the Toast check as a special request. Per-item notes the customer adds are attached to their own items the same way.
## What Toast Receives
Each order includes the customer name, phone and email, all items with their modifiers (including nested modifiers), the dining option, the revenue center (if resolved), the check discount and service charges (if configured), the tip, delivery address (for delivery), curbside details (for curbside), and the table (for dine-in).
## Order-Status Updates
Toast sends status updates back to storekit, which map onto your order status:
| Toast status | storekit status |
| ---------------- | ---------------- |
| In preparation | Preparing |
| Ready for pickup | Ready for pickup |
| Closed | Complete |
| Voided | Cancelled |
Status updates require Toast to be sending guest order status events to storekit. These are configured as part of your integration setup.
## When an Order Fails to Inject
If Toast rejects an order, storekit marks it **failed** and records the Toast error on the order — the customer's order still completes, so you never lose it. You can re-dispatch a failed order from the storekit dashboard. Common causes and fixes are in [Troubleshooting](/docs/guides/integrations/pos/toast/troubleshooting).
## Related
* [Connecting Toast](/docs/guides/integrations/pos/toast/connect)
* [Managing Live Orders](/docs/guides/orders/managing-live-orders)
* [Dine-in: Floor Plan & Tables](/docs/guides/integrations/pos/toast/dine-in)
# Toast POS
Source: https://storekit.com/docs/guides/integrations/pos/toast/overview
Connect Toast POS to storekit to sync menus, inject online orders onto Toast checks, route by revenue center, and take pay-at-table payments.
Toast is storekit's most comprehensive POS integration. Once connected, storekit imports your menu from Toast, sends online orders straight onto Toast checks, keeps stock and availability in sync, and — for dine-in venues — imports your floor plan and supports pay-at-table.
This section is split into focused guides. Start with **Connecting Toast**, then set up the areas you need.
Enter your Restaurant GUID, enable the integration, and set the required fields
Import your menu, hours, and packaging from Toast and keep stock in sync
How orders inject, dining-option and revenue-center routing, and status updates
Sync service areas and tables from Toast for dine-in ordering
Let guests pay their Toast check from their phone
Fix connection, menu, order, and pay-at-table problems
## How the Connection Works
Toast connects with a single **Restaurant GUID** — the unique identifier for your Toast restaurant. storekit holds the Toast partner credentials, so you don't paste an API key; you enter the GUID and click **Connect**. storekit then loads your Toast dining options, revenue centers, service areas, payment types, menus, discounts, and service charges so you can map them.
The Toast integration is only available to accounts that have it enabled. If you don't see **Toast POS** in your **Integrations** list, [contact storekit support](/docs/getting-started/contact-support) to have it turned on.
## How Orders Flow to Toast
```
Customer places order on storekit
↓
You accept the order
↓
storekit builds a Toast check (items, modifiers, dining option, revenue center)
↓
Order posted to Toast → order marked Accepted, Toast check number stored
↓
Toast sends status updates back (Preparing → Ready → Complete)
```
Orders inject **when you accept them**, not at the moment of payment. If injection fails, the order is marked failed in storekit with the Toast error and can be retried — the customer's order is never lost.
## Supported Features
| Feature | Supported |
| ----------------------------------- | :---------------: |
| Manual menu sync (**Sync Menu**) | ✓ |
| Automatic sync on Toast menu change | ✓ |
| Scheduled sync | ✓ |
| Product images | ✓ |
| Modifiers / option groups | ✓ |
| Nested modifiers | ✓ |
| Pre-modifiers | ✗ |
| Allergens | ✓ |
| Dietary tags | ✓ |
| Alcohol flag | ✓ |
| Calories | ✗ |
| Stock / out-of-stock sync | ✓ |
| Opening hours sync | ✓ |
| Packaging sync | ✓ (where enabled) |
| Feature | Supported |
| ------------------------------------- | :-------: |
| Order injection (on accept) | ✓ |
| Pre-orders (with buffering) | ✓ |
| Dining-option mapping | ✓ |
| Revenue-center routing | ✓ |
| Check discount | ✓ |
| Service charge & delivery fee | ✓ |
| Tips | ✓ |
| Custom order notes | ✓ |
| Delivery details | ✓ |
| Order-status updates back to storekit | ✓ |
| Feature | Supported |
| ---------------------------------- | :---------------: |
| Floor plan / table sync | ✓ |
| Table capacity / numbers import | ✗ (names only) |
| Live bill sync from Toast | ✓ |
| Apply payment to a Toast check | ✓ (single check) |
| Split across multiple Toast checks | ✗ |
| Partial payments toward a bill | ✓ |
| Track terminal payments | ✓ (reconciled) |
| Add to an existing check | ✓ (unpaid / cash) |
## Related
* [POS Integration Overview](/docs/guides/integrations/pos/overview) — how POS integrations work in general
* [Managing Live Orders](/docs/guides/orders/managing-live-orders) — handle incoming orders
* [Dine-in tables](/docs/guides/fulfillment/dine-in-tables) — dine-in ordering in storekit
# Toast Pay at Table
Source: https://storekit.com/docs/guides/integrations/pos/toast/pay-at-table
Let guests pay their Toast check from their phone with storekit pay-at-table: bills sync from Toast, payments apply to a check, and the single-check limitation.
With pay-at-table, a guest scans the QR code on their table, sees their live Toast check, and pays from their phone. storekit reads the open check from Toast, takes the payment, and reports it back onto the Toast check.
## Prerequisites
* Pay-at-table enabled on the store (dine-in with table QR codes)
* Your Toast floor plan synced so tables are linked — see [Floor Plan & Tables](/docs/guides/integrations/pos/toast/dine-in)
* **Alternate Payment Type** set under **Additional Settings** on the **Toast POS Settings** page — payments can't be applied without it
## How It Works
1. A table order is opened on Toast (by staff, or by a storekit dine-in order)
2. Toast notifies storekit and the open check is synced as a bill against the storekit table
3. The guest opens the table's QR link and sees the live check total
4. The guest pays; storekit captures the payment and records it on the Toast check
5. When the check is fully covered, the bill closes
Payments storekit applies show on the Toast check as the **Alternate Payment Type** you configured (a Toast "other" payment) — storekit captures the card itself, then reports it to Toast, rather than running it as a native Toast card transaction.
## Partial Payments and Splitting
* **Partial payments are supported** — several guests can each pay part of the bill, and it closes once the total (including tips) is covered.
* **Payments made on the Toast terminal are reconciled** — storekit re-reads the check, so terminal payments reduce the amount due and can close the bill.
Pay-at-table supports **single-check** orders only. If staff split a check into multiple checks on the Toast terminal, storekit can't apply a pay-at-table payment to that order.
## Add to Bill
storekit can append new dine-in items to an already-open Toast check (add-to-bill), so a guest ordering another round joins the existing check rather than opening a new one. Limitations, all enforced:
* Only **unpaid / pay-later (cash)** orders can be appended — a card or gift-card order that's already been charged can't be added to a check
* Appended orders **can't carry discounts, service charges, or delivery fees**
* Tips added upfront on an appended order are dropped; tips are captured at pay-at-table time instead. If **Send Order Tips as Service Charge** is on, a tipped order is not appended and opens its own check instead, so the tip isn't lost
* Single-check orders only
## When a Payment Fails
If a pay-at-table payment can't be applied to the Toast check, storekit marks it failed, voids the payment, and emails the venue so you can follow up. Check that **Alternate Payment Type** is set and that the Toast order has a single open check.
## Related
* [Floor Plan & Tables](/docs/guides/integrations/pos/toast/dine-in)
* [Orders & Routing](/docs/guides/integrations/pos/toast/orders)
* [Troubleshooting](/docs/guides/integrations/pos/toast/troubleshooting)
# Toast Troubleshooting
Source: https://storekit.com/docs/guides/integrations/pos/toast/troubleshooting
Fix common Toast POS integration problems in storekit: connection errors, menu sync issues, £0 prices, missing modifiers, and failed order injection.
Common Toast integration problems and how to fix them. If you're still stuck, [contact storekit support](/docs/getting-started/contact-support).
## Connection
### "Toast POS" isn't in my Integrations list
The integration isn't enabled for your account. [Contact support](/docs/getting-started/contact-support) to have it turned on.
### Connect fails
* Check the **Restaurant GUID** is correct for this restaurant — a wrong or mistyped GUID is the usual cause.
* Confirm your Toast restaurant has online ordering enabled.
### I can't save the settings
When **Enable Toast POS** is on, **Alternate Payment Type** and **Check Discount** are required. Saving fails with "Please fill in all required fields" until both (under **Additional Settings**) are set.
## Menu Sync
### Nothing imports, or the sync aborts
* **Enable Toast POS** must be on and the store must have an active storekit menu before you can **Sync Menu** — see ["This venue has no active menu to sync into"](#this-venue-has-no-active-menu-to-sync-into).
* Menu content must be **visible to ordering partners** in Toast. If everything selected is hidden from ordering partners, storekit aborts the sync (deliberately, so it doesn't wipe your menu). Make the menu visible to ordering partners in Toast and re-sync.
* If you've set a specific **Toast Menu** that no longer exists in Toast, the sync aborts — clear or update **Toast Menu**.
### "This venue has no active menu to sync into"
The store has no storekit menu yet. This is a storekit condition, not a Toast one — your Toast menu is fine, and there is nothing to check in Toast. **Sync Menu** imports *into* an existing storekit menu, so a brand-new store (for example the second, third or fourth site in a group sharing one Toast menu) needs a menu before the first sync. To fix it:
1. Go to **Stores** → the new store and click **Create a menu**.
2. Choose **Enter Manually** and click **Create a menu**. This creates an empty menu on the store; you don't need to add anything to it.
3. Connect the store to Toast if it isn't yet — follow [Connecting Toast](/docs/guides/integrations/pos/toast/connect) (**Restaurant GUID** → **Connect** → **Enable Toast POS** → **Alternate Payment Type** and **Check Discount** → **Save**).
4. Click **Sync Menu** under **Sync Actions**.
Repeat for each store you want to serve the Toast menu — see [Using One Toast Menu Across Multiple Stores](/docs/guides/integrations/pos/toast/menu-sync#using-one-toast-menu-across-multiple-stores).
### The wrong menu is showing on my store
**Sync Menu** re-imports the menu **Toast Menu** is set to; it does not change which Toast menu the store serves. Change **Toast Menu** under **Additional Settings**, save, then sync — see [Choosing Which Toast Menu Your Store Serves](/docs/guides/integrations/pos/toast/menu-sync#choosing-which-toast-menu-your-store-serves).
### Items show £0
Toast size-based and sequence-based pricing can't be represented as a single price, so those items import at £0. Set the price in storekit or restructure the item in Toast.
### Modifiers are missing
Toast **pre-modifier** groups are not supported and are skipped. Standard and nested modifier groups import normally.
### An item that's in stock shows as sold out (or vice versa)
Stock follows Toast. storekit snoozes items Toast reports out of stock and restores them when Toast reports them in stock. Re-run **Sync Menu** to force a reconcile.
## Orders
### Orders are failing to reach Toast
A failed order is marked **failed** in storekit with the Toast error message; the customer's order still completes. Re-dispatch it from the dashboard once the cause is fixed. Common causes:
* **No dining option for the fulfillment method** — set the matching dining option (or the **Default Dining Option**) under **Dining Options**.
* **An item can't be matched to a Toast menu group** — re-run **Sync Menu** so items carry their Toast identifiers.
* **Missing Alternate Payment Type** — set it under **Additional Settings**.
### Discounts or service charges aren't on the Toast check
* Discounts need **Check Discount** set under **Additional Settings**.
* The order service charge needs **Service Charge**, and delivery fees need **Delivery Fee Service Charge**.
### Order tips are showing as a service charge (or vice versa)
Check **Send Order Tips as Service Charge** under **Additional Settings**. When on, order tips are added to the **Service Charge** on the check instead of being recorded as a Toast tip; when off, they're recorded as a tip on the payment. It only affects online orders — pay-at-table tips are always Toast tips.
### Order statuses aren't updating in storekit
Status updates depend on Toast sending guest order status events to storekit, configured during setup. If Preparing/Ready/Complete aren't flowing through, contact support to check your webhook subscription.
## Dine-in & Floor Plan
### No tables imported after Sync Floorplan
Tables only import if they belong to a Toast **service area**. If Toast has no service areas, nothing imports — add service areas in Toast, then **Sync Floorplan** again.
### Dine-in orders aren't attaching to the right table
A dine-in order only links to a Toast table when storekit has a matching synced table. Re-run **Sync Floorplan** after adding or renaming tables in Toast.
## Pay at Table
### A pay-at-table payment failed
* **Alternate Payment Type** must be set under **Additional Settings**.
* Pay-at-table supports **single-check** orders only. If staff split the check into multiple checks on the Toast terminal, storekit can't apply the payment.
### Add-to-bill is rejected
Appended orders must be **unpaid / cash**, single-check, and carry no discounts, service charges, or delivery fees. Card or gift-card orders that have already been charged can't be added to a check.
## Related
* [Connecting Toast](/docs/guides/integrations/pos/toast/connect)
* [Menu Sync](/docs/guides/integrations/pos/toast/menu-sync)
* [Orders & Routing](/docs/guides/integrations/pos/toast/orders)
* [Pay at Table](/docs/guides/integrations/pos/toast/pay-at-table)
# Zonal (Aztec)
Source: https://storekit.com/docs/guides/integrations/pos/zonal
Connect Zonal Aztec POS to storekit for menu sync, order injection with basket validation, floor plan sync for dine-in, and full pay-at-table functionality.
Zonal (Aztec) is one of the most comprehensive POS integrations available on storekit. It offers full menu synchronisation, automatic order injection with basket validation, floor plan sync for dine-in, and support for courses, sizes, and nested modifiers.
## Prerequisites
Before connecting Zonal, ensure you have:
* Zonal Aztec POS with iOrder API access
* iOrder Brand Token from your Zonal account manager
* iOrder User Device Identifier
* Admin access to your storekit dashboard
Contact your Zonal account manager to request iOrder API credentials. You'll need the Brand Token and User Device Identifier to connect.
## Setting Up the Connection
### Step 1: Enter Zonal Credentials
1. Go to **Stores** → your store → **Settings** → **Integrations** in your storekit dashboard
2. Find **Zonal** and click **Connect**
3. Enter your iOrder credentials:
* **Brand Token** - Your iOrder brand authentication token
* **User Device Identifier** - Your unique device identifier
* **Bundle Identifier** (optional) - Custom bundle ID if provided
4. Click **Connect**
storekit verifies the credentials with Zonal's `authCheck` endpoint before saving.
### Step 2: Select Your Venue
After authentication:
1. storekit fetches available venues from your Zonal account
2. Select the venue (site) that matches this storekit store
3. The venue's Site ID is saved for all future API calls
### Step 3: Sync Your Menu
Once connected, import your menu from Zonal:
1. Go to **Menu** in your dashboard
2. Click **Sync Menu**
3. storekit fetches menus from all sales areas
4. Categories and products are imported with full modifier structure
## Menu Sync
### What Gets Synced
| Data | Synced |
| ------------------------- | ------------------------------ |
| Categories | Yes (from display groups) |
| Products | Yes |
| Prices | Yes (including portion prices) |
| Descriptions | Yes (from display records) |
| Images | Yes (uploaded to CDN) |
| Modifiers (Choice Groups) | Yes |
| Nested Modifiers | Yes |
| Size/Portion Variants | Yes (as modifier group) |
| Courses | Yes (optional, as modifier) |
| Production Instructions | Yes |
| Allergens | Alcohol flag only |
| Calories | Yes |
| Availability | Yes (out of stock status) |
### Sync Types
**Full Sync:**
Imports the complete menu structure including categories, products, modifiers, and images. Use after significant menu changes.
**Lightweight Sync:**
Updates only prices and availability without re-importing the full structure. Much faster - ideal for frequent price changes or stock updates.
### Sync Options
| Setting | Description |
| -------------------------------- | ---------------------------------------------------------------- |
| **Enable Coursing** | Import course options as a modifier group on applicable products |
| **Enable Category Merge** | Combine categories with the same name from different sales areas |
| **Subscreens as Categories** | Treat Zonal subscreens as separate top-level categories |
| **Import Choices With No Price** | Include modifier options that have no supplement price |
Production instructions (items with `divisionId` of 0 or `isInstruction` flag) are automatically imported as free modifiers, even if they have no supplement price. This allows customers to add special preparation instructions like "No Ice" or "Extra Hot" to their orders.
### Sales Area Restrictions
Zonal menus are organised by sales areas. During sync, storekit:
1. Fetches menus from all sales areas
2. Merges identical menus across areas
3. Creates category-level area restrictions
This means products can be available in some areas but not others (e.g., different menus for bar vs restaurant).
### Portions (Sizes)
When a product has multiple portions in Zonal, storekit creates a "Size" modifier group:
* Base product price is set to £0
* Each portion becomes a modifier with its price
* Customers must select a size to add the item
## Order Injection
When a customer places an order, storekit sends it to Zonal via the `placePaidOrder` method.
### Order Flow
1. **Basket validation** - storekit calls `checkBasket` to validate items
2. **Payment processed** - Customer pays via storekit
3. **Order dispatched** - Order sent to Zonal with basket ID
4. **Confirmation** - Zonal returns receipt ID, order marked accepted
### Service Types
| Fulfillment | Zonal Service ID | Notes |
| ----------- | ---------------- | -------------------------------------- |
| Dine-in | 1 | Includes table number |
| Pickup | 2 | Includes timeslot and collection code |
| Delivery | 5 | Includes delivery address and timeslot |
### Pre-Order Dispatch
For pre-orders, storekit calculates the optimal dispatch time:
* **Same-day orders**: Dispatched immediately
* **Future orders**: Dispatched at 6am on the order day
This prevents orders cluttering your POS queue days in advance.
### What Zonal Receives
Each order includes:
* Customer name, email, phone
* All items with ingredient IDs, display record IDs, and portion type
* Modifiers as choice lines with nested structure
* Course assignments (if configured)
* Removal modifiers (for default items removed)
* Discount lines (percentage or fixed amount)
* Tip amount
* Delivery address (for delivery orders)
* Timeslot (for pickup/delivery)
* Collection code (8 characters)
* Custom order notes (via order note product)
### Order Notes
Zonal only accepts customer notes as a line item, so an **Order Note Product ID** must be configured before notes can appear on Zonal tickets. Go to **Stores** → \[your store] → **Settings** → **Integrations** → **Zonal** and set **Order Note Product ID** to the Zonal product ID your Zonal account manager provides for order notes. storekit then adds a line item using that product with the formatted note attached.
With no **Order Note Product ID** set, storekit sends no note line at all — the customer's note is saved on the storekit order but never reaches Zonal or the kitchen/bar tickets it prints. This is the usual cause of "notes are enabled but the kitchen doesn't get them" on Zonal sites.
Notes are upper-cased and stripped of characters Zonal can't display, and are truncated at 840 characters. Use **Order Note Template** to control how the note is composed.
Two storekit settings must also allow the note through:
* **Stores** → \[your store] → **Settings** → **Operations** → **Order Notes** must be **Optional** or **Mandatory** (not **Hidden**), otherwise customers never get a note field
* If you use order batching, **Include order notes** must be on, or notes are stripped from the merged order before it is sent to Zonal — see [Customer notes on batched tickets](/docs/guides/orders/advanced/order-batching#customer-notes-on-batched-tickets)
The product used for order notes is excluded from menu sync, so it never shows up on your storekit menu.
## Basket Validation & Discounts
Zonal integration validates orders at checkout using the `checkBasket` API.
### How It Works
1. Customer proceeds to checkout
2. storekit sends basket to Zonal with all items and modifiers
3. Zonal validates availability and calculates any discounts
4. Discount amount is returned and applied to the order total
5. Basket ID is stored and used when placing the order
### Discount Configuration
| Setting | Description |
| -------------------------- | -------------------------------------------- |
| **Discount Percentage ID** | Zonal discount ID for percentage discounts |
| **Discount Currency ID** | Zonal discount ID for fixed amount discounts |
Basket validation catches unavailable items before payment. If an item is sold out, the customer is notified immediately.
### Auto-Snooze on Errors
If `checkBasket` returns a sold-out error (code -216), storekit automatically:
1. Identifies the unavailable item
2. Snoozes it for 6 hours
3. Clears the menu cache
4. Returns the item info to the customer
## Floor Plan Sync
Sync your table layout from Zonal for dine-in ordering:
1. Go to **Stores** → \[your store] → **Settings** → **Integrations** → **Zonal**
2. Click **Sync tables**
3. Areas (sales areas) and tables are imported
### What Gets Synced
* Sales areas as venue areas
* Table groups within areas
* Individual tables with numbers and names
* Table capacity
Changes in Zonal sync automatically - new tables are added, removed tables are archived.
## Integration Settings
| Setting | Description |
| -------------------------------- | --------------------------------------------- |
| **Payment Method ID** | Zonal payment method for online orders |
| **Order Note Product ID** | Product ID used for order notes on tickets |
| **Order Note Template** | Custom template for formatting order notes |
| **Discount Percentage ID** | Discount ID for percentage discounts |
| **Discount Currency ID** | Discount ID for fixed amount discounts |
| **Enable Coursing** | Allow course selection on applicable products |
| **Enable Category Merge** | Merge categories with same name |
| **Import Choices With No Price** | Include modifiers without supplement prices |
### Sales area IDs for pickup and delivery
By default, storekit uses sales area ID `1` for pickup and delivery orders. If your Zonal configuration requires a specific sales area for these fulfillment methods, configure them using the fulfillment sales area ID settings:
| Setting | Description |
| ---------------------------------------- | ----------------------------------------------------- |
| **Fulfillment Sales Area ID – Pickup** | Zonal sales area ID to use for click & collect orders |
| **Fulfillment Sales Area ID – Delivery** | Zonal sales area ID to use for delivery orders |
Dine-in orders always use the sales area ID from the table's venue area (synced via floor plan). The fulfillment sales area ID settings only apply to pickup and delivery orders that do not have a table assigned.
## Testing Your Integration
### Pre-Launch Checklist
1. **Menu sync**
* [ ] Categories imported from all sales areas
* [ ] Products have correct prices (including portion variants)
* [ ] Modifiers appear correctly
* [ ] Nested modifiers work
* [ ] Images display
2. **Order flow**
* [ ] Basket validates successfully
* [ ] Order appears in Zonal POS
* [ ] Items, modifiers, and courses are correct
* [ ] Collection code/timeslot appears
3. **Discounts** (if configured)
* [ ] Apply a discount code
* [ ] Verify amount matches Zonal calculation
4. **Floor plan** (if using dine-in)
* [ ] Tables synced correctly
* [ ] Orders route to correct tables
## Troubleshooting
### Connection Failed
* Verify Brand Token and User Device Identifier are correct
* Check credentials haven't expired
* Contact Zonal support to confirm iOrder API access
### Menu Not Syncing
* Ensure menus are published in Zonal
* Check products are assigned to display groups
* Verify sales areas are configured
* Check for sync errors in the dashboard
### Orders Failing
* **"Missing basket ID"**: Basket validation may have failed - check item availability
* **Error -238**: Basket expired - storekit will retry with fresh basket
* **Error -216**: Item sold out - item is auto-snoozed
### Modifiers Not Appearing
* Check choice groups are configured on products
* Verify modifiers have supplement prices (or enable "Import Choices With No Price")
* Re-sync menu after Zonal changes
### Order Notes Not Appearing
* Check **Order Note Product ID** is set in the Zonal integration settings — without it no note line is sent
* Check **Order Notes** under **Operations** is **Optional** or **Mandatory**, not **Hidden**
* If order batching is on, check **Include order notes** is enabled
* Confirm the note product ID is valid in Zonal — Zonal rejects the order line if the product doesn't exist
### Wrong Prices
* Check portion configuration in Zonal
* Verify the correct portion is set as default
* For multi-portion products, check size modifier prices
For further assistance, [contact support](/docs/getting-started/contact-support).
## Supported Features
| Feature | Supported |
| ------------------------------ | :-------: |
| Automatic menu sync | ✓ |
| Lightweight sync (prices only) | ✓ |
| Product images | ✓ |
| Allergens | ✗ |
| Calories | ✓ |
| Nested modifiers | ✓ |
| Subcategories | ✗ |
| Category availability hours | ✗ |
| Portions / sizes | ✓ |
| Courses | ✓ |
| Sales area restrictions | ✓ |
| Stock status | ✓ |
| Feature | Supported |
| -------------------------- | :-------: |
| Order injection | ✓ |
| Pre-orders | ✓ |
| Order buffering | ✗ |
| Basket validation | ✓ |
| Auto-snooze sold out items | ✓ |
| Discounts | ✓ |
| Tips | ✗ |
| Service charge | ✗ |
| Custom order notes | ✓ |
| Delivery details | ✓ |
| Feature | Supported |
| --------------------------- | :-------: |
| Live bill sync | ✗ |
| Apply payments to bill | ✗ |
| Split payments | ✗ |
| Track POS terminal payments | ✗ |
| Add to existing bill | ✗ |
| Feature | Supported |
| ----------------------- | :-------: |
| Floor plan sync | ✓ |
| Real-time stock updates | ✗ |
| Multi-site support | ✓ |
# Tenzo
Source: https://storekit.com/docs/guides/integrations/tenzo
Connect Tenzo to storekit for AI-powered restaurant analytics, sales forecasting, and operational planning. Sales and order data syncs automatically each day.
The Tenzo integration sends your storekit sales and order data to Tenzo's analytics platform for AI-powered insights, forecasting, and operational planning.
## Benefits
| Benefit | Description |
| -------------------------------- | ------------------------------------------------------------------ |
| **AI-powered sales forecasting** | Predict future sales based on historical data and external factors |
| **Labour planning** | Optimise staff scheduling based on predicted demand |
| **Food waste reduction** | Forecast demand to reduce over-preparation |
| **Performance dashboards** | Visualise sales trends and operational metrics |
## How It Works
1. storekit sends sales and order data to Tenzo automatically
2. Tenzo analyses the data alongside other inputs (weather, events, etc.)
3. Actionable insights and forecasts are available in your Tenzo dashboard
4. Use the insights to plan staffing, stock, and operations
## Setup
To enable the Tenzo integration:
1. Contact storekit support to request activation
2. Provide your Tenzo account details
3. storekit configures the data sync between your accounts
4. Data begins flowing automatically once the integration is live
The Tenzo integration requires an active Tenzo account. Historical data may take some time to sync after initial setup.
For storekit's built-in reporting, see [Reports Overview](/docs/guides/reports/overview).
# TiPJAR
Source: https://storekit.com/docs/guides/integrations/tipjar
Send digital tips collected through storekit to TiPJAR for transparent, fair distribution across your team. Compliant tronc and gratuity handling.
The TiPJAR integration sends digital tips collected through storekit to TiPJAR for transparent and fair distribution across your team.
## Benefits
| Benefit | Description |
| ---------------------- | ------------------------------------------------------------------- |
| **Fair tip splitting** | Tips are distributed based on your configured rules in TiPJAR |
| **Staff transparency** | Team members can see their tip earnings in real time |
| **Digital record** | All tip transactions are logged for compliance and payroll |
| **Automated flow** | Tips collected through storekit orders flow to TiPJAR automatically |
## How It Works
1. A customer adds a tip during checkout on your storekit store
2. The tip is collected as part of the order payment
3. The tip amount is sent to TiPJAR automatically
4. TiPJAR distributes the tip according to your configured splitting rules
## Setup
To enable the TiPJAR integration:
1. Contact storekit support to request activation
2. Provide your TiPJAR account details
3. storekit connects your store to your TiPJAR account
4. Tips begin flowing automatically once the integration is live
The TiPJAR integration requires an active TiPJAR account. Set up your TiPJAR splitting rules before enabling the integration.
For configuring how tips are collected from customers, see [Tips & Service Charges](/docs/guides/payments/tips-service-charges).
# Toggle gift card redemption
Source: https://storekit.com/docs/guides/integrations/toggle
Accept Toggle gift cards in storekit. Guests can redeem gift cards at online checkout or when paying a bill, with partial balances and split payments.
Toggle lets your guests redeem their Toggle gift cards when placing an order or paying a bill online. The integration connects at the account level and is then enabled per venue, adding a gift card code input to the checkout flow.
## Capabilities
### Gift Card Redemption
Once enabled, guests can enter a Toggle gift card code at checkout with two redemption modes:
| Mode | Description |
| ---------------------- | -------------------------------------------------------------------------------------------------------------- |
| **Full redemption** | The gift card balance covers the whole order, and the order is paid entirely with the card. |
| **Partial redemption** | Only the amount needed is deducted from the gift card. The remaining balance stays on the card for future use. |
### Supported Payment Scenarios
Apply gift cards during checkout for delivery, pickup, or dine-in orders
Apply gift cards when paying a bill online through a storekit payment link
### Split Payments
When a gift card doesn't cover the full amount:
1. The gift card balance is applied first
2. The remaining balance is charged to another payment method (card, Apple Pay, etc.)
This lets guests use gift cards of any value without needing an exact match.
### Balance Enquiry
The card's remaining balance is looked up and validated before redemption, so guests can see the available balance when they apply their card.
### Refunds
When an order paid with a Toggle gift card is refunded, the full gift card redemption is reversed and the balance is restored to the card automatically. Toggle supports full refunds of a gift card transaction only — partial refunds of a gift card redemption are not supported.
Toggle handles redemption only. Purchasing new gift cards and topping up existing cards are not supported through storekit.
## How It Works
1. Guest enters their Toggle gift card code at checkout
2. storekit looks up the card and returns the available balance
3. The requested amount is deducted from the card
4. Any remaining order total is charged to another payment method
5. The order or bill is updated, and the redemption is recorded in your reports
## What You'll Need
Before connecting, make sure you have:
* A **Toggle account**. Don't have one? [Create one here](https://www.usetoggle.com/).
* Your Toggle **Username** and **Password** (used to connect your account).
* For each venue you want to enable: your Toggle **Unit EPOS Reference**, available from Toggle.
Toggle is available on eligible storekit plans. If **Toggle** does not appear under **Stores** → your store → **Settings** → **Integrations**, [contact support](/docs/getting-started/contact-support) to have it enabled for your account. Only one gift card provider can be active per venue.
## Configuration
### 1. Connect your account
1. Go to **Stores** → your store → **Settings** → **Integrations** in your dashboard and open **Toggle**
2. Click **Connect to Toggle**
3. Enter your Toggle **Username** and **Password**, then click **Connect**
Your credentials are verified with Toggle when you connect. If they're rejected, double-check them and try again.
### 2. Enable Toggle for a venue
Once your account is connected, configure each venue that should accept gift cards:
1. Turn on **Integration enabled for this venue**
2. Enter your **Unit EPOS Reference**
3. Click **Save Configuration**
The gift card code input appears at checkout for that venue as soon as it's enabled. To stop accepting gift cards at a venue, turn the venue switch off.
# Voucher Connect gift card and voucher redemption
Source: https://storekit.com/docs/guides/integrations/voucher-connect
Accept gift cards and vouchers in storekit via Voucher Connect. Customers can redeem partial or full balances on orders and table bills at online checkout.
Voucher Connect enables customers to redeem gift cards and vouchers when placing orders or paying their bill. The integration supports both partial and full redemption, making it flexible for any transaction size.
## Capabilities
### Gift Card Redemption
Customers can apply gift cards at checkout with two redemption modes:
| Mode | Description |
| ---------------------- | -------------------------------------------------------------------------------------------------------------- |
| **Full redemption** | The gift card balance covers the whole order, and the order is paid entirely with the card. |
| **Partial redemption** | Only the amount needed is deducted from the gift card. The remaining balance stays on the card for future use. |
### Supported Payment Scenarios
Apply gift cards during checkout for delivery, pickup, or dine-in orders
Use gift cards when settling the bill at pay-at-table venues
### Split Payments
When a gift card doesn't cover the full amount:
1. The gift card balance is applied first
2. The remaining balance is charged to another payment method (card, Apple Pay, etc.)
This allows customers to use gift cards of any value without needing exact amounts.
## How It Works
1. Customer enters their gift card code at checkout
2. Voucher Connect validates the code and returns the available balance
3. Customer confirms the redemption amount
4. The balance is deducted and the order/bill is updated
5. Any remaining balance is displayed for future reference
## Configuration
Voucher Connect must be enabled for your account by the storekit team before you can connect it. It is not a self-service integration. If **VoucherConnect** does not appear under **Stores** → your store → **Settings** → **Integrations**, [contact support](/docs/getting-started/contact-support) to have it enabled.
Once Voucher Connect appears in your dashboard:
1. Go to **Stores** → your store → **Settings** → **Integrations** in your dashboard
2. Find **VoucherConnect** and click **Connect**
3. Enter your Voucher Connect login credentials
## Balance Enquiry
Customers can check their gift card balance without making a purchase. This is available:
* On the checkout screen before applying the card
* Via a dedicated balance check page (if enabled)
# Connect a custom domain to your storekit ordering page
Source: https://storekit.com/docs/guides/marketing/custom-domains
Set up a custom domain for your storekit ordering shop, configure Cloudflare DNS, and troubleshoot card, Apple Pay, and Google Pay checkout issues.
**storekit+ required** - Custom domains are available on storekit+ and higher subscription plans. This feature is currently in **early access**.
Connect your own domain to your storekit ordering page for a seamless branded experience. Alongside `order.storekit.com/your-store`, customers can reach your stores on a domain you own.
Custom domains are set up per **brand**, not per store: the domain is added to a brand and then serves every store in that brand.
## Why Use a Custom Domain?
### Stronger Brand Identity
A custom domain reinforces your brand at every touchpoint. Customers see your domain in:
* The browser address bar
* Receipts and confirmation emails
* Social media links
* Marketing materials
### Better Analytics & Tracking
With a custom domain, your ordering page analytics are kept separate from storekit's domain. This means:
* Cleaner data in Google Analytics and other tools
* Easier attribution for marketing campaigns
* More accurate conversion tracking
* First-party cookies for reliable visitor identification
### Improved SEO
Search engines treat your ordering page as part of your main website when using a subdomain. Benefits include:
* Domain authority flows to your ordering pages
* Unified search presence for your brand
* Better local SEO signals
## Recommended Setup: Use a Subdomain
We recommend using a subdomain rather than your top-level domain:
| Approach | Example | Recommended |
| --------- | --------------------- | ----------- |
| Subdomain | `order.yourbrand.com` | Yes |
| Subdomain | `menu.yourbrand.com` | Yes |
| Top-level | `yourbrand.com` | No |
**Why a subdomain?**
* Your main website remains unaffected
* Easier to set up and maintain
* No risk of breaking existing website functionality
* Can run alongside your existing website
* Simpler SSL certificate management
Popular subdomain choices:
* `order.yourbrand.com`
* `orders.yourbrand.com`
* `menu.yourbrand.com`
* `shop.yourbrand.com`
## How to Connect Your Domain
There is no **Custom Domain** page in the dashboard's settings navigation. Domains live inside the brand they serve, so you open the brand first.
Click your profile in the bottom-left of the sidebar, then **Brands** in the settings navigation, then the brand you want the domain to serve. You land on that brand's **Brand Settings** page.
A brand has to exist before a domain can be added to it. If the **Brands** page is empty, click **Add brand** and create the brand first.
Under **Custom Domains**, click **Add Custom Domain**, type the subdomain you want to use (e.g., `order.yourbrand.com`) and click **Connect**.
A domain setup wizard opens with the DNS records for your domain. At supported registrars it can sign you in and add the records for you; otherwise it shows the records so you can add them yourself or forward them to your IT team or domain administrator.
Once DNS changes propagate (usually within a few minutes to 24 hours), storekit verifies and activates your custom domain with a free SSL certificate. The domain is listed under **Custom Domains** with its status beside it — it reads **Not configured** until the DNS records are in place, then **Propagating** or **Verifying**, and finally **Active**. Use **refresh** to re-check a propagating domain, or **configure** to reopen the DNS wizard for a domain that is still **Not configured**.
**Brands** only appears in the settings navigation on accounts that have custom domains enabled. If you do not see it, [contact our team](/docs/getting-started/contact-support) to have the feature switched on for your account.
Need help with DNS settings? Contact your domain registrar's support or [reach out to our team](/docs/getting-started/contact-support).
### Using Cloudflare for DNS?
If your domain's DNS is managed through Cloudflare, ensure the following settings for your ordering subdomain:
* Set the CNAME record to **DNS only** mode (grey cloud icon) — do not enable proxying (orange cloud)
* Do not configure any SSL/TLS or certificate settings for this subdomain
* Exclude this subdomain from any redirect rules, transform rules, WAF rules, or bot protection
Enabling Cloudflare's proxy (orange cloud) on your ordering subdomain will cause connection issues. storekit handles SSL and security for your custom domain automatically.
## How Store URLs Work On Your Domain
A custom domain belongs to a brand and serves every store in that brand. Each store keeps its own store slug, and that slug is the first part of the path:
```
https://yourdomain.com/{store-slug}/menu
```
So a brand with three locations is reachable like this:
```
https://order.yourbrand.com/ -> store selection page
https://order.yourbrand.com/yourbrand-soho/menu -> Soho store
https://order.yourbrand.com/yourbrand-camden/menu -> Camden store
https://order.yourbrand.com/yourbrand-shoreditch/menu -> Shoreditch store
```
Opening the domain on its own shows the brand's store-selection page, where customers pick a location.
A few consequences worth knowing before you print anything:
* **A domain cannot be pointed at one specific store.** There is no per-store domain and no setting to deep-link a domain straight to a single store's menu — the store slug is always in the path. To send customers to one location, link to `https://yourdomain.com/{store-slug}/menu`.
* **You cannot change the path.** The slug in the URL is the store slug, not the store name, and it cannot be replaced with a word of your choice.
* **Renaming a store does not change its slug**, so the store URL stays the same after a rename. Slug changes are not self-serve — [contact support](/docs/getting-started/contact-support) if you need one.
* **One domain per brand serves all of that brand's stores.** If you need separate domains for separate groups of stores, they have to be separate brands.
## Troubleshooting: payments/checkout not working after switching domain
If card payments, Apple Pay, or Google Pay stop working for customers immediately after you connect a custom domain, work through the checks below before removing the domain.
Always test a real payment on your new domain — including card, Apple Pay, and Google Pay — before switching customer-facing links, QR codes, or marketing materials over to it.
* **Confirm the CNAME is DNS only (grey cloud), not proxied.** If your DNS is managed through Cloudflare, a proxied (orange cloud) record is the most common cause of checkout and payment failures. Follow the [Using Cloudflare for DNS?](#using-cloudflare-for-dns) guidance above to set the record to **DNS only** and exclude the subdomain from redirect, transform, WAF, and bot-protection rules.
* **Allow SSL and domain verification to finish before taking live orders.** After you add the DNS record, storekit needs to verify the domain and provision an SSL certificate. This usually completes within minutes but can take up to 24 hours. Checkout may behave unpredictably until verification and SSL are fully complete, so wait for the domain to show as active before pointing customers to it.
* **Apple Pay and Google Pay may need the new domain registered with the payment provider.** These wallet methods can require the new domain to be registered/verified with the payment provider, and that verification may lag a domain switch by a short period. If cards work but Apple Pay or Google Pay do not, this is the likely cause — [contact our team](/docs/getting-started/contact-support) so we can confirm the domain is registered for wallet payments.
**Need to keep taking orders right away?** Your original `order.storekit.com/your-store` URL keeps working throughout. Use it for customer-facing links while the custom domain is being fixed, then switch back once you've confirmed payments work on the new domain.
## Frequently Asked Questions
Once you've added the DNS record, verification typically completes within minutes. In some cases, DNS propagation can take up to 24 hours.
Yes — and it stays live alongside your custom domain. Both URLs serve your store, so existing links and printed QR codes keep working after you connect a domain.
Your `order.storekit.com/your-store` URL does **not** automatically redirect to the custom domain. If you want the storekit URL to redirect to your domain, [contact support](/docs/getting-started/contact-support) and ask us to set it up — it is not a setting you can switch on in the dashboard.
Yes, storekit automatically provisions and renews SSL certificates for your custom domain at no extra cost.
While technically possible, we strongly recommend using a subdomain. Using your root domain requires additional configuration and may conflict with your existing website.
# Customer Data
Source: https://storekit.com/docs/guides/marketing/customer-data
Browse your storekit customer database to view order history, contact details, total spend, and marketing opt-in status. Export segments for email campaigns.
The Customers view in your dashboard gives you a complete picture of everyone who has ordered from your store. Use it to understand your customer base, identify your best customers, and export data for marketing campaigns.
## Accessing Customers
1. Go to **Customers** in the main menu
2. View your complete customer list
## Customer List
The customer list shows all customers who have placed orders, with key metrics at a glance:
| Column | Description |
| --------------- | ------------------------------------- |
| **Name** | Customer's first and last name |
| **Email** | Email address (if provided) |
| **Phone** | Phone number (if provided) |
| **Orders** | Total number of orders placed |
| **Total Spent** | Lifetime spend across all orders |
| **Last Order** | Date of their most recent order |
| **Marketing** | Whether they've opted in to marketing |
## Customer Profiles
Click on any customer to view their full profile:
### Contact Details
* First name and last name
* Email address
* Phone number
* Company name (if provided)
### Order History
* Complete list of all orders
* Order dates and amounts
* Order status and fulfillment method
* Click any order to view full details
### Customer Metrics
* **Total orders** - Number of orders placed
* **Total spent** - Lifetime revenue from this customer
* **Average order value** - Total spent divided by number of orders
* **First order date** - When they became a customer
* **Last order date** - Most recent activity
### Marketing Consent
See whether the customer has opted in to receive marketing communications. This consent is captured at checkout when enabled.
## Searching and Filtering
### Search
Use the search bar to find customers by:
* Name
* Email address
* Phone number
### Filters
Filter your customer list by:
| Filter | Options |
| --------------------- | ---------------------------------- |
| **Marketing consent** | Opted in / Not opted in |
| **Order count** | Number of orders (e.g., 5+ orders) |
| **Last order date** | Date range |
| **Total spent** | Spend threshold |
## Exporting Data
Export your customer data for use in email marketing platforms, CRM systems, or analysis tools.
### How to Export
1. Go to **Customers**
2. Apply any filters (optional)
3. Click **Export**
4. Choose your format (CSV)
5. Download the file
### Exported Fields
The export includes:
* First name
* Last name
* Email
* Phone
* Company name
* Order count
* Total spent
* Last order date
* Marketing consent status
* First order date
Export only customers with marketing consent when importing to email platforms to stay compliant with privacy regulations.
## Using Customer Data
### Email Marketing
Export opted-in customers to platforms like:
* Mailchimp
* Klaviyo
* Brevo (Sendinblue)
### Loyalty Programs
Identify your best customers for VIP treatment:
* High order count
* High total spend
* Frequent recent orders
### Win-Back Campaigns
Find lapsed customers to re-engage:
* Haven't ordered in 30+ days
* Previously active (multiple orders)
### Customer Segmentation
Create segments based on behaviour:
| Segment | Criteria |
| ------------ | ------------------------- |
| **VIPs** | 10+ orders or £500+ spent |
| **Regulars** | 3-9 orders |
| **New** | 1-2 orders |
| **At Risk** | No order in 60+ days |
| **Churned** | No order in 90+ days |
## Privacy and Compliance
### GDPR Rights
Customers can request:
* **Access** - View all data you hold about them
* **Deletion** - Remove their data from your systems
* **Portability** - Export their data
Handle these requests through [Contact Support](/docs/getting-started/contact-support).
### Data Retention
Customer data is retained while you have an active account. You can:
* Delete individual customer records
* Request bulk data deletion
### Marketing Consent
Only contact customers who have explicitly opted in:
* Check the marketing consent column before exporting
* Filter by consent status when creating marketing lists
* Respect unsubscribe requests promptly
## Related
Configure what customer data to collect
Collect and manage reviews
# Customer feedback, star ratings, and smart reviews
Source: https://storekit.com/docs/guides/marketing/customer-feedback
Collect post-order star ratings and comments in storekit, route 5-star customers to Google or Tripadvisor, and troubleshoot missing Google reviews.
Customer feedback helps you understand what's working and what needs improvement. storekit automatically prompts customers to rate their experience after orders and bill payments.
## How It Works
After a customer completes an order or pays a bill, they're prompted to leave feedback:
1. **Star rating** - 1 to 5 stars for their overall experience
2. **Written comments** - Free-text field for additional feedback
3. **Detailed ratings** - Optional sub-ratings for Food, Service, Atmosphere, and Value for money
## Enabling Feedback
To enable customer feedback collection:
1. Go to **Settings** → **Feedback**
2. Turn on **Enable feedback**
3. Click **Save**
Once enabled, customers will see a review prompt:
* **Orders**: On the order status page after their order is complete
* **Bill payments**: In a modal after successful payment
## Smart Reviews
Smart Reviews help you capture positive reviews on external platforms like Google and Tripadvisor, while keeping constructive feedback private.
### How Smart Reviews Work
When a customer gives a **5-star rating**:
1. They're shown your configured external review links
2. They can tap to leave a review on Google, Tripadvisor, etc.
3. Their positive feedback appears publicly where it matters most
When a customer gives **1-4 stars**:
1. They're asked to explain what could be improved
2. Feedback stays private in your dashboard
3. You can address issues before they become public reviews
### Supported Platforms
The platform selector next to the review link field offers three options:
| Platform | Description |
| ----------------------- | ------------------------------- |
|
**Google** | Google Business Profile reviews |
|
**Tripadvisor** | Travel and restaurant reviews |
|
**Yelp** | Local business reviews |
### Setting Up Smart Reviews
1. Go to **Settings** → **Feedback**
2. Scroll to **Smart review links**
3. Choose **Google**, **Tripadvisor**, or **Yelp** in the selector inside the link field, then paste your review page URL
4. Click **Add a review link**
5. Click **Save review links**
To find your Google review link, search for your business on Google, click "Write a review", and copy the URL from your browser.
**Smart review links** has its own **Save review links** button, separate from the **Save** button for the feedback settings above it. Adding a link without clicking **Save review links** does not store it.
## Reviews Aren't Appearing on Google
Ratings collected by storekit are **not** published to Google, Tripadvisor or any other platform. There is no review sync: storekit only *invites* the customer to leave a review themselves, and the review is theirs to write and post. For a fuller breakdown of what each star rating triggers, see [What happens after a guest leaves a rating →](/docs/review-management#what-happens-after-a-guest-leaves-a-rating).
The ratings and comments you see under **Feedback** in your dashboard are storekit's own feedback. They stay in storekit — they never become public reviews on your Google Business Profile.
What storekit actually does is show your review links to customers who rate you **5 stars**. So if reviews aren't showing up on Google, the usual causes are:
* **No Google link is configured.** Without a saved link for Google, a 5-star customer is never shown anywhere to go.
* **The link is wrong or invalid.** The URL must be a `http(s)` link on a Google domain (`google.com`, `search.google.com`, `maps.google.com`, `g.page`). Anything else is rejected when the customer taps it.
* **Few 5-star ratings.** Customers who rate 1-4 stars are asked what could be improved instead, and that feedback stays private in your dashboard. A low volume of 5-star ratings means very few customers are ever sent to Google.
* **Customers didn't finish.** Being shown the link isn't the same as posting a review — the customer still has to write and submit it on Google.
### Checklist
1. Go to **Settings** → **Feedback** and confirm **Enable feedback** is on.
2. In **Smart review links**, confirm there's a **Google** entry with your review URL and that it isn't marked deleted (deleted links appear faded, with an **Undelete** button).
3. Use **View link** next to the entry to open the URL and check it lands on the "Write a review" dialog for the right business.
4. Click **Save review links** if you changed anything.
5. Place a test order, open the review prompt and select **5 stars** — you should see the **leave a review** dialog with your Google link. If only one review link is configured, it opens automatically in a new tab.
Each entry shows a click count, so you can see how many customers have actually followed your Google link.
What happens after the customer taps through is outside storekit's control. Google can take a while to display a new review, and it may filter or remove reviews it considers suspicious — for example several reviews from the same device or network.
If you don't see the **Smart review links** section on the Feedback settings page, contact support via the chat widget or at [support@storekit.com](mailto:support@storekit.com) and we'll enable it for your account.
## Detailed Feedback Questions
For deeper insights, you can enable additional rating questions. When enabled, customers rate these categories separately:
* **Food** - Quality and taste of the food
* **Service** - Staff attentiveness and friendliness
* **Atmosphere** - Ambiance and environment
* **Value for money** - Whether pricing feels fair
These sub-ratings help identify specific areas for improvement.
## When Feedback Is Requested
### After Orders
For dine-in orders, customers see a "Review your order" button on the order status page. This appears when:
* The order is complete
* Order reviews are enabled
* The order wasn't paid via Pay at Table
* No review has been submitted yet
### After Bill Payments
For Pay at Table payments, a review modal appears automatically after successful payment. Customers can:
* Submit their rating immediately
* Dismiss the modal (if allowed in settings)
## Viewing Feedback
Access all customer feedback from your dashboard:
1. Go to **Feedback** in the main menu
2. View ratings, comments, and trends
3. Filter by date range, rating, or order type
4. Export feedback data for analysis
## Webhooks
Receive real-time notifications when customers submit feedback:
| Event | Description |
| ---------------------- | --------------------------------------------------------- |
| `order.rating.updated` | Triggered when a customer submits or updates their rating |
The webhook payload includes the star rating, comments, and any detailed ratings submitted.
See [Webhook Events](/docs/developers/webhooks/webhook-events) for payload details.
## Best Practices
Follow up with unhappy customers to resolve issues and show you care
Monitor ratings over time to measure improvement efforts
Feature great feedback on social media and your website
Use specific feedback to guide staff training
## Related
Promote your store with banners
Engage customers with stories
Track feedback, sync Google reviews and link each store to its Google location
# Promotional Banners
Source: https://storekit.com/docs/guides/marketing/promotional-banners
Add visual promotional banners to your storekit menu page to highlight special offers, new items, opening announcements, and seasonal events for guests.
Promotional banners are visual content blocks displayed on your menu page. They're designed to influence guest behavior - whether driving attention to specific menu items, promoting offers, or directing traffic to external goals like event bookings or private dining enquiries.
Banners are part of your **Content** toolkit alongside [Stories](/docs/guides/menu-engineering/stories), giving marketing teams powerful tools to engage customers directly within the ordering experience.
## Creating a Banner
1. Go to **Marketing** → **Content** in your dashboard
2. In the **Banners** section, click **Create Banner**
3. Upload your banner images (see [Image Requirements](#image-requirements))
4. Choose a **link type** and configure the action
5. Set the display order
6. Click **Save**
## Image Requirements
Banners require two images for optimal display across devices:
| Image | Recommended Size | Usage |
| ----------- | ---------------- | ---------------------------- |
| **Desktop** | 1200 x 400px | Shown on tablets and desktop |
| **Mobile** | 800 x 400px | Shown on mobile devices |
Use high-contrast images with clear text. Remember that banners appear in a horizontal scroll, so keep key messaging visible without requiring the full banner to be in view.
## Link Types
Configure what happens when a customer taps on your banner:
### Product Link
Opens a specific product's detail modal. Perfect for:
* Highlighting new menu items
* Promoting signature dishes
* Drawing attention to high-margin products
### Category Link
Scrolls the menu to a specific category. Useful for:
* Seasonal menu sections
* Lunch specials
* Promotional categories
### External URL
Opens an external link in a new tab. Ideal for:
* Private dining room (PDR) booking forms
* Event booking pages
* Catering enquiries
* Gift card purchases
* Social media pages
### Discount Code
Automatically applies a discount code when tapped. Great for:
* Flash sales
* Limited-time offers
* Highlighting active promotions
### Loyalty
Prompts customers to sign in or sign up for your loyalty program. Use for:
* Loyalty program awareness
* Member-exclusive offers
* Points promotions
### Menu Summary
Opens the allergen and dietary information summary. Helpful for:
* Highlighting dietary options
* Building trust with allergen-conscious guests
### Visual Only
Displays the banner without any action. Use for:
* Brand messaging
* Announcements
* Decorative content
## Metrics & Tracking
storekit automatically tracks banner engagement:
| Metric | Description |
| ---------------------- | ------------------------------------------- |
| **Views** | Number of times the banner was displayed |
| **Clicks** | Number of times the banner was tapped |
| **Click-through rate** | Percentage of views that resulted in clicks |
For external links, clicks are tracked before the user leaves your menu. This data helps you understand which banners resonate with your audience and drive action.
## Use Cases
### Driving Menu Sales
* Feature your highest-margin dishes
* Highlight new additions to the menu
* Promote combo deals or meal bundles
### External Bookings
* Link to PDR booking systems
* Promote event spaces
* Advertise catering services
### Seasonal Campaigns
* Holiday specials
* Seasonal menu launches
* Limited-time collaborations
### Cross-Promotion
* Gift card purchases
* Loyalty program sign-ups
* Social media follows
### Operational Communication
* Kitchen closure notices
* Delivery area updates
* Holiday hours
## Best Practices
* **Keep it visual** - Use compelling imagery rather than text-heavy designs
* **Clear call-to-action** - Make it obvious what will happen when tapped
* **Rotate regularly** - Fresh content keeps the experience engaging
* **Match your brand** - Maintain visual consistency with your store design
* **Test performance** - Monitor click-through rates and iterate on underperforming banners
* **Prioritize mobile** - Most orders come from mobile devices, so design mobile-first
* **Limit quantity** - 3-5 active banners is ideal; too many creates decision fatigue
## Managing Banners
### Reordering
Drag and drop banners to change their display order. The first banner appears prominently on the left of the horizontal scroll.
### Scheduling
Open the banner from **Marketing** → **Content** and find the card headed **Scheduling**. A banner with no schedule reads "Visible always, all day, every day"; click **Edit** to open **When should this banner be visible?** There are two independent layers, and a banner shows only when both allow it.
**Start and end dates.** Choose one of the four fixed options:
| Option | Shows |
| ---------------- | ---------------------------- |
| **Always** | Live now, no end date |
| **From a date** | Goes live on a specific date |
| **Until a date** | Live now, stops on a date |
| **Date range** | Between two dates |
Pick the date and time in **Starts on** and **Ends on** (the picker includes a time, so an end date of 30 September 23:45 runs to the end of that day). These drive the status badge on the banner card and in the **Content** list: **Scheduled** before the start date, **Expired** after the end date, otherwise **Active**.
**Specific days and times.** Under **Should it only show on certain days or times?** choose **All day, every day** (no day/time restrictions) or **Specific days & times**, then:
1. Click **Add time slot**. A row appears with a **Day** dropdown (Monday to Sunday) and **Start** and **End** time pickers in 15-minute steps.
2. Set the day and both times. **Start** and **End** are required; saving with either blank shows "Complete the required fields above".
3. Add one row per day and time window you want. Rows combine with "or": the banner shows whenever the current time falls inside any row. An **End** earlier than **Start** runs past midnight into the next day.
4. Click **Save Banner** (or **Create Banner** for a new banner).
Times are checked in the store's own timezone, and the same rows apply to every store the banner is linked to.
Switching back to **All day, every day** hides the rows but does not delete them. To lift a day/time restriction, remove each row with the bin icon at the end of the row, then save.
**Example: show a banner only on Mondays in September.** Choose **Date range**, set **Starts on** to 1 September 00:00 and **Ends on** to 30 September 23:45, choose **Specific days & times**, click **Add time slot**, set **Day** to Monday with **Start** 00:00 and **End** 23:45, then click **Save Banner**. The banner is hidden on every other weekday and disappears after 30 September.
The **Active** / **Scheduled** / **Expired** badge only reflects the start and end dates. A banner restricted to Mondays still shows **Active** on a Tuesday even though customers cannot see it that day.
### Deactivating
Open the banner and click **Deactivate** in the top-right corner to hide it without deleting it. A deactivated banner shows the **Archived** badge and is hidden regardless of its schedule; click **Activate** to bring it back with its dates and time slots intact. Useful for recurring promotions you want to reuse. Filter the **Content** list by **Archived** to find deactivated banners.
### If Saving Fails With an Error Reference
If **Create Banner** fails with an error message and a reference ID, the banner may still have saved. Go back to **Marketing** → **Content**, refresh the page and check the list before creating it again, or you will end up with a duplicate. If it is genuinely missing, contact support and quote the reference ID.
## Related Content
Full-screen video content for deeper engagement
Create codes to use with banner promotions
# Create menu stories with video content and CTAs
Source: https://storekit.com/docs/guides/marketing/stories
Add full-screen vertical video stories to your storekit menu page. Drive engagement and sales with Instagram-style content featuring your dishes and offers.
Stories are full-screen vertical video content displayed on your menu page. They're part of your **Content** toolkit alongside [Promotional Banners](/docs/guides/marketing/promotional-banners), designed to influence guest behavior and drive action.
For content strategy and best practices, see the [Stories guide](/docs/guides/menu-engineering/stories) in Menu Engineering.
## Creating a Story
1. Go to **Marketing** → **Content** in your dashboard
2. In the **Stories** section, click **Create Story**
3. Enter a **title** (displayed in the viewer)
4. Add one or more **pages** (videos)
5. Configure CTAs for each page
6. Set the display order in the carousel
7. Toggle the story to **Active**
8. Click **Create Story** to save
## Story Structure
Each story consists of:
| Element | Description |
| ------------- | ----------------------------------------------- |
| **Title** | Name shown in the story viewer |
| **Pages** | One or more video pages within the story |
| **Thumbnail** | First frame of the first video (auto-generated) |
| **Order** | Position in the carousel |
## Pages
Each page within a story contains:
| Element | Description |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Video** | Vertical video content (uploaded to Mux) |
| **CTA Type** | Action triggered when the button is tapped |
| **CTA Label** | Custom button text (optional) |
| **CTA Data** | Target product, category, or URL. Product and category targets are entered as IDs - see [Finding a Product ID or Category ID](#finding-a-product-id-or-category-id) |
### Video Requirements
| Specification | Requirement |
| --------------- | ---------------------------- |
| **Orientation** | Vertical (9:16 aspect ratio) |
| **Format** | MP4, MOV, or WebM |
| **Duration** | 5-60 seconds recommended |
| **Resolution** | 1080x1920 or higher |
Videos are processed through Mux for optimised streaming across all devices.
## Call-to-Action Types
### Add to Basket
Adds the linked product directly to the customer's basket.
* Best for simple items without required modifiers
* If the product has modifiers, the item modal opens instead
* Highest conversion CTA type
* Requires the product's **Product ID** pasted into the **Product ID** field
### View Item
Opens the product detail modal.
* Use when products have modifiers to configure
* Allows customers to see full details before adding
* Requires the product's **Product ID** pasted into the **Product ID** field
### View Category
Scrolls the menu to the selected category.
* Closes the story viewer
* Useful for promoting entire menu sections
* Requires the category's **Category ID** pasted into the **Category ID** field
### External URL
Opens an external link in a new tab.
* Track clicks before the user leaves
* Use for bookings, events, or external content
### None
No CTA button displayed.
* Use for brand content or announcements
* Video plays without prompting action
### Finding a Product ID or Category ID
Product and category CTAs are targeted by ID, which you paste into the page editor:
| CTA Type | Field | Value to paste |
| ----------------- | --------------- | ------------------------------ |
| **Add to Basket** | **Product ID** | The product's **Product ID** |
| **View Item** | **Product ID** | The product's **Product ID** |
| **View Category** | **Category ID** | The category's **Category ID** |
To find them:
1. Go to **Menu** in the sidebar
2. Open the product or category you want to link to
3. Scroll to the bottom of the edit panel - the **Product ID** (or **Category ID**) is the last item, just above the save button
4. It's a long identifier shown in a monospace font. Click it to select the whole value, then copy it
The same fields appear under **Scheduling, priority & CTA overrides** if you want to point a page at a different product or category per store.
A **Product ID** is not the same as the product's **SKU / PLU** or **POS ID**. Story CTAs only accept the **Product ID**. See [Products](/docs/guides/menu/products) and [Categories](/docs/guides/menu/categories).
## Viewer Behavior
When a customer opens a story:
| Interaction | Behavior |
| --------------- | --------------------------- |
| **Tap right** | Next page or next story |
| **Tap left** | Previous page |
| **Hold** | Pause video |
| **Swipe up** | Trigger CTA (if configured) |
| **X button** | Close viewer |
| **Escape key** | Close viewer (desktop) |
| **Back button** | Close viewer (mobile) |
Videos start **muted** by default. Customers can tap the volume icon to unmute.
### Progress Indicator
A progress bar at the top shows:
* Current position within the story
* Number of pages in the current story
* Auto-advances when video completes
## Metrics & Tracking
storekit tracks comprehensive story engagement:
| Event | Data Captured |
| ------------------- | ---------------------------------------------------------- |
| **Viewer Opened** | Story ID, source location |
| **Story Viewed** | Story ID, page index, has video, has CTA |
| **Navigation** | Direction (next/prev), method (tap/auto) |
| **CTA Clicked** | CTA type, target, video progress % |
| **Story Completed** | Time spent, pages viewed |
| **Viewer Closed** | Close method, total stories/pages viewed, session duration |
### Key Metrics
| Metric | Description |
| ------------------- | ----------------------------------- |
| **Open rate** | % of menu views that opened stories |
| **Completion rate** | % of stories watched to the end |
| **CTA click rate** | % of views that clicked the CTA |
| **Avg. time spent** | Average seconds in the story viewer |
## Display Settings
### Carousel Position
Stories appear in a horizontal carousel at the top of the menu page, above categories.
### Thumbnail Preview
Each story shows a looping video preview in the carousel. Customers tap to enter the full-screen viewer.
### Loading States
* Skeleton placeholders show while stories load
* Blur hash previews display before video is ready
* Spinner indicates video is buffering
## Managing Stories
### Reordering
Drag and drop stories to change their position in the carousel. First story appears on the left.
### Editing
Click a story to edit its pages, CTAs, or settings. Changes are saved immediately.
### Deleting
Delete stories to remove them permanently. This cannot be undone.
### Archiving
Toggle stories off to hide them without deleting. Useful for seasonal content you'll reuse.
## Troubleshooting
### Story is active but not visible on the ordering page
If a story shows as **Active** in the dashboard but doesn't appear on your live menu page, work through these checks first:
1. **Confirm it's Active, not just saved** - Open the story from **Marketing** → **Content** and check the toggle reads **Active** (green). A story left **Inactive** is saved but won't display. Use the **Active** / **All** / **Inactive** filters to confirm its state.
2. **Check the right store is selected** - Stories are assigned per store. Make sure the story is assigned to (and Active for) the store whose ordering page you're viewing.
3. **Refresh the live page** - Reload the ordering page (a hard refresh clears any cached version) so it picks up the latest content.
4. **Check its position in the carousel** - The carousel sits at the top of the menu, above categories. A story lower in the display order may be scrolled off-screen - scroll the carousel sideways to find it.
5. **Wait for the video to finish processing** - Videos are processed through Mux after upload. A story won't render until its video is ready, which can take a few minutes for larger files.
6. **Check any scheduling** - If you set a start or end date under **Scheduling, priority & CTA overrides**, the story only appears within that window.
If the story still doesn't appear after these checks, [contact support](/docs/getting-started/contact-support) with the store name and story title.
## Tips
* **First frame matters** - The thumbnail is auto-generated from the first frame
* **Keep it short** - 5-15 seconds per page performs best
* **Sound optional** - Design for muted viewing since videos start muted
* **Rotate content** - Fresh stories drive repeat engagement
* **Match CTAs** - Use "Add to Basket" for simple items, "View Item" for complex ones
* **Track performance** - Review metrics to optimize underperforming stories
## Related Content
Content strategy and best practices
Static visual content for the menu
Adding video to products
# Customer Order Notifications
Source: https://storekit.com/docs/guides/notifications/customer-communication
SMS and email notifications storekit sends customers during the order lifecycle: confirmation, status updates, delays, pickup, and custom templates.
storekit automatically sends SMS and email notifications to customers at key points in the order lifecycle. SMS notifications are sent via Twilio when the customer provided a phone number at checkout and the store has **Text (SMS) notifications** enabled.
## Enabling SMS Notifications
SMS notifications are **off by default**. To enable them:
1. In the dashboard, go to **Stores → \[your store] → Settings → Operations → Order Notifications → Sent to customers → Text (SMS) notifications**.
2. Tick **Text (SMS) notifications**.
3. Optionally set an **SMS Sender Name** (maximum 11 characters) to brand the sender ID in supported countries — see [Sender ID & Regional Specifics](#sender-id--regional-specifics).
4. Select **Save** in the settings bar to apply your changes.
Once enabled, customers who provide a mobile phone number at checkout will receive the SMS notifications listed below.
**I can't see or enable the SMS option**
* The **Text (SMS) notifications** checkbox and the **SMS Sender Name** field are **disabled until payment processing is active** on the store. Connect a payment provider first, then return to the Operations page to enable SMS.
* The entire **Sent to customers** section — including the SMS controls — is **not shown for order-and-pay (in-store table service) stores**. If your store accepts in-store orders, the customer SMS options are unavailable.
## Notification Lifecycle
The table below maps each order state transition to the customer notifications (SMS and/or email) that are sent automatically.
| State Transition | SMS | Email |
| ---------------------------- | ---------------------- | ---------------------- |
| **Order placed** (Pending) | Order Confirmation | Order Confirmation |
| Pending → Accepted | — | — |
| Accepted → Preparing | — | — |
| Preparing → Ready for Pickup | Ready for Pickup | Ready for Pickup |
| Preparing → Out for Delivery | Out for Delivery | — |
| Order delayed (any state) | Order Delayed | Order Delayed |
| Pre-order time changed | Pre-order Time Updated | Pre-order Time Updated |
The **Pending → Accepted** transition does not trigger a separate customer notification. The order confirmation SMS/email is sent immediately when the order is placed (while still Pending), not when it is accepted.
## SMS Notifications
### Order Confirmation
Sent immediately after a customer places an order.
> Thanks! We've received your order #`{code}`, you can track it here: `{link}`
### Ready for Pickup
Sent when a pickup order is marked as ready.
> Your order (#`{code}`) is ready for pickup! Track your order: `{link}`
If the order is marked ready with an estimated wait time, the message includes the delay:
> Your order #`{code}` will be ready for pickup in `{delay}` minutes. Track here: `{link}`
### Out for Delivery
Sent when a delivery order is marked as out for delivery.
> Your order #`{code}` is out for delivery, track it here: `{link}`
### Order Delayed
Sent when a staff member delays an order from the dashboard.
> We're sorry, your order (#`{code}`) has been delayed by `{delay}` minutes.
### Pre-Order Time Updated
Sent when a staff member changes the scheduled time of a pre-order.
> Your pre-order #`{code}` time has been updated, please check the status here: `{link}`
### Ready to Collect (Manual)
Sent manually by a staff member from the order detail view in the dashboard using the **Send SMS** button.
> Your `{venue name}` order (#`{code}`) is ready to collect!
## What You Can Customise Yourself
Some notification text is editable directly from the dashboard without contacting support:
* **Pickup instructions** — the message shown to customers on the order tracking page after they place a pickup order (e.g. "Head to the collection counter on the ground floor"). Configure this in **Stores → \[your store] → Settings → Operations**.
* **Order confirmation page content** — additional text displayed on the post-checkout confirmation screen.
* **Extra text in the order confirmation email** — create a store notice with the **Order Email** location in **Stores → \[your store] → Settings → Store Notices**. Use it for pickup or collection instructions, parking details or anything else customers need after ordering. See [Store notices](/docs/guides/store-settings/store-notices#display-locations).
Apart from the store notice, these are display messages within the ordering experience, not SMS or email templates.
## What Requires storekit Team Involvement
The actual **SMS and email notification templates** — the messages sent to customers via Twilio and SendGrid — cannot be edited from the dashboard. Changes to these templates must be configured by the storekit team. This includes:
* Order confirmation SMS
* Ready for pickup SMS
* Out for delivery SMS
* Order delayed SMS
* Pre-order time updated SMS
* Ready to collect (manual) SMS
If you need to change the wording of any of these messages, see [Requesting a Custom Template](#requesting-a-custom-template) below.
## Custom Templates
Default SMS templates can be overridden at the **account**, **brand**, or **individual store** level. Templates use [Handlebars](https://handlebarsjs.com/) syntax for dynamic content.
### Template Override Hierarchy
When storekit sends a notification, it looks for a custom template in the following order:
1. **Store-level** template — the most specific; applies only to a single store.
2. **Brand-level** template — applies to all stores under a brand, unless a store-level override exists.
3. **Account-level** template — applies to all stores in the account, unless a brand- or store-level override exists.
4. **Default template** — the built-in storekit template (shown in the [SMS Notifications](#sms-notifications) section above).
The most specific match wins. For example, if you set an account-level "Order Confirmation" template but also set a store-level override for one particular location, that location uses its own template while all other stores use the account-level one.
### Available Handlebars Variables
Custom templates can include the following dynamic variables:
| Variable | Description | Example output |
| ---------------- | ------------------------------------------- | -------------------------------- |
| `{{order.code}}` | The short order reference code | `A1B2` |
| `{{venue.name}}` | The name of the store or venue | `Gordon Ramsay Plane Food` |
| `{{link}}` | A URL to the customer's order tracking page | `https://order.storekit.com/...` |
| `{{delay}}` | The delay duration (numeric value) | `15` |
| `{{delayUnit}}` | The unit for the delay value (e.g. minutes) | `minutes` |
**Example custom template:**
```
Hi! Your {{venue.name}} order #{{order.code}} is confirmed. Track it here: {{link}}
```
### Requesting a Custom Template
To set up a custom SMS template, contact the storekit support team with the following information:
1. **Exact wording** — provide the full message text, including any Handlebars variables you want to use (see the table above).
2. **Which notification** — specify which SMS notification you want to override (e.g. "Ready for pickup", "Order confirmation").
3. **Override level** — tell us whether the template should apply at the **account**, **brand**, or **store** level, and provide the name or ID of the account, brand, or store.
4. **Language** — if your store operates in a non-English language, specify the language for the template.
Contact support via your dashboard or email **[support@storekit.com](mailto:support@storekit.com)**. Include all four pieces of information above so the team can configure your template without follow-up questions.
## Supported Languages
SMS templates are available in the following languages. The message language is determined by the store's language setting:
* English
* French
* Spanish
* German
* Italian
* Dutch
* Danish
* Swedish
## Sender ID & Regional Specifics
The name or number that appears as the SMS sender depends on the customer's country.
### Countries with Alphanumeric Sender IDs
In most countries (including the UK), the SMS is sent from a branded sender name — typically the store name, truncated to 11 characters. If no store name is set, **storekit** is used as the fallback.
### United States & Canada
Alphanumeric sender IDs are not supported. SMS messages are sent from a dedicated storekit phone number.
### Ireland
Ireland requires sender IDs to be pre-registered with [ComReg's SMS Sender ID Registry](https://v-hub.vodafone.ie/knowledge-centre/what-is-the-sms-sender-id-registry). Because registration must be completed per brand, **storekit currently sends SMS from a standard phone number in Ireland** rather than a branded sender name. If you need a branded sender ID for Ireland, contact support to discuss registration requirements.
### Other Pre-Registration Countries
Several other countries also require sender ID pre-registration (e.g. Australia, Singapore, Brazil, Hong Kong, Israel, Turkey, UAE). In these regions, SMS is sent from a standard phone number instead of a branded name.
## Email Notifications
In addition to SMS, storekit sends email notifications for the following events when the customer provided an email address:
* **Order confirmation** — receipt with order details
* **Ready for pickup** — notifies the customer their order is ready
* **Order delayed** — informs the customer of a delay with an updated estimate
* **Pre-order time updated** — confirms the new scheduled time
* **Order refunded** — confirms a refund, with the refunded amount
The wording of these emails is fixed, but you can add your own text to the order confirmation email without a custom template: create a store notice with the **Order Email** location — see [Store notices](/docs/guides/store-settings/store-notices#display-locations).
Emails are sent from the store's configured email address, or `no-reply@storekit.com` as a fallback. For details on email authentication (SPF, DKIM, DMARC) and troubleshooting deliverability issues, see [Email Deliverability](/docs/guides/notifications/email-deliverability).
### Refund Confirmation Email
When a refund on an order succeeds, the customer is emailed automatically with the subject "Your order #CODE was refunded" (or "Your bill was refunded" for a Pay at Table bill payment). The email comes from the store's own name and email address, in the store's language, and repeats the order summary with a **Refunded** row showing the refunded amount.
This email is sent when the payment provider confirms the refund rather than when a staff member clicks **Refund**, so it can arrive shortly afterwards. No dashboard setting controls it, and it cannot be re-sent: **More actions** → **Email receipt** on the order re-sends the order confirmation receipt, not the refund email. A refund that failed sends nothing to the customer, and neither does a refund on an order with no customer email address.
For what customers see and how refunds are processed, see [Refunds & Payouts](/docs/guides/payments/refunds-payouts#the-refund-email-customers-receive).
For more on automated delay notifications, see [Order Delay Notifications](/docs/guides/notifications/order-delay).
# Email Deliverability
Source: https://storekit.com/docs/guides/notifications/email-deliverability
Learn how storekit sends order emails, what authentication standards are in place, and what to do if emails aren't reaching your customers.
storekit sends transactional emails — order confirmations, receipts, ready-for-pickup notifications, and more — on behalf of your store. These emails are sent through **SendGrid**, a leading email delivery platform trusted by millions of businesses.
## How emails are sent
When your store sends an email (e.g. an order confirmation), the **From** address depends on your store's email configuration:
* If your store has a **custom business email** set (e.g. `orders@yourbusiness.com`), emails are sent from that address.
* If your store email uses a **consumer email provider** (Gmail, Outlook, Yahoo, etc.), storekit automatically sends from `no-reply@storekit.com` instead, with your address set as the **Reply-To**. This ensures reliable delivery — consumer email providers block third-party services from sending on their behalf.
For the best customer experience, set a **custom business email** in your store settings (e.g. `orders@yourbusiness.com`). This ensures your brand name appears in your customers' inboxes.
## Email authentication
storekit uses industry-standard email authentication to maximise deliverability:
| Standard | What it does |
| ------------------------------------- | ---------------------------------------------------------------------------------- |
| **SPF** (Sender Policy Framework) | Authorises SendGrid's servers to send email on behalf of the sending domain |
| **DKIM** (DomainKeys Identified Mail) | Adds a cryptographic signature to each email, proving it hasn't been tampered with |
These standards help email providers (Gmail, Outlook, etc.) verify that messages from storekit are legitimate, reducing the chance of emails landing in spam.
## If you use DMARC on your domain
**DMARC** (Domain-based Message Authentication, Reporting & Conformance) is a security policy that domain owners can publish to control how unauthenticated emails from their domain are handled.
If your business domain has a **DMARC policy** (especially `p=quarantine` or `p=reject`), emails sent by storekit using your domain as the From address may be **rejected or sent to spam** by recipient mail servers. This happens because storekit's SendGrid servers are not listed in your domain's SPF record, and DKIM is signed by SendGrid rather than your domain.
### What you can do
Our support team can help assess your setup and discuss options. [Get in touch](/docs/getting-started/contact-support).
Instead of sending from `orders@yourbusiness.com`, set your store email to a subdomain like `orders@store.yourbusiness.com`. You can then configure the subdomain's DNS without affecting your main domain's DMARC policy.
If you remove your custom email from your store settings, storekit will send emails from `no-reply@storekit.com` with your address as the Reply-To. This avoids DMARC conflicts entirely while still allowing customers to reply to you.
## Common deliverability issues
This can happen if:
* Your domain has a strict DMARC policy (see above)
* The recipient's email provider has aggressive spam filtering
* The customer accidentally marked a previous email as spam
**Fix:** Ask the customer to check their spam/junk folder and mark storekit emails as "Not Spam". If the issue persists, contact support.
Possible causes:
* The customer entered an incorrect email address at checkout
* The recipient's mailbox is full
* Your domain's DMARC policy is set to `p=reject`
**Fix:** Verify the customer's email address in the order details. If correct, contact support for further investigation.
If your store email is a consumer address (e.g. Gmail), storekit sends from `no-reply@storekit.com` to ensure delivery. Your address is still set as the Reply-To so customers can respond to you directly.
**Fix:** Set a custom business email in your store settings.
## Need help?
If you're experiencing email deliverability issues or need help configuring your email setup, [contact our support team](/docs/getting-started/contact-support).
# Order Delay Notifications
Source: https://storekit.com/docs/guides/notifications/order-delay
Notify storekit customers when their order is delayed beyond the expected time. Manage expectations, reduce complaints, and keep guests updated automatically.
Delay notifications let you inform customers when their order takes longer than expected. This helps manage expectations and reduces complaints.
## How Delay Notifications Work
When an order exceeds its expected prep time, you can notify the customer with an updated estimate. Notifications can be sent manually or configured to trigger automatically.
## Manual Delay Notifications
1. Open the order in your dashboard
2. Click the **delay notification** button on the order
3. The customer receives an updated ETA via email or SMS
Use manual notifications when individual orders are delayed due to specific circumstances.
## Configuring a Delay Buffer
Set a delay buffer so you're prompted to notify customers when orders exceed the expected time:
1. Go to **Store Settings** > **Operations**
2. Configure the delay buffer threshold
3. Click **Save**
When an order exceeds the prep time plus the buffer, the system flags it for attention.
## What Customers See
When a delay notification is sent, the customer receives:
* An acknowledgement that their order is delayed
* An updated estimated time of arrival
* Reassurance that the order is being prepared
## Tips
* **Notify early** — Let customers know as soon as you're aware of a delay
* **Be specific** — Provide an updated time rather than a vague "delayed" message
* **Monitor patterns** — Frequent delays may indicate prep time settings need adjusting
For configuring prep time and other operational settings, see [Operations Settings](/docs/guides/store-settings/operations-settings).
For details on customer SMS and email notifications, see [Customer Order Notifications](/docs/guides/notifications/customer-communication).
For managing live orders and their status, see [Managing Live Orders](/docs/guides/orders/managing-live-orders).
# Fee Report & Daily Summary
Source: https://storekit.com/docs/guides/reports/fee-report
View transaction fees, daily revenue summaries, and reconcile sales to bank payouts in the storekit Daily Summary report. Match net deposits to revenue.
The Daily Summary report provides a clear breakdown of your gross revenue, fees, and net revenue for each day, making it straightforward to reconcile your sales with bank payouts.
## Accessing the Daily Summary
In the sidebar, click **Analytics** to expand the section, then select **Accounting**. On the Accounting page, click **Daily Summary** under the Transactions heading.
Choose the payment account and store you want to review.
Select the period you want to analyse. The report displays a row for each day.
## What the Report Shows
Each row in the Daily Summary includes:
| Column | Description |
| ----------------- | ------------------------------------------------------- |
| **Gross Revenue** | Total sales amount before fees |
| **Fees** | Transaction fees charged for the day |
| **Net Revenue** | Amount paid out to your bank (Gross Revenue minus Fees) |
Toggle **Include Refunds** to see how refunds affect your daily totals.
"Net" here means **net of payment-processing fees only** — **Net Revenue** is Gross Revenue minus fees, **not** net of VAT/tax. No report shows turnover net of VAT; see [How VAT and tax are treated in reports](/docs/guides/reports/overview#how-vat-and-tax-are-treated-in-reports).
## How Fees Are Calculated
Fees are charged on a per-transaction basis. Your per-transaction rate is determined by **two** things:
1. **Your plan (billing) type** — whether you're on a **monthly** or a **rolling** plan.
* **Monthly** plans are a 12-month commitment and carry the **lower** transaction rate.
* **Rolling** plans can be cancelled at any time and carry a **higher** transaction rate in exchange for the flexibility.
2. **Your store's channel type** — **Takeaway**, **Dine-in**, or **Catering**. Each channel has its own rate, and the channel type is **fixed when the store is created** — it can't be changed on an existing store.
Because both factors apply, two stores on the same channel can be charged different rates — for example, a takeaway store on a rolling plan is charged more than a takeaway store on a monthly plan, even though both are "takeaway".
Every rate has two components: a percentage of the transaction, and a fixed amount per transaction. The fixed amount is charged in your store's own currency — a store trading in euro is charged a euro fixed fee, not 20p converted at the day's exchange rate. Rates can also differ per fulfilment method, so a store taking both delivery and pickup orders can be on two different rates.
### Current published rates
The table below lists the published storekit+ per-transaction rates at the time of writing. The takeaway rate is shown for both plan types to illustrate the difference; for dine-in and catering the standard published rate is listed. Because rolling plans generally carry a higher rate than monthly plans, and rates can change, always treat **Stores > Settings > Payments** and [storekit.com/pricing](https://www.storekit.com/pricing) as the source of truth for your current rate.
These figures are published in **pounds sterling (GBP)** — the fixed component is in pence. If your store trades in another currency, the percentage is the same but the fixed component is charged in that currency, and we do not publish a converted figure for it here. Read your own rate from the dashboard as described below.
| Channel type | Plan | Per-transaction rate |
| ------------ | -------- | -------------------- |
| Takeaway | Monthly | 2.9% + 20p |
| Takeaway | Rolling | 3.9% + 20p |
| Dine-in | Standard | 1.9% + 15p |
| Catering | Standard | 3.9% + 20p |
To see the exact rate applied to your own store, go to **Stores** → your store → **Settings** → **Payments**. Your rate is shown under **Credit / debit card rate** as a percentage plus a fixed fee, and the fixed fee is displayed in your own store's currency. `+VAT` is added to the line when your account is charged VAT, and if your rates differ by fulfilment method you'll see one line per method, each with the method named in brackets. The rate shown reflects both your plan type and your store's channel type.
Until your payment application is complete, that line shows a default GBP rate instead of your own; your contract or bespoke rate appears once the application has been completed.
If your rate looks higher than expected for your channel, check whether your store is on a **rolling** rather than a **monthly** plan — the rolling plan carries the higher rate. Bespoke transaction rates are available on **storekit++**; contact support to discuss.
## Payout Timing
Funds from each day's sales are transferred at the end of the trading day. Payouts typically take **2 working days** to arrive in your bank account.
| Sales Day | Payout Arrives |
| --------- | -------------- |
| Monday | Wednesday |
| Tuesday | Thursday |
| Wednesday | Friday |
| Thursday | Monday |
| Friday | Tuesday |
| Saturday | Tuesday |
| Sunday | Tuesday |
Bank holidays may delay payouts by one or more working days.
The Accounting section is only available to accounts with storekit Payments enabled. If you do not see the Accounting option under Analytics, confirm that storekit Payments has been set up for your account in **Stores > Settings > Payments**.
## Matching Sales to Payouts
To verify that a bank deposit matches your expected revenue:
Go to the **Payouts** tab in your Accounting section. This shows your most recent payouts (up to 50).
Identify the payout you want to verify and note its date and amount.
Open the **Daily Summary** for the corresponding sales date (accounting for the 2-day payout delay). The **Net Revenue** figure should match the payout amount.
## Reconciling a Payout with Daily Summary
If a payout doesn't match the figure you expected — for example, if you're comparing it to the **gross** (sometimes shown as "bruto") sales total — the difference is almost always explained by three things: **fees**, **payout timing**, and **refunds**.
A payout is always the **Net Revenue** amount, never the **Gross Revenue**. Gross is your total sales before fees; the payout is what's left after transaction fees (and any refunds) are deducted. Compare a payout to **Net Revenue**, not to your gross/bruto total.
Follow these steps to match a specific payout to a day in the Daily Summary:
In **Analytics → Accounting → Payouts**, find the payout you want to check and note the date it arrived and the amount received.
Payouts settle **2 working days** after the trading day (T+2). Count back two working days, skipping weekends and bank holidays, to find the sales day the payout relates to. For example, a payout arriving on **Wednesday** covers **Monday's** sales; a payout arriving on **Tuesday** covers **Friday's** sales (the weekend is skipped). See [Payout Timing](#payout-timing) above for the full table.
Set the date range to the sales day you identified and read the **Net Revenue** column for that row. This is the figure the payout should match.
If any refunds were processed on that sales day, they reduce the net amount available for payout, so the payout will be lower than the original Net Revenue. Toggle **Include Refunds** to see the refund-adjusted totals. If a refund was issued *after* the payout had already been sent, it is instead deducted from a later payout — see [Refunds & Payouts](/docs/guides/payments/refunds-payouts#how-refunds-affect-payouts).
### Worked example
Suppose Monday's trading produced the following in the Daily Summary:
| Column | Amount |
| ------------- | --------- |
| Gross Revenue | £1,000.00 |
| Fees | £32.00 |
| Net Revenue | £968.00 |
* Because Monday is the sales day, the payout arrives on **Wednesday** (T+2).
* The payout is **£968.00** — the **Net Revenue**, not the £1,000.00 gross.
* If a **£50.00** refund was also processed on Monday, the net available for payout drops to **£918.00**, and that is the amount you'll see arrive. The £968.00 Net Revenue only matches the payout when no refunds occurred that day.
If the numbers still don't line up after accounting for fees, timing, and refunds, check whether your payout schedule is set to **weekly** or **monthly** rather than daily — a single payout would then cover several sales days combined. See the [Payout Schedule](/docs/payouts/payout-schedule) guide.
### A Debit on Your Bank Statement That Isn't in the Daily Summary
**Daily Summary** and **All Transactions** show **card-processing fees only**. Those fees are deducted from your payouts before the money reaches your bank — they never leave your account as a separate payment, so they can never appear on your bank statement as a debit.
If you see a debit taken by storekit on your bank statement, it is **not** a transaction fee and you will not find it in these reports. It is a storekit **software, subscription or hardware invoice collected by Direct Debit**. There is no billing or subscription page in the dashboard that lists these invoices — see [Software & Subscription Invoices](/docs/guides/account/software-invoices) for how they are billed, and [how to request a copy of an invoice](/docs/guides/account/software-invoices#request-a-copy-of-your-software-invoice) to match a debit to the invoice it pays.
## A Payout Hasn't Arrived
If money you expected has not reached your bank, work through this checklist before contacting support. There is no payout page under **Stores** → your store → **Settings** → **Payments** — payouts are only listed under **Analytics** → **Accounting**.
On the default daily schedule, payouts arrive **2 working days** after the sales day, skipping weekends and bank holidays — see [Payout Timing](#payout-timing). Friday, Saturday and Sunday sales arrive together on Tuesday, so a weekend's takings are not late until Wednesday. If your account is on a **weekly** or **monthly** schedule, a gap of several days between payouts is normal — check when your next payout is due in the [Payout Schedule](/docs/payouts/payout-schedule) guide before treating one as missing.
A store that has been snoozed or closed usually has nothing to pay out for those days, because no card payments were taken. Check the **Daily Summary** for those dates before ruling this out: a store with **Allow pre-orders when store is snoozed** enabled can still take card payments while snoozed, and those do generate payouts. Snoozing does not pause, cancel or disconnect payouts: the first payout after you reopen follows the same rule from the first day you trade again — on the daily schedule, a store that reopens on Tuesday sees its first payout on Thursday.
In the sidebar, click **Analytics**, then **Accounting**, then **Payouts**. Set the date range to cover the sales days you are missing (up to 6 months) and read the most recent row. The columns are **Amount**, **Bank Account**, **Store**, **Status**, **Created**, **Estimated Arrival**, **Statement Description** and **ID**.
* **Status** shows the payment provider's status for that transfer as reported, or `N/A` if none was returned.
* **Estimated Arrival** is when the bank is expected to credit the money. If it is still in the future, the payout is on its way — wait until that time has passed.
* **No row for a sales day** means no payout was created for it: there were no card sales that day, the balance was zero or negative after refunds and fees, or the payout is being held. "No transfers yet!" means nothing has been paid out in the selected date range.
If your account also shows **Payouts (Legacy)** on the Accounting page, check both reports.
Go to **Stores** → your store → **Settings** → **Payments** and check the [verification status](/docs/guides/payments/storekit-payments-setup#verification-status). If verification is not complete, or you have recently changed your bank account details, payouts may be held until it is — [contact support](/docs/getting-started/contact-support) if you cannot see what is outstanding.
Contact support if the most recent payout row shows a failed or returned status, or if, on the daily schedule, there is no payout row for **3 or more working days** on which you had card sales (for weekly or monthly schedules, when a scheduled payout is more than 2 working days overdue). Include your store name and the sales dates you have not been paid for, so we can trace the transfer with the payment provider. See [Contact Support](/docs/getting-started/contact-support).
## Related
* [Reports Overview](/docs/guides/reports/overview) — Full list of available reports
* [All Transactions Report](/docs/guides/reports/transactions-report) — View individual transaction details
* [Software & Subscription Invoices](/docs/guides/account/software-invoices) — Software fees collected by Direct Debit, which are not shown in these reports
* [storekit Payments Setup](/docs/guides/payments/storekit-payments-setup) — Configure your payment account
# Sales and accounting reports in storekit
Source: https://storekit.com/docs/guides/reports/overview
Track performance and make data-driven decisions with storekit reporting. Sales reports, payout reconciliation, transactions, and pre-order demand analytics.
storekit provides a comprehensive reporting suite to help you understand your business performance, track revenue, and reconcile payouts. Reports are split across two main sections in your dashboard.
The tiles on the dashboard home page are built from reporting snapshots, not from the live order feed. Snapshots refresh on a schedule and can be up to an hour behind, so an order that arrived a few minutes ago will not be counted yet. The **Updated** caption next to the tiles shows how long ago the oldest figure on the strip was taken; if a number looks behind, that caption is why — refreshing the page or switching browsers will not bring newer figures until the next snapshot. For a real-time view of today's orders, use **Orders** → **Live Orders**, which updates the moment an order arrives — see [Managing Live Orders](/docs/guides/orders/managing-live-orders).
## Report Sections
| Section | Location | Purpose |
| ---------------------- | ------------------------------- | -------------------------------------------------------------------------------------------- |
| **Sales Reports** | Sidebar: Analytics > Reports | Operational reporting — revenue, popular products, order trends |
| **Accounting Reports** | Sidebar: Analytics > Accounting | Financial reporting — fees, transactions, payout reconciliation (requires storekit Payments) |
## How VAT and tax are treated in reports
Every money figure in storekit's reports is shown **as your customers paid it** — that is, **VAT-inclusive** (gross of tax). Reports total the amounts actually charged to the card or taken as cash; they never split out, subtract, or total VAT.
**Net Revenue** in the [Daily Summary](/docs/guides/reports/fee-report) means **Gross Revenue minus payment-processing fees only** — it is **not** net of VAT. The **Net amount** column in the [All Transactions report](/docs/guides/reports/transactions-report) works the same way (gross minus fee). Throughout the reports "Net" means *after fees*, never *after tax*.
**There is no report that shows turnover net of VAT/tax.** No report in the dashboard breaks out or subtracts VAT — not the Sales Reports, the **Daily Summary**, **All Transactions**, the **End of day** report, or the **Fee Statements** report. If you need a figure net of VAT you have two options:
* **Export the CSV and apply your own VAT rate** — click **Export** on any report, then calculate VAT from the gross figures using your own rate(s) in a spreadsheet or your accounting software.
* **Use the per-order VAT receipts** — the one place storekit breaks out VAT is the [VAT invoice for an individual order](/docs/guides/orders/vat-invoices), which shows a VAT total line for that **single order only**. There is no aggregate VAT total across orders anywhere in the reports.
The **Fee Statements** report (a downloadable PDF fee breakdown) is not enabled for most accounts, and even where it is available it covers payment-processing fees, not VAT — see [Software & Subscription Invoices](/docs/guides/account/software-invoices).
## Filtering and Exporting
All reports support:
* **Store filtering** — View data for a specific store or across all stores
* **Date range selection** — Narrow results to a custom period
* **CSV export** — Download report data by clicking **Export** for use in spreadsheets or accounting software
## Available Reports
Analyse revenue, popular products, and order trends
View fees, daily revenue summaries, and match sales to payouts
View every payment processed through your stores
Track and review all refunded orders
Analyse product demand from pre-orders
## Related
* [Refunds & Payouts](/docs/guides/payments/refunds-payouts) — Issue full or partial refunds
* [storekit Payments Setup](/docs/guides/payments/storekit-payments-setup) — Configure your payment account
# Pre-Orders Product Report
Source: https://storekit.com/docs/guides/reports/pre-orders-report
Analyse storekit pre-order demand by product to plan inventory, prep schedules, and staffing for upcoming dates. Spot trends before they hit the kitchen.
The Pre-Orders Product Report provides a breakdown of products ordered through pre-orders, giving you advance visibility into demand for upcoming dates.
## Accessing the Report
In the sidebar, click **Analytics** to expand the section, then select **Reports**. The pre-orders product data is available within the sales reporting section. Select a date range to view upcoming pre-order volumes.
## What the Report Shows
The report breaks down pre-order data by product, showing:
| Field | Description |
| -------------- | ----------------------------------------------- |
| **Product** | The menu item ordered |
| **Quantity** | Number of units ordered for the selected period |
| **Order Date** | The date the pre-order is scheduled for |
## How to Use This Report
### Inventory Planning
Review pre-order volumes for upcoming dates to ensure you have sufficient stock. This is particularly valuable for:
* **Perishable ingredients** — Order the right quantities based on confirmed demand
* **Limited-availability items** — Track how quickly special items are being reserved
### Staffing Decisions
Use pre-order volume as an indicator of expected demand. High pre-order counts for a given date may warrant additional staff for preparation and fulfilment.
### Identifying Popular Items
Track which products are most frequently pre-ordered to inform menu decisions, promotional planning, and featured item placement.
This report is especially useful for catering operations and high-volume venues where advance preparation is critical to service quality.
## Related
* [Orders Overview](/docs/guides/orders/overview) — Learn about order types and fulfillment
* [Reports Overview](/docs/guides/reports/overview) — Full list of available reports
* [Sales Reports](/docs/guides/reports/sales-reports) — Broader sales and revenue analysis
# Refunded Orders Report
Source: https://storekit.com/docs/guides/reports/refunded-orders-report
Track and review every refunded order in storekit. Spot patterns, identify root causes of refund rates, and take action to reduce future refunds across stores.
The Refunded Orders report gives you a consolidated view of every order that has been fully or partially refunded, helping you identify patterns and reduce future refund rates.
## Accessing the Report
In the sidebar, click **Analytics** to expand the section, then select **Reports**. Locate the **Refunded Orders** section. Select a store and date range to filter results.
## What the Report Shows
Each refunded order entry includes:
| Field | Description |
| --------------- | ------------------------------------------ |
| **Order ID** | Unique identifier for the order |
| **Date** | When the order was originally placed |
| **Amount** | Total refund value |
| **Refund Type** | Full or partial refund |
| **Reason** | Reason provided when the refund was issued |
## Using Refund Data
Review your refund data regularly to:
* **Identify patterns** — Spot recurring reasons for refunds (e.g. specific menu items, delivery issues, preparation errors)
* **Track partial vs full refunds** — Understand whether issues are resolved with partial compensation or require full refunds
* **Reduce future refunds** — Address root causes by updating menu descriptions, adjusting preparation processes, or retraining staff
* **Monitor refund volume** — Keep refund rates within acceptable thresholds for your business
## Exporting Data
Click **Export** to download the refunded orders data as a CSV file.
## Related
* [Refunds & Payouts](/docs/guides/payments/refunds-payouts) — How to issue full or partial refunds
* [Reports Overview](/docs/guides/reports/overview) — Full list of available reports
* [Sales Reports](/docs/guides/reports/sales-reports) — Broader sales and revenue analysis
# Sales reports: revenue, products, and order trends
Source: https://storekit.com/docs/guides/reports/sales-reports
Analyse storekit sales data including revenue breakdowns, popular products, average order value, and trends across stores, time periods, and fulfillment types.
Sales reports give you a detailed view of your store's operational performance, including revenue breakdowns, product popularity, and order trends.
## Accessing Sales Reports
In the sidebar, click **Analytics** to expand the section, then select **Reports**. Select a store and date range to view your data.
## Report Types
Sales reports can be generated in two modes:
| Type | Day Boundary | Pre-order Recording |
| ----------------- | -------------------- | ------------------------------------------------------- |
| **Transactional** | Day ends at midnight | Pre-orders recorded on the date payment is taken |
| **Operational** | Day ends at 5:00 AM | Pre-orders recorded on the date the order is placed for |
Choose **Operational** if your business operates late at night and you want early-morning orders grouped with the previous day's trading. Choose **Transactional** for standard calendar-day reporting.
## Available Data
Sales reports include the following breakdowns:
### Revenue
* **Revenue by area** — Sales split by ordering channel (e.g. Order and Pay, delivery)
* **Average order value** — Mean spend per order across the selected period
* **Delivery revenue** — Revenue from takeaway and delivery orders
### Order Trends
* **Orders by time of day** — Identify your peak trading hours
* **Orders by day of week** — See which days drive the most volume
### Products
* **Most popular products** — Top-selling items ranked by quantity
* **Most popular categories** — Best-performing menu categories
The per-item Products breakdown shows **gross sales only**. Net sales (gross minus payment and platform fees) are not available at the item level. Net revenue is only reported as a daily total in the [Daily Summary](/docs/guides/reports/fee-report). In every report "Net" means net of fees, **not** net of VAT/tax — see [How VAT and tax are treated in reports](/docs/guides/reports/overview#how-vat-and-tax-are-treated-in-reports).
### Additional Metrics
| Metric | Description |
| ---------------------- | --------------------------------------------- |
| **Tips by day** | Daily tip totals collected through your store |
| **Discount summaries** | Breakdown of discounts applied across orders |
| **Refunded orders** | Orders that were fully or partially refunded |
| **Failed orders** | Orders that failed to complete |
## Exporting Data
Click **Export** to download your sales report data as a CSV file.
## Related
* [Reports Overview](/docs/guides/reports/overview) — Full list of available reports
* [Fee Report & Daily Summary](/docs/guides/reports/fee-report) — View fees and reconcile payouts
* [Refunded Orders Report](/docs/guides/reports/refunded-orders-report) — Detailed view of all refunds
# All Transactions Report
Source: https://storekit.com/docs/guides/reports/transactions-report
View every payment processed through your storekit store, including successful charges, declined attempts with their failure reason, and refunds.
The All Transactions report provides a detailed log of every individual payment processed through your stores, including successful charges, failed payments, and refunds.
## Accessing the Report
In the sidebar, click **Analytics** to expand the section, then select **Accounting**. On the Accounting page, click **All Transactions** under the Transactions heading.
Choose the payment account, store(s), and date range you want to review.
## What the Report Shows
Each row represents a single transaction, under these columns:
| Column | Description |
| ---------------- | ------------------------------------------------------------------------------------ |
| **Date** | When the transaction was processed |
| **Kind** | The type of transaction, for example a sale or a refund |
| **Details** | The card brand and last four digits used |
| **Status** | **Success** or **Failed**, with the failure reason shown next to a failed status |
| **Gross amount** | Transaction value as the customer paid it (VAT-inclusive) |
| **Net amount** | Gross amount minus the fee — net of the processing fee, **not** net of VAT |
| **Fee** | Fee charged for the transaction (blank for failed transactions) |
| **Gratuity** | Tip included in the transaction |
| **ID** | The payment provider's reference for the transaction |
| **Reference** | **View** link through to the associated order or bill (successful transactions only) |
Use the **Status** filter above the table to narrow the list. It has exactly two options, **Success** and **Failed**; refunds are not a status — they appear as their own **Kind** of transaction.
Use this report to check per-transaction fee amounts and verify that individual charges match your expected fee rates.
The **Net amount** column is the transaction's gross amount minus the fee — net of the processing fee, **not** net of VAT/tax. All amounts here are shown as the customer paid them (VAT-inclusive), and no report totals VAT — see [How VAT and tax are treated in reports](/docs/guides/reports/overview#how-vat-and-tax-are-treated-in-reports).
## Order and Payment Identifiers
An order carries several different identifiers, and the **ID** column above is not the one Google Analytics reports. Use this table to work out which value you are holding.
| Identifier | Example | Where it appears in the dashboard | Where it appears in exports | What it is for |
| ----------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Order id | `KhDx6jUFP` | The end of the order page URL (`/orders/KhDx6jUFP`); the **View** link in the **Reference** column opens that page | **Order id** column of the **Orders** → **All Orders** → **Export** CSV, and the **Reference ID** column of this report's CSV | The order's unique identifier. This is the value storekit sends to Google Analytics as the purchase event's `transaction_id` |
| Order code | `A7X2` | Shown as `#A7X2` in the **Order** column of **Orders** → **All Orders** and on the order page, and printed on tickets and customer receipts | **Order Code** column of the Orders export | A short reference for calling out and handing over orders. The **All Orders** search box matches this value only — its placeholder is **Search by order code** |
| Payment reference | Provider reference, e.g. an Adyen PSP reference | The **ID** column of this report, and **Tracking ID** in the payment details on the order page | Not included in either CSV | Looking the payment up with the payment provider, for example for a chargeback |
Searching **All Orders** for a transaction ID from Google Analytics returns nothing — the search box matches order codes, while Google Analytics reports the order id. Open the order directly at `/orders/`, or export the orders and match on the **Order id** column: see [Reconciling with Google Analytics](/docs/guides/integrations/marketing/google-tag-manager#reconciling-with-google-analytics).
## Investigating Failed Payments
When a payment fails, the reason from the card issuer is shown next to the **Failed** status (for example insufficient funds, card declined, authentication failure). Use this information to identify recurring issues and advise customers if needed.
A failed attempt followed by a successful one for the same amount is normal — see [declined on the bank statement but paid in storekit](/docs/guides/pay-at-table/checking-payments#declined-on-the-bank-statement-but-paid-in-storekit).
## Exporting Data
Click **Export** to download the full transaction list as a CSV file for use in spreadsheets or accounting software.
The CSV has a **Reference ID** column holding the order id of the order that was paid (for Pay at Table payments it holds the bill id instead). It does not include the payment provider's reference from the on-screen **ID** column.
## Related
* [Reports Overview](/docs/guides/reports/overview) — Full list of available reports
* [Fee Report & Daily Summary](/docs/guides/reports/fee-report) — Reconcile daily revenue with payouts
* [Refunded Orders Report](/docs/guides/reports/refunded-orders-report) — View all refunded orders
* [Google Tag Manager](/docs/guides/integrations/marketing/google-tag-manager#reconciling-with-google-analytics) — Match Google Analytics transactions to storekit orders
# Visitor Metrics Explained
Source: https://storekit.com/docs/guides/reports/visitor-metrics
Exact definitions of the Guest activity metrics in storekit: Guests, Sessions, Sessions with Order, Conversion Rate and every Conversion Funnel step.
The **Guest activity** page reports on browsing behaviour on your store. Every number on it comes from one of two things: a **session** (a visit) or an **anonymous ID** (a browser). Knowing which one a tile counts explains almost every question merchants ask about these figures.
## Where to find it
In the sidebar, click **Analytics**, then select **Marketing**. The page is titled **Guest activity** and is marked **Beta**.
Use the store selector to pick a single store, or leave it on **All stores**. The period selector at the top right sets the date range for every tile and chart on the page; the default is **Last 30 days**.
Every metric on this page is filtered by **when the session started**, not by when each individual click happened. A visit that starts at 23:50 and ends at 00:10 belongs entirely to the first day.
## The two things storekit counts
| Term | What it is |
| ------------ | -------------------------------------------------------------------------------------------------------------------------- |
| Anonymous ID | An identifier storekit stores in the browser of anyone who opens your store. One browser on one device = one anonymous ID. |
| Session | One visit: a run of activity from the same anonymous ID with no gap of more than 30 minutes. |
A session ends and a new one begins when any of the following happens:
* More than **30 minutes** pass between two actions by the same browser
* It is the first activity ever recorded for that browser
* The browser moves to a different store
* The browser moves to a different account
Nothing else splits a session — the browser being closed, the page being refreshed, or the customer walking away for ten minutes all stay within the same session.
These numbers come from browser tracking, exactly as the note on the page says: visitors using ad blockers or private browsing may not be recorded at all. Treat the page as a behavioural trend, not as an audited count, and reconcile revenue against your [Sales Reports](/docs/guides/reports/sales-reports) instead.
## Metric definitions
### Guests / Unique Guests
Shown as the **Guests** line on the **Guest Trends** chart, as **Unique Guests** on the **Traffic Sources** chart, and as the `guests` column of **Source Breakdown**.
* **Counts:** the number of *different anonymous IDs* seen in sessions that started in the selected date range.
* **Does not mean:** the number of people, customers or accounts. One person using a phone and a laptop counts as two guests. One person clearing cookies, switching browser, or opening your store in private browsing counts again. Conversely, a shared tablet used by ten customers counts as one guest. There is no de-duplication by name, email or logged-in customer anywhere on this page.
### Total Sessions
* **Counts:** the number of *sessions* that started in the selected date range.
* **Does not mean:** the number of guests, page views or orders. One guest can produce any number of sessions.
### Sessions with Order
* **Counts:** the number of *sessions* in which at least one order was completed.
* **Does not mean:** the number of orders. A session in which someone places two orders counts once. It also does not match your order reports exactly, because orders placed by a browser whose activity was not tracked cannot be attributed to a session.
### Conversion Rate
* **Counts:** **Sessions with Order** divided by **Total Sessions**, shown as a percentage.
* **Does not mean:** the share of *people* who ordered. Because a single guest can browse several times before ordering, extra visits push this percentage down even when every one of those guests eventually orders.
### Total Order Value
* **Counts:** the value of orders completed in the sessions counted above, for the selected date range.
* **Does not mean:** your revenue for the period. Use the [Sales Reports](/docs/guides/reports/sales-reports) for revenue — untracked browsers are missing here, and the figure is attributed by session start.
## Conversion Funnel
**Every step of the Conversion Funnel is a number of sessions, never a number of people or events.** The tooltip on each bar says `sessions` for this reason. So "4 sessions made it to checkout" means: in four visits, someone reached the checkout page — possibly four different browsers, possibly the same browser four times.
The steps are, in order:
| Step | A session is counted when it… |
| ------------------- | -------------------------------------------------- |
| **Menu Loaded** | loaded the ordering menu (the `menu_loaded` event) |
| **Viewed Product** | opened a product |
| **Added to Cart** | added an item to the basket |
| **Checkout** | reached a checkout page |
| **Order Completed** | completed an order |
The funnel is cumulative, not a set of independent event counts. A session that reaches a later step is counted in every earlier step too, even if the earlier event was never recorded — a session that completes an order is included in **Menu Loaded**, **Viewed Product**, **Added to Cart** and **Checkout** as well. That is why each step is always smaller than or equal to the one above it, and why the drop percentages read as a genuine funnel.
Each step is also *not* a count of actions: a session that adds six items to the basket is counted once in **Added to Cart**.
## Why guests and sessions do not line up
This is the most common question about the page, and the answer is simply that the two tiles count different things.
If you see **16 guests** and **17 sessions**, then 16 different browsers produced 17 visits between them — one browser came back after a gap of more than 30 minutes (or switched store), and everything else visited once.
Loading your own store five times in a row does **not** produce five sessions or five guests:
* All five loads come from the same browser, so they are **one guest**.
* If they happen within 30 minutes of each other, they are also **one session** — refreshing, navigating and reopening the tab do not start a new one. Leave it more than 30 minutes and the next load starts a second session, still for the same guest.
So sessions are normally *higher* than guests, and the gap between them is a measure of how often browsers return — not an inconsistency.
**Your own visits are counted.** storekit does not exclude staff, owners or test visits from **Guest activity**, and there is no setting in the dashboard to filter them out. Your device is one guest, and each of your browsing sessions is one session — including any test orders you complete, which land in **Sessions with Order** and lift **Conversion Rate**. The only reason your own visits might be missing is the tracking limitation above: an ad blocker or private browsing window.
## Related
* [Event Tracking](/docs/privacy-security/event-tracking) — the behavioural events these metrics are built from, including `menu_loaded`
* [Reports Overview](/docs/guides/reports/overview) — revenue and accounting reporting, which is measured from orders rather than browser tracking
# Customise store design and branding in storekit
Source: https://storekit.com/docs/guides/store-settings/branding-design
Configure your storekit ordering page logo, colours, fonts, buttons, menu layout, and content so your store matches your brand's visual identity.
Design & Branding lets you customise the look, layout, and content of your storekit ordering page.
You can use it to update your store’s images, colours, typography, buttons, menu layout, page content, notices, and other customer-facing design elements.
Changes are shown in the preview as you make them, but they are **not applied to your live ordering page until you click Save**.
Most customers order from mobile devices, so we recommend checking the mobile preview before saving your changes.
## What you can customise
The Design & Branding sidebar is organised into three main sections:
| Area | What it includes |
| -------- | --------------------------------------------------- |
| Branding | Images, Typography, Buttons, Colours |
| Layout | Menu, Menu items, Basket, Header style |
| Content | Description, Notices, Order status, Custom sections |
***
## Before you start
| Area | Guidance |
| ------------------ | -------------------------------------------------------------------------------------------------------------------- |
| Access | Open your venue in the storekit admin, then select **Design & Branding** from the left navigation. |
| Recommended device | Design & Branding works best on a desktop or laptop. |
| Preview | The preview updates as you make changes, so you can review your design before saving. |
| Mobile preview | Always check mobile preview before saving, as most customers order on mobile. |
| Saving changes | Changes are only applied to your live ordering page after you click **Save**. |
| Undo / redo | Use `Ctrl + Z` to undo and `Ctrl + Y` or `Ctrl + Shift + Z` to redo. |
| Feature access | Some Design & Branding sections require **storekit+**. If a section is locked, you may need to upgrade to access it. |
If you leave the page before saving, your changes may be lost.
***
## Access to Design & Branding features
Some Design & Branding sections are only available with **storekit+**.
If a section is locked in your admin, your current plan may not include full access to Design & Branding. To unlock all Design & Branding options, you will need to upgrade to **storekit+**.
Need full access to Design & Branding? [Contact storekit Support](/docs/getting-started/contact-support) to add this feature to your account. A **storekit+** subscription is required.
***
## Branding
Branding settings control the visual identity of your ordering page.
The Branding section includes:
* Images
* Typography
* Buttons
* Colours
***
### Images
The **Images** section lets you update the main image assets used on your ordering page.
| Setting | What it controls | Where customers may see it | Recommended format |
| ------------------- | ------------------------------------------------------------ | --------------------------------------------------------------------------------- | ---------------------------------------------------------- |
| Logo | Your main brand logo | Top-left of the navigation bar with the **Classic** header style, on desktop only | Square image, 1536 x 1536 px. Transparent PNG works best. |
| Nav logo | Logo used by the **Minimal** and **Multisite** header styles | Top navigation bar, displayed 32 px tall | Any aspect ratio — it is scaled to fit, not cropped. |
| Favicon | Small browser icon | Browser tab and bookmarks | Square image, such as `32 × 32px` or `180 × 180px`. |
| Header image | Main image used in the header or hero area | Top of your ordering page | Landscape image recommended. |
| Page background | Background image behind the ordering page | Full page background | Use an image that works well behind text and menu content. |
| Pay-at-Table header | Header image used for Pay-at-Table ordering, where available | Pay-at-Table ordering flow | Landscape image recommended. |
With the **Classic** header style, **Logo** is displayed in a fixed **80 x 80 px circle**, so a non-square logo is squeezed into the square and the circular mask trims its corners and outer edges — the ends of a wide wordmark disappear. There is no crop, zoom, or reposition control here, so prepare the artwork square, centred, with padding around the mark. Upload at 1536 x 1536 px so it stays sharp on high-density screens. See [Store logo sizing and cropping](/docs/guides/store-settings/image-specifications#store-logo-sizing-and-cropping) for the full detail, including why the upload size is much larger than the displayed size.
#### Image tips
* Use high-quality images that match your brand.
* Keep logos simple and easy to recognise.
* Use square images for logos and favicons.
* Use landscape images for header images.
* Avoid placing important text near the edge of header images, as images may crop differently on mobile.
* Always check mobile preview before saving.
Header images may crop differently depending on screen size. For best results, keep the most important part of the image centred.
***
### Typography
The **Typography** section lets you adjust the text styling used across your ordering page.
You can customise the typography for different text areas, such as headings, body text, buttons, and menu text. Each typography setting controls the font used, whether the text is capitalised, and the size scale.
| Setting | What it controls | Customer-facing impact |
| -------------- | --------------------------------------------------------------- | ------------------------------------------------------------------ |
| Font | The font used for the selected text area | Changes the overall style and brand feel of the text |
| Capitalisation | Whether the selected text appears in standard case or uppercase | Can make headings, buttons, or labels feel more prominent |
| Size scale | The relative size of the selected text area | Makes the selected text smaller or larger across the ordering page |
#### Font
The font setting controls the typeface used for the selected text area.
By default, the ordering page may use the system font. You can also upload a custom font file where supported.
Custom fonts should be uploaded as a `WOFF2` font file.
#### Capitalisation
The capitalisation toggle lets you choose whether the selected text area uses standard capitalisation or uppercase styling.
This can be useful for making headings, buttons, or menu labels stand out more clearly.
Use uppercase styling carefully. Long sections of uppercase text can be harder to read, especially on mobile.
#### Size scale
The size scale lets you adjust the relative size of the selected text area.
For example, reducing the size scale makes the selected text smaller, while increasing it makes the selected text larger. This is useful if headings, product names, descriptions, or buttons look too large or too small for your store design.
#### Typography tips
* Upload a `WOFF2` font file if using a custom font.
* Choose text styles that are easy to read.
* Use capitalisation carefully, especially for longer text.
* Adjust the size scale if headings, menu items, or buttons look too large or too small.
* Check longer product names and descriptions before saving.
* Always check mobile preview before saving.
Typography changes can affect spacing and layout, especially on mobile. Always check the mobile preview before saving.
***
### Buttons
The **Buttons** section lets you customise the appearance of customer-facing buttons across your ordering page.
Buttons are used for important customer actions, such as adding items to the basket, viewing the basket, starting checkout, and placing an order.
| Setting | What it affects | Customer-facing impact |
| -------------- | -------------------------------------------------- | ---------------------------------------------------------- |
| Button style | The overall look of buttons | Changes how action buttons appear across the ordering page |
| Button shape | The button corner style, such as rounded or square | Changes the visual feel of buttons |
| Button colours | Button background and text colours | Affects how clearly customers can see and use buttons |
#### Button tips
* Use colours that stand out clearly from the page background.
* Make sure button text is easy to read.
* Check important actions such as **Add to basket**, **View basket**, and checkout buttons.
* Avoid button colours that blend into the page.
Buttons are part of the ordering journey, so make sure they remain clear and easy to tap on mobile.
***
### Colours
The **Colours** section lets you customise the colour palette of your ordering page.
Colour settings affect the general theme, backgrounds, text, accents, buttons, menu items, modifiers, and other customer-facing elements.
#### Presets
Presets let you quickly apply a predefined colour theme to your ordering page.
This can be useful if you want to start from a ready-made style, such as a minimal theme, dark mode theme, or another preset palette, before making more detailed colour changes.
After choosing a preset, you can still adjust individual colour fields manually.
#### Show contrast warnings
The **Show contrast warnings** toggle highlights text and background colour pairs that may be difficult to read.
When enabled, Design & Branding checks whether selected colour combinations meet WCAG AA contrast guidance.
Contrast warnings highlight text/background pairs that fail WCAG AA contrast: `4.5:1` for standard text and `3:1` for large text. Aim for AA or higher to ensure readability for all users.
#### Colour settings
| Setting | What it affects | Tips |
| -------------------------------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------ |
| Mobile browser and desktop nav | The colour used for the mobile browser area and desktop navigation | Use a colour that matches your brand while keeping navigation readable. |
| Page background | The main background colour of the ordering page | Use a neutral colour that allows menu content to stand out. |
| Page background darker | A darker background shade used in some page areas | Keep this close enough to the main background to feel consistent. |
| Primary backgrounds | Main background areas across the storefront | Usually works best as a clean, readable background colour. |
| Secondary backgrounds | Secondary panels or content areas | Use this to subtly separate sections without reducing readability. |
| Category scrolling nav bar background | Background colour for the category navigation bar | Make sure category names remain readable. |
| Category and item names | Text colour for category names and item names | Use strong contrast so customers can easily read menu items. |
| Category navigation and modifier group names | Text colour for category navigation and modifier group names | Keep this clear, especially on mobile. |
| Prices | Text colour for item prices | Prices should be easy to read and not too subtle. |
| Item descriptions (preview) | Text colour for shortened item descriptions | Use enough contrast so descriptions remain readable. |
| Item descriptions (full) | Text colour for full item descriptions | Check longer descriptions on mobile. |
| Accent colour | Highlight colour used across selected elements | Choose a colour that stands out clearly from the background. |
| Primary colour | Main theme colour used across the ordering page | Use your approved brand colour where possible. |
| Secondary colour | Supporting theme colour | Use this to complement the primary colour. |
| Highlight border colour | Border colour used to highlight selected or important elements | Make sure selected items are easy to identify. |
| Secondary actions colour | Colour used for secondary actions | Keep this visible, but less prominent than primary actions. |
| Overlay background | Background colour used for overlays or modal-style areas | Make sure overlay content remains readable. |
| Secondary background transparent | Transparent secondary background colour | Use carefully so text and buttons remain clear. |
| Modifier card background | Background colour for modifier option cards | Make sure modifier options are easy to scan. |
| Selected modifier card background | Background colour for selected modifier options | Selected options should be visually clear. |
| Borders and shadows | Border and shadow styling for some page elements | Use subtle styling to separate content without making the page feel cluttered. |
#### Colour tips
* Start with a preset if you want a quick theme, then adjust individual colours as needed.
* Use your brand colours where possible.
* Use exact hex codes if you have brand guidelines.
* Turn on **Show contrast warnings** while editing.
* Make sure text remains readable against the background.
* Check buttons, basket, checkout, notices, modifiers, and product descriptions.
* Preview on mobile before saving.
Poor colour contrast can make your ordering page difficult to use. Customers should be able to clearly read product names, descriptions, prices, notices, modifier options, basket totals, and checkout buttons.
***
## Layout
Layout settings control how your ordering page is arranged and how customers browse your menu, basket, and header.
The Layout section includes:
* Menu
* Menu items
* Basket
* Header style
***
### Menu
The **Menu** section lets you customise how your menu is displayed to customers.
You can choose the overall item layout, adjust how many columns are shown on desktop and mobile, control image sizing, choose the item direction, and decide how category navigation images appear.
Menu layout changes affect how customers browse your menu. Always check both desktop and mobile preview before saving.
#### Items layout
Items layout controls the overall structure used to display menu items.
| Layout | What it does |
| ---------- | ----------------------------------------------- |
| List | Displays menu items in a simple vertical list |
| 2-col list | Displays menu items in a two-column list layout |
| Cards | Displays menu items as larger card-style blocks |
| 2-col grid | Displays menu items in a two-column grid |
| 3-col grid | Displays menu items in a three-column grid |
| Compact | Displays menu items in a more condensed layout |
#### Customise menu layout
The **Customise** options let you adjust the selected layout in more detail.
| Setting | What it controls | Customer-facing impact |
| -------------------------- | --------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| Desktop columns | Number of columns shown on desktop | Controls how many menu items appear across each row on larger screens |
| Mobile columns | Number of columns shown on mobile | Controls whether menu items appear in one or more columns on mobile |
| Image size | Size of menu item images | Affects how prominent item images appear |
| Item direction | Position of text and image inside each menu item | Changes whether the image appears beside, reversed, or above the item text |
| Large images | Uses full-width images on menu items | Makes item images more prominent where supported |
| Show a currency symbol | Shows the currency symbol next to prices | Displays symbols such as `£`, `$`, or `€` beside item prices |
| Category navigation images | Controls where category images appear in navigation | Can show category images on desktop only, desktop and mobile, or hide them |
| Stories position | Controls where stories appear in the menu | `0` places stories at the top of the menu, `1` places them after the first category, and so on |
#### Item direction
Item direction controls how the image and text are arranged inside each menu item.
| Option | What it does |
| ------- | ----------------------------------------------------------- |
| Row | Shows the image and item details side by side |
| Reverse | Reverses the side-by-side layout |
| Stacked | Places the image and item details above or below each other |
#### Category navigation images
Category navigation images control whether category images are shown in the menu navigation.
| Option | What it does |
| ---------------- | ----------------------------------------------------------- |
| Desktop only | Shows category navigation images on desktop only |
| Desktop & Mobile | Shows category navigation images on both desktop and mobile |
| None | Hides category navigation images |
#### Menu tips
* Choose a layout that suits the size and style of your menu.
* Use list or compact layouts for simpler menus.
* Use card or grid layouts if your menu relies heavily on images.
* Keep mobile columns easy to browse. One column is usually clearer for longer item names or descriptions.
* Check products with long names, long descriptions, modifiers, and images before saving.
* Turn on the currency symbol if prices are unclear without it.
* If using category navigation images, make sure category images are clear and consistent.
* Preview both desktop and mobile before saving.
Layouts with multiple columns or large images can look good on desktop but feel crowded on mobile. Always check the mobile preview before saving.
Design & Branding controls how your menu is presented. Product names, prices, modifiers, images, and availability may need to be updated from the menu editor or another relevant area of the admin.
***
### Menu items
The **Menu items** section lets you customise how individual products appear on your ordering page and how item details are shown when a customer opens an item.
This includes item modal layout, modifier display, low stock display, allergen display, macro information, age gates, and how many lines of item text are shown.
Menu item settings affect how customers view products and make selections. Always check items with images, modifiers, allergens, and long descriptions before saving.
#### Item modal
The item modal is the pop-up or item detail view customers see when they select a menu item.
| Setting | What it controls | Customer-facing impact |
| ------------------ | ----------------------------------------------------- | ------------------------------------------------------------------------- |
| Modal image style | The size of the item image inside the item modal | Controls how prominently the product image appears when an item is opened |
| Modal desktop view | The layout of the item modal on desktop | Affects how the image, item details, modifiers, and actions are arranged |
| Content position | The alignment of content inside the item modal | Controls whether item content uses the default layout or appears centred |
| Modal border | Border style, colour, and width around the item modal | Adds or removes a border around the modal |
#### Modal image style
| Option | What it does |
| ------ | -------------------------------------------- |
| Medium | Shows a medium-sized image in the item modal |
| Large | Shows a larger image in the item modal |
#### Modal desktop view
| Option | What it does |
| ------------------- | ------------------------------------------------------------- |
| Default | Uses the standard item modal layout |
| Desktop wide | Uses a wider modal layout on desktop |
| Desktop large | Uses a larger modal layout on desktop |
| Desktop extra large | Uses an extra-large modal layout on desktop |
| Desktop fullscreen | Shows the modal in a fullscreen-style layout on desktop |
| Desktop info panel | Uses a layout with item information shown in a separate panel |
#### Content position
| Option | What it does |
| ------- | ----------------------------------------- |
| Default | Uses the standard item content alignment |
| Centred | Centres the item content inside the modal |
#### Modifiers style
Modifier style controls how item options and modifier groups appear when customers customise an item.
| Option | What it does |
| ------------------ | ----------------------------------------------------- |
| Default | Shows modifiers in the standard list layout |
| Cards | Shows modifier options as cards |
| Cards (image only) | Shows modifier options as image-focused cards |
| Landscape cards | Shows modifier options as wider landscape-style cards |
#### Low stock display
Low stock display controls whether customers can see remaining inventory information for items with limited stock.
| Option | What it does |
| ------------------------ | ------------------------------------------------------------------- |
| Hide | Does not show low stock or inventory information |
| Low only | Shows a low stock label when inventory is low, such as `10 or less` |
| Always display inventory | Shows the remaining inventory amount to customers |
Only use inventory display options if stock levels are actively maintained and accurate.
#### Allergen display
Allergen display controls how allergen information appears on menu items.
| Option | What it does |
| -------- | --------------------------------------------------- |
| Default | Shows allergens in the standard compact style |
| Extended | Shows allergen information in a more expanded style |
Allergen information should always be accurate and kept up to date. If you are unsure whether item allergens are correct, check the relevant menu item settings before relying on the display.
#### Macro calculator
Macro calculator controls whether nutritional macro information is shown to customers, where available.
| Option | What it does |
| -------------- | -------------------------------------------------- |
| Disabled | Does not show macro information |
| Show on mobile | Shows macro information on mobile, where supported |
#### Age gate
Age gate controls whether customers are asked to confirm their age before viewing or ordering certain items.
| Option | What it does |
| ------------ | --------------------------------------------- |
| Disabled | Does not show an age gate |
| Over 18 | Shows an `18+` age confirmation |
| Challenge 25 | Shows a `25?` style Challenge 25 confirmation |
Age gate settings should only be used where appropriate for restricted products or venue requirements.
#### Menu item name line clamp
Menu item name line clamp controls how many lines of the item name are shown before the text is shortened.
| Setting | What it controls |
| ------- | ----------------------------------------------------- |
| Lines | The maximum number of lines shown for menu item names |
For example, setting this to `1` keeps item names to one line where possible. Increasing the number allows longer item names to show more fully.
#### Item description lines
Item description lines control how many lines of the item description are shown in the menu item preview.
| Setting | What it controls |
| ------- | -------------------------------------------------- |
| Lines | The maximum number of description lines shown |
| `0` | Hides item descriptions from the menu item preview |
This can be useful if you want a cleaner menu layout or if descriptions are very long.
#### Menu item tips
* Check products with long names.
* Check products with long descriptions.
* Review items with modifiers or options.
* Check items with product images.
* Check allergen display where allergen information is used.
* Use low stock display only if inventory is accurate.
* Be careful with age gate settings and only use them where appropriate.
* Check the item modal on desktop and mobile before saving.
* Avoid layouts that make the menu feel too crowded on mobile.
Menu item settings can affect the ordering journey. Before saving, open a few sample products and check that customers can clearly read item details, select modifiers, and add items to the basket.
Design & Branding controls how menu items are displayed. Product names, prices, descriptions, images, modifiers, allergens, inventory, and availability may need to be updated from the menu editor or another relevant area of the admin.
***
### Basket
The **Basket** section lets you customise how the customer’s basket appears during the ordering journey.
Basket settings affect how customers review selected items, view prices, and continue to checkout.
The basket is an important part of checkout. Make sure customers can clearly review their items and continue to place their order.
#### Item images
Item images control whether product images are shown inside the basket.
| Option | What it does |
| ------ | -------------------------------------------------- |
| None | Hides item images in the basket |
| Small | Shows small item images beside basket items |
| Medium | Shows medium-sized item images beside basket items |
| Large | Shows larger item images beside basket items |
#### Customise item images
The **Customise** option lets you fine-tune the basket image size.
| Setting | What it controls | Customer-facing impact |
| ---------- | ------------------------------------------------ | ---------------------------------------------------------------- |
| Image size | Fine-tunes the size of item images in the basket | Controls how much visual space item images take up in the basket |
#### Prices
Price display controls how pricing appears in the basket.
| Option | What it does |
| ----------------- | ----------------------------------------------------------------------------- |
| Show all | Shows item prices and the basket total |
| Hide basket total | Hides the basket total while still showing item-level pricing where available |
| Hide all | Hides prices in the basket |
Be careful when hiding prices. Customers should clearly understand the cost of their order before checkout.
#### Auto-width checkout button
The **Auto-width checkout button** setting changes the checkout button width on mobile.
When enabled, the checkout button uses a content-sized floating button instead of a full-width button on mobile.
| Setting | What it controls | Customer-facing impact |
| -------------------------- | ------------------------------------------------------------------- | ----------------------------------------------------------- |
| Auto-width checkout button | Changes the mobile checkout button from full-width to content-sized | Affects how prominent the checkout button appears on mobile |
#### Basket tips
* Use item images if they help customers recognise products quickly.
* Hide item images if the basket feels too crowded.
* Keep prices visible unless there is a specific reason to hide them.
* Check the basket with multiple items before saving.
* Check the basket with modifiers or item options.
* Review the checkout button on mobile.
* Make sure the checkout button is easy to see and tap.
Basket changes can affect the customer’s checkout experience. Always check the basket on mobile before saving.
***
### Header style
The **Header style** section lets you customise the top section of your ordering page.
The header is one of the first things customers see when they open your ordering page, so it has a strong impact on the overall look and feel of your store.
Need access to Header style? [Contact storekit Support](/docs/getting-started/contact-support) to add this feature to your account. A **storekit+** subscription is required.
#### What you can customise
| Setting | What it affects |
| -------------------- | ----------------------------------------------------- |
| Header layout | How the top section of your ordering page is arranged |
| Logo placement | Where your logo appears in the header |
| Header image display | How your header image appears |
| Navigation style | How the top navigation appears |
#### Header tips
* Check that your logo is clearly visible.
* Use a header image that works well on both desktop and mobile.
* Keep important image content centred.
* Avoid header images with text close to the edges.
* Check how the header looks after scrolling, especially if a sticky navigation bar is used.
Header images may display differently depending on screen size. Always check mobile preview before saving.
***
## Content
Content settings control additional information shown on your ordering page.
The Content section includes:
* Description
* Notices
* Order status
* Custom sections
***
### Description
The **Description** section lets you update the venue description shown on your ordering page.
You can use the description to introduce your venue, explain your cuisine, or provide useful ordering information.
| Setting | What it affects | Customer-facing impact |
| ---------------------- | ------------------------------------------- | ---------------------------------------------------------------------- |
| Store description | Descriptive text about your venue | Helps customers understand your store, cuisine, or ordering experience |
| Description visibility | Whether or how the description is displayed | Affects how much information customers see on the page |
#### Description tips
* Keep the description clear and concise.
* Use customer-friendly wording.
* Avoid long paragraphs.
* Do not include information that may quickly become outdated unless you plan to maintain it.
* Check how the description appears on mobile.
#### Example uses
You can use the description for:
* A short venue introduction
* Cuisine type
* Ordering instructions
* Brand messaging
* Useful service information
***
### Notices
The **Notices** section lets you add customer-facing messages to your ordering page.
Notices can be used for important updates, service information, or messages customers should see before ordering.
#### Menu notice
The **Menu notice** is shown at the bottom of your menu.
It is typically used for information such as allergen, calorie, or service charge notices.
| Setting | What it affects | Customer-facing impact |
| --------------- | --------------------------------------- | ---------------------------------------------------------------------- |
| Menu notice | Message shown at the bottom of the menu | Helps customers see important menu-related information before ordering |
| Formatting | Bold, italic, underline, and hyperlinks | Lets you format important text and add useful links |
| Character limit | Maximum notice length | Menu notices support up to `500` characters |
#### Closed message
The **Closed message** is displayed when your store is closed or snoozed.
This lets you customise the message customers see when ordering is not currently available.
| Setting | What it affects | Customer-facing impact |
| ---------------- | ------------------------------------------------- | ----------------------------------------------------------------------- |
| Closed message | Message shown when the store is closed or snoozed | Explains why ordering is unavailable or when customers should try again |
| Formatting | Bold, italic, underline, and hyperlinks | Lets you format the message and add useful links |
| Character limit | Maximum message length | Closed messages support up to `500` characters |
| Reset to default | Restores the default closed message | Useful if you want to revert to the standard storekit message |
#### Formatting and links
Both notices support basic formatting options:
* Bold
* Italic
* Underline
* Hyperlinks
Hyperlinks can be useful for linking to extra information, such as allergen guidance, terms, or another customer-facing page.
Make sure any links you add are correct and customer-facing before saving.
#### Notice tips
* Keep notices short and clear.
* Use the menu notice for information related to the menu, such as allergens, calories, or service charges.
* Use the closed message to explain why ordering is unavailable or when customers should try again.
* Remove or update temporary notices when they are no longer relevant.
* Check that notices do not conflict with your opening hours, menu, or service settings.
* Preview notices on mobile before saving.
Avoid adding notices that are outdated, unclear, or likely to conflict with other store settings.
***
### Order status
The **Order status** section lets you customise whether a map is shown on the customer’s order status page.
This can help customers understand location or delivery-related information after placing an order.
#### Map visibility
Map visibility controls whether the map is shown or hidden on the order status page.
| Option | What it does |
| ------- | ---------------------------------------- |
| Visible | Shows the map on the order status page |
| Hidden | Hides the map from the order status page |
#### Map
The map settings let you customise how the map appears.
| Setting | What it controls | Customer-facing impact |
| ---------- | --------------------------- | ----------------------------------------------- |
| Map style | The visual style of the map | Changes how the map appears to customers |
| Pin marker | The marker shown on the map | Helps indicate the relevant location on the map |
#### Order status tips
* Use **Visible** if the map helps customers understand location or delivery information.
* Use **Hidden** if the map is not needed for your ordering flow.
* Check the order status page after saving, where possible.
* Make sure any map marker or location shown is accurate.
The map may only appear where it is supported by the order status page and your store setup.
***
### Custom sections
The **Custom sections** area lets you add extra content blocks to your ordering page.
Custom sections can be used to highlight promotions, add visual content, share venue information, or include additional customer-facing messages that do not fit into the standard description or notices.
Custom sections need to be enabled by storekit Support. [Contact storekit Support](/docs/getting-started/contact-support) to add this feature to your account.
#### Add a section
You can choose from several section templates:
| Section type | What it is used for |
| -------------- | ---------------------------------------------------------------------------------- |
| Blank | Adds an empty section that you can customise from scratch |
| Hero | Adds a large visual section with a background image and headline text |
| Call to action | Adds a section designed to encourage customers to take an action, such as ordering |
| Info card | Adds a simple information block, such as opening hours or service details |
| Announcement | Adds a highlighted message block, such as a promotion or important update |
| About us | Adds a visual section for sharing your venue story or brand message |
***
#### Editing custom sections
After adding a section, you can edit the content and design from the custom section editor.
Available controls may include:
| Control | What it affects |
| ----------------- | ------------------------------------------------------------------------------------------ |
| Background colour | Sets the section background colour |
| Background image | Adds or changes the section image |
| Image position | Controls how the background image is positioned, such as top, centre, or bottom |
| Padding | Adjusts spacing inside the section |
| Overlay | Adds a colour overlay on top of the image |
| Border | Adds or adjusts the section border |
| Margin | Adjusts spacing above or below the section |
| Text formatting | Lets you format text using bold, italic, underline, headings, alignment, colour, and links |
| Text size | Adjusts the size of selected text |
| Links | Lets you add hyperlinks to section text |
Custom sections support hyperlinks. Make sure any links you add are correct and customer-facing before saving.
***
#### Hero
The **Hero** section adds a large visual banner to the ordering page.
It is useful for introducing your venue, showing a strong brand image, or highlighting a key message near the menu.
Common uses include:
* Welcome messages
* Brand introductions
* Seasonal campaigns
* Featured imagery
* High-impact visual content
#### Hero tips
* Use a high-quality landscape image.
* Keep important image content centred.
* Use short, clear headline text.
* Check that text remains readable over the image.
* Use an overlay if the background image makes the text hard to read.
* Check both desktop and mobile preview before saving.
Hero images may crop differently depending on screen size. Avoid placing important text, logos, or faces near the edges of the image.
***
#### Call to action
The **Call to action** section is designed to encourage customers to take a specific action.
It usually includes a short message and a link or button-style prompt, such as ordering now or viewing a menu.
Common uses include:
* Encouraging customers to order
* Promoting delivery or collection
* Linking to a specific page
* Highlighting a campaign
* Directing customers to another service
#### Call to action tips
* Keep the message short and direct.
* Make the action clear.
* Use a link if customers need to go somewhere else.
* Check that the call-to-action text is easy to read.
* Make sure the section looks good on mobile.
***
#### Info card
The **Info card** section is useful for simple informational content.
It can be used to show details customers may need before ordering.
Common uses include:
* Opening hours
* Delivery information
* Collection instructions
* Service availability
* Location notes
* Contact information
#### Info card tips
* Keep the information concise.
* Avoid adding too much text.
* Make sure the details match your store settings.
* Update the card if the information changes.
* Check the mobile preview before saving.
***
#### Announcement
The **Announcement** section adds a highlighted message to the ordering page.
It is useful for promotions, temporary updates, or important messages that should stand out.
Common uses include:
* Limited-time offers
* Free delivery promotions
* Service updates
* Holiday messages
* Temporary changes
* Important reminders
#### Announcement tips
* Keep announcements short.
* Remove or update temporary announcements when they are no longer relevant.
* Make sure promotional details are accurate.
* Check that the announcement does not conflict with notices, menu settings, or service settings.
* Use readable colours with strong contrast.
Avoid leaving temporary announcements live after they are no longer relevant.
***
#### About us
The **About us** section lets you share more about your venue, brand, food, or story.
It is useful for adding personality to your ordering page and helping customers understand what makes your venue unique.
Common uses include:
* Venue story
* Brand message
* Food philosophy
* Local sourcing information
* Community message
* Restaurant background
#### About us tips
* Keep the copy customer-friendly.
* Avoid long paragraphs.
* Use a strong image that reflects your venue.
* Make sure the text remains readable over the background.
* Check the section on mobile before saving.
***
#### Custom section tips
* Use custom sections to support the ordering experience, not distract from it.
* Keep content short and relevant.
* Avoid adding too many sections.
* Use high-quality images.
* Check text contrast over images.
* Make sure hyperlinks work before saving.
* Review the full ordering page on mobile before saving.
Too many custom sections can make the ordering page feel cluttered. Keep the page focused on helping customers browse the menu and place an order.
***
## Best practices
### Start with presets, then customise
For colours, start with a preset if you want a quick theme, then adjust individual colour fields manually.
Turn on **Show contrast warnings** while editing so you can check whether text and background colour combinations are easy to read.
### Check interactive elements
Before saving, check important customer actions such as:
* Add to basket
* Modifier selection
* Selected modifier cards
* View basket
* Checkout
* Order status page
* Custom section links
### Check restricted or sensitive content
If you use age gates, allergen display, low stock display, or macro information, make sure the information is accurate before saving.
Pay close attention to:
* Allergen labels
* Inventory levels
* Age-gated items
* Nutritional or macro information
* Price visibility in the basket
### Keep custom sections focused
Custom sections should support the ordering experience.
Use them for useful customer-facing information such as:
* Promotions
* Opening hours
* Delivery or collection information
* Venue story
* Allergen or service information
* Calls to action
Avoid adding too many sections, as this can make the menu harder to browse.
### Check mobile preview
Most customers order from mobile devices, so always check mobile preview before saving.
Pay close attention to:
* Header image cropping
* Logo visibility
* Menu layout
* Menu item cards
* Item modals
* Modifier selection
* Basket visibility
* Checkout button layout
* Button readability
* Notices
* Custom sections
* Order status map, where used
### Use clear images
For best results:
* Use square images for logos and favicons.
* Use landscape images for headers.
* Keep important image content centred.
* Avoid text-heavy images.
* Avoid uploading images that are blurry or low quality.
### Keep text concise
Long text can make your ordering page harder to use, especially on mobile.
Try to keep the following short and clear:
* Store descriptions
* Notices
* Custom sections
* Product descriptions
### Prioritise readability
When choosing fonts and colours, make sure customers can easily read:
* Product names
* Product descriptions
* Prices
* Notices
* Basket totals
* Checkout buttons
### Keep the ordering journey clear
Design changes should make ordering easier, not harder.
Before saving, check that customers can easily:
* Browse the menu
* Understand product options
* Add items to the basket
* View their basket
* Continue to checkout
* Place an order
***
## Troubleshooting
### A section is locked or unavailable
Some Design & Branding sections are only available with **storekit+**.
If a section is locked in your admin, [contact storekit Support](/docs/getting-started/contact-support) to add this feature to your account. A **storekit+** subscription is required.
### My text is hard to read over an image
If text is difficult to read over a header image, hero section, or custom section image, try:
* Using a darker or lighter overlay
* Changing the text colour
* Choosing a simpler image
* Keeping important text away from busy areas of the image
* Checking the section on mobile
### My menu looks crowded on mobile
If the menu feels too crowded, check:
* Mobile columns
* Image size
* Item direction
* Large images
* Item description lines
* Menu item name line clamp
* Category navigation images
Using fewer columns, smaller images, or shorter description previews can make the menu easier to browse.
### My item modal looks too large or difficult to use
Check:
* Modal image style
* Modal desktop view
* Content position
* Modifier style
* Modal border
* Item image size
* Mobile preview
Open a few products with modifiers before saving.
### Modifier options are hard to understand
Check the selected modifier style.
If modifier options are difficult to scan, try a simpler layout or make sure modifier names and images are clear.
### Low stock or inventory information looks wrong
Low stock and inventory display should only be used if inventory levels are accurate and actively maintained.
If the numbers look wrong, check the item inventory settings before changing the display style.
### Allergen information is missing or unclear
The allergen display controls how allergen information appears, but the allergen details themselves may need to be managed in the relevant menu item settings.
Check that allergen information is accurate before relying on the display.
### The basket does not show prices as expected
Check the **Prices** setting in the Basket section.
Basket prices can be set to:
* Show all
* Hide basket total
* Hide all
Be careful when hiding prices, as customers should clearly understand their order cost before checkout.
### My custom section link does not work
Check that the hyperlink is correct and customer-facing.
Make sure the link includes the full URL where needed, then save and test it on the live ordering page.
### The order status map is not showing
Check:
* Map visibility is set to **Visible**
* The order status page supports the map for your store setup
* The map marker or location has been configured correctly
### My changes appear in preview but not on the live ordering page
Make sure you clicked **Save**. The preview updates as you make changes, but your live ordering page will not update until the changes are saved.
After saving, refresh your live ordering page and check that you are viewing the correct store.
### My image looks cropped
Some images, especially header images, automatically crop to fit different screen sizes.
Check the mobile preview and use an image where the most important content is centred.
Avoid placing important text, logos, or faces near the edge of header images, as they may be cropped on smaller screens.
### My logo or favicon looks distorted
Use a square image for logos and favicons.
Transparent PNG files usually work best for logos.
With the **Classic** header style, **Logo** is squeezed into a fixed 80 x 80 px circle on desktop, so a wide or tall logo looks compressed and has its edges trimmed. Re-upload a square version, or switch **Layout** → **Header style** to **Minimal** or **Multisite**, which display the **Nav logo** scaled to fit at 32 px tall. See [Store logo sizing and cropping](/docs/guides/store-settings/image-specifications#store-logo-sizing-and-cropping).
### My colours are hard to read
Check the contrast between your text, background, and buttons.
Customers should be able to clearly read:
* Product names
* Product descriptions
* Prices
* Notices
* Basket totals
* Checkout buttons
### My buttons do not stand out
Button colours should be clearly visible against the page background.
Check important customer actions such as:
* Add to basket
* View basket
* Checkout
* Place order
### The mobile version does not look right
Switch to mobile preview and check:
* Header image cropping
* Logo visibility
* Menu category navigation
* Product card layout
* Basket visibility
* Button readability
* Notices and custom sections
### My notice is no longer relevant
If a notice was added for a temporary update, remember to remove or update it once it no longer applies.
Examples include:
* Holiday opening updates
* Delivery delay notices
* Temporary closure notices
* Collection-only notices
* Kitchen issue notices
### My page feels too cluttered
Too much content can make the ordering page harder to use.
Check whether you can shorten or remove:
* Long descriptions
* Multiple notices
* Too many custom sections
* Text-heavy images
* Repeated information
***
## When to contact storekit Support
Contact storekit Support if:
* A setting does not save.
* The live page does not update after saving.
* A Design & Branding section is locked and you want to enable it.
* You want to add a feature that requires **storekit+**.
* You cannot find the design option you need.
* An image or colour is not displaying correctly.
* Text or buttons remain difficult to read after editing.
* Your ordering page looks broken after making changes.
* A custom section does not display as expected.
* A hyperlink in a notice or custom section does not work.
* The order status map does not appear as expected.
* You need help customising a design element that is not available in Design & Branding.
# Custom Privacy Policy & Terms
Source: https://storekit.com/docs/guides/store-settings/custom-policies
Replace the default storekit privacy policy and terms with your own custom content. Add legal pages written in your dashboard that match your business needs.
By default, your store displays a standard privacy policy. You can replace it — and add custom terms & conditions — with your own content written in the dashboard.
## Available Policies
| Policy | Shown at | Default |
| ---------------------- | ---------- | ----------------------- |
| **Privacy Policy** | `/privacy` | Standard privacy policy |
| **Terms & Conditions** | `/terms` | Placeholder message |
## How Policies Inherit
You can set custom policies at three levels. A more specific level always takes priority:
1. **Account** — applies to all your stores by default
2. **Brand** — overrides the account policy for all stores under that brand
3. **Venue** — overrides everything for that specific store
For example, you could set a privacy policy on your account that covers most stores, then override it for a specific brand or individual store that needs different wording.
If no custom policy is set at any level, your customers will see the default content.
## Setting Up Custom Policies
1. Go to **Settings** → **Customisation** → **Custom Policies**
2. Click **Create Policy**
3. Choose the **Policy Type** — **Privacy Policy** or **Terms & Conditions**
4. Choose the scope — **Account**, **Brand** (then **Select brand**), or **Venue** (then **Select venue**)
5. Write the wording in **Policy Content**
6. Set **Status** to **Active** and click **Create Policy**
The content will appear immediately on your store.
## Footer Links
When custom policies are enabled, links to the privacy policy and terms & conditions pages are automatically shown in your store's footer.
Review your custom policies regularly to ensure they stay up to date with current regulations and your business practices.
# Image Specifications
Source: https://storekit.com/docs/guides/store-settings/image-specifications
Recommended image sizes, aspect ratios, and file formats for storekit logos, product photos, and category images, plus upload tips.
High-quality images improve your store's appearance and increase conversion rates. All images uploaded to storekit are automatically optimised and served via CDN for fast loading.
## Image Specifications
| Image Type | Recommended Size | Max File Size |
| ------------------- | ---------------- | ------------- |
| **Store logo** | 1536 x 1536 px | 100 MB |
| **Store banner** | 2400 x 800 px | 100 MB |
| **Product images** | 1200 x 1200 px | 100 MB |
| **Category images** | 1500 x 500 px | 100 MB |
These sizes ensure sharp rendering on high-density (Retina) displays up to 3x.
All images are automatically optimised and resized for different screen sizes via CDN delivery.
The sizes above are **upload** sizes, not the size the image is displayed at. Your store logo is uploaded large (1536 x 1536 px) and displayed small — see [Store logo sizing and cropping](#store-logo-sizing-and-cropping) below.
## Store logo sizing and cropping
Upload your store logo as a **square** image, **1536 x 1536 px**. When you create a store, the **Logo** field advises "upload a square image at the highest resolution you have available and at least 160x160 pixels" — 160 x 160 px is a floor, not a target, and the storefront requests versions up to 320 px wide, so anything under 320 px will look soft.
Upload it in **Stores** → your store → **Settings** → **Design & Branding** → **Images** → **Brand** → **Logo**.
### How the logo is displayed
The display size depends on the header style set in **Stores** → your store → **Settings** → **Design & Branding** → **Layout** → **Header style** (**Classic**, **Minimal**, or **Multisite** — this list is fixed):
| Header style | Which image is used | Displayed as |
| --------------------- | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| **Classic** (default) | **Logo** | An **80 x 80 px circle** in the top-left of the navigation bar, on desktop only |
| **Minimal** | **Nav logo** | 32 px tall, width scales with your artwork — no circle, no fixed width |
| **Multisite** | **Nav logo** | 32 px tall, width scales with your artwork; on mobile the width is capped at 180 px, so a very wide logo renders shorter than 32 px |
Some stores show the compact **Nav logo** header even when **Header style** is **Classic**: Pay-at-Table stores and kiosks always use it, and it can also be enabled for a store as part of a gradual rollout. If your store shows a compact bar with the **Nav logo** rather than the circular logo, that is why.
Because the storefront requests versions of the logo at 1x, 2x, and 3x (up to 320 px wide) to stay sharp on Retina screens, the upload needs to be much bigger than the box it lands in. That is why the recommended upload is 1536 x 1536 px even though the **Classic** header renders it at 80 x 80 px. Anything smaller than 320 px wide will look soft on a high-density display.
A 60 x 60 px logo is too small — do not size artwork to the displayed box. It is below both the 160 x 160 px minimum and the 320 px the storefront requests for 3x displays, so it will look blurry.
### What happens to a non-square logo
On the **Classic** header, the logo is placed in a fixed 80 x 80 px square and then masked into a circle:
* A wide (landscape) logo is squeezed to fit the square, so it looks compressed, and the circular mask then trims the corners and the far left and right ends — the parts of a wordmark closest to the edges disappear.
* A tall (portrait) logo is stretched the other way, and the top and bottom are trimmed by the same circular mask.
* A square logo fills the circle correctly, but any detail in the corners of the square is still outside the circle. Keep your mark centred with padding around it.
There is no crop, zoom, or reposition control for the logo in **Design & Branding** — the upload panel only accepts a file, and the circular framing cannot be turned off, so the artwork has to be prepared square before uploading.
### Desktop and mobile differ
On the **Classic** header, the circular logo appears **only on desktop-width screens**. On mobile the Classic header shows your **Header image** and store name instead, and the **Logo** is not displayed there at all. This is why a cropped logo is usually reported as a desktop-only problem.
The **Minimal** and **Multisite** headers show the **Nav logo** at 32 px tall on both desktop and mobile, scaled to fit rather than cropped. If you have a wide, wordmark-style logo that cannot be made square, one of these header styles will display it without trimming.
It is worth preparing a square, centred version of your logo even if you use the **Minimal** or **Multisite** header style, so the **Logo** field is ready if you switch header styles later.
## Uploading Images
### Product Images
1. Open the **Dashboard** and navigate to **Menus → Menu**
2. Select the product you want to edit
3. Click the image area at the top of the product editor
4. Choose an image file from your device and confirm the upload
5. Save the product
Upload at the highest resolution possible. storekit's CDN automatically generates optimised versions for different screen sizes, so a larger source image always looks better.
### Category Header Images
1. Open the **Dashboard** and navigate to **Menus → Menu**
2. Select the category you want to update
3. Click the header image area at the top of the category editor
4. Upload an image — use a wide, short banner-style image (the image displays at full width with no height constraint, so shorter images work best)
5. Save the category
## Best Practices
* **Use high-quality photos** — Clear, well-lit images significantly increase order rates
* **Consistent aspect ratios** — Keep images consistent across products for a polished look
* **Natural lighting** — Food photos look best with soft, natural light
* **Simple backgrounds** — Avoid cluttered backgrounds that distract from the product
* **Correct orientation** — Ensure images are not rotated or upside down before uploading
For detailed guidance on capturing great food photos, see [Product Photography](/docs/guides/menu-engineering/product-photography).
## Supported Formats
storekit uses Uploadcare for image processing, which supports a wide range of image formats including PNG, JPG, GIF, WebP, HEIC, TIFF, and BMP. Images are automatically converted and optimised for delivery.
| Format | Best For |
| -------- | ------------------------------------- |
| **PNG** | Logos, graphics with transparency |
| **JPG** | Photographs, food images |
| **WebP** | Modern format with smaller file sizes |
| **GIF** | Animated product images |
| **HEIC** | Photos taken on iPhone |
## Troubleshooting
### Image Won't Upload
**Cause:** The file exceeds the 100 MB size limit, uses an unsupported format, or a browser extension is interfering.
**Fix:**
1. Check the file size — compress or resize the image if it exceeds 100 MB
2. Ensure the file is a supported image format (PNG, JPG, GIF, WebP, HEIC, TIFF, or BMP)
3. Try a different browser or disable browser extensions
4. Clear your browser cache and retry
### My Logo Is Cropped or Squashed
**Cause:** The **Classic** header style places the **Logo** in a fixed 80 x 80 px circle, so a non-square image is squeezed and its edges trimmed. There is no crop or reposition control to adjust this.
**Fix:** Re-upload a square logo with the mark centred and some padding around it (see [Store logo sizing and cropping](#store-logo-sizing-and-cropping)), or switch to the **Minimal** or **Multisite** header style in **Stores** → your store → **Settings** → **Design & Branding** → **Layout** → **Header style**, which display the **Nav logo** scaled to fit instead.
### Image Looks Blurry
**Cause:** The source image resolution is too low for the display size.
**Fix:** Upload an image that meets or exceeds the recommended resolution for that image type (see the [specifications table](#image-specifications) above). For product images, aim for at least 1200 x 1200 px to look sharp on Retina displays — higher is always better since storekit downscales automatically.
### I Use a POS Integration and Can't Change Images
**Cause:** POS-synced menus may lock product editing in the storekit Dashboard. When a POS integration manages your menu, changes made in the Dashboard can be overwritten on the next sync.
**Fix:** Update images directly in your POS system and let them sync to storekit. If your POS does not support image uploads, contact support to discuss unlocking image editing. See [POS Integration Overview](/docs/guides/integrations/pos/overview) for details on how synced menus work.
# Manager PINs
Source: https://storekit.com/docs/guides/store-settings/manager-pins
Set up manager PIN codes in storekit to gate sensitive actions like processing refunds, voiding orders, and applying overrides. Reduces fraud and staff errors.
Manager PINs add a security layer to sensitive operations. When enabled, actions like processing refunds or voiding orders require a PIN to complete.
## Setting Up Manager PINs
1. Go to **Store Settings** > **Users/Security**
2. Enable **Manager PINs**
3. Set a unique PIN for each manager
4. Click **Save**
## Actions Requiring a PIN
When Manager PINs are enabled, the following actions require PIN entry:
| Action | Description |
| ---------------------------- | ------------------------------------------------- |
| **Processing refunds** | Refunding an order fully or partially |
| **Voiding orders** | Cancelling an order after acceptance |
| **Editing completed orders** | Making changes to orders that have been fulfilled |
## How It Works
1. A staff member attempts a protected action (e.g., processing a refund)
2. A PIN prompt appears
3. A manager enters their PIN to authorise the action
4. The action is logged with the authorising manager's details
## Security Benefits
* **Prevent unauthorised refunds** — Only managers with PINs can process refunds
* **Accountability** — Each action is tied to a specific manager
* **Audit trail** — PIN-authorised actions are logged for review
Each manager should have a unique PIN. This ensures the audit trail accurately reflects who authorised each action.
For managing user roles and permissions, see [Users](/docs/guides/account/users).
# Managing Multiple Stores
Source: https://storekit.com/docs/guides/store-settings/multiple-stores
Create and manage additional stores under one storekit account. Each store has its own menu, hours, settings, and payouts — built for multi-location.
You can run multiple stores from a single storekit account. Each store has its own menu, settings, opening hours, and payment configuration.
For details on which name appears on each store surface, see [Which Name Appears Where](/docs/guides/account/overview#which-name-appears-where).
## Adding a New Store
1. From your dashboard, click on your **store list** in the top navigation
2. Click **Create Store**
3. Configure the new store's details — name, address, currency, and timezone
4. Set up the menu, opening hours, and payment settings for the new store
## What's Independent Per Store
Each store is configured separately:
| Setting | Shared or Independent |
| ------------------ | ------------------------------------------------ |
| **Menu** | Independent — each store has its own menu |
| **Opening hours** | Independent |
| **Store settings** | Independent |
| **Payment setup** | Independent (can share the same payment account) |
| **Branding** | Independent |
| **Reports** | Filterable by store |
| **Users** | Shared — users can access multiple stores |
## Shared Payment Account
If your stores operate under the same legal entity, they can share the same payment account. This avoids setting up separate payment processing for each location.
See [storekit Payments Setup](/docs/guides/payments/storekit-payments-setup#multiple-stores) for details on connecting multiple stores to one payment account.
## Reporting Across Stores
Reports can be filtered by individual store or viewed across all stores. This gives you both per-location and aggregate performance data.
## User Access
Users on your account can be granted access to one or more stores. This lets you:
* Give managers access only to their location
* Allow owners to see all stores
* Assign different roles per store
When setting up a new store, consider duplicating settings from an existing store as a starting point, then adjusting for the new location's specific needs.
# Opening hours and ASAP availability
Source: https://storekit.com/docs/guides/store-settings/opening-hours
Configure store opening hours, split shifts for lunch and dinner, post-midnight closing, and understand how ASAP ordering interacts with opening time.
Opening hours control when customers can place orders. Properly configured hours ensure orders only come in when you're ready to fulfill them.
## Setting Opening Hours
1. Go to **Stores** → your store → **Settings** → **Opening Hours**
2. By default, stores are set to **Open 24 hours**
3. Toggle this off to set specific hours for each day
4. Configure opening and closing times for each day of the week
5. Click **Save**
To see who changed your hours and when, check the [audit log](/docs/privacy-security/audit-log) — every save on this page is recorded against the staff member who made it, under resource type `hour`. It records who and when, not the times themselves, and account owners and admins can view it.
## Adding Multiple Time Periods
If your store has split hours (e.g., closed between lunch and dinner), add multiple time periods per day:
1. Click on the day you want to configure
2. Click **Add another time period**
3. Set the start and end times for each period
**Example:** A restaurant open for lunch and dinner might set:
* 11:00 - 14:30 (lunch)
* 17:00 - 22:00 (dinner)
## Hours After Midnight
If your store operates past midnight, you need to configure the next day's hours to include the early morning period.
**Example:** Open until 2:00 AM on Saturday night:
* Friday: 17:00 - 23:59
* Saturday: 00:00 - 02:00, 17:00 - 23:59
You cannot set an end time past 23:59. For late-night hours, add a time period starting at 00:00 on the following day.
## Closed Days
To close on a weekday every week, turn on that day's **Closed** toggle on **Opening Hours**. The day's time pickers are replaced with **Closed all day**, and customers see **Closed** next to that day in your store's opening hours.
This is a weekly setting — it repeats every week. For a one-off date, use [Special Opening Hours](#special-opening-hours) instead.
## Special Opening Hours
Special Opening Hours are date-specific hours that override your weekly hours for one date — use them for a bank holiday, a private event, or an early close on a known date.
They are on the same page, below the weekly hours: go to **Stores** → your store → **Settings** → **Opening Hours** and scroll to **Special Opening Hours** ("In addition to your regular opening hours above, you can set date specific opening hours to override your default weekly opening hours"). Before you add anything, the table reads **No special hours set**.
### Adding a date override
Go to **Stores** → your store → **Settings** → **Opening Hours**.
Under **Special Opening Hours**, click **+ Add special hours**. A row is added to the table with the columns **Date**, **Open Time** and **Close Time**.
Click **Select date** and choose the date from the calendar. Each row is a **single date** (DD-MM-YYYY) — there are no date ranges, so a three-day closure needs three rows.
Set **Open Time** and **Close Time**. Both are required, and both pickers step in 15-minute intervals. To stay open until the end of the day, use 23:59.
Click **Save** in the bar at the top of the page (it shows **Unsaved changes** while you have edits; **Discard** reverts them).
On that date the row replaces your weekly hours completely: the weekday's normal periods are ignored and only the special hours apply.
### Removing a date override
Click the bin icon at the end of the row, then **Save**. The row is deleted and that date goes back to your normal weekly schedule. Delete rows once the date has passed — a stale row for a date earlier in the current week still overrides what customers see for that weekday for the rest of the week.
### Closing all day on a specific date
There is **no "closed" toggle on a special hours row**. The weekly hours have a **Closed** toggle; the dated rows do not, and both **Open Time** and **Close Time** must be filled in.
The closest equivalent is a zero-length window: set **Open Time** and **Close Time** to the same time — for example both to 00:00. No moment of that day falls inside the window, so the store is treated as closed for the whole date and no order can be placed at any point on it.
An all-day override does **not** display as **Closed** to customers. Your storefront lists hours by weekday, never by date, and it only shows **Closed** for a weekday that has no hours at all. A 00:00–00:00 override is shown as `00:00 - 00:00` against that weekday. If it matters that customers read the word "Closed" for a specific date, there is no dashboard setting for that — announce it with a banner instead (**Stores** → your store → **Settings** → **Store Notices**, see [Store Notices](/docs/guides/store-settings/store-notices)).
### Special hours and pre-orders
If you accept pre-orders, a pre-order for a date that has special hours must fall inside the special-hours window; anything outside it is rejected when the customer tries to place the order. With an all-day 00:00–00:00 override, every pre-order for that date is rejected.
The date is still offered in the customer's scheduling view. Pre-order slots come from your weekly **Pickup times** / **Delivery times** windows, which don't take special hours into account, so the customer can select a slot on a closed date and only fails at checkout — with no message explaining why. If you close a date on which you take pre-orders, also remove that day's slots ([Blocking Pre-Order Timeslots](/docs/guides/orders/advanced/block-timeslot)) so the date can't be selected in the first place.
**Also accept pre-orders outside of opening hours** (**Stores** → your store → **Settings** → **Pre-Orders**) makes your store count as open regardless of your hours. With it turned on, a dated override does not stop ordering on the day — only dated pre-orders are still checked against the special hours.
### How far ahead a row takes effect
You can save a row for any future date, and it is always applied on the date itself — your store's open/closed check reads that date's special hours before anything else.
What customers *see* is a rolling view of roughly the next seven days: the hours list is weekday-based, so a dated override only replaces the hours shown for its weekday once that date is the next occurrence of the weekday. Until then, customers keep seeing your regular hours for that weekday.
Because the display is by weekday, an override for a date in a later week starts showing against that weekday as soon as the weekday has passed in the current week — even if the date itself is weeks away. Ordering is always controlled by the actual date; this only affects the hours shown on your storefront.
## Pre-Orders Outside Opening Hours
By default, customers can only order during opening hours. To allow orders when you're closed (for future fulfillment):
1. Go to **Stores** → your store → **Settings** → **Pre-Orders**
2. Turn on **Also accept pre-orders outside of opening hours**
## How ASAP Delivery Interacts with Opening Hours
ASAP order availability is calculated from the **first available delivery or pickup slot**, not from your venue's opening time. This means customers may be able to place ASAP orders before your venue officially opens.
**Example:** Your venue opens at 5:00 PM, but your first delivery slot is set to 4:00 PM. With ASAP enabled and a 45-minute lead time, a customer could place an order as early as 3:15 PM — well before your stated opening time.
This happens because the system checks whether the next available fulfillment slot is within the configured lead time (default 45 minutes). It does not check whether the venue is currently open.
If you do not want customers to order before your venue opens, you should either:
* **Disable ASAP ordering** and require customers to choose a scheduled time slot instead
* **Set your first delivery/pickup slot to at least your opening time plus the lead time** — for example, if you open at 5:00 PM and your lead time is 45 minutes, set your first slot to 5:45 PM so the ASAP window cannot start before 5:00 PM
Note that simply setting the first slot to match your opening time is not sufficient. With a 45-minute lead time and a first slot at 5:00 PM, ASAP would still appear at 4:15 PM — before you open.
For more on ASAP configuration, see [Order Scheduling](/docs/getting-started/launch/configure-fulfillment#order-scheduling). For pre-order slot settings, see [Pre-orders](/docs/guides/orders/advanced/pre-orders).
## Temporary Closures
Which tool you use depends on **when** the closure starts:
| Situation | Use |
| -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| Closing right now (rush, staff shortage, equipment failure) | [Store snoozing](/docs/guides/menu/availability-snoozing#store-snoozing) — it starts **immediately** and runs for a duration you pick |
| A known future date (bank holiday, private event, early close next Friday) | [Special Opening Hours](#special-opening-hours) — a dated override that leaves your weekly schedule intact |
| A permanent change to a weekday | Edit the weekly hours, or use that day's **Closed** toggle |
Snoozing cannot be scheduled to begin later: the snooze starts the moment you click **Disable orders**, and picking a date in the snooze modal sets when orders *resume*, not when they stop. Use Special Opening Hours for anything you're planning ahead.
## Tips
* **Be accurate** - Customers will expect orders to be ready during your stated hours
* **Buffer time** - Consider closing orders 15-30 minutes before kitchen close
* **Holidays** - Add a dated row under [Special Opening Hours](#special-opening-hours) rather than editing your weekly hours; use snoozing only for closures that start immediately
* **Test your setup** - Place a test order to verify hours work as expected
# Operations settings: prep time, auto-accept, and upsells
Source: https://storekit.com/docs/guides/store-settings/operations-settings
Configure storekit operational settings including prep time, order acceptance flow, auto-ready behaviour, and how the kitchen receives and processes orders.
Operations settings control how orders flow through your system — from acceptance to preparation to fulfilment. Configure these to match your kitchen's workflow.
## Accessing Operations Settings
Go to **Stores → \[your store] → Settings → Operations** to view and configure all operational settings. Remember to select **Save** in the settings bar to apply any changes.
## Key Settings
| Setting | Description |
| --------------------------- | ----------------------------------------------------------------------------------------- |
| **Default prep time** | How long orders typically take to prepare. Shown to customers as the estimated wait time. |
| **Auto-accept orders** | Automatically accept incoming orders, skipping the manual acceptance step. |
| **Auto-ready** | Automatically mark orders as ready after the prep time elapses. |
| **Order acceptance window** | How long you have to accept an order before it is automatically declined. |
| **Upsell products** | Choose products to offer when a customer continues from their basket towards checkout. |
## Default Prep Time
The default prep time is shown to customers when they place an order. Set this to reflect your typical preparation time.
* Applies to all orders unless overridden
* Displayed as the estimated wait time at checkout
* Increase it manually during busy periods, then restore the usual time when demand returns to normal
## Auto-Accept Orders
When enabled, incoming orders are accepted automatically without manual intervention.
* Orders skip the acceptance step and move straight to preparation
* Useful for high-volume stores where manual acceptance creates bottlenecks
* Disable if you need to review orders before confirming
## Auto-Ready
Automatically marks orders as ready when the prep time elapses.
* Removes the need to manually mark each order as ready
* Relies on accurate prep time settings
* Best for consistent-prep-time items
For more on auto-ready configuration, see [Auto-Ready](/docs/guides/orders/advanced/auto-ready).
## Checkout Upsell Products
Use **Upsell products** to manually choose which products appear in the checkout cross-sell.
Go to **Stores → \[your store] → Settings → Operations → Upsell products** and select **Select Products**. If products are already selected, choose **Edit Selection**.
Select products from the store's current menu, then select **Save Selection**.
Select **Save** in the settings bar. **Save Selection** updates the selection on the page, but the Operations settings must also be saved.
When a customer continues from their basket towards checkout, storekit opens a pre-checkout **People also added** modal containing the selected products. Customers can quick-add an available product, open its details, or select **Continue to checkout**.
### How upsells differ from other recommendations
| Placement | How products are chosen | Where customers see it |
| --------------------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| **Upsell products** | You manually select products in Operations settings | A modal when the customer continues from the basket towards checkout |
| **Suggested for you** | storekit generates recommendations using the store, customer, and basket context | Recommendation cards in the basket and other enabled recommendation placements |
| **Popular** | You mark a product as **Popular** in its product settings | A Popular badge and, when enabled, the **Popular Items** section on the menu |
Changing the **Popular** flag does not add a product to the checkout upsell, and it does not control the algorithmic **Suggested for you** results. See [Products](/docs/guides/menu/products#popular-flag).
### POS-synced menus
For POS-managed menus such as Lightspeed, a product must exist in the current synced storekit menu before it can be selected. Make product changes in your POS, [sync the menu](/docs/guides/menu/pos-menu-sync), then return to **Upsell products** to select the synced product.
Configure upsells separately for each store. The selector and storefront both use the current store's menu, so a product from another store or menu cannot be resolved in the checkout modal.
### Troubleshooting checkout upsells
#### The upsell modal does not appear
* Confirm **Upsell products** shows at least one selected product.
* After selecting **Save Selection**, also select **Save** in the settings bar.
* Test the checkout journey for the same store you configured. The modal opens when the customer continues from a non-empty basket.
#### A selected product is missing
The storefront matches each saved selection to a product in the store's currently loaded menu. If a POS sync removed or recreated the product, or the store is using a different menu, the saved product ID no longer resolves and the item is omitted. Sync the correct menu, then use **Edit Selection** to remove the old selection and select the current product.
#### A selected product is unavailable
Snoozed products, products unavailable for the selected day, products marked unavailable, and products with no remaining tracked inventory are shown as unavailable and cannot be added from the modal. Restore the product's availability or inventory before testing again.
## Managing Busy Periods
Operations settings do not currently include a self-serve **Busy mode** toggle. During peak periods:
1. Go to **Stores → \[your store] → Settings → Operations** and increase the **Default prep time**. This raises the estimated wait shown to customers at checkout.
2. Select **Save** in the settings bar.
3. Add a [Store notice](/docs/guides/store-settings/store-notices) to tell customers about the delay and where it applies.
When demand returns to normal, restore the usual prep time and remove or update the notice.
## Order Notifications
The **Order Notifications** card on the Operations page controls the notifications sent to your team and to customers.
To turn on customer SMS updates, tick **Text (SMS) notifications** under **Sent to customers**:
**Stores → \[your store] → Settings → Operations → Order Notifications → Sent to customers → Text (SMS) notifications**
Optionally set an **SMS Sender Name** (maximum 11 characters) to brand the sender ID in supported countries. Select **Save** in the settings bar to apply your changes.
**I can't see or enable the SMS option**
* The **Text (SMS) notifications** checkbox and the **SMS Sender Name** field are **disabled until payment processing is active** on the store. Connect a payment provider first, then return to this page.
* The **Sent to customers** section — including the SMS controls — is **not shown for order-and-pay (in-store table service) stores**.
For the full list of customer messages and how to customise them, see [Customer Order Notifications](/docs/guides/notifications/customer-communication).
Review your operations settings regularly. As your team becomes more efficient or your order volume changes, adjusting prep times and acceptance settings keeps the customer experience accurate.
# Download and print QR codes for your storekit store
Source: https://storekit.com/docs/guides/store-settings/qr-codes
Download and print storekit QR codes for your store, individual tables, and ordering pages. Customers scan to view the menu and order on their phone.
QR codes let customers access your menu and ordering by scanning with their phone. Print and display them at your venue for a seamless customer experience.
## Types of QR Codes
| Type | Links To | Use Case |
| ------------- | ----------------------------------- | -------------------------------------------------------------------- |
| **Store QR** | Your store's menu page | General ordering — displayed at entrance, counters, or shared online |
| **Table QRs** | Specific table for dine-in ordering | Placed on individual tables for table-linked orders |
## Downloading QR Codes
1. Go to your **store dashboard**
2. Navigate to the **QR Codes** section
3. Click **Download** for the store QR or individual table QRs
QR codes are downloaded as image files ready for printing.
## Displaying QR Codes
Print and place QR codes where customers can easily scan them:
* **Tables** — Table-specific QR codes for dine-in ordering
* **Counter** — Store QR for takeaway ordering
* **Entrance** — Store QR for browsing the menu
* **Window** — Store QR visible from outside
* **Receipts** — For repeat orders or feedback
## Table QR Codes
Table QR codes link directly to a specific table, so dine-in orders are automatically associated with the correct table. This is essential for table service and pay-at-table setups.
For more on table QR codes and dine-in setup, see [Pay at Table Overview](/docs/guides/pay-at-table/overview).
## Custom Branded QR Codes
storekit+ includes custom QR code designs that match your brand. Contact support for details on branded QR options.
QR codes point to your [store URL](/docs/guides/store-settings/store-url), which is based on your store slug. If your slug changes, already-printed QR codes will still point to the old URL and stop working. Finalise your store slug before printing, and [contact support](/docs/getting-started/contact-support) if you need to change it after QR codes are in circulation.
Always test your QR codes after printing to make sure they scan correctly and link to the right destination. Test from different phones and distances to ensure reliability.
# Store Address
Source: https://storekit.com/docs/guides/store-settings/store-address
Set or update your storekit store's physical address. Used for delivery zone calculations, the store locator, customer receipts, and order confirmation emails.
Your store address determines delivery zone calculations, how your store appears in the store locator, and what customers see on receipts and order confirmations.
## Setting Your Address
1. Go to **Store Settings** > **General**
2. Enter or update your address fields
3. Verify the pin on the map matches your actual location
4. Click **Save**
## Where Your Address Is Used
| Usage | Description |
| --------------------- | ------------------------------------------------------- |
| **Delivery distance** | Calculates delivery zones and radius from your store |
| **Store locator** | Shows your location to customers browsing nearby stores |
| **Customer display** | Appears on order confirmations and receipts |
| **Receipts** | Printed on customer and kitchen receipts |
## Updating Your Address
If you move locations, update your address immediately:
1. Go to **Store Settings** > **General**
2. Update the address fields
3. Confirm the map pin is correct
4. Click **Save**
An incorrect address will cause delivery zone calculations to be wrong. Customers outside your actual delivery range may be able to order, or nearby customers may be excluded.
After updating your address, double-check the pin on the map matches your actual location. The geocoded position is used for distance calculations, not just the text address.
# Store notices and closed store messages
Source: https://storekit.com/docs/guides/store-settings/store-notices
Configure storekit notice banners and the closed store notice to share updates, set delivery expectations, and message customers when your store is closed.
Store notices let you communicate important information to customers directly on your store. Use them to share updates, set expectations, or highlight promotions.
## Types of Notice
storekit has two distinct notice areas — make sure you're editing the right one:
| Notice | When It Appears | Where to Edit |
| ----------------------- | --------------------------------------------------------------------- | --------------------------------------------------------- |
| **Store notices** | Any time the store is open (or always, depending on display location) | **Stores → \[your store] → Settings → Store Notices** |
| **Closed store notice** | Only when the store is closed or snoozed | **Stores → \[your store] → Settings → Design & Branding** |
* **Store notices** are the configurable banners covered in the rest of this guide — you control the title, body, type, and display location.
* The **Closed store notice** is a single message shown to customers when your store is closed or snoozed. Edit it in the **Design & Branding** settings (see below).
## Editing the Closed Store Notice
The closed store notice is the message customers see when your store is not accepting orders. To update it:
1. In the dashboard, go to **Stores → \[your store] → Settings → Design & Branding**
2. Scroll down to the **Closed Notice** section
3. Edit the message in the text field
4. Click **Save**
Can't find it? The **Closed Notice** section is inside **Design & Branding** settings — scroll down past the logo, colours, and typography options.
## Notice Settings
Each notice has the following options:
### Title (Optional)
A bold heading displayed above the notice body. Keep it short - 5 words or fewer works best.
### Body
The main message content. Supports basic HTML formatting like ``, ``, and `` tags for links. Line breaks are preserved.
### Notice Type
Controls the visual style of the notice:
| Type | Colour | Best For |
| ----------- | ------ | ---------------------------- |
| **Info** | Blue | General information, updates |
| **Success** | Green | Positive news, confirmations |
| **Warning** | Yellow | Important alerts, delays |
| **Neutral** | Grey | Subtle messages, legal text |
### Display Locations
Choose where the notice appears:
* **Menu** - Shown at the top of the menu page
* **Basket** - Displayed in the basket/checkout sidebar
* **Order Status** - Visible on the order confirmation page
* **Checkout Popup** - Shows as a popup that customers must acknowledge before completing their order
* **Order Email** - Included in the order confirmation email sent to the customer (and in the refund confirmation email)
You can enable multiple locations for the same notice, or create different notices for different locations.
Emails are the exception: only one notice is included — the first enabled notice with **Order Email** ticked. Keep it short and plain text — HTML tags are not rendered in emails — and note that it is picked up at send time: emails already sent are not updated, but re-sending the receipt from the order (**More actions** → **Email receipt**) uses the notices enabled at that moment.
The modal before checkout is commonly used for allergen notices. See our [Allergen Strategy](/docs/guides/compliance/allergen-strategy) guide for more options.
## Use Cases
### Temporary Closures or Delays
Warn customers about kitchen delays, reduced menus, or temporary closures.
> **Title:** Kitchen Delays
**Body:** We're experiencing high demand. Orders may take 15-20 minutes longer than usual.
**Type:** Warning
**Location:** Menu, Basket
### Delivery Information
Set expectations about delivery times or areas.
> **Title:** Delivery Notice
**Body:** We deliver within 3 miles of our restaurant. Orders outside this area will be cancelled.
**Type:** Info
**Location:** Menu
### Promotions
Highlight current offers or discounts.
> **Title:** Weekend Special
**Body:** 20% off all pizzas Friday-Sunday. Use code WEEKEND20 at checkout.
**Type:** Success
**Location:** Menu, Basket
### Allergen or Dietary Warnings
Important information customers need before ordering.
> **Title:** Allergen Information
**Body:** Our kitchen handles nuts, gluten, and dairy. Please contact us directly if you have severe allergies.
**Type:** Warning
**Location:** Checkout Popup
### Order Confirmation Details
Useful information after the order is placed.
> **Title:** What's Next?
**Body:** You'll receive a text when your order is ready for collection. Please bring ID for alcohol orders.
**Type:** Info
**Location:** Order Status
### Pickup or Collection Instructions in the Confirmation Email
Tell customers where to go and what to bring, in the email they are most likely to check on the way.
> **Title:** Collecting Your Order
**Body:** Collect from the side entrance on Bridge Street. Show your order number at the counter.
**Type:** Info
**Location:** Order Email, Order Status
### Event or Catering Orders
Set expectations for large orders.
> **Title:** Catering Orders
**Body:** Orders over £200 require 48 hours notice. We'll call to confirm your order within 2 hours.
**Type:** Info
**Location:** Checkout Popup
## Tips
* **Keep it brief** - Customers scan, they don't read essays
* **Use the right type** - Yellow for things they need to know, blue for nice-to-know
* **Don't overdo it** - One or two notices maximum, more feels spammy
* **Update regularly** - Remove outdated notices promptly
* **Use the modal sparingly** - Only for critical information that requires acknowledgement
* **Notice not showing in an email?** Check the notice is enabled, has **Order Email** ticked and that no other notice also has **Order Email** ticked, then place a fresh test order or re-send the receipt from an existing order
# Find and share your storekit store URL
Source: https://storekit.com/docs/guides/store-settings/store-url
Find and share your storekit store URL. Learn the URL format, locate it in the dashboard, handle multi-store URLs, and avoid breaking printed QR codes.
Your store URL is the link customers use to view your menu and place orders. Share it on social media, your website, or in messages to drive online orders.
## URL Format
Every storekit store has a URL in this format:
```
https://order.storekit.com/{store-slug}
```
The `store-slug` is a URL-friendly version of your store name. For example, a store called "The Great Burger Co" would have a slug like `the-great-burger-co`.
## Finding Your Store URL
Your store URL is available in two places in the dashboard:
### Store Settings
1. Go to **Store Settings** > **Store Details**
2. Your store URL is displayed on this page
### Store Designer
1. Open the **Store Designer**
2. The preview link at the top of the designer shows your live store URL
You can also find your store slug in the browser address bar when editing your store in the dashboard.
## Sharing Your Store URL
Share your store URL anywhere you want customers to find you:
* **Social media** — post the link on Instagram, Facebook, or X
* **Your website** — add an "Order Now" button linking to your store
* **Google Business Profile** — add it as your ordering link
* **Email and SMS** — include it in marketing messages
## Multi-Store URLs
If you manage [multiple stores](/docs/guides/store-settings/multiple-stores), each store has its own unique URL with its own slug:
```
https://order.storekit.com/{store-one-slug}
https://order.storekit.com/{store-two-slug}
```
Your store group also has a URL that displays all of your locations in one place, letting customers choose which store to order from.
## Store Slugs and Custom Domains
Your store slug is set when the store is created and stays fixed afterwards. Renaming your store changes the name customers see, but it does not change the slug or the store URL. There is no field in the dashboard for editing a slug — slug changes are a support request, so [contact support](/docs/getting-started/contact-support) if you need one.
If your brand has a [custom domain](/docs/guides/marketing/custom-domains), the same slug is used on it:
```
https://yourdomain.com/{store-slug}/menu
```
One custom domain serves every store in the brand, so the slug is always part of the path — a domain cannot be pointed at a single store. Your `order.storekit.com/{store-slug}` URL stays live alongside the custom domain and does not redirect to it automatically.
## QR Codes
Your store [QR code](/docs/guides/store-settings/qr-codes) points to the same store URL. When customers scan the QR code, they are taken directly to your menu and ordering page.
If support changes your store slug, your store URL changes with it. Any QR codes you have already printed — including table-talkers and signage — and any links you have already shared will still point to the old URL and will stop working. Customers scanning old QR codes or clicking old links will not reach your store.
Finalise your store slug **before** printing QR codes or sharing your store URL. If you need to change your slug after QR codes are already in circulation, [contact support](/docs/getting-started/contact-support) so the old URL can be redirected to your new one.
Bookmark your store URL and test it regularly to make sure everything looks right from a customer's perspective.
# Translations & Languages
Source: https://storekit.com/docs/guides/store-settings/translations
Configure language settings for international guests using storekit's multilingual menu support. Translate the ordering interface and menu content.
storekit supports multiple languages for both the ordering interface and your menu content. This guide explains how language settings affect the guest experience and how to configure them for your store.
## Supported Languages
storekit supports the following languages:
| Language | Code |
| --------------- | ----- |
| 🇬🇧 English | en-GB |
| 🇫🇷 Français | fr-FR |
| 🇪🇸 Español | es-ES |
| 🇩🇪 Deutsch | de-DE |
| 🇮🇹 Italiano | it-IT |
| 🇳🇱 Nederlands | nl-NL |
| 🇵🇹 Português | pt-PT |
| 🇸🇪 Svenska | sv-SE |
| 🇩🇰 Dansk | da-DK |
| 🇵🇱 Polski | pl-PL |
| 🇹🇷 Türkçe | tr-TR |
| 🇬🇷 Ελληνικά | el-GR |
| 🇯🇵 日本語 | ja-JP |
| 🇨🇳 简体中文 | zh-CN |
| 🇹🇼 繁體中文 | zh-TW |
## What Gets Translated
Language settings affect two different things:
### 1. Interface Text
All buttons, labels, and system messages throughout the ordering flow:
* "Add to basket", "Checkout", "Place order"
* Form labels like "Email", "Phone number", "Delivery address"
* Error messages and confirmations
* Allergen names and dietary tags
* Order status notifications (SMS and push notifications)
This is handled automatically by storekit - no setup required.
### 2. Menu Content
Your product names, descriptions, category names, and modifier options. This requires you to provide translations in your menu management system or POS.
Interface translations are automatic. Menu translations require you to add translated content for each language you want to support.
## Store Language Settings
### Default Language
The primary language for your store. This is used when:
* Auto language is disabled
* A guest's browser language isn't supported
* No language preference can be detected
### Auto Language
When enabled, storekit automatically detects the guest's browser language and switches to it if supported.
**How it works:**
1. Guest visits your store
2. storekit checks their browser's language setting
3. If that language is supported, the store displays in that language
4. If not supported, falls back to your default language
**Best for:**
* Tourist areas with international visitors
* Hotels and airports
* Areas with diverse local populations
* Dine-in QR ordering where guests may be visiting from abroad
Auto language is particularly useful for dine-in. A French tourist scanning your QR code will automatically see the interface in French.
### Manual Language Switching
Regardless of auto language settings, guests can always manually switch languages using the language selector in your store. This opens a modal showing all available languages with their native names and flag emojis.
## Menu Translations
For guests to see your menu in their language, you need to provide translated content.
### How Menu Translations Work
1. You create translations for your menu items (names, descriptions) in each language
2. When a guest views your store in French, storekit requests the French version of your menu
3. Product names and descriptions display in French
4. If a translation is missing, the original text is shown
### What to Translate
| Content | Priority |
| --------------------- | ------------------------------------------------------ |
| Product names | High - guests need to understand what they're ordering |
| Product descriptions | Medium - helps guests make decisions |
| Category names | Medium - aids navigation |
| Modifier names | Medium - important for customisation |
| Modifier group titles | Low - often self-explanatory |
### Translation Sources
Menu translations can come from:
* **Your POS system** - If your POS supports multilingual menus, translations sync automatically
* **storekit dashboard** - Add translations directly for each menu item
* **CSV import** - Bulk upload translations via spreadsheet
If you enable auto language but don't have menu translations, guests will see your interface in their language but menu items in your default language. This can be confusing - either provide translations or disable auto language.
## Best Practices
### If You Have International Guests
1. **Enable auto language** - Remove friction for visitors
2. **Translate your menu** - At minimum, product names
3. **Test in each language** - Check nothing looks broken
4. **Consider descriptions** - Even brief translations help
### If Your Guests Are Primarily Local
1. **Set your local language as default**
2. **Consider disabling auto language** - Avoids confusion if you don't have translations
3. **Add translations later** - As your international customer base grows
### For Tourist Hotspots
1. **Enable auto language**
2. **Prioritise common tourist languages** - Usually English, French, Spanish, German, Chinese
3. **Use photos** - Good product photos transcend language barriers
4. **Keep descriptions simple** - Easier to translate and understand
## Troubleshooting
### Menu Shows Mixed Languages
**Cause:** Auto language is on but menu translations are incomplete.
**Fix:** Either complete your translations or disable auto language until translations are ready.
### Guest Can't Find Language Switcher
The language switcher appears in the store footer or header depending on your theme. Ensure it's visible and not hidden by custom styling.
### Translations Not Updating
Menu translations are cached. After updating translations:
1. Wait a few minutes for cache to clear
2. Hard refresh the page (Ctrl+Shift+R / Cmd+Shift+R)
3. If still not showing, contact support
# Marketing Reports
Source: https://storekit.com/docs/marketing-reports
Track storefront traffic, guest behaviour, conversion rates, product performance, and traffic sources with storekit's marketing analytics reports.
Marketing Reports show how guests find and use your storefront, including traffic sources, product views, conversion, and live activity.
Open **Analytics > Marketing** from the dashboard.
Marketing Reports use browser tracking and may differ slightly from other storekit reports. Ad blockers and private browsing can prevent some activity from being recorded.
## Overview
The top of the report shows the main performance metrics for the selected date range.
| Metric | Description |
| ------------------- | ------------------------------------------------ |
| Total Sessions | Number of browsing sessions |
| Sessions with Order | Sessions that resulted in an order |
| Conversion Rate | Percentage of sessions that resulted in an order |
| Total Order Value | Value of orders linked to tracked sessions |
Use the date selector in the top-right to change the reporting period or compare it with the previous period.
## Guest Trends
Guest Trends shows the number of guests visiting your storefront over time.
The chart also compares activity with the previous period and shows the number of guests currently online.
## Traffic Sources
Traffic Sources shows where storefront visits came from.
| Source | Description |
| -------- | ---------------------------------------------------------------- |
| Social | Traffic from social platforms |
| Direct | Direct visits, or visits where no referring source was available |
| Referral | Traffic from another website or external link |
The Source Breakdown shows guests, sessions, revenue, and conversion rate for each source.
## Device Type
Device Type shows the devices used to access your storefront, such as desktop or mobile.
## Conversion Funnel
The Conversion Funnel shows how guests move through the ordering journey:
1. Menu Loaded
2. Viewed Product
3. Added to Cart
4. Checkout
5. Order Completed
This shows where guests leave the ordering flow before completing an order.
## Product Performance
Product Performance shows engagement with individual menu products.
| Metric | Description |
| ----------- | ----------------------------------------------------------- |
| Views | Number of times the product was viewed |
| Add to Cart | Number of times the product was added to the basket |
| View → Cart | Percentage of product views that resulted in an add to cart |
## Search Queries
Search Queries shows the terms guests searched for on your menu during the selected period.
If no searches were recorded, this section will be empty.
## Peak Hours
Peak Hours shows storefront sessions by day and time.
Darker areas of the heatmap indicate periods with more sessions.
## Live Activity
The Live section shows storefront activity from the last five minutes.
Activity can be filtered by:
* Orders
* Cart
* Browsing
* Search
# Audit Log
Source: https://storekit.com/docs/privacy-security/audit-log
Track staff actions across your storekit account with a searchable, exportable audit trail of who changed what, when, from where, and whether it succeeded.
The audit log gives you a tamper-resistant history of the actions your staff take across your account: who did what, to which resource, from where, and whether it succeeded. Use it to investigate changes, meet compliance requirements, and answer questions like "who cancelled that order?" or "when was this menu item updated?".
The audit log is restricted to **account owners and admins**. Staff on other roles will see a "restricted" message when they try to open it, and an admin whose access is limited to particular stores only sees events for those stores.
## Where to find it
In the sidebar, click **Analytics** to expand the section, then select **Logs**.
Under the **Security** heading, select **Audit Log**.
The most recent events load automatically. Narrow the results with filters, or export what you see to CSV.
## What gets recorded
Each entry captures the full context of a single staff action:
| Dimension | What it tells you |
| ------------ | --------------------------------------------------------------------------------------- |
| **Time** | When the action happened (recorded at the moment of the action, not when it was stored) |
| **Actor** | The staff member — name, email, and role at the time |
| **Action** | `create`, `update`, `delete`, `read`, or `export` |
| **Resource** | The type of thing that was affected (e.g. `order`, `menu`, `discount`) and its ID |
| **Store** | The venue the action related to, where applicable |
| **Outcome** | Whether the request succeeded, plus the HTTP status |
Selecting a row expands a detail panel with the request method, path, route, IP address, user agent, request ID, and trace ID, along with the error type when an action failed.
### Which actions are logged
* **All changes** are recorded — anything that creates, updates, or deletes data (including actions like archiving, cancelling, restoring, or publishing).
* **Sensitive reads** are recorded — viewing or downloading reports, exports, invoices, and statements. Opening the audit log itself is recorded as a `read`, and exporting it is recorded as an `export`.
* **Routine reads** (browsing lists, opening detail views, background polling) are **not** recorded, to keep the log focused on meaningful activity.
Actions taken by customers placing orders and by API keys are outside the scope of the audit log — it focuses on **staff actions** in the dashboard.
## Who Changed a Store Setting, and When
Saving a store settings page is recorded like any other change: an `update` against the resource behind that page, attributed to the staff member who saved it and stamped with the time they did.
Opening hours are the common case. Weekly hours and **Special Opening Hours** are saved together by **Save** on **Stores** → your store → **Settings** → **Opening Hours**, so both arrive as one entry with resource type `hour` and action **Update**.
Click **Add filter**, choose **Resource type**, enter `hour` and click **Apply**. Add the **Action** filter set to **Update**, and the **Outcome** filter set to **Success** — failed saves are logged too, and they did not change anything.
The log opens on the last 30 days. To narrow it, click the date range button with the calendar icon to the right of the filters and pick a preset (**Today**, **Yesterday**, **This month**, **Last month**, **This year**, **Last year**, **All time**) or select the dates on the calendar. **All time** will not surface anything beyond your retention window.
**Time** is when the hours were saved, **Actor** is the staff member who saved them (name, email, and their role at the time), and **Store** is the store affected — so you can leave the **Store** filter off and read the column instead of looking up store IDs.
Selecting the row shows **Path** as `/venues//hours`, the **IP address**, **User agent** and **Request ID**, and **Fields changed** as `venueHours` and `specialHours`.
The same approach works for other changes — filter by resource type (`venue` for a store's own settings, and `menu`, `product` or `discount-code` for catalogue and promotion edits) and read the **Actor** and **Time** columns.
### What this does not tell you
* **The values.** The log records that hours were changed and which fields were involved — never the times before and after. There is no way to see the previous opening hours in the dashboard.
* **Changes that were not made by a staff member.** Anything done by an API key, a POS or delivery integration, or a customer is out of scope.
* **Anything older than your retention window.** 30 days by default (see [Retention](#retention)).
If a change is older than your retention window, or was made by an integration, the audit log cannot tell you who made it. [Contact support](/docs/getting-started/contact-support) with the store and approximate date if you still need it investigated.
## Searching and filtering
The audit log uses a faceted search bar. Add one or more filters and click **Apply**; active filters appear as removable pills. Available facets:
| Filter | Description |
| ----------------- | ---------------------------------------------------------- |
| **Action** | Limit to `create`, `update`, `delete`, `read`, or `export` |
| **Outcome** | Show only successful or only failed actions |
| **Resource type** | e.g. `order`, `menu`, `product`, `discount` |
| **Resource ID** | A specific record's ID |
| **Actor** | A specific staff member |
| **Store** | One or more venues (limited to stores you have access to) |
By default the log shows the last **30 days**. Results are paginated — use **Load more** to fetch older events. You can clear everything with **Clear all**.
Combine facets to zero in on an incident — for example, filter by **Actor** and **Action: delete** to see everything a specific user removed.
## Exporting to CSV
Click **Export** to download the currently filtered results as a CSV file (with the same filters and date range applied). This is handy for sharing with auditors or archiving outside storekit.
Exports are capped at 50,000 rows. If you hit the cap, narrow the date range or add filters and export in smaller batches.
## Privacy and data handling
The audit log is designed to record **what changed without capturing sensitive contents**:
* It stores the **names of the fields** involved in a change (e.g. "price, availability") — never the actual values that were submitted.
* Field names that look sensitive (passwords, tokens, keys, card details, PINs, and similar) are **automatically dropped** and never recorded.
* Records are **append-only**: entries are never edited or individually deleted, so the history stays trustworthy.
## Retention
Audit entries are retained for **30 days** by default, and the log opens on that same 30-day window. Retention is set per account, so accounts that need a longer history for compliance can request one.
Only account owners and admins. Other staff roles cannot view or export it.
The log intentionally records changes and sensitive reads (reports, exports, invoices, statements) only. Everyday browsing and background requests are excluded so the log stays focused on meaningful activity.
No. It records which fields were involved in a change, but not the submitted values. Sensitive field names are dropped entirely.
Entries are kept for 30 days by default. If you need longer retention for compliance, [contact our team](/docs/getting-started/contact-support).
You can export the filtered results, up to 50,000 rows per export. For larger ranges, split the export into smaller date windows.
# Blocked Countries
Source: https://storekit.com/docs/privacy-security/blocked-countries
Countries where storekit access is restricted for regulatory, sanctions, export-control, and security reasons. Reference for merchants and guests.
storekit restricts access from certain countries to comply with international sanctions, export control regulations, and to maintain platform security and integrity.
## Blocked Countries
Access to storekit services is blocked from the following countries:
| Code | Country |
| ---- | ----------- |
| AF | Afghanistan |
| AM | Armenia |
| AZ | Azerbaijan |
| BD | Bangladesh |
| CN | China |
| IN | India |
| IR | Iran |
| IQ | Iraq |
| KZ | Kazakhstan |
| KP | North Korea |
| LA | Laos |
| NG | Nigeria |
| PK | Pakistan |
| RU | Russia |
| RW | Rwanda |
| SY | Syria |
| UA | Ukraine |
| VN | Vietnam |
## What This Means
* **Store access**: Customers located in these countries will not be able to access storekit-powered ordering pages
* **Dashboard access**: Merchant dashboard access from these countries is also restricted
* **API requests**: API calls originating from blocked countries will be rejected
If you believe your access has been blocked in error, please [contact our support team](/docs/getting-started/contact-support) for assistance.
## Frequently Asked Questions
Access restrictions are in place to comply with international sanctions, export control laws, and to protect the security of the platform and its users.
Country-level restrictions are applied at the platform level and cannot be overridden for individual accounts. If you believe your access has been restricted in error, please contact our support team.
Location is determined by the IP address of the incoming request. VPN or proxy usage does not exempt users from these restrictions.
# Data Residency
Source: https://storekit.com/docs/privacy-security/data-residency
Learn where your storekit data is hosted and processed, with regional data residency options for UK, European, and US accounts to meet local compliance rules.
storekit hosts customer data in regional data centres to comply with local regulations and optimise performance.
## Data Regions
### UK/EU Region
All storekit accounts created **before 1 January 2026** have their data hosted in the **United Kingdom and European Union**.
This includes:
* Customer orders and transaction data
* Menu and product information
* Store settings and configurations
* User account data
### US Region
Accounts created **on or after 1 January 2026** that select **United States** or **Canada** as their primary region will have their data hosted in the **United States**.
| Account Created | Selected Region | Data Location |
| ------------------- | -------------------------- | ------------- |
| Before 1 Jan 2026 | Any | UK/EU |
| On/after 1 Jan 2026 | UK, EU countries, or other | UK/EU |
| On/after 1 Jan 2026 | United States or Canada | US |
## Data Processing
Regardless of data residency, storekit processes data in accordance with:
* **GDPR** (General Data Protection Regulation) for EU/UK customers
* **CCPA** (California Consumer Privacy Act) for US customers where applicable
Your data region is determined at account creation and cannot be changed. If you have specific data residency requirements, [contact our team](/docs/getting-started/contact-support) before creating your account.
## Frequently Asked Questions
Data region is set at account creation and cannot be changed. If you need data in a specific region, please ensure you select the correct region when creating your account.
storekit uses a global CDN to ensure fast load times regardless of where your data is stored. Customer-facing ordering pages are served from edge locations closest to your customers.
Your data region is based on your account creation date and selected region. Accounts created before 1 January 2026 are in the UK/EU region. For accounts created after this date, US and Canada selections are in the US region, all others remain in UK/EU.
# Event Tracking
Source: https://storekit.com/docs/privacy-security/event-tracking
Reference for the customer behaviour events storekit collects and how they integrate with analytics platforms like Google Analytics, GTM, and Meta Pixel.
storekit collects behavioural events to help you understand customer journeys, optimise conversions, and power marketing integrations. This page explains what we track, how data flows, and how events integrate with third-party platforms.
This page is the reference for the raw events. For how those events are turned into the numbers on the **Guest activity** page — **Guests**, **Total Sessions**, **Sessions with Order**, **Conversion Rate** and the **Conversion Funnel** steps — see [Visitor Metrics Explained](/docs/guides/reports/visitor-metrics).
## Native Event Collection
storekit automatically collects events across web and native apps without requiring additional code.
### Core Commerce Events
Fired when a customer lands on the store.
```json theme={null}
{
"event": "active_on_site",
"properties": {
"accountId": "40586258-8a99-4651-b79f-0a1ab602a926",
"id": 8709,
"slug": "your-store"
}
}
```
Fired when the ordering menu itself has finished loading for a customer — the point at which they can actually see your products and start ordering. It is more specific than landing on the store: opening any other page (for example a policy page) does not fire it.
This is the event behind the **Menu Loaded** step of the **Conversion Funnel**, where it is counted once per session rather than once per load — see [Visitor Metrics Explained](/docs/guides/reports/visitor-metrics#conversion-funnel).
```json theme={null}
{
"event": "menu_loaded",
"properties": {
"menuId": 12345
}
}
```
Fired when a customer opens a product modal.
```json theme={null}
{
"event": "viewed_product",
"properties": {
"id": 98765,
"name": "Flat White",
"currency": "GBP",
"price": 350,
"image": "https://cdn.storekit.com/products/flat-white.jpg",
"plu": "FW001",
"sku": "SKU-FW-001"
}
}
```
Fired when an item is added to the basket.
```json theme={null}
{
"event": "add_to_cart",
"properties": {
"id": 98765,
"name": "Flat White",
"price": 400,
"image": "https://cdn.storekit.com/products/flat-white.jpg",
"modifiers": [
{
"id": 111,
"name": "Oat Milk",
"price": 50
}
]
}
}
```
Fired when an item is removed from the basket.
```json theme={null}
{
"event": "remove_from_cart",
"properties": {
"id": 98765,
"name": "Flat White",
"price": 400,
"image": "https://cdn.storekit.com/products/flat-white.jpg",
"modifiers": []
}
}
```
Fired when the customer opens the checkout screen.
```json theme={null}
{
"event": "started_checkout",
"properties": {
"currency": "GBP",
"items": [
{
"id": 98765,
"name": "Flat White",
"price": 400,
"quantity": 2,
"modifiers": []
}
],
"venueSlug": "your-store",
"value": 8.00
}
}
```
Fired when payment is confirmed and the order is placed.
```json theme={null}
{
"event": "order_completed",
"properties": {
"orderId": "ord_789xyz",
"total": 12.50,
"currency": "GBP",
"venueSlug": "your-store",
"order": {
"items": [...],
"fulfillmentMethod": "delivery",
"customer": {...}
}
}
}
```
### Search & Discovery Events
Fired when a customer performs a search (debounced by 1 second).
```json theme={null}
{
"event": "products_searched",
"properties": {
"query": "coffee",
"resultCount": 12
}
}
```
Fired when the cross-sell modal is displayed.
```json theme={null}
{
"event": "cross_sell_modal_view",
"properties": {
"productCount": 4,
"crossSellType": "product"
}
}
```
`crossSellType` is either `"product"` or `"category"` depending on configuration.
Fired when the upsell modal is displayed after a customer adds an item to the cart.
```json theme={null}
{
"event": "upsell_modal_view",
"properties": {
"upsellGroupId": 123,
"productId": 98765,
"productCount": 5
}
}
```
### Discount Events
Fired when a customer submits a discount code.
```json theme={null}
{
"event": "discount_entered",
"properties": {
"code": "SUMMER20"
}
}
```
Fired when a discount code is successfully applied.
```json theme={null}
{
"event": "discount_applied",
"properties": {
"discount_id": 456,
"discount_name": "Summer Sale",
"discount_amount": 500,
"discount_type": "percentage"
}
}
```
Fired when a discount code is rejected.
```json theme={null}
{
"event": "discount_denied",
"properties": {
"discount_code": "EXPIRED10",
"reason": "Code has expired",
"status_code": 400
}
}
```
### Promotional Offer Events
Fired when a promotional offer becomes visible.
```json theme={null}
{
"event": "viewed_offer",
"properties": {
"offerId": 123,
"linkId": "link_abc",
"type": "banner",
"value": "20% off"
}
}
```
Fired when a customer clicks on a promotional offer.
```json theme={null}
{
"event": "click_offer",
"properties": {
"offerId": 123,
"linkId": "link_abc",
"type": "banner",
"value": "20% off"
}
}
```
### Stories Events
Fired when a customer opens the story viewer.
```json theme={null}
{
"event": "story_viewer_opened",
"properties": {
"storyId": 789,
"storyIndex": 0,
"storyTitle": "New Summer Menu",
"totalStories": 5,
"source": "menu_page"
}
}
```
Fired when a story page is viewed.
```json theme={null}
{
"event": "story_viewed",
"properties": {
"storyId": 789,
"storyTitle": "New Summer Menu",
"pageIndex": 2,
"totalPages": 4,
"hasVideo": true,
"hasCta": true
}
}
```
Fired when a customer navigates between story pages.
```json theme={null}
{
"event": "story_navigation",
"properties": {
"storyId": 789,
"fromPage": 1,
"toPage": 2,
"direction": "forward",
"method": "tap"
}
}
```
Fired when a customer clicks a CTA within a story.
```json theme={null}
{
"event": "story_cta_clicked",
"properties": {
"storyId": 789,
"pageIndex": 2,
"ctaType": "product",
"ctaLabel": "Order Now",
"ctaData": { "productId": 456 },
"videoProgressPercent": 75
}
}
```
Fired when a customer views all pages of a story.
```json theme={null}
{
"event": "story_completed",
"properties": {
"storyId": 789,
"storyTitle": "New Summer Menu",
"totalPages": 4,
"timeSpentSeconds": 32
}
}
```
Fired when the story viewer is closed.
```json theme={null}
{
"event": "story_viewer_closed",
"properties": {
"storyId": 789,
"pageIndex": 2,
"totalStoriesViewed": 3,
"totalPagesViewed": 8,
"timeSpentSeconds": 45,
"closeMethod": "swipe_down"
}
}
```
### Experimentation Events
Fired when a customer is exposed to an A/B test variant.
```json theme={null}
{
"event": "viewed_experiment",
"properties": {
"experimentId": "checkout-flow-v2",
"variationId": 1,
"venueId": 8709,
"accountId": "40586258-8a99-4651-b79f-0a1ab602a926",
"venueSlug": "your-store"
}
}
```
## Item ID Resolution
When sending events to analytics platforms, storekit resolves the `item_id` using the following priority:
1. **PLU** - Point of sale lookup code (preferred for POS-connected stores)
2. **SKU** - Stock keeping unit
3. **POS ID** - External POS system identifier
4. **ID** - storekit's internal product ID (fallback)
This ensures your analytics data uses the same identifiers as your POS system for accurate reporting and attribution.
```
item_id = product.plu || product.sku || product.posId || product.id
```
For best results, ensure your products have PLU codes configured if you're using a POS integration. This keeps your analytics data consistent with your POS reports.
## Platform Integrations
storekit forwards events to third-party platforms in their native format. Events are transformed automatically—no mapping required.
### Meta (Facebook) Pixel
Events are sent to Meta's Pixel API. A `PageView` event fires automatically on initialisation.
Triggered by `add_to_cart`
```json theme={null}
{
"content_ids": [98765],
"content_name": "Flat White",
"currency": "GBP",
"value": "4.00",
"content_type": "product"
}
```
Triggered by `started_checkout`
```json theme={null}
{
"currency": "GBP",
"value": 8.00
}
```
Triggered by `order_completed`
```json theme={null}
{
"currency": "GBP",
"value": "12.50",
"content_type": "product"
}
```
Meta Pixel provides better attribution than browser-only pixels, especially with iOS privacy changes and ad blockers.
### Google Analytics 4 / Google Tag Manager
Events are pushed to the `dataLayer` following GA4's e-commerce schema.
```json theme={null}
{
"event": "active_on_site",
"userId": null,
"sessionId": null,
"pagePath": null
}
```
Triggered by `viewed_product`
```json theme={null}
{
"event": "view_item",
"currency": "GBP",
"value": 3.50,
"items": [
{
"item_id": "FW001",
"item_name": "Flat White"
}
]
}
```
```json theme={null}
{
"event": "add_to_cart",
"value": 4.00,
"currency": "GBP",
"items": [
{
"item_name": "Flat White",
"item_id": "FW001",
"price": 4.00,
"quantity": 1
}
]
}
```
Triggered by `started_checkout`
```json theme={null}
{
"event": "begin_checkout",
"value": 8.00,
"currency": "GBP",
"items": [
{
"item_name": "Flat White",
"affiliation": "your-store",
"item_id": "FW001",
"price": 4.00,
"quantity": 2,
"category": "Hot Drinks",
"item_variant": "Oat Milk"
}
]
}
```
Triggered by `order_completed`
```json theme={null}
{
"event": "purchase",
"transaction_id": "ord_789xyz",
"value": 12.50,
"currency": "GBP",
"items": [
{
"item_name": "Flat White",
"affiliation": "your-store",
"item_id": "FW001",
"price": 4.00,
"quantity": 2,
"category": "Hot Drinks",
"item_variant": "Oat Milk"
}
]
}
```
### Klaviyo
Events are sent to Klaviyo for email marketing automation. Customer identity is linked via email when available using `klaviyo.identify()`.
Triggered by `active_on_site`
```json theme={null}
{
"AccountId": "40586258-8a99-4651-b79f-0a1ab602a926",
"VenueId": 8709,
"VenueSlug": "your-store"
}
```
Triggered by `viewed_product`
```json theme={null}
{
"ProductId": 98765,
"ProductName": "Flat White",
"ProductPrice": 350,
"ProductImage": "https://cdn.storekit.com/products/flat-white.jpg"
}
```
Triggered by `add_to_cart`
```json theme={null}
{
"ProductId": 98765,
"ProductName": "Flat White",
"ProductPrice": 400,
"ProductImage": "https://cdn.storekit.com/products/flat-white.jpg"
}
```
Triggered by `started_checkout`
```json theme={null}
{
"Currency": "GBP",
"Value": 8.00
}
```
### 1st Party Event Collection
For customers who want full data ownership, storekit can send events directly to your own data warehouse. All events include base context properties automatically.
**Base context (included in all events):**
```json theme={null}
{
"account_id": "40586258-8a99-4651-b79f-0a1ab602a926",
"venue_id": 8709,
"venue_slug": "your-store"
}
```
Triggered by `active_on_site`. Also identifies the user.
```json theme={null}
{
"event": "venue_loaded"
}
```
```json theme={null}
{
"event": "menu_loaded",
"menu_id": 12345
}
```
Triggered by `viewed_product`
```json theme={null}
{
"event": "product_modal_view",
"product_id": 98765,
"product_name": "Flat White",
"product_price": 350,
"product_image": "https://cdn.storekit.com/products/flat-white.jpg",
"product_plu": "FW001"
}
```
```json theme={null}
{
"event": "add_to_cart",
"product_id": 98765,
"product_name": "Flat White",
"product_price": 400,
"product_image": "https://cdn.storekit.com/products/flat-white.jpg",
"product_quantity": 1,
"product_plu": "FW001",
"add_to_cart_source": null
}
```
```json theme={null}
{
"event": "remove_from_cart",
"product_id": 98765,
"product_name": "Flat White",
"product_price": 400,
"product_image": "https://cdn.storekit.com/products/flat-white.jpg",
"product_quantity": 1,
"product_plu": "FW001"
}
```
```json theme={null}
{
"event": "order_completed",
"orderId": "ord_789xyz",
"total": 12.50,
"currency": "GBP"
}
```
```json theme={null}
{
"event": "cross_sell_modal_view",
"product_count": 4,
"cross_sell_type": "product"
}
```
```json theme={null}
{
"event": "upsell_modal_view",
"upsell_group_id": 123,
"product_id": 98765,
"product_count": 5
}
```
```json theme={null}
{
"event": "viewed_offer",
"offer_id": 123,
"link_id": "link_abc",
"type": "banner",
"value": "20% off"
}
```
Triggered by `click_offer`
```json theme={null}
{
"event": "clicked_offer",
"offer_id": 123,
"link_id": "link_abc",
"type": "banner",
"value": "20% off"
}
```
```json theme={null}
{
"event": "products_searched",
"query": "coffee",
"result_count": 12
}
```
Triggered by `viewed_experiment`
```json theme={null}
{
"event": "experiment_viewed",
"experiment_key": "checkout-flow-v2",
"variation_id": 1,
"account_id": "40586258-8a99-4651-b79f-0a1ab602a926",
"venue_id": 8709,
"venue_slug": "your-store"
}
```
```json theme={null}
{
"event": "story_viewer_opened",
"story_id": 789,
"story_index": 0,
"story_title": "New Summer Menu",
"total_stories": 5,
"source": "menu_page"
}
```
```json theme={null}
{
"event": "story_viewed",
"story_id": 789,
"story_title": "New Summer Menu",
"page_index": 2,
"total_pages": 4,
"has_video": true,
"has_cta": true
}
```
```json theme={null}
{
"event": "story_navigation",
"story_id": 789,
"from_page": 1,
"to_page": 2,
"direction": "forward",
"method": "tap"
}
```
```json theme={null}
{
"event": "story_cta_clicked",
"story_id": 789,
"page_index": 2,
"cta_type": "product",
"cta_label": "Order Now",
"cta_data": { "productId": 456 },
"video_progress_percent": 75
}
```
```json theme={null}
{
"event": "story_completed",
"story_id": 789,
"story_title": "New Summer Menu",
"total_pages": 4,
"time_spent_seconds": 32
}
```
```json theme={null}
{
"event": "story_viewer_closed",
"story_id": 789,
"page_index": 2,
"total_stories_viewed": 3,
"total_pages_viewed": 8,
"time_spent_seconds": 45,
"close_method": "swipe_down"
}
```
## Configuration
### Enabling Integrations
1. Go to **Stores** → your store → **Settings** → **Integrations**
2. Select the analytics platform
3. Enter your pixel/measurement ID or API key:
* **Google Tag Manager**: Container ID (GTM-XXXXX)
* **Meta Pixel**: Pixel ID
* **Klaviyo**: API Key
4. Events begin flowing immediately
### Supported Chat Integrations
The analytics system also initialises chat widgets when configured:
* Front Chat
* Superchat
* Tawk.to
* Intercom
## Troubleshooting
Check that your pixel ID is correct and the integration is enabled. Server-side events may take up to 24 hours to appear in some dashboards due to platform processing delays.
Ensure your analytics platform is configured for the correct currency. storekit sends values in the store's local currency. Note that prices in events are in minor units (pence/cents) unless otherwise specified.
Anonymous visitors are tracked with a device-based ID. User identity is associated once they provide their email at checkout.
Analytics are disabled when viewing the store in Store Designer mode to avoid polluting your data with test traffic.
# Performance
Source: https://storekit.com/docs/privacy-security/performance
Learn how storekit delivers fast, reliable ordering experiences worldwide with global CDN, optimised images, edge caching, and millisecond-level response times.
storekit is built for speed. Every millisecond counts when customers are ready to order, so we've designed our platform to deliver lightning-fast experiences worldwide.
## Multiple Layers of Caching
storekit uses a layered caching strategy to ensure your menus and store information load instantly:
1. **Browser caching**: Returning customers see your menu even faster as common elements are stored locally
2. **Edge caching**: Your store data is cached at servers located close to your customers around the world
3. **Application caching**: Frequently accessed data is kept ready in memory for immediate retrieval
This means whether your customer is ordering from London, New York, or Sydney, they get the same snappy experience.
## Global Edge Network
Rather than serving all requests from a single location, storekit distributes your store data across a global network of edge servers. When a customer opens your ordering page:
* Their request goes to the nearest server, not one halfway around the world
* Menu data, images, and store information are served locally
* Page loads are consistently fast regardless of customer location
## Real-World Performance
| Metric | Typical Performance |
| ------------------- | ------------------- |
| Menu page load | Under 1 second |
| Add to basket | Instant |
| Checkout load | Under 1 second |
| Global availability | 99.99% uptime |
These are typical figures, not a guarantee. Incidents do happen, including ones caused by the upstream providers storekit runs on. Current and past incidents are published at [status.storekit.com](https://status.storekit.com), where you can also subscribe to updates — check it first if the dashboard or your ordering pages are slow or failing.
## Optimised for Mobile
Over 70% of online orders are placed on mobile devices. storekit is optimised for mobile performance:
* **Compressed images**: Menu photos are automatically optimised for fast loading without sacrificing quality
* **Minimal data transfer**: Only essential data is loaded, reducing wait times on mobile networks
* **Progressive loading**: Customers can start browsing while remaining content loads in the background
Fast ordering pages don't just improve customer experience—they also increase conversion rates. Studies show that every second of delay can reduce conversions by up to 7%.
# Security Policy
Source: https://storekit.com/docs/privacy-security/security-policy
How storekit protects your data and maintains platform security including encryption, access controls, audit logging, vulnerability disclosure, and compliance.
storekit is committed to protecting the security of your data and maintaining a secure platform for merchants and their customers.
## Infrastructure Security
* **Encryption in transit**: All data transmitted to and from storekit uses TLS 1.2 or higher
* **Encryption at rest**: Customer and transaction data is encrypted using AES-256
* **Cloud hosting**: Infrastructure hosted on industry-leading cloud providers with SOC 2 compliance
* **Network security**: Firewalls, intrusion detection, and DDoS protection
## Application Security
* **Secure authentication**: Support for strong passwords and two-factor authentication (2FA)
* **Session management**: Automatic session timeouts and secure cookie handling
* **Input validation**: Protection against common vulnerabilities including SQL injection and XSS
* **Regular updates**: Continuous security patches and dependency updates
## Payment Security
* **PCI DSS compliant**: storekit is certified PCI DSS Level 1, the highest level of payment security certification
* **Tokenisation**: Card details are tokenised and never stored on storekit servers
* **3D Secure**: Support for Strong Customer Authentication (SCA) and 3D Secure 2
## Operational Security
* **Access controls**: Role-based access with principle of least privilege
* **Audit logging**: Comprehensive logging of administrative actions
* **Employee training**: Regular security awareness training for all staff
* **Incident response**: Documented procedures for security incident handling
## Reporting Security Issues
If you discover a security vulnerability, please report it responsibly by emailing **[security@storekit.com](mailto:security@storekit.com)**. We appreciate your help in keeping storekit secure and will acknowledge receipt within 48 hours.
Do not publicly disclose security vulnerabilities until we have had an opportunity to address them.
# Review Management
Source: https://storekit.com/docs/review-management
View customer feedback, respond to Google reviews, and track review performance and ratings from the storekit Feedback dashboard for your stores.
The **Feedback** dashboard brings together customer ratings, Google reviews, item feedback, and Smart Reviews.
Open **Feedback** from the storekit dashboard.
## Overview
The Overview tab shows review performance across your stores for the selected date range.
| Metric | Description |
| -------------- | -------------------------------------------------------- |
| Overall Rating | Average rating across reviews |
| Total Reviews | Total number of reviews received |
| Response Rate | Percentage of feedback requests that received a response |
| With Comments | Number of reviews that included a written comment |
The dashboard also includes:
* Rating and review volume over time
* Rating distribution from 1 to 5 stars
* Rating by store
* Recent reviews
Use the store selector to view feedback for all stores or an individual location/store.
You can also **Print** or **Export** the report.
## What happens after a guest leaves a rating
A storekit rating is private feedback. It appears in your **Feedback** dashboard and nowhere else — storekit never posts a rating, comment, or review to Google or any other platform on the guest's behalf.
What the guest sees after choosing a star rating depends on the rating:
| Rating | What the guest sees |
| --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 5 stars | The **leave a review** dialog, listing your Smart Review links ("Tap on a link below to share your feedback"). If only one link is configured, it opens automatically in a new tab. |
| 1–4 stars | A private comment box asking about their experience, with optional detailed ratings. The response stays in your Feedback dashboard. |
Three points worth repeating to your managers:
* **Only a 5-star rating shows the Google prompt.** The threshold is fixed — a 3- or 4-star rating never shows review links, and there is no setting in the dashboard to change this.
* **The guest writes the Google review, not storekit.** The prompt links to Google's own "Write a review" page. Whether the guest follows the link and what they write is up to them; the storekit rating itself is never sent to Google.
* **Organic Google reviews are unaffected.** Guests can always review you on Google directly, whatever they rated — or didn't rate — in storekit.
The 5-star prompt only appears for stores with at least one Smart Review link saved, which requires a storekit+ subscription. See [Customer feedback and smart reviews →](/docs/guides/marketing/customer-feedback) for setting up the links.
## Google reviews
Connect your Google Business Profile to sync Google reviews with storekit.
Go to **Google reviews** and select **Sign in with Google** to connect your account.
Once connected, Google review activity can be viewed from the Feedback dashboard.
Google review reporting separates reviews generated through storekit from organic Google reviews, helping you track how much review growth is coming from storekit.
### Linking each store to its Google location
You connect a Google account once for your whole account, then link each storekit store to its Google Business location individually — storekit does not match stores to locations automatically. After connecting, a banner confirms **Google Business Profile connected. Link your stores below.**
On the **Google reviews** tab, select the round Google icon on the right, then **Manage store links**. If no store is linked yet, the page shows **Link a store to get started** with a **Link a store** button that opens the same dialog.
The **Manage store links** table lists every store with its **Google Location**. A linked store shows its Google location name; a store that still needs linking shows **Not linked**.
Select **Link** next to the store. Choose the **Google Business account**, then pick the matching **Google location** from the list — each shows its address, star rating, and review count — and select **Link location**.
Link each remaining store the same way. A just-linked store shows **Store linked - syncing reviews**; the first sync can take a few minutes.
If the list shows **No locations found for this account**, the selected **Google Business account** doesn't manage that location. Try another account in the dropdown, or sign in with a Google account that has access to the location in Google Business Profile.
You can also link or unlink a single store from **Stores** → your store → **Settings** → **Integrations** → **Google Business Profile**.
To remove a link, select **Unlink** next to the store in **Manage store links**.
## Reply to reviews
The Reply to reviews tab lets you manage Google reviews from storekit.
A Google Business Profile must be connected before this section can be used.
Go to **Reply to reviews** and select **Sign in with Google** to connect your account.
## Item feedback
Item feedback shows ratings left against individual menu items.
The summary includes:
| Metric | Description |
| --------------- | ------------------------------------------------- |
| Items Reviewed | Number of unique menu items reviewed |
| Avg Item Rating | Average rating across reviewed items |
| Total Feedback | Total number of individual item ratings |
| Sentiment | Number of positive, negative, and neutral ratings |
Use the date and store filters to change the feedback shown.
## Smart reviews
Smart Reviews direct customers to your linked review platforms after receiving positive feedback.
The Smart reviews tab shows:
* Total review link clicks
* Clicks by review platform
Select **Manage review links** to update the review platforms linked to the store.
Smart Reviews are available with a storekit+ subscription. Contact our [Support team](/docs/getting-started/contact-support) if you'd like to enable this feature.
# Square gift card redemption
Source: https://storekit.com/docs/untitled-page-3
Accept Square gift cards in storekit for online orders and pay-at-table, with full or partial redemption and split payments for any remaining balance.
Square gift cards can be redeemed through storekit when placing orders or paying a bill.
Square gift card redemption requires a **storekit+ subscription**.
## Capabilities
### Gift Card Redemption
Customers can apply Square gift cards at checkout.
The available balance is checked before redemption, and customers can apply up to the available gift card balance or the remaining order amount.
Only the amount applied is deducted from the gift card. Any remaining balance stays on the card for future use.
### Supported Payment Scenarios
Apply gift cards during checkout for delivery, pickup, or dine-in orders
Use gift cards when settling the bill at pay-at-table venues
### Split Payments
When a gift card doesn't cover the full amount:
1. The gift card balance is applied first
2. The remaining balance is charged to another payment method (card, Apple Pay, etc.)
This allows customers to use gift cards of any value without needing exact amounts.
## How It Works
1. Customer enters their Square gift card code at checkout
2. Square validates the code and returns the available balance
3. Customer confirms the redemption amount
4. The balance is deducted and the order/bill is updated
5. Any remaining balance is displayed for future reference
## Configuration
Square gift cards are self-service and can be connected from the storekit dashboard.
Square gift card redemption is only available with a **storekit+ subscription**.
To connect Square gift cards:
1. Go to **Stores** → your store → **Settings → Integrations**
2. Click **Square Gift Cards**
3. Click **Connect to Square**
4. Sign in to your Square account
5. Select the Square location to use for the store
6. Enable gift card redemption at checkout
Once connected, guests can redeem Square gift cards in the checkout flow.
## Balance Enquiry
Customers can check their Square gift card balance before applying it to an order.
Balance checks are separate from redemption and do not deduct any funds.
## Refunds
When a Square gift card payment is refunded, the refunded amount is credited back to the original gift card.
Partial refunds are supported.
If an order fails after a Square gift card has been redeemed, storekit attempts to return the redeemed amount to the gift card automatically.
## Support
If you need help setting up or troubleshooting Square gift cards, contact [storekit Support](/docs/getting-started/contact-support).
# llms.txt
Source: https://storekit.com/docs/developers/agents/ordering/llms-txt
The plain-text llms.txt files a storekit ordering host serves for the platform, each brand and each venue, so an LLM crawler can read the menu.
**Who this is for:** a crawler or model building an index customers ask questions of.
storekit ordering pages are a client-side app, so a crawler that does not run JavaScript sees an empty document. Every ordering host also serves plain-text descriptions following the [llmstxt.org](https://llmstxt.org) convention, rendered from the same data the pages use.
## Paths
| Path | Answers with |
| -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `GET /llms.txt` | On a brand's own domain, that brand's file. On the shared ordering host, what the host is and where a store's own file lives. |
| `GET /{venueSlug}/llms.txt` | One venue: summary, ordering methods, address, opening hours, contact details and policies. |
| `GET /{venueSlug}/llms-full.txt` | The same, plus the full menu — every category, item, price and dietary tag. |
| `GET /b/{brandSlug}/llms.txt` | A brand and its locations. `/stores/{brandSlug}/llms.txt` serves the same file. |
Responses are `text/plain`, cached for 15 minutes at the edge. A venue or brand that does not resolve is a `404`; a brand that resolves with no locations taking orders still returns a file, saying so.
A venue file is Markdown-shaped: an `H1` with the venue name, a one-line summary, then `## Ordering`, `## Location and opening hours`, `## Contact`, `## Menu` on the full file, `## Policies` and `## Notes`. A very long menu is truncated with a note pointing at the menu page.
These files are a snapshot for reading, not a source of truth for ordering. Availability and opening state change during service, and a crawler's copy will be stale — an agent that needs a current answer should use the [MCP endpoint](/docs/developers/agents/ordering/mcp-endpoint).
The host's `robots.txt` allows the agent crawlers by name, so these paths and the [UCP profile](/docs/developers/agents/ordering/ucp) are unambiguously open to them.
# MCP Endpoint
Source: https://storekit.com/docs/developers/agents/ordering/mcp-endpoint
Connect an AI assistant to a storekit store over MCP: read a venue's menu, item options, fulfillment methods and time slots, and build a priced cart.
**Who this is for:** an assistant or agent app acting for the customer, outside their browser.
Every storekit ordering host is also a remote [MCP](https://modelcontextprotocol.io) server. An assistant that is nowhere near the customer's browser — ChatGPT, Claude, an agent app, an IDE — can connect to it, read a venue's menu, quote a price and build a cart the customer then opens to pay.
## Endpoints
There are two scopes, and both are reached on the store's own ordering host:
| Endpoint | Scope |
| ----------------------------------------- | --------------------------------------------------------- |
| `POST https://{host}/{venueSlug}/api/mcp` | One venue — for an agent already talking about a location |
| `POST https://{host}/api/mcp` | Every venue of the brand on that host, resolved per call |
`{host}` is the domain the store's ordering pages are served from, such as `order.storekit.com`. Both endpoints are scoped by that host, so a brand on its own domain can only ever answer for its own venues.
Use the brand endpoint when the customer has not said which branch they want: `find_venues` returns the slug every other tool then takes as its `venue` argument. Use the venue endpoint when the location is already settled.
A `GET` or `HEAD` on either endpoint returns `200` and a line saying what the endpoint is, so a client can probe it before opening a session.
## Protocol
JSON-RPC 2.0 over HTTP, one message per `POST`. The methods implemented are `initialize`, `ping`, `tools/list` and `tools/call`; MCP revisions `2025-06-18`, `2025-03-26` and `2024-11-05` are all answered in the revision the client asks for.
```bash theme={null}
curl -X POST https://order.storekit.com/gordon-ramsay-plane-food-1/api/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search_menu",
"arguments": { "query": "something vegan" }
}
}'
```
Every result is JSON in a text content block, repeated as `structuredContent` for clients that read it. The endpoint is stateless: `initialize` returns no session id and nothing is remembered between requests, so a conversation carries the venue slug and the cart id rather than a session.
Errors split by who can act on them. A malformed argument is a JSON-RPC `-32602` naming the parameter; anything the assistant could recover from — no such category, no match, a venue that stopped accepting orders — comes back as a tool result with `isError: true` whose text says what to do next.
## Read Tools
| Tool | Description |
| --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `find_venues` | List the brand's venues, filtered by name, town or postcode. Returns the slug the other tools take. |
| `get_menu` | The venue's menu: every category with its items, prices, dietary tags and availability. A very long menu is summarised, and a category name returns that category in full. |
| `search_menu` | Search the menu by dish name, category or description. For menus too long to return whole. |
| `get_item` | One item in full: the allergens it contains and may contain (`allergens.contains`, `allergens.mayContain`, from the 14 UK allergens; `null` when the venue has declared nothing, empty lists when it has declared the item allergen-free), its nutrition where the venue publishes it (`nutrition`: kcal, then grams; `null` otherwise), how many it serves on a catering venue (`servings`), and every option group, how many choices it takes and what each costs. Both fields describe the base item; an option that adds allergens or nutrition carries its own `allergens` / `nutrition`. |
| `get_venue_info` | The venue itself: name, address, phone number, website, description, whether it is open now, today's hours, the full week's opening hours (schema.org `OpeningHoursSpecification`) and the ordering methods it offers. |
| `get_available_fulfillment` | How the venue can be ordered from, the minimum spend for each method, whether it is open now, and today's hours. |
| `get_available_slots` | The delivery or collection slots still free on a given day. |
`get_menu` and `search_menu` both take optional `excludeAllergens` and `diets` lists. `excludeAllergens` names any of the 14 UK allergens (`celery`, `gluten`, `crustaceans`, `fish`, `eggs`, `lupin`, `milk`, `molluscs`, `mustard`, `nuts`, `peanuts`, `sesame`, `soya`, `sulphites`) and leaves out every item that contains or may contain one of them; an item with no allergen information is kept, since untagged is not the same as free of it. `diets` names any of `halal`, `kosher`, `vegan`, `vegetarian`, `gluten free` and `dairy free`, and keeps only items tagged as suiting every one of them. These are the same rules the ordering page applies to its own allergen and diet filters, and the result echoes the filters it applied under `filters`.
On the brand endpoint every tool except `find_venues` takes an extra `venue` argument, and a slug that does not belong to that brand is refused with the brand's own list rather than answered from another brand's menu.
Reads carry `readOnlyHint`, so a client can call them without asking the customer first. Prices are formatted strings in the venue's currency, descriptions are stripped and truncated, and every list is capped.
Fulfillment methods are reported from what the venue payload proves: Delivery, Pickup and InStore. Catering is not offered over MCP.
## Cart Tools
The cart capability follows the [UCP cart MCP binding](https://ucp.dev/2026-08-25/specification/shopping/cart/mcp/) exactly, so a UCP client needs no mapping table.
| Tool | Description |
| ------------- | ------------------------------------------------------------------------------------------------ |
| `create_cart` | Build a cart at this venue from menu items, priced in the venue's currency. |
| `get_cart` | Re-read and re-price a cart by id. |
| `update_cart` | Replace the cart's lines. A full replacement, not a patch: send every line the cart should hold. |
| `cancel_cart` | Discard the cart. |
What the binding means in practice:
* Every call carries `meta["ucp-agent"]` with your agent profile. A call without it is rejected.
* The cart id is a top-level `id`, never nested inside `cart`.
* Amounts are integer minor units (`450` is £4.50).
* A business problem is a successful result carrying `messages[]` — a line that stopped being sellable is reported there rather than vanishing.
* Lines are named by item id with options in brackets, `BURGER(CHEESE;BACON:2)`, the same grammar the [basket prefill links](/docs/developers/basket-prefill) use.
A cart holds intent, not prices: every operation re-resolves and re-prices it against the menu as it is right now, so a stored cart cannot quote a figure the venue page would contradict. Carts expire 24 hours after their last write, and nothing customer-scoped is stored in one.
A cart is not an order, and these tools speak only for the customer's side. Nothing here reads a store's order queue, edits a menu or changes a setting. The tools return a `continue_url` the customer opens to review the cart and pay on the venue's page — there is no checkout, payment or discount tool, and no order is placed until they finish there.
## Related
The profile that advertises these endpoints and the cart capability.
The separate tool set an agent calls inside the customer's browser.
# Ordering Agents Overview
Source: https://storekit.com/docs/developers/agents/ordering/overview
How a customer's AI agent orders from a storekit store: WebMCP browser tools, a remote MCP endpoint for assistants, UCP discovery, and llms.txt for crawlers.
Everything in this section faces the customer. The agent is buying lunch on someone's behalf, so it has to answer the same questions the customer does: which venue, what is on the menu, what does it cost, is it available now. storekit answers those questions over four surfaces, each read by a different kind of customer-side agent. This page is the map; each surface has its own reference page.
Nothing here is for the restaurant's own side of the counter. At their most permissive these surfaces read a public menu and fill a basket; they do not change a menu, see an order queue or touch a store's settings, and no credential on this page grants any of that.
## Which Surface You Want
An agent inside the customer's browser, on the page they are looking at.
An assistant somewhere else — ChatGPT, Claude, an IDE — talking to a venue.
A commerce platform that reads a profile before it connects to anything.
A crawler that wants plain text instead of a JavaScript app.
Every reader below is acting for the customer, never for the restaurant:
| Surface | The reader | Where it runs | Transport |
| ------------- | --------------------------------- | --------------- | ----------------------------------- |
| WebMCP tools | The customer's own browser agent | In the open tab | `document.modelContext`, no network |
| MCP endpoint | A remote assistant or agent app | Anywhere | JSON-RPC over HTTP `POST` |
| UCP discovery | A commerce platform or agent host | Anywhere | Cached JSON over HTTP `GET` |
| llms.txt | An LLM crawler | Anywhere | Plain text over HTTP `GET` |
The first two share the shaping and pricing rules, so a burger is described, priced and refused on the same grounds whichever one asks — but they are not the same tools. Their names, arguments and writes differ, and a client cannot swap one for the other: WebMCP reads the page the customer has open and writes to the basket in front of them, while the MCP endpoint reads the public API and builds a cart that outlives the call.
## What a Customer's Agent Can and Cannot Do
On the two tool surfaces, reads need no credential and writes stop before money. UCP discovery and `llms.txt` are narrower: a profile and a plain-text snapshot, not tools.
Over the WebMCP and MCP tools:
* An agent can read a venue, its menu, an item's option groups, the ordering methods it accepts and whether it is open. Remaining time slots are an MCP endpoint read only.
* An agent can put items in a basket or a cart, change quantities and choose a fulfillment method.
* An agent cannot pay. There is no checkout tool, no Pay at Table settlement and no discount handling. The customer opens the venue page to review the basket and pay, and a cart built through the MCP endpoint comes back with a link for exactly that.
* An agent is never handed customer records. Nothing on these surfaces reads or stores an account, an address book or an order history.
* An agent cannot act as the restaurant. There is no tool for editing a menu, snoozing an item, reading the order queue or changing store settings — those are the operator's, through the [dashboard](https://dashboard.storekit.com) and the [webhooks and REST API](/docs/developers/introduction).
Read tools carry MCP's `readOnlyHint` annotation and basket writes do not, which is what lets a well-behaved client call a read on its own and ask the customer before a write.
## Current Status
These surfaces are early. Treat the tool names and payload shapes as unstable until a page says otherwise, and expect the WebMCP half to move with the standard it follows.
| Surface | Status |
| ------------- | -------------------------------------------------------------------------------------------------------- |
| WebMCP tools | Live on `order.storekit.com` under a Chrome origin trial, enabled per account by storekit, Chromium-only |
| MCP endpoint | Live for every venue and brand on the ordering host, read tools plus the UCP cart tools |
| UCP discovery | Live, UCP `2026-08-25`, declaring the MCP transport and the cart capability |
| llms.txt | Live for the platform, every brand and every venue |
## For the Restaurant Side
A staff-facing interface — an assistant a restaurant's own team can ask about its orders and menu — is a separate piece of work and is not documented yet. When it arrives it will be its own section under Developers, on its own paths, because it answers to the restaurant rather than to a customer and is credentialled accordingly. Nothing on the four pages above changes when it lands.
Building against any of these, or want them turned on for your stores? [Contact support](/docs/getting-started/contact-support), or use the [storekit MCP/API Access Request](https://t09czsyu90l.typeform.com/to/G6rIJWNv) form if you also need the [REST API](/docs/developers/introduction#requesting-api-access).
# UCP Discovery
Source: https://storekit.com/docs/developers/agents/ordering/ucp
The Universal Commerce Protocol profile a storekit ordering host publishes at /.well-known/ucp: the venues it sells for and their MCP cart endpoints.
**Who this is for:** a commerce platform or agent host that connects customers to merchants.
A [UCP](https://ucp.dev/2026-08-25/specification/overview/) client reads a profile before it connects to anything: which services a business speaks, over which transport, at which endpoint, and which capabilities those endpoints implement. A storekit ordering host publishes that profile, and the endpoints it names are the customer-facing [MCP endpoints](/docs/developers/agents/ordering/mcp-endpoint).
## Paths
| Path | Answers with |
| ------------------------------------------------ | ------------------------------------------------------------- |
| `GET https://{host}/.well-known/ucp` | Every venue the host sells for, each as its own service entry |
| `GET https://{host}/{venueSlug}/.well-known/ucp` | That one venue |
One host sells for many venues and each has its own MCP endpoint, so the host profile lists them — capped at 25, like every other agent-facing list — and an agent already talking about a venue reads the venue path instead. Which venues appear comes from the host itself, so a brand on its own domain advertises that brand's locations and nothing else.
Responses are JSON, cached for 15 minutes and open to any origin. A host with no venues, or a venue slug that does not resolve, is a `404`: no profile beats a profile with no endpoint in it.
## Profile
```json theme={null}
{
"ucp": {
"version": "2026-08-25",
"services": {
"dev.ucp.shopping": [
{
"id": "gordon-ramsay-plane-food-1",
"version": "2026-08-25",
"spec": "https://ucp.dev/2026-08-25/specification/overview",
"transport": "mcp",
"endpoint": "https://order.storekit.com/gordon-ramsay-plane-food-1/api/mcp",
"schema": "https://ucp.dev/2026-08-25/services/shopping/mcp.openrpc.json"
}
]
},
"capabilities": {
"dev.ucp.shopping.cart": [
{
"version": "2026-08-25",
"spec": "https://ucp.dev/2026-08-25/specification/shopping/cart",
"schema": "https://ucp.dev/2026-08-25/schemas/shopping/cart.json"
}
]
},
"payment_handlers": {}
}
}
```
| Field | Meaning |
| --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `services["dev.ucp.shopping"]` | One entry per venue. Entries differ only by `endpoint`, and each `id` is the venue slug the rest of the API speaks. |
| `transport` | `mcp` only. It is the only transport the host serves; UCP's in-page transport is the embedded iframe protocol, which these pages do not listen for. |
| `schema` | The binding a client validates calls against, on both the service entry and the capability. |
| `capabilities["dev.ucp.shopping.cart"]` | The four cart tools on the declared endpoint: `create_cart`, `get_cart`, `update_cart`, `cancel_cart`. |
| `payment_handlers` | Declared empty on purpose. Payment is settled on the venue's own page, so there is no handler for a platform to tokenise against — an empty object says "none offered" where a missing key reads as an unfinished profile. |
Each declared endpoint answers a `GET` probe with `200`, and the ordering host's `robots.txt` names the agent crawlers so the well-known path is unambiguously allowed to them.
# WebMCP Tools
Source: https://storekit.com/docs/developers/agents/ordering/webmcp
The WebMCP tools a storekit ordering page registers with the browser, so an AI agent in the customer's tab can read the menu and fill the basket.
**Who this is for:** an agent acting for the customer, running in the browser tab they are ordering in.
When an AI agent in a customer's browser helps them order, it otherwise has to read the page's markup and simulate clicks — slow, and wrong as soon as the layout changes. [WebMCP](https://github.com/webmachinelearning/webmcp) is a proposed web standard that takes the direct route: the page registers tools with the browser, and the agent calls them with structured arguments and gets structured data back.
A storekit ordering page registers its tools with the browser through `document.modelContext`. There is nothing to install and no key to obtain: an agent that supports WebMCP finds the tools on the page it is already on.
## How It Works
The tools act on the tab the customer is looking at, not on a copy of it.
* Reads answer from the page's own state — the venue that is loaded, the menu as it is filtered for this customer, the basket as it stands. An agent is never told an item is orderable that the page would refuse.
* Writes go through the same actions the page's own buttons use, so a line an agent adds behaves like one the customer added: the same pricing, the same option validation, the same basket the customer sees update in front of them.
* Prices come back as formatted strings in the venue's currency, and descriptions are stripped of markup and truncated. Results are for reading aloud, not for rendering.
Nothing leaves the tab. There is no MCP server involved and no transport: the agent calls a JavaScript function in the page.
## Tools
The agent picks a tool from its description. Every tool below is registered on every ordering page where WebMCP is enabled.
### Venue and Menu
| Tool | Description |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `get_venue_info` | Name, address, opening hours, whether the venue is open right now, and the ordering methods it accepts. |
| `search_menu` | Search the menu by dish name, category or description, the way a customer asks for it. Returns matching items with price, dietary tags and whether they can be ordered now. Items hidden by the filters switched on on the page are left out. |
| `get_menu_item` | One item in full: description, price, dietary tags, the allergens it contains and may contain (`null` when the venue has declared nothing), its nutrition where the venue publishes it, how many it serves on a catering venue, and the option groups that have to be chosen when ordering it — each option carrying its own allergens and nutrition where it adds any. Takes an optional `category` for a name that appears in more than one category. |
| `get_menu_filters` | The filters the page offers — allergens to exclude, diets to require and any filters of the venue's own — and which are switched on right now, with how many items remain. |
| `set_menu_filters` | Filter the menu the customer is looking at: `excludeAllergens` (`nuts`, `gluten`, `milk`…), `diets` (`vegan`, `vegetarian`, `halal`, `kosher`, `gluten free`, `dairy free`) and `venueFilters` by key. Each list given replaces that kind of filter; pass `[]` to clear one. |
### Basket
| Tool | Description |
| -------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| `get_basket` | The items in the basket with quantities, chosen options and the basket total. |
| `add_to_basket` | Add one or more items with their options. Items that cannot be added are reported back and the rest are still added. |
| `set_basket_item_quantity` | Change how many of a basket line the customer has, or remove the line with a quantity of `0`. |
| `set_fulfillment_method` | Set Delivery, Pickup or InStore, limited to the methods the venue accepts. |
The three basket tools and `set_menu_filters` are the only writes, and they are marked as writes — a client that respects `readOnlyHint` asks the customer before calling one. `set_menu_filters` changes what the customer sees on the page, exactly as the page's own filter controls do — and only where those controls exist: on a venue whose page has no allergen and diet filters, `get_menu_filters` lists none and `set_menu_filters` refuses them, so an agent can never hide dishes the customer has no way to bring back. Payment, discount codes and opening checkout are not exposed: the customer reviews and pays on the page.
Items are named to a write by the id the reads publish, with any chosen options in brackets — `BURGER(CHEESE;BACON:2)` — the same grammar the [basket prefill links](/docs/developers/basket-prefill) use. An item whose options are nested more than one level deep is returned with a link to its page instead, because a choice tree that deep produces baskets nobody ordered.
## Where the Tools Are Available
WebMCP is a proposal, not a shipped browser API. The rollout below tracks Chrome's, and will widen when the API ships ungated.
| | Status |
| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Browsers | Chromium-based browsers with WebMCP support. The page feature-detects and registers nothing elsewhere. |
| Domain | `order.storekit.com`. The Chrome origin trial token is bound to that exact origin, so stores on their own domain have no tools until Chrome ships the API. |
| Accounts | Off by default and enabled per account by storekit, so the tools can be switched off without a deploy. |
| Kiosk | Never. A fixed terminal has no customer agent. |
| Staff devices | Nothing separate. A member of staff opening an ordering page gets the same customer-side tools as anyone else; there is no staff or operator tool set here. |
| storekit app | Never. Ordering inside the iOS or Android app registers no tools. |
The page also opts into an origin-isolated agent cluster, which WebMCP requires. Nothing is downloaded on a browser without WebMCP: feature detection happens first, and the tools are fetched only after the page is interactive.
## Trying the Tools
Turn on `chrome://flags/#enable-webmcp-testing`, or use a WebMCP-capable agent extension.
Load a venue's ordering page and let it finish rendering.
Ask the agent what tools the page offers. It should list the nine above. If it lists none, work through the table above before assuming anything: a browser without WebMCP, a domain other than `order.storekit.com`, a kiosk or in-app page, or a page that has not finished loading all register nothing, and the tools are also off until storekit enables them for the account — [contact support](/docs/getting-started/contact-support).
"What's vegan here?", then "add two of those" — the basket in the tab fills as the agent works, and the customer pays on the page.
## What Is Not Here Yet
* **Checkout.** No tool opens or completes checkout. Payment stays a human step, on the page.
* **Custom domains.** Whitelabel domains get no tools while the origin trial is per-origin.
* **Catering and Pay at Table.** Neither flow is exposed; the tools cover Delivery, Pickup and InStore ordering.
* **Order history.** There is no tool for past orders or order status.
For an agent that is not in the customer's browser, use the [MCP endpoint](/docs/developers/agents/ordering/mcp-endpoint) instead — the same menu shaping over HTTP, with its own tool names and a cart rather than the page's basket.
# Basket Prefill via URL
Source: https://storekit.com/docs/developers/basket-prefill
Pre-populate a customer's basket with PLU codes in the URL. Build re-order links, marketing campaign URLs, and QR codes that open the cart with items added.
You can construct a URL that automatically adds products to a customer's basket when they open your store. This is useful for marketing campaigns, QR codes, re-order links, or any scenario where you want to send a customer directly to checkout with specific items.
## URL Format
```
https://{your-store-domain}/{venueSlug}/basket/{products}
```
The `{products}` parameter is a comma-separated list of items, where each item follows the format:
```
PLU:quantity
```
| Part | Description |
| ---------- | -------------------------------------------------------------------------------------------------------------------------- |
| `PLU` | The PLU (Price Look-Up) code of the product. This is set in your menu configuration and is also used for POS integrations. |
| `quantity` | The number of units to add to the basket. Must be a positive integer. |
### Example
To add 2 units of product `BURGER01` and 1 unit of product `FRIES01`:
```
https://order.storekit.com/my-restaurant/basket/BURGER01:2,FRIES01:1
```
## Modifiers
A product can carry a modifier selection in parentheses, immediately after its quantity. Modifiers are separated by semicolons:
```
PLU:quantity(MODIFIER_PLU:quantity;MODIFIER_PLU)
```
| Part | Description |
| -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `MODIFIER_PLU` | The PLU code of the modifier option. |
| `quantity` | Optional quantity of that modifier. Defaults to `1` when omitted. A quantity above `1` is only accepted when the modifier group allows multiple units of the same option. |
If the same modifier PLU exists in more than one modifier group on the product, it resolves to the first group that carries it, in the order the groups appear on the product.
### Example
To add 2 burgers with cheese (×1) and bacon (×1):
```
https://order.storekit.com/my-restaurant/basket/BURGER01:2(CHEESE:1;BACON),FRIES01:1
```
Products with required modifier groups (for example "Choose a size") can now be prefilled, provided the URL satisfies every required group:
```
https://order.storekit.com/my-restaurant/basket/COFFEE01:1(LARGE)
```
The same product with different modifier selections creates separate basket lines. The same product with an identical selection is merged into one line with the quantities added together.
Tracked inventory is allocated to lines in the order they appear in the URL: each line either fits within the stock left for its product and modifiers, or is skipped.
Modifier groups that are nested inside another modifier option cannot be prefilled.
## How It Works
1. The customer opens the URL.
2. The store loads the menu as usual.
3. Each PLU in the URL is matched against available products.
4. Valid items are added to the basket with the specified quantities.
5. The customer is redirected to the menu page with the basket pre-populated and can proceed to checkout.
## Validation Rules
Each item in the URL is validated individually. Items that fail validation are skipped, and the remaining valid items are still added to the basket. The customer will see a notification listing any items that could not be added.
| Condition | Result |
| ----------------------------------------------------------------- | --------------- |
| PLU not found in the menu | Item is skipped |
| Product is marked as unavailable | Item is skipped |
| Product is out of stock (inventory tracked) | Item is skipped |
| Requested quantity exceeds available stock | Item is skipped |
| Item could not be parsed (e.g. unclosed parenthesis) | Item is skipped |
| Product quantity is not a whole number (e.g. `1.5`) | Item is skipped |
| Modifier PLU not found on the product | Item is skipped |
| Modifier quantity is not a positive whole number | Item is skipped |
| Modifier is unavailable, snoozed, or out of stock | Item is skipped |
| A required modifier group is not satisfied by the URL | Item is skipped |
| The selection exceeds a modifier group's maximum | Item is skipped |
| A modifier quantity exceeds the units the group allows per option | Item is skipped |
| Modifier belongs to (or requires) a nested modifier group | Item is skipped |
Modifier groups with default selections are applied automatically when the URL does not mention that group.
## Query Parameters
You can combine the basket URL with any standard query parameters your store supports. For example, to also apply a discount code:
```
https://order.storekit.com/my-restaurant/basket/BURGER01:2?discount=SAVE10
```
## Finding PLU Codes
PLU codes are configured per product in the storekit dashboard under your menu settings. They are the same codes used for POS integrations. See [PLU Mapping](/docs/guides/integrations/pos/advanced/plu-mapping) for more details on managing PLU codes.
# Customer Details Prefill via URL
Source: https://storekit.com/docs/developers/customer-prefill
Pre-populate customer details like name, email, and phone using URL query parameters. Build seamless checkout links for loyalty, marketing, and CRM workflows.
You can construct a URL that automatically fills in a customer's contact details (name, email, phone, etc.) when they open your store. This is useful for marketing campaigns, loyalty program links, captive Wi-Fi portals, QR codes, or any integration where you already know the customer and want to save them from entering their details manually.
## URL Format
```
https://{your-store-domain}/{venueSlug}?firstName={value}&lastName={value}&email={value}&phone={value}&postCode={value}
```
All parameters are optional — include only the ones you want to prefill.
## Supported Parameters
| Parameter | Description | Example |
| ----------- | ------------------------ | ------------------------ |
| `firstName` | Customer's first name | `firstName=Jane` |
| `lastName` | Customer's last name | `lastName=Smith` |
| `email` | Customer's email address | `email=jane@example.com` |
| `phone` | Customer's phone number | `phone=%2B447700900000` |
| `postCode` | Delivery postcode | `postCode=SW1A%201AA` |
Values containing special characters must be URL-encoded. For example, `+447700900000` becomes `%2B447700900000`, and spaces become `%20`.
## Examples
Prefill just an email address:
```
https://order.storekit.com/my-restaurant?email=jane@example.com
```
Prefill full customer details:
```
https://order.storekit.com/my-restaurant?firstName=Jane&lastName=Smith&email=jane@example.com&phone=%2B447700900000
```
Combine with a discount code:
```
https://order.storekit.com/my-restaurant?email=jane@example.com&discount=WELCOME10
```
## How It Works
1. The customer opens the URL containing query parameters.
2. The store loads the menu as usual.
3. Each recognised parameter is read and used to populate the corresponding field in the checkout form.
4. The query parameters are removed from the URL so they do not appear in the address bar or get shared accidentally.
5. The customer sees their details pre-filled at checkout and can review or edit them before placing an order.
## Combining with Basket Prefill
You can combine customer detail parameters with a [basket prefill URL](/docs/developers/basket-prefill) to send a customer directly to a pre-populated basket with their details already filled in:
```
https://order.storekit.com/my-restaurant/basket/BURGER01:2,FRIES01:1?firstName=Jane&email=jane@example.com
```
## Field Visibility
Prefilled values only appear if the corresponding field is enabled in your store's **User Information Settings** in the dashboard. For example, if the phone number field is disabled for your store, the `phone` parameter will be accepted but won't be visible to the customer at checkout.
The query parameters are removed from the URL after being applied. If the customer refreshes the page, the values will not be re-applied from the URL. However, the fields remain populated for the duration of the session.
# Developer Introduction
Source: https://storekit.com/docs/developers/introduction
Build integrations on top of storekit using the REST API and webhooks. Learn how to authenticate, listen for events, and automate your store operations.
Welcome to the storekit developer documentation. This section covers everything you need to build integrations with storekit.
**Webhooks are the primary way to integrate with storekit.** Direct API access is currently in early access and not widely available.
## Requesting API Access
The API is not publicly available yet, and access is granted case by case while it is in early access. To request it, fill in the [storekit MCP/API Access Request](https://t09czsyu90l.typeform.com/to/G6rIJWNv) form.
Include:
* **What you're building** and the problem it solves
* **Which stores or account** the integration is for
* **The data or actions you need** (for example reading orders, updating item availability)
* **Expected volume** of requests
The storekit team reviews each request and issues API keys during onboarding. If you have a non-technical question about access, [contact support](/docs/getting-started/contact-support).
Most integrations do not need the API. If you only need to react to what happens in your stores, [webhooks](/docs/developers/webhooks/overview) need no approval process — they are a subscription feature you enable yourself under **Settings** → **Developers**.
## Webhooks
Webhooks allow you to receive real-time notifications when events occur in your storekit stores. Use webhooks to:
* **Sync orders** to your POS, kitchen display, or inventory system
* **Trigger automations** when orders are placed, accepted, or completed
* **Monitor store status** and printer connectivity
* **Track payouts** to your bank accounts
* **Receive payment link payments** when a customer pays via a shared payment link
Learn how webhooks work and how to set them up.
Browse all available event types and payloads.
Secure your integration by verifying webhook authenticity.
Fix common webhook issues.
## Ordering Agents
Ordering pages expose their capabilities to a customer's AI agent directly: WebMCP tools for an agent in the customer's browser, a remote MCP endpoint for an assistant elsewhere, a UCP profile for a commerce platform, and llms.txt for crawlers. All four face the customer and none of them need API access. The two MCP surfaces read a menu and fill a basket; the UCP profile and llms.txt are read-only. Store operations stay with the dashboard, the webhooks above and the REST API.
The four customer-side surfaces and which one your reader wants.
The tools an ordering page registers with the browser.
## Getting Started
1. **[Set up an endpoint](/docs/developers/webhooks/setting-up-webhooks)** - Create an HTTPS endpoint in your application to receive webhooks
2. **[Register your endpoint](/docs/developers/webhooks/setting-up-webhooks)** - Add your endpoint URL in the storekit dashboard
3. **[Verify signatures](/docs/developers/webhooks/verifying-signatures)** - Implement signature verification for security
4. **[Handle events](/docs/developers/webhooks/webhook-events)** - Process incoming webhooks and respond with a 2xx status
storekit uses [Svix](https://svix.com) for reliable webhook delivery. You can use the Svix libraries to simplify signature verification.
# Idempotency & Deduplication
Source: https://storekit.com/docs/developers/webhooks/advanced/idempotency
Handle duplicate webhook deliveries safely using the svix-id header. Deduplicate events and design idempotent handlers for at-least-once delivery.
storekit webhooks are delivered with "at least once" semantics. This means if there are issues during delivery (e.g., network problems), a webhook may occasionally be delivered more than once.
## The svix-id Header
Every webhook request includes a `svix-id` header. This ID is:
* **Unique per message** - Each distinct event gets a unique ID
* **Consistent across retries** - The same ID is used when retrying a failed delivery
```
svix-id: msg_2KWPBCMzR5VXYW8xqGDKd0SLnHk
```
## Implementing Deduplication
To ensure you only process each event once, store the `svix-id` and check it before processing:
```javascript theme={null}
app.post('/webhooks', async (req, res) => {
const svixId = req.headers['svix-id'];
// Check if we've already processed this webhook
const alreadyProcessed = await redis.get(`webhook:${svixId}`);
if (alreadyProcessed) {
return res.status(200).send('Already processed');
}
// Mark as processed (with 72-hour expiry)
await redis.set(`webhook:${svixId}`, '1', 'EX', 259200);
// Process the webhook
await processWebhook(req.body);
res.status(200).send('OK');
});
```
```python theme={null}
@app.route('/webhooks', methods=['POST'])
def handle_webhook():
svix_id = request.headers.get('svix-id')
# Check if already processed
if redis_client.get(f'webhook:{svix_id}'):
return 'Already processed', 200
# Mark as processed (72-hour expiry)
redis_client.setex(f'webhook:{svix_id}', 259200, '1')
# Process the webhook
process_webhook(request.json)
return 'OK', 200
```
## When to Use Deduplication
Deduplication is especially important for:
* **Payment processing** - Avoid charging customers twice
* **Order creation** - Prevent duplicate orders
* **Inventory updates** - Ensure accurate stock counts
* **Notification sending** - Don't spam users with duplicate messages
## Storage Options
You can store processed webhook IDs in:
| Storage | Pros | Cons |
| --------- | ------------------ | -------------------------------------------- |
| Redis | Fast, built-in TTL | Requires Redis instance |
| Database | Already available | Slower, needs cleanup job |
| In-memory | Simplest | Lost on restart, not for distributed systems |
Set an expiry of at least 72 hours (3 days) on stored webhook IDs. Retries can occur over approximately 3 days according to the [retry schedule](/docs/developers/webhooks/retry-policy).
Even without deduplication, designing your webhook handlers to be idempotent (producing the same result when called multiple times) is a good practice.
# Rate Limiting
Source: https://storekit.com/docs/developers/webhooks/advanced/rate-limiting
Control how fast storekit delivers webhooks to your endpoint. Set per-second rate limits to protect your systems from spikes during peak ordering periods.
Rate limiting lets you control the maximum number of webhooks delivered to your endpoint per second. This protects your systems from being overwhelmed during high-traffic periods.
## How It Works
When you set a rate limit on an endpoint:
1. Webhooks are queued for delivery
2. Delivery is throttled to stay within your limit
3. Excess webhooks are held and delivered as capacity becomes available
This smooths out traffic spikes, ensuring your endpoint receives webhooks at a manageable pace.
## Setting a Rate Limit
You can configure rate limiting when creating or editing an endpoint:
1. Go to the [Webhooks settings](https://dashboard.storekit.com/developers/webhooks) in your dashboard
2. Click on an endpoint or create a new one
3. In the **Advanced** settings, set your **Rate Limit**
4. Enter the maximum messages per second
5. Save your changes
## Choosing a Rate Limit
Consider these factors when setting your limit:
| Factor | Recommendation |
| ------------------ | ------------------------------------------------------------ |
| Server capacity | Start with what your server can handle comfortably |
| Processing time | If each webhook takes 100ms to process, limit to \~10/second |
| Concurrent workers | More workers = higher sustainable rate |
| Peak traffic | Account for busy periods (lunch rush, promotions) |
### Example Limits
* **Small server / Simple processing**: 10-50 per second
* **Medium infrastructure**: 100-500 per second
* **High-capacity systems**: 1,000+ per second
## Important Considerations
### Queue Buildup
If you consistently receive more webhooks than your rate limit allows, a backlog will form. For example:
* Rate limit: 100/second
* Incoming rate: 200/second
* Result: Queue grows, increasing delivery delays
If your webhook volume consistently exceeds your rate limit, webhooks will be delayed. Monitor your endpoint and increase the limit if needed.
### Retries and Rate Limits
Rate limits apply to all deliveries, including retries. A low rate limit combined with many retries could delay new webhooks.
## When to Use Rate Limiting
Rate limiting is useful when:
* **Your endpoint has limited capacity** - Prevent overload during busy periods
* **Processing is resource-intensive** - Each webhook triggers heavy operations
* **Third-party dependencies** - Your handler calls rate-limited external APIs
* **Shared infrastructure** - Webhook processing competes with other services
Start with a conservative rate limit and increase it as you understand your system's capacity. It's easier to raise a limit than recover from an overloaded server.
# Webhooks Overview
Source: https://storekit.com/docs/developers/webhooks/overview
Receive real-time notifications from storekit via HTTP POST webhooks. Build integrations that react to orders, payments, and store activity instantly.
Webhooks are how storekit notifies your systems of events in real-time. At their core, they are just a `POST` request to a pre-determined endpoint.
## How Webhooks Work
When an event occurs in your store (like a new order being placed), storekit sends an HTTP POST request to your configured endpoint with details about that event.
The endpoint can be whatever URL you want, and you can add them from your storekit dashboard. You normally use one endpoint per service, and that endpoint listens to all of the event types.
For example, you can structure your URL like: `https://www.example.com/storekit/webhooks/`
## Acknowledging Webhooks
The way to indicate that a webhook has been processed is by returning a `2xx` (status code `200-299`) response to the webhook message within **15 seconds**.
It's important to disable CSRF protection for your webhook endpoint if your framework enables it by default.
## Security
Another important aspect of handling webhooks is to verify the signature and timestamp when processing them. This ensures that the webhook actually came from storekit and hasn't been tampered with.
Learn more in the [Verifying Signatures](/docs/developers/webhooks/verifying-signatures) section.
## Quick Tips
* **Respond quickly**: Return a 2xx response as fast as possible. If you need to do complex processing, add the webhook to a queue and process it asynchronously.
* **Handle duplicates**: Webhooks may occasionally be sent more than once. Make your processing idempotent.
* **Verify signatures**: Always verify webhook signatures in production to ensure security.
# Payload Format
Source: https://storekit.com/docs/developers/webhooks/payload-format
Reference for the standard storekit webhook payload structure, including JSON body format, HTTP headers, content type, and the metadata sent with every event.
All webhook payloads follow a consistent JSON structure.
## Standard Payload Structure
```json theme={null}
{
"event": "order.created",
"data": {
// Event-specific data
}
}
```
| Field | Type | Description |
| ------- | ------ | ------------------------------------------------- |
| `event` | string | The event type identifier (e.g., `order.created`) |
| `data` | object | The event payload containing relevant data |
## HTTP Headers
Each webhook request includes the following headers:
| Header | Description |
| ---------------- | ------------------------------------------ |
| `Content-Type` | Always `application/json` |
| `svix-id` | Unique identifier for this webhook message |
| `svix-timestamp` | Unix timestamp when the webhook was sent |
| `svix-signature` | Signature for verifying authenticity |
## Example: Order Created Payload
```json theme={null}
{
"event": "order.created",
"data": {
"id": "ord_abc123",
"code": "A1B2",
"total": 2500,
"tip": 250,
"orderType": "Pickup",
"asap": true,
"createdAt": "2024-01-15T10:30:00Z",
"customer": {
"firstName": "John",
"lastName": "Doe",
"email": "john@example.com",
"phone": "+44123456789"
},
"items": [
{
"name": "Margherita Pizza",
"price": 1200,
"quantity": 1,
"modifiers": []
}
],
"venue": {
"id": 1234,
"name": "My Restaurant",
"slug": "my-restaurant"
}
}
}
```
## Data Types
* **Monetary values**: All monetary values are in the smallest currency unit (e.g., pence for GBP, cents for USD)
* **Timestamps**: All timestamps are in ISO 8601 format (UTC)
* **IDs**: String identifiers for orders, alphanumeric codes for collection codes
# Retry Policy
Source: https://storekit.com/docs/developers/webhooks/retry-policy
Reference for the exponential backoff retry schedule for failed webhook deliveries — including timing, attempt limits, and unreachable endpoint handling.
If your endpoint doesn't return a successful response, storekit will retry the webhook multiple times with exponential backoff.
## What Counts as a Failure?
A webhook delivery is considered failed if:
* Your endpoint returns a non-2xx status code
* Your endpoint doesn't respond within 15 seconds
* The connection to your endpoint fails
## Retry Schedule
Failed webhooks are retried with exponential backoff over approximately 3 days:
| Attempt | Delay After Previous |
| ------- | -------------------- |
| 1 | Immediate |
| 2 | 5 seconds |
| 3 | 5 minutes |
| 4 | 30 minutes |
| 5 | 2 hours |
| 6 | 5 hours |
| 7 | 10 hours |
| 8 | 24 hours |
After all retry attempts are exhausted, the webhook is marked as failed.
## Endpoint Disabling
If all delivery attempts to a specific endpoint fail for a period of **5 consecutive days**, the endpoint will be automatically disabled to prevent further failed deliveries.
To re-enable a disabled endpoint:
1. Go to your storekit Dashboard
2. Navigate to **Settings** → **Developers** → **Manage Webhooks**
3. In the embedded webhooks portal, find the disabled endpoint
4. Re-enable it
## Manual Retries
You can manually retry failed webhooks from the dashboard:
1. Go to your webhook endpoint details
2. Find the failed message in the logs
3. Click **Retry** to resend
## Recovering from Outages
If your service experiences downtime, you can recover missed webhooks:
1. Go to your endpoint in the dashboard
2. Click **Options > Recover Failed Messages**
3. Select a time window to replay
Design your webhook handler to be idempotent so that receiving the same webhook multiple times doesn't cause issues.
# Setting Up Webhooks
Source: https://storekit.com/docs/developers/webhooks/setting-up-webhooks
Configure webhook endpoints in the storekit dashboard, choose which event types to subscribe to, and start receiving real-time event notifications.
## Enabling Webhooks
Webhooks are a subscription feature and have to be enabled on the account before endpoints can be registered.
1. In the dashboard sidebar, go to **Settings** → **Developers**
2. In the **Webhooks** panel, click **Enable Webhooks**
3. Once webhooks are enabled, the same button reads **Manage Webhooks** and opens the webhooks page directly
If the account is not on a plan that includes webhooks, the webhooks page shows an **Upgrade to enable webhooks** button instead of the setup screen.
There is no **Webhooks** entry directly under **Settings** — webhooks are reached through **Settings** → **Developers**.
## Adding an Endpoint
The webhooks page embeds a secure webhooks portal, and endpoint management happens inside that embedded portal rather than in storekit's own screens.
1. Open the webhooks page (**Settings** → **Developers** → **Manage Webhooks**)
2. In the embedded portal, add a new endpoint
3. Enter your endpoint URL (e.g., `https://example.com/webhooks/storekit`)
4. Select the event types you want to receive
5. Save your endpoint
## Endpoint Requirements
Your endpoint must:
* Be publicly accessible via HTTPS
* Accept POST requests
* Return a `2xx` status code within 15 seconds
* Have CSRF protection disabled for this route
## Choosing Event Types
You can subscribe to specific event types or receive all events. We recommend only subscribing to the events you need to minimize unnecessary traffic.
See the [Webhook Events](/docs/developers/webhooks/webhook-events) page for a complete list of available events.
## Testing Your Endpoint
Before going live, test your endpoint to ensure it's working correctly:
1. Send a test event from the embedded webhooks portal
2. Check that your endpoint receives the test webhook
3. Verify your endpoint returns a `2xx` response
During development, you can use tools like [webhook.site](https://webhook.site) or [ngrok](https://ngrok.com) to inspect incoming webhooks.
# Slack Integration
Source: https://storekit.com/docs/developers/webhooks/slack-integration
Send storekit webhook notifications directly to Slack channels. Get instant alerts for new orders, refunds, and store events without writing custom code.
Instead of setting up a custom endpoint, you can connect webhooks directly to Slack and receive event notifications as messages in your Slack channels.
## How It Works
The Slack integration lets you:
* **Skip the code** - No need to build a webhook endpoint
* **Get instant notifications** - Events post directly to your chosen Slack channel
* **Rich formatting** - Messages include structured data from the webhook payload
## Setting Up Slack Integration
1. Go to the [Webhooks settings](https://dashboard.storekit.com/developers/webhooks) in your dashboard
2. Click **Add Endpoint**
3. Select **Slack** instead of entering a URL
4. Click **Connect to Slack** and authorize access
5. Choose the Slack channel where you want to receive notifications
6. Select the event types you want to receive
7. Save your endpoint
## What Messages Look Like
When events occur, you'll receive formatted Slack messages containing:
* **Event type** - The type of event that occurred
* **Key details** - Important information from the payload (order ID, amounts, status, etc.)
* **Timestamp** - When the event happened
Example notification for a new order:
```
🛒 New Order Received
Order ID: ord_abc123
Total: £24.50
Items: 3
Fulfillment: Delivery
View in Dashboard →
```
## Supported Events
You can receive any webhook event type in Slack, including:
* **Order events** - New orders, status changes, cancellations
* **Payment events** - Successful payments, refunds
* **Store events** - Store updates, availability changes
## Use Cases
The Slack integration is ideal for:
* **Real-time order alerts** - Get notified instantly when orders come in
* **Team visibility** - Keep your team informed in a shared channel
* **Quick monitoring** - Watch for important events without building infrastructure
* **Testing** - Easily verify webhooks are firing during development
## Managing Your Slack Endpoint
You can manage your Slack integration just like any other endpoint:
* **View logs** - See delivery history and message content
* **Change channel** - Update which Slack channel receives messages
* **Update events** - Modify which event types are sent to Slack
* **Disable/Enable** - Temporarily pause notifications
The Slack integration uses the same retry policy as regular webhook endpoints. If Slack is temporarily unavailable, we'll retry delivery automatically.
Create separate Slack endpoints for different event types to organize notifications into specific channels (e.g., #orders for order events, #payments for payment events).
# Testing Webhooks
Source: https://storekit.com/docs/developers/webhooks/testing-webhooks
Test your webhook integration before going live. Send sample events from the dashboard, replay deliveries, and develop locally using ngrok or similar tunnels.
Testing your webhook integration before going live is essential for a smooth integration.
## Using the Dashboard
### Send Test Events
1. Open **Settings** → **Developers** → **Manage Webhooks**
2. In the embedded webhooks portal, open your endpoint
3. Select the event type to test
4. Review the test payload and send
### View Webhook Logs
The embedded webhooks portal shows a complete log of all webhook deliveries:
* **Status**: Success or failure
* **Response time**: How long your endpoint took to respond
* **Response code**: The HTTP status code returned
* **Payload**: The exact data sent
## Local Development
During development, your localhost isn't accessible from the internet. Here are solutions:
### Using ngrok
[ngrok](https://ngrok.com) creates a public URL that tunnels to your local server:
```bash theme={null}
# Start your local server on port 3000
npm run dev
# In another terminal, start ngrok
ngrok http 3000
```
Use the ngrok URL (e.g., `https://abc123.ngrok.io/webhooks`) as your webhook endpoint.
### Using webhook.site
[webhook.site](https://webhook.site) provides a free URL that captures all incoming requests:
1. Go to webhook.site
2. Copy your unique URL
3. Add it as a webhook endpoint in storekit
4. Trigger events and inspect the payloads
## Testing Checklist
Before going live, verify:
* [ ] Endpoint returns 2xx status within 15 seconds
* [ ] Signature verification is implemented
* [ ] Timestamp validation rejects old webhooks
* [ ] Handler is idempotent (handles duplicates)
* [ ] Errors are logged for debugging
* [ ] CSRF protection is disabled for the endpoint
## Test Mode vs Live Mode
Test webhooks in your development environment before enabling them in production:
1. Create a separate endpoint for testing
2. Use test/sandbox credentials
3. Verify everything works
4. Switch to production endpoint
# Transformations
Source: https://storekit.com/docs/developers/webhooks/transformations
Modify storekit webhook payloads with custom JavaScript before they reach your endpoint. Change the URL, method, body, or headers without a proxy server.
Transformations allow you to write JavaScript code that modifies webhook properties before they're delivered to your endpoint. You can change the HTTP method, target URL, payload, add custom headers, or even cancel specific webhooks.
## Use Cases
Transformations are useful when you need to:
* **Modify payloads** to match your system's expected format
* **Redirect webhooks** to different URLs based on payload content
* **Add custom headers** for authentication or routing
* **Filter webhooks** by canceling ones you don't need
* **Transform data** (e.g., convert currency formats, rename fields)
## Accessing Transformations
1. Go to the [Webhooks settings](https://dashboard.storekit.com/developers/webhooks) in your dashboard
2. Click on an endpoint to view its details
3. Navigate to the **Advanced** tab
4. Scroll down to the **Transformations** card
5. Toggle the switch to enable transformations
## Writing a Transformation
Transformations use a JavaScript `handler` function that receives the webhook data and returns the modified version.
### Input Properties
The `handler` function receives an object with these properties:
| Property | Type | Description |
| ----------- | ------ | --------------------------------- |
| `method` | string | HTTP method (`"POST"` or `"PUT"`) |
| `url` | string | The endpoint URL |
| `payload` | object | The webhook payload as JSON |
| `eventType` | string | The event type (read-only) |
### Return Properties
Return the same object with your modifications. You can also add:
| Property | Type | Description |
| --------- | ------- | ------------------------------------ |
| `cancel` | boolean | Set to `true` to cancel this webhook |
| `headers` | object | Custom headers to add to the request |
## Examples
### Modify the Payload
Flatten nested data or rename fields:
```javascript theme={null}
function handler(webhook) {
// Add a custom field
webhook.payload.source = "storekit";
// Rename a field
webhook.payload.orderId = webhook.payload.order_id;
delete webhook.payload.order_id;
return webhook;
}
```
### Redirect Based on Payload
Send webhooks to different URLs based on content:
```javascript theme={null}
function handler(webhook) {
if (webhook.payload.priority === "high") {
webhook.url = "https://example.com/webhooks/priority";
}
return webhook;
}
```
### Add Custom Headers
Include additional headers for your endpoint:
```javascript theme={null}
function handler(webhook) {
webhook.headers = {
"X-Custom-Header": "my-value",
"X-Store-ID": webhook.payload.store_id
};
return webhook;
}
```
### Cancel Specific Webhooks
Filter out webhooks you don't want to receive:
```javascript theme={null}
function handler(webhook) {
// Don't send webhooks for test orders
if (webhook.payload.test_mode === true) {
webhook.cancel = true;
}
return webhook;
}
```
### Change HTTP Method
Switch from POST to PUT if needed:
```javascript theme={null}
function handler(webhook) {
webhook.method = "PUT";
return webhook;
}
```
## Testing Transformations
Before saving your transformation:
1. Click **Test** in the transformation editor
2. Select an event type or enter a custom payload
3. Review the transformed output
4. Verify the changes are correct before saving
Canceled webhooks appear as successful deliveries in your logs. Use cancellation carefully to avoid missing important events.
Keep transformations simple and fast. Complex logic may cause timeouts or unexpected behavior.
# Webhook Troubleshooting
Source: https://storekit.com/docs/developers/webhooks/troubleshooting
Diagnose and fix common webhook problems including signature verification failures, incorrect secrets, missing events, and endpoint timeouts in storekit.
Here are common webhook issues and how to resolve them.
## Signature Verification Failing
### Not Using Raw Payload Body
**Problem**: When generating the signature, we use the raw string body of the message payload. If you parse the JSON and then stringify it, the signature won't match.
**Solution**: Always use the raw request body exactly as received:
```javascript theme={null}
// WRONG - parsing and re-stringifying changes the format
const payload = JSON.parse(body);
verify(JSON.stringify(payload), headers); // Will fail!
// CORRECT - use the raw body
verify(rawBody, headers);
```
### Wrong Secret Key
**Problem**: Using the wrong webhook secret or not properly decoding it.
**Solution**:
* Ensure you're using the correct secret for each endpoint (secrets are unique per endpoint)
* Remove the `whsec_` prefix before base64 decoding
### Timestamp Expired
**Problem**: Your server's clock is out of sync, causing valid webhooks to be rejected.
**Solution**: Ensure your server's time is synchronized using NTP.
## Webhooks Not Being Received
### Endpoint Not Accessible
**Problem**: Your endpoint isn't publicly accessible.
**Solution**:
* Ensure your server is running and the endpoint URL is correct
* Check firewall rules allow incoming HTTPS requests
* Verify the endpoint works with a simple curl test
### SSL/TLS Issues
**Problem**: Invalid or expired SSL certificate.
**Solution**: Ensure your endpoint has a valid SSL certificate from a trusted CA.
## Wrong Response Codes
### Returning Errors for Successful Processing
**Problem**: Returning non-2xx status codes even when the webhook was processed successfully.
**Solution**: Always return a 2xx status code when you've successfully received and queued the webhook for processing:
```javascript theme={null}
// CORRECT
app.post('/webhooks', (req, res) => {
queue.add(req.body); // Add to queue for async processing
res.status(200).send('OK'); // Acknowledge immediately
});
```
## Timeouts
### Processing Takes Too Long
**Problem**: Your endpoint takes more than 15 seconds to respond.
**Solution**: Process webhooks asynchronously:
```javascript theme={null}
app.post('/webhooks', async (req, res) => {
// Don't do this - blocks the response
// await processOrder(req.body);
// Do this instead - queue for background processing
await queue.add('process-webhook', req.body);
res.status(200).send('OK');
});
```
## Failure Recovery
### Re-enable Disabled Endpoint
If your endpoint was disabled after consecutive failures:
1. Fix the underlying issue
2. Go to **Settings** → **Developers** → **Manage Webhooks** in the dashboard
3. In the embedded webhooks portal, re-enable the disabled endpoint
### Replay Failed Messages
To recover missed webhooks after an outage:
1. Go to your endpoint details
2. Click **Options > Recover Failed Messages**
3. Select the time range to replay
Check the webhook logs in your dashboard for detailed error messages and response codes from your endpoint.
# Verifying Signatures
Source: https://storekit.com/docs/developers/webhooks/verifying-signatures
Secure your webhooks by verifying the HMAC signature on every request. Confirm payloads come from storekit and have not been tampered with in transit.
Verifying webhook signatures is crucial for security. It ensures that the webhook actually came from storekit and hasn't been tampered with.
## Why Verify?
Since your webhook endpoint is publicly accessible, anyone could send requests to it pretending to be storekit. Signature verification prevents:
* **Spoofed requests**: Attackers sending fake webhooks
* **Replay attacks**: Old webhooks being resent maliciously
* **Data tampering**: Modification of webhook payloads in transit
## Using Svix Libraries (Recommended)
We recommend using the official Svix libraries for verification, which handle all the complexity for you:
```javascript Node.js theme={null}
import { Webhook } from 'svix';
const wh = new Webhook(process.env.WEBHOOK_SECRET);
try {
const payload = wh.verify(rawBody, headers);
// Process the verified payload
} catch (err) {
// Signature verification failed
return res.status(400).send('Invalid signature');
}
```
```python Python theme={null}
from svix.webhooks import Webhook
wh = Webhook(os.environ['WEBHOOK_SECRET'])
try:
payload = wh.verify(raw_body, headers)
# Process the verified payload
except Exception as e:
# Signature verification failed
return Response(status=400)
```
```go Go theme={null}
import svix "github.com/svix/svix-webhooks/go"
wh, _ := svix.NewWebhook(os.Getenv("WEBHOOK_SECRET"))
err := wh.Verify([]byte(rawBody), headers)
if err != nil {
// Signature verification failed
return
}
```
Always use the raw request body for verification. If you parse the JSON first and then stringify it, the signature will not match due to potential formatting differences.
## Manual Verification
If you prefer to verify signatures manually without using the Svix library, follow the steps below.
### Signature Headers
Each webhook includes these headers for verification:
| Header | Description |
| ---------------- | ------------------------------------------- |
| `svix-id` | Unique message identifier |
| `svix-timestamp` | Unix timestamp of when the message was sent |
| `svix-signature` | The signature(s) to verify against |
## Verification Steps
### 1. Extract the Headers
```javascript theme={null}
const svixId = request.headers['svix-id'];
const svixTimestamp = request.headers['svix-timestamp'];
const svixSignature = request.headers['svix-signature'];
```
### 2. Verify Timestamp (Prevent Replay Attacks)
Reject webhooks with timestamps older than 5 minutes:
```javascript theme={null}
const tolerance = 5 * 60; // 5 minutes in seconds
const now = Math.floor(Date.now() / 1000);
const timestamp = parseInt(svixTimestamp, 10);
if (Math.abs(now - timestamp) > tolerance) {
throw new Error('Webhook timestamp too old');
}
```
### 3. Create the Signed Content
Concatenate the webhook ID, timestamp, and body:
```javascript theme={null}
const signedContent = `${svixId}.${svixTimestamp}.${rawBody}`;
```
### 4. Calculate Expected Signature
Use HMAC-SHA256 with your webhook secret:
```javascript theme={null}
const crypto = require('crypto');
// Your secret from the dashboard (remove the 'whsec_' prefix)
const secret = Buffer.from(secretKey.split('_')[1], 'base64');
const expectedSignature = crypto
.createHmac('sha256', secret)
.update(signedContent)
.digest('base64');
```
### 5. Compare Signatures
```javascript theme={null}
const signatures = svixSignature.split(' ');
const isValid = signatures.some(sig => {
const [version, signature] = sig.split(',');
return version === 'v1' && signature === expectedSignature;
});
if (!isValid) {
throw new Error('Invalid webhook signature');
}
```
# Webhook Events
Source: https://storekit.com/docs/developers/webhooks/webhook-events
Reference for every storekit webhook event including order created, accepted, rejected, refunded, item out of stock, and payment status events with payloads.
This page lists all webhook events available in storekit, grouped by category.
## Order Events
Events related to order lifecycle and management.
| Event | Description |
| --------------------------- | --------------------------------------------------------- |
| `order.created` | Triggered when a new order is placed |
| `order.accepted` | Triggered when an order is accepted by the store |
| `order.rejected` | Triggered when an order is rejected by the store |
| `order.canceled` | Triggered when an order is canceled |
| `order.preparing` | Triggered when an order transitions to preparing status |
| `order.ready_for_pickup` | Triggered when an order is marked ready for pickup |
| `order.out_for_delivery` | Triggered when an order is dispatched for delivery |
| `order.pos.dispatch.failed` | Triggered when an order fails to dispatch to a POS system |
| `order.rating.updated` | Triggered when a customer updates their order rating |
| `order.completed` | Triggered when an order is marked as completed |
| `order.refund.created` | Triggered when a refund is issued for an order |
### order.created
Triggered when a new order is placed by a customer.
```json theme={null}
{
"event": "order.created",
"data": {
"id": "ord_abc123",
"code": "A1B2",
"asap": true,
"total": 2500,
"tip": 250,
"deliveryFee": 299,
"discountTotal": 0,
"orderType": "Pickup",
"createdAt": "2024-01-15T10:30:00Z",
"deliveryTime": "2024-01-15T11:00:00Z",
"notes": "Ring doorbell",
"customer": {
"firstName": "John",
"lastName": "Doe",
"email": "john@example.com",
"phone": "+44123456789",
"marketingConsent": true
},
"items": [
{
"name": "Margherita Pizza",
"price": 1200,
"quantity": 1,
"plu": null,
"posId": null,
"taxRate": null,
"modifiers": []
}
],
"venue": {
"id": 1234,
"name": "My Restaurant",
"slug": "my-restaurant",
"address": {
"street1": "123 Main St",
"street2": "",
"city": "London",
"postCode": "W1A 1AA",
"country": "UK",
"companyName": "My Restaurant Ltd",
"coordinates": {
"latitude": 51.5074,
"longitude": -0.1278
}
}
},
"table": {
"id": "tbl_123",
"name": "Table 5",
"covers": 4,
"posId": "pos_tbl_5",
"area": {
"id": "area_1",
"name": "Main Floor",
"posId": null
}
},
"deliveryAddress": {
"street1": "456 Oak Ave",
"street2": "Flat 2",
"city": "London",
"postCode": "E1 6AN",
"country": "UK",
"coordinates": {
"latitude": 51.5155,
"longitude": -0.0722
}
}
}
}
```
### order.accepted
Triggered when an order is accepted by the store. Has the same payload structure as `order.created`.
### order.preparing
Triggered when an order transitions to the preparing status.
```json theme={null}
{
"event": "order.preparing",
"data": {
"order": {
"id": "ord_abc123",
"code": "A1B2",
"status": "preparing"
},
"venue": {
"id": 1234,
"name": "My Restaurant",
"slug": "my-restaurant"
}
}
}
```
### order.ready\_for\_pickup
Triggered when an order is marked as ready for customer pickup.
```json theme={null}
{
"event": "order.ready_for_pickup",
"data": {
"order": {
"id": "ord_abc123",
"code": "A1B2",
"status": "ready_for_pickup"
},
"venue": {
"id": 1234,
"name": "My Restaurant",
"slug": "my-restaurant"
}
}
}
```
### order.completed
Triggered when an order is marked as completed. This fires for individual order completions (via the dashboard, Deliverect, iKentoo, or auto-update) as well as bulk completions.
```json theme={null}
{
"event": "order.completed",
"data": {
"order": {
"id": "ord_abc123",
"code": "A1B2",
"status": "completed"
},
"venue": {
"id": 1234,
"name": "My Restaurant",
"slug": "my-restaurant"
}
}
}
```
### order.pos.dispatch.failed
Triggered when an order fails to dispatch to a POS system.
```json theme={null}
{
"event": "order.pos.dispatch.failed",
"data": {
"order": {
"id": "ord_abc123",
"code": "A1B2",
"total": 2500
},
"venue": {
"id": 1234,
"name": "My Restaurant",
"slug": "my-restaurant"
},
"pos": {
"name": "Zonal",
"error": "Connection timeout: Unable to reach POS endpoint"
},
"retryCount": 3
}
}
```
***
## Store Events
Events related to store status and configuration.
| Event | Description |
| ----------------------------- | ---------------------------------------------------------------------------- |
| `store.opened` | Triggered when a store opens, a snooze ends early, or a timed snooze expires |
| `store.closed` | Triggered when a store closes or is snoozed |
| `store.opening_hours.updated` | Triggered when opening hours are changed |
### store.opened
Triggered when a store is opened, when a snooze is ended early, or when a timed snooze expires automatically.
```json theme={null}
{
"event": "store.opened",
"data": {
"venue": {
"id": 1234,
"name": "My Restaurant",
"slug": "my-restaurant",
"address": {
"street1": "99-101 Regent St",
"street2": "Victory House",
"city": "London",
"postCode": "W1B 4EZ",
"companyName": "storekit",
"coordinates": {
"latitude": 51.5014,
"longitude": 0.1419
}
}
}
}
}
```
### store.closed
Triggered when a store is closed or snoozed.
```json theme={null}
{
"event": "store.closed",
"data": {
"closedReason": "Kitchen closing early",
"closedUntil": "2024-01-15T18:00:00Z",
"venue": {
"id": 1234,
"name": "My Restaurant",
"slug": "my-restaurant",
"address": {
"street1": "99-101 Regent St",
"street2": "Victory House",
"city": "London",
"postCode": "W1B 4EZ",
"companyName": "storekit",
"coordinates": {
"latitude": 51.5014,
"longitude": 0.1419
}
}
}
}
}
```
### store.opening\_hours.updated
Triggered when opening hours are changed for a store.
```json theme={null}
{
"event": "store.opening_hours.updated",
"data": {
"venue": {
"id": 1234,
"name": "My Restaurant",
"slug": "my-restaurant",
"address": {
"street1": "99-101 Regent St",
"street2": "Victory House",
"city": "London",
"postCode": "W1B 4EZ",
"companyName": "storekit",
"coordinates": {
"latitude": 51.5014,
"longitude": 0.1419
}
}
}
}
}
```
***
## Item Events
Events related to menu item availability.
| Event | Description |
| ------------------- | -------------------------------------------- |
| `item.out_of_stock` | Triggered when a menu item goes out of stock |
### item.out\_of\_stock
Triggered when a menu item becomes unavailable. This can happen through several paths:
* **Manual snooze** — an admin snoozes the item from the dashboard
* **Manual disable** — an admin sets the item's availability to off
* **Inventory depletion** — the item's inventory reaches zero after an order
* **Integration sync** — a POS or integration (Deliverect, Lightspeed, Zonal) marks the item as unavailable
The `reason` field indicates why the item went out of stock, and `source` indicates what triggered it.
| Reason | Description |
| -------------------- | ---------------------------- |
| `snoozed` | Item was temporarily snoozed |
| `inventory_depleted` | Item inventory reached zero |
| `disabled` | Item was explicitly disabled |
| Source | Description |
| ------------ | -------------------------------------------- |
| `manual` | Action taken by an admin in the dashboard |
| `order` | Inventory depleted by a customer order |
| `deliverect` | Synced from Deliverect integration |
| `lightspeed` | Synced from Lightspeed / iKentoo integration |
| `zonal` | Synced from Zonal POS |
| `pos_sync` | Synced from a generic POS availability push |
```json theme={null}
{
"event": "item.out_of_stock",
"data": {
"venue": {
"id": 1234,
"name": "My Restaurant"
},
"item": {
"id": 5678,
"name": "Margherita Pizza",
"plu": "PLU-001",
"posId": "pos_item_42",
"sku": "SKU-MARG-001"
},
"reason": "snoozed",
"source": "manual",
"details": {
"snoozeEnd": "2024-01-15T18:00:00Z"
}
}
}
```
The `details` object varies by reason:
* **`snoozed`** — includes `snoozeEnd` (ISO 8601 timestamp, or `null` for indefinite snoozes)
* **`inventory_depleted`** — empty `{}`
* **`disabled`** — empty `{}`
***
## Payments Events
Events related to payments and payouts.
| Event | Description |
| ------------------------------- | -------------------------------------------------------------------------------------- |
| `payments.payout.created` | Triggered when a payout is sent to your bank account |
| `bill.payment.created` | Triggered when a bill payment is created |
| `payment_link.created` | Triggered when a new payment link is created |
| `payment_link.paid` | Triggered when a payment is successfully collected via a payment link |
| `payment_link.refund.created` | Triggered when a refund is initiated for a payment link payment |
| `payment_link.refund.succeeded` | Triggered when a payment link refund is confirmed as successful by the payment gateway |
| `payment_link.refund.failed` | Triggered when a payment link refund is rejected by the payment gateway |
### payments.payout.created
Triggered when storekit sends a payout to your bank account.
```json theme={null}
{
"event": "payments.payout.created",
"data": {
"amounts": [
{
"currency": "GBP",
"value": "3210.50"
},
{
"currency": "GBP",
"value": "1030.00"
}
],
"bankAccount": {
"id": "db97e205-105c-42ff-8460-d06c25cb6830",
"IBAN": "GB15HBUK40127612345678",
"accountNumber": "0001234",
"branchCode": "001234",
"currency": "GBP"
},
"estimatedArrivalDate": "2024-01-17"
}
}
```
### payment\_link.created
Triggered when a new payment link is created. Only fired for accounts with webhooks enabled.
```json theme={null}
{
"event": "payment_link.created",
"data": {
"paymentLink": {
"id": "plink_019dbc4d828174419d9ff9fae24aea7b",
"title": "Invoice #001",
"type": "one_off",
"amountType": "fixed",
"amount": 2500,
"currency": "GBP",
"reference": "INV-001"
},
"venue": {
"id": 1234,
"name": "My Restaurant",
"slug": "my-restaurant"
}
}
}
```
| Field | Description |
| ------------------------ | ------------------------------------------------------------------ |
| `paymentLink.id` | The payment link ID in `plink_` format |
| `paymentLink.type` | `one_off` or `reusable` |
| `paymentLink.amountType` | `fixed` or `variable` |
| `paymentLink.amount` | Fixed amount in minor currency units, or `null` for variable links |
| `paymentLink.currency` | ISO 4217 currency code |
| `paymentLink.reference` | Your internal reference, if set |
| `venue.slug` | The venue's URL slug |
### payment\_link.paid
Triggered when a payment is successfully collected via a payment link. Only fired for accounts with webhooks enabled.
```json theme={null}
{
"event": "payment_link.paid",
"data": {
"paymentLink": {
"id": "plink_019dbc4d828174419d9ff9fae24aea7b",
"title": "Invoice #001",
"type": "one_off",
"amountType": "fixed",
"reference": "INV-001"
},
"payment": {
"transactionId": "txn_abc123",
"amount": 2500,
"currency": "GBP",
"pspReference": "ABCD1234EFGH5678"
},
"venue": {
"id": 1234,
"name": "My Restaurant",
"slug": "my-restaurant"
}
}
}
```
| Field | Description |
| ------------------------ | ----------------------------------------------------- |
| `paymentLink.id` | The payment link ID in `plink_` format |
| `paymentLink.type` | `one_off` or `reusable` |
| `paymentLink.amountType` | `fixed` or `variable` |
| `paymentLink.reference` | Your internal reference, if set |
| `payment.amount` | Amount collected in minor currency units (e.g. pence) |
| `payment.pspReference` | Adyen payment reference |
| `venue.slug` | The venue's URL slug |
### payment\_link.refund.created
Triggered when a refund is initiated for a payment link payment. The refund is pending at this point — confirmation arrives via `payment_link.refund.succeeded` or `payment_link.refund.failed` once the payment gateway processes it asynchronously.
```json theme={null}
{
"event": "payment_link.refund.created",
"data": {
"paymentLink": {
"id": "plink_019dbc4d828174419d9ff9fae24aea7b",
"title": "Invoice #001",
"reference": "INV-001"
},
"refund": {
"id": "ref_xyz789",
"transactionId": "txn_abc123",
"amount": 1000,
"currency": "GBP",
"reason": "Item damaged"
},
"venue": {
"id": 1234,
"name": "My Restaurant",
"slug": "my-restaurant"
}
}
}
```
| Field | Description |
| ---------------------- | -------------------------------------------------- |
| `refund.id` | The refund ID |
| `refund.transactionId` | The transaction ID of the original payment |
| `refund.amount` | Refund amount in minor currency units (e.g. pence) |
| `refund.currency` | ISO 4217 currency code |
| `refund.reason` | Reason for the refund, if provided |
### payment\_link.refund.succeeded
Triggered when the payment gateway confirms a refund has been successfully processed. This fires asynchronously after `payment_link.refund.created`.
```json theme={null}
{
"event": "payment_link.refund.succeeded",
"data": {
"paymentLink": {
"id": "plink_019dbc4d828174419d9ff9fae24aea7b",
"title": "Invoice #001",
"reference": "INV-001"
},
"refund": {
"id": "ref_xyz789",
"transactionId": "txn_abc123",
"amount": 1000,
"currency": "GBP",
"reason": "Item damaged"
},
"venue": {
"id": 1234,
"name": "My Restaurant",
"slug": "my-restaurant"
}
}
}
```
### payment\_link.refund.failed
Triggered when the payment gateway rejects a refund. This fires asynchronously after `payment_link.refund.created`.
```json theme={null}
{
"event": "payment_link.refund.failed",
"data": {
"paymentLink": {
"id": "plink_019dbc4d828174419d9ff9fae24aea7b",
"title": "Invoice #001",
"reference": "INV-001"
},
"refund": {
"id": "ref_xyz789",
"transactionId": "txn_abc123",
"amount": 1000,
"currency": "GBP",
"reason": "Item damaged"
},
"venue": {
"id": 1234,
"name": "My Restaurant",
"slug": "my-restaurant"
}
}
}
```
***
## Printer Events
Events related to cloud printer status.
| Event | Description |
| ------------------------ | ------------------------------------------ |
| `printer.status.offline` | Triggered when a printer goes offline |
| `printer.status.online` | Triggered when a printer comes back online |
### printer.status.offline
Triggered when a connected cloud printer fails to check in to the storekit server for 5 minutes. An email notification is also sent to the venue's configured email address.
```json theme={null}
{
"event": "printer.status.offline",
"data": {
"id": "6041b7c2-d402-4ff1-9adf-2863c65b61b1",
"mac": "00-B0-D0-63-C2-26",
"model": "StarMCPrint3",
"name": "Kitchen Printer",
"status": "offline"
}
}
```
### printer.status.online
Triggered when a cloud printer reconnects to our servers after being offline for at least 5 minutes. An email notification is also sent to confirm the printer is back online.
```json theme={null}
{
"event": "printer.status.online",
"data": {
"id": "6041b7c2-d402-4ff1-9adf-2863c65b61b1",
"mac": "00-B0-D0-63-C2-26",
"model": "StarMCPrint3",
"name": "Kitchen Printer",
"status": "online"
}
}
```
# Allergen Strategy
Source: https://storekit.com/docs/guides/compliance/allergen-strategy
Compare allergen compliance strategies in storekit: opt-in disclaimers, full allergen tagging, and ingredient-level approaches for food businesses.
Every food business must handle allergen information responsibly. storekit provides several options - the right choice depends on your service type, risk appetite, and how much friction you're willing to add to the ordering process.
## The Trade-off
More allergen protection = more friction for guests.
A customer with no allergies doesn't want to click through warnings or answer questions. But a customer with a severe allergy needs you to take it seriously. Your job is to find the right balance.
## Option 1: Store Notice Before Checkout
Display a modal that customers must acknowledge before completing their order.
**How it works:**
1. Create a store notice with allergen information
2. Enable "Checkout Popup"
3. Customers see the notice and click "Continue" to proceed
**Best for:** Reminding all customers about allergen policies without blocking ordering.
**Example text:**
> **Allergen Information**\
> Our kitchen handles all 14 major allergens. If you have a food allergy, please call us on 020 1234 5678 before placing your order so we can discuss your requirements.
This approach informs but doesn't prevent ordering. Customers acknowledge the notice and continue.
## Option 2: Allergen Gate (Disable Ordering)
Ask customers upfront if they have an allergy. If yes, disable online ordering and direct them to staff.
**How it works:**
1. Enable the "Allergens disable ordering" setting
2. When customers first visit, a modal asks: "Do you have an allergy?"
3. If they select "Yes, I have an allergy" - ordering is disabled and they see a message to order with a team member
4. If they select "No" - they can order normally
5. Customers can change their answer by clicking the notice banner
**Default text:**
* Modal title: "Do you have an allergy?"
* Modal description: "If you do, we take your safety very seriously so we kindly request that one of our amazing managers personally takes your food order"
* Disabled message: "Online ordering is disabled due to your allergy, please order with a team member"
The modal text is customisable. Contact support to update the wording to match your brand voice.
**Best for:** Dine-in and pay-at-table where staff are present to take orders from allergy customers.
Not recommended for delivery or pickup stores where customers can't easily speak to staff.
## Option 3: Allergen Modifier Group
Add a required modifier group to products (or all products) asking customers to declare allergies.
**How it works:**
1. Create a modifier group called "Allergen Declaration" or similar
2. Add options like:
* "I have no food allergies"
* "I have allergies - please contact me"
3. Make it required on relevant products
4. Review orders with allergy declarations before preparing
**Best for:** Capturing allergy information per-item while still allowing online ordering.
**Example options:**
* "No allergies"
* "I have allergies (we'll call you)"
* "Nut allergy"
* "Gluten intolerance"
* "Other allergy - see order notes"
## Option 4: Order Notes
Rely on the order notes field for customers to communicate allergies.
**How it works:**
1. Customers type allergy information in the order notes
2. Staff review notes when preparing orders
**Best for:** Low-friction stores with operationally mature teams who always check notes.
**Risks:**
* Customers may forget to add notes
* Staff may miss notes during busy periods
* No structured data for reporting
This is the highest-risk approach. Consider combining with a store notice to remind customers to use order notes for allergies.
## Allergen Display on Menu Items
Separately from the ordering flow, you can control how allergen information displays on menu items.
### Display Options
| Option | Description |
| ------------ | ---------------------------------------------------------------------------------------------------------------------- |
| **Default** | Allergens shown in the "Details" tab when viewing an item |
| **Extended** | Allergens displayed prominently on the item modal with "Contains: \[allergens]" and "May contain: \[allergens]" labels |
### How Allergens Work
storekit supports the 14 major UK allergens as defined by the Food Standards Agency:
Celery, Gluten, Crustaceans, Fish, Eggs, Lupin, Milk, Molluscs, Mustard, Nuts, Peanuts, Sesame, Soya, Sulphites
Each menu item can be tagged with:
* **Contains** - The item definitely contains this allergen
* **May contain** - The item may contain traces (cross-contamination risk)
### Allergens on Modifiers
Modifiers can also have allergen tags. As guests select modifiers, the allergen display updates in real-time to reflect the complete allergen profile of their customised item.
For example, if a burger has no nuts but the guest selects a "Satay Sauce" modifier that contains peanuts, the allergen list will update to show peanuts as they make that selection.
This ensures guests always see accurate allergen information for exactly what they're ordering, including all their customisations.
### Allergen Filtering
Customers can filter the menu to hide items containing specific allergens. This helps customers with allergies browse safely, but should not be relied upon as the sole protection.
## Choosing Your Strategy
| Scenario | Recommended Approach |
| ------------------------------------------ | -------------------------------------------------------------- |
| **Dine-in only** | Allergen Gate - staff can take orders personally |
| **Delivery/pickup** | Store Notice + Extended allergen display |
| **High-risk menu** (nuts, shellfish heavy) | Store Notice (modal) + Allergen modifier on key items |
| **Low-risk menu** | Store Notice + Order notes reminder |
| **Multi-location chain** | Consistent approach across all stores - typically Store Notice |
## Combining Approaches
You can use multiple approaches together:
1. **Store Notice** to inform all customers about your allergen policy
2. **Extended allergen display** so customers can see allergens on each item
3. **Allergen modifier** on high-risk items only
4. **Order notes** as a catch-all for specific requests
## Legal Considerations
This guide covers storekit's technical options. It is not legal advice. Consult your local food safety authority and legal advisor to ensure your allergen practices meet regulatory requirements.
In the UK, Natasha's Law requires food businesses to provide full ingredient lists with allergen information emphasised for prepacked for direct sale (PPDS) food. Your online ordering strategy should complement your in-venue compliance.
# Capturing Guest Data
Source: https://storekit.com/docs/guides/guest-data/overview
Balance checkout speed with valuable customer insights. Decide which guest data fields to collect, how they affect conversion, and where to use the data later.
Every order is an opportunity to learn about your customers. But there's a tradeoff: every field you add to checkout creates friction that can reduce conversions. This guide helps you decide what data to collect and when.
## The Friction-Value Tradeoff
**The golden rule:** Only ask for information you'll actually use. Every additional field increases the chance a customer abandons their order.
Research shows that reducing form fields from 4 to 3 can increase conversions by up to 50%. But the right data can be worth far more than a few lost orders - if you use it effectively.
| More Fields | Fewer Fields |
| ----------------------------- | ----------------------- |
| Richer customer profiles | Higher conversion rates |
| Better marketing targeting | Faster checkout |
| Personalisation opportunities | Lower abandonment |
| Delivery accuracy | Simpler experience |
The key is finding the right balance for your business.
## Available Data Fields
Checkout fields are set per store and per fulfilment type, under **Stores** → your store → **Settings** → **Operations** → **Checkout fields**. Turn on **Custom checkout fields** to override the defaults; until you do, every store collects **Phone** (Enabled), **Email** (Required), **First name** and **Last name**, with **Company Name** and **VAT Number** disabled.
* Delivery and pickup stores get two tabs, **Delivery** and **Pickup**, each with its own table of fields. A customer sees the settings for the fulfilment type they chose.
* Order & pay (in-store) stores get a single table for in-store orders, plus the **Disable ordering for customers with allergens** toggle.
The option lists below are fixed - the dashboard shows exactly these buttons.
| Field | Options | Use Case |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------- |
| **Phone** | **Enabled** / **Disabled** / **Validated** / **Optional** | Order updates, delivery coordination, SMS marketing |
| **Email** | **Required** / **Disabled** / **Optional** | Receipts, marketing, account creation |
| **First name** | toggle on/off | Personalisation, order identification |
| **Last name** | toggle on/off | Full customer records, formal communication |
| **Cutlery** | toggle on/off | Ask whether the customer wants cutlery |
| **Company Name** | **Required** / **Disabled** / **Optional** | B2B orders, invoicing |
| **VAT Number** | **Disabled** / **Optional (validated)** / **Required (validated)** / **Optional (free text)** / **Required (free text)** | B2B invoicing |
### Phone Number Settings
There is no **Required** option for phone. **Enabled** is the mandatory setting; **Validated** is also mandatory and additionally checks the number's format.
| Option | What the customer sees | Saved with the order |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------ |
| **Enabled** | A plain **Phone number** field. The order cannot be placed until it is filled in (minimum 7 characters); the number is not checked against any format. | Always |
| **Validated** | A **Phone number** field with a country-code picker. The order cannot be placed until a correctly formatted number for the chosen country is entered. | Always |
| **Optional** | A **Phone number (optional)** field. The customer can leave it blank. | If entered |
| **Disabled** | No phone field; nothing new is collected. A number the customer has already saved in their browser from an earlier order can still be attached to the order. | Only if previously saved |
Use **Validated** when you rely on the number - for delivery coordination or customer SMS notifications, a mistyped number is as bad as none.
### Email Settings
| Option | What the customer sees | Saved with the order |
| ------------ | ---------------------------------------------------------------------------------------------------------------------------------- | ------------------------ |
| **Required** | An **Email address** field that must be filled in before ordering. | Always |
| **Optional** | The field is labelled **Email (optional, enter to receive a receipt)**; the customer can leave it blank. | If entered |
| **Disabled** | No email field; nothing new is collected. As with phone, an address already saved in the customer's browser can still be attached. | Only if previously saved |
Even when optional, most customers provide their email. The "optional" label reduces pressure while still capturing data from willing customers.
### Company Name and VAT Number
**Company Name** uses the same three options as email: **Required** blocks the order until filled in, **Optional** shows the field without forcing it, **Disabled** hides it. **VAT Number** adds a validated/free-text choice: the **(validated)** options check the number with a VAT lookup service before the order can be placed, the **(free text)** options accept anything typed.
### Where the Data Appears
Name, email, phone and company details entered at checkout are shown on the order in **Orders** → the order, and on the customer's profile under **Customers**. The phone number is also what customer SMS notifications are sent to when they are enabled for the store.
## Marketing Consent
### Opt-in Checkbox
Add a marketing consent checkbox at checkout under **Stores** → your store → **Settings** → **General** → **Marketing opt-in**:
* **Enable opt-in at checkout** - Show the checkbox
* **Checkbox label** - Write your own opt-in text (the default is "Save my details to keep up to date on news and special offers")
* **Pre-select by default** - Choose whether the checkbox starts ticked or unticked
**GDPR Compliance:** In the UK and EU, marketing consent checkboxes should not be pre-selected. Customers must actively opt-in. Check local regulations for your market.
### What You Can Do With Consent
When customers opt-in, you can:
* Send promotional emails and SMS campaigns
* Share offers and new menu items
* Request reviews after orders
* Build loyalty program engagement
* Retarget with personalised offers
## Attribution Data
storekit automatically captures marketing attribution when customers arrive at your store:
### UTM Parameters
| Parameter | Purpose |
| -------------- | ----------------------------------------------------- |
| `utm_source` | Where the traffic came from (e.g., google, instagram) |
| `utm_medium` | Marketing medium (e.g., cpc, email, social) |
| `utm_campaign` | Specific campaign name |
| `utm_term` | Paid search keywords |
| `utm_content` | Differentiates ads or links |
### Ad Platform Click IDs
Automatically captured for conversion tracking:
* **gclid** - Google Ads
* **fbclid** - Meta (Facebook/Instagram) Ads
* **ttclid** - TikTok Ads
* **msclkid** - Microsoft/Bing Ads
* **li\_fat\_id** - LinkedIn Ads
### First-Touch vs Last-Touch
storekit tracks both:
* **First-touch** - How the customer first discovered you
* **Last-touch** - What brought them back to order
This data helps you understand which marketing channels drive discovery vs. conversion.
## Recommended Configurations
### Delivery & Collection Stores
For most takeaway and delivery operations:
| Field | Setting | Rationale |
| ---------------- | ----------------------------- | ------------------------------------------------------------ |
| First name | **On** | Personal service, order identification |
| Last name | Off | Usually unnecessary |
| Email | **Optional** | Receipts, marketing (low friction) |
| Phone | **Validated** or **Optional** | Essential for delivery updates; use Optional for pickup-only |
| Company Name | **Disabled** | Not needed for consumers |
| Marketing Opt-in | **On** | Build your customer database |
### Dine-In / Pay at Table
For in-venue ordering where speed is critical:
| Field | Setting | Rationale |
| ---------------- | ------------ | ------------------------------ |
| First name | Off | Order number sufficient |
| Last name | Off | Not needed |
| Email | **Optional** | Capture from willing customers |
| Phone | **Disabled** | Not needed for table service |
| Company Name | **Disabled** | Not needed |
| Marketing Opt-in | **On** | Only shows if email entered |
### B2B / Catering
For business customers and large orders:
| Field | Setting | Rationale |
| ---------------- | ------------------------ | ------------------------------- |
| First name | **On** | Contact identification |
| Last name | **On** | Full business records |
| Email | **Required** | Invoices, confirmations |
| Phone | **Validated** | Coordination for large orders |
| Company Name | **Required** | Invoicing, account management |
| VAT Number | **Optional (validated)** | Correct VAT details on invoices |
| Marketing Opt-in | **On** | B2B relationship building |
## Using Your Data
### In storekit
* View customer details on every order
* Export customer data for analysis
* See marketing attribution on orders
* Filter orders by customer
### Integrations
Connect your customer data to:
* **Email platforms** (Mailchimp, Klaviyo) for campaigns
* **SMS providers** for text marketing
* **CRM systems** for customer management
* **Analytics tools** for attribution reporting
### Data Retention
Customer data is stored securely and retained according to your data retention settings. Customers can request deletion of their data under GDPR/privacy regulations.
## Best Practices
Launch with fewer fields, then add more once you understand what you'll use.
Most customers still provide it, but the "optional" label removes pressure.
Invalid numbers are useless. Validation ensures you can actually reach customers.
Generic "subscribe to newsletter" converts worse than specific value propositions.
## Measuring Impact
Monitor these metrics when adjusting your data collection:
* **Checkout conversion rate** - Does adding fields reduce completions?
* **Opt-in rate** - What percentage consent to marketing?
* **Email capture rate** - How many orders include email addresses?
* **Order value by data completeness** - Do customers with full profiles spend more?
Test changes gradually. Adjust one field at a time and measure the impact over at least 100 orders before deciding.
# Delivery Fee Strategies
Source: https://storekit.com/docs/guides/increasing-sales/delivery-fee-strategies
Optimise delivery fees and service charges to maximise checkout conversion while still covering costs. Compare flat, tiered, distance, and free options.
How you structure delivery fees and service charges significantly impacts both checkout conversion rates and your profit margins. This guide explores different strategies to find the right balance for your business.
## Understanding Your Fees
storekit provides two fee types you can configure:
| Fee Type | Scope | Where to Set |
| ------------------ | --------------------------------------- | ---------------------------- |
| **Service Charge** | Fixed amount on all orders | Store Settings |
| **Delivery Fee** | Per delivery zone, variable by distance | Fulfillment > Delivery Zones |
Both appear as separate line items at checkout, so customers see exactly what they're paying.
## The Psychology of Delivery Fees
High delivery fees are a leading cause of cart abandonment. Research shows:
* Customers often expect "free" or subsidised delivery from online ordering
* A single large fee feels more painful than multiple smaller charges
* Customers accept small service charges more readily than high delivery fees
## Strategy 1: Service Charge Subsidy (Recommended)
**Best for:** Stores using third-party delivery (Uber Direct, Stuart, etc.) or own drivers
Add a small fixed service charge to all orders, then reduce the delivery fee customers see.
### How It Works
1. Calculate your average delivery cost (e.g., £4.50 per order)
2. Add a service charge of £0.99 to all orders
3. Set your delivery fee to £2.99 instead of £4.50
**Customer sees:**
* Service charge: £0.99
* Delivery: £2.99
* **Total fees: £3.98**
**You receive:** £3.98 toward your £4.50 cost (you subsidise £0.52 per order)
A service charge of 99p feels insignificant to customers but adds up. On 1,000 orders/month, that's £990 toward delivery costs.
### Configuration
1. Go to **Settings > Store Settings**
2. Set **Service Charge** to your desired amount (e.g., 99)
3. Optionally set a **Service Charge Label** (e.g., "Order fee" or "Packaging")
4. Go to **Fulfillment > Delivery Zones**
5. Reduce each zone's delivery fee by the service charge amount
## Strategy 2: Tiered Delivery Fees
**Best for:** Stores with wide delivery radius where costs vary significantly
Set different delivery fees per zone based on actual cost, while using a service charge to keep the closest zone very affordable.
### Example Configuration
| Zone | Distance | Actual Cost | Service Charge | Delivery Fee | Customer Total |
| ------ | --------- | ----------- | -------------- | ------------ | -------------- |
| Zone 1 | 0-2 miles | £3.50 | £0.99 | £1.99 | £2.98 |
| Zone 2 | 2-4 miles | £5.00 | £0.99 | £3.49 | £4.48 |
| Zone 3 | 4-6 miles | £7.00 | £0.99 | £4.99 | £5.98 |
This approach:
* Keeps local delivery very competitive
* Passes higher costs to customers ordering from further away
* Maintains consistent service charge revenue
## Strategy 3: Free Delivery Threshold
**Best for:** Stores wanting to increase average order value
Combine a minimum order value with reduced or free delivery.
### Example Setup
* Service charge: £1.49 (all orders)
* Delivery fee: £2.99 (orders under £25)
* Free delivery: Orders over £25
Configure this using:
1. Set your service charge in Store Settings
2. Create a [discount code](/docs/guides/discounts/discount-codes) with:
* Type: Free delivery
* Minimum order: £25
* Auto-apply: Enabled
Even with "free delivery", you keep the service charge revenue to offset costs.
## Strategy 4: Full Cost Recovery
**Best for:** Premium restaurants where customers expect to pay for quality service
Pass the full delivery cost to customers, but frame it transparently.
### Configuration
* Service charge: £0 (or small amount for packaging)
* Delivery fee: Full cost per zone
This works when:
* Your food commands premium pricing
* Customers value quality over price
* You want to maintain healthy margins
This approach typically has lower conversion rates but higher profit per order. Test carefully.
## Strategy 5: Pickup Incentive
**Best for:** Stores with high foot traffic or wanting to reduce delivery volume
Make pickup significantly cheaper than delivery to encourage collection.
### Example
| Method | Fees |
| -------- | ---------------------------- |
| Pickup | £0 |
| Delivery | £3.99 + £0.99 service charge |
This works well combined with:
* Pre-orders for pickup
* Loyalty rewards for pickup orders
* Prominent "Ready in X minutes" messaging
## Calculating Your Break-Even
To find the right fee structure, calculate your actual costs:
### Third-Party Delivery Costs
| Provider | Typical Cost | Notes |
| ----------- | ----------------- | ------------------ |
| Uber Direct | £4-7 per delivery | Varies by distance |
| Stuart | £4-6 per delivery | Zone-based |
| Own drivers | £2-5 per delivery | Fuel + wage |
### Your Break-Even Formula
```
Break-even = Delivery Cost - Service Charge - Delivery Fee
```
**Example:**
* Delivery cost: £5.00
* Service charge: £0.99
* Delivery fee: £2.99
* **Break-even: £1.02** (your subsidy per order)
A small subsidy per order is often worthwhile if it increases conversion rates and total order volume.
## A/B Testing Your Fees
Before committing to a strategy, test different approaches:
1. **Week 1-2:** Current fees (baseline conversion rate)
2. **Week 3-4:** Lower delivery fee + service charge
3. **Week 5-6:** Different service charge amount
Track:
* Checkout conversion rate
* Average order value
* Total revenue
* Profit per order
## Common Mistakes to Avoid
| Mistake | Why It Hurts | Better Approach |
| ------------------------ | ------------------------------ | ---------------------------------------------- |
| Very high delivery fee | Cart abandonment | Split into service charge + lower delivery fee |
| £0 service charge | Leaves money on the table | Even £0.49 adds up |
| Same fee for all zones | Losing money on far deliveries | Tiered delivery zones |
| Rounding to whole pounds | Feels more expensive | Use £X.99 pricing |
## Recommended Starting Point
For most stores, we recommend starting with:
| Setting | Value |
| ------------------------ | ----------- |
| Service charge | £0.99 |
| Service charge label | "Order fee" |
| Zone 1 delivery (0-2 mi) | £1.99-2.49 |
| Zone 2 delivery (2-4 mi) | £2.99-3.49 |
| Minimum order | £10-15 |
This balances conversion with cost recovery while keeping flexibility to adjust based on your results.
## Compare Strategies
Use this calculator to compare different fee structures and see how they impact your costs and what customers pay.
## Next Steps
* [Set up delivery zones](/docs/guides/fulfillment/delivery/delivery-zones) with your chosen fees
* [Create a free delivery promotion](/docs/guides/discounts/promotions) for high-value orders
* [Configure minimum order values](/docs/guides/fulfillment/delivery/delivery-zones) per zone
# Loyalty Programs
Source: https://storekit.com/docs/guides/increasing-sales/loyalty-programs
Increase repeat orders and customer lifetime value with loyalty programs integrated into storekit checkout. Customers earn and redeem rewards with no extra app.
Loyalty programs turn one-time customers into regulars. storekit integrates with leading loyalty platforms so your customers can earn and redeem rewards directly in the ordering flow - no separate apps or cards required.
## Why Loyalty Matters
Acquiring a new customer costs 5-7x more than retaining an existing one. A well-designed loyalty program:
* **Increases order frequency** - Customers return to earn and redeem rewards
* **Boosts average order value** - Points thresholds encourage larger orders
* **Builds emotional connection** - Rewards make customers feel valued
* **Generates data** - Track customer preferences and behaviour
* **Reduces reliance on discounts** - Rewards feel earned, not given away
Restaurants with loyalty programs see an average **20-30% increase in repeat orders** from enrolled customers.
## Supported Integrations
storekit integrates natively with two leading loyalty platforms:
### Piggy
[Piggy](https://www.piggy.eu) is a flexible loyalty and marketing platform popular across Europe.
**Key Features:**
* **Points/credits system** - Customers earn credits on every order
* **Rewards catalogue** - Offer free items, discounts, or percentage off
* **Vouchers** - Time-limited rewards with expiration dates
* **Gift cards** - Sell and redeem digital gift cards
* **Automated campaigns** - Birthday rewards, win-back emails, and more
* **Multi-location support** - Unified loyalty across all your stores
**Reward Types:**
| Type | Description |
| ----------------- | ---------------------------------------- |
| Basket discount | Percentage or fixed amount off the total |
| Product discount | Discount on specific menu items |
| Category discount | Discount on entire categories |
| Free item | Redeem points for free products |
### Como
[Como](https://www.como.com) is an enterprise-grade loyalty platform for hospitality brands.
**Key Features:**
* **Points balance** - Earn monetary points on purchases
* **Pay with points** - Use accumulated points to pay for orders
* **Deals and offers** - Targeted promotions based on behaviour
* **Membership tiers** - Bronze, Silver, Gold progression
* **Omnichannel** - Works across online, in-store, and app
* **Advanced segmentation** - Personalised rewards based on data
* **Enterprise reporting** - Deep analytics and insights
**Best For:** Multi-location brands wanting sophisticated loyalty with CRM capabilities.
#### Linking Products to Como Rewards
When a reward in Como applies to specific products, you tell Como which product codes it covers. storekit identifies each purchased item to Como using the first of these identifiers that is set:
1. **PLU** - on menus synced from a POS this is filled in by the sync; for Toast it is the item's GUID from your Toast menu.
2. **SKU / PLU** - the product field of that name in the menu editor.
3. **POS ID** - the product field of that name, shown on Comtrex, Centegra and Tissl menus.
4. **Product ID** - the read-only identifier at the bottom of the product's edit panel. See [Product ID](/docs/guides/menu/products#product-id).
So on a Toast-connected menu, enter the Toast item's GUID in Como rather than the **Product ID**. On a menu with no POS connection and no PLU or SKU filled in, use the **Product ID**.
Product IDs are per menu - the same dish listed on two menus is two products with two different Product IDs. POS identifiers such as the **PLU** come from your till.
There's nothing to resync after you change a reward in Como: storekit sends the item identifiers with every purchase and Como works out which rewards apply each time.
## How It Works
### Customer Experience
1. **Sign up** - Customer enters email or phone at checkout
2. **Verify** - One-time code confirms their identity
3. **Earn** - Points accumulate automatically on every order
4. **View rewards** - Available rewards display in the basket
5. **Redeem** - One tap applies the reward to their order
The entire flow happens within your storekit store - no app downloads or card scans.
### Rewards Display
When a customer is logged in, their available rewards appear as a horizontal carousel in the checkout:
* Reward name and image
* Points/credits required
* Expiration date (if applicable)
* One-tap redeem button
Rewards that aren't applicable to the current cart (e.g., "Free burger" when there's no burger in the order) are shown but greyed out.
## Benefits for Your Business
Loyalty members order 2-3x more frequently than non-members.
Points thresholds encourage customers to add items to reach the next reward.
Build a database of identified customers for marketing.
Earned rewards feel more valuable than blanket discounts.
## Gift Cards
Both Piggy and Como support digital gift cards that integrate with storekit:
* **Sell gift cards** - Customers purchase cards for friends and family
* **Redeem at checkout** - Enter gift card code to apply balance
* **Partial redemption** - Use part of the balance, save the rest
* **Balance checking** - Customers can check remaining balance
Gift cards are particularly powerful for:
* Holiday gifting seasons
* Corporate gifting programs
* "Sorry we messed up" recovery gestures
## Setting Up Loyalty
### Prerequisites
1. **Create an account** with Piggy or Como
2. **Configure your program** - Set earn rates, rewards, and tiers
3. **Get your API credentials** - Required for storekit integration
### Connect to storekit
1. Go to **Stores** → your store → **Settings** → **Integrations**
2. Select **Piggy** or **Como**
3. Enter your API credentials
4. Configure display options
5. Test with a sample order
Start with a simple program - e.g., "Earn 1 point per £1 spent, redeem 100 points for £5 off." You can add complexity later once customers are enrolled.
## Program Design Tips
### Keep It Simple
The best loyalty programs are easy to understand:
* **Clear earn rate** - "£1 = 1 point" is better than complex multipliers
* **Achievable rewards** - First reward should be reachable in 2-3 orders
* **Visible progress** - Show customers how close they are to the next reward
### Reward What You Want
Design rewards that drive desired behaviour:
| Goal | Reward Strategy |
| -------------------- | --------------------------------------------- |
| Increase frequency | Time-limited rewards ("Use within 7 days") |
| Increase basket size | Thresholds ("Spend £25+, earn double points") |
| Promote new items | Bonus points on new menu additions |
| Off-peak orders | Extra points on slow days/times |
### Communicate Value
Make sure customers know about your program:
* Mention it on your store homepage
* Highlight points earned on the confirmation page
* Send "points balance" reminders via email
* Celebrate when customers unlock rewards
## Measuring Success
Track these metrics to evaluate your loyalty program:
| Metric | What It Tells You |
| ---------------------------- | ---------------------------------------- |
| **Enrollment rate** | % of customers who join the program |
| **Active member rate** | % of members who ordered in last 30 days |
| **Redemption rate** | % of earned points that get redeemed |
| **Member vs non-member AOV** | Are members spending more? |
| **Member order frequency** | How often do members return? |
A low redemption rate might seem good (fewer discounts given), but it often indicates customers don't find the rewards valuable. Aim for 60-80% redemption.
## Getting Started
If you're new to loyalty:
1. **Choose a platform** - Piggy for flexibility, Como for enterprise
2. **Design a simple program** - Start basic, iterate based on data
3. **Connect to storekit** - Follow the integration steps above
4. **Promote enrollment** - Make it visible and valuable
5. **Monitor and adjust** - Review metrics monthly and refine
For most restaurants, loyalty pays for itself within 2-3 months through increased repeat orders and higher customer lifetime value.
# Menu Structure
Source: https://storekit.com/docs/guides/menu-engineering/menu-structure
Organise your storekit menu so customers can find what they want quickly. Best practices for category order, naming, descriptions, and structure to grow sales.
A well-structured menu helps customers decide faster and order more. Poor structure leads to abandoned carts and missed sales.
## Categories
### Keep Names Short and Clear
Category names should be instantly understood:
| Good | Avoid |
| -------- | ------------------------------- |
| Starters | Small Plates & Nibbles to Share |
| Burgers | Our Famous Handcrafted Burgers |
| Sides | Accompaniments |
| Drinks | Beverages & Refreshments |
### Add Brief Descriptions
Category descriptions help customers understand what's in each section:
* Explain how items are meant to be enjoyed ("Perfect for sharing")
* Highlight key ingredients ("All served with hand-cut chips")
* Set expectations ("Served 12pm-3pm only")
## Items
### Names Matter
Item names should be descriptive but concise. Customers scan menus quickly.
### Descriptions: First 60 Characters Count
Most of your item description gets truncated on the menu page - only the first \~60 characters show before customers tap to see more.
**Front-load the important stuff:**
* Key ingredients first
* Dietary info (V, VG, GF) early
* Save the story for later in the description
## Menu Layouts
Choose a layout that matches your food:
| Layout | Best For | Example Categories |
| ---------------- | ------------------------ | ------------------------- |
| **A la carte** | Full-service restaurants | Starters, Mains, Desserts |
| **By food type** | Fast food, takeaway | Burgers, Pizza, Salads |
| **Small form** | Build-your-own concepts | Base → Protein → Toppings |
To change the order categories appear in, see [Reordering categories](/docs/guides/menu/categories#reordering-categories). Note that drag and drop is disabled on phones, tablets and touchscreen laptops — on those devices use the **Sort categories** tool instead.
## Keep It Focused
Shorter menus convert better:
* **Fewer choices = faster decisions** - Analysis paralysis is real
* **Quality over quantity** - 20 great items beats 50 average ones
* **Easier operations** - Less waste, faster prep, consistent quality
If a menu item sells less than 5% of the category total, consider removing it.
## Bundles
Group items together to increase average order value:
* **Meal deals** - Main + side + drink at a slight discount
* **Family bundles** - Complete meals for 2-4 people
* **Sharing platters** - Multiple items in one selection
Bundles simplify ordering and make customers feel they're getting value.
## Modifiers
Let customers customise their order:
* **Required choices** - Size, protein, base
* **Optional extras** - Extra toppings, sauces, sides
* **Dietary swaps** - Gluten-free bun, oat milk
Well-designed modifiers increase order value while reducing special requests in order notes.
## Quick Checklist
* Category names are 1-3 words
* Each category has a brief description
* Important info is in first 60 characters of item descriptions
* Menu has 20-80 items (not 100+)
* Low sellers have been removed
* Bundles are available for common combinations
* Modifiers cover common customisations
# Product Photography
Source: https://storekit.com/docs/guides/menu-engineering/product-photography
Capture stunning product photography for your storekit menu. Lighting, framing, and composition tips that increase orders by up to 24% on photographed items.
Great food photography is one of the most effective ways to increase orders. Studies show that adding photos to just 10% of your menu can boost orders by 12%, and this increases to 24% when 30-40% of items have images.
But here's the catch - **the photography has to be good**. Poor photography actually decreases orders. This guide covers everything you need to know to capture stunning product images for your storekit menu.
## Technical Requirements
### Image Specifications
| Specification | Requirement |
| -------------------------- | ---------------------------------------------------------- |
| **Format** | JPEG or PNG (WebP, HEIC, and other formats also supported) |
| **Aspect Ratio** | 1:1 (square) for menu items |
| **Minimum Resolution** | 1200 x 1200 pixels |
| **Recommended Resolution** | 1800 x 1800 pixels or higher |
| **Maximum File Size** | 100 MB |
| **Colour Space** | sRGB |
Upload images at the highest resolution possible. storekit uses a CDN that automatically optimises and resizes images for different devices, so larger source images will always look better.
### Why Square?
Menu item images are cropped to a **1:1 square ratio** across the platform. When composing your shots, ensure the entire dish fits within a square frame with some breathing room around the edges.
Avoid placing important parts of the dish near the edges - they may be cropped on different screen sizes.
## Composition Guidelines
### Dish Layout
* **Centre the dish** - Place the main item in the middle of the frame
* **Fill the frame** - The dish should occupy most of the image, with minimal empty space
* **Show the whole dish** - Ensure nothing is cut off at the edges
* **One dish per image** - Each menu item photo should feature only that item
### Background & Styling
* **Keep it clean** - Use simple, uncluttered backgrounds
* **Neutral colours** - White, grey, or natural wood tones work best
* **Avoid shiny surfaces** - They create distracting reflections
* **No props** - Don't include hands, bottles, logos, watermarks, or raw ingredients around the dish
* **Match your brand** - Consistent backgrounds create a cohesive menu
### Angle & Perspective
| Dish Type | Best Angle |
| ----------------------------------- | ----------------------- |
| Flat dishes (pizza, salads) | Overhead (90°) |
| Stacked items (burgers, sandwiches) | Side-on (0-30°) |
| Bowls & soups | 45° angle |
| Drinks | Side-on or slight angle |
| Most dishes | 45° angle (versatile) |
## Lighting
Good lighting is the single most important factor in food photography.
### Natural Light (Recommended)
* Shoot near a large window with indirect sunlight
* Avoid direct sunlight which creates harsh shadows
* Use a white reflector (or white card) to fill in shadows on the opposite side
* Overcast days provide the most even, flattering light
### Artificial Light
* Use soft, diffused lighting
* Avoid on-camera flash - it flattens the image
* If using studio lights, use softboxes or diffusers
* Keep lighting consistent across all shots
- Even, soft lighting
- Subtle shadows for depth
- Consistent colour temperature
- Natural-looking highlights
* Harsh, direct flash
* Mixed lighting (warm + cool)
* Dark, underexposed images
* Blown-out highlights
## Camera Settings
You don't need expensive equipment - a modern smartphone can produce excellent results. But if you're using a camera:
| Setting | Recommendation |
| ----------------- | ---------------------------------------------- |
| **ISO** | As low as possible (100-400) to avoid grain |
| **Aperture** | f/4 to f/8 for food (keeps dish in focus) |
| **Focal Length** | 35mm to 60mm (natural perspective) |
| **White Balance** | Match your lighting (daylight, tungsten, etc.) |
### Smartphone Tips
* Clean your lens before shooting
* Use the rear camera, not the selfie camera
* Tap to focus on the dish
* Avoid digital zoom - move closer instead
* Use portrait mode sparingly (can blur edges of food)
* Turn off HDR for more natural colours
## Food Styling Tips
### Make It Look Appetising
* **Fresh is best** - Photograph food immediately after plating
* **Add shine** - A light brush of oil makes food glisten
* **Garnish thoughtfully** - Fresh herbs add colour and life
* **Clean the plate** - Wipe any drips or smudges from the rim
* **Steam and sizzle** - Capture hot food while it's still steaming
### Colour & Contrast
* Use colourful garnishes to add visual interest
* Ensure there's contrast between food and plate/background
* Group complementary colours together
* Avoid monochrome dishes on matching backgrounds
## Common Mistakes to Avoid
Use a tripod or stable surface. Ensure the food (not the background) is in sharp focus. Check the image at full size before uploading.
Avoid overhead fluorescent lights and on-camera flash. Move near a window or invest in simple continuous lighting.
Remove everything from the frame except the dish. Keep backgrounds simple and consistent.
Shoot with cropping in mind. Your image will be displayed as a square - compose accordingly.
Use the same background, lighting, and angle for all items. This creates a professional, cohesive menu.
Photograph hot dishes immediately. Cold food photographs poorly - fat congeals, steam disappears, colours dull.
## Checklist Before Uploading
Before adding images to your menu, verify:
* [ ] Image is sharp and in focus
* [ ] Lighting is even with no harsh shadows
* [ ] Dish is centred and fills the frame
* [ ] Background is clean and uncluttered
* [ ] No props, hands, logos, or watermarks
* [ ] Resolution is at least 1200 x 1200 pixels
* [ ] File format is JPEG, PNG, or another supported type
* [ ] Image accurately represents the dish customers will receive
## Professional Photography
If you'd prefer professional results without the DIY effort, consider hiring a food photographer. A single shoot can cover your entire menu and typically costs £100-300 for a few hours.
When briefing a photographer:
* Share these guidelines
* Provide your brand colours and style preferences
* Plan the shot list in advance
* Have backup ingredients ready for reshoots
Need help with video content? Check out our guides on [Videos](/docs/guides/menu-engineering/videos) and [Stories](/docs/guides/menu-engineering/stories) to take your menu to the next level.
# Stories Strategy & Best Practices
Source: https://storekit.com/docs/guides/menu-engineering/stories
Embed Instagram-style vertical videos on your storekit menu to showcase dishes, drive engagement, and convert undecided guests into paying customers.
Stories bring your menu to life with Instagram-style vertical videos embedded directly in your ordering experience. They're the most engaging way to showcase your food and connect with customers at the moment they're deciding what to order.
## How Stories Work
Stories appear as a horizontal carousel at the top of your menu. When a customer taps a story, it opens in a full-screen viewer where they can:
* **Watch** - Swipe through multiple pages per story
* **Tap** - Navigate forward/back by tapping left or right
* **Hold** - Pause the video by holding down
* **Act** - Tap call-to-action buttons to add items or view more
Each story can contain multiple pages (videos), and each page can have its own call-to-action button.
## Call-to-Action Types
Every story page can include a CTA button to drive customer action:
| CTA Type | Description |
| ----------------- | ------------------------------------------------------------ |
| **Add to Basket** | Instantly adds the featured item to the customer's basket |
| **View Item** | Opens the item detail modal for customisation |
| **View Category** | Navigates to a specific menu category |
| **External URL** | Links to external content (your website, social media, etc.) |
**Add to Basket** is the most powerful CTA - it creates a frictionless path from discovery to purchase. Use it for hero items that don't require customisation.
## Content Recommendations
### Hero Items
Feature your signature dishes and bestsellers. These are the items that define your brand and drive the highest margins.
* **Show the sizzle** - Capture the steam, the cheese pull, the pour
* **Keep it short** - 5-15 seconds is the sweet spot
* **End with the hero shot** - Leave them hungry
### Behind the Scenes
Give customers a window into your kitchen and team. Authenticity builds trust and loyalty.
* **Prep work** - Show ingredients being prepared fresh
* **The team** - Introduce your chefs and staff
* **The process** - From raw ingredients to finished dish
### Limited Time & Seasonal
Create urgency with time-sensitive content.
* **Daily specials** - "Today only" drives immediate action
* **Seasonal menus** - Build anticipation for what's new
* **Last chance** - Ending soon? Let them know
### Social Proof
Leverage your best content from social media.
* **Customer reactions** - Real people enjoying your food
* **Reviews come to life** - Visual testimonials
* **Busy service** - Show the energy of a packed restaurant
## Best Practices
Always shoot in 9:16 portrait orientation. This fills the entire screen and feels native to mobile users.
Videos start muted. Make sure your content works without sound - use visually compelling footage.
The thumbnail is the first frame. Start with an appetising shot, not a black screen or logo.
Update stories regularly. Stale content gets ignored. Aim to refresh weekly.
## The Future of Ordering
Stories aren't just a feature - they're a glimpse into how guests will order in the future.
Traditional menus are static lists. Stories transform your menu into a **discovery experience** where customers browse visually, get inspired by what looks delicious, and add items without ever scrolling through categories.
We're building toward a radically different menu experience where video-first browsing becomes the primary way guests explore and order. Stories are the foundation.
Think about how you browse Instagram or TikTok - you don't search, you discover. The best content finds you. That's where food ordering is headed, and stories put you ahead of the curve.
## Getting Started
Stories are managed through the storekit dashboard. To add your first story:
1. Go to **Marketing** → **Content** in your dashboard
2. In the **Stories** section, click **Create Story**
3. Upload your vertical video (9:16 aspect ratio)
4. Add a title and choose your CTA type
5. Link to a product, category, or URL
6. Publish and watch engagement soar
Need help creating video content? Check out our guides on [Product Photography](/docs/guides/menu-engineering/product-photography) and [Videos](/docs/guides/menu-engineering/videos).
# Videos
Source: https://storekit.com/docs/guides/menu-engineering/videos
Replace static menu images with eye-catching looping video clips in storekit. Sizzling food and pouring drinks capture attention and lift conversion rates.
Product videos replace the standard image on menu items, bringing your dishes to life with motion. A short video of sizzling meat, bubbling cheese, or a perfectly poured drink captures attention and drives orders in ways static images can't.
## How Product Videos Work
When you attach a video to a menu item, it automatically replaces the product image:
* **Auto-plays** when visible on screen
* **Loops continuously** - no play button needed
* **Muted by default** - respects user experience
* **Falls back to thumbnail** - shows a poster frame while loading
Videos are hosted on our CDN and streamed using adaptive bitrate technology, so they load fast and look great on any connection.
## Technical Requirements
### Video Specifications
| Specification | Requirement |
| --------------------- | ------------------------------------------ |
| **Format** | MP4 (H.264 codec) |
| **Aspect Ratio** | 1:1 (square) or 16:9 (landscape) |
| **Resolution** | 1080p recommended (1920x1080 or 1080x1080) |
| **Duration** | 3-10 seconds ideal |
| **Maximum Length** | 30 seconds |
| **Maximum File Size** | 100 MB |
| **Frame Rate** | 24-30 fps |
**Avoid vertical (9:16) videos for product items.** Vertical videos push the menu item title, description, and price down on mobile devices, creating a poor browsing experience. Save vertical content for [Stories](/docs/guides/menu-engineering/stories).
### Why Square or Landscape?
Product videos sit in the same space as product images, which display as squares on the menu. A square (1:1) video fits perfectly. Landscape (16:9) works too - it will be cropped or letterboxed depending on the layout.
| Aspect Ratio | Best For |
| -------------------- | --------------------------------------------- |
| **1:1 (Square)** | Menu items - fits perfectly in the image slot |
| **16:9 (Landscape)** | Hero banners, wider shots |
| **9:16 (Vertical)** | Stories only - not for product videos |
## What Makes a Great Product Video
### Keep It Short
The best product videos are **3-6 seconds**. You're not telling a story - you're creating a moment of appetite appeal. Show the hero shot and move on.
### Focus on Movement
Capture what makes the dish come alive:
* **Steam rising** from hot dishes
* **Cheese pulling** on pizza or burgers
* **Sauce drizzling** over a finished plate
* **Bubbles fizzing** in drinks
* **Sizzling** on a hot pan
* **Breaking into** crispy items to reveal the inside
### Loop-Friendly Editing
Since videos loop continuously, edit them to be seamless:
* Avoid abrupt starts or endings
* Don't include audio cues that repeat jarringly
* Consider a subtle fade or the action naturally resetting
* Test how it looks when it loops 3-4 times
## Filming Tips
### Equipment
You don't need professional gear - a modern smartphone works great:
* **Use the rear camera** - better quality than front-facing
* **Clean your lens** - fingerprints ruin footage
* **Use a tripod or stable surface** - shaky video looks amateur
* **Shoot in good light** - same principles as [photography](/docs/guides/menu-engineering/product-photography)
### Camera Settings
| Setting | Recommendation |
| -------------- | ------------------------------------------ |
| **Resolution** | 1080p or 4K (you can downscale later) |
| **Frame Rate** | 30fps for smooth motion, 60fps for slow-mo |
| **Focus** | Lock focus on the dish before recording |
| **Exposure** | Lock exposure to prevent flickering |
### Lighting
* **Natural light** is best - shoot near windows
* **Avoid mixed lighting** - stick to one colour temperature
* **No harsh shadows** - use diffused or bounced light
* **Consistent lighting** - match your product photos
## Content Ideas
A simple, beautifully lit shot of the finished dish with subtle steam or movement.
Sauce, gravy, or dressing being poured over the dish. Classic and effective.
Cutting into a burger, breaking a cookie, or slicing through a steak to show the inside.
Capture food actively cooking - the sound may be muted but the visual sizzle sells.
## Common Mistakes to Avoid
Keep it under 10 seconds. Customers are browsing, not watching a cooking show. Get to the appetising moment immediately.
9:16 vertical videos break the menu layout on mobile. Use square (1:1) or landscape (16:9) for product videos.
Use a tripod, phone mount, or stable surface. Handheld footage looks unprofessional and can be distracting.
Dark or unevenly lit videos don't appetise. Follow the same lighting principles as product photography.
Focus on one moment - one pour, one sizzle, one reveal. Busy videos with multiple actions are confusing.
The thumbnail (poster) is generated from the first frame. Start your video with an appetising shot, not a black screen or logo.
## Editing Basics
You don't need professional software. Free mobile apps like CapCut, InShot, or the built-in Photos app can:
* **Trim** to the best 3-6 seconds
* **Crop** to square aspect ratio
* **Adjust** brightness and contrast
* **Export** at 1080p in MP4 format
### Export Settings
When exporting your final video:
* **Format**: MP4
* **Codec**: H.264
* **Resolution**: 1080x1080 (square) or 1920x1080 (landscape)
* **Bitrate**: 8-12 Mbps for quality
* **Audio**: Can be included but will be muted on playback
## Uploading Videos
To add a video to a menu item:
1. Go to **Menu** in your storekit dashboard
2. Select the product you want to add video to
3. In the media section, click **Add Video**
4. Upload your MP4 file
5. Preview how it looks and save
Start with your bestsellers. Adding video to your top 5-10 items has the biggest impact on orders without requiring a full menu shoot.
## Video vs Stories
| Feature | Product Videos | Stories |
| ---------------- | ---------------------------- | --------------------------------------- |
| **Location** | Replaces product image | Carousel at top of menu |
| **Aspect Ratio** | Square or landscape | Vertical (9:16) |
| **Duration** | 3-10 seconds | Up to 60 seconds |
| **Audio** | Muted | User can unmute |
| **CTA** | None (click opens item) | Add to basket, view item, etc. |
| **Best For** | Showcasing individual dishes | Storytelling, promos, behind-the-scenes |
Want to create immersive, full-screen video experiences? Check out [Stories](/docs/guides/menu-engineering/stories) for vertical video content with interactive CTAs.
# Shared Inventory Tracking
Source: https://storekit.com/docs/guides/tips-tricks/shared-inventory
Track stock across multiple storekit products that share an ingredient using a shared modifier. When the modifier runs out, every linked product sells out.
When you have a limited ingredient or component that's used across multiple products, you can track its inventory in one place using a shared modifier. When stock runs out, all products using that modifier automatically become unavailable.
## Use Cases
* **Pizza dough** - Track total pizzas you can make across all pizza types
* **Bread rolls** - Limit total burgers/sandwiches available
* **Daily prep items** - Soups, sauces, or specials with limited quantities
* **Seasonal ingredients** - Track a scarce ingredient across dishes
## How It Works
1. Create a modifier group representing your limited ingredient
2. Add a single option with inventory tracking enabled
3. Attach this modifier to all products that use the ingredient
4. Make it required and pre-selected so it's invisible to customers
5. When inventory reaches zero, all linked products become unavailable
## Step-by-Step Setup
### 1. Create the Modifier Group
1. Go to **Menu** and select a product that uses the ingredient
2. Open the **Modifiers** tab
3. Click **Create a new group**
4. Name it something descriptive (e.g., "Pizza Dough", "Bread Roll")
### 2. Add the Stock Option
1. Click **Add an option**
2. Name it (e.g., "Regular Dough" or simply the ingredient name)
3. Set the price to **£0** (or your currency equivalent)
4. Toggle **Track Inventory** on
5. Enter your available stock count
### 3. Configure Selection Rules
Set the modifier to be required but invisible to customers:
| Setting | Value | Why |
| --------------------------- | --------- | ------------------------ |
| **Min** | 1 | Makes it required |
| **Max** | 1 | Only one can be selected |
| **Default Qty** | 1 | Pre-selects the option |
| **Initial display setting** | Collapsed | Keeps it out of the way |
### Hiding the Modifier from Customers
**Initial display setting** has three fixed values: **Expanded**, **Collapsed** and **Hidden**.
* **Collapsed** is available on every account. The customer sees the group name folded up under the product, with the £0 option already selected. Because Min and Max are both 1 and the option is pre-selected, they cannot change it, but they can still see it.
* **Hidden** removes the group from the customer's view entirely. It is greyed out in the dropdown until storekit support switches the feature on for your account — you cannot enable it yourself. Contact support if you want the stock modifier to be fully invisible.
If **Hidden** is not available to you, the Collapsed setup above (required, pre-selected, single option, £0) is the fallback: the group stays out of the way and does not change the price or the order.
### 4. Attach to Other Products
1. Open another product that uses the same ingredient
2. Go to the **Modifiers** tab
3. Click **Use an existing group**
4. Select your stock modifier group and click **Add group to product**
Repeat for all products that share this inventory.
## Example: Pizza Dough
You can make 50 pizzas per day. You have 5 pizza types on your menu.
**Setup:**
* Modifier group: "Pizza Base"
* Option: "Fresh Dough" - £0, inventory: 50
* Min: 1, Max: 1, Default Qty: 1
* Attached to: Margherita, Pepperoni, Hawaiian, Veggie, BBQ Chicken
**Result:**
* Each pizza order reduces the dough count by 1
* When count hits 0, all 5 pizzas show as unavailable
* Set the count each morning when you prep fresh dough
## Checking the Remaining Count
The live count is shown wherever the modifier group is edited:
1. Go to **Menu** and open any product that has the modifier attached
2. Open the **Modifiers** tab and open the stock modifier group
3. The number in the **In Stock** column next to the option is the current remaining count
The count goes down by one each time a linked product is ordered. Because the modifier is shared, the number is the same on every product it is attached to. The "Restock Items" product described below puts all of your stock modifiers on one product, so checking the count is a single tap on the iPad.
## Restocking
To restock:
1. Go to any product with the modifier
2. Open the modifier group
3. Click the number in the **In Stock** column and enter the new count
4. Click **Save Modifiers**
The change applies everywhere the modifier is used.
Counts do not reset automatically. The number only changes when an order is placed or when someone edits it, so set it yourself at the start of each day. Once it reaches 0, every linked product shows as sold out until you restock.
Create a simple product called "Restock Items" in a hidden category. Attach all your stock modifiers to it for easy access when restocking.
## Tips
* **Name clearly** - Use names your team will understand when restocking
* **Set realistic counts** - Account for waste and mistakes
* **Restock daily** - For daily prep items, set the count each morning; it does not reset on its own
* **Use £0 pricing** - Keep the modifier from changing the price
* **Collapsed display** - Customers don't need to see required pre-selected options; ask support for **Hidden** to remove the group from view entirely
# Food Trucks & Pop-ups
Source: https://storekit.com/docs/guides/use-cases/food-trucks
Manage rotating locations and daily stock limits in storekit using day-based or location-based stores. Built for food trucks, pop-ups, and mobile caterers.
Food trucks, pop-up kitchens, and mobile caterers face unique challenges: changing locations, limited daily stock, and the need for pre-orders. This guide explains how to use multiple stores with a landing page to manage day-based or location-based menus.
## The Challenge
Traditional single-store setups don't work well when:
* You're at a different location each day
* Stock is prepared fresh and limited per day
* Customers need to pre-order for specific dates
* You want to close ordering once daily capacity is reached
## The Solution: Day/Location-Based Stores
Create a separate store for each day or location, then use a landing page to guide customers to the right one.
**Example setup for a food truck:**
| Store | Purpose |
| ------------------------- | ---------------------------- |
| Friday - Brewery District | Friday's location and menu |
| Saturday - Farmers Market | Saturday's location and menu |
| Sunday - Waterfront Park | Sunday's location and menu |
Each store has its own:
* Menu and pricing
* Inventory limits
* Opening hours
* Pre-order settings
A single landing page links them all together.
## Setting Up Day-Based Stores
### Step 1: Create Your First Store
Set up your base store with your full menu:
1. Create a new store in the dashboard
2. Name it clearly: "Friday - Brewery District"
3. Set the location address
4. Build your menu with products and modifiers
5. Enable [inventory tracking](#managing-daily-stock) for limited items
### Step 2: Duplicate for Each Day/Location
For each additional day or location:
1. Contact support to duplicate your store
2. Rename it appropriately: "Saturday - Farmers Market"
3. Update the address if location differs
4. Adjust menu if offerings vary by day
5. Reset inventory levels
Keep store names consistent: "\[Day] - \[Location]" makes it clear for both customers and your team.
### Step 3: Configure Pre-orders
Each store should accept pre-orders for its specific day:
1. Go to **Settings > Operations**
2. Enable **Pre-orders**
3. Set **Pre-order days ahead** (e.g., 7 days)
4. Configure available time slots
For a Friday-only store, customers can order anytime during the week for Friday pickup.
### Step 4: Set Opening Hours
Configure each store's hours to match when you're at that location:
1. Go to **Settings > Opening Hours**
2. Set hours only for the relevant day
3. Leave other days closed
**Example for "Friday - Brewery District":**
| Day | Hours |
| ----------------- | ------------- |
| Monday - Thursday | Closed |
| Friday | 11:00 - 20:00 |
| Saturday - Sunday | Closed |
### Step 5: Request a Landing Page
Contact support to create a landing page that:
* Shows your branding and logo
* Lists all your day/location stores
* Lets customers choose where and when to order
* Links directly to each store's menu
Provide support with:
* Your account details
* List of stores to include
* Preferred order of stores
* Any custom messaging
## Managing Daily Stock
Use inventory tracking to limit orders to what you can produce.
### Enable Inventory Tracking
For each limited item:
1. Go to **Menu > Products**
2. Click on the product
3. Enable **Track Inventory**
4. Set the available quantity
When inventory reaches zero, the item shows as unavailable.
### Reset Inventory Daily
Before each service day:
1. Open the relevant day's store
2. Go to **Menu > Products**
3. Update inventory levels for each item
**Example for a taco truck:**
| Item | Daily Stock |
| --------------- | ----------- |
| Carnitas Tacos | 50 |
| Al Pastor Tacos | 50 |
| Veggie Tacos | 30 |
| Churros | 40 |
### Sold Out Behaviour
When an item sells out:
* It displays "Sold out" on the menu
* Customers cannot add it to cart
* Existing orders are unaffected
This prevents overselling and customer disappointment.
## Example Configurations
### Weekly Food Truck Route
**5 stores, one per weekday location:**
| Store Name | Location | Day |
| ------------------------- | -------------------- | --------- |
| Monday - Tech Park | 123 Innovation Drive | Monday |
| Tuesday - City Hall | 1 Council Square | Tuesday |
| Wednesday - University | Student Union | Wednesday |
| Thursday - Hospital | Main Entrance | Thursday |
| Friday - Brewery District | 45 Hop Lane | Friday |
**Landing page shows:** "Where would you like to order from?"
### Weekend Pop-up with Limited Drops
**2 stores for Saturday and Sunday:**
| Store Name | Stock Limit | Pre-order Window |
| ------------- | ----------- | ---------------- |
| Saturday Drop | 100 covers | Opens Monday 9am |
| Sunday Drop | 100 covers | Opens Monday 9am |
Both stores have identical menus but separate inventory. When Saturday sells out, Sunday remains available.
### Multi-Location Food Truck Fleet
**3 trucks operating simultaneously:**
| Store Name | Location | Hours |
| ------------------- | ------------------ | ----------- |
| Truck 1 - Downtown | Financial District | 11:00-14:00 |
| Truck 2 - Southside | Industrial Estate | 11:00-14:00 |
| Truck 3 - Northgate | Retail Park | 11:00-14:00 |
Each truck has its own store with location-specific inventory.
## Customer Experience
### Finding You
Share your landing page URL everywhere:
* Social media bio
* Google Business Profile
* Printed materials
* At the truck itself
### Ordering Flow
1. Customer visits your landing page
2. They select their preferred day/location
3. Menu opens for that store
4. They browse, add items, and choose a pickup time
5. They pay online
6. Order prints at your truck (or you receive it in the app)
7. They collect at the scheduled time
### Pre-order Benefits
Pre-orders help you:
* **Plan prep** - Know exactly what to make
* **Reduce waste** - Cook to demand
* **Skip queues** - Faster service for pre-order customers
* **Guarantee stock** - Customers secure limited items
## Operational Tips
### Promote Each Day's Location
Post daily on social media:
* Where you'll be
* What's on the menu
* Link to that day's store
### Manage Customer Expectations
On your landing page or store notice, explain:
* "Select your pickup day below"
* "Pre-orders close 2 hours before service"
* "Items are limited - order early to avoid disappointment"
### Handle Walk-ups
Keep some stock for walk-up customers:
* Set inventory slightly below actual capacity
* Add a "Walk-up specials" product for on-the-day items
* Use the [snoozing feature](/docs/guides/menu/availability-snoozing) to add items mid-service
### Track Performance by Location
Compare stores to see:
* Which locations drive most orders
* Average order value per location
* Pre-order vs walk-up ratio
* Popular items by day
Use this data to optimise your route and menu.
## Printing and Notifications
### At the Truck
Set up a portable printer to receive orders:
1. Go to **Settings > Printing**
2. Configure your thermal printer
3. Orders print automatically with pickup time
### Mobile Notifications
There is no storekit app to download for merchants on iOS or Android. You manage orders by signing in to the dashboard at `dashboard.storekit.com` in your phone's browser. The storekit native apps in the app stores are customer-facing ordering apps (App Studio) built for your brand — they are not for taking orders.
From the dashboard on your phone you can:
* Open **Orders** → **Live Orders** to see today's orders as they arrive
* Accept an order (**Accept order**), then mark it **Ready for pickup** and **Complete**
* Check the day's sales under **Analytics** → **Reports**
To be alerted away from the screen, go to **Stores** → your store → **Settings** → **Operations** → **Order Notifications** and choose how alerts are sent to you. The list is fixed — there are two options and no "off" option:
* **Email & Browser** — "Receive email and browser notifications for new orders."
* **Browser Only** — "Only receive in-browser sound and push notifications."
A sound plays for each new order while the **Live Orders** page is open, so keep that tab open and in the foreground on the phone or tablet you use at the truck. Phone browsers suspend background tabs, which stops the sound and the real-time feed — a printer or email alerts are more reliable when the screen is not in front of you.
## Seasonal and Event Stores
The same approach works for:
### Festival Stalls
Create a store for each festival date:
* "Reading Festival - Friday"
* "Reading Festival - Saturday"
* "Reading Festival - Sunday"
### Christmas Markets
One store per market day with appropriate inventory:
* "Christmas Market - Dec 15"
* "Christmas Market - Dec 16"
* "Christmas Market - Dec 17"
### Private Events
Create a temporary store for catering events:
* Set menu specifically for that event
* Open orders a week before
* Close after the event
## Getting Started
1. **Plan your schedule** - List all days/locations you operate
2. **Create your first store** - Build menu, set inventory
3. **Contact support** - Request store duplication and landing page
4. **Configure each store** - Hours, inventory, pre-order settings
5. **Share your landing page** - Promote across all channels
## Related Guides
* [Orders Overview](/docs/guides/orders/overview) - Configure pre-order windows
* [Inventory Tracking](/docs/guides/menu/availability-snoozing) - Manage stock limits
* [Opening Hours](/docs/guides/store-settings/opening-hours) - Day-specific availability
* [Printer Setup](/docs/guides/printing/printer-setup) - Portable printing
# Pub Delivery
Source: https://storekit.com/docs/guides/use-cases/pub-delivery
Deliver food to local pubs, bars, and venues using storekit QR code ordering. Place codes at tables and your kitchen delivers food directly to seated guests.
Pub delivery lets food businesses expand their reach by placing QR codes in local pubs, bars, and other venues. Guests scan, order, and your food is delivered directly to them at the pub. This guide explains how to set up tables as pub locations with linked delivery addresses.
## How It Works
1. Partner with local pubs to place your QR codes
2. Each pub is set up as a "table" with a linked delivery address
3. Guests scan the QR code at the pub
4. They order from your menu and pay online
5. The order comes through as a delivery to that pub's address
6. You deliver the food to the pub
This model works for any food business without their own seating - dark kitchens, takeaways, food trucks, or home caterers.
## Setting Up Pub Delivery
### Step 1: Enable Dine-in Ordering
Even though you're delivering, we use the dine-in system to manage pub locations.
1. Go to **Settings > Operations**
2. Enable **Dine-in ordering**
3. Keep **Delivery** enabled (required for address linking)
### Step 2: Rename the Table Descriptor
Change "Table" to something appropriate for your setup:
1. Go to **Settings > Store Settings**
2. Set **Table Descriptor** to one of:
| Descriptor | Best For |
| ---------- | ---------------------------- |
| Pub | Traditional pub partnerships |
| Venue | Mix of pubs, bars, clubs |
| Location | General delivery points |
| Bar | Bar-focused partnerships |
Customers will see "You're ordering to: The Red Lion" instead of table numbers.
### Step 3: Create Areas by Neighbourhood
Organise pubs into areas based on your delivery zones:
1. Go to **Settings > Tables**
2. Click **Add Area**
3. Name by neighbourhood or zone:
* "City Centre"
* "Northside"
* "Within 2 miles"
This helps you manage delivery logistics and see which areas perform best.
### Step 4: Add Pubs as Tables
Add each partner pub:
1. Click into an area
2. Click the add button (labelled **+ Add** followed by your table descriptor, e.g. **Pub**)
3. Enter the pub name: "The Red Lion", "The Crown & Anchor"
Use the pub's actual name so it's instantly recognisable to customers and delivery drivers.
### Step 5: Link Delivery Addresses
This is the key step that makes pub delivery work. Each pub needs its address linked so orders route correctly.
Contact support to link a delivery address to each pub/table. Provide:
* The table/pub name
* Full delivery address including postcode
* Any delivery instructions (e.g., "Side entrance", "Ask for bar manager")
Once linked, orders to that pub automatically:
* Come through as delivery orders
* Include the pub's address
* Show on printed tickets with full delivery details
### Step 6: Generate QR Codes
Create QR codes for each pub:
1. Go to **Settings > Tables**
2. Click the QR icon next to each pub
3. Download the QR code
4. Provide to the pub for display
Consider creating branded table talkers or beer mat inserts with:
* Your logo and food photos
* The QR code
* "Scan to order food to your table"
## Example Configuration
### Pizza Kitchen with 8 Partner Pubs
**Table descriptor:** Pub
| Area | Pubs |
| ----------- | ------------------------------------------------- |
| Town Centre | The King's Head, The White Horse, The Fox & Hound |
| Riverside | The Anchor, The Boat House |
| High Street | The Crown, The Railway Tavern, The George |
Each pub has its address linked via support, so when someone at The Anchor orders a pizza, you see:
```
ORDER #1234 - DELIVERY
----------------------
Deliver to: The Anchor
12 River Lane
Townsville
TV1 2AB
Instructions: Ask for duty manager
1x Margherita (12")
1x Pepperoni (12")
2x Garlic Bread
```
## Pricing Strategies
### Option 1: Include Delivery in Menu Prices
Increase menu prices slightly for pub orders to cover delivery:
* Regular takeaway menu: £12 pizza
* Pub menu: £14 pizza (covers delivery cost)
Create a separate menu for pub ordering with adjusted prices.
### Option 2: Add a Delivery Fee
Set a standard delivery fee that applies to all pub orders:
1. Go to **Settings > Store Settings**
2. Set a **Service Charge** (e.g., 200 for £2.00)
3. Label it "Delivery fee"
### Option 3: Pub-Specific Pricing
Work with each pub on a commission or fee structure:
* Pub takes a cut of each order
* You charge a small delivery fee
* Price adjustments based on distance
## Partnering with Pubs
### What to Offer Pubs
* **No kitchen needed** - they can offer food without cooking
* **Increased dwell time** - guests stay longer when fed
* **Higher drink sales** - food encourages more rounds
* **No staff required** - you handle everything
### What to Ask For
* **Prominent QR placement** - tables, bar, menus
* **Staff awareness** - bartenders can recommend ordering
* **Delivery access** - where should drivers go?
* **Peak time coordination** - busy periods, events
### Simple Partnership Agreement
Cover these basics:
* QR code placement locations
* Delivery handoff process
* How complaints are handled
* Trial period and review
## Operational Tips
### Set Realistic Prep Times
Account for:
* Kitchen preparation
* Travel time to the pub
* Finding the customer
Set your prep time in **Settings > Operations** accordingly (e.g., 30-45 minutes).
### Delivery Instructions
When contacting support to link addresses, include helpful instructions:
* "Deliver to bar, ask staff to announce"
* "Beer garden entrance on left side"
* "Text customer on arrival"
### Handle Peak Times
Friday and Saturday nights will be busiest. Consider:
* Limiting orders per time slot
* Adding staff during pub peak hours
* Pausing distant pubs when overwhelmed
### Track Performance by Pub
Use order reports to see:
* Which pubs generate most orders
* Average order value per pub
* Peak ordering times
Focus marketing efforts on high-performing locations and consider removing underperforming ones.
## Customer Experience
When a guest scans the QR code at the pub:
1. Your menu opens with the pub pre-selected
2. They see "Ordering to: The Red Lion"
3. They browse, customise, and add items
4. At checkout, delivery address is pre-filled
5. They pay online
6. Order prints in your kitchen with pub name and address
7. You deliver to the pub
8. Staff or driver finds the customer
The guest never enters an address - it's all handled automatically.
## Scaling Up
Once you've proven the model with a few pubs:
1. **Expand the pub network** - approach similar venues
2. **Create pub-specific promotions** - "£2 off at The Crown this week"
3. **Add events** - match day specials, quiz night deals
4. **Consider exclusivity** - become the "official food partner"
## Troubleshooting
| Issue | Solution |
| --------------------------------- | ------------------------------------------------------ |
| Customer left before food arrived | Take mobile number at checkout, text on arrival |
| Driver can't find customer | Clear delivery instructions, ask pub staff to announce |
| Wrong pub selected | Ensure QR codes are pub-specific and clearly placed |
| Pub removed QR codes | Check in regularly, maintain relationship |
## Related Guides
* [Dine-in & Tables](/docs/guides/fulfillment/dine-in-tables) - Core table setup
* [Delivery Fee Strategies](/docs/guides/increasing-sales/delivery-fee-strategies) - Pricing your delivery
* [Printer Setup](/docs/guides/printing/printer-setup) - Kitchen printing
* [Opening Hours](/docs/guides/store-settings/opening-hours) - Match pub trading hours
# Room & Location-Based Service
Source: https://storekit.com/docs/guides/use-cases/room-service
Set up hotel room service, holiday park lodges, beach clubs, and other location-based ordering with storekit. Guests order to a specific room or location code.
storekit's dine-in ordering system can be adapted for room service at hotels, holiday parks, glamping sites, beach clubs, or any venue where guests order to a specific location. This guide explains how to configure tables as rooms, lodges, sunbeds, or any delivery point.
## How It Works
The dine-in fulfillment mode uses "tables" as delivery destinations. You can:
* Rename "Table" to "Room", "Lodge", "Cabin", or anything else
* Organise locations into areas (floors, wings, blocks)
* Generate QR codes for each room
* Print orders with the room/location clearly displayed
## Setting Up Room Service
### Step 1: Enable Dine-in Ordering
1. Go to **Settings > Operations**
2. Enable **Dine-in ordering**
3. Disable Delivery and Pickup if not needed
### Step 2: Rename the Table Descriptor
The table descriptor changes how locations are labelled throughout the ordering experience.
1. Go to **Settings > Store Settings**
2. Find **Table Descriptor**
3. Enter your preferred term:
| Business Type | Suggested Descriptor |
| --------------- | -------------------- |
| Hotel | Room |
| Holiday park | Lodge |
| Glamping site | Tent |
| Campsite | Pitch |
| Beach club | Sunbed |
| Pool club | Cabana |
| Hospital | Ward |
| Office building | Desk |
| Marina | Berth |
| Festival | Zone |
Customers will see "Select your room" instead of "Select your table".
### Step 3: Create Areas
Areas help organise locations into logical groups. For hotels, these might be floors or wings.
1. Go to **Settings > Tables**
2. Click **Add Area**
3. Name the area (e.g., "Floor 1", "West Wing", "Beachfront Lodges")
4. Repeat for each area
### Step 4: Add Rooms/Locations
Within each area, add your individual locations:
1. Click into an area
2. Click the add button (labelled **+ Add** followed by your table descriptor, e.g. **Room**)
3. Enter the room/location identifier:
* Room number: "101", "102", "203"
* Lodge name: "Oak Lodge", "Pine Lodge"
* Descriptive: "Lakeside 1", "Poolside A"
Use a consistent naming convention. Numbers sort naturally, but descriptive names can help staff identify locations quickly.
### Step 5: Generate QR Codes
Each room gets a unique QR code that pre-selects the location:
1. Go to **Settings > Tables**
2. Click the QR icon next to a room
3. Download or print the QR code
4. Place in the room (tent card, wall mount, welcome folder)
When guests scan the QR code, they go directly to your menu with their room pre-selected.
## Example Configurations
### Hotel Room Service
| Area | Rooms |
| ------------ | ----------------------- |
| Ground Floor | 001, 002, 003, 004, 005 |
| First Floor | 101, 102, 103, 104, 105 |
| Second Floor | 201, 202, 203, 204, 205 |
| Penthouse | PH1, PH2 |
**Table descriptor:** Room
### Holiday Park
| Area | Lodges |
| -------- | ----------------------------------------- |
| Lakeside | Heron Lodge, Kingfisher Lodge, Swan Lodge |
| Woodland | Oak Lodge, Birch Lodge, Willow Lodge |
| Hillside | Summit View, Valley View, Sunrise Lodge |
**Table descriptor:** Lodge
### Glamping Site
| Area | Tents |
| ------------ | ------------------------------------- |
| Meadow Field | Bell Tent 1, Bell Tent 2, Bell Tent 3 |
| Orchard | Safari Tent A, Safari Tent B |
| Riverside | Yurt 1, Yurt 2 |
**Table descriptor:** Tent
### Beach Club
| Area | Sunbeds |
| ---------------- | ----------------------------- |
| Beachfront Row 1 | 1, 2, 3, 4, 5, 6, 7, 8 |
| Beachfront Row 2 | 9, 10, 11, 12, 13, 14, 15, 16 |
| Cabanas | Cabana A, Cabana B, Cabana C |
| VIP Section | VIP 1, VIP 2, VIP 3, VIP 4 |
**Table descriptor:** Sunbed
### Pool Club
| Area | Locations |
| ------------- | ---------------------------------------- |
| Main Pool | Lounger 1-20 |
| Infinity Pool | Daybed 1, Daybed 2, Daybed 3, Daybed 4 |
| Cabanas | Palm Cabana, Ocean Cabana, Sunset Cabana |
| Jacuzzi Area | Hot Tub 1, Hot Tub 2 |
**Table descriptor:** Lounger
For beach and pool venues, consider using weatherproof QR code stands or attaching codes to parasols. Laminated tent cards work well for cabanas.
## Printed Orders
Orders print with the location clearly displayed. Staff see:
```
ORDER #1234
-----------
Room: 203
-----------
1x Club Sandwich
1x Caesar Salad
2x Sparkling Water
Notes: Please knock loudly
```
Configure printing in **Settings > Printing** to route orders to your kitchen printer.
## Tips for Room Service
### Set Appropriate Prep Times
Room service typically takes longer than restaurant service. Adjust your preparation time to set realistic expectations:
1. Go to **Settings > Operations**
2. Set **Preparation time** to account for:
* Kitchen prep
* Plating
* Delivery to room
### Consider Service Charges
Add a room service fee using the service charge:
1. Go to **Settings > Store Settings**
2. Set a **Service Charge** (e.g., 200 for £2.00)
3. Set **Service Charge Label** to "Room service fee"
### Use Order Notes
Enable order notes so guests can provide delivery instructions:
* "Please leave outside door"
* "Baby sleeping - don't knock"
* "Call when arriving"
### Limit Ordering Hours
Set opening hours to match when your kitchen can fulfil room service:
1. Go to **Settings > Opening Hours**
2. Configure availability (e.g., 7am-10pm)
### Pre-orders for Breakfast
Allow guests to order breakfast the night before:
1. Enable **Pre-orders** in Settings > Operations
2. Guests can schedule orders for specific times
## Beach & Pool Club Tips
### Drinks-Focused Menu
Pool and beach guests typically order drinks more than food. Structure your menu accordingly:
* Feature cocktails and frozen drinks prominently
* Create combo deals (e.g., "2 cocktails + sharing platter")
* Add quick snacks that don't require cutlery
### Handle Sunbed Turnover
Guests may move during the day. Consider:
* Asking for mobile number at checkout
* Adding a note field: "What colour parasol are you under?"
* Training staff to call out order numbers
### Weatherproof QR Codes
Outdoor environments are tough on signage:
* Use UV-resistant laminated cards
* Attach QR codes to parasol poles or lounger frames
* Consider branded acrylic stands weighted against wind
### Tab-Style Ordering
Beach guests often order multiple times. Make reordering easy:
* Keep portions snack-sized to encourage multiple orders
* Offer "Add to my order" messaging in store notices
* Consider enabling tips to reward good service
## Guest Experience
When a guest scans the QR code at their location:
1. Menu opens with their location pre-selected
2. They browse and add items to cart
3. At checkout, they see their room/sunbed/cabin confirmed
4. They pay online
5. Order prints in your kitchen
6. Staff deliver to the location
No app download required - works in any mobile browser.
## Advanced Setup
### Multiple Menus per Location Type
Create different menus for different areas:
* Premium lodges: Full menu with champagne, lobster
* Standard rooms: Regular menu
* Pool area: Drinks and snacks only
Use separate stores or menu availability to control this.
### Integration with PMS
Connect storekit with your Property Management System via [webhooks](/docs/developers/webhooks/overview) to:
* Post charges to guest folios
* Sync room occupancy
* Enable "charge to room" payment
## Related Guides
* [Dine-in & Tables](/docs/guides/fulfillment/dine-in-tables) - Core table setup
* [Orders Overview](/docs/guides/orders/overview) - Advance ordering
* [Printer Setup](/docs/guides/printing/printer-setup) - Kitchen printing
* [Tips & Service Charges](/docs/guides/payments/tips-service-charges) - Room service fees