# Add payment method Source: https://docs.marzipan.co/api-reference/account/add-payment-method /api-reference/openapi.json post /account/payments/addPaymentMethod Save a Stripe payment method to the authenticated customer's account after it has been collected client-side. # Buy again Source: https://docs.marzipan.co/api-reference/account/buy-again /api-reference/openapi.json post /account/orders/{orderId}/buy-again Add the reorderable items from a previous order back into the authenticated customer's cart. Subscription and balance-payment line items are excluded. # Change password Source: https://docs.marzipan.co/api-reference/account/change-password /api-reference/openapi.json post /account/reset-password Change the authenticated customer's password by confirming their current password. Used from the logged-in account area. # Create Account From Order Source: https://docs.marzipan.co/api-reference/account/create-account-from-order /api-reference/openapi.json post /account/create-from-order Turn a guest's order into an account by setting a password, from the order confirmation page. Requires the `confirmationToken` from the checkout response, which is only minted where there is something to offer. Succeeds only while the customer still has no password, which is what prevents a replay from overwriting live credentials. Signs the customer in and returns an access token. # Create address Source: https://docs.marzipan.co/api-reference/account/create-address /api-reference/openapi.json post /account/addresses Add a new delivery address to the authenticated customer's account. Returns the full updated list of addresses. # Create PayFast setup identifier Source: https://docs.marzipan.co/api-reference/account/create-payfast-setup-identifier /api-reference/openapi.json post /account/payments/payfast/setup Generate a PayFast tokenisation identifier so the authenticated customer can save a payment method, optionally linked to a subscription. # Create payment intent for order Source: https://docs.marzipan.co/api-reference/account/create-payment-intent-for-order /api-reference/openapi.json post /account/orders/{orderId}/createPaymentIntent Create a Stripe payment intent so the authenticated customer can pay an outstanding (unpaid) order. Returns the client secrets needed to confirm payment. # Create setup intent Source: https://docs.marzipan.co/api-reference/account/create-setup-intent /api-reference/openapi.json post /account/payments/createSetupIntent Create a Stripe setup intent so the authenticated customer can securely save a new card for future payments. # Delete address Source: https://docs.marzipan.co/api-reference/account/delete-address /api-reference/openapi.json delete /account/addresses/{address} Remove a saved address belonging to the authenticated customer. # Details Source: https://docs.marzipan.co/api-reference/account/details /api-reference/openapi.json get /account/details Retrieve the authenticated user's account details including personal information and marketing preferences. # Get order Source: https://docs.marzipan.co/api-reference/account/get-order /api-reference/openapi.json get /account/orders/{orderId} Retrieve the full detail of a single order belonging to the authenticated customer, including items, addresses, payment and tracking information. # List addresses Source: https://docs.marzipan.co/api-reference/account/list-addresses /api-reference/openapi.json get /account/addresses Retrieve all saved delivery addresses belonging to the authenticated customer, ordered by creation date. # List countries Source: https://docs.marzipan.co/api-reference/account/list-countries /api-reference/openapi.json get /account/countries Retrieve the list of countries as a map of ISO country code to country name. Optional query flags return grouped or full-detail variants. # List payment methods Source: https://docs.marzipan.co/api-reference/account/list-payment-methods /api-reference/openapi.json get /account/payments/methods Retrieve the saved (non-wallet) payment methods for the authenticated customer. # List pickup locations Source: https://docs.marzipan.co/api-reference/account/list-pickup-locations /api-reference/openapi.json get /account/pickup-locations Retrieve the active pickup shipping methods (collection points) available to the authenticated customer. # Login Source: https://docs.marzipan.co/api-reference/account/login /api-reference/openapi.json post /account/login Authenticate a user with their email address and receive an authentication token for API access. # Logout Source: https://docs.marzipan.co/api-reference/account/logout /api-reference/openapi.json post /account/logout Invalidate the current authentication token and log out the user from their session. # Orders Source: https://docs.marzipan.co/api-reference/account/orders /api-reference/openapi.json get /account/orders Retrieve a list of all orders associated with the authenticated user's account, including order status and payment information. # Password Reset Source: https://docs.marzipan.co/api-reference/account/password-reset /api-reference/openapi.json post /account/password Request a password reset link to be sent to the user's email address. The user can use the link to set a new password. # Register Source: https://docs.marzipan.co/api-reference/account/register /api-reference/openapi.json post /account/register Register a new user account with an email address. A verification email will be sent to complete the registration process. # Set new password from reset token Source: https://docs.marzipan.co/api-reference/account/set-new-password-from-reset-token /api-reference/openapi.json post /account/password/reset Set a new password using the token from a password reset email. This is a public endpoint used before the customer is logged in. # Submit Order Referral Source: https://docs.marzipan.co/api-reference/account/submit-order-referral /api-reference/openapi.json post /account/order-referral Record how the customer heard about the store, answered from the order confirmation page. Requires the `confirmationToken` from the checkout response, which is only minted where there is something to offer. Accepted only while the order has no answer, so asking twice is harmless. The answer must be one of the store's configured options unless it allows a free-text other. # Subscriptions Source: https://docs.marzipan.co/api-reference/account/subscriptions /api-reference/openapi.json get /account/subscriptions Get all active and inactive subscriptions for the authenticated user, including subscription details and renewal dates. # Update address Source: https://docs.marzipan.co/api-reference/account/update-address /api-reference/openapi.json put /account/addresses/{address} Update an existing address belonging to the authenticated customer. Returns the full updated list of addresses. # Update details Source: https://docs.marzipan.co/api-reference/account/update-details /api-reference/openapi.json post /account/details Update the authenticated user's account information such as name and email address. # Verify email Source: https://docs.marzipan.co/api-reference/account/verify-email /api-reference/openapi.json post /account/verify-email Verify the authenticated customer's email address using the verification code sent to their inbox. # Record a visit Source: https://docs.marzipan.co/api-reference/analytics/record-a-visit /api-reference/openapi.json post /visits Record a storefront visit for attribution and analytics. At least one UTM parameter is required, and the endpoint is throttled. Returns the stored visit id and the session id used for touchpoint tracking. # Collection Source: https://docs.marzipan.co/api-reference/cms/collection /api-reference/openapi.json get /cms/collections/{collectionName} Retrieve all items from a specific CMS collection by its name. # Get a blog post Source: https://docs.marzipan.co/api-reference/cms/get-a-blog-post /api-reference/openapi.json get /cms/posts/{slug} Returns the full detail of a single published blog post by its slug, including the rendered content body, SEO metadata and any collections the post belongs to. Responses are cached (fresh for 10 minutes, served stale for up to 1 hour). # List blog posts Source: https://docs.marzipan.co/api-reference/cms/list-blog-posts /api-reference/openapi.json get /cms/posts Returns all published blog posts, ordered by creation date (newest first), each with its author and featured image. This endpoint is not paginated and accepts no query parameters; the full published set is returned in a single `data` array. Responses are cached (fresh for 10 minutes, served stale for up to 1 hour). # Page Source: https://docs.marzipan.co/api-reference/cms/page /api-reference/openapi.json get /cms/pages/{pageSlug} Get the full content and details of a specific CMS page by its slug identifier. # Pages Source: https://docs.marzipan.co/api-reference/cms/pages /api-reference/openapi.json get /cms/pages Retrieve a list of all CMS pages including their metadata, status, and publication dates. # Purge a page's cache Source: https://docs.marzipan.co/api-reference/cms/purge-a-pages-cache /api-reference/openapi.json post /cms/pages/{page}/purge-cache Triggers a cache purge for the CMS page identified by `page` (its id). If a `url` is supplied in the body it is purged directly; otherwise the page's primary domain is used to derive the URL. The caller must have access to the page's tenant. # Check Occurrence Availability Source: https://docs.marzipan.co/api-reference/events/check-occurrence-availability /api-reference/openapi.json get /events/occurrences/{occurrence}/availability Check ticket availability for a specific occurrence of a recurring event, including tickets sold and remaining, capacity, waitlist status, and the occurrence date. # Claim Promoted Waitlist Spot Source: https://docs.marzipan.co/api-reference/events/claim-promoted-waitlist-spot /api-reference/openapi.json post /events/{product}/waitlist/{entry}/claim Claim a promoted waitlist spot, reserving the tickets for checkout. The entry must be in a claimable (promoted, unexpired) state. If an email is supplied it must match the entry's email. Returns checkout data with a short reservation window. # Claim Waitlist Spot via Signed Link Source: https://docs.marzipan.co/api-reference/events/claim-waitlist-spot-via-signed-link /api-reference/openapi.json post /events/waitlist/claim Claim a promoted waitlist spot using a signed link, automatically adding the event to a cart. If no cart is supplied, a new cart is created. If the event has a deposit enabled, the deposit amount is used as the line price. Returns the resulting cart. # Get Event Statistics Source: https://docs.marzipan.co/api-reference/events/get-event-statistics /api-reference/openapi.json get /events/{event}/stats Retrieve aggregate statistics for an event, including tickets sold and available, revenue totals, check-in and attendance counts, waitlist size, and cancellations. Revenue values are returned in the store's major currency unit. # Get Recurring Event Dates Source: https://docs.marzipan.co/api-reference/events/get-recurring-event-dates /api-reference/openapi.json get /events/recurring/{product}/dates List the upcoming active occurrences for a recurring event product within an optional date range. If the product is not a recurring event, an empty list is returned with an explanatory message. An event can be confined to one or more date ranges, and this endpoint reads the materialised occurrences, so no dates are returned for the gaps between them. Treat the returned dates as authoritative rather than re-deriving them from `recurrenceType` and a start date. # Get Ticket QR Code Source: https://docs.marzipan.co/api-reference/events/get-ticket-qr-code /api-reference/openapi.json get /events/tickets/{ticket}/qr-code Generate (if necessary) and return a scannable QR code for an event ticket. The QR code is returned as a base64-encoded SVG data URI suitable for direct display. # Get Waitlist Status Source: https://docs.marzipan.co/api-reference/events/get-waitlist-status /api-reference/openapi.json get /events/{product}/waitlist/status Look up a customer's waitlist status for an event by email. For pending entries, the response includes the position and the number of people ahead; for promoted entries, it includes the expiry time and whether the spot can be claimed. # Join Event Waitlist Source: https://docs.marzipan.co/api-reference/events/join-event-waitlist /api-reference/openapi.json post /events/{product}/waitlist Join the waitlist for a sold-out event. Requires the event to have its waitlist enabled and to be sold out, and the customer must not already be on the waitlist. Returns the assigned waitlist position. # Leave Event Waitlist Source: https://docs.marzipan.co/api-reference/events/leave-event-waitlist /api-reference/openapi.json delete /events/{product}/waitlist/{entry} Remove a waitlist entry, leaving the event's waitlist. Only pending or promoted entries can be removed. If an email is supplied it must match the entry's email. # List Event Occurrences Source: https://docs.marzipan.co/api-reference/events/list-event-occurrences /api-reference/openapi.json get /events/{event}/occurrences List the occurrences of a recurring event, optionally filtered by date range and status. When no start date or status filter is supplied, only upcoming occurrences are returned. If the event is not recurring, an empty list is returned with an explanatory message. An event can be confined to one or more date ranges, and this endpoint reads the materialised occurrences, so no dates are returned for the gaps between them. Treat the returned dates as authoritative rather than re-deriving them from `recurrenceType` and a start date. # Update Event Occurrence Source: https://docs.marzipan.co/api-reference/events/update-event-occurrence /api-reference/openapi.json put /events/occurrences/{occurrence} Update a single occurrence of a recurring event. Capacity cannot be reduced below the number of tickets already sold. All fields are optional and only supplied fields are updated. # Validate Waitlist Claim Link Source: https://docs.marzipan.co/api-reference/events/validate-waitlist-claim-link /api-reference/openapi.json post /events/waitlist/validate Validate a signed waitlist claim link and return the entry details needed to complete a claim. The link is verified against its signature and expiry, and the entry must be in a claimable (promoted) state. # Get a form definition Source: https://docs.marzipan.co/api-reference/forms/get-a-form-definition /api-reference/openapi.json get /forms/{slug} Returns the definition of an active form by slug so a storefront can render it: the field list (with names, labels, types, options and whether each is required) plus display settings such as the success message. # Submit a form Source: https://docs.marzipan.co/api-reference/forms/submit-a-form /api-reference/openapi.json post /forms/{slug}/submit Submits an active form. The request body is a free-form object keyed by the form's field `name`s (as returned by `GET /forms/{slug}`); values are validated dynamically against each field's definition (required/nullable, email format, `in:` for select/radio, array for checkbox, date for date fields). Include the honeypot field `_hp_name` as an empty string — if it is filled the submission is rejected as spam. Depending on the form type the submission may also create a contact message, subscribe the customer to a marketing list, and trigger notifications. # Introduction Source: https://docs.marzipan.co/api-reference/introduction Welcome to the Marzipan API documentation. The Marzipan REST API enables you to interact with the Marzipan platform, retrieve data, and allow customers to manage their orders and accounts. You may want to use our [web components](/web-components/introduction) instead of the API. ## The Storefront API The Storefront API (`/v1/…`) is the API this reference and the scopes below cover. It powers our [web components](/web-components/introduction) and headless storefronts. Requests authenticate with a tenant API token, plus a customer bearer token for actions taken on behalf of a logged-in account. ## Getting Started To get started with the Marzipan API, you will need to create an API key with the right permissions in your Marzipan [account settings](https://app.marzipan.co/settings/api). You will be able to choose the permissions you need for your API key. The current available permissions are: * `read` - read access to products, collections, events, subscriptions and CMS * `create` - create access to products, collections, events, subscriptions and CMS * `update` - update access to products, collections, events, subscriptions and CMS * `delete` - delete access to products, collections, events, subscriptions and CMS * `cart:create` - create access to carts * `cart:update` - update access to carts * `cart:read` - read access to carts * `cart:delete` - delete access to carts ## Authentication The Marzipan API uses Bearer authentication. Include your generated API key in the `Authorization` header of your HTTP requests. ```http theme={null} Authorization: Bearer YOUR_API_KEY ``` Keep your API key secure and never expose it in a public repository or share it with untrusted parties. If you believe your API key has been compromised, you can revoke it and generate a new one in your [account settings](https://app.marzipan.co/settings/api). # Send a message Source: https://docs.marzipan.co/api-reference/messaging/send-a-message /api-reference/openapi.json post /messages Submits a message to the store (for example from a contact form). A customer record is found or created from the email address, the message is logged, and admin users who opt in are notified. # Product Source: https://docs.marzipan.co/api-reference/products/product /api-reference/openapi.json get /products/{productId} Retrieve detailed information about a specific product by its unique identifier. # Products Source: https://docs.marzipan.co/api-reference/products/products /api-reference/openapi.json get /products Get a paginated list of all products with filtering and sorting options. Returns product details including pricing and availability. # Register for a back-in-stock notification Source: https://docs.marzipan.co/api-reference/products/register-for-a-back-in-stock-notification /api-reference/openapi.json post /products/{product}/back-in-stock Registers an email address to be notified when the given product is back in stock. Subscriptions are only accepted for products that are out of stock (unless the product allows overselling); requesting one for an in-stock product returns a 422. If a customer is authenticated the subscription is linked to their account. # Exclusive products Source: https://docs.marzipan.co/api-reference/rewards/exclusive-products /api-reference/openapi.json get /account/rewards/exclusive-products Get the products available exclusively to the authenticated customer based on their rewards tier. When the rewards programme is disabled for the tenant, only `enabled: false` is returned. # List tiers Source: https://docs.marzipan.co/api-reference/rewards/list-tiers /api-reference/openapi.json get /account/rewards/tiers Get all active rewards tiers and their thresholds, flagging which tier the authenticated customer is currently on and which they have achieved. When the rewards programme is disabled for the tenant, only `enabled: false` is returned. # Points history Source: https://docs.marzipan.co/api-reference/rewards/points-history /api-reference/openapi.json get /account/rewards/points-history Get the authenticated customer's paginated points transaction history, most recent first. When the rewards programme is disabled for the tenant, only `enabled: false` is returned. # Rewards status Source: https://docs.marzipan.co/api-reference/rewards/rewards-status /api-reference/openapi.json get /account/rewards/status Get the authenticated customer's current rewards status, including points balance, current and next tier, progress and redemption information. When the rewards programme is disabled for the tenant, only `enabled: false` is returned. Note: `/account/membership/*` is a deprecated alias of `/account/rewards/*` and maps to the same endpoints; use `/account/rewards/*` for new integrations. # Tier perks Source: https://docs.marzipan.co/api-reference/rewards/tier-perks /api-reference/openapi.json get /account/rewards/perks Get the perks available to the authenticated customer at their current tier. When the rewards programme is disabled for the tenant, only `enabled: false` is returned. # Detect market Source: https://docs.marzipan.co/api-reference/settings/detect-market /api-reference/openapi.json get /market Detect the visitor's market and currency/region from their geolocation. Returns a null market and the detected country code when no market could be resolved. # Storefront settings Source: https://docs.marzipan.co/api-reference/settings/storefront-settings /api-reference/openapi.json get /settings Retrieve the storefront settings payload used to configure the web components and checkout, including the store name, logo, available markets and the market resolved for the current request. # Web component settings Source: https://docs.marzipan.co/api-reference/settings/web-component-settings /api-reference/openapi.json get /settings/components Retrieve the web-components display settings for the storefront, grouped into layout, labels, collection, product, checkout, cart, product display, account and tracking option groups. # Calculate a configured subscription price Source: https://docs.marzipan.co/api-reference/subscriptions/calculate-a-configured-subscription-price /api-reference/openapi.json post /subscription-packages/calculate-price Prices a configured pick & mix subscription for a given billing frequency and set of selected items. Item prices use the effective price (sale, subscriber or list price) and are converted to the active market's currency. Returns the raw and formatted subtotal plus currency information. # Cancel subscription Source: https://docs.marzipan.co/api-reference/subscriptions/cancel-subscription /api-reference/openapi.json post /account/subscriptions/{subscriptionId}/cancel Cancel the subscription at the customer's request. Sets the status to cancelled, clears the next billing date and records the cancellation. # Get a subscription Source: https://docs.marzipan.co/api-reference/subscriptions/get-a-subscription /api-reference/openapi.json get /account/subscriptions/{subscriptionId} Retrieve full detail for one of the authenticated customer's subscriptions, including pick & mix items, upcoming shipments, additional items, billing period, preferred shipping options, payment method and any failed-renewal information. # Get subscription configuration options Source: https://docs.marzipan.co/api-reference/subscriptions/get-subscription-configuration-options /api-reference/openapi.json get /subscription-packages/{productId}/configuration Returns the options for configuring a subscription package: its subscription and pricing types, billing frequencies, and — for pick & mix subscriptions — the list of available items with their quantity constraints and pricing. Responses are cached (fresh for 5 minutes, served stale for up to 30 minutes). # Get subscription upsell Source: https://docs.marzipan.co/api-reference/subscriptions/get-subscription-upsell /api-reference/openapi.json get /account/subscriptions/upsell Return the configured subscription upsell content shown to customers who have no subscriptions. Includes the promotional heading and message and the slug of the collection of products to promote, if enabled. # List billing frequencies Source: https://docs.marzipan.co/api-reference/subscriptions/list-billing-frequencies /api-reference/openapi.json get /account/subscriptions/frequencies Return the billing frequencies available for subscriptions, keyed by the number of months in the interval with a human-friendly label. # Package Source: https://docs.marzipan.co/api-reference/subscriptions/package /api-reference/openapi.json get /subscription-packages/{packageId} Get detailed information about a specific subscription package by its unique identifier (UUID) or slug. # Packages Source: https://docs.marzipan.co/api-reference/subscriptions/packages /api-reference/openapi.json get /subscription-packages List all available subscription packages including pricing and subscription type information. Supports filtering and sorting similar to products endpoint. # Set additional items Source: https://docs.marzipan.co/api-reference/subscriptions/set-additional-items /api-reference/openapi.json post /account/subscriptions/{subscriptionId}/additional-items Add or replace additional one-off items on the subscription's next shipment. Sending an empty items array removes the additional items (for the given shipment if a shipment_id is supplied). Additional items cannot be changed while the next shipment is being processed. # Set pick & mix items Source: https://docs.marzipan.co/api-reference/subscriptions/set-pick-&-mix-items /api-reference/openapi.json post /account/subscriptions/{subscriptionId}/pick-mix-items Replace the pick & mix items on a subscription. Enforces each item's minimum and maximum quantity and the package's minimum item count. Optionally updates the billing frequency at the same time. # Skip next shipment Source: https://docs.marzipan.co/api-reference/subscriptions/skip-next-shipment /api-reference/openapi.json post /account/subscriptions/{subscriptionId}/skip Skip the next shipment or renewal for the subscription. Advances the next billing date by one cycle and clears any additional items on the skipped shipment. An optional comment can be recorded. # Update billing frequency Source: https://docs.marzipan.co/api-reference/subscriptions/update-billing-frequency /api-reference/openapi.json patch /account/subscriptions/{subscriptionId}/frequency Update the billing frequency of a subscription. The frequency must be one of the supported intervals (1, 3, 6 or 12 months). # Update payment method Source: https://docs.marzipan.co/api-reference/subscriptions/update-payment-method /api-reference/openapi.json post /account/subscriptions/{subscriptionId}/updatePaymentMethod Set the default payment method for the subscription. The payment method is looked up from Stripe using the supplied payment method ID and stored against the customer. # Update shipping options Source: https://docs.marzipan.co/api-reference/subscriptions/update-shipping-options /api-reference/openapi.json post /account/subscriptions/{subscriptionId}/shipping Update the preferred shipping option for the subscription. Choose delivery (with a saved customer address) or pickup (with a shipping method / pickup location). # Overview Source: https://docs.marzipan.co/attributes/overview Create reusable properties to describe your products and collections Attributes are reusable properties you attach to products and collections, for example Size, Colour, Material, or Care Instructions. Define an attribute once and reuse it across your catalogue. To view your attributes: 1. Log in to your Marzipan account 2. Click on **Attributes** in the main navigation menu ## Attributes list Attributes list The list shows each attribute's **name**, **slug**, **type**, and when it was **last updated**. Click **Add attribute** to create a new one. ## Creating an attribute * **Name** - the attribute name, which auto-generates the slug * **API slug** - the identifier used in the API, editable * **Type** - how values are entered: * **Text** - a single line of text * **Textarea** - a longer block of text * **Select/Dropdown** - a choice from a fixed list of options * **Number** - a numeric value * **Required** - when on, the attribute must be given a value wherever it's used * **Private** - when on, the attribute is hidden from the storefront and the API * **Options** - for a Select attribute, the list of choices, each with a **name** and a **value** ## Deleting an attribute If an attribute is in use, deleting it warns you how many products use it and removes it from those products. ## Assigning values You add attribute values inline on a product or collection, sometimes called **quick attributes**. Add an attribute and set its value there and then. The input matches the attribute's type: a text box, a number field, a dropdown, or a textarea with an optional rich-text toggle. Private attributes still show to you here so you can set their values, but they never appear on the storefront or in the API. # Changelog Source: https://docs.marzipan.co/changelog/2025 Updates and improvements to Marzipan ## Tasks Introduced a task management system for tracking work across customers, orders, and subscriptions. Tasks can be created directly from customer, order, and subscription pages, automatically linking them to the relevant entity for full context. Features priority levels (low, medium, high, urgent) with visual indicators, configurable due dates with friendly date displays (Today, Tomorrow, specific dates), and user assignment capabilities. The dedicated tasks page includes filtering by status (complete/incomplete), priority levels, and due date ranges (today, tomorrow, next 7 days, no date), flexible sorting options (due date, priority, creation date), and pagination for large task lists. Tasks integrate seamlessly with the activity log system, recording creation, updates, and completions with full audit trails including old/new value tracking for changes. Dashboard integration displays today's incomplete tasks with overdue items prioritised, sorted by priority and due date for quick access to urgent work. The system includes comprehensive authorisation policies ensuring users can only manage their assigned tasks, automated activity logging when tasks are updated or completed. Task creation is available throughout the application via notes/activity interfaces on customer, order, and subscription detail pages, with an enhanced activity component supporting both traditional notes and task creation from a single interface. ## Insights Added a comprehensive insights and analytics section providing visibility into store performance. The new Insights dashboard includes real-time metrics for revenue, orders, active subscriptions, and customer acquisition with sparkline visualisations. Features dedicated reporting pages for sales (revenue & geographic analysis), customer analytics with retention metrics and churn tracking, product performance tracking, event analytics, subscription metrics, and channel performance. Includes flexible date range comparison tools with multiple comparison periods (previous period, previous year, etc.). Dashboard reporting has been updated to show today's headline metrics with a trailing seven day overview. ## Mailchimp Integration Completely rebuilt the Mailchimp integration with OAuth 2.0 authentication support, eliminating the need for manual API key management (now deprecated). Added comprehensive webhook support for real-time bi-directional sync, including subscription status changes, email updates, profile changes, and email deliverability status. Implemented intelligent batch syncing with rate limit handling for efficient bulk customer synchronisation. Added detailed sync logging and status tracking with comprehensive error reporting. Features automatic customer profile updates from Mailchimp changes, prevention of sync loops, and smart handling of compliance states. Supports separate audience management for default customers and active subscribers with configurable merge field mapping. ## Events #### Waitlist System Implemented a waitlist management system for sold-out events. Customers can join waitlists with their desired quantity through a new dedicated waitlist dialog component. Features automatic promotion notifications when tickets become available via email with secure time-limited claim links. Includes position tracking showing customers their place in line, configurable expiration handling for unclaimed promotions, and seamless integration with the deposit payment system. Automatic inventory release and re-promotion of next customers when spots expire. #### Deposit & Balance Payments Added split payment support, allowing customers to secure tickets with a deposit and pay the balance later. Features configurable deposit amounts per event, customisable balance due dates, automatic payment request notifications at configured intervals, comprehensive ticket status tracking throughout the payment lifecycle (deposit paid, balance pending, balance paid), and clear messaging in checkout showing deposit vs. full payment amounts. Integrated throughout the web components with clear UI indicators for deposit requirements. #### Recurring Occurrences Introduced support for recurring events with multiple occurrences, perfect for ongoing workshops, tastings, and regular events. Supports daily, weekly, and monthly recurrence patterns with configurable end dates. Each occurrence maintains its own ticket inventory, attendee management, and waitlist. Customers can select their preferred date from a dropdown of available occurrences. Individual occurrence tracking for capacity, tickets sold, and revenue. #### Management Enhanced event capabilities with a comprehensive suite of management tools. Features include a full attendee management interface with detailed attendee lists and tracking, ticket cancellation workflow with automated partial or full refunds, event categorisation and types (tasting, workshop, dinner, tour), check-in functionality for day-of event management, configurable ticket limits per order, location coordinates for mapping integration, and rich email notifications throughout the event lifecycle (ticket confirmation, cancellation, balance payments, reminders). ## CMS Visual Editor & Preview System `BETA` Developed a visual page editor for the CMS system with real-time preview functionality. Added a complete preview environment (1,104 lines) supporting live rendering of CMS pages with functional web components and instant visual feedback. Enables content creators to see exactly how pages will appear before publishing, reducing errors and improving content quality. ## Customer Account Overview Redesigned the customer account interface with improved layout and better metric visualisation. Added customer lifetime value tracking, order history with sparklines for trend visualisation, subscription status overview, payment method management, and enhanced navigation between account sections. Implemented customer archiving functionality for better account lifecycle management, allowing soft deletion while preserving historical data. ## Improvements * `App` Redesigned dashboard with new stats boxes using sparklines * `App` Updated filter bar with improved layout and usability * `App` Enhanced admin notifications with user-level notification settings * `App` Added order refund ability * `App` Added comprehensive activity logging across all major entities with improved old/new value display in activity feeds * `App` Improved search functionality across all admin pages with better indexing and faster results * `App` Performance optimisations with strategic database indexes specifically for insights queries * `App` Improved menu navigation with better focus management and keyboard accessibility * `App` Enhanced London City Bond integration with better error handling and carrier selection * `App` Better handling of inventory holds with improved low stock calculations and hold expiration * `App` Enhanced event attendee sorting and filtering capabilities * `App` Added more automated tests for critical systems including events, subscriptions, and payments * `Web Components` Added comprehensive event deposit support throughout cart and checkout flows with clear messaging * `Web Components` Integrated event waitlist UI with new WaitlistDialog component for sold-out events * `Web Components` Enhanced Product component with support for recurring event occurrences, deposit displays, and waitlist triggers * `Web Components` Improved Cart component with better event item display including deposit information * `Web Components` Enhanced Checkout component with deposit payment handling and balance due tracking * `Web Components` Added Collection component improvements for better product grid layouts ## Bug Fixes * `App` Fixed handling of non-card payment methods (bank accounts, Klarna, etc.) when attaching to customer accounts in Stripe webhooks * `App` Fixed event deposit amount calculation when adding events to cart, ensuring correct pricing * `App` Fixed CMS editor preview rendering issues with nested components * `App` Fixed order status not updating to "completed" for event-only orders after ticket issuance * `App` Fixed event ticket cancellation notification delivery and timing * `App` Fixed activity log resource warning messages in newer Laravel versions * `App` Fixed attendee list sorting by various fields (name, date, status) * `App` Fixed menu focus states and overflow display issues on smaller screens * `App` Fixed customer tab navigation and display inconsistencies * `App` Fixed address update validation, geocoding triggers, and coordinate storage * `App` Fixed multiple frontend build compilation errors and TypeScript issues * `App` Fixed nullable refund amount fields in payments\_refunds table to support partial refunds * `App` Fixed sidebar menu focus state management for better keyboard navigation * `Web Components` Fixed PayPal integration issues in checkout flow * `Web Components` Fixed country name display in checkout address fields ## Low Stock Badges Added low stock badges to provide clear inventory visibility and encourage purchases. Badges can be configured globally across all products or customised on a per-product basis. Web components will honour the low stock settings and display a badge if the stock level is below the threshold and can be styled to match your brand. Stock level settings are also available through the API to support custom implementations. ## Media Management Added a new media management section where you can view all media uploaded to your account. We've added support for alt tags, made it easy to copy links to media. We've improved the media functionality in the editor to make it easier to add existing and new media to your content and to resize it. We've also laid the groundwork for future media management features including video support and image editing. ## Improvements * `App` Added support to discounts for excluding sale and subscriber pricing and to apply discounts to customers with specific tags to allow for more targeted promotions * `App` Enhanced inventory holds integration with better low stock system calculations * `App` Shipping rate calculations for London City Bond integration * `App` Enhanced media deletion confirmation and sorting functionality * `Web Components` Improved sale and subscription badge text display * `Web Components` Enhanced subscriber pricing visibility in account subscription details ## Bug Fixes * `App` Fixed inventory holds not updating correctly on quantity changes * `App` Resolved subscriber pricing issue during manual order creation * `App` Out of stock notices now take precedence over members-only notices * `Web Components` Corrected inventory holds calculations preventing cart overselling * `Web Components` Product image display in command palette search ## Pick & Mix Subscriptions Introduced flexible pick-and-mix subscriptions with dynamic pricing, allowing customers to create custom subscription boxes. ## Product Enhancements Added support for open graph images and bottle labels (front and back) on products for better social sharing and branding. ## Full Product Component Added comprehensive single product support to web components with full-page display options. ## Improvements * `App` Enhanced empty state buttons with better visual feedback * `App` Improved test and demo data generation for better development experience * `Web Components` Updated product component styling with better image dimensions and positioning * `App` Added EORI and AWRS number support for compliance requirements * `Web Components` Enhanced subscriber badge display and member pricing visibility * `Web Components` Subscription and sale pricing display improvements * `Web Components` Improved sale/subscription badge text display ## Bug Fixes * `App` Fixed notifications reshowing issue when polling for updates * `Web Components` Resolved product image sizing and positioning issues * `Web Components` Corrected product description HTML rendering * `Web Components` Fixed subscriber only notice taking precedence over out of stock notice * `Web Components` Fixed product image dimensions ## Cache Clearing for CMS Added flow for cache clearing operations in CMS for more responsive content management. ## Product Tag Autocomplete Implemented autocomplete functionality for product tags, streamlining the tagging process. ## Enhanced Customer Filtering Improved customer and subscription filters with multiple selection options for better data management. ## Member Pricing Display Added member pricing display improvements to web components for better pricing visibility. ## Bug Fixes * `App` Fixed dependency conflicts and trailing whitespace issues in API controllers * `App` Fixed effective pricing calculations in DiscountManager for subscriber customers * `Web Components` Fixed product title positioning issues ## Add to Cart Component Introduced a new reusable add-to-cart button component with redirect functionality, making it easier to integrate shopping features across different parts of your application. ## Improvements * `Web Components` Added subscription pricing frequency display options to web components. ## Bug Fixes * `App` Fixed product component to properly handle required product IDs * `App` Resolved missing fields in product editing component * `App` Fixed customer payment method update errors * `App` Corrected tags autocomplete styling issues * `Web Components` Fixed product loading div sizing and image display issues ## Bug Fixes * `App` Capitalise billing and shipping names when creating a new order * `App` Fixed UK postcode validation * `App` Fixed spacing bug on the notification page * `App` London City Bond Integration: Fixed LCB delivery update not updating order status # Changelog Source: https://docs.marzipan.co/changelog/2026 Updates and improvements to Marzipan ## Gift Vouchers Marzipan now sells and manages **gift vouchers**: stored-value codes a customer buys and somebody else spends later. Sell them from a **voucher product**, which behaves like any other product but issues a code instead of shipping something. Set the amounts on offer, let buyers enter their own, choose an expiry, and optionally restrict what a voucher can be spent on. A voucher belongs to one market, and the buyer picks who it goes to, what the message says and the day it should arrive. A new **Gift Vouchers** area lists every code you've issued, with the unspent balance, what was issued and redeemed this month, and what's expiring in the next 30 days. Every voucher has a full ledger of its movements alongside an activity trail, and can be resent, adjusted or voided. Codes are masked to their last four characters everywhere, and revealing one is a deliberate step that asks why and records it. Customers spend a voucher in the same box as a discount code. It can pay for goods, delivery and subscriptions, in part or in full, over as many orders as it takes, though never for another voucher. Refunding an order puts the value back on the code. * **Issue by hand** - for goodwill or a phone order, emailed to the recipient or handed over yourself * **Liability report** - issued, redeemed, lapsed and outstanding, month by month, under Insights * **Emails** - four new templates under **Settings > Notifications**, in a **Gift Vouchers** group * **Expiry** - off by default, with a warning email before a balance lapses See [Gift Vouchers](/gift-vouchers/overview) and [Settings > Gift Vouchers](/settings/gift-vouchers). ## Gift Checkout Customers can now send an order to somebody else. Checkout asks **who the order is for**, and a gift adds a step for the message, the recipient's details, a date not to deliver before, and a date to tell them on. The reveal date is a real promise: nothing reaches the recipient before it, and the email goes out at eight in the morning in your own timezone. **Deliver after** now holds the parcel itself rather than only showing on the order page, so a gift bought in September for Christmas stays put. Billing stays with the buyer and delivery goes to the recipient. Where a gift needs an account, as a subscription does, the recipient is created as an ordinary customer, and an existing customer gifted something at their office never has their own delivery address repointed. Turn it on with **Let customers buy gifts** under [Settings > Cart & Checkout](/settings/cart-and-checkout#gifting), and reword every question under Branding & Web Components. See [Gift orders](/orders/gifts). ## Gift Subscriptions A subscription can now be sold as a prepaid gift: a fixed number of deliveries, charged once, that never auto-renews. The giver and the recipient are held separately, so billing email stays with the person who paid and the person receiving it is never charged. At the end of the term the giver chooses what happens (hand it over, stop, or keep gifting it), and both people are told at different times, the giver first so they get the chance to renew before the recipient hears anything. Cancelling a gift stops the renewal, not the deliveries. Six new email templates cover the whole life of a gift, under **Settings > Notifications** in a **Gift** group. See [Gift subscriptions](/subscriptions/gifts). ## The Customer Account Area The account component has been rebuilt. It used to open on a dashboard of links; it now opens on the tab that has something to say: a live subscription, failing that your orders, failing that the invitation to start one. A link that names a tab still wins, and it resolves before the first render so nothing flashes. Each subscription is a card carrying its status, when the next shipment is due and what can be done about it, with past subscriptions listed quietly beneath. Orders, rewards, profile and the sign-in screens have had the same treatment. * **On a phone** - tabs scroll sideways rather than collapsing into a dropdown, **Log out** sits beside the heading, and pages hold their height while they load so your footer stays put * **Subscription upsell** - shown whenever nothing is running, rather than only to somebody who has never subscribed, and it sits inside the list so past subscriptions stay reachable * **Status messages** - the toast takes the position and the dark or light style you set for the cart notification, so the storefront and the account agree, and a failure takes your error colour * **Dates** - read as "Monday 15th March 2027", with the year always shown * **Frequencies** - follow the [wording you chose](/web-components/customisation#subscription-frequency-wording) throughout, rather than the account saying "quarterly" while the storefront says "every 3 months" See [Account](/web-components/account). ## Managing a Subscription from the Account A subscriber can now do more than look at one. Each package decides which of these it offers, so a twice-yearly club need not offer to send a shipment early while a monthly one does. * **Skip** - hold back several shipments at once, up to the allowance the package sets, with the date everything resumes stated rather than discovered by pressing Skip repeatedly. **Undo skip** sits where Skip stood for as long as a skip is holding something back * **Move a delivery** - push the next one back a week, a fortnight, or to a date of their own, counted from the day it is currently due. Only that shipment moves: the payment stays on its date and the shipments after it keep theirs * **Send now** - charge and send the next shipment immediately, offered only once it is within a fortnight and there is something scheduled to bring forward * **Change frequency** - where the package sells at more than one billing frequency, offered in the same rows the storefront uses Packages with dated shipments also list what is coming up, and a shipment further out can be skipped from that list rather than waiting for it to come round. Skipping optionally asks why, from a short list, and the answer is written to the subscription's activity trail, so you can see why a delivery was missed rather than only that it was. Set what each package allows under **Subscriptions > Packages**. See [What subscribers can do](/subscriptions/packages#what-subscribers-can-do). **Pausing has been withdrawn** in favour of skipping. The two were doing the same job, and a skip says plainly how long for. Subscriptions already paused come back on the day they said. ## Cancelling Asks Why Cancelling was a single confirmation. It now asks the reason first, offers the one thing that answers it, and only then confirms. Somebody cutting down is offered the next shipment skipped; somebody who finds it expensive is offered a less frequent schedule; somebody who would rather not say goes straight through without being stopped. The offers are limited to what the package permits and what the subscriber has left, so nobody is offered a save that would then be refused. The reason is written to the subscription and named in its activity trail. See [Cancelling and reactivating](/subscriptions/details#cancelling-and-reactivating). ## Gifts in the Account A gifted subscription now says so properly: a box of its own under the header, with the message the giver wrote, who it came from, and how many deliveries are left of the term. The list carries the same mark, so which of several subscriptions is the present can be seen without opening each one. While the giver is still paying, the recipient sees neither the price nor the payment card, and cannot add extras to a shipment somebody else is paying for. Where a gift hands over at the end of its term, the recipient is told before the day rather than after, since it needs a card of their own to carry on. See [Gift subscriptions](/subscriptions/gifts). ## Paying an Order from the Account An order that owes money now says so on the list, with **Add payment** beside it, and is paid from the order itself. * **While the bank catches up** - the order says the payment is being processed and re-reads itself until it settles, rather than falling back to "payment is due" at the moment somebody has paid * **A declined payment** - reads as a decline, with the provider's reason where there is one. It was being laid out exactly as money that arrived, which read as proof of a payment never taken * **A missing order** - says the order could not be found, rather than repeating the URL back at somebody ## Extras on Every Shipment Extras added to a subscription can be set to go with every shipment rather than only the next one, with a single checkbox on the extras box. Left unticked, which is how every existing set reads, they go with the next shipment and are cleared once it has gone out. The figure above the extras is now what the next shipment will actually cost with them included, since the price on the plan is the plan's and stays that. Extras close while a shipment is being prepared, and the account says so plainly, along with when they open again. ## Account Copy in Your Own Voice The account area shipped with its wording baked in, which reads as Marzipan's voice rather than yours. Twenty eight of those strings can now be written yourself, under **Settings > Branding & Web Components > Account**: the sign in, register, verification and password reset messages, the empty states on every tab, and the explanations shown while managing a subscription. Every field is optional and shows our wording greyed out in the box, so a shop that edits nothing keeps what it has, and clearing a field puts the default back. Write `{shipment}` and `{shipments}` rather than your own word for a delivery and they take whatever you set below, so renaming a shipment later cannot leave a message contradicting the rest of the account. See [Account copy](/web-components/customisation#account-copy). ## Your Own Word for a Shipment "Shipment" is Marzipan's word for it. A shop that says box, case or delivery can set its own, singular and plural asked for separately, and the account follows throughout. Set them under **Settings > Branding & Web Components > Labels**. See [Labels](/web-components/customisation#labels). ## Recurring Events in Separate Date Ranges A recurring event can now run in **separate date ranges** while keeping one weekday pattern and one set of times. A venue that only opens during school holidays previously had to create an event per holiday, which split its ticketing, waitlist and reporting across events that were really one product. Set the ranges under **Dates** on the event form. A range masks the pattern rather than restarting it, so a monthly event keeps its day of the month across a gap and a weekly one still lands on the weekdays you picked. Removing a range keeps any dates that have already sold tickets. See [Recurring events](/events/recurring#date-ranges). ## Ticket Sales Cut-Off on Recurring Events The sales cut-off was measured from a recurring event's **first** date, so once that date passed the gate stayed shut: every later date reported sales as closed and refused to add to the cart, however far off it was and however many tickets were left. The cut-off now counts from the date being bought. A series is only closed once every remaining date has passed its own cut-off. See [Create](/events/create#deposits). ## Reward Points and Vouchers Buying a gift voucher never earns points, and by default neither does the part of an order a voucher paid for. Turn **Exclude voucher payments** off under Settings > Rewards to let redemptions earn. See [Earning and redemption](/rewards/earning-and-redemption). ## Payment Links Send a customer a link to pay an order themselves, rather than taking their card details over the phone. **Send payment link** sits alongside Process payment on any draft or held order that settles through Stripe, and emails the customer a link to a secure Marzipan payment page. While a link is out the order is locked: its items can't be edited and payment can't be taken another way, so it can't be paid twice or paid for something that has since moved. **Resend** issues a fresh link, and **Cancel** hands the order back to you. Links expire after seven days by default, set under **Settings > Payments** and overridable per send. The payment page carries your button colours and corner radius, works whatever your website is built with, and handles collection orders by showing where to collect from. Payment links can also be sent and cancelled from the Marzipan mobile app. See [Payment links](/orders/payment-links). ## EzyPro A new integration exports your orders to **EzyPro** on a schedule, as a CSV delivered over SFTP. Each market gets its own file, folder and product-code mapping, since EzyPro keeps a separate database per market. Runs are logged with a downloadable copy of every file sent, so you can answer whether a particular day's export went. See [EzyPro](/integrations/ezypro). ## Manual Orders The [create order](/orders/create) form has been reordered so items are added before delivery, which means shipping rates and free-shipping thresholds are quoted against a basket that actually has something in it. * **One-off items** - sell something your catalogue has never held, such as corkage or a delivery surcharge, without creating a product for it * **No shipping needed** - a third option beside Delivery and Collection, for orders that are digital, comped, or handed over across the counter * **Discount suggestions** - the discount section now lists the discounts an order already qualifies for, best first, with what each is worth against that basket ## Purchase Options on Product Pages A product with upsells can now offer them as **priced boxes** showing every option's price at once, rather than a dropdown that hides all but the selected one. Collection cards show a **See options** button opening the same chooser, where each option reports its own stock so a shopper can't pick a sold-out case. See [Product](/web-components/product#purchase-options). ## Shoppers Pick Their Billing Frequency A subscription package sold at more than one billing frequency now asks the shopper which they want, as boxes or a dropdown, with your default pre-selected. Previously only pick & mix offered the choice. See [Packages](/subscriptions/packages). ## Add-to-Cart Confirmation Adding to the cart without redirecting now shows a short confirmation where the shopper is, rather than relying on a cart icon that may be scrolled out of view. Choose **Redirect**, **Notify** or **Nothing** per storefront, and set the confirmation's style and position under [Branding & Web Components](/web-components/customisation#add-to-cart-notification). Stores that never set a redirect preference pick up **Notify** as the new default. Stores that did set one keep what they had. ## London City Bond - Goods Received Turn on **Record goods received** to add stock as soon as London City Bond book goods in, at midday and 7pm, rather than waiting for the nightly sync. It also closes off the stock transfer the goods were for, and covers supplier deliveries as well as your own transfers. See [Integrations](/integrations/london-city-bond#goods-received). ## Cancelled Orders Return Their Stock Cancelling an order now puts its stock back, to the location it came off. Previously the units were simply gone, except where a London City Bond sync happened to paper over it. ## Branding & Web Components **Settings > Web Components** is now **Settings > Branding & Web Components**, since those settings brand the payment page as well as your storefront components. Nothing has moved. Only the name has changed. ## Custom Checkout Questions Ask your own questions on the checkout details step, such as a reciprocal club's membership number. Set them up in **Settings > Cart & Checkout**, optionally restricted to particular markets, and choose whether each one is required. Answers appear on the order and the customer, fill themselves in for a returning customer, and can be added to the orders CSV export. A question can carry an **auto-tag** applied to the customer once it's answered. See [Cart & Checkout](/settings/cart-and-checkout). ## Create an Account from the Order Confirmation Guests are now offered a single password field on the order confirmation, turning the order they just placed into an account without retyping anything. A verification code is emailed straight away. The wording is editable in **Settings > Branding & Web Components > Checkout**. See [Checkout](/web-components/checkout#create-an-account). The confirmation page has been rebuilt to match the checkout's split layout, with an order summary alongside the receipt and reward points shown as a banded statement. ## Referral Question on the Confirmation The "how did you hear about us?" question can now be asked again on the confirmation page when a customer skipped it at checkout, which costs no conversion and fills in a good share of the gaps. Off by default. See [Customisation](/web-components/customisation#ask-how-did-you-hear-about-us). ## Newsletter Opt-In Wording Set the wording shown beside the checkout newsletter checkbox, and whether it starts ticked. Marzipan records what each customer was actually shown, so editing the wording later never rewrites consent already given. Pre-ticked consent is not valid consent in the UK or EU. Only turn the pre-tick on if you have taken your own legal advice. ## Stock Valuation Report A new Insights report values the stock you hold at cost price, with a headline total, a breakdown per location and a sortable product table. It's market aware, exports to CSV, and counts products holding stock with no cost price separately so an understated total is visible rather than silent. See [Sales reports](/insights/sales#stock-valuation). ## Inventory * **Adjust stock** in bulk from a slide-over panel, correcting several products in one go with one location, reason and note across the batch. See [Inventory settings](/settings/inventory#adjusting-stock). * **Export** the inventory list to CSV, with a column per location. * The **Trade** adjustment reason is now called **Wholesale**, and an adjustment can name the trade customer it was made for. * Bundles can **derive their stock from constituent items**, so a case assembled from bottles you already hold stays accurate on its own. See [Product inventory](/products/inventory#stock-source). * **Overselling** now takes an optional limit, so you can sell a set number beyond the figure on screen rather than sell indefinitely. ## Per-Market Product Images Individual product images can be scoped to the markets they belong in, for the same SKU needing different imagery per market, usually because the physical label differs. An image with no markets set shows everywhere. Historical orders keep showing the image the customer actually bought. See [Markets](/settings/markets#per-market-images). ## Stripe Processing Fees Marzipan now captures what Stripe charged you to take each payment. **Processing fee** and **Net amount** are available as opt-in columns on the orders CSV export. See [Orders](/orders/overview#exporting-orders). ## Explaining a Restricted Collection A collection restricted to certain markets can carry a message and a page to link to, so a storefront can say why there's nothing to show instead of rendering an empty grid. See [Collections](/collections/overview#market-visibility). ## Tasks and Roles [Tasks](/tasks/overview) now sit behind role permissions, including who can assign work to someone else and who can see other people's tasks. Reading the task list and completing your own tasks stay open to everyone. ## Free Shipping Minimums A shipping method's **minimum order value** is measured on the goods total after discounts, with no shipping and no tax. Previously the shipping charge itself counted towards the minimum that would remove it. Both shipping screens now describe the rule as it actually works. See [Shipping](/settings/shipping#conditions). ## Flows and POS Orders Flows on the `order.paid` trigger now skip point-of-sale orders by default, since a till sale has no delivery address and uses the shared walk-in customer. Flows that want every sale opt back in with **Include POS orders**. See [Flows](/flows/overview#pos-orders). ## Google Merchant Center Improvements Product categories are now picked from Google's own taxonomy, each sync is recorded with a browsable history, and disconnecting offers to take your catalogue down at the same time. The default sync interval is twice a day. See [Google Merchant Center](/integrations/google-merchant). ## London City Bond * Every stock sync is now recorded, including runs where nothing moved, with the last ten shown on the integration page and unmatched SKUs named. * **Per-item minimum stock levels** let you set transfer triggers for the lines that move at a different rate, with `0` excluding an item entirely. See [Integrations](/integrations/london-city-bond). ## Going Live Clears Test Data Turning off [test mode](/settings/test-mode) to go live now clears test-mode customers and their test artifacts, so you start selling with a clean slate. Going live is a one-way switch. ## All-Day Event Improvements All-day events now carry their all-day setting and recurrence days through to the storefront and API, so listings display correctly. ## Recurring Events Reorganised Everything about a recurring event except its shared details belongs to a **date**, and the app now reflects that. A recurring event's own page is about the series: the dates it runs on and a way into them, while attendees, activity, the waitlist and ticket counts live on each date. Dates can be marked **out of stock** or **unavailable** so they stay listed but can't be bought, and a series is only finished once its last date has passed. See [Recurring events](/events/recurring). ## Waitlists per Date Each date of a recurring event keeps its own waitlist, and a customer can wait on **more than one date** of the same event. Seats freed on a date are offered to that date's queue, and a claimed place produces a ticket for the right day. See [Events](/events/details#waitlist). ## Subscription Shipment Windows Variable packages can now date their shipments as an **availability window** instead of fixed processing and shipping dates. Subscribers bill on their own anniversary and receive whichever window covers that date, so a package that sends "whatever is in the box right now" no longer needs a dated shipment for every renewal. See [Packages](/subscriptions/packages#shipment-dating). ## Cheapest Item Free A new discount type takes the cheapest qualifying item already in the cart off the total. One unit, not the whole line. Discounts also gain a **minimum number of items** condition, for offers framed by count rather than value. See [Create a discount](/discounts/create#type). ## Checkout Requirements Set a **minimum item count** for the cart, and optionally require **full case quantities** so physical items are ordered in whole multiples of it. Both are enforced everywhere a cart can be paid for, including express checkout and any storefront built on the API. Bundles count the items inside them. See [Cart & Checkout](/settings/cart-and-checkout#checkout-requirements). ## Market-Aware Collections Product collections can now be restricted to particular markets, and ordered differently in each one, so each region leads with what sells there. See [Collections](/collections/overview#market-visibility). ## Google Merchant Center A new integration lists your products on Google Shopping, pushing prices, stock and availability automatically whenever a product changes. Each market becomes its own feed with its own currency and target countries. See [Google Merchant Center](/integrations/google-merchant). ## Referral Sources on Orders The referral source a customer gives is now snapshotted onto the order, shown on both the customer and the order, and available to Mailchimp as an acquisition-source merge field. ## Point of Sale The till can now search for a member by **name or email**, apply a **percentage or fixed discount** to the sale, and offer a **newsletter opt-in** when taking the customer's email. See [Point of Sale](/orders/pos). ## Flows Add a step **into the middle** of a flow by hovering the line between two nodes and clicking the **+** at its midpoint. See [Flows](/flows/overview#building-a-flow). ## London City Bond Subscription shipments are now submitted to London City Bond over the API, batched into a single call, replacing the bulk order spreadsheet. Orders shipping later are held and released through the day. ## Team Management Administrators can now manage the **Team** by default. Editing roles stays owner-only. ## All-Day & Multi-Day Events Events can now be marked as **all-day**, and weekly recurring events can span **multiple days**. Editing a recurring event propagates your changes across occurrences while **preserving any occurrence times you've customised**. See the [Events guide](/events/overview). ## Product Barcodes (GTIN) Physical and bundle products now have a **barcode / GTIN** field, accepting EAN-13, UPC-A, EAN-8 and ITF-14 with live format validation. See [Products](/products/overview). ## Web Component Labels Tab Storefront text labels are now consolidated into a single **Labels** tab in Settings > Web Components, including new **Sales Closed** and **Back in Stock** button labels. You can also choose how subscription frequencies read: worded ("quarterly") or interval ("every 3 months"). See the [Customisation guide](/web-components/customisation). ## Customisable Button Text Colour Set the text colour for primary buttons, including a separate hover colour, from the Web Components styling settings. ## Product Image Options New product-image settings let you position thumbnails to the side or bottom and enable a zoom overlay, with a separate corner radius for product images. ## Order Improvements * The order page now updates its **activity feed live**, so entries written by background jobs appear automatically. * Editing an order now shows **bundle constituent items** when you add a bundle. ## Markets Carts now follow the resolved [market](/settings/markets) precedence (customer choice, then saved market, then location) instead of forcing a single assigned market. ## Forms Form **auto-reply** emails are now sent from a customisable notification template, so you can tailor the subject and message per form. See [Forms](/forms/overview). ## Point of Sale - Walk-In Customers & Receipts [Point of Sale](/orders/pos) sales can now be taken for a shared **walk-in customer** and turned into a named customer later. Email a **POS receipt** after a sale (sending it links the walk-in order to that customer), or assign a walk-in order to a customer from the order's Actions menu. Tap to Pay payments now capture and display the card brand and last four digits. ## Event Attendees Export The event **Attendees** tab now has a **CSV export**, a price column, and clickable links back to each attendee's order. See [Events](/events/overview). ## Subscriptions - Cancelled/Expired Filter Filter the [subscriptions](/subscriptions/overview) list by when subscriptions were **cancelled or expired** using a date range. ## Order Shipping Dates The order shipping-date picker now blocks past dates, and changing the date on an order held for London City Bond dispatch reschedules and logs that hold. ## Customers Set a customer's **default payment method**, and archived customers are now hidden from the main list by default. ## Marzipan Mobile App (Beta) Introduced the Marzipan **mobile companion app** for managing your store on the go. It covers orders, customers, subscriptions, tasks, and dashboard metrics, with a secure sign-in flow and **push notifications** to your device. ## Point of Sale & Tap to Pay (Beta) Added **in-person selling** through the mobile app: build a sale with **Quick Pay** and take card payments with **Tap to Pay on iPhone** via Stripe Terminal. In-person sales appear in the web app under the **POS** channel. See [Point of Sale](/orders/pos). ## Subscription Payment Safeguards Marzipan now detects blocked Stripe payments and halts renewal retries, with team notifications for blocked payments and renewal errors that members can opt into. ## Order Improvements * Added a **Free** payment-status filter and excluded free orders from the pending total. * Bulk shipment CSV import can now capture a comments column. ## Platform Upgraded the underlying platform to Laravel 12. ## Rewards & Loyalty Programme Introduced a complete loyalty programme with tiered rewards, point earning, and checkout redemption. Customers earn points on every order based on configurable earning rates. Points accumulate towards reward tiers, and each tier can offer perks like percentage discounts, free shipping, early access to products, and event invitations. Customers can see their current tier, points balance, and progress to the next tier from their account page. Points can be redeemed at checkout for a discount, with configurable redemption rates and maximum discount caps per currency. Tier membership is managed automatically based on lifetime spending, with optional notifications for tier upgrades and downgrades. Added a dedicated rewards insights dashboard showing tier distribution, revenue breakdown by tier, and programme performance trends. Rewards data (tier name, points balance) syncs to Mailchimp as merge fields for targeted email campaigns. ## Multi-Currency & Markets Added support for selling in multiple currencies from a single store. Markets define regional pricing, currency, exchange rates, and payment provider availability. Products and subscription packages can have per-market pricing set manually, or prices can convert automatically using exchange rates. Shipping methods support per-market rates. Reports and insights can be filtered by market. The web components automatically display prices in the customer's local currency. ## Inventory Locations Expanded stock management to support multiple inventory locations with a complete audit trail. Each location tracks stock independently, and every movement is recorded with a reason (order, received, write-off, stock take, transfer, return) and optional notes. Added bulk stock adjustment for updating many products at once, low stock alert emails with configurable thresholds, and inventory rules that determine which location fulfils orders based on conditions like shipping country. London City Bond stock levels now sync automatically to a dedicated inventory location. ## Shipping Zones Shipping methods now support zone-based pricing for more accurate delivery charges. Built-in zones are available for the UK (Mainland, Highlands & Islands, Northern Ireland, Isle of Man, Channel Islands) and South Africa (Major Cities, Remote Areas). Rates are automatically determined based on the customer's postcode, with support for weight-based pricing bands. ## PayFast Payment Gateway Added PayFast as a payment gateway option, supporting credit cards, instant EFT, and local South African payment methods. Includes sandbox mode for testing, webhook-based payment confirmations, and integration with the global test mode system. ## ScrubBill Fulfilment Integration Added ScrubBill as a fulfilment provider for third-party logistics. Orders can be forwarded to ScrubBill automatically or manually from the order detail page. Webhook notifications automatically update order status when ScrubBill confirms dispatch. ## Order Attribution & UTM Tracking Track where your orders come from with automatic UTM parameter capture (source, medium, campaign, content, term) and configurable referral source questions at checkout. A new Attribution insights page shows orders and revenue by traffic source, campaign, referral channel, and landing page with period comparison. ## Website Analytics For Marzipan-hosted sites, web traffic stats are now available directly in the insights section. See pageviews, unique visitors, and traffic breakdowns by page, referrer, country, browser, device, and UTM parameters. ## Global Test Mode Added a global test mode toggle under a new Developer Settings page. When enabled, all payment gateways automatically use their test/sandbox credentials. Store both live and test API keys for each gateway and switch between them with a single toggle. Turning off test mode automatically restores all live credentials. ## Email Domain Management Added a new email settings section for registering and verifying custom sending domains. View required DNS records (MX, SPF, DKIM) and their verification status. Email delivery now uses dual providers for improved reliability, with automatic email suppression for bounces and complaints. ## Web Component Customisation Significantly expanded the Settings > Web Components page with new options for customising your storefront without code: * **25+ colour settings** covering buttons, text, backgrounds, borders, badges, status messages, and account accents * **Product display** options including quick attributes on cards, configurable accordion sections on product pages, and related products * **Collection** options for card style (minimal, bordered, elevated, filled), text alignment, and image corners * **Cart** options for background/border styling, free shipping notifications, and related product recommendations * **Checkout** options for split-panel background colours, logo positioning and size, phone requirement, and referral source questions * **Account** options for subscription upsell sections See the [Web Components Customisation guide](/web-components/customisation) for full details. ## Forms Create custom forms directly in the dashboard with configurable field types including text, email, phone, textarea, select, checkbox, radio, date, and hidden fields. Form submissions trigger notifications and auto-reply emails. A new `` web component renders forms dynamically by slug, replacing the old hardcoded `` component. Fields, validation, and layout are all driven by the API, so no code changes are needed when forms are updated. ## Bidirectional Messaging Two-way email conversations with customers via Lettermint inbound processing. Replies from customers are threaded into per-customer conversation threads in the messages inbox. An inbound email status banner and UX improvements make it easy to manage ongoing conversations. ## Customer Segments Segment customers by conditions such as type, created date, order count, lifetime revenue, subscription status, reward tier, market, and form submissions. Segment membership is evaluated and cached for performance. Segments sync to Mailchimp as tags for targeted campaigns. ## Back-in-Stock Notifications Customers can subscribe to out-of-stock products to receive email alerts when stock is replenished. Back-in-stock settings are configurable per market. ## Free Checkout Carts with a zero total value can now complete checkout without requiring a payment step. ## Roles & Permissions Granular access control for admin users. Assign roles with specific permissions to control who can view and manage different areas of the dashboard. ## Per-Market Product Visibility Control which products are visible in each market, allowing you to tailor your catalogue by region. ## LCB Blocked Items Added support for blocked items in the London City Bond integration, preventing specific products from being sent to LCB for fulfilment. ## Improvements * `App` Subscription packages now have per-market pricing tabs for setting prices in different currencies * `App` Admins can now edit the scheduled renewal date for a subscription * `App` Tasks now support @mentions linking to customers, orders, subscriptions, and events * `App` Tasks can be filtered by multiple assignees * `App` Task mentions appear as activity on linked records * `App` Pinned notes feature for important task notes * `App` Phone numbers are now automatically formatted to international E.164 standard * `App` Phone number can be required at checkout (configurable) * `App` Mailchimp integration now syncs customer address fields and reward data as merge fields * `App` Customer profiles in Mailchimp update automatically when addresses change in Marzipan * `App` New subscription orders within the LCB fulfilment cutoff window are no longer sent immediately * `App` LCB stock levels sync automatically to inventory locations * `App` Product attributes can now be marked as private (hidden from customers) * `App` Fulfilment actions are now restricted to the relevant shipping countries * `App` Free shipping display threshold is now applied server-side for accuracy * `App` Added tenant management to the admin panel * `Web Components` Cart displays free shipping progress notifications * `Web Components` Cart supports related product recommendations * `Web Components` Cart supports background colour and border customisation * `Web Components` Collection pages support background colour * `Web Components` Checkout supports split-panel background colours * `Web Components` Product cards show quick attributes * `Web Components` Product pages have configurable accordion sections * `Web Components` Referral source question available at checkout * `Web Components` what3words field support for events * `App` Emails tab on customer detail page * `App` RGBA/hex-alpha colour support and button border styling options * `App` Per-market free shipping messages * `App` Email log timelines show queued\_at timestamps * `App` Domain change handling for store email with unverified domain warnings * `App` Cancellation email control * `App` Form submissions consolidated view * `Web Components` Dynamic form component with API-driven field rendering * `Web Components` Back-in-stock notification form on out-of-stock products * `Web Components` Themed button border CSS variables * `Web Components` Free checkout support * `Web Components` Bundle optimisation with lazy loading and DOM-conditional loading * `Web Components` Market switcher (renamed from currency switcher) ## Bug Fixes * `App` Fixed customer archive referencing non-existent subscribed column * `App` Fixed duplicate route names breaking route caching * `App` Fixed market pricing on event deposits * `App` Fixed subscription auto-renewal when no linked plan * `App` Fixed discount errors on checkout * `App` Fixed Apple Pay pickup order issues * `App` Fixed handling of duplicate order constraint on payment retry * `App` Fixed pick & mix renewal pricing calculations for per-item subscriptions * `App` Fixed subscription renewal items in cart price recalculation * `App` Fixed cart currency for shipping method price formatting * `App` Fixed Mailchimp webhook field mapping for subscription and address data * `Web Components` Fixed cart display threshold currency inputs * `Web Components` Fixed checkout customer mismatch when switching accounts * `Web Components` Fixed shipping method validation for flat rate methods * `App` Fixed case-insensitive email uniqueness enforcement * `App` Fixed invalid UUID route parameters returning 500 instead of 404 * `App` Fixed Stripe charge using incorrect stripe\_id field * `App` Fixed message compose state, unassigned filter, and select all toggle * `App` Fixed loading button size shift during loading state * `App` Fixed Fathom API rate limiting * `App` Fixed tenant context in queued jobs * `Web Components` Fixed account modals overflowing viewport on smaller screens * `Web Components` Fixed billing details showing "same as shipping" for event-only carts * `Web Components` Fixed white background on AddToCart component * `Web Components` Fixed Rewards tab showing when rewards aren't enabled * `Web Components` Fixed back-in-stock form layout below out-of-stock button * `Web Components` Fixed cart member pricing, buy again button, and subscription date modals * `Web Components` Fixed MarketSwitcher dropdown showing empty # Collections Source: https://docs.marzipan.co/cms/collections Group pages and posts into ordered collections for navigation menus and listings. Collections are ordered groupings of [pages](/cms/pages) and [posts](/cms/posts). They're the way you build navigation menus and listings for your site, without hard-coding those links into a template. To find your collections, click on **CMS** in the main navigation menu, then open **Collections**. These are **CMS collections**, which group content. They are not the same as [product collections](/collections/overview), which group products in your catalogue. ## What a collection holds A collection is an ordered list of items. Each item in a collection can have its own: * **Title** * **Link** * **Description** Because the list is ordered, the sequence you set in the dashboard is the sequence your visitors see, so a collection works equally well as a navigation menu or as a curated listing. ## Using collections Collections are useful for: * **Navigation menus** - a header or footer menu, with each item pointing at a page * **Listings** - a blog index, a set of guides, or any other grouping of content you want to surface together Collections are also available over the headless CMS API at `/v1/cms/collections`, so a front end hosted elsewhere can pull the same navigation and listings. See the [API reference](/api-reference/introduction). # Overview Source: https://docs.marzipan.co/cms/overview Marzipan includes a lightweight CMS for building and managing content on Marzipan-hosted sites. Marzipan includes a lightweight CMS for managing the content on Marzipan-hosted sites. You can build pages, publish posts, group content into collections, and manage the templates and files that power your site, all from your dashboard. To open the CMS: 1. Log in to your Marzipan account 2. Find the **Content** section in the main navigation menu 3. Click **Pages**, **Posts**, **Collections** or **Media** to work on that part of your site ## How content is structured The CMS is built from four pieces that work together. | Area | What it holds | | ----------------------------------- | --------------------------------------------------------------------------- | | [**Pages**](/cms/pages) | Content pages built from templates, edited through sections and fields | | [**Posts**](/cms/posts) | Blog-style articles with an excerpt, content, author and images | | [**Collections**](/cms/collections) | Ordered groupings of pages and posts, used to build navigation and listings | | [**Website**](/cms/website) | The templates and shared files that your pages are built from | Pages and posts hold the content. Collections organise that content into menus and listings. The Website area holds the building blocks: the templates a page is built from, and the files shared across your site. ## Headless CMS API All of your content is also available over the **headless CMS API**, so you can pull pages, posts and collections into other front ends: * `/v1/cms/pages` * `/v1/cms/posts` * `/v1/cms/collections` See the [API reference](/api-reference/introduction) to get started. ## In this section Build and publish content pages Write blog-style articles Group content for navigation and listings Manage templates and shared files # Pages Source: https://docs.marzipan.co/cms/pages Build, edit and publish the content pages of your Marzipan-hosted site. Pages are the content pages of your site. Each page is built from a **template**, and you edit its content through **sections** and **fields**, so you're never editing raw code. To find your pages, click on **CMS** in the main navigation menu. The Pages list is the first thing you see. The CMS Pages list in the Marzipan dashboard ## Sections and fields A page's template defines the **sections** it contains, and each section contains **fields** that you fill in. Field types include: * **Simple text** * **Rich text** (WYSIWYG) * **HTML** * **Image** Because the layout comes from the template, editing a page is a matter of filling in its fields. To change the layout itself, edit the template in the [Website](/cms/website) area. ## Page settings Each page also has: * A **slug** for its URL * **SEO** meta title and description, plus a share image * A **publish status**, with the option to **schedule** publishing for a future date ## Duplicating a page You can **duplicate** a page to reuse its layout. The duplicate arrives with the same sections and fields already in place, ready for you to edit and give a new slug. Duplicating is the quickest way to build a set of pages that share a layout (landing pages, for example) without rebuilding each one from its template. ## Previewing a page Generate a **preview link** to review a page before it goes live. This lets you check your changes, and share them with the rest of your team, while the page is still unpublished or scheduled. # Posts Source: https://docs.marzipan.co/cms/posts Write and publish blog-style articles for your Marzipan-hosted site. Posts are blog-style articles. Where a [page](/cms/pages) is built from a template and assembled from sections, a post is a single piece of writing with a fixed set of fields. To find your posts, click on **CMS** in the main navigation menu, then open **Posts**. ## Post content Each post has: * A **title** and **slug** * An **excerpt** and **content** * An **author** * **Featured** and **social** images * **Meta** title and description * A **draft** or **published** status The **excerpt** is the short summary used in listings, while the **content** is the body of the article itself. ## Images A post carries two images: * The **featured** image, used on the post and in listings * The **social** image, used when the post is shared ## Publishing A post is either a **draft** or **published**. Drafts stay off your site until you're ready, so you can write in the dashboard and publish when the piece is finished. Group your posts into a [collection](/cms/collections) to build a blog index or a curated reading list. # Website Source: https://docs.marzipan.co/cms/website Manage the templates and shared files that your Marzipan-hosted site is built from. The **Website** area is where you manage the building blocks of your site. Where [pages](/cms/pages) and [posts](/cms/posts) hold your content, the Website area holds the templates that content is poured into, and the files shared across it. To open it, click on **CMS** in the main navigation menu, then open **Website**. ## Templates Templates define the layout a page is built from: the sections a page has, and therefore the fields you fill in when you edit it. Each template has its own **CSS** and **JS**, so a template carries the styling and behaviour it needs. You can **preview** and **validate** a template before using it, so you can check it renders as expected and catch problems before any page depends on it. Changing a template changes every page built from it. Preview and validate first, then check a page that uses the template. ## Files Files are the shared assets used across your site: the things more than one template or page needs to reference. Manage them here rather than uploading a copy for each page that uses them. # Overview Source: https://docs.marzipan.co/collections/overview Group products into collections to organise your catalogue Collections are manual groupings of products. Use them to organise your catalogue and to power the product listings on your storefront. Collections are always manual: you choose exactly which products they contain. There are no automatic or rule-based collections. To view your collections: 1. Log in to your Marzipan account 2. Click on **Collections** in the main navigation menu ## Collections list Collections list The list shows each collection's **name**, **slug**, **status**, **number of products**, and when it was **last updated**. Click **Add collection** to create a new one. ## Creating and editing a collection * **Name** - the collection name * **Description** - a description of the collection * **Published** - when on, the collection is live on your storefront * **Products** - add the products in the collection, and **drag to reorder** them. The order controls how products display on your storefront. You can also add subscription packages and events. * **Attributes** - set collection-level [attribute](/attributes/overview) values ## Market visibility For multi-market stores, the **Market visibility** section controls where a collection appears. * Leave no markets assigned and the collection is visible everywhere * Assign markets and it's visible only in those ### Explaining a restricted collection A collection that isn't available in a shopper's market would otherwise just look empty. Set an optional **message** and a **CMS page** to link to, and your storefront can say why there's nothing to show instead of rendering a blank grid. The message is only sent to the storefront when the collection genuinely isn't available in that market, so it never reaches shoppers who can see the collection perfectly well. ### Per-market ordering Once a collection is in more than one market, ordering tabs appear, one per market it belongs to, alongside **Default**. * **Default** is where you add and remove products * Market tabs are **reorder-only**, letting each region lead with what sells there Products you've given an explicit position in a market come first, with the rest behind them in the default order. # Adding a Customer Source: https://docs.marzipan.co/customers/create Create a customer record manually in Marzipan Most customers create their own account when they order through your website. You can also add a customer record yourself, which is useful when you are setting up a wholesale account, taking a phone order, or bringing existing contacts into Marzipan. ## Adding a customer To open the new customer form: 1. Log in to your Marzipan account 2. Navigate to **Customers** in the main menu 3. Click the **Add customer** button in the top-right corner Add their **First name** and **Last name**. If they buy on behalf of a business, add the **Company** as well. Enter the customer's **Email** address and **Phone** number. Select either **Direct** or **Wholesale**. The customer type is set here, when the customer is created. It cannot be changed later from the profile. Enter the customer's default **address**. This is used as their billing and delivery address, and you can add more addresses later from their profile. Review the details and save. You will be taken to the customer's [profile](/customers/details). You can also create a customer without leaving the manual order form. See [Manual Orders](/orders/create). # Details Source: https://docs.marzipan.co/customers/details View and manage an individual customer Opening a customer from the [customers list](/customers/overview) takes you to their profile. This is the full picture of one customer: who they are, what they have bought, what you have sent them, and where they stand in your loyalty programme. Customer profile The profile is organised into tabs. ### Overview The Overview tab gives you an at-a-glance picture of the customer: * **Highlight cards** - total and average spend, how long they have been a customer for, and their number of orders, subscriptions and events * **Activity feed** - a running history of the customer, including any notes you add. It updates automatically * **Latest orders and subscriptions** - their most recent records ### Activity The full activity timeline for the customer, with the option to add a note. ### Orders, Subscriptions and Events Each of these tabs lists the customer's records of that type, so you can see everything they have ordered, subscribed to or attended. ### Emails A record of every email sent to the customer, each with a delivery status: * `Queued` * `Sent` * `Delivered` * `Bounced` * `Spam` * `Failed` Open any email to see its detail view. ### Rewards When rewards are enabled, this tab shows the customer's points and tier history. You can **Adjust** their points balance or set their tier directly from here. See [Rewards](/rewards/overview). ## Panels Alongside the tabs, the profile shows a set of panels you can manage. ### Details Name, email (with a verified/email-status indicator), phone, company, date of birth, registered date, market, source and tags. ### Addresses The customer's saved addresses, along with any delivery instructions. You can add, edit and remove addresses, and set which one is the default. ### Payment methods The customer's saved cards, including which is the default. You can manage these from here. ### Mailing-list consent Toggles for the customer's marketing consent, so you can keep their preferences up to date. ### Rewards When rewards are enabled, a block showing the customer's tier, points and progress towards the next tier. See [Rewards](/rewards/overview). ### Tags Tags are free-form labels you can add to a customer to help you group and filter them. When rewards are enabled, the customer's reward tier also appears as a tag. ## Actions From a customer's profile you can: * **Edit details** - update their name, contact details and other information * **Archive / Unarchive** - archive a customer you no longer deal with, or restore them. Archiving can also unsubscribe them from all mailing lists * **Verify email** - manually mark the customer's email address as verified * **Manage addresses and payment methods** * **Manage marketing consent** * **Manage tags** * **Adjust points or set tier** - when rewards are enabled, from the **Rewards** tab The customer's **type** (`Direct` or `Wholesale`) is set when the customer is [created](/customers/create) and cannot be changed from the profile. # Overview Source: https://docs.marzipan.co/customers/overview View, organise and manage the people who buy from you The Customers section is where you manage everyone who buys from you. From here you can browse your customer list, dig into an individual customer's history, and keep their details, addresses and marketing preferences up to date. To view your customers: 1. Log in to your Marzipan account 2. Click on **Customers** in the main navigation menu 3. By default the list displays all your customers, most recently registered first ### Customers list The main list shows key information for each customer. Customers list * **Name** - the customer's name * **Email** - their email address * **Orders** - how many orders they have placed * **Last order** - when they last ordered * **Registered** - when they created their account Click any customer to open their [profile](/customers/details). You can sort the list by **Registered**, **Last order**, **Name**, **Email** or **Orders**. ### Header actions The top-right corner of the list has a few actions: * **Customer Insights** - opens the customers report so you can review your customer base (see [Insights](/insights/overview)) * **Segments** - view and manage your customer [segments](/customers/segments) * **Export** - download the customers in the list as a CSV file * **Add customer** - open the [new customer form](/customers/create) ### Filtering You can narrow the list using the following filters: * **Customer type** - `Direct` or `Wholesale` * **Has subscription** - customers with an active subscription * **Mailing list** - customers subscribed to a given list * **Segment** - customers in a chosen segment * **Number of orders** * **RFM segment** - an automatic loyalty segment based on how recently, how often and how much a customer buys: `Champions`, `Loyal Customers`, `Potential Loyalists`, `Promising`, `New Customers`, `Need Attention`, `About to Sleep`, `At Risk`, `Cannot Lose`, `Hibernating` and `Lost` * **Tags** * **Total spent** * **Archived** - include archived customers * **Market** - only shown when your store has more than one market Customer filter options Apply filters *before* clicking the **Export** button to only export the customers you need. ## Next steps Create a customer record manually, including their type and default address. Explore a customer's orders, subscriptions, emails, rewards and activity. Group customers into dynamic segments based on their behaviour and attributes. # Segments Source: https://docs.marzipan.co/customers/segments Group your customers into dynamic segments based on their behaviour and attributes. A segment is a dynamic group of customers built from conditions you choose. Membership updates automatically as customers meet or stop meeting those conditions, so you never have to maintain a list by hand. You manage segments from the **Customers** page. Click **Segments** in the top-right. Customer segments list ## Building a segment Each segment has: * **Name** - a label for the segment. * **Sync to Mailchimp** - an optional toggle to keep the segment in step with a Mailchimp tag (see [Mailchimp sync](#mailchimp-sync) below). * **Condition builder** - the rules that decide who belongs to the segment. The condition builder uses rows of **\[condition] \[modifier] \[value]**. Within a group, choose **Match all** to require every row (AND) or **Match any** to require just one (OR). If you add multiple groups, the groups always combine with AND. Segment condition builder ### Available conditions | Condition | Modifiers | | :-------------------------- | :------------------------------------ | | **Tag** | has / does not have | | **Customer type** | is / is not | | **Email status** | subscribed / unsubscribed / bounced | | **Archived status** | — | | **Market** | — | | **Created date** | before / after / on | | **Lifetime revenue** | greater than / less than | | **Order count** | greater than / less than / equal to | | **Subscription status** | active / expired / paused / cancelled | | **Has active subscription** | — | | **Submitted form** | has / has not submitted a given form | | **Reward tier** | is / is not | | **Reward points** | greater than / less than / equal to | ## Managing a segment Membership is evaluated and cached, so a segment's customers are ready to view at any time. From a segment you can: * **View its customers** - see everyone who currently matches. * **Sync now** - re-evaluate membership straight away. * **Export** - download the members as a CSV file. * Delete the segment. ## Mailchimp sync Connect Mailchimp under **Settings > Integrations**. When you turn on **Sync to Mailchimp** for a segment, Marzipan creates a tag named `Segment: {name}` on your default audience and syncs only the subscribed members, pushing their tag and membership. Customers who aren't subscribed are left out. Reward and address data reach Mailchimp as **merge fields** through the separate per-customer sync, not through segment syncing. # Overview Source: https://docs.marzipan.co/dashboard The dashboard is your landing page in Marzipan, with an at-a-glance view of how your store is performing. The dashboard is the first thing you see when you log in. It gives you a personalised summary of how your store is performing, highlights anything that needs your attention, and links straight through to the orders, subscriptions and tasks behind the numbers. Screenshot of the Marzipan dashboard Test-mode data is excluded from all dashboard stats, so the figures you see reflect real trading only. See [Test mode](/settings/test-mode) for more. ## Welcome header A personalised welcome header greets you at the top of the page, so you always know whose store you're looking at. ## Setup checklist New stores see a **Setup checklist** that walks owners and admins through the key steps to get up and running, such as disabling test mode and going live. Work through the steps at your own pace, then dismiss the checklist once you're done. It won't come back once dismissed. ## Performance stats and chart The performance section shows your headline numbers, **revenue**, **orders** and **subscriptions**, alongside a chart of the same figures over time. * Choose a **date range** to control the period the stats and chart cover. * If you sell across more than one market, use the **market selector** to focus on a single market or view them all together. Your choice is remembered for next time. ## Revenue protection Two tiles surface money that's at risk so you can act on it quickly: * **Failed payments** - jumps straight to the affected orders so you can chase or retry payment. * **Pending cancellations** - shows subscriptions that are due to cancel, so you can reach out before they lapse. ## Today's tasks The **Today's tasks** section lists tasks that are due or overdue, so nothing slips through the cracks. See [Tasks](/tasks/overview) for more on creating and managing them. ## Latest orders and subscriptions Two tables round out the dashboard: * **Latest orders** - your most recent orders, with a link through to the full [order details](/orders/details). * **Latest subscriptions** - your most recently created subscriptions. # Create a discount Source: https://docs.marzipan.co/discounts/create Set up a discount, with its type, validity, limits and conditions To create a discount: 1. Log in to your Marzipan account 2. Navigate to **Discounts** in the main menu 3. Click the **Add discount** button in the top-right corner Create discount form ## The basics * **Discount code** - the code customers enter at checkout. Use **Generate code** to create one automatically. * **Description** - a short description shown to the customer at checkout. * **Automatically apply** - when enabled, the discount applies on its own without the customer needing to enter a code. ### Type Choose how the discount reduces the price: * **Fixed amount** - takes a set amount off the order. * **Percentage** - takes a percentage off the order. * **Free shipping** - removes shipping costs. * **Free item** - adds a product to the order for free. Choose the product to add and set a label prefix (such as `FREE`). * **Cheapest item free** - takes the cheapest qualifying item already in the cart off the total. One unit, not the whole line, so three bottles at £10 is £10 off. **Free item** adds a product you nominate to the cart. **Cheapest item free** discounts something the customer has already chosen. The cheapest item is picked from the same set your product, product-type and pricing conditions already define, so a discount limited to a collection only ever gives away an item from it. ### Market For multi-market stores, choose the market the discount applies to. A market is **required for fixed-amount** discounts; for all other types it's optional and the discount applies to all markets when left unset. A fixed amount is a sum of money, so it needs a market to tell it which currency to use. Percentage and free-shipping discounts work in any currency, so they don't. ### Validity Set **valid-from** and **valid-until** dates to control when the discount is active. Leave a date blank for no start limit or no expiry. ### Minimum spend Set a minimum spend the cart must reach for the discount to apply. This is measured **before discounts and shipping**. ### Limits * A **total usage limit** caps how many times the discount can be used across all customers. * A **one-use-per-customer** option limits each customer to a single use. ### Conditions Restrict when a discount applies: * The cart must reach a **minimum number of items**, for offers framed by count rather than value. Giveaway lines aren't counted, so a free item can't help satisfy the condition that produced it. * The cart must contain a given item type (for example, a **Subscription**). * The customer must have an active subscription, or one of certain **tags**. * The discount applies only to specific products or product types (**Physical**, **Bundle**, **Subscription**, or **Event**). * The discount applies only to certain shipping methods. ### Pricing exclusions Optionally stop a discount from stacking on already-reduced prices: * Don't apply to sale pricing. * Don't apply to subscriber pricing. Use pricing exclusions when you run a broad promotion but don't want it compounding on items that are already discounted. # Overview Source: https://docs.marzipan.co/discounts/overview Create discount codes and automatic discounts to reduce order prices. Discounts reduce an order's price, either automatically or when a customer enters a code at checkout. Use them to run promotions, reward loyal customers, or offer free shipping and free items. To view your discounts: 1. Log in to your Marzipan account 2. Click on **Discounts** in the main navigation menu 3. The overview page will display all of your discounts ### Discounts Each discount in the list shows: * **Code** - the code customers enter at checkout, with its description underneath * **Status** - whether the discount is currently active, plus an `auto applied` badge when it applies without a code * **Usage** - how many times the discount has been used, against its usage limit where one is set * **Valid from** and **Valid until** - the dates the discount is active between Click on any discount to view and edit it. Use the **Add discount** button in the top-right corner to create a new one. ### Types Every discount has a **type**, which determines how it reduces the price: | Type | What it does | | ----------------- | ------------------------------------ | | **Fixed amount** | Takes a set amount off the order | | **Percentage** | Takes a percentage off the order | | **Free shipping** | Removes shipping costs | | **Free item** | Adds a product to the order for free | ### Codes and automatic discounts A discount reaches the customer in one of two ways: * **By code** - the customer enters the discount code at checkout * **Automatically** - with **Automatically apply** enabled, the discount applies on its own as soon as the cart meets its conditions, with no code needed Automatic discounts are ideal for site-wide promotions and subscriber perks. Codes are better when you want to control who can use the offer. ## In this section Set up a discount, with its type, validity, limits and conditions # Creating an event Source: https://docs.marzipan.co/events/create Create an event and set its tickets, capacity and deposits Create an event to sell tickets to a tasting, tour, workshop, class or course. An event can be a one-off or recurring. To create an event: 1. Log in to your Marzipan account 2. Navigate to **Events** in the main menu 3. Click the **+ Create event** button in the top-right corner Create event form ## Creating an event Enter the **Name** and **description** for the event. These are shown to customers. Select the **Event type**: Tasting, Tour, Workshop, Class, Course or Other. Set the **Recurrence**: None, Daily, Weekly or Monthly. Weekly lets you pick the weekdays to repeat on, and you can set a **recurrence end date**. A recurring event can also run in [separate date ranges](/events/recurring#date-ranges), so a series can pause and pick up again without becoming a second event. Recurring events create **occurrences**: individual dated instances that customers book onto. See [Recurring events](/events/recurring). Use the **All-day** toggle, or set a start and end date and time. Multi-day events are supported. Enter the **Location** as a text address, plus an optional **what3words** address. **Email instructions** are included in the ticket emails sent to attendees. * **Max tickets per order** - the most tickets one customer can buy in a single order * **Price** - the ticket price, with optional sale, subscriber and wholesale prices * **Capacity** - the quantity of tickets available Optionally set up **Deposits**, **Check-in** and a **Waitlist**. See below. ## Deposits You can optionally take a **deposit** rather than the full price upfront: * **Deposit amount** - the amount taken upfront * **Balance due days** - the number of days after which the balance falls due * **Auto-charge** - charge the balance automatically when it falls due You can also set a **sales cut-off** to close ticket sales a set number of days before the event. On a recurring event the cut-off is counted from **each date**, so it closes sales for a date a set number of days before that date rather than before the first in the series. A series only reports its sales as closed once every remaining date has passed its own cut-off. Outstanding balances can be requested or processed from the event detail screen. See [Details](/events/details#deposits-and-balances). ## Check-in and waitlist * **Check-in** - enable QR check-in so attendees can be checked in at the door * **Waitlist** - enable a waitlist to capture demand once tickets sell out A waitlist requires a capacity. # Details Source: https://docs.marzipan.co/events/details Manage attendees, check-in, the waitlist and balances The event detail screen is where you manage an event once it is live: its attendees, check-in, waitlist and any outstanding balances. To open an event: 1. Log in to your Marzipan account 2. Click on **Events** in the main navigation menu 3. Click on any event in the list Event detail screen with tabs ## Tabs The event detail screen is organised into tabs: * **Overview** - tickets sold, revenue and waitlist figures * **Attendees** - a table of everyone booked on * **Activity** - the history of actions on the event * **Waitlist** - position, name, tickets and status For a [recurring event](/events/recurring), these tabs belong to a single **date**. The series page shows its dates instead. See [Recurring events](/events/recurring#the-series-and-its-dates). ## Attendees The **Attendees** tab shows a table of everyone booked on to the event. Columns include: * **Customer** * **Tickets** * **Price** * **Deposit/balance** * **Order** * **Checked-in** * **Status** You can filter the table by **status**. ### Exporting attendees Click **CSV export** to download the attendees table as a CSV file. ### Bulk check-in Select attendees in the table to **bulk check-in** everyone at once. ### Attendee actions From an attendee's panel you can: * **Check in** the attendee * **Resend the ticket email** * **Request balance payment** - for deposit bookings with an outstanding balance * **Cancel or refund** the booking The ticket links back to its originating order. ## Tickets and QR check-in Ticket emails include a **QR code**. At the door, open the QR scanner in the Marzipan app and scan each attendee's code to check them in. You can also check attendees in from the attendees table, either individually or with **bulk check-in**. ## Deposits and balances For bookings taken on a deposit, you can request or process the outstanding **balance payment** directly from the event, using **Request balance payment** on the attendee's panel. Deposits are configured when you create the event. See [Create](/events/create#deposits). ## Waitlist The **Waitlist** tab shows everyone waiting for a ticket: * **Position** * **Name** * **Tickets** * **Status** You can **add** and **remove** entries. For a [recurring event](/events/recurring), each date keeps its own waitlist, numbered from 1. A customer can wait on **more than one date** of the same event. When a seat frees up on a date, the queue for that date is offered it, and raising a date's capacity offers the new seats to that date's queue. Someone claiming a waitlist place gets a ticket for the date they were waiting on. A date that has since sold out can't be claimed into. ## Event Insights For reporting on attendance, revenue and demand, use **Event Insights**. See [Insights](/insights/overview) for more. # Overview Source: https://docs.marzipan.co/events/overview Create and sell tickets for tastings, tours and events Events let you sell tickets to tastings, tours, workshops, classes and courses. An event can be a **one-off** or **recurring**. Recurring events create **occurrences**: individual dated instances that customers book onto. ### At a glance * **Tickets** - customers buy tickets to an event, and receive a ticket email * **Capacity** - the quantity of tickets available for an event * **Deposits** - take a deposit rather than the full price upfront, with the balance falling due later * **Waitlist** - capture demand once tickets sell out * **Check-in** - check attendees in at the door by scanning the QR code on their ticket ## Events To view your events: 1. Log in to your Marzipan account 2. Click on **Events** in the main navigation menu 3. The list displays your events, with one row per occurrence for recurring events Events list Each row shows: * A **recurring badge** for recurring events * The **next date** * **Tickets sold** out of the total * **Sold-out** or **waitlist** indicators Click on any event in the list to view its [event details](/events/details). ### Filtering and sorting You can filter and sort the list: * Filter by **Status** - Upcoming, Past or Cancelled * Filter by **Event type** * Filter by **Recurrence** * Filter by **Availability** * Sort by **date** or **tickets sold** ### Event Insights For reporting on attendance, revenue and demand, use **Event Insights**. See [Insights](/insights/overview) for more. ## Next steps Create an event and set its tickets, capacity and deposits Manage attendees, check-in, the waitlist and balances Manage occurrences of a recurring event Report on attendance, revenue and demand # Recurring events Source: https://docs.marzipan.co/events/recurring Manage the occurrences of a recurring event A recurring event creates **occurrences**: individual dated instances that customers book onto. Recurrence is set when you create the event, and can be Daily, Weekly or Monthly. See [Create](/events/create). Recurring events give you fine control over each occurrence. ## The series and its dates Almost everything about a recurring event belongs to a **date** rather than to the series: attendees, activity, the waitlist, notes and tickets sold are all per-date. The events list reflects this by showing a recurring event as one row per date, so most of the time you're working on a date. The series page itself is about the run as a whole: * An **Occurrences** tab listing every date, with the upcoming dates alongside it * **From** and **Until** covering the whole run, the days of the week it lands on, and how many dates are scheduled * **Total** tickets sold, revenue and outstanding across every date * **Available** reads per date, for example `100 per date` To open the series from a date, use **View parent event** in the date's **Actions** menu, or **View all** beside the recurrence line. A recurring event is only finished once its **last** date has passed, not its first. Your storefront and the [API](/api-reference/introduction) both read the dates Marzipan has generated, so they never show a date in a gap between ranges. Treat those dates as authoritative rather than working them out from the recurrence type and a start date. ## Date ranges A recurring event can run in **separate date ranges** while keeping one weekday pattern and one set of times. A venue that only opens during school holidays sets a range per holiday, rather than creating a separate event for each one and splitting its ticketing, waitlist and reporting across events that are really one product. Ranges are set under **Dates** on the event form. The first row is the event's own first and last date, so it reads as one list with the rest. Use **Add date range** for each additional window, and **Remove date range** to take one out. * The **end** of a range must be on or after its start * Ranges can't **overlap** * You can add up to **24** ranges Once a second range exists, the first has to be closed with an end date. Leaving it open means it never finishes, so nothing after it could ever be reached. A single range with a blank end still means the event runs on indefinitely. A range **masks** the pattern rather than restarting it. A monthly event keeps its day of the month across a gap, and a weekly event still lands on the weekdays you picked inside each window. The dates simply stop in the gaps and pick up again. Removing a range reconciles like any other change to the pattern: dates in it that haven't sold are removed, and dates that have sold tickets are kept and stay in your reporting. ## Occurrence status Each date carries its own status, using the same vocabulary as the event itself: * **Active** * **Out of stock** * **Unavailable** * **Cancelled** Dates marked **out of stock** or **unavailable** stay listed on your storefront but can't be bought, so a waitlist still works on them. **Cancelled** removes the date, and is refused once tickets have been sold. Use **out of stock** rather than **cancelled** for a date you've filled by other means, since customers can still join the waitlist for it. ## Editing one occurrence **Edit one occurrence** to change a single date without affecting the others. You can change its: * **Date** * **Time** * **Location override** * **Max tickets** Customised occurrence times are preserved. Editing one occurrence does not affect the rest of the series. ## Editing all occurrences **Edit all occurrences** to apply changes across the whole series. Occurrences you have already customised keep their times, so a series-wide edit will not overwrite the individual changes you have made. ## Generating more occurrences **Generate more occurrences** to extend the series with additional dates. ## Cancelling a single occurrence **Cancel a single occurrence** to call off one date while leaving the rest of the series in place. # Overview Source: https://docs.marzipan.co/flows/overview Flows let you automate work in your store, triggering actions when something happens. Flows is in **beta** and is enabled per store. Contact Marzipan to switch it on for your account. Flows let you automate work in your store. Each flow is built as a **graph**: a **trigger** starts the flow, **conditions** decide whether it continues, and **actions** do the work. ## Triggers A trigger is the event that starts a flow. There are currently two: * `order.paid` - an order is marked paid * `cms.page_updated` - a CMS page is updated ## Actions Actions are the steps a flow runs. You can: * Send a webhook * Send an email * Update an order's status Integrations can add their own actions too, for example **Fulfil order via LCB** ([London City Bond](/integrations/london-city-bond)) and **ScrubBill**. ## Building a flow Add a step from a node's own handle to append it to the end of a branch. To put a step **in the middle** of a flow, hover the line between two nodes and click the **+** at its midpoint, then choose an action or a condition. The new step is spliced in, both sides are rewired, and the layout tidies itself up. ## POS orders Flows on the `order.paid` trigger **skip point-of-sale orders by default**. A till sale uses the shared walk-in customer, carries no delivery address, and closes as soon as it's paid, so a delivery-shaped flow would otherwise email a placeholder record or push a counter sale to a third-party logistics provider. Turn on **Include POS orders** next to **Active** in the flow editor for flows that genuinely want every sale, such as an accounting webhook or a sales dashboard. An order placed on **hold** (because it oversold, for example) doesn't run its `order.paid` flows straight away. It runs them once, when the hold is released. ## Conditions Conditions let a flow decide whether to continue. For example, you can check: * Order total * Order type * Order market * Order shipping country * Number of items * Case-only * Contains a product type * Customer type ## Versions and executions Every edit you make to a flow is **versioned**, so you always have a history of how it has changed. You can also view the **execution history** for a flow, including each run's status, result and timing. If an execution didn't complete as expected, you can **retry** it. # Create a form Source: https://docs.marzipan.co/forms/create Build a form, add the fields you want to collect, and embed it on your site Forms are built in your dashboard and embedded on your website, so you can change the fields without touching your site's code. To create a form: 1. Log in to your Marzipan account 2. Navigate to **Forms** in the main menu 3. Click the **Create form** button in the top-right corner ## Building a form Give the form a **Name** so you can find it in the forms list. The **Slug** identifies the form and is used in the embed code and the API URL. Keep it short and stable - changing it later means updating anywhere you have embedded the form. The **Type** determines the form's built-in behaviour: * **Contact** - notifies your staff and creates a thread in [Messages](/messages/overview) * **Newsletter** - subscribes the person to a marketing list * **Custom** - no built-in behaviour Add the fields you want to collect. Each field has: * **Label** - what the customer sees * **Name** - the field's identifier * **Type** - `text`, `email`, `phone`, `textarea`, `select`, `checkbox`, `radio`, `date` or `hidden` * **Placeholder** - example text shown in the field * **Required** - whether the field must be filled in * **Options** - the choices offered, for `select`, `radio` and `checkbox` fields Drag fields to reorder them. The **Success message** is shown to the person after they submit the form. Set the **Status** to active when you are ready for the form to accept submissions, then save. Decide who gets notified when someone submits the form, and whether to send a confirmation, on the [Notifications](/forms/notifications) page. ## Embedding a form Forms render on your site through the `` web component, using the form's slug: ```html theme={null} ``` See [Contact form](/web-components/contact-form) for the full embed options. # Notifications Source: https://docs.marzipan.co/forms/notifications Choose who is notified when a form is submitted, and send an auto-reply Each form controls what happens when someone submits it - who on your team hears about it, and whether the person who submitted gets a confirmation. You'll find these options on the form itself, under **Notifications**. ### Submission notification Choose who is told about a new submission: * **Specific team members** - pick the people who should be notified * **All opted-in admins** - notify every admin who has opted in to receive notifications ### External notification email Optionally add one extra email address to notify. This is useful when a submission needs to reach an address that isn't a Marzipan user - a shared inbox, or a colleague outside the team. ### Auto-reply Send an optional confirmation to the person who submitted the form. You customise both: * **Subject** - the subject line of the confirmation * **Body** - the message they receive The auto-reply is sent using an editable notification template, so it matches the styling of your other emails. An auto-reply reassures the customer that their message landed. Pair it with the **Success message** shown on the page after they submit - see [Create](/forms/create). For `Contact` forms, the submission also creates a thread in [Messages](/messages/overview), so you can reply properly once you've read it. # Overview Source: https://docs.marzipan.co/forms/overview Build custom forms and embed them on your site Forms let you build custom forms - contact forms, newsletter sign-ups and more - in your dashboard and embed them on your website. Submissions are collected in Marzipan, and depending on the form type they can notify your team, start a conversation in your inbox, or add someone to a marketing list. To view your forms: 1. Log in to your Marzipan account 2. Click on **Forms** in the main navigation menu 3. The overview page will display all of your forms ### Forms The list shows each form and how it is performing. Forms list * **Name** - the form's name, with its slug * **Status** - whether the form is active * **Submissions** - how many submissions the form has received * **Type** - `Contact`, `Newsletter` or `Custom` * **Created** - when the form was created Click on any form in the list to edit it, or to view the [submissions](/forms/submissions) it has received. ### Header actions The top-right corner of the forms list has two actions: * **Create form** - build a new form (see [Create](/forms/create)) * **All submissions** - view every submission across all of your forms ### Form types Every form has a **type**, which determines what happens after someone submits it: | Type | Built-in behaviour | | -------------- | -------------------------------------------------------------------------- | | **Contact** | Notifies your staff and creates a thread in [Messages](/messages/overview) | | **Newsletter** | Subscribes the person to a marketing list | | **Custom** | No built-in behaviour - the submission is simply recorded | Whatever the type, you can still notify your team and send an auto-reply. See [Notifications](/forms/notifications). ## In this section Build a form, add fields, and embed it on your site Choose who is notified and set up an auto-reply View and filter the submissions your forms receive Embed a form with the web component # Submissions Source: https://docs.marzipan.co/forms/submissions View and filter the submissions your forms receive Every submission is collected in Marzipan. You can view the submissions for a single form, or see them all together by clicking **All submissions** in the header of the forms list. ### Submissions Form submissions The list shows: * **Name** - the name of the person who submitted the form * **Email** - their email address * **Form** - which form was submitted * **Source** - where the submission came from * **Submitted** - when it was submitted You can filter the list by form to narrow it down to a single form's submissions. ### Submission details Click on any submission to open it. The detail view shows every field value that was submitted, along with the linked customer where one was matched. ### Contact forms and Messages Contact-form submissions create a thread in [Messages](/messages/overview), so you can reply and keep the whole conversation in one place. The submitted field values are shown inline in the conversation, so you have the full context before you reply. # Details Source: https://docs.marzipan.co/gift-vouchers/details The voucher detail page: its balance, its ledger, and the actions available on it. Click any voucher in the list to open it. The detail page is where you answer a customer's question about their voucher: what's on it, where it went, and what's been spent. Gift voucher detail page showing highlights, transactions and activity ## Highlights Three figures sit at the top: * **Balance** - what's left to spend * **Issued for** - what the voucher was worth when it was issued * **Expires** - the expiry date, or that it never expires ## Voucher Details * **Code** - masked to its last four characters. Use the eye icon to [reveal it](#reveal-code). * **Purchased** and **Order no** - where the voucher was bought, linking to the order * **Issued**, **Issued by** and **Reason** - for a voucher [issued by hand](/gift-vouchers/issue) * **Voided** and **Void reason** - where the voucher has been stopped Alongside it, the people: the **Purchaser** who paid for it and the **Recipient** it was sent to, or a single **Customer** where they're the same person. Marzipan tells you when a code has been spent by someone other than the person it was sent to, or by several different customers. Vouchers get passed on, so this is information rather than a problem. The orders are listed under Transactions. ## Transactions The ledger. Every movement of value on the voucher, newest first, with the amount added or taken and a link to the order it belongs to: | Entry | What it means | | --------------------- | ----------------------------------------------------------------------- | | **Issued** | The voucher was created and its value put on | | **Redeemed** | Value was spent against an order | | **Refunded back** | An order that spent the voucher was refunded, so the value went back on | | **Adjusted manually** | Somebody on your team changed the balance | | **Expired** | The balance lapsed at the expiry date | ## Activity The account of what happened, kept alongside the ledger. It includes any notes your team has added, so use it to record a phone call or the background to an adjustment. ## Actions The **Actions** menu holds everything you can do to a voucher. ### Reveal code Shows the full, spendable code, and offers to copy it. You're asked why first ("Customer rang, cannot find the email", say), and the reveal is recorded in the activity log. Revealing is deliberately a step of its own, and never happens by accident. Everywhere else in Marzipan a code appears masked, including the email preview. ### Resend or change address Sends the code again, straight away. Change the **Send to** address first if it went to the wrong place, and the greeting name with it where the code is being passed to somebody else. Every resend asks for a reason, and says on the voucher why it was sent again. ### Adjust balance Enter an amount to add, or a negative amount to take value off. An adjustment always carries a note and always names who made it, and lands in both the ledger and the activity log. ### Void a voucher Stops the code being spent, straight away. The balance is **left where it is** rather than zeroed. What a code was worth when it was stopped is exactly what a later support conversation needs to know. You're asked for a reason, such as `Chargeback on the purchasing order`. Voiding can't be undone, and a voided voucher can't be spent. It does still accept a refund, though: if an order that spent the code is refunded, the value goes back on, because the money went out and has to be able to come back. # Issuing by hand Source: https://docs.marzipan.co/gift-vouchers/issue Issue a gift voucher yourself, for goodwill, a phone order or a voucher sold over the counter. As well as being bought from your shop, a voucher can be issued by hand, as a gesture of goodwill, to settle a complaint, or because somebody bought one over the phone. Click **Issue voucher** on the **Gift Vouchers** page. The Issue a voucher panel ## The form * **Market** - which market the voucher belongs to. It can only be spent on orders in that currency. Only shown when you sell in more than one market. * **Amount** - what the voucher is worth * **Expiry** - how long it lasts, defaulting to your [shop policy](/settings/gift-vouchers). Choose **Never** for a voucher that doesn't expire. * **Why** - your reason for issuing it, such as `Goodwill after a late delivery`. Kept with the voucher, so anyone looking at it later knows where it came from. Under **Who it is for**: * **Select existing customer** - attach the voucher to a customer you already have, or leave it and type a name instead * **Their name** - what the email says hello to. Leave it blank for a plain greeting. * **Their email** * **Email it to them** - whether Marzipan emails the code to the recipient * **Send it on** - the date the email goes out. Leave blank to send it today. Turn **Email it to them** off to record who the voucher is for and hand the code over yourself. That suits a voucher sold across the counter, or one going into a printed card. The code is then revealed on the [voucher's detail page](/gift-vouchers/details#reveal-code). A voucher with a **Send it on** date in the future sits at `Unclaimed` until that morning, when the email goes out and it becomes `Still redeemable`. It can't be parked more than a year ahead. ## Permissions Issuing a voucher needs the **Issue vouchers** permission. Viewing them needs **View vouchers**, and voiding, adjusting or resending needs **Edit vouchers**. See [Roles](/settings/roles-and-team). An issued voucher is money. It's created immediately, appears in your [liability report](/insights/gift-vouchers), and can't be deleted, only [voided](/gift-vouchers/details#void-a-voucher). # Overview Source: https://docs.marzipan.co/gift-vouchers/overview Sell and manage gift vouchers, and keep track of the balance your customers are still holding. A gift voucher is **stored value**: a code worth a set amount that a customer can spend with you later. Marzipan issues each one with its own balance, takes value off as it's spent, and keeps a full ledger of every movement. Vouchers are not discounts. A discount reduces what an order is worth; a voucher settles a bill you have already been paid for. That difference runs through the whole feature. An order paid by voucher keeps its full value in your sales reporting, and the unspent balance is carried as a [liability](/insights/gift-vouchers) rather than as revenue. To view your vouchers: 1. Log in to your Marzipan account 2. Click on **Gift Vouchers** in the main navigation menu 3. The overview page will display every voucher you've issued Gift vouchers list showing headline figures and issued vouchers Three buttons sit in the top-right corner: **Gift voucher products** for the [products you sell vouchers from](/gift-vouchers/products), **Issue voucher** to [issue one by hand](/gift-vouchers/issue), and a chart icon opening [Gift Voucher Insights](/insights/gift-vouchers). ### Headline figures Four boxes sit above the list: * **Unspent balance** - everything still out there, across every voucher * **Issued this month** * **Redeemed this month** * **Expiring in 30 days** ### The list Each voucher in the list shows: * **Code** - shown as `•••• BNVD`, its **last four characters only**, so a full spendable code is never on screen * **Sent to** - the recipient's name and email address, or `Not sent` where nobody has been emailed * **Value** - what the voucher was worth when it was issued * **Balance** - what's left on it * **Expires** - the expiry date, where the voucher has one * **Status** Click on any voucher to open its [details](/gift-vouchers/details). ### Statuses | Status | What it means | | -------------------- | ------------------------------------------------------------------- | | **Still redeemable** | Active, with a balance left and not past its expiry date | | **Unclaimed** | Issued but not yet sent, because the buyer chose a future send date | | **Fully redeemed** | Every penny has been spent | | **Expired** | Past its expiry date, so the balance has lapsed | | **Voided** | Stopped by hand, and no longer spendable | ### Filtering and searching * Filter by **Status**. Ticking more than one box widens the list rather than narrowing it, so **Still redeemable** and **Fully redeemed** together means either. * Filter by an **issue date** range * **Sort** by issued date, expiry date, balance or value * **Search** by code, recipient name or recipient email Searching by code matches **anywhere** in the code, not just the start. Since every screen shows a voucher by its last four characters, those four are usually all a customer can read out to you, and they're enough to find it. Vouchers are never deleted. A voucher is money somebody paid for, so a code that shouldn't be spent is [voided](/gift-vouchers/details#void-a-voucher) and keeps its history. ## Codes A voucher code is 16 characters, shown in four groups of four, for example `4KTP-9WM2-HXQ7-BNVD`. The alphabet leaves out every character a person could misread (no `0` or `O`, no `1`, `I` or `L`), and the last character is a checksum, so a mistyped code is rejected before it ever reaches a balance. Case and separators are ignored, so `4ktp 9wm2-hxq7 bnvd` is the same code. ## In this section Create a voucher product so customers can buy vouchers from your shop Issue a voucher yourself, for goodwill or a phone order The detail page, its ledger, and the actions available on a voucher How a customer spends a voucher, and the rules that apply Amounts, expiry and whether vouchers are sold at all The liability report, for your accounts # Selling vouchers Source: https://docs.marzipan.co/gift-vouchers/products Create a voucher product so customers can buy gift vouchers from your shop. Customers buy vouchers from a **voucher product**, which behaves like any other product on your storefront: it has a name, a description, images, collections and SEO. What makes it a voucher product is that it sells value rather than goods: nothing ships, and paying for it issues a code. From the **Gift Vouchers** page, click **Gift voucher products** to see the ones you have, and **Add voucher product** to create one. Each product in that list shows its **Name**, **Amounts** (or `Shop default`), what it's **Spendable on**, and its **Status**. The voucher product form The **Sell vouchers** switch under [Settings > Gift Vouchers](/settings/gift-vouchers) has to be on. With it off, voucher products aren't purchasable however they're set up. ## Details * **Name**, **Slug**, **Summary** and **Description** - as on any product * **Collections** - the collections the voucher appears in on your storefront * **Status** - `active`, `draft` or `unavailable` * **SKU** - used in reporting and exports. Nothing ships, so it's never picked. * **Sold in** - the market the voucher belongs to. Only shown when you sell in more than one. * **Expiry** - how long vouchers sold from this product last * **Spendable on** - an optional restriction on what the voucher can buy ### Sold in A voucher carries a currency, and that currency is fixed when the voucher is bought. A voucher product therefore belongs to **one market**, and the amounts on it are in that market's currency. To sell vouchers in another currency, add a second voucher product for that market. ### Expiry Choose the shop default set in [Settings > Gift Vouchers](/settings/gift-vouchers), or override it for this product with **12**, **24** or **36 months**. Changing expiry only affects vouchers sold **from now on**. A voucher already in a customer's hands keeps the expiry it was sold with. ### Spendable on Leave this empty and the voucher can be spent on anything. Add products, collections or events to restrict it, such as a tour voucher that only buys tour tickets. Restrictions are **copied onto the voucher when it's bought**, so editing the product later never shrinks a voucher somebody already holds. ## Amount **Amount is** sets how the value is chosen: * **Fixed** - every voucher sold from this product is worth the same. Set a **Price**. * **Chosen by the buyer** - the buyer picks from the amounts you offer, and optionally enters their own. ### Amounts offered List the amounts shown on the product page. Leave the list empty to fall back to the shop defaults from [Settings > Gift Vouchers](/settings/gift-vouchers). ### Let buyers enter their own Turn this on to add a free-entry amount, bounded by a **Lowest** and **Highest**. ## What the buyer fills in On the storefront, buying a voucher collects the recipient's name and email, an optional message, and the date to send it. The buyer gets a **Voucher purchased** email confirming when it will go; the recipient gets a **Voucher issued** email carrying the code on the chosen day. A voucher-only order takes no shipping date and no delivery address, because there's nothing to post. Where the buyer picked a future date, the voucher defers itself and the order isn't held. ## After the sale Every code an order sold is listed on the order under **Vouchers issued**, and each one links to its [voucher details](/gift-vouchers/details). Refunding a voucher order in full **voids the codes it sold**, recovering whatever is left on them. Anything the recipient already spent stands: that value was honoured in good faith and isn't chased. # Redeeming Source: https://docs.marzipan.co/gift-vouchers/redeeming How a customer spends a gift voucher, and the rules that apply when they do. A customer spends a voucher by entering its code in the **discount code box** at checkout. There's no second field to find: Marzipan recognises a voucher code by its checksum, so anything that passes it and matches a code you issued is treated as stored value, and everything else is treated as a promotion. The amount the voucher covers is shown against the order, and the card is charged the difference. ## What a voucher can pay for * **Goods**, including subscriptions * **Delivery**, but only where the goods being delivered are themselves something the voucher may pay for * **Part of an order**. A £50 voucher against a £120 basket takes £50 off what's charged and leaves £70 on the card. A voucher can be spent over several orders until the balance runs out, and more than one voucher can be applied to a single order. **A voucher can't buy a voucher.** Voucher lines aren't payable by voucher, though the rest of a mixed basket still is. Without that rule, a code restricted to one shop's events, or a month from expiring, would launder into a fresh unrestricted one that never expires. ## Restrictions Where the voucher was sold with a **Spendable on** restriction, it only pays for the lines that match: the products, collections or events it was sold against. For an event, scoping to the series covers every occurrence; scoping to a single date covers that date. Restrictions are fixed at the point of sale, so changing a voucher product later never narrows a voucher somebody already holds. ## Markets and currency A balance is money in the market it was sold in, and there's no exchange rate to carry it into another. A voucher bought in one market can't be spent on an order in a different one, and a voucher in one currency can't be spent against a cart in another. ## Subscriptions A voucher can pay for a subscription, including the first delivery in full. Where it covers the whole basket, nothing is charged, so no card would normally be saved, and every renewal afterwards would have nothing to bill. Checkout therefore **still asks for a card** for the deliveries after the first, and explains why. Set that wording under **Settings > Branding & Web Components > Checkout**. ## How the money moves Applying a code at checkout is only intent: it records what the voucher is expected to cover. Nothing comes off the voucher itself until the order is paid. If the basket changes in between, every applied voucher is measured again: a code applied to a £120 basket won't still claim £50 of a £30 one. The full order value stays in your sales reporting. A voucher settles a liability you were already paid for, so the amount actually taken on the card and the value of the order can differ without either being wrong. This is the opposite of [reward points](/rewards/earning-and-redemption), which genuinely are a discount and do reduce the order. ## Refunds Refunding an order that was paid with a voucher **puts the value back on the code**, because a voucher is a tender like any other. This works even on a voided voucher: the money went out, so it has to be able to come back. ## Emails Two emails reach the holder as they spend: * **Voucher balance remaining** - after part of a voucher is spent, so they know there's still something on it * **Voucher expiring soon** - before a balance lapses, while there's still time to spend it Both are edited under **Settings > Notifications**, in the **Gift Vouchers** group. ## Reward points By default, no points are earned on the part of an order a voucher paid for, and **buying** a voucher never earns points whatever the setting says. Turn **Exclude Voucher Payments** off under [Settings > Rewards](/rewards/earning-and-redemption) to let redemptions earn. ## Guessing attempts Guessing against stored value is a real attack, so attempts to apply a voucher code are rate-limited by IP address whether or not they find anything. A customer who mistypes a code a few times will be asked to try again shortly. # Introduction Source: https://docs.marzipan.co/index Discover how to use Marzipan to power your DtC sales and subscriptions. Marzipan is a comprehensive commerce and subscription platform. Our platform empowers businesses to manage their direct-to-consumer (DtC) sales and subscription services with ease and efficiency. Our documentation is currently a work in progress. If you have any feedback or need help, please [get in touch](mailto:hello@marzipan.co). ## What Marzipan Offers * **Seamless commerce**: integrate powerful commerce capabilities into your existing website with our easy to use [web components](/web-components/introduction) or API. * **Subscription management**: effortlessly manage subscriptions, shipments, and billing for your subscribers * **Subscription flexibility**: design custom subscription programmes with flexible frequency, product selection, and pricing options * **Inventory control**: track inventory across all sales channels in real-time * **Customer management**: build stronger relationships with your customers through personalised experiences ## Why Choose Marzipan Selling direct to consumers and running recurring subscriptions brings challenges that general-purpose e-commerce platforms handle poorly. Marzipan was built from the ground up to address these specific needs, combining powerful functionality with an intuitive interface that doesn't require technical expertise to use effectively. Whether you're a small producer looking to launch your first subscription or an established business seeking to optimise your direct sales channels, Marzipan provides the tools you need to grow your business and delight your customers. ## Getting Started This documentation will guide you through setting up and making the most of your Marzipan platform. From initial configuration to advanced features, you'll find comprehensive instructions and best practices to ensure your success. # Attribution Source: https://docs.marzipan.co/insights/attribution See where your orders come from, with UTM source, medium and campaign breakdowns. The Attribution report shows where your orders come from. It's fed by the checkout **"how did you hear about us?"** question and by **UTM tracking**, so it covers both what customers tell you and what the link they arrived on tells you. ## Metrics * Tracked visits * Attributed orders and revenue * Attribution rate * **UTM source, medium and campaign** breakdowns The **attribution rate** is the share of orders that carry attribution data. Not every order will: a customer can arrive without a UTM-tagged link and skip the checkout question, so read the attributed figures alongside the rate. ## UTM breakdowns Orders are broken down by **UTM source**, **medium** and **campaign**, which is how you tell one marketing campaign's contribution from another's. UTM tracking is handled by the Marzipan web components. See [Web components customisation](/web-components/customisation) for how it's set up. Attribution data also appears on individual orders, in the attribution panel on the [order details](/orders/details) screen. # Customers and rewards Source: https://docs.marzipan.co/insights/customers Reports covering your customer base, retention, lifetime value and loyalty programme. These two reports look at the people behind the orders: who your customers are, how well you retain them, and how your loyalty programme is performing. ## Customers A view of your customer base and how well you retain it. * Total, active and new customers * Repeat-purchase and retention rates * Average lifetime value It also includes an **RFM analysis** with customer segments, a customer lifetime value trend, and your top customers. ### RFM analysis RFM groups your customers into segments by how recently they bought, how frequently they buy, and how much they spend. The segments give you a way to read the base as groups rather than as one number, so you can tell a growing set of loyal customers from a growing set of lapsing ones. ### Lifetime value Alongside the average lifetime value figure, the report shows a **CLV trend** over the selected period, and lists your **top customers**. ## Rewards Track how your loyalty programme is performing. * Members * Points earned, redeemed and outstanding * Redemption rate * Member vs non-member average order value, and AOV lift * Tier distribution * Tier upgrades and downgrades **AOV lift** compares what members spend per order against non-members, so you can see what membership is worth. **Outstanding** points are those earned but not yet redeemed. # Gift Vouchers Source: https://docs.marzipan.co/insights/gift-vouchers What you owe in unspent gift vouchers, and how you got there. Unredeemed voucher value is a **liability**, not revenue. It's recognised when a code is spent, and as breakage when one lapses. Most merchants are asked for this figure at year end, which is what this report answers. It's distinct from the figures on the [gift vouchers list](/gift-vouchers/overview), which answer "what is happening today". This answers "what do we owe, and how did we get here". Open **Insights** and choose **Gift Vouchers** from the report selector, or click the chart icon on the Gift Vouchers page. The gift voucher liability report ## Headline figures * **Issued** - value put onto vouchers in the period * **Redeemed** - value spent in the period * **Lapsed** - value that expired unspent, your breakage * **Outstanding** - the balance still held by customers ## Movement A month-by-month table of how the liability moved: * **Month** * **Issued** * **Redeemed** * **Lapsed** * **Net change** ## Expiring Vouchers due to expire, so you can see what's about to lapse and act on it if you'd rather it didn't. ## Markets A voucher carries a currency, so on a multi-market shop the market filter narrows the report to vouchers in that market. The all-markets total is converted at your market exchange rates. ## Access The report needs the **Gift Vouchers** insights permission. See [Roles](/settings/roles-and-team). # Insights Source: https://docs.marzipan.co/insights/overview Insights is Marzipan's reporting area, with detailed reports covering revenue, customers, subscriptions and more. **Insights** is Marzipan's reporting area. Each report gives you a focused view of a different part of your business, from revenue and customers through to subscriptions, rewards and web traffic. To open Insights, click on **Insights** in the main navigation menu, then choose a report from the report selector. The Insights area showing the report selector and a revenue report with headline metrics ## Shared controls Every report shares the same core controls: * **Date range** - set the period the report covers. * **Compared to** - compare the current period against a previous one to see how things are trending. * **Market filter** - narrow the report to a single market if you sell across more than one. Because the controls are the same everywhere, a date range and comparison you've settled on for one report means the same thing in the next. Test-mode orders are excluded from Insights, so every report reflects real trading only. ## Access Access to each report is controlled by your [Roles](/settings/roles-and-team) permissions, so you can decide which team members see which reports. A team member only sees the reports their role allows. ## The reports Revenue, channels, geographic, orders, products, stock valuation, cart recovery and events Your customer base, retention and rewards programme Recurring revenue, churn, status and billing Voucher liability, redemption and breakage Where your orders come from Visitor traffic on Marzipan-hosted sites # Sales reports Source: https://docs.marzipan.co/insights/sales Revenue, channels, geographic, orders, products, stock valuation, cart recovery and event reports. The sales reports cover your trading performance: what you sold, where it sold, and how well it converted. Each one shares the same [date range, comparison and market controls](/insights/overview) as every other report in Insights. ## Revenue Your top-line sales performance over the selected period. * Total sales * Average order value * Average daily revenue * Conversion rate You can add extra columns to break the numbers down further, including orders, units sold, new and returning customers, discounts, refunds, shipping, tax, subscriptions, events and products. Use **Compared to** on the Revenue report to see whether a period is up or down on the one before it, rather than reading the totals in isolation. ## Channels See how your sales channels compare. * Revenue, orders and average order value by sales channel * Your top channel ## Geographic * Sales broken down by location ## Orders The order side of the same trading, rather than the money. * Total orders * Orders per day * Average items per order * Fulfilment rate ## Products * Revenue, units sold and average price * Drill down into any individual product ## Stock valuation What the stock you hold is worth at cost price. * A headline total * A breakdown per inventory location * A sortable table of products, which you can filter by status Stock recorded before you started using [locations](/settings/inventory) can't be attributed to one, so it's reported as **Unassigned**. The location rows still add up to the headline total. Products holding stock with no cost price count as zero. They're counted separately and you can filter to them, so an understated total is visible rather than silent. Click **Export** to download the report as a CSV, honouring the filters you've set. Stock valuation is a **point-in-time snapshot** and has no date range. No cost basis is stored against historic stock movements, so a date picker would only mislead. With no market selected, stock is valued at base cost in your store's default currency. Select a [market](/settings/markets) to value it at that market's cost in that market's currency, using an explicit per-market cost override where one is set and converting the base cost at the market's rate where it isn't. Quantities don't change with the market, since stock is physical and held at a location. ## Cart recovery Understand how well you're recovering abandoned carts. * Conversion rate * Recovered vs lost revenue * Average recovery time * An abandonment funnel * Recovery by source ## Events * Event performance metrics # Subscriptions Source: https://docs.marzipan.co/insights/subscriptions Recurring revenue, churn and retention, plus status, billing and additional items sub-reports. The Subscriptions report covers your recurring revenue: what it's worth, and whether you're holding on to it. ## Headline metrics Key metrics for your recurring revenue. * Monthly recurring revenue (MRR) and annual recurring revenue (ARR) * Churn and retention rates * Average subscription value and duration ## Sub-reports Subscriptions also includes three sub-reports that break the headline numbers down. ### Status The distribution of your subscriptions across their statuses, and the transitions between them. This shows movement, not just the standing total. ### Billing Billing focuses on **failed payments**, which is where recurring revenue is most often lost before a subscription formally churns. ### Additional items Covers the additional items attached to subscriptions. # Web analytics Source: https://docs.marzipan.co/insights/web-analytics See how visitors are using your Marzipan-hosted website. For Marzipan-hosted sites, **Web analytics** shows how visitors are using your website. Where the [sales reports](/insights/sales) tell you what people bought, this one tells you how they moved around the site. ## Live traffic The report shows live **visitors online now**, so you can see current activity as well as the selected period. ## Top pages and sources * Top pages, with pageviews, uniques and average duration * Top referrers and sources ## Breakdowns Traffic is broken down by: * **Page** * **Referrer** * **Country** * **Device** Until analytics is set up for your site, this report shows a **"not configured"** state. # EzyPro Source: https://docs.marzipan.co/integrations/ezypro Export your orders to EzyPro on a schedule, as a CSV file delivered over SFTP. The EzyPro integration sends your orders to EzyPro as a CSV file on a schedule, delivered to a folder EzyPro collects from. It saves keying orders in twice, and runs on its own once set up. Navigate to **Settings > Integrations** and choose **EzyPro**. EzyPro integration settings showing the SFTP connection and export schedule EzyPro keeps a **separate database per market**, and collects each one's file from its own folder. A single install here covers every market. You configure each market separately below rather than installing the integration more than once. ## Connection EzyPro is reached over **SFTP**. Plain FTP isn't supported. * **Host** and **Port** - Where to deliver the file * **Username** * **Authentication** - **Password**, or a **Private key** with an optional **Passphrase** Use **Test connection** to check the credentials before you rely on the schedule. The result is shown straight away, so you don't have to wait for an export time to come round to find out something is wrong. ## Schedule * **Export times** - Up to two times a day. Each market's file is written at these times. * **Timezone** - The timezone the export times are read in * **Order statuses** - Which order statuses to include in the export A run missed because something was down is picked up on the next hourly check rather than waiting a whole day. ## Each market Every market has its own section, with its own toggle beside the heading. Turning one off doesn't affect the others, and a market that fails to export never stalls another. * **Remote folder** - The folder on the EzyPro server this market's file goes to. Limited to 30 characters, which is EzyPro's own limit. * **File prefix** - The start of the filename. The resulting filename is shown beneath, for example `orders-2026-08-25-0600.csv`. * **Export orders from** - The date to start exporting from. Use **Include every order** to set this from the market's first order. * **SKU matching** - Map your products to the product codes EzyPro holds for this market The **remote folder** decides which EzyPro market database a file lands in. Getting it wrong puts one market's orders into another market's records. ### SKU matching EzyPro keeps its own product codes, and because each market is a separate EzyPro database, the codes differ per market. Pick the product and give its EzyPro code for that market. Matching ignores capitalisation, so a code pasted straight out of EzyPro works as it is. A product you haven't mapped is exported under the SKU you hold rather than being left out, so nothing goes missing quietly. ### Locked settings Once a market has exported, its **remote folder** and **export orders from** date lock, since changing either after orders have gone affects what EzyPro has already taken. Both can be unlocked by an **owner or administrator**: * **Start again** clears the market's progress and unlocks the date, so every order from the start date goes again * Unlocking the **remote folder** is a separate action, so correcting a folder doesn't mean resending orders **Start again** can't be undone, and EzyPro may already hold the orders it resends, so they could be received twice. It doesn't remove files EzyPro has already collected. ## Export history Open **Export history** to see recent runs: when each started, which market it was for, the result, and how many orders went. Expand a run for its filename and any error, and **download the file** that was sent. History is kept for 30 days. A file EzyPro has already archived says so rather than failing to download. The history answers "did Tuesday's file go?", which the current status alone can't. Check here before assuming an order never reached EzyPro. ## What's in the file The export is the **Commerce 7 order export** format EzyPro already ingests: one row per order line, with the order-level values repeated on each row. The shipping total sits on the order's first row only, so it can't be counted twice. Each order is sent exactly once, so an order number never appears in two files. # Google Merchant Center Source: https://docs.marzipan.co/integrations/google-merchant List your products on Google Shopping and keep prices, stock and availability up to date. The Google Merchant Center integration keeps your product listings on Google Shopping up to date. Prices, stock and availability are pushed automatically whenever a product changes. Navigate to **Settings > Integrations** and choose **Google Merchant Center**. Google Merchant Center integration settings ## Before you connect You need a Google Merchant Center account with your store's website **verified and claimed**. Google won't show your products otherwise, and this is something only you can do from your own Merchant Center account. Verifying and claiming your website is done in Google Merchant Center, not in Marzipan. Connect once that's in place. ## Connecting Click **Connect Google Merchant Center** and sign in with the Google account that has access to your Merchant Center. Once connected, the settings below become available. ## Settings * **Merchant Center account** - The account to publish to. If no accounts are listed, check that the Google account you connected with has access to a Merchant Center account, then reconnect. * **Default Google product category** - The category used for any product without one of its own, chosen from Google's own taxonomy * **Sync every** - How often your whole catalogue is swept and re-sent * **Sync automatically** - Turn off to stop scheduled syncing. You can still sync by hand. Google allows roughly **two updates per product per day**, counted against your own Merchant Center account. The settings page estimates how many updates a day your interval works out at across your markets, and warns you when that's likely over your allowance. Syncing more often than your catalogue needs risks exhausting it. ### Product categories A product can override the default category from its own **Google product category** field on the product form. Set the default here and only override the products that need something different. ## Markets Each active [market](/settings/markets) becomes its own feed in Merchant Center, with its own currency and target countries. The feed is labelled with the market's slug, and is created on the first sync. ## Status Once connected, four tiles show where your catalogue stands: * **Listed** - Products currently on Google * **Pending** - Products queued to be sent * **Failed** - Products Google rejected * **Not eligible** - Products Marzipan didn't send ## Actions The **Actions** menu in the top-right offers: * **Sync all products** - Queue an immediate sweep of the whole catalogue * **Sync history** - See the most recent sweeps * **Refresh accounts** - Re-read the list of Merchant Center accounts from Google * **Remove all from Google** - Withdraw every product from your Merchant Center account * **Disconnect** - Disconnect the integration When you disconnect, Marzipan offers to take your catalogue down at the same time. Leave the listings in place if you plan to reconnect. ## Sync history **Sync history** lists recent runs, each showing when it started, what triggered it, the result and how long it took. A run reports how many products **synced**, **failed** and were **not eligible**. Expand a run to see the products that didn't make it. ## Products not listed Products that were skipped or rejected are listed with the market and the reason. A product isn't sent when: * Its **type** isn't eligible. Physical, bundle and subscription products are listed; event tickets are not, because Google Shopping rejects them and disapprovals count against your account. * Its **status** isn't active * It's **restricted to subscribers**, so it has no publicly visible price * It's **not visible** in that market * It has **no image**. Google requires one. * It has **no price** in that market Google's own diagnostics screen in Merchant Center is the source of truth for policy disapprovals. This list covers what Marzipan sent and what it held back. # London City Bond Source: https://docs.marzipan.co/integrations/london-city-bond Bonded-warehouse fulfilment, with stock syncing, order submission and stock transfers. London City Bond (LCB) handles bonded-warehouse fulfilment. Once installed, its settings page covers stock, orders and transfers. ## Stock sync Stock syncs daily into a dedicated [inventory location](/settings/inventory), which requires location-based inventory to be initialised first. Every sync is recorded, whether or not any figure moved, so a run that agreed with LCB throughout is still visible. The integration page lists the **last ten runs**, each showing how many products were updated, how many were unchanged, and any failures with their reason. Runs also flag **unmatched SKUs**: stock LCB hold that no product in your store matches. Those never sync, so it's worth checking the named SKUs and correcting the product they should belong to. ## Goods received Turn on **Record goods received** to add stock as soon as London City Bond book goods in, at midday and 7pm, rather than waiting for the next nightly sync. It also closes off any linked [stock transfer](#stock-transfers) request raised through Marzipan. This covers supplier deliveries as well as your own transfers, so it's worth having on even if you never raise a transfer. London City Bond send this information **once only**. If anyone at your end currently receives these notices by email, switching this on takes them instead. A part delivery credits what actually arrived and leaves the rest counting as still on its way. ## Orders Orders are submitted to LCB over the API, with many orders batched into a single call. Subscription renewals are included: orders shipping later are held and released by a sweep that runs through the day, so a late-settling renewal payment doesn't wait until the next day. The [flow](/flows/overview) action is called **Fulfil order via LCB**. It sends orders due now and holds the rest until their shipping date. ## Stock transfers Transfers request stock from a source warehouse into your LCB location. Two separate toggles control them: * **Enable stock transfers** - Makes transfers available to raise by hand * **Request transfers automatically** - Runs the overnight check that raises transfers on its own. This depends on stock syncing, since that's what triggers the check. Keep **Request transfers automatically** off until LCB have signed off your test paperwork. Enabling manual transfers alone lets you produce a transfer for sign-off without the nightly job also running. ## Minimum stock levels A transfer is raised when stock falls below a minimum. Set a default minimum for everything, then add **per-item overrides** for the lines that move at a different rate, since a fast-selling line and a slow allocation wine rarely want the same trigger. * Anything without an override uses the default * Setting an item's minimum to **0** excludes it from transfers entirely * Overrides work with no default at all, which restricts transfers to a named list The manual transfer modal shows which minimum produced each line, so a prefilled list can be checked rather than taken on trust. # Integrations Source: https://docs.marzipan.co/integrations/overview Connect your store to fulfilment, courier, marketing, finance, and labelling services. Integrations connect your store to third-party services for fulfilment, couriers, marketing, finance, and labelling. Navigate to **Settings > Integrations**, which shows two lists: **Installed** integrations and **Available** integrations. To install one, click it. Each integration shows whether it's `active` or `inactive`, along with a test-mode badge that follows the global [test mode](/settings/test-mode) toggle. Integrations page showing installed and available integrations ## Available integrations The UK's premier network for shipping wine and other liquids, so bottles travel with a service built for them rather than as general freight. Price deliveries from your own DPD rate card: rates per region and service, a minimum charge, a fuel surcharge, and the London Congestion Charge where it applies. Export your orders on a schedule, as a CSV delivered over SFTP, with a separate file per market. List your products on Google Shopping, with prices, stock and availability kept up to date automatically. Compliant electronic wine labels. Link a product to generate its e-label, carrying the QR code and the ingredient and nutritional information required on your physical label. Bonded-warehouse fulfilment. Stock syncs into a dedicated [inventory](/settings/inventory) location, orders are submitted over the API, and stock transfers can be raised automatically. Sync customers and subscribers to your Mailchimp audience. Third-party logistics. South African logistics and fulfilment partner. ## Managing an integration Each integration has its own settings page once installed, where you configure its options. Open it from the **Installed** list at any time. ## Don't see the one you need? We add integrations as merchants ask for them, and more are on the way. If the service you work with isn't listed, [get in touch](mailto:hello@marzipan.co) and tell us what you need it to do. Building one is often a good deal quicker than you'd expect. It's worth asking even where a service already has a partner integration elsewhere. Knowing which parts of it you actually use is what makes a good one. # Overview Source: https://docs.marzipan.co/media/overview Manage the images used across your store from one central library The Media library is your central store of images. Images you add here are reused across products, bottle labels, share images, CMS content, and the rich-text editor. To open your media library: 1. Log in to your Marzipan account 2. Click on **Media** in the main navigation menu ## Library Media library The library shows your images in a grid. Each image displays its **thumbnail**, **filename**, **alt text**, and **date**. You can sort the grid by date. ## Uploading images There are two ways to add images: * Click **Upload** to choose files from your device and add alt text * **Drag and drop** images straight onto the page Images can be PNG, JPG, or GIF, up to 10 MB each. After a drop, a bulk alt-text step lets you caption each image before it's saved. ## Managing images * Click an image to edit its **alt text** * **Delete** an image you no longer need * An image that's in use can be **unlinked** from a record Good alt text describes what's in the image. It improves accessibility for people using screen readers and helps your SEO. # Overview Source: https://docs.marzipan.co/messages/overview A two-way email inbox for your customer conversations. Messages is a two-way email inbox built into Marzipan. When a customer replies to one of your emails, their reply threads into a per-customer conversation, so you can keep every exchange in one place and respond without leaving the app. To open your inbox: 1. Log in to your Marzipan account 2. Click on **Messages** in the main navigation menu 3. Your conversations will be listed, with flagged and unread conversations at the top ### Layout The inbox has two panes. Messages inbox layout * **Conversation list (left)** - conversations grouped by customer, each showing unread and flagged indicators and a short preview. Flagged and unread conversations sort to the top. * **Thread (right)** - the conversation you've selected. ### Reading and replying Open a conversation to read the full thread, with incoming messages from the customer shown separately from your replies. * Reply from the box at the bottom of the thread. Press **Cmd/Ctrl+Enter** to send. * Use **Reply & close** to send your reply and close the conversation in one step. Opening an unread, unassigned conversation automatically assigns it to you and marks it as read. ### Assigning and organising Keep your inbox tidy and share the workload across your team: * **Assign** a conversation to a team member. * **Flag** a conversation to mark it for follow-up. * **Close** a conversation when it's resolved, and reopen it if you need to. ### Filtering and searching You can filter conversations by: * **Status** - `open` or `closed` * **Assignee** - including **Me**, to see just the conversations assigned to you You can also search by customer, or by subject and body. ### Compose To start a fresh conversation with a customer, click **New message**. ### Form submissions Submissions from your contact forms arrive in Messages as conversations, with the submitted field values shown inline so you have the full context before you reply. See [Submissions](/forms/submissions) for more on setting these up. Customer replies only reach your inbox once **inbound email** is set up. A banner appears in Messages until it is - see [Inbound setup](/messages/setup). ## In this section Set up MX records so customer replies arrive in your inbox # Receiving customer replies Source: https://docs.marzipan.co/messages/setup Set up inbound email so customer replies arrive in your inbox. Sending email from Marzipan works as soon as your domain is verified. Receiving replies takes one extra step: **inbound email**, which routes messages sent to your domain back into your [Messages](/messages/overview) inbox. ## Setting up inbound email For customer replies to arrive in Messages, you need to add **MX records** to your sending domain. Navigate to **Settings > Email**, where your sending domains are listed. Marzipan displays the DNS records for your domain, including the MX records that route inbound replies back to Marzipan. Add them with your domain registrar or DNS provider. Return to the email settings page to check the verification status. Each record shows as **Verified** or **Pending**, and the page auto-checks roughly every 60 seconds while records are pending. See [Settings > Email](/settings/email) for the full list of DNS records and how verification works. ## Use a subdomain Putting MX records on your **root domain** (e.g. `yourdomain.com`) captures **all** email for that domain, including mail sent to your normal mailboxes. To avoid this, use a dedicated subdomain such as `mail.yourdomain.com` for sending and inbound replies. ## The inbound email banner Messages shows a banner at the top of the inbox until inbound email is working. There are two versions, depending on where you've got to: | When | What it tells you | | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | | Inbound email **isn't configured** | Customer replies will be delivered to your store email address instead of appearing in Messages | | Configured, but **MX records aren't verified** | Messages will still be sent to customers, but their replies won't appear in Messages until the DNS records have been verified | In both cases you can carry on sending messages and replying from Marzipan - it's only the customer's response that doesn't thread back into the inbox. # Navigation Source: https://docs.marzipan.co/navigation The main navigation menu is shown in the sidebar on every page. If you can't see the sidebar you will need to click the menu button which will show a full screen menu. From here you can access all the important areas you may need on a day to day basis. The **Orders** menu item will show a dynamic count of processing orders. ### Search / Command Palette You can access the search/command palette by clicking on the search icon at the top right of the sidebar (or top centre on mobile). Search icon ### Account Details and settings Access to less frequently used items is available by clicking on your name at the bottom of the sidebar which will open a menu that allows you to access your account details, settings and support, or to log out. # Manual Orders Source: https://docs.marzipan.co/orders/create Learn how to create and process orders manually in Marzipan Manual orders allow you to create orders directly in Marzipan without requiring customers to go through the standard checkout process. Manual orders are ideal for: * Taking orders over the phone * Processing in-person sales at events * Creating orders for customers with special requirements * Testing your order processing workflow * Creating orders with custom pricing, one-off items, or discounts ## Creating a manual order To access the manual order form, follow these steps: 1. Log in to your Marzipan account 2. Navigate to **Orders** in the main menu 3. Click the **+ Create order** button in the top-right corner POS (till) orders are created in the Marzipan mobile app, not this form. See [Point of Sale](/orders/pos) for in-person selling. Select an existing customer by typing their name or email address in the lookup box, or click **create a customer** to add a new one in a panel to the right. Then set: * **Channel** - where the order came from: **Cellar Door**, **Event**, **Email**, **Manual**, **Website**, **Phone** or **Tasting** * **Billing address** - chosen from the customer's addresses For multi-market stores, a **Market** is auto-detected from the billing address country and a note confirms which one applies. The market sets the currency the order is priced in. Use the product selector to add products, by name or SKU. Once a product is on the order, set its quantity. Some products have **options** (for example size) you can choose per line, and lines show sale and subscriber price badges where they apply. To sell something your catalogue has never held, such as corkage, a delivery surcharge or a bottle from the back room, type its name and add it as a **one-off item**. Set the item's name and price directly on the line. A one-off item doesn't touch your stock. Pick one of: * **Delivery** - take a delivery address and a shipping method * **Collection** - the customer collects, so no delivery address * **No shipping needed** - for an order that's digital, comped, or handed over across the counter. No address, no method, no delivery phone. For a delivery, choose the **shipping method**. If the address has no phone number and the method requires one, a warning prompts you to add it. You can also add **delivery instructions**. Automatic discounts apply on their own as you add items. To add one yourself, open the discount section and pick from the discounts the order **already qualifies for**, listed best first, each showing what it's actually worth against this basket. Picking one fills in the discount fields rather than bypassing them, so you can see exactly what's being applied and adjust it before saving. You can still enter a discount by hand instead. If the order is a gift, open the gift options and complete the relevant fields. The summary shows the order's totals, including shipping, in the market's currency. Click **Save** to create the order. After creating an order you will be taken to the [order details](/orders/details) page where the order will have a **processing** status and a **pending** payment status. An order containing something you don't have the stock for is saved on **hold** instead. It stays held until you release it, even once it's been paid. Rather than taking the customer's card over the phone, you can send them a [payment link](/orders/payment-links) to settle the order themselves. # Details Source: https://docs.marzipan.co/orders/details View and manage order details The order details screen provides a comprehensive view of an order and lets you process it. The left column holds the order items and any logged order activity, while the right column holds the customer, shipping and billing details. Order detail screenshot ### Actions menu The **Actions** menu in the top-right corner gives you quick access to common tasks: * **Resend email confirmation** - send the order confirmation email to the customer again * **Cancel** - cancel the order * **Refund** - refund all or part of the order * **Duplicate order** - create a new draft order with the same items * **Assign customer** - only shown for POS walk-in orders, this links a walk-in sale to a real customer (see [Point of Sale](/orders/pos)) ### Order items The order items section lists everything in the order. Each line shows: * The product image, name and SKU * Any selected **options** (for example size) * The unit price, quantity and line total For bundles, the **constituent items** that make up the bundle are listed beneath the bundle line. Beneath the items, the footer shows the order totals: * Subtotal * Discounts * **Points redeemed** - shown when the customer has used rewards points * Shipping * Tax * Total ### Payments The payments section shows the payment status for the order and any payment activity that has been logged. * Each payment shows the provider and card brand with the last 4 digits of the card * **Tap to Pay / card-present** payments taken in person show a Tap to Pay indicator (see [Point of Sale](/orders/pos)) * Failed payments show the failure reason * Refunds appear as nested rows beneath the original payment, each with a reason If the order is unpaid, you can take payment or complete it from here. See [Draft, unpaid and hold order actions](#draft-unpaid-and-hold-order-actions) below. For more on payments and refunds, see [Payments](/orders/payments). ### Draft, unpaid and hold order actions When an order is not yet paid, or is on `hold`, extra actions are available: * **Process payment** - charge a saved card or record a manual payment (for example if the customer paid offline) * **Mark as free** - complete a zero-value order. This triggers the same automations as a paid order, so a warning is shown before you confirm * **Redeem points** - apply the customer's rewards points to the order, when rewards are enabled * **Edit items** - available on draft and pending orders only. Add or remove items and adjust quantities; at least one item must remain on the order * **Release order** - release an order that is on `hold` ### Order Fulfilment The fulfilment section shows the fulfilment status for the order and any fulfilment activity that has been logged. If the order still has a `processing` status you can fulfil it, which updates the order status to `Shipped`. See [Fulfilment](/orders/fulfilment) for details. ### Customer details The customer box in the right column holds the customer's details for this order, along with their market and the source they came from. Any [custom checkout field](/settings/cart-and-checkout#custom-checkout-fields) answers appear here too, each under its own label, followed by the order's tags. Answers are snapshotted onto the order with the label they were asked under, so renaming a question later never rewrites orders already placed. ### Attribution When attribution data is available, an attribution panel shows where the order came from: * The referral source * UTM source, medium and campaign * The landing page the customer arrived on ### Tagging Orders You can add tags to an order to help you identify and manage orders. Tags are useful for filtering orders and can be used to group orders by customer, channel, or any other criteria. ### Shipping Details The shipping details section contains the shipping address for the order and the shipping method that has been applied. If the order still has a `processing` status you can edit these details. Orders that are for collection will not have a shipping address. ### Shipping Date You can optionally set a shipping date for the order. This is the date that the order is expected to be shipped. This can be useful when the customer has requested a specific delivery date or you are expecting the customer to collect the order on a specific date. The date picker blocks past dates. If the order is currently held for London City Bond dispatch, changing the shipping date reschedules that hold and logs the change to the order activity. The shipping date is not the same as the delivery date. The shipping date is the date that the order is expected to be shipped. A [gift order](/orders/gifts) with a **Deliver after** date sets its shipping date from that date, which is what holds the parcel until then. ### Gift options A gift order carries a **Gift options** block showing who it's **For** and **From**, their email address, when to **Tell them on**, the **Deliver after** date, **When it ends** for a gifted subscription, and the **Gift message**. See [Gift orders](/orders/gifts). ### Gift vouchers An order that sold vouchers lists every code under **Vouchers issued**, each one masked to its last four characters and linking to its [voucher details](/gift-vouchers/details). An order paid with a voucher shows what the voucher covered alongside its payments. See [Redeeming](/gift-vouchers/redeeming). ### Order Activity This is where you can view a history of actions taken on the order (either manually or by the app) and any notes that have been added. The activity feed updates automatically, polling every few seconds. Some activity is written by background jobs, so an entry may appear a moment after you take an action. # Fulfilment Source: https://docs.marzipan.co/orders/fulfilment Ship orders to your customers Fulfilling orders is the process of preparing and sending orders to customers. Marzipan provides a simple and easy way to mark orders as shipped. ### Manual Fulfilment It is easy to fulfil orders manually in Marzipan. To fulfil an order, click the **Fulfil** button in the fulfilment section of the order details page. Order detail screenshot Clicking **Fulfil** opens the **Ship order** modal, where you record how the order was sent. Ship order modal The modal supports: * **Partial shipment** - set a shipped quantity per item, so you can ship part of an order now and the rest later * **Courier** - choose from APC Overnight, DHL, DPD, FedEx, London City Bond, Parcelforce, Royal Mail, Delivered by hand, Collected, or Other * **Tracking reference** - the courier's tracking number * **Shipping cost** - the cost of the shipment * **Comments** - any notes about the shipment ### Updating a shipment Clicking an existing shipment opens the **Update shipment** modal, where you can edit its status and tracking details. ### Automatic Fulfilment If you are using the London City Bond integration and have set up a flow to automatically send orders to London City Bond then Marzipan will automatically create a shipment for the order with a status of `Processing`. Orders sent to London City Bond are checked daily and will update the order status to `Shipped` or `Delivered` as and when they are processed. Order detail screenshot ### Bulk shipment update If you need to update tracking and status for many orders at once, use **Bulk shipment update** from the [Orders](/orders/overview) page. Upload a CSV to set tracking and status across many orders in one go. A downloadable template is provided so your file is in the right format. # Gift orders Source: https://docs.marzipan.co/orders/gifts Let customers send an order to someone else, with a message, a delivery date and a reveal date. With gifting turned on, a customer can send an order to somebody else, with a message, a date not to deliver before, and a date the recipient is told about it. Turn it on with **Let customers buy gifts** under [Settings > Cart & Checkout](/settings/cart-and-checkout#gifting). ## At checkout The delivery step opens with **Who is this for?**, offering **Myself** or **Someone else**. Choosing Someone else collects the recipient's delivery address, then asks **This is a gift**. Answering yes adds a step for: * **The recipient's name**, and who the gift is **from** * **A gift message** * **Their email address**, where the gift is something the recipient needs to hear about * **Tell them on** - the date the recipient is contacted * **Deliver after** - the earliest date the parcel may go All of the wording on these steps is yours to change, under **Settings > Branding & Web Components > Checkout**. "Who is this for?" is deliberately broader than "is this a gift?", because it also covers sending something to your own office. The gift question comes second, and only once the customer has said the order is for someone else. ### What's collected, and when * **A gift of physical goods alone** needs no recipient email. Nothing is sent to the recipient and no account is created for them. The message travels in the box. * **A gift subscription** does need one, because an account is created for the recipient so they can manage their deliveries. Checkout refuses a gift subscription with nobody to send it to. * **A gift voucher** carries its own recipient and send date on the voucher itself. See [Selling vouchers](/gift-vouchers/products). ### Billing and delivery Billing stays with the **buyer** and delivery goes to the **recipient**. The buyer is the order's customer, so your order list, exports and reporting still show who actually paid. An order goes to one destination. The recipient details and the end-of-term choice are asked once, for the whole order, rather than per line. ## The recipient as a customer Where a gift needs one, the recipient is created as an ordinary customer, with the delivery address attached to them. An existing customer gifted a case at their office **never** has their own default delivery address repointed. The gift address is only made their default when they had none at all. ## Deliver after **Deliver after** becomes the order's shipping date, so it holds the parcel everywhere a shipping date is honoured: order processing, courier submission and held-order releases. Only physical dispatch is held. A gift voucher defers itself through its own send date, so a voucher-only order takes no shipping date at all. Where a gift subscription's first shipment already has a dispatch day, the **later** of the two dates wins. The shipment schedule says the soonest a parcel *can* go, and the gift date says the soonest it *may*. ## Tell them on The reveal date is when the recipient hears about the gift, and nothing reaches them before it: not at purchase, and not when the order is confirmed. A gift bought in November for Christmas stays quiet for six weeks. The email goes out at **eight in the morning** in the shop's own timezone, rather than whenever the overnight jobs happen to run. A reveal date can't land after the delivery date. There's no point telling somebody about a gift that has already turned up on their doorstep, so checkout refuses the combination. ## On the order A gift order carries a **Gift options** block on its [detail page](/orders/details): * **For** and **From** * **Their email** * **Tell them on** * **Deliver after** * **When it ends** - for a gift subscription, what the giver chose to happen at the end of the prepaid term * **Gift message** ## Turning gifting off Turning **Let customers buy gifts** off only stops new gifts being bought. Gift subscriptions already running keep delivering for the rest of their term, and the people receiving them still get their emails. ## Next steps Prepaid terms, reveal dates and what happens when a gift runs out Sell stored-value codes customers can spend later Turn gifting on and set the delivery date option # Overview Source: https://docs.marzipan.co/orders/overview Manage and track all customer orders in one place The Orders section provides a comprehensive view of all customer transactions in your Marzipan store. This dashboard allows you to monitor, manage, and process orders efficiently. To view your orders: 1. Log in to your Marzipan account 2. Click on **Orders** in the main navigation menu 3. By default the overview page will display all your orders by order date (newest first) ### Orders The main orders table displays key information for each order. Orders Table * **Ref** - the unique reference for each order * **Date** - when the order was placed * **Customer** - name of the customer * **Channel** - the channel the order was placed through, including `pos` for point-of-sale sales * **Market** - the market the order belongs to (only shown when your store has more than one market) * **Amount** - the total amount of the order * **Payment** - whether payment has been received (`paid`, `pending`, `failed`, `refunded`, `partially refunded`, or `free` for zero-total orders) * **Status** - the current order status (Processing, Shipped, Cancelled, etc.) Click on any order in the list to view all the [order details](/orders/details), including: * Customer details * Order items and quantities * Applied discounts * Shipping details * Payment information * Order notes and history ### Header actions The top-right corner of the orders table has a few actions: * **Order Insights** - opens the orders report so you can review sales performance * **Bulk shipment update** - upload a CSV to set tracking and status across many orders at once (see [Fulfilment](/orders/fulfilment)) * **Export** - download the orders in the table as a CSV file * **Create order** - open the manual [order form](/orders/create) ### Bulk Actions Perform actions on multiple orders simultaneously by selecting the orders you want to action, or selecting all orders on the page, using the checkbox in the first column of the table. * Add tags * Cancel orders * Export order data ### Filtering and Searching You can locate specific orders using the search box `(⌘K)`, which is the fastest way if you know the order number or customer name, or by filtering the orders table using the following options: * Order date * Channel - including **POS** for point-of-sale sales * Market - only shown when your store has more than one market * Payment Status * Status * Tags * Search term - searches the billing and shipping name Orders filter options ### Exporting Orders You can export orders to a CSV file by clicking the **Export** button in the top-right corner of the orders table. This will download a CSV file containing all the orders in the table. When you click the **Export** button, you will be shown a modal where you can select the fields you want to export. The app will remember your selection for the next time you export orders. Alongside the standard fields, you can opt into: * **Processing fee** - what Stripe charged you to take the payment * **Net amount** - the order total less that fee * Answers to any [custom checkout fields](/settings/cart-and-checkout#custom-checkout-fields) you ask Processing fee and net amount are summed across every payment on the order, since an order can be settled by more than one. They stay blank rather than showing `0.00` where no fee has come back from Stripe yet. Orders export options Apply filters *before* clicking the export button to only export the orders you need. # Payment links Source: https://docs.marzipan.co/orders/payment-links Send a customer a link to pay an order themselves, without handling their card details. A payment link hands an order to the customer to pay. It suits an order you've taken over the phone, written up after a tasting, or built by hand. The customer settles it with their own card on a secure page, so you never take their details down yourself. The customer pays the order you built, at the price you quoted, and it stays the same order with the same number throughout. ## Sending a link Open the order and click **Send payment link**, in the same row as **Process payment** and **Mark as free**. The Send payment link action on an order The link is emailed to the customer straight away. You can set how long this particular link lasts as you send it, or let it take your [default expiry](#expiry). A payment link can be sent on an order that is: * A **draft**, or on **hold** * Not yet paid * Settled through **Stripe** The payment page takes money through Stripe, so an order whose market settles through PayFast or PayPal isn't offered a link at the moment. Support for PayFast is planned. Where a market points at a provider you've since turned off, Marzipan falls back to your first active card provider. ## While a link is out Once sent, the order shows the link itself, when it went and when it lapses, with **Resend link** and **Cancel link** beside it and a button to copy the address. An order showing an outstanding payment link with resend and cancel actions While a link is outstanding the order is locked: its **items can't be edited**, and **payment can't be taken another way**. That stops the customer paying for an order that has since moved, and stops the same order being paid twice. ### Resending **Resend link** issues a fresh link and emails it again. The previous address stops working at that point, so only the most recent link a customer has is live. ### Cancelling **Cancel link** hands the order back to you. The link stops working, and the order becomes an ordinary draft again: editable, and chargeable however you like. Cancel the link first whenever you need to change an order a customer is holding. ## Expiry A payment link is a standing invitation to charge a card at a price you quoted, so by default it doesn't last forever. Set your default under **Settings > Payments**: * **1 day**, **3 days**, **7 days**, **14 days** or **30 days** * **Never expires** New stores start at 7 days. You can override the default for any individual send. Prices and stock move. A link that never expires can be paid weeks later at a price you no longer offer. An expired link leaves the order itself untouched. Only the link dies. The order shows a notice saying so, and **Payment link expired** is recorded in the order's activity, so a draft nobody paid can be told apart from one where the email never arrived. **Resend link** gives the customer a new one. ## The payment page Payment links are served from Marzipan's own payment page rather than your storefront, so they work whatever your website is built with, or if you don't have one at all. The customer-facing payment page showing the order summary and payment form The page reads top to bottom: the order summary with product images, the delivery or collection details, the total, and then the payment form. Each link has its own address, which changes every time you send. Anything else on that domain is a dead end, so an old or cancelled link stops working outright. ### Collection orders An order being collected shows **where to collect from** instead of a delivery address, taken from the shipping method's [inventory location](/settings/inventory) and falling back to your store address. Any opening hours you've written into the shipping method's description are shown with it. An order that needs no delivery at all shows neither. ### Payment methods **Apple Pay** and **Google Pay** are offered as buttons above the card form, on the devices and browsers that support them: Safari shows Apple Pay, Chrome shows Google Pay. Where a device offers neither, the row doesn't appear at all rather than leaving a gap. Beneath them the card form takes card payments. **Link** may also be offered, where Stripe judges the customer has an account. Payment methods that would take the customer away to another site to pay aren't offered, since nothing on the page is set up to receive them back. ### Branding The payment page picks up your **button colours** and **corner radius** from **Settings > Branding & Web Components**, so a store that has themed its shop gets a matching payment page without setting it up twice. Backgrounds and text colours are deliberately left alone. This is a page people type card numbers into, and it needs to read as trustworthy above all. ## After payment The order leaves draft and the payment is recorded against it like any other. The link stays live for a day afterwards so the customer can come back and check their payment landed, then retires itself. Paying **doesn't release a hold**. An order held because something was oversold stays held once it's paid, so it can't drop into fulfilment with nothing to pick. Release it yourself when the stock is sorted. ## The email The payment link email is your store writing to its own customer, so it carries your branding and can be reworded under **Settings > Notifications** alongside your other customer emails. It includes the order summary and delivery details, so the customer can check the items, delivery method and address before paying rather than being asked to pay a figure. The expiry sentence disappears by itself when a link never expires, so you can word it around the date without it trailing off. ## From the mobile app Payment links can be sent and cancelled from the Marzipan mobile app as well as the web app, so you can hand an order over while you're with the customer. # Payments Source: https://docs.marzipan.co/orders/payments Process and manage payments for orders Marzipan tracks the payment status of every order and lets you take payment, record offline payments, and issue refunds from the order details page. ### Payment status Each order has a payment status: * `pending` - payment has not yet been taken * `paid` - payment has been received in full * `failed` - a payment attempt was unsuccessful * `refunded` - the order has been refunded (fully or partially) * `free` - a zero-value order that has been completed ### Process payment On an unpaid order, click **Process payment** to take payment. You can either: * **Charge a saved card** - charge a payment method the customer has on file * **Record a manual payment** - log a payment taken offline, for example cash, bank transfer, phone, or other Use a manual payment when the customer has already paid you outside of Marzipan and you just need to record it against the order. ### Send payment link Rather than taking the card yourself, you can send the customer a link to pay the order themselves. Available on draft and held orders that settle through Stripe. See [Payment links](/orders/payment-links). ### Mark as free For zero-value orders, use **Mark as free** to complete the order without taking payment. Marking an order as free triggers the same automations as a paid order, so a warning is shown before you confirm. ### Refunds You can refund an order in full or in part. When you issue a refund you add a reason, and the refund is shown against the original payment as a nested row on the order. ### Redeem points When rewards are enabled, you can **Redeem points** at the order level to apply the customer's rewards points to the order total. ### Tap to Pay and card-present payments Card payments taken in person appear on the order with a Tap to Pay indicator, along with the card brand and the last 4 digits of the card. These are taken through the Marzipan mobile app. See [Point of Sale](/orders/pos). ## Related Documentation Process and ship orders to your customers # Point of Sale & Tap to Pay Source: https://docs.marzipan.co/orders/pos Sell in person with the Marzipan mobile app and take card payments with Tap to Pay Point of Sale lets you sell in person (in your shop, at events, or on the road) using the **Marzipan mobile companion app**. In-person sales appear in the web app under the **POS** channel, where you review and manage them alongside your other orders. POS setup and selling happen in the Marzipan mobile app. The web app is where POS orders are reviewed and managed. ### Permissions Selling through POS requires staff permissions, set via Roles: * `pos.charge` - required to take POS sales * `payments.collect` - required to take card payments ### Quick Pay Quick Pay is the fastest way to build a sale. Add products from your catalogue, or add **custom line items** by entering a free-text name, price and quantity for anything that isn't in your catalogue. Quick Pay screen in the Marzipan mobile app ### Walk-in customer Sales default to a shared "walk-in" placeholder customer, so you can sell quickly without stopping to capture customer details. ### Identify a customer at the till Search for a customer by **name or email** to attach the sale to them. Identifying a customer surfaces **subscriber pricing** for members, which is useful when selling to members at events, and the cart re-prices as soon as you identify or clear them. ### Discounts Apply a **percentage or fixed-amount discount** to the whole sale at the till. Any automatic discounts you run apply to POS orders too, so the customer is charged the discounted total. ### Newsletter opt-in If you have a default mailing list, the till can offer a **newsletter opt-in** when you take the customer's email. It applies whether you send the receipt or skip it. ### Tap to Pay on iPhone Take card payments in person with Tap to Pay on iPhone, powered by Stripe Terminal on your Stripe Connect account. This requires the card-present capability on your Stripe account. **Terminal locations** can be created automatically from your business address, or added manually. Once a payment is approved, a card-present payment shows on the order in the web app with a Tap to Pay indicator, along with the card brand and the last 4 digits of the card. ### Receipts Once payment is approved, you can email a POS receipt to the customer. Capture the customer's email (and an optional name) to send it. Sending the receipt also **links the walk-in order to that customer**. You can **Skip** the email to link a customer to the order without sending a receipt. The receipt screen in the Marzipan mobile app after a payment is approved ### Assign a walk-in order later If a sale went through as a walk-in, you can assign it to a real customer afterwards. From the order's **Actions** menu in the web app, choose **Assign customer**. This re-links the order only. It does not re-price the order. ### POS orders and flows [Flows](/flows/overview) on the `order.paid` trigger skip POS orders unless the flow opts in with **Include POS orders**. A till sale has no delivery address and uses the walk-in customer, so a delivery-shaped flow shouldn't treat it like a web order. ### Order lifecycle POS orders start as a draft. Once paid, they become `processing` and then completed. If stock is oversold, the order goes on `hold` until it can be resolved. # Bundles and options Source: https://docs.marzipan.co/products/bundles-and-options Build bundles, add product options, and link upsell and related products These sections of the product form let you build up what a customer can buy, and what you show them alongside it. Open a product from **Products** in the main navigation menu to find them. ## Bundle items For a **bundle** product, choose the products included in the bundle and the quantity of each. Bundle items only appear on products created with the **Bundle** type. The type can't be changed after a product is created. ## Options Define product **options**, for example size, as a list of choices. You can mark an option as **required** so the customer must pick a choice before adding the product to their cart. ## Upsell and related products * **Upsell products** - alternatives a customer can choose instead of this product, for example a gift box * **Related products** - products shown alongside this one ## Tier exclusivity If you use reward tiers, you can restrict a product to specific membership tiers, so only members of those tiers can buy it. # Creating a product Source: https://docs.marzipan.co/products/create Add a product to your catalogue and set its details, images, and bottle labels To create a product, go to **Products** in the main navigation menu, click **Add product**, and choose a type. To edit an existing product, click it in the list. Both open the same form. The product **type** (**Physical** or **Bundle**) is set at creation and can't be changed afterwards. See [Overview](/products/overview) for what each type is used for. * **Name** - the product name shown to customers * **Slug** - the URL-friendly version of the name, generated automatically and editable * **Type** - Physical or Bundle (set at creation, can't be changed) * **Summary** - a short rich-text introduction * **Description** - the full rich-text product description * **SKU** - your stock-keeping reference * **Barcode / GTIN** - accepts an EAN-13, UPC-A, EAN-8, or ITF-14 code, validated live as you type * **Collections** - the [collections](/collections/overview) this product belongs to * **Availability** - who can buy the product: **Everyone** or **Subscribers only** * **Status** - the product's current status For multi-market stores, **Market visibility** controls which markets show the product. If you don't select any markets, the product is visible everywhere. Product images and bottle labels * **Images** - add multiple product images and drag to reorder them. The first image is used as the main image. * **Bottle labels** - add front and back label images for the product. For multi-market stores, each image also carries a **market scope**. Leave it unset and the image shows everywhere; set it and the image only shows in the markets you choose. Use this when the same SKU needs different imagery per market, usually because the physical label differs. The main image is simply the first image available in the market being viewed, so a market with its own imagery leads with it. If scoping would leave a product with no image at all, the full gallery is shown instead. Assign [attribute](/attributes/overview) values, such as Size, Colour, or Material, to describe the product. The **SEO** section controls how the product appears in search results and when its page is shared. * **Meta title** - the title shown in search results * **Meta description** - the description shown in search results * **Share image** - the Open Graph image used when the product is shared The remaining sections of the form are covered on their own pages: * [Pricing](/products/pricing) * [Inventory](/products/inventory) * [Bundles and options](/products/bundles-and-options) * [Reviews and awards](/products/reviews-and-awards) Already selling something similar? Use **Duplicate product** from the products list to create a copy as a starting point. # Inventory Source: https://docs.marzipan.co/products/inventory Manage stock, purchase limits, overselling, and low-stock badges for a product Stock for a product is managed in the **Inventory** section of the product form. Open a product from **Products** in the main navigation menu and scroll to **Inventory**. ## Quantity * **Quantity** - a single stock quantity, or per-location quantities if [location-based inventory](/settings/inventory) is enabled With location-based inventory on, you can also **manage inventory** and **view history** for a product from the products list. ## Stock source **Bundles** choose how their available quantity is worked out: * **Managed** - the bundle holds a stock figure of its own * **Derived from constituent items** - the figure comes from the items the bundle contains A derived bundle updates on its own as its parts move. Each item limits the bundle by how many whole bundles it can supply, worked out at each inventory location, so a mixed case is bounded by its scarcest item. Restocking a part makes every bundle containing it available again. Use **Derived** for a case you assemble from stock you already hold, and **Managed** for a pre-pack the warehouse holds under its own SKU. ## Purchase rules * **Limit per customer** - cap how many of this product a single customer can buy * **Allow overselling** - let customers buy the product even when it's out of stock * **Overselling limit** - extra units that can be sold on top of the stock level. Leave blank for no limit. The overselling limit is an allowance **on top of** the current stock figure rather than a total, so it rebases whenever stock is resynced. Use it when you hold stock somewhere Marzipan can't see, such as a second warehouse, and want to sell a set number beyond the figure on screen rather than sell forever. Overselling doesn't apply to events, untracked products, or bundles taking their stock from constituent items, none of which carry a figure for an allowance to sit on. ## Low-stock badge The **low-stock badge** tells customers when stock is running low. On the product you can: * Show or hide the badge * Set the **threshold** at which it appears * Set the badge **text** * Or fall back to your global default Set the badge once under [Inventory settings](/settings/inventory) and only override it on the products that need something different. ## Valuing your stock To see what the stock you hold is worth at cost, use the [stock valuation report](/insights/sales#stock-valuation) in Insights. # Overview Source: https://docs.marzipan.co/products/overview Create and manage the products in your catalogue Products are the items you sell in your Marzipan store. This section covers the products list and every setting on the product form. To view your products: 1. Log in to your Marzipan account 2. Click on **Products** in the main navigation menu 3. The list shows all your products, newest first ## Product types You choose a type when you create a product. The type can't be changed afterwards. * **Physical** - a tangible product you ship, for example a single item * **Bundle** - a grouping of physical products, for example a gift set or multi-pack Subscriptions and events aren't product types. Create them in their own areas: [Subscriptions](/subscriptions/overview) and [Events](/events/overview). ## Products list Products list The products list gives you an overview of your catalogue. You can: * Switch between **grid** and **list** views using the toggle * Open **Product insights** to review how your products are performing * **Search** for a product by name * **Filter** by Status (Active, Draft, Out of Stock, Archived) and Type (Physical, Bundle) * **Sort** by Name, Price, SKU, or Created ### Statuses Products can have the following statuses: `active`, `draft`, `out of stock`, `archived`, and `unavailable`. ## Actions * **Duplicate product** - create a copy of a product to use as a starting point * When [location-based inventory](/settings/inventory) is on, you can also **manage inventory** and **view history** for a product ## In this section Add a product, set its details, market visibility, images, and bottle labels. Standard, sale, subscriber, and wholesale prices, plus per-market pricing. Stock quantities, purchase limits, overselling, and low-stock badges. Bundle items, options, upsell and related products, and tier exclusivity. Add awards and reviews, and set the product's SEO fields. Describe your products with values such as Size, Colour, or Material. # Pricing Source: https://docs.marzipan.co/products/pricing Set standard, sale, subscriber, and wholesale prices, and price per market Prices are set in the **Pricing** section of the product form. Open a product from **Products** in the main navigation menu, or create one, then scroll to **Pricing**. Product pricing fields ## Price fields * **Price** - the standard selling price * **Sale price** - a reduced price; applies when it's lower than the standard price * **Subscriber price** - the price for active subscribers, with quick **−10%**, **−15%**, and **−20%** buttons to set it from the standard price * **Wholesale price** - the price for wholesale customers * **Item cost** - what the product costs you, used for reporting ## The effective price The **effective price** a customer pays depends on who they are: * The **subscriber price** applies to active subscribers * The **sale price** applies whenever it's lower ## Per-market pricing Multi-market stores get **per-market pricing tabs**: a **Default** tab plus one tab per [market](/settings/markets). * Set optional **price overrides** on a market's tab, in that market's currency * Where you don't set an override, prices **convert from the default by exchange rate** Use an override when you want a round, deliberate price in a market rather than a converted one. # Reviews and awards Source: https://docs.marzipan.co/products/reviews-and-awards Add awards and customer reviews to a product Awards and reviews are set on the product form. Open a product from **Products** in the main navigation menu and scroll to the relevant section. ## Awards Add awards to a product, each with: * **Award** - the award itself * **Event** - the competition or event it was given at * **Class** - the class the product was entered in * **Year** - the year it was awarded ## Reviews Add reviews to a product, each with: * **Author** - who wrote the review * **Review** - the review text * **Type** - the kind of review * **Date** - when it was written Each award and review can be set to **published** or **private**. Private entries are kept on the product but aren't shown to customers. # Quickstart Source: https://docs.marzipan.co/quickstart Get your store up and running with Marzipan. ## The seven steps to get your store up and running with Marzipan Create your Marzipan account to access the platform: 1. Visit [app.marzipan.co/register](https://app.marzipan.co/register) 2. Complete the registration form 3. Verify your email Configure your essential business information: 1. Navigate to **Settings > General** 2. Ensure your legal business name, address, and contact information are correct 3. Upload your logo and brand assets Detailed guide to business profile configuration, compliance settings, and shipping rules Set up payment processing to accept orders: 1. Navigate to **Settings > Payments** 2. Connect your Stripe account (required for subscriptions) for credit card processing 3. Optionally connect PayPal for additional payment options Advanced payment configuration, including currencies, taxes, and fraud prevention Configure your shipping settings: 1. Navigate to **Settings > Shipping** 2. Configure your shipping zones and rates 3. Set up your shipping methods Detailed guide to shipping configuration, including zones, rates, and methods Configure your tax settings: 1. Navigate to **Settings > Tax** 2. Configure your tax rates and tax zones 3. Set up your tax methods Detailed guide to tax configuration, including rates, zones, and methods Create your first product in the catalogue: 1. Navigate to **Products > Add product** 2. Enter product details (name, price, inventory, etc) 3. Add product images and description 4. Save and publish your product Complete product management, including inventory tracking and pricing strategies Add Marzipan commerce functionality to your website using our web components. Implementation guides for all available web components with examples and customisation options ## Launch Checklist Before going live with your Marzipan storefront, verify these essential items: * [ ] Business details are complete with accurate contact information * [ ] Payment processing is configured and tested * [ ] Add at least 3-5 products * [ ] Configure shipping zones and rates * [ ] Configure tax settings * [ ] Customise order confirmation emails ## Next Steps Now that you've completed the basic setup, explore the rest of the documentation to learn more about the features of Marzipan and how to use them. Need help? Contact our support team at [hello@marzipan.co](mailto:hello@marzipan.co). # Earning and Redemption Source: https://docs.marzipan.co/rewards/earning-and-redemption Set how points are earned, what they are worth, and how customers spend them The rules that drive the loyalty programme live in **Settings > Rewards**. This is where you decide how quickly customers earn points, what those points are worth at checkout, and what customers are told along the way. To configure the programme: 1. Log in to your Marzipan account 2. Navigate to **Settings > Rewards** 3. Make sure **Enable Rewards** is turned on ## Earning points Control how customers earn points: * **Points per unit** - how many points a customer earns for each unit of spend * **Minimum spend** - the minimum spend required to earn points Both are set **per currency**, so you can run different rates in each market. You can also choose what counts towards the order total when points are calculated: * **Exclude shipping** * **Exclude discounts** * **Exclude tax** * **Exclude voucher payments** - no points for the part of an order a [gift voucher](/gift-vouchers/overview) paid for. On by default. Excluding shipping, discounts and tax means customers earn points only on the value of the products themselves. Buying a gift voucher never earns points, whatever these settings say. **Exclude voucher payments** governs the other half of it: whether spending one earns. Letting a redemption earn is a deliberate choice rather than a way of paying twice for the same money, so the exclusion is on unless you turn it off. ## Redeeming points Let customers spend their points for money off at checkout: * **Enable redemption** - allow points to be redeemed at checkout * **Minimum points** - the fewest points a customer can redeem in one go * **Maximum discount %** - an optional cap on how much of an order can be paid with points. Leave it empty for no limit * **Redemption rates** - the value of points, set per currency (for example `100 points = 1 GBP`) Points redeemed on an order appear on the [order details](/orders/details) screen. ## Checkout confirmation Tell customers about their points once the order is placed: * **Show on confirmation** - show the points earned or redeemed on the order confirmation page * **Show for guests** - show it to customers who checked out without an account * **Guest message** - the message shown to guests, inviting them to create an account so they can start earning ## Notifications Keep customers informed as they move between tiers: * **Tier upgrade** - email the customer when they move up a tier * **Tier downgrade** - email the customer when they move down a tier See [Tiers & Perks](/rewards/tiers-and-perks) for how tiers and their thresholds are set up. # Overview Source: https://docs.marzipan.co/rewards/overview Run a points-based loyalty programme to reward your best customers Rewards is a points-based loyalty programme. Customers earn points when they spend, climb through tiers as they earn, and can redeem their points for a discount at checkout. You decide how points are earned, what they are worth, and which perks each tier unlocks. ### Enabling rewards Turn the programme on in **Settings > Rewards**. Once enabled, a Rewards area appears in the main navigation, and rewards information starts to appear on customer profiles. You can optionally make the programme **subscribers only**. When you do, non-subscribers see a message inviting them to join, along with a button whose text you set. ### How it works * Customers **earn points** on every qualifying order, based on the rate you set. You choose the minimum spend needed to earn, and whether shipping, discounts and tax count towards the total. See [Earning & Redemption](/rewards/earning-and-redemption). * As their points build up, customers move through your **tiers**. Each tier has a points threshold and a set of perks. See [Tiers & Perks](/rewards/tiers-and-perks). * Customers can **redeem points** for money off at checkout, at a rate you set per currency. See [Earning & Redemption](/rewards/earning-and-redemption). ### Adjusting a customer You can adjust an individual customer's standing from the **Rewards** tab on their profile: change their points balance or set their tier directly. See [Customer details](/customers/details). ### Rewards Insights The Rewards report helps you measure the programme's impact: * Number of **members** * Points **earned**, **redeemed** and **outstanding** * **Redemption rate** * Member versus non-member **average order value**, and the **AOV lift** between them * **Tier distribution**, and tier **upgrades and downgrades** See [Insights](/insights/overview) for more. ## Next steps Create the levels customers progress through, and the benefits each one unlocks. Set how points are earned, what they are worth, and how customers spend them. # Tiers and Perks Source: https://docs.marzipan.co/rewards/tiers-and-perks Create the levels customers progress through, and the benefits each one unlocks Tiers are the levels customers progress through as they earn points. Perks are the benefits each tier gives its members. Create and manage both in the Rewards area of the main navigation. Reward tiers ## Tiers Each tier has: * **Name** - the tier's name * **Points required** - the points threshold a customer must reach to join the tier * **Badge colour** - the colour used for the tier's badge * **Active** - a toggle to turn the tier on or off * **Description** - a short description of the tier Drag tiers to reorder them by threshold. Customers move between tiers automatically as their points balance changes. You can email them when they do. See [Earning & Redemption](/rewards/earning-and-redemption). ### Tier details Opening a tier shows: * Its current **members** * A **history** of customers joining and leaving the tier ## Perks Perks are the benefits a tier gives its members. Add as many as you like to each tier. Each perk has: * **Name** - what you call the perk * **Type** - `Discount`, `Free Shipping`, `Early Access`, `Events` or `Other` * **Subscription** - optionally restrict the perk to a particular subscription * **Description** - the free-text description you write A perk is simply a name, a type and the description you write. There is no per-type configuration: no percentage field, no product picker. Use the description to explain the benefit to your customers in your own words. You can adjust an individual customer's tier from the **Rewards** tab on their [profile](/customers/details). # Cart & Checkout Source: https://docs.marzipan.co/settings/cart-and-checkout Recover abandoned carts, set the rules a cart must meet, and ask your own questions at checkout. Cart & Checkout settings cover what happens to carts customers leave behind, the rules a cart must meet before it can be checked out, and any extra questions you want to ask on the way through. Navigate to **Settings > Cart & Checkout** to manage these options. Cart and checkout settings page ## Abandoned carts When a customer adds items and leaves without checking out, Marzipan can create a task for your team, email the customer, or both. ### Task creation * **Enable task creation** - Create a [task](/tasks/overview) when a cart is abandoned * **Default assignee** - The team member the task goes to * **Default priority** - The priority new tasks are created at * **Task due in** - How long the assignee has before the task is due ### Email notification * **Email notification** - Email the customer about the cart they left * **Send after** - How long to wait before the email goes out ### Minimum cart value Set a minimum cart value per market. Recovery emails are only sent for carts above that value, so you don't chase a single low-value line. Leave a market blank for no minimum. ## Checkout requirements Rules a cart must meet before a customer can check out. These rules are enforced everywhere a cart can be paid for, including express checkout and any storefront built directly on the API. A customer is stopped before a payment sheet appears rather than after it. * **Minimum items** - The total quantity a cart must reach. Leave empty for no minimum. * **Require full case quantities** - Physical items must be ordered in whole multiples of the minimum. With a minimum of 6, a cart of 6 or 12 is allowed but 7 is not. * **Message** - The wording shown when the cart is below the minimum. Use `{minimum}` for the required number and `{shortfall}` for how many more are needed. Leave empty for the default wording. Gift cards, event tickets and subscriptions aren't counted towards either rule, so they never change how many bottles make a case. Bundles count the items inside them rather than as a single line, so a case of six sold as one bundle counts as six. **Require full case quantities** only means something alongside a minimum, so it clears when the minimum does. Set the minimum first. ## Gifting Let customers send an order to somebody else, with a message and a delivery date. * **Let customers buy gifts** - adds a "Who is this for?" choice at checkout, so a customer can send an order to someone else with a message and a delivery date * **Delivery date on their own orders** - lets a customer buying for themselves choose a date to deliver after. Gift orders always offer one, whether this is on or off. See [Gift orders](/orders/gifts) for what the customer sees, and [Gift subscriptions](/subscriptions/gifts) for a subscription bought as a gift. Turning gifting off only stops new gifts being bought. Gift subscriptions already running keep delivering for the rest of their term, and the people receiving them still get their emails. Marzipan tells you how many are still running before you turn the switch off. The wording of every gift and recipient question is yours to change under [Branding & Web Components](/web-components/customisation), including what you call the choice at the end of a gifted subscription's term. ## Custom checkout fields Ask your own questions on the details step at checkout, such as a reciprocal club's membership number. Answers are stored against the order and the customer. Click **Add field** to add a question. Each one has: * **Label** - The question as the customer sees it * **Name** - The identifier the answer is stored under. It's set from the label and **fixed once saved**, because answers already collected are keyed on it. * **Type** - **Text** or **Checkbox** * **Placeholder** - Optional placeholder text for the field * **Help text** - Optional guidance shown under the field * **Auto-tag** - An optional tag applied to the customer once the question is answered * **Markets** - Restrict the question to particular markets, or leave unset to ask it everywhere * **Required** - Whether the customer must answer before continuing Answers are recorded but never checked, so don't use custom fields to collect payment details or other sensitive information. A **required** question can only be answered on the checkout page, so the Apple Pay and Google Pay shortcut at the top of checkout is hidden in any market where one applies. Apple Pay and Google Pay are still offered at the payment step as normal. ### Where answers appear * On the **order**, in the customer box alongside the rest of their details * On the **customer**, where the latest answer is kept and used to pre-fill the question next time they order * In the **orders CSV export**, as extra columns you opt into through the [column picker](/orders/overview#exporting-orders) Renaming a question later never rewrites past orders. Each order keeps the label it was placed under. Set an **auto-tag** on a question you intend to segment on. The tag is only applied when the question is actually answered, so a blank answer or an unticked checkbox tags nobody. # Email Source: https://docs.marzipan.co/settings/email Manage your email sending domains and delivery settings. The email settings page lets you register custom sending domains so that emails from your store (order confirmations, shipping notifications, marketing) are sent from your own domain rather than a shared address. This improves deliverability and builds trust with your customers. ## Sending Domains Navigate to **Settings > Email** to manage your sending domains. ### Registering a Domain 1. Click **Add Domain** and enter your domain name (e.g. `yourbrand.com`) 2. Marzipan will display the DNS records you need to add to your domain 3. Add the records with your domain registrar or DNS provider 4. Return to the email settings page to check verification status ### Required DNS Records You'll need to add the following DNS records: | Record | Purpose | | --------- | -------------------------------------------------------------------------------------------------- | | **MX** | Routes bounce notifications and inbound replies back to Marzipan | | **SPF** | Authorises Marzipan's mail servers to send email on behalf of your domain | | **DKIM** | Adds a digital signature to your emails, proving they haven't been tampered with | | **DMARC** | Tells receiving servers how to handle mail that fails SPF or DKIM checks, improving deliverability | DNS changes can take up to 48 hours to propagate, though most updates are visible within a few hours. While records are pending, the page **auto-checks verification roughly every 60 seconds**, so you don't need to refresh manually. ### Verification Status Each DNS record shows one of two states: * **Verified** - The record has been detected and is configured correctly * **Pending** - The record has not yet been detected. Check that it was added correctly with your DNS provider. Once all records are verified, your domain is ready to use for sending. No emails are sent from a domain until it's verified. Add and verify your records before you rely on the domain for order confirmations or marketing. ## Inbound Email Adding the **MX records** for your domain lets customer replies to your emails arrive in your Marzipan [Messages](/messages/overview) inbox, so you can respond to enquiries without leaving the app. Putting MX records on your **root domain** (e.g. `yourdomain.com`) captures **all** email for that domain, including mail sent to your normal mailboxes. To avoid this, use a dedicated subdomain such as `mail.yourdomain.com` for sending and inbound replies. ## Email Suppression Marzipan automatically manages an email suppression list to protect your sender reputation. Email addresses are added to the suppression list when: * An email bounces (the address doesn't exist or the mailbox is full) * A recipient marks your email as spam Suppressed addresses are automatically excluded from future sends. This happens behind the scenes, so you don't need to manage the list manually. ## Delivery Marzipan delivers your email through provider **routing rules** with automatic failover. If a provider encounters an issue, mail is routed through an alternative so your transactional emails (order confirmations, shipping updates) are delivered reliably. # Gift Vouchers Source: https://docs.marzipan.co/settings/gift-vouchers Whether vouchers are sold, the amounts offered, and how long a voucher lasts. These are the shop-wide defaults for [gift vouchers](/gift-vouchers/overview). Individual [voucher products](/gift-vouchers/products) can override the amounts and the expiry. Navigate to **Settings > Gift Vouchers** to manage these options. Gift voucher settings page ## Selling * **Sell vouchers** - whether customers can buy vouchers from your shop Turning this off stops new vouchers being sold. Vouchers people already hold keep working, and where any are still unspent Marzipan tells you how many there are and what they're worth before you turn the switch off. ## Amounts * **Set amounts** - the amounts offered on the voucher product page. Add and remove as many as you like. * **Let customers choose their own** - adds a free-entry amount, bounded by a **Lowest** and a **Highest** ## Expiry * **Vouchers last for** - a number of months. Leave it blank so vouchers never expire, which is what we recommend. * **Warn the holder** - how many days before expiry the **Voucher expiring soon** email goes out. Set it to 0 to send no warning. There's a floor on how short an expiry you can set, and the field tells you what it is. The warning only applies to vouchers that expire at all. Changing the expiry policy only affects vouchers sold **from now on**. Vouchers already issued keep the expiry they were sold with. ## What happens at expiry A nightly sweep expires vouchers that have reached their date, and sends the warning email ahead of it. Expiry moves the balance to zero **through the ledger** rather than just changing a status, so the value can be seen leaving in the [liability report](/insights/gift-vouchers), where it's recognised as breakage. # Inventory Source: https://docs.marzipan.co/settings/inventory Track stock across locations, with movements, alerts, and low-stock badges. Inventory settings let you track stock across one or more locations, record every change, and warn customers and your team when stock runs low. Navigate to **Settings > Inventory** to manage your inventory. Inventory settings page ## Location-based inventory Location-based inventory is **off by default**. To start tracking stock per location, **initialise** it once. This copies your current stock to your default location, after which stock is managed on each product. Until you initialise it, a banner on this page prompts you to do so, with a default-location picker if you haven't set one yet, and the inventory page shows a callout with its inputs disabled. Initialising location-based inventory **can't be undone**. Make sure your current stock figures are correct before you start. ### Inventory locations Add the locations you hold stock in, each with a **name** and **address**, and set one as your **default**. ### Inventory rules Once you have more than one location, add **inventory rules** to choose which location fulfils an order based on conditions such as the shipping country. ## Stock movements Every change to stock is recorded as a movement with a reason, so you always have a full history. Reasons include: * **Received** * **Write off** * **Stock take** * **Transfer** (in or out) * **Return** * **Order** * **Wholesale** * **Initial stock** * **Derived** * **Other** You can add optional notes to any movement. A **Wholesale** adjustment can name the trade customer it was made for. When you name one, the adjustment also appears on that customer's activity feed. The picker only offers wholesale accounts, and naming a customer is optional. **Derived** movements are recorded automatically for bundles taking their stock from [constituent items](/products/inventory#stock-source). Cancelling an order returns its stock automatically, to the location it originally came off, recorded as a **Return**. ## Adjusting stock Use **Adjust stock** on the inventory page to correct several products in one go, which is what a wholesale order with multiple lines needs. Add products by search, give each line its own quantity up or down, then set one location, reason, note and optional trade customer across the whole batch. The current stock at the chosen location is shown against each line as you go. The batch is applied together, so a single bad line can't leave an adjustment half applied. You can also **import a CSV** with one row per SKU per location. ## Exporting inventory Click **Export** on the inventory page to download the current filtered view as a CSV, with one column per inventory location plus a total. Filter the list first to export only the products you need. The inventory page also links straight to the [stock valuation report](/insights/sales#stock-valuation), so you can go from the figures to what they're worth. ## Low-stock badges Show customers when stock is running low with a storefront badge. * Enable the badge and set a **threshold** * Add **custom text**, which supports a `{count}` placeholder for the remaining quantity * Override the badge per product where needed ## Low-stock alerts Email your team when a product's stock falls to a set level. * Enable alerts and set an **alert threshold** * Choose a delivery style: * **Real-time** - Sent immediately, at most one per product every 24 hours * **Daily digest** - A single email at 8am Only team members who have opted into the low-stock notification receive these alerts. Manage this under **Settings > Team**. ## London City Bond If you use the [London City Bond](/integrations/overview) integration, stock syncs automatically into a dedicated inventory location. This requires location-based inventory to be initialised first. # Markets Source: https://docs.marzipan.co/settings/markets Sell in more than one currency with regional markets and pricing. Markets let you sell in more than one currency and tailor pricing to different regions. Each market defines a currency and the prices customers in that region see. Navigate to **Settings > Markets** to manage your markets. Your **primary market** is created automatically from your store's default currency. It's the market customers fall back to when no other applies, so you always have at least one. Markets list ## Adding or editing a market Click a market to edit it, or add a new one. Each market has the following options. * **Name** - A label for the market, such as `Europe` or `United States` * **Active** - Whether the market is available to customers * **Show in currency switcher** - Lets customers choose this market manually from the storefront currency switcher * **Primary market** - Marks this as your default market. This **cannot be changed once you have orders, subscriptions, or customers** * **Inventory location** - An optional default [inventory location](/settings/inventory) for orders in this market * **Payment provider** - The gateway used for the market (**Stripe** or **PayFast**) * **Currency** - The currency code and symbol, for example `EUR` and `€` * **Exchange rate** - The rate from your base currency, used to convert prices. Fixed at `1.0` for the primary market * **Rounding precision** - How converted prices are rounded: `0` rounds to the nearest whole unit, `1` to the nearest 10 minor units, and `2` applies no rounding * **Countries** - Customers in these countries see this market automatically ## How a customer's market is chosen When a customer visits your store, Marzipan works through the following order and uses the first that applies: A market chosen directly by the customer, through the currency switcher or a link. A signed-in customer's previously saved market. A market matched automatically from the customer's location. If none of the above apply, the customer sees your primary market. ## Per-market pricing On products, events, and subscription packages you can set optional **price**, **sale price**, and **subscriber price** overrides for each market. Where you don't set an override, prices convert automatically from your base price using the market's exchange rate. ## Per-market visibility You can show or hide individual products, events, packages, and [collections](/collections/overview#market-visibility) per market, so each region only sees what's relevant to it. ## Per-market images A product keeps one gallery, and individual images can be scoped to the markets they belong in. An image with no markets set shows everywhere, so only the shots that differ need scoping. This is for the same SKU needing different imagery per market, usually because the physical label differs. A historical order keeps showing the image the customer actually bought, however the person looking at it is browsing. Stores with a single market don't see the market tabs or the scope control at all. ## Per-market product ordering A collection can be ordered differently in each market. See [Collections](/collections/overview#market-visibility). Set **per-market free-shipping messages** under **Web Components > Cart**. ## Archiving and deleting markets * **Archive** a market that has history (orders, subscriptions, or customers) to remove it from use while keeping its records intact * **Delete** a market that's unused and has no history # Settings Source: https://docs.marzipan.co/settings/overview Configure your store, payments, integrations, and web components. The Settings section is where you configure your store's core options, payment providers, integrations, and appearance. Access it from the main navigation sidebar. ## Settings areas Use the links below to jump to each area of your store's settings. Store and business details Users, roles, and permissions Tax rates and rules Payment gateways Currencies and regional pricing Stock and locations Shipping methods and zones Discount codes and automatic offers Amounts, expiry and whether vouchers are sold Third-party services Team notification preferences Loyalty and rewards Cart and checkout behaviour Branding, and your storefront components Sending domains and delivery Test without real payments Tokens for external systems ## General Navigate to **Settings > General** to manage your store and business details. ### Store details * **Store name** - Your business name, displayed in emails and invoices * **Store URL** - The web address of your storefront * **Store slug** - The short identifier used in your store's Marzipan links * **Subscriptions slug** - The slug used for your subscriptions pages * **Account slug** - The slug used for customer account pages * **Contact email** - Where customer enquiries and contact form submissions are sent * **Contact number** - Your customer-facing phone number * **Logo** - Your store logo, shown in emails and on hosted pages * **Open Graph image** - The default image shown when your links are shared on social media * **Favicon** - The small icon shown in browser tabs ### Business details * **Legal name** - Your registered legal business name * **Trading name** - The name you trade under, if different * **Address** - Your business street address * **City** - Your business city or town * **State/Province** - Your business state, province, or county * **Post code** - Your business postal code * **Country** - The country your business is registered in * **EORI number** - Your Economic Operators Registration and Identification number, used for customs * **AWRS number** - Your Alcohol Wholesaler Registration Scheme number Your store's currency is not set here. Currency is governed by [Markets](/settings/markets), where you can sell in more than one currency. ## Payments Navigate to **Settings > Payments** to configure your payment gateways. Marzipan supports three gateways: * **Stripe** - Card payments and wallets, connected through **Stripe Connect**. You connect your Stripe account directly, and you can have separate **live and test connected accounts**, each with its own connection status. * **PayPal** - PayPal checkout for customers who prefer it. * **PayFast** - Card payments, instant EFT, and local South African payment methods. Each gateway shows a status of `active`, `test mode`, or `inactive`. **Payment link expiry** is also set here: how long a [payment link](/orders/payment-links) sent from an order stays valid, from one day up to thirty, or never. You can set a different **payment provider per market**, so customers in each region check out with the gateway that suits them. See [Markets](/settings/markets). ## Branding & Web Components Customise the appearance and behaviour of your customer-facing web components without writing code. These settings also brand the [payment page](/orders/payment-links#branding). See the [Web Components customisation guide](/web-components/customisation) for full details. ## Integrations Integrations are configured under **Settings > Integrations** in the app, but they have their own section in these docs, since several need a guide rather than a paragraph. See **[Integrations](/integrations/overview)** for the full list and a guide to each one, including [London City Bond](/integrations/london-city-bond), [Google Merchant Center](/integrations/google-merchant) and [EzyPro](/integrations/ezypro). ## Email Manage your email sending domains and delivery settings. See [Email](/settings/email). ## API Generate API tokens for integrating with external systems or powering your web components. Each token has configurable permission scopes. ## Test Mode Test the full purchase flow without processing real payments. A global toggle switches your payment gateways and integrations to their test/sandbox mode. See [Test Mode](/settings/test-mode). # Roles & Team Source: https://docs.marzipan.co/settings/roles-and-team Manage your team and control what each member can do with roles. Roles let you control exactly what each member of your team can do, and the Team area is where you add people and assign those roles. ## Roles Navigate to **Settings > Roles** to manage roles. Role editor showing permission groups Create roles with **granular permissions** grouped by area. Each group has **select-all** and **deselect-all** controls so you can grant a whole area at once. Permission groups cover: * **Products** * **Collections** * **Attributes** * **Inventory** * **Orders** - including refunds * **Discounts** * **Gift Vouchers** - separate permissions for viewing, issuing, and editing (voiding, adjusting and resending) * **Customers** * **Subscriptions** - including pause and cancel * **Subscription Packages** * **Shipments** * **Events** * **CMS** * **Media** * **Flows** * **Tasks** - including who can assign work to someone else, and who can see other people's tasks * **Marketing** * **Insights** - per report * **Abandoned Carts** * **Rewards** * **Forms** * **Settings** * **Team** * **Integrations** * **Roles** * **POS / Tap to Pay** **System roles** have every permission and can't be edited. Create your own role when you need a tailored set of permissions. Reading the task list and completing a task assigned to you stay open to everyone, whatever their role. The Tasks permissions govern creating, editing and deleting tasks, putting work on someone else's list, and seeing tasks that aren't yours. Administrators can manage the **Team** by default. Editing **Roles** stays owner-only, since editing a role is how an administrator would grant themselves a permission they don't already have. ## Team Navigate to **Settings > Team** to manage your team. The Team page lists your users alongside their assigned role. From here you can **add or invite** new users and give each one a role. Each member also opts into which **notifications** they receive, including [low-stock alerts](/settings/inventory). # Shipping Source: https://docs.marzipan.co/settings/shipping Set up shipping methods, rates, and delivery zones. Shipping methods control how much your customers pay for delivery and where each option is available. Navigate to **Settings > Shipping Methods** to manage your methods. Shipping methods list ## Shipping methods Each shipping method has the following core options. * **Name** - The name customers see at checkout, such as `Standard Delivery` * **Description** - Optional detail about the method * **Enabled** - Whether the method is available at checkout * **Method** - The type of method, which determines how the rate is calculated The **Method** type can be one of: * **Flat rate** - A fixed **Amount** for every order * **Free shipping** - No charge * **Pickup** - Collection in person, with no delivery charge * **Custom rate** - A rate calculated from bands (see below) ### Custom rate bands A **Custom rate** method works out the charge from **bands**. First choose how bands are measured: * **Weight based (kg)** - Bands are based on the order's total weight * **Volume based (number of items)** - Bands are based on the number of items Then add rows of **From** / **To** / **Amount**. Set the last row's **To** to **Unlimited** to cover everything above the previous band. ## Countries and zones Select the **countries** a method applies to, and optionally restrict it to specific **zones**. Rates apply based on the customer's postcode. Marzipan includes the following built-in zones: | Country | Zones | | ---------------- | ----------------------------------------------------------------------------------------- | | **UK** | UK Mainland, Scottish Highlands & Islands, Northern Ireland, Isle of Man, Channel Islands | | **South Africa** | Major Cities, Remote Areas | ## Conditions You can gate when a method is offered. * **Minimum order value** - Require a minimum order value for the method to be available. This is measured on the **goods total after discounts**: the subtotal minus any discount, with no shipping and no tax. * **Cart conditions** - Restrict a method to carts that only contain items from certain collections A discount counts against the minimum, so what the customer pays for the goods is what earns free shipping. The shipping charge itself is never counted, which would otherwise let the rate being charged close the gap towards removing it. The currency for a method's amounts is resolved from the destination country's [market](/settings/markets). # Test Mode Source: https://docs.marzipan.co/settings/test-mode Test your store without processing real payments. Test mode lets you test the complete shopping experience, including checkout and payment, without processing real charges. When enabled, all payment gateways automatically switch to their test/sandbox credentials. ## How It Works Navigate to **Settings > Developer Settings** to access the test mode toggle. When test mode is **on**: * All payment gateways use their test/sandbox credentials * All integrations switch to their test/sandbox mode, not just payment gateways * Orders are processed normally but payments go through sandbox environments * You can test the full checkout flow with test card numbers * All other store functionality (inventory, emails, fulfilment) works as normal When test mode is **off**: * All payment gateways automatically switch back to their live credentials * All integrations are set to live mode * Real payments are processed For Stripe, test mode uses a **separate test Connect account** rather than stored test API keys. Connect your test account in **Settings > Payments** alongside your live one. Always turn off test mode before making your store available to real customers. Orders placed in test mode use sandbox payment processing. ## Setting Up Test Credentials Set up test access for each gateway you use: ### Stripe Connect a **separate test Connect account** in **Settings > Payments**. Stripe test mode uses this connected account rather than stored test API keys, so there are no keys to copy across. ### PayPal Enter your PayPal sandbox client ID and secret from the [PayPal Developer Dashboard](https://developer.paypal.com/dashboard/applications/sandbox). ### PayFast Enter your PayFast sandbox merchant ID, merchant key, and passphrase from the [PayFast Sandbox](https://sandbox.payfast.co.za). ## Test Card Numbers When using Stripe in test mode, you can use these test card numbers: | Card | Number | | --------------- | --------------------- | | Visa (success) | `4242 4242 4242 4242` | | Visa (declined) | `4000 0000 0000 0002` | | 3D Secure | `4000 0027 6000 3184` | Use any future expiry date and any 3-digit CVC. ## Clearing Test Data Testing your store creates real records (test-mode orders and customers) that you won't want cluttering your data when you go live. When you're ready to launch, you can **purge test data** to remove them. * **Preview purge** - See what would be removed before you commit to anything * **Purge test data** - Permanently delete test-mode orders and customers Run a purge once you've finished testing and before you open your store to real customers. # Details Source: https://docs.marzipan.co/subscriptions/details View and manage a single customer subscription The subscription detail screen shows one customer's individual instance of a package, and gives you every action you need to manage it. To open a subscription: 1. Log in to your Marzipan account 2. Click on **Subscriptions** in the main navigation menu 3. Click on any subscription in the list ## The subscription detail screen Open a subscription to see its full record: * **Highlights** - lifetime value, next shipment and frequency * **Activity** - the history of actions on the subscription * **Related orders** - orders generated by the subscription * A **details panel** with the subscription's key information ## Actions on a subscription From a subscription you can: * **Manual renewal** - for fixed packages, trigger the next renewal yourself * **Send renewal reminder** - email the customer a reminder * **Transfer** - move the subscription to another customer * **Change package** - switch the customer to a different package * **Change frequency** - move to a different billing frequency * **Edit the next renewal date** * **Edit the preferred shipping date** * **Skip next shipment** * **Add an item** to the upcoming shipment * **Cancel** - optionally on a scheduled date, with a reason * **Reactivate** - restart a cancelled subscription ### Renewals **Manual renewal** is available for fixed packages, letting you trigger the next renewal yourself rather than waiting for the cycle. You can also **send a renewal reminder** to email the customer ahead of their next renewal. Automatic renewal reminders are configured on the package. See [Renewal options](/subscriptions/packages#renewal-options). ### Changing a subscription You can **transfer** a subscription to another customer, **change the package** the customer is on, or **change the frequency** they are billed at. You can also **edit the next renewal date** and the **preferred shipping date**. ### Adjusting the upcoming shipment * **Skip next shipment** - miss one cycle without cancelling the subscription * **Add an item** - add an extra item to the upcoming shipment Where a customer skips from their [account](/web-components/account) they are asked why, and the reason they gave shows against the skip in the activity trail. ### Cancelling and reactivating **Cancel** a subscription with a reason, and optionally on a scheduled date so it runs until the end of the current cycle. A cancelled subscription can be restarted with **Reactivate**. Where a customer cancels from their [account](/web-components/account), the account asks why before it confirms, and offers whatever the package can do about it: the next shipment skipped, or a less frequent schedule. "Would rather not say" is offered outright, so nobody has to invent a reason to get out. The reason they gave is shown on the subscription beside its cancelled date, and named in the activity trail. ## Failed renewals If a renewal payment fails, the subscription shows a warning. Marzipan retries the payment up to four times, then cancels the subscription. Once the customer has fixed their card, you may need to trigger a **manual renewal** to get them back on track. # Gift subscriptions Source: https://docs.marzipan.co/subscriptions/gifts Sell a subscription as a prepaid gift, and manage what happens when the term runs out. A gift subscription is bought by one person and received by another. It's **prepaid for a fixed number of deliveries** and charged once, so it never auto-renews. A recurring charge against a gift is the single biggest source of chargebacks, and prepaying sidesteps dunning entirely. ## How a gift plan works A gift plan sells a set number of shipments for one payment. The buyer chooses the **term** (three, four or six deliveries, say) from the options the plan offers. An ordinary subscription package can point at a gift counterpart, so the product page offers **for me** or **as a gift** without the shopper having to find two separate products. Gift plan settings (whether a package is a gift plan, the terms it offers, and the ordinary package it pairs with) are configured through the API rather than the package form in the admin. Speak to us if you'd like one set up. ## Who pays and who receives A gift subscription separates the two: * The **giver** paid for it and owns it * The **recipient** receives the deliveries and, when the time comes, may take it over Billing email stays with the giver, so the person being given a gift never receives billing correspondence for it. The giver keeps a route to the subscription they paid for. An account is created for the recipient so they can manage their deliveries, which is why a gift subscription needs the recipient's email address at checkout. A recipient who later signs up with the gifted address inherits the subscription, rather than ending up with a duplicate account. ## The reveal date Nothing reaches the recipient before the date the giver chose. See [Tell them on](/orders/gifts#tell-them-on) for how the timing works. The giver is sent a **Gift Subscription Scheduled** email at the point of purchase, confirming that nothing reaches the recipient until then, which is otherwise the first thing they write in to ask. ## When the term runs out The giver chooses this at checkout, under a heading you can rename in **Settings > Branding & Web Components > Checkout**: | Choice | What happens | | ---------------- | ---------------------------------------------------------- | | **Hand over** | The recipient is invited to continue on their own card | | **Stop** | Deliveries end | | **Keep gifting** | The giver is reminded, then charged again for another term | Both people are told, separately and at different times. The **giver hears first**, 30 days out, so they get the chance to gift it again before the recipient is told anything. The recipient hears at 14 days, and only where there's something for them to do. Telling someone their gift is ending when the giver has already chosen to renew it would be both confusing and untrue. Where the giver chose to keep gifting it, their card is used **only** to charge a fresh term. It's never used for ordinary renewal, and it's kept separate from the recipient's own payment methods. ## On the subscription A gift subscription carries a **Gift** block on its [detail page](/subscriptions/details): * **Paid for by** - the giver, linking to their customer record * **Received by** - the recipient * **Deliveries left** - for example `2 of 6` * **Paid up to** * **When it runs out** - spelled out, so you can answer "so what happens in March?" without knowing the stored values There's no card on a gift subscription by design, and nothing is ever charged to the person receiving it. ## Cancelling Cancelling a gift **stops the renewal, not the deliveries**. The recipient keeps everything that was paid for; what the giver has cancelled is the fresh term that would otherwise have followed. This is different from an ordinary subscription, which still ends immediately when cancelled. ## Emails Six emails cover the life of a gift, all editable under **Settings > Notifications** in the **Gift** group: | Email | Who gets it | When | | ------------------------------- | ----------- | ----------------------------------------------------------- | | **Gift Subscription Scheduled** | Giver | At purchase | | **Gift Subscription Revealed** | Recipient | On the reveal date, the first they hear of it | | **Gift Ending (Giver)** | Giver | 30 days before the last delivery | | **Gift Ending (Recipient)** | Recipient | 14 days before the last delivery, where the gift hands over | | **Gift Renewal Upcoming** | Giver | Before their card is charged for another term | | **Gift Ended** | Recipient | After the final delivery, where nobody continued it | # Overview Source: https://docs.marzipan.co/subscriptions/overview Set up subscription plans and manage your subscribers Subscriptions power your plans and recurring shipments in Marzipan. There are two things to understand: * A **package** (also called a plan) is the template a customer subscribes to. * A **subscription** is one customer's individual instance of that package. ### Package types Packages come in three **types**: * **Fixed** - the customer receives the same items each time. * **Variable** - you schedule changing shipments over time. * **Pick & Mix** - the customer chooses their own items each cycle. ### Pricing **Pricing** works one of two ways: a single **fixed** price for the whole package, or **per-item** pricing where each pick-and-mix item is priced individually. ### The Subscriber tag Customers with an active subscription are automatically given a **Subscriber** tag. This tag is used for subscriber pricing and for building customer segments. ## Subscriptions To view your subscriptions: 1. Log in to your Marzipan account 2. Click on **Subscriptions** in the main navigation menu 3. The list displays every customer subscription across all of your packages Subscriptions list The list has the following columns: * **Customer** - the subscriber * **Package** - the package they subscribe to * **Started** - when the subscription began * **Renews** - the next renewal date * **Type** - `fixed`, `variable` or `picknmix` * **Market** - only shown on multi-market stores * **Status** - the current subscription status Click on any subscription in the list to view its [subscription details](/subscriptions/details). ### Filtering and searching You can refine the list with: * Filter by **item** * Filter by **Status** - Active, Cancelled, Expired or Suspended * Filter by **market** * Filter by **start date** * A **Cancelled/Expired date range** * **Search** ### Exporting subscriptions Click **Export** to download the subscriptions in the table as a CSV file. Apply filters *before* clicking the export button to only export the subscriptions you need. ### Subscription Insights For reporting on your plans, use **Subscription Insights**, where you can review performance and **export** the underlying data. See [Insights](/insights/overview) for more. ## Next steps Create and edit the plans customers subscribe to Manage a single subscription and the actions available on it Prepare and send batch shipments for variable packages Prepaid terms, reveal dates and what happens when a gift runs out Report on subscription performance # Packages Source: https://docs.marzipan.co/subscriptions/packages Create and edit the plans customers subscribe to A **package** is the template a customer subscribes to: your subscription plan. Create and edit packages to define what customers can subscribe to. To view your packages: 1. Log in to your Marzipan account 2. Click on **Subscriptions** in the main navigation menu 3. Select **Packages** Subscription package detail screen ## Creating and editing a package When you create or edit a package you can set: * **Name** - the package name shown to customers * **Slug** - the URL-friendly identifier * **Type** - `fixed`, `variable` or `picknmix` * **Summary** and **Description** - short and long copy for the storefront * **SKU** - the package's stock-keeping unit * **Minimum items** - for pick & mix packages, the fewest items a customer must choose * **Collections** - the collections the package belongs to * **Availability** - when the package can be subscribed to * **Status** - whether the package is `active` For multi-market stores, **per-market pricing tabs** let you set prices for each market. Choose the billing frequencies you want to allow, each expressed as every N months. If you offer more than one frequency, set a **default**. Customers pick their frequency on the storefront, shown as boxes or a dropdown, with your default pre-selected. See [Product](/web-components/product#billing-frequency). The default is also what's used anywhere the choice isn't offered. The frequency a customer chooses is recorded on their cart, so the subscription is created on the terms they were shown rather than on whatever the package defaults to by the time the order lands. Renewal options control how and when subscriptions renew. See [Renewal options](#renewal-options) below. Decide whether customers can skip, move or bring forward a delivery from their account. See [What subscribers can do](#what-subscribers-can-do) below. Review the package and save it. Set the **Status** to `active` when you are ready for customers to subscribe. ## Shipment dating **Variable** packages choose how their shipments are dated: * **Scheduled dates** - each shipment carries a processing and shipping date. Every subscriber on the plan renews against the shipment dated for that day. * **Availability window** - each shipment carries an available-from date and an optional available-to date. Subscribers renew on their own anniversary and receive whichever window covers that date. Use an availability window when what you send is "whatever is in the box right now" rather than a dated release. Leave the available-to date empty and the window stays current until a later one supersedes it, so you simply open a new window when the contents change. Windows for the same product may not overlap, and an open-ended window blocks any later one. Marzipan rejects an overlapping window when you enter it rather than picking between them at renewal. Windowed packages drop the parts of the scheduled flow that have no meaning without a processing date: the **first-order cut-off window** and the **initial shipment**. A new subscriber simply gets whichever window is current, the same box a renewal would get. Editing a window never moves anyone's billing date, so you can correct or extend one without disturbing your subscribers. ## Renewal options Renewal options control how and when subscriptions renew: * **First-order cut-off window** - how long a customer has before their first renewal is due * **Auto-renew** - renew subscriptions automatically * **Requires shipping** - whether renewals need a shipping address * **Grace period** - extra time allowed after a renewal is due * **Free-renewal rule** - a builder for rules that grant a free renewal * **Renewal reminder emails** - reminders sent 30, 21, 14, 7, 3 and 1 days before renewal If a renewal payment fails, Marzipan retries it before cancelling the subscription. See [Failed renewals](/subscriptions/details#failed-renewals). ## What subscribers can do Each package decides what a customer may do to their own subscription from the [account area](/web-components/account). Not every club can honour every action: a twice-yearly club has no stock to send early, while a monthly one does. * **Customers can skip a box** - miss the next delivery, with the payment moving on with it. On by default * **Boxes they can skip at once** - how far ahead they can skip before one has to come, from 1 to 12. One at a time unless you say otherwise * **Customers can move a delivery** - push the next one back to a later date. Off by default * **Customers can send a box early** - charge and send the next one immediately. Only worth offering where there is stock to send. Off by default Cancelling is deliberately not on the list. It is always available, and an account that cannot cancel is a trap. The account asks for a reason before it confirms, and offers whichever of the above answers what the customer said, so it never offers a save this package would then refuse. See [Cancelling and reactivating](/subscriptions/details#cancelling-and-reactivating). Pausing has been withdrawn in favour of skipping. Subscriptions already paused come back on the day they said. ## Package metrics and tabs The package detail screen shows key metrics: * Active, paused and cancelled counts * Total revenue * Average lifetime value (LTV) * Monthly recurring revenue (MRR) Depending on the package type, extra tabs are available: * **Variable** packages have a **Shipments** tab for scheduling changing shipments, and choose how those shipments are dated. See [Shipment dating](#shipment-dating) below and [Shipments](/subscriptions/shipments). * **Pick & Mix** packages have an **Available items** tab, where you set the default, minimum and maximum quantities per item. ### Available items For pick & mix packages, the **Available items** tab is where you choose which items customers can pick from. For each item you set: * The **default** quantity * The **minimum** quantity * The **maximum** quantity # Shipments Source: https://docs.marzipan.co/subscriptions/shipments Prepare and send batch shipments for variable packages For **variable** packages, the **Shipments** fulfilment view lets you prepare and send shipments to many subscribers at once. To view your shipments: 1. Log in to your Marzipan account 2. Click on **Subscriptions** in the main navigation menu 3. Select **Shipments** Batch shipments fulfilment view Batch shipments apply to **variable** packages only. Variable packages also have a **Shipments** tab on the package detail screen, where you schedule the changing shipments over time. See [Packages](/subscriptions/packages). ## Dated shipments and windows The shipments list covers both kinds of shipment a [variable package](/subscriptions/packages#shipment-dating) can use, both those with scheduled dates and those with an availability window, ordered by whichever date they carry. The date columns are relabelled when windows are present. A dated shipment goes to every active subscriber. A window only concerns the subscribers whose renewal falls inside it, so its recipient list and pick lists are scoped to them rather than to the whole plan. Customers see the window covering their next billing date in their upcoming shipments. ## Shipment statuses Shipments move through status tabs: * **Draft** - not yet scheduled * **Scheduled** - queued to go out * **Processing** - currently being sent * **Completed** - sent ## Recipients Each shipment lists its **recipients**, along with **skipped** and **failed** counts. Skipped and failed subscribers show the reason, so you can see why a shipment did not go out. ## Inventory estimates View **inventory estimates** to see the stock a shipment needs before you send it: * The **required** quantity per location * The **available** quantity per location You can **export** the inventory estimates. Check the inventory estimates before completing a shipment so you know you have the stock to fulfil it. ## Completing a shipment Once a shipment is ready, **complete** it to send it to its recipients. # Support Source: https://docs.marzipan.co/support Helping you get the most out of Marzipan.
Search the documentation for answers to your questions.
Email us at [hello@marzipan.co](mailto:hello@marzipan.co). We'll get back to you as soon as possible.
# Overview Source: https://docs.marzipan.co/tasks/overview A lightweight to-do list to keep your team on track Tasks are a simple, shared to-do list for your team. Use them to keep track of who needs to do what and by when, and to link a job to the customer, order, subscription or event it relates to. To view your tasks, click **Tasks** in the main navigation menu. ### Tasks list The list shows each task's title, priority, due date and assignee. Overdue tasks sort to the top so the most pressing work is always in view. You can complete or reopen a task straight from the list. Tasks list ### Creating a task Click to add a task and fill in: * **Title** - what needs doing. Type `@` to link a record (see [@mentions](#mentions) below) * **Priority** - `Low`, `Medium`, `High` or `Urgent` * **Due date** - pick a date, or use the **Today**, **Tomorrow** or **Next Monday** presets * **Assignee** - who is responsible. This defaults to you ### @mentions Type `@` in a task title to link the task to a **customer**, **order**, **subscription** or **event**. The linked task then appears as an activity entry on that record's timeline, so anyone looking at the record can see the related task in context. ### Permissions What each team member can do with tasks is set by their [role](/settings/roles-and-team): * Creating, editing and deleting tasks * **Assigning** work to someone other than themselves * **Viewing everyone's tasks** rather than only their own Reading the task list and completing a task assigned to you stay open to everyone, whatever their role. ### Filtering Narrow the list using these filters: * **Assignee** - users with the right permission can view everyone's tasks; other users see only their own * **Status** - `incomplete` or `complete` * **Priority** * **Due date** Today's due and overdue tasks also appear on your [dashboard](/dashboard), so you see what needs doing as soon as you log in. # Account Source: https://docs.marzipan.co/web-components/account The Account component enables users to log in and manage their account. From their account your customers can manage their subscriptions, view their orders, and update their billing and shipping details. ### Code ```javascript theme={null}
``` ### Props Props should be passed as attributes to the component element. Prevents customers from editing their pick & mix subscription selections from their account. Useful if you manage subscription contents manually. Defaults to `false` ### Features The account opens on the tab that has something to say: a live subscription, failing that the customer's orders, failing that the invitation to start a subscription. A URL that names a tab wins over that, so you can link straight to `#orders` or to a subscription at `#subscriptions/123`. The tabs are **Subscriptions**, **Orders** and **Profile**, with **Rewards** added when your rewards programme is on. On a phone they scroll sideways rather than collapsing into a dropdown. #### Subscriptions Each live subscription is a card carrying its status, when the next shipment is due and what can be done about it. Past subscriptions are listed beneath. Opening one gives the customer: * **Skip** - hold back one or several shipments, up to the allowance the package sets, with the date everything resumes. **Undo skip** replaces it while a skip is in effect. Skipping asks why, optionally, and the answer appears on the subscription's activity trail * **Move a delivery** - push the next one back a week, a fortnight, or to a date of their own, counted from the day it is currently due. A delivery cannot be moved past the one after it, and only that shipment moves: the payment and the shipments after it keep their dates * **Send now** - charge and send the next shipment immediately, offered once it is within a fortnight and there is something scheduled * **Change frequency** - where the package sells at more than one billing frequency, using [your own wording](/web-components/customisation#subscription-frequency-wording) for it * **Extras** - add items to the next shipment, or to every shipment. Extras close while a shipment is being prepared * **Pick & mix selections** - unless disabled with the prop below * **Payment and delivery details** - the card on file and where the shipments go * **Cancel** - always available, after asking why and offering whatever answers it Packages with dated shipments also show what is **coming up**, and a shipment further out can be skipped from there. Which of skip, move and send now appear is set per package. See [What subscribers can do](/subscriptions/packages#what-subscribers-can-do). "Shipment" is the default word throughout. Set your own, singular and plural, under [Labels](/web-components/customisation#labels), and the account follows. #### Gift Subscriptions A gifted subscription carries a box of its own under the header with the giver's message, who it came from and how many deliveries are left of the term, and is marked as a gift in the list. While the giver is still paying, the recipient sees neither the price nor the payment card, and cannot add extras. Where a gift hands over at the end of its term, the recipient is told before the day, since it needs a card of their own to carry on. See [Gift subscriptions](/subscriptions/gifts). #### Orders Customers can view their order history with order details, tracking information, and the ability to reorder. An order that owes money is flagged on the list with **Add payment**, and is paid from the order itself. A declined payment says so, with the provider's reason where there is one. #### Rewards If you have a rewards programme enabled, a **Rewards** tab appears where customers can view: * Their current reward tier and tier badge * Points balance and what it is worth * Progress towards the next tier * The tiers on offer and the perks of each A summary also sits at the top of the account, beside the greeting. #### Subscription Upsell You can display a product grid within the account page encouraging customers to start a subscription. It shows whenever the customer has nothing running, and sits inside the subscriptions list so past subscriptions stay reachable. Configure the collection, heading, message, and grid layout from your [web component settings](/web-components/customisation#subscription-upsell). #### Your Own Wording Most of the copy in the account is yours to write: the sign in, register, verification and password reset messages, the empty states on every tab, and the explanations shown while managing a subscription. Anything left blank keeps Marzipan's wording. See [Account copy](/web-components/customisation#account-copy). #### Status Messages Saving, skipping, cancelling and the rest confirm with a toast that takes the position and the dark or light style you set for the [add-to-cart notification](/web-components/customisation#add-to-cart-notification), so the storefront and the account agree. A failure takes your error colour. ### Styling The following parts are available to style the account component: The primary action buttons displayed in the account component. This is normally when a "submit" button is used. The cancel button displayed in the account component. The navigation links displayed in the account component. The navigation links displayed in the account component when they are active. The containing div around the login and register forms. The login and register forms The h1 heading. The h2 heading. The label. Links The loading spinner displayed when various actions are loading. The primary action button on the login, register and verify account forms. The styling applied to form input fields, including the `