# GrandNode > GrandNode is a free, open-source .NET e-commerce platform for B2C and B2B: multi-store, multi-vendor, headless API, long-term support and ready for AI. GrandNode is free, open-source e-commerce software (GPL-3.0) built on ASP.NET Core (.NET 10) and MongoDB, developed since 2015. Source code: [github.com/grandnode/grandnode2](https://github.com/grandnode/grandnode2). It runs on Windows, Linux and macOS, in Docker (`grandnode/grandnode2` on Docker Hub) or from a release package. The software is free. This site also sells optional services around it: GrandNode Official (long-term support releases with backported security fixes), store certification and data migration from other platforms. The Documentation section describes the current version, GrandNode 2. Posts listed under Optional are older than two years and may describe earlier versions. --- Source: https://grandnode.com/ai-agent-kit # Your coding agent, fluent in GrandNode. The Agent Kit teaches AI coding agents how GrandNode is built — its architecture, conventions, security rules and review checklists — so your agent writes plugins and themes the way the core team would. ### What is inside - Skills, workflows, checklists and standards in `.ai/` - Works with any agent that reads `AGENTS.md`: Claude Code, Codex, Cursor and others ### Get started Clone GrandNode and point your agent at the repository: [github.com/grandnode/grandnode2](https://github.com/grandnode/grandnode2). - [Web page](https://grandnode.com/ai-agent-kit) --- Source: https://grandnode.com/ai # AI-ready e-commerce for .NET #### What is MCP? The Model Context Protocol is an open standard that lets AI assistants use tools and data in a controlled way. One MCP server for your store works with every assistant that supports the protocol, instead of a separate integration for each. #### Your data, your model AI features in GrandNode run on your own API key or a local model. GrandNode does not resell tokens and does not route your store data through our servers. #### When will MCP Shop and MCP Admin ship? Both are on the public [roadmap](https://grandnode.com/roadmap). Join early access — it is free — to get early builds and a say in what they can do. #### What does AI Visibility cost? It is included in every [GrandNode Official](https://grandnode.com/official) plan. Without Official you can pre-order it on its own; your 12 months start when it ships. #### Does the scanner work for stores on other platforms? Yes. [The AI-readiness scanner](https://grandnode.com/ai-readiness) checks any public online store. Stores on other platforms can also [request a migration quote](https://grandnode.com/migration). - [Web page](https://grandnode.com/ai) --- Source: https://grandnode.com/ai-admin-assistant # Ask your store. Get answers. - "How did last week compare?" - "Which orders are waiting to ship?" - "Lower prices in Winter Sale by 10%." Bring your own API key or a local model. The assistant respects permissions and the store and vendor boundaries. - [Web page](https://grandnode.com/ai-admin-assistant) --- Source: https://grandnode.com/ai-readiness # Is your store ready for AI shoppers? ChatGPT, Claude, Perplexity and Google's AI answers are starting to recommend products. See in 10 seconds whether they can find, read and trust yours. ### What we check - **Product data for machines** — JSON-LD for your store and products: price, currency, availability, brand, identifiers. - **AI crawler access** — whether robots.txt lets AI search and shopping agents read your pages. Blocking AI training crawlers is your choice and does not cost points. - **llms.txt** — a short guide to your store for language models. - **Discoverability** — a sitemap with product URLs and dates. - **Readable without JavaScript** — title, description, product name and price in the HTML. - **HTTPS & security headers** — HTTPS, HSTS, nosniff, framing protection, CSP. - **Speed basics** — response time, HTML size and compression, measured from our server. ### About our checker The checker runs only when someone asks for a check. It makes at most 8 small GET requests per check (robots.txt, the home page, llms.txt, the sitemap and one product page), never sends query strings or forms, and checks the same site at most once every 10 minutes. It identifies itself as `Mozilla/5.0 (compatible; GrandNode-AI-Readiness/1.0; +https://grandnode.com/ai-readiness#bot)`. It follows robots.txt for the token `GrandNode-AI-Readiness`. To block it: ``` User-agent: GrandNode-AI-Readiness Disallow: / ``` To have your site excluded entirely, write to [security@grandnode.com](mailto:security@grandnode.com). ### FAQ #### Is it free? Yes. The check and the e-mailed report are free. #### Do you store my store's data? We keep the result (address, score and check statuses) for 90 days to improve the checker. We do not store the pages we read. If you ask for the report, we keep your e-mail to send it; newsletter e-mails only if you tick the box and confirm. #### Why is my score partial? Some checks could not run — for example your robots.txt asked us not to read a page, we could not find a product page, or your site was slow. Paste a product page address for the most complete check. This is a quick outside-in check, not an audit. For an independent review see [GrandNode Certified Store](https://grandnode.com/certification). - [Web page](https://grandnode.com/ai-readiness) --- Source: https://grandnode.com/ai-shopping # Let AI assistants shop in your store. - A store MCP server: search, compare, availability, cart - Agentic checkout, following the protocols as they stabilise - AI Visibility included in GrandNode Official - [Web page](https://grandnode.com/ai-shopping) --- Source: https://grandnode.com/certification # GrandNode Certified Store #### Do I need Official? No. Your store has to run a supported version: the latest Community release or an Official LTS. #### What if my store doesn't pass? You get a list of fixes and one free re-check within 30 days. #### How do you handle my data and admin access? We use a read-only admin account and ask you to revoke it after the review. #### Can you certify a non-GrandNode store? No. #### How is renewal handled? Certification is valid for 12 months; we remind you before it expires. - [Web page](https://grandnode.com/certification) --- Source: https://grandnode.com/developers # Developers - [Documentation](https://grandnode.com/knowledgebase) - [GitHub](https://github.com/grandnode/grandnode2) - [GitHub Discussions](https://github.com/grandnode/grandnode2/discussions) - [AI Agent Kit](https://grandnode.com/ai-agent-kit) ### Contributing Issues and pull requests are welcome on GitHub. - [Web page](https://grandnode.com/developers) --- Source: https://grandnode.com/download # Download - [Web page](https://grandnode.com/download) --- Source: https://grandnode.com/features # Features ### Catalog - **Five product types** — simple, grouped, bundled, auction and reservation. - **Attributes and variants** — eleven control types; every combination can have its own SKU, stock and price. - **Categories, brands and collections** — with specification attributes for filtering and comparison. - **Auctions and bookings** — bids with automatic closing; reservations by slot or date range. - **Digital goods and courses** — downloads with licences and limits, gift vouchers, e-learning courses with lessons. - **Inventory** — multiple warehouses, stock per variant, backorders and back-in-stock alerts. - **Selling options** — pre-order, call for price, customer-entered price, quantity rules and availability windows. ### Pricing and promotions - **Discounts** — on orders, shipping, products, categories, brands, collections or vendors; coupons, limits and dates. - **Discount rules** — by customer group, amount spent or products in the cart — extensible with plugins. - **Tier and per-customer prices** — by quantity, store, customer group and currency. - **Loyalty points** — earned on registration and orders, redeemed at checkout. - **Gift vouchers** — physical or virtual, with usage history. ### Checkout and orders - **Guest or registered checkout** — with minimum and maximum order amounts per customer group. - **Payments** — Stripe Checkout, Braintree and cash on delivery out of the box; restrict methods by country or shipping. - **Shipping** — fixed rate, by weight, pickup points and delivery dates. - **Order management** — editable orders, custom statuses, tags, partial shipments and PDF invoices. - **Merchandise returns** — reasons, actions, pickup and a status workflow. ### B2B - **Customer groups** — drive prices, visibility, tax exemption, free shipping and order limits. - **Company sub-accounts** — buyers order on behalf of their company account. - **Sales employees** — with commission; sales managers see only their own customers. - **Impersonation** — staff can shop as a customer, controlled by a permission. - **Documents and VAT numbers** — documents in the customer account; VAT number capture and exemption. - **Registration modes** — standard, e-mail validation, admin approval or disabled. ### Multi-store - **Many stores, one installation** — each with its own domains, language, currency and company details. - **Per-store settings and content** — override settings and limit products or pages to stores. - **Store owner panel** — a separate panel where store managers run only their own store. - **Per-store accounts and themes** — optional customer accounts per store and a theme per store. ### Marketplace - **Vendors** — profiles, commission, SEO pages and vendor-level discounts. - **Vendor panel** — vendors manage their own products, orders, shipments, returns and reports. - **Vendor applications and reviews** — customers apply to sell; shoppers review vendors. ### Customers and privacy - **Segments** — customer tags and custom registration attributes. - **Personalisation** — personalized, recommended, suggested, also purchased, similar and recently viewed products. - **GDPR tools** — data export, account deletion, cookie consent and privacy-policy acceptance. - **Social login and affiliates** — Google and Facebook sign-in; affiliate tracking on orders. ### Content, marketing and SEO - **Content** — pages, blog, news and a knowledgebase. - **Newsletter and campaigns** — newsletter categories and targeted e-mail campaigns. - **Message templates** — about fifty e-mail templates per store and language, sent through a queue. - **SEO** — friendly URLs per language, canonical URLs, Open Graph, robots.txt and XML sitemaps. - **Engagement** — product reviews, questions, search autocomplete and search reports. ### Languages, currencies and tax - **Languages** — many languages including right-to-left, for both interface and content. - **Currencies** — multiple currencies with automatic exchange rates. - **Tax** — fixed rate or by country, state and zip; prices with or without tax. ### For developers - **Backend API** — JWT-secured, OpenAPI-documented, with OData-style queries (enabled with one feature flag). - **Frontend API** — the storefront logic as JSON for headless front ends. - **Plugins and themes** — payments, shipping, tax, widgets, discount rules, authentication and themes. - **Events and scheduled tasks** — entity events and background tasks, switchable per node. - **Hosting** — MongoDB, Redis-synced cache, pictures in Azure Blob or S3, Docker and .NET Aspire, OpenTelemetry. - **Security** — permissions per group, two-factor sign-in, password policies, reCAPTCHA and HTML sanitisation. - **AI Agent Kit** — AGENTS.md and .ai/ skills, workflows, checklists and templates for coding agents. - [Web page](https://grandnode.com/features) --- Source: https://grandnode.com/asp-net-core-ecommerce # Open-source e-commerce on ASP.NET Core GrandNode is a complete online store built on **ASP.NET Core and .NET 10**, free and open source under the GPL-3.0. If your team writes C#, you can run, extend and host your store with the tools you already know - no PHP, no closed SaaS. ### Why build e-commerce on ASP.NET Core - **Performance:** ASP.NET Core is one of the fastest web frameworks, and GrandNode caches the catalog per customer group so most visitors share one cached page. - **One language end to end:** plugins, themes, integrations and background tasks are all C#, debugged in Visual Studio, Rider or VS Code. - **Cross-platform hosting:** runs on Linux, Windows and macOS, in Docker or Kubernetes, with .NET Aspire for local development. - **Long support:** .NET LTS releases and [GrandNode Official](https://grandnode.com/official) LTS releases with 24 months of security fixes. ### What is in the box - Five product types - simple, grouped, bundled, auction and reservation - with attributes, variants and per-variant stock. - Discounts, coupons, tier prices, loyalty points and gift vouchers. - Guest and registered checkout, Stripe and Braintree payments, shipping by weight, fixed rate or pickup points. - [B2B](https://grandnode.com/b2b-ecommerce): customer groups, company sub-accounts, sales employees and VAT handling. - [Multi-vendor marketplace](https://grandnode.com/multi-vendor-marketplace) and multi-store from one installation. - Content: pages, blog, news and a knowledgebase; SEO-friendly URLs, sitemaps and structured data. See the full list on [Features](https://grandnode.com/features), or click through the [live demo](https://demo.grandnode.com/). ### Built for developers - **Plugins and themes** for payments, shipping, tax, widgets, discount rules and authentication - see [writing a plugin](https://grandnode.com/developers-writing-a-plugin). - **APIs:** a JWT-secured backend API with OpenAPI documentation and a frontend API for headless storefronts - see [the REST API](https://grandnode.com/developers-rest-api). - **Clean architecture:** layered services, an in-house mediator, domain events and scheduled tasks. - **AI-ready codebase:** the [AI Agent Kit](https://grandnode.com/ai-agent-kit) teaches coding agents how GrandNode is built. ### Run it in minutes ``` docker run -d -p 127.0.0.1:27017:27017 --name mongodb mongo docker run -d -p 80:8080 --name grandnode2 --link mongodb:mongo grandnode/grandnode2 ``` Open `http://localhost` and the installer guides you through the rest. Other options - release packages and building from source - are on [Download](https://grandnode.com/download) and in [installing GrandNode](https://grandnode.com/getting-started-installing). ### Compared with other .NET platforms GrandNode is one of a handful of open-source .NET e-commerce platforms, and the only one built on MongoDB. Read our [comparison of open-source .NET e-commerce platforms](https://grandnode.com/the-best-open-source-e-commerce-web-applications) to see how it differs from nopCommerce, Smartstore, Virto Commerce and Orchard Core Commerce. ### Moving from another platform? We migrate products, customers, orders and SEO URLs for a fixed price - [request a quote](https://grandnode.com/migration). - [Web page](https://grandnode.com/asp-net-core-ecommerce) --- Source: https://grandnode.com/b2b-ecommerce # B2B e-commerce on .NET Selling to businesses is different from selling to consumers: negotiated prices, company accounts with several buyers, sales reps, VAT numbers and order limits. GrandNode includes these B2B features in its free, open-source edition - and lets you run B2B and B2C side by side on one installation. ### B2B features in GrandNode - **Customer groups** drive prices, product and category visibility, tax exemption, free shipping and minimum or maximum order amounts. - **Tier and per-customer prices** by quantity, store, customer group and currency. - **Company sub-accounts:** buyers order on behalf of their company account. - **Sales employees** with commission; sales managers see only their own customers. - **Impersonation:** staff can place an order as a customer, controlled by a permission. - **Documents and VAT numbers:** documents in the customer account, VAT number capture and exemption. - **Registration control:** standard, e-mail validation, admin approval or closed registration. - **Selling options** for trade: call for price, quantity rules, pre-orders and availability windows. ### B2B and B2C on one platform With [multi-store](https://grandnode.com/configuration-stores-multi-store), a wholesale shop and a retail shop can run from one installation, each with its own domain, prices, catalog visibility and theme, sharing one product catalog and one back office. A separate [store owner panel](https://grandnode.com/store-panel-overview) lets each team manage only its own store. ### Integrations A JWT-secured [backend API](https://grandnode.com/developers-rest-api) connects GrandNode to ERP, PIM and accounting systems, and [GrandNode Webhooks](https://grandnode.com/grandnode-webhooks) push order and customer events to them as they happen. Bulk catalog and customer imports are covered by [GrandNode Imports](https://grandnode.com/grandnode-imports). ### Start with your own data [Download GrandNode](https://grandnode.com/download) and import a sample of your catalog, or [ask us to migrate](https://grandnode.com/migration) your current B2B store. For companies that need security fixes on one version for longer, [GrandNode Official](https://grandnode.com/official) adds LTS releases. - [Web page](https://grandnode.com/b2b-ecommerce) --- Source: https://grandnode.com/multi-vendor-marketplace # Multi-vendor marketplace software A marketplace lets other sellers list and sell products in your store while you run the platform and take a commission. GrandNode includes a multi-vendor marketplace in its free, open-source edition, built on ASP.NET Core and MongoDB. ### Marketplace features - **Vendor profiles** with their own SEO-friendly pages, descriptions and vendor-level discounts. - **Commission** per vendor. - **A separate vendor panel** where each vendor manages only their own products, orders, shipments, returns and reports - see [the vendor panel](https://grandnode.com/vendor-panel-marketplace-overview). - **Vendor applications:** customers apply to sell, and you approve them - see [creating and approving vendors](https://grandnode.com/vendor-panel-create-and-approve-vendors). - **Vendor reviews:** shoppers rate vendors, not only products. - **Isolation:** vendors see only their own data; access checks were hardened in GrandNode 2.4. ### Marketplace and multi-store together GrandNode runs many stores from one installation, so you can operate several marketplaces - for different countries, niches or brands - with one back office. With the [store owner panel](https://grandnode.com/store-panel-overview), each store can have its own manager as well. ### Grow it with plugins Payments, shipping, tax and integrations are plugins, so payouts, carrier rules or a custom onboarding flow can be added without changing the core - see [plugin types](https://grandnode.com/developers-plugin-provider-types). ### Try it Run GrandNode with Docker in minutes - see [Download](https://grandnode.com/download) - or explore the [live demo](https://demo.grandnode.com/). Running a marketplace on another platform? [Request a migration quote](https://grandnode.com/migration). - [Web page](https://grandnode.com/multi-vendor-marketplace) --- Source: https://grandnode.com/mongodb-ecommerce # E-commerce on MongoDB GrandNode is an open-source e-commerce platform built on **MongoDB** and ASP.NET Core. It has used a document database since its first release in 2016 - not as an add-on, but as the way it stores every product, order and page. ### Why a document database fits e-commerce - **Products are documents.** A product with dozens of attributes, variants, prices per customer group, pictures and translations is stored as one document, not spread across many joined tables. Reading a product page is one query. - **Flexible data.** Adding a field for a new kind of product does not need a schema migration across the whole catalog. - **Scaling reads.** Replica sets spread reads across servers; a managed cluster such as MongoDB Atlas takes care of backups and failover. - **Ready to run anywhere.** A local MongoDB, a Docker container or a cloud cluster all work - MongoDB 4.0 or newer. ### What it means for your store - Large catalogs with many variants stay fast to browse and edit. - Multi-store and marketplace setups share one database while keeping each store's data separate. - Your data stays in your database - export it, report on it or connect it to other systems. ### And the trade-offs A document database is a choice, not a free win. Your team will want to know MongoDB basics - indexes, backups and the query language - and reporting tools that expect SQL need a connector or an export. Our article [NoSQL vs SQL for e-commerce](https://grandnode.com/nosql-vs-sql-comparison-grandnode-nosql-ecommerce-software) goes into the details, and [why MongoDB](https://grandnode.com/why-mongodb-nosql-in-grandnode-ecommerce-solution) explains the reasons behind the choice. ### Learn more - [System requirements](https://grandnode.com/getting-started-system-requirements) and [Docker and Kubernetes](https://grandnode.com/getting-started-docker-kubernetes) - [Architecture overview](https://grandnode.com/developers-architecture-overview) for developers - [Error handling with the MongoDB .NET driver](https://grandnode.com/error-handling-mongodb-net-driver) - [GrandNode on ASP.NET Core](https://grandnode.com/asp-net-core-ecommerce) [Download GrandNode](https://grandnode.com/download) - free and open source - or try the [live demo](https://demo.grandnode.com/). - [Web page](https://grandnode.com/mongodb-ecommerce) --- Source: https://grandnode.com/license # License GrandNode is free software licensed under the GNU General Public License v3.0. The full text is in the [LICENSE](https://github.com/grandnode/grandnode2/blob/main/LICENSE) file. - [Web page](https://grandnode.com/license) --- Source: https://grandnode.com/migration # Migrate to GrandNode Moving from another platform? Tell us where your store runs today, how your data is exported and what you want to bring over. We review the request and send you a fixed quote for the migration of your data. ### What we can migrate - Products with product attributes, variants and specification attributes - Categories, brands and collections - Customers and customer groups - Order history and reviews - Pages, blog posts, SEO URLs and redirects ### How it works 1. Send the request below — it is free and takes two minutes. 2. We review your data sample and reply with a fixed quote. 3. After you accept, we migrate the data with our migration tooling. The quote covers data migration. Custom plugins, integrations and theme work are not included. [Request a quote](https://grandnode.com/migration-to-grandnode) - [Web page](https://grandnode.com/migration) --- Source: https://grandnode.com/official # GrandNode Official #### Is GrandNode still free? Yes. GrandNode stays free and GPL-licensed. #### Can I share Official builds? Yes — GPL allows it. You pay for the service, not the bits. #### What happens if I cancel? You keep what you have; no new backports. #### Is Official 12 or 24 months? An LTS release is supported for 24 months. Official is a subscription: the 1-year plan gives you its fixes for 12 months and you renew to stay covered; the 2-year plan covers the whole LTS window in one payment. Either way, when the next LTS arrives you have a 6-month overlap to move. #### How are installations counted? Business covers up to 3 production installations. Agency covers any number of your clients' stores. #### When is the first LTS? The first LTS candidate is 2.4. Your 12 months start when it ships. #### Do I need Official to get certified? No — a supported version is enough. - [Web page](https://grandnode.com/official) --- Source: https://grandnode.com/roadmap # Roadmap - [Web page](https://grandnode.com/roadmap) --- Source: https://grandnode.com/security # Security ### Report a vulnerability Use GitHub private vulnerability reporting on [grandnode/grandnode2](https://github.com/grandnode/grandnode2/security) or e-mail support@grandnode.com. We confirm every report within 5 business days. ### Supported versions | Version | Security fixes | |---|---| | Latest Community release | Yes | | Official LTS | 24 months | Need backported fixes for an older release? See [GrandNode Official](https://grandnode.com/official). - [Web page](https://grandnode.com/security) --- Source: https://grandnode.com/aspnet-core-ecommerce # ASP.NET Core ecommerce platform **GrandNode is an open-source ASP.NET Core ecommerce platform** built on .NET 10 and MongoDB. It gives you a complete online store - catalog, shopping cart, checkout, payments, shipping and an admin panel - that you host yourself and extend in C#. It is free under the GPL-3.0, with no per-order fees and no closed SaaS between you and your data. B2C shops, [B2B portals](https://grandnode.com/b2b-ecommerce) and [multi-vendor marketplaces](https://grandnode.com/multi-vendor-marketplace) all run on the same codebase, from one installation. ### Why build your ecommerce on ASP.NET Core - **Performance:** ASP.NET Core is one of the fastest web frameworks available, and GrandNode caches the catalog per customer group, so most visitors are served from one cached page. - **Scalability:** run several application instances behind a load balancer with a Redis-synced cache, keep pictures in Azure Blob Storage or Amazon S3, and scale MongoDB as your catalog and order history grow. - **One language end to end:** plugins, themes, integrations and background tasks are all C#, debugged in Visual Studio, Rider or VS Code. - **Cross-platform hosting:** Linux, Windows or macOS, in Docker or Kubernetes, with .NET Aspire and OpenTelemetry for local development and monitoring. - **Long-term support:** .NET LTS releases, and [GrandNode Official](https://grandnode.com/official) LTS releases with 24 months of security fixes. ### A complete ASP.NET Core shopping cart and storefront Everything a store needs to sell is included, not sold separately as modules. - **Catalog:** simple, grouped, bundled, auction and reservation products, with attributes, variants and per-variant stock. - **Cart and checkout:** guest and registered checkout, wishlists, Stripe Checkout, Braintree and cash on delivery, shipping by weight, fixed rate or pickup points. - **Pricing and promotions:** tier and per-customer prices, discounts, coupons, loyalty points and gift vouchers. - **International selling:** many languages including right-to-left, multiple currencies with automatic exchange rates, and tax by country. - **Content and SEO:** pages, blog and a knowledgebase; friendly URLs, XML sitemaps and structured data. - **GDPR tools:** data export, account deletion, cookie consent and privacy-policy acceptance. The full list is on [Features](https://grandnode.com/features), and you can click through the [live demo](https://demo.grandnode.com/). ### One .NET ecommerce platform for B2B, B2C and marketplaces - **B2C:** a fast, mobile-friendly storefront with themes you can override view by view. - **B2B:** customer groups with their own prices, company sub-accounts, sales employees and VAT handling - see [B2B ecommerce](https://grandnode.com/b2b-ecommerce). - **Marketplace:** vendors with their own panel, products and orders - see [multi-vendor marketplace](https://grandnode.com/multi-vendor-marketplace). - **Multi-store:** many stores from one installation, each with its own domains, language, currency and company details. ### Open-source ASP.NET ecommerce you host yourself The source code is on [GitHub](https://github.com/grandnode/grandnode2). You choose where the store runs - your own server, any cloud or a container platform - and you own the code, the database and the customer data. There is no vendor lock-in: if a feature does not fit, you change it. Data lives in [MongoDB](https://grandnode.com/mongodb-ecommerce), a document database that fits product catalogs with many attributes and variants, and grows without schema migrations. ### A C# ecommerce platform built for developers - **Plugins and themes** for payments, shipping, tax, widgets, discount rules and authentication - see [writing a plugin](https://grandnode.com/developers-writing-a-plugin). - **APIs:** a JWT-secured backend API with OpenAPI documentation, and a frontend API for headless storefronts - see [the REST API](https://grandnode.com/developers-rest-api). - **Clean architecture:** layered services, an in-house mediator, domain events and scheduled tasks. - **AI-ready codebase:** the [AI Agent Kit](https://grandnode.com/ai-agent-kit) teaches coding agents how GrandNode is built. Guides for installing, configuring and extending the platform are in the [knowledgebase](https://grandnode.com/knowledgebase). ### Run it in minutes ``` docker run -d -p 127.0.0.1:27017:27017 --name mongodb mongo docker run -d -p 80:8080 --name grandnode2 --link mongodb:mongo grandnode/grandnode2 ``` Open `http://localhost` and the installer guides you through the rest. Release packages and building from source are on [Download](https://grandnode.com/download) and in [installing GrandNode](https://grandnode.com/getting-started-installing). ### Compared with other .NET ecommerce platforms GrandNode is one of a handful of open-source ASP.NET ecommerce platforms, and the only one built on MongoDB. Our [comparison of open-source .NET ecommerce platforms](https://grandnode.com/the-best-open-source-e-commerce-web-applications) shows how it differs from nopCommerce, Smartstore, Virto Commerce and Orchard Core Commerce. ### Frequently asked questions #### Is GrandNode free? Yes. GrandNode is open source under the GPL-3.0 and free to use, including for commercial stores. [GrandNode Official](https://grandnode.com/official) adds LTS releases with 24 months of security fixes for teams that need them. #### Which .NET version does GrandNode use? GrandNode 2.4 runs on ASP.NET Core and .NET 10. What is planned next is on the [roadmap](https://grandnode.com/roadmap). #### Can I use GrandNode as a headless ecommerce backend? Yes. The frontend API exposes the storefront logic as JSON, so you can build the shop in React, Vue, Next.js or a mobile app and keep GrandNode for the catalog, cart, checkout and orders. #### Do I need to know C# to run a store? No. Products, orders, content and settings are managed in the admin panel. C# is only needed when you write your own plugins, themes or integrations. #### Can I move my store from another platform? Yes. We migrate products, customers, orders and SEO URLs for a fixed price - [request a quote](https://grandnode.com/migration). ### Get started [Download GrandNode](https://grandnode.com/download), read the [knowledgebase](https://grandnode.com/knowledgebase), see what is coming on the [roadmap](https://grandnode.com/roadmap), or go back to the [GrandNode home page](https://grandnode.com/). - [Web page](https://grandnode.com/aspnet-core-ecommerce) --- Source: https://grandnode.com/multi-store-ecommerce # Multi-store ecommerce platform **GrandNode is an open-source multi-store ecommerce platform** built on ASP.NET Core, .NET 10 and MongoDB. One installation runs as many online stores as you need - different brands, countries, or a B2B and a B2C shop - each with its own domain, theme, language and currency, all managed from one admin panel. Multi-store is part of the free, GPL-3.0 edition. There is no per-store licence and no extra fee for the second, fifth or twentieth storefront. ### Why run several stores from one installation - **One catalog:** add a product once and decide which stores sell it, instead of copying products between separate shops. - **One customer base and order list:** every order from every store lands in the same admin, with the store it came from. - **One deployment to update:** one application, one database and one set of plugins to upgrade and secure, not one per shop. - **Lower hosting cost:** the stores share the same servers, cache and MongoDB database. ### What each store can have of its own - **Domains:** every store answers to its own host names; the primary domain is the canonical address used in links, sitemaps and e-mails. - **Look:** a theme per store, its own logo and its own pages. - **Language and currency:** a default language and currency per store, with multiple languages and currencies inside each one. - **Company details:** name, address, VAT and registration numbers on invoices and e-mails. - **Settings:** any settings page can be overridden for one store - checkout, catalog, tax, shipping, SEO and more. - **Messages:** about fifty e-mail templates per store and language. - **Customer accounts:** shared across stores, or optionally separate accounts per store. ### Limit products, prices and content to stores Products, categories, brands, collections, pages, blog posts, discounts and payment methods all have a *Limited to stores* option. Leave it empty to show an item everywhere, or choose the stores that should show it. Prices can differ per store through store-specific tier prices and discounts. This is how one catalog serves a retail store and a wholesale store, or a Polish and a German shop, without duplicated data. ### A separate panel for every store manager Besides the main admin panel, GrandNode has a **store owner panel**. A store manager signs in there and sees only their own store - its products, orders, customers, content and settings - while the administrator keeps control of the whole installation. See [the store owner panel](https://grandnode.com/docs-store-panel) in the knowledgebase. ### Common multi-store setups - **Multi-brand:** several brands, each with its own domain and theme, sharing one warehouse and back office. - **Multi-country:** a store per market with local language, currency, tax and payment methods. - **B2B and B2C:** a public retail shop next to a [B2B portal](https://grandnode.com/b2b-ecommerce) with customer group prices. - **Franchise or dealer network:** a store per location, each run by its own manager in the store owner panel. - **Marketplace:** combine multi-store with [multi-vendor](https://grandnode.com/multi-vendor-marketplace) selling. ### Set up a new store in minutes 1. Open **Configuration → Stores** in the admin panel and add a store. 2. Enter its name, URL, default language and currency, and company details. 3. Add the domains it answers to and point them at your GrandNode installation. 4. Pick a theme, override the settings that should differ, and limit products and content to the store. The full guide is [Stores and multi-store](https://grandnode.com/configuration-stores-multi-store) in the [knowledgebase](https://grandnode.com/knowledgebase). ### Built on ASP.NET Core and MongoDB GrandNode is an [ASP.NET Core ecommerce platform](https://grandnode.com/aspnet-core-ecommerce): self-hosted, extensible in C# and running in Docker on Linux or Windows. Its [MongoDB](https://grandnode.com/mongodb-ecommerce) database and Redis-synced cache let several application instances serve all stores behind one load balancer. The full feature list is on [Features](https://grandnode.com/features). ### Frequently asked questions #### Is multi-store included in the free version? Yes. Multi-store is part of the open-source GrandNode under the GPL-3.0, with no limit on the number of stores. #### Can each store have its own domain? Yes. Each store has its own list of domains, and GrandNode picks the store for every request by the host name. #### Can stores share products but have different prices? Yes. A product can be shown in several stores, and store-specific tier prices and discounts set different prices per store. #### Can a store have its own manager? Yes. A customer in the Store manager group, assigned to a store, works in the store owner panel and sees only that store's data. #### Can customers have separate accounts in each store? Yes, optionally. By default one account works in every store; an installation can be configured to register customers per store instead. ### Get started [Download GrandNode](https://grandnode.com/download), read the [knowledgebase](https://grandnode.com/knowledgebase), see what is coming on the [roadmap](https://grandnode.com/roadmap), or go back to the [GrandNode home page](https://grandnode.com/). - [Web page](https://grandnode.com/multi-store-ecommerce) --- Source: https://grandnode.com/open-source-b2b-ecommerce # Open source B2B ecommerce platform **GrandNode is an open-source B2B ecommerce platform** built on ASP.NET Core, .NET 10 and MongoDB. Customer-specific prices, company accounts, sales representatives, tax exemption and order limits are part of the free edition, so you can build a wholesale portal or a dealer shop without paying per order, per user or per B2B module. You host it yourself, own the code and the customer data, and connect it to your ERP the way your business needs. ### Why choose open source for B2B ecommerce - **No revenue share:** B2B orders are large; a platform that takes a percentage of every order gets expensive fast. GrandNode is free under the GPL-3.0. - **Your processes, not a template:** B2B rules differ between companies. With the source code, approval steps, pricing logic or ERP sync can be changed in C# instead of worked around. - **Your data stays with you:** price lists, customer terms and order history are business secrets; they live in your own database, on servers you choose. - **No lock-in:** an active GitHub project and a plugin architecture mean you can change hosting, partners or integrations without starting again. ### B2B features in the free edition - **Customer groups** such as Wholesale, Dealer or VIP decide prices, which products and categories a buyer can see, free shipping, tax exemption and minimum or maximum order totals - see [customer groups](https://grandnode.com/customers-customer-groups). - **Price lists:** tier prices by quantity, plus prices per customer group, per customer, per store and per currency. - **Company accounts:** several buyers order on behalf of one company account. - **Sales representatives:** sales employees with commission, assigned to customers; a sales manager sees only their own customers and orders - see [sales employees](https://grandnode.com/customers-vendors-and-sales-employees). - **Ordering for customers:** staff can place an order as a customer, controlled by a permission. - **VAT and documents:** VAT number capture and exemption, and documents in the customer account. - **Closed or approved registration:** open sign-up, e-mail validation, admin approval or no registration at all. - **Trade selling options:** call for price, quantity rules, pre-orders and availability windows. The complete list is on [Features](https://grandnode.com/features). ### Wholesale and retail from one installation A B2B portal rarely lives alone. With [multi-store](https://grandnode.com/multi-store-ecommerce), a wholesale shop and a retail shop run from one GrandNode installation - each with its own domain, prices, catalog visibility and theme - while they share one product catalog and one back office. Read more on [B2B ecommerce on .NET](https://grandnode.com/b2b-ecommerce). ### Connect it to ERP, PIM and accounting - **Backend API:** a JWT-secured REST API with OpenAPI documentation for products, prices, customers and orders - see [the REST API](https://grandnode.com/developers-rest-api). - **Webhooks:** [GrandNode Webhooks](https://grandnode.com/grandnode-webhooks) push order and customer events to your systems as they happen. - **Bulk imports:** [GrandNode Imports](https://grandnode.com/grandnode-imports) loads large catalogs and customer lists. - **Plugins in C#:** custom payment terms, shipping rules or tax logic as plugins - see [writing a plugin](https://grandnode.com/developers-writing-a-plugin). ### A platform your IT team can support GrandNode is an [ASP.NET Core ecommerce platform](https://grandnode.com/aspnet-core-ecommerce): C#, Docker, Linux or Windows, and a [MongoDB](https://grandnode.com/mongodb-ecommerce) database. Companies that need one version supported for longer can use [GrandNode Official](https://grandnode.com/official) LTS releases with 24 months of security fixes. Setup and configuration guides are in the [knowledgebase](https://grandnode.com/knowledgebase). ### Frequently asked questions #### Is the B2B functionality free? Yes. Customer group pricing, company accounts, sales employees, tax exemption and order limits are part of the open-source GrandNode under the GPL-3.0. #### Can different customers see different prices and products? Yes. Prices can be set per customer group and per customer, and products and categories can be limited to customer groups, so each buyer sees their own catalog and price list. #### Can I hide prices from visitors who are not logged in? Yes. Whether a group may see prices or use the cart is a permission of the customer group, so guests can browse the catalog while prices are shown only to approved buyers. #### Can I run B2B and B2C together? Yes, either in one store with customer groups or in separate stores of one installation with multi-store. #### Can you migrate our current B2B shop? Yes. We migrate products, customers, orders and SEO URLs for a fixed price - [request a quote](https://grandnode.com/migration). ### Get started [Download GrandNode](https://grandnode.com/download), read the [knowledgebase](https://grandnode.com/knowledgebase), see what is coming on the [roadmap](https://grandnode.com/roadmap), or go back to the [GrandNode home page](https://grandnode.com/). - [Web page](https://grandnode.com/open-source-b2b-ecommerce) --- Source: https://grandnode.com/multi-vendor-ecommerce # Multi-vendor ecommerce platform **GrandNode is an open-source multi-vendor ecommerce platform** built on ASP.NET Core, .NET 10 and MongoDB. Independent sellers list and sell their products in your store, each in their own vendor panel, while you run the platform, set the rules and take a commission. The marketplace is part of the core - no separate edition and no paid marketplace plugin. ### How a multi-vendor store works in GrandNode - **The store owner** works in the admin panel: vendor settings, approving vendors, commission, payments, shipping methods, taxes and the storefront. - **Each vendor** works in the vendor panel at `/vendor`: its own products, the order lines that belong to it, shipments, returns, reviews and reports. - **Customers** buy from any number of vendors in one cart and one checkout, with one payment - not a separate checkout per seller. The full model is explained in [marketplace and vendors: how it works](https://grandnode.com/vendor-panel-marketplace-overview). ### Vendor onboarding - **Vendor applications:** signed-in customers apply to sell through a form on the storefront, optionally with mandatory terms of service. - **Approval:** you review applications and activate vendors - see [creating and approving vendors](https://grandnode.com/vendor-panel-create-and-approve-vendors). - **Vendor profiles:** each vendor gets its own SEO-friendly page with description, picture and products; you decide whether vendors may edit it themselves. ### Orders, shipping and commission - **Split by vendor:** every order line remembers its vendor and the commission taken on it, and each vendor sees only its own items and amounts. - **Shipping per vendor:** vendors create shipments with tracking numbers for their own items; the order is shipped when every vendor has shipped. - **Returns:** merchandise returns of a vendor's items appear in that vendor's panel. - **Commission:** a commission percentage per vendor. The customer pays the store, which keeps the commission and pays out the rest to the vendor. ### Trust and data isolation - **Vendor reviews:** shoppers rate vendors, not only products, and you moderate the reviews. - **Contact vendor:** customers can message a vendor from its page. - **Isolation:** a vendor never sees another vendor's products, orders or customers, even by guessing a URL; access checks were hardened in GrandNode 2.4. ### Grow beyond one marketplace With [multi-store](https://grandnode.com/multi-store-ecommerce), one installation can run several marketplaces - per country, niche or brand - with one back office. Add [B2B](https://grandnode.com/b2b-ecommerce) customer groups for trade buyers, and extend payouts, shipping or onboarding with plugins written in C# - see [plugin types](https://grandnode.com/developers-plugin-provider-types). More on the marketplace features is on [multi-vendor marketplace software](https://grandnode.com/multi-vendor-marketplace) and [Features](https://grandnode.com/features). ### Built on ASP.NET Core and MongoDB GrandNode is an [ASP.NET Core ecommerce platform](https://grandnode.com/aspnet-core-ecommerce), self-hosted and free under the GPL-3.0. It runs in Docker on Linux or Windows, stores data in [MongoDB](https://grandnode.com/mongodb-ecommerce) and scales out with a Redis-synced cache - so a growing number of vendors and products does not mean a new platform. Guides for the vendor panel are in the [knowledgebase](https://grandnode.com/docs-vendor-panel). ### Frequently asked questions #### Is the multi-vendor marketplace free? Yes. Vendors, the vendor panel, commissions and vendor reviews are part of the open-source GrandNode, with no limit on the number of vendors. #### Can customers buy from several vendors in one order? Yes. The cart holds products from any number of vendors and the store owner, and checkout creates one order with one payment. #### Are vendor payouts automatic? No. The order records the commission per item; the store pays vendors outside GrandNode. Automated payouts can be added as a plugin for your payment provider. #### Can vendors manage their own shipping? Yes. When the store ships per vendor, each vendor creates shipments and tracking numbers for its own items in the vendor panel. #### Can you migrate our existing marketplace? Yes. We migrate products, customers, orders and SEO URLs for a fixed price - [request a quote](https://grandnode.com/migration). ### Get started [Download GrandNode](https://grandnode.com/download), try the [live demo](https://demo.grandnode.com/), read the [knowledgebase](https://grandnode.com/knowledgebase), see what is coming on the [roadmap](https://grandnode.com/roadmap), or go back to the [GrandNode home page](https://grandnode.com/). - [Web page](https://grandnode.com/multi-vendor-ecommerce) --- Source: https://grandnode.com/getting-started-what-is-grandnode # What is GrandNode Getting started GrandNode is an open-source e-commerce platform built on ASP.NET Core (.NET 10) and MongoDB. One installation runs a complete online store: the shop your customers see, the back office you run it from, and the extension points you use to connect payment providers, shipping carriers, tax engines and your own code. It supports B2C and B2B selling, several stores from one installation, marketplaces with independent vendors, and any number of languages and currencies. This article explains the parts you will meet, so the rest of the documentation makes sense. ### The storefront The storefront is the public website: home page, category and brand pages, product pages, search, cart, checkout, customer account, blog, news, knowledgebase and content pages. It is server-rendered by ASP.NET Core with Vue 3 and Bootstrap 5 for the interactive parts, so pages are fast and indexable. What it looks like is decided by the active **theme**. A fresh installation with sample data uses the Nordic theme; the other themes shipped in the repository are Default and Modern. ![GrandNode storefront home page with the Nordic theme: top menu of categories, a hero slider and a welcome text](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/getting-started/storefront-home.webp) The storefront of a fresh installation with sample data (Nordic theme). ### The Admin panel The Admin panel at `/admin` is where administrators run the whole installation: catalog, orders, customers, marketing, content, reports, configuration of every store, settings, plugins and system tools. Only customers in the **Administrators** customer group (or a group you grant the admin permissions to) can sign in. The administrator account is created by the installation wizard. See [A tour of the Admin panel](https://grandnode.com/getting-started-admin-tour). ### The Store owner panel The Store owner panel at `/store` is a reduced back office for a person who manages *one* store in a multi-store installation. A store manager is a customer in the **Store manager** customer group whose account is assigned to a store. They see the same kind of screens as an administrator — products, categories, orders, customers, discounts, landing pages, reports, payment, shipping and tax configuration, store-level settings — but only the data of their store, and nothing that affects the installation as a whole (plugins, permissions, system tools). ![Store owner panel dashboard for the store GrandNode Demo, with visitors, carts, today's orders and charts](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/getting-started/store-panel.webp) The Store owner panel shows the store it belongs to in the top bar and in the page header. ### The Vendor panel In a marketplace, products can belong to **vendors** — independent sellers who list their goods in your store. The Vendor panel at `/vendor` lets a vendor manage their own products, see and ship the orders that contain them, handle merchandise returns, read their vendor reviews and run reports. A vendor account is a customer in the **Vendors** customer group linked to a vendor record under **Customers → Vendors**. ![Vendor panel dashboard for the vendor Nordic Craft Collective with latest orders and bestsellers](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/getting-started/vendor-panel.webp) The Vendor panel is limited to Catalog, Sales, Customers (vendor reviews) and Reports. ### Plugins Plugins add providers to the platform without changing its code. The repository ships with plugins for: - **Payments** — Cash on delivery, Stripe Checkout, BrainTree; - **Shipping** — fixed rate, by weight, and shipping points (pickup); - **Tax** — fixed rate and country/state/zip based; - **Discount rules** — the standard set of conditions for discounts; - **External authentication** — Facebook and Google sign-in; - **Widgets** — Google Analytics, Facebook Pixel and the home page slider; - **Exchange rates** — a currency rate provider; - **Themes** — Nordic and Modern (the Default theme is built into the web project). The installation wizard installs every plugin it finds, so they are ready to be configured. You manage them under **Plugins → Local plugins**. ### Modules Besides plugins, GrandNode has a few *modules* — parts of the application that can be switched on and off in `App_Data/appsettings.json` under `FeatureManagement`: the installer (`Grand.Module.Installer`), database migrations (`Grand.Module.Migration`), scheduled tasks (`Grand.Module.ScheduledTasks`) and the REST API (`Grand.Module.Api`, off by default). ### How the pieces fit | Part | Address | Who uses it | |---|---|---| | Storefront | `/` | Guests and registered customers | | Admin panel | `/admin` | Administrators | | Store owner panel | `/store` | Store managers of one store | | Vendor panel | `/vendor` | Marketplace vendors | | Database | MongoDB (or LiteDB for small setups) | The application | Everything lives in one web application and one database, so there is nothing extra to deploy for the panels. ### Related - [System requirements](https://grandnode.com/getting-started-system-requirements) - [Installing GrandNode](https://grandnode.com/getting-started-installing) - [A tour of the Admin panel](https://grandnode.com/getting-started-admin-tour) - [Web page](https://grandnode.com/getting-started-what-is-grandnode) --- Source: https://grandnode.com/getting-started-system-requirements # System requirements Getting started GrandNode is a single ASP.NET Core application with a MongoDB database. It runs on Windows, Linux and macOS, on a developer laptop, a virtual machine, a container platform or a managed cloud service. This article lists what you need for each way of running it, so you can prepare the machine before you [install](https://grandnode.com/getting-started-installing). ### Summary | Component | Version | Needed for | |---|---|---| | .NET SDK | 10\.0 — the exact SDK is pinned in `global.json` (currently 10.0.301, later 10.0.3xx patches also work) | Building from source or from the release package | | ASP.NET Core Runtime | 10\.0 | Running a published build (the SDK includes it) | | MongoDB | 4\.0 or newer | The database. A local server, a Docker container or a MongoDB Atlas cluster | | Docker | Any current version | Only if you install with the Docker image | | Node.js + npm | 20 LTS or newer (20.19+ for the admin panels) | Only when you change the storefront or panel frontend sources | | IDE | Visual Studio, JetBrains Rider or VS Code with .NET 10 support | Optional, for development | ### .NET GrandNode targets .NET 10. To build it you need the .NET 10 SDK. The repository contains a `global.json` file that pins the SDK version with `rollForward: latestPatch`: any patch of the same feature band is accepted, an older one is not. If `dotnet build` reports that the requested SDK was not found, install the version named in `global.json` from the .NET download page. A server that only runs a build you published elsewhere needs just the ASP.NET Core 10 runtime. The official Docker image already contains it. ### MongoDB MongoDB 4.0 or newer is required. The installation wizard accepts either a server name with a database name (and optional user name and password) or a full connection string, so all of these work: - a MongoDB Community server on the same machine (`localhost:27017`); - the `mongo` Docker image; - MongoDB Atlas or another hosted MongoDB, using a `mongodb+srv://` connection string. The wizard also lists Azure Cosmos DB and Amazon DocumentDB as data providers; both are used through their MongoDB-compatible APIs and a connection string. For very small or test setups GrandNode can also run on **LiteDB**, an embedded file database — this requires setting `Database:UseLiteDb` to `true` in `App_Data/appsettings.json` before installing. MongoDB is the recommended choice for anything that goes live. Create a separate database for each installation. The wizard refuses to install into a database that already contains GrandNode. ### Operating system and hosting - **Windows** — run with Kestrel directly or behind IIS. - **Linux** — run as a systemd service behind nginx (or another reverse proxy). When a proxy terminates HTTPS, set `Security:UseForwardedHeaders` to `true` in `appsettings.json` so GrandNode sees the original scheme and host. - **Containers** — the `grandnode/grandnode2` image listens on port 8080 and keeps uploaded images and `App_Data` in volumes. The application process needs write access to `App_Data` (it writes `Settings.cfg` with the database connection during installation), `wwwroot` (uploaded images) and `Plugins` (uploaded plugins). ### Hardware There is no fixed minimum; a small store with a few thousand products runs comfortably on 2 CPU cores and 2–4 GB of RAM for the application, with MongoDB on the same machine or separately. Give MongoDB its own resources as the catalog and order history grow. Several application instances can share one database; for that, GrandNode can synchronise its memory cache through Redis (the `Redis` section in `appsettings.json`). ### Node.js — only for frontend work The built JavaScript and CSS bundles of the storefront and the panels are committed to the repository. You do not need Node.js to build, run or deploy GrandNode. You need it only if you change files under `src/Web/Grand.Web/vueapp`, the theme stylesheets or the admin frontend sources, and then you must rebuild the bundles with `npm run build`. ### Related - [Installing GrandNode](https://grandnode.com/getting-started-installing) - [The installation wizard](https://grandnode.com/getting-started-installation-wizard) - [Web page](https://grandnode.com/getting-started-system-requirements) --- Source: https://grandnode.com/getting-started-installing # Installing GrandNode Getting started There are three ways to get GrandNode running: the Docker image (fastest, nothing to build), a release package from GitHub (a stable version you build yourself), or a clone of the repository (for development). All three end in the same place — the [installation wizard](https://grandnode.com/getting-started-installation-wizard) in your browser, where you connect the database and create the administrator account. ### Choose a version The `main` branch and the GitHub releases contain the stable version. The `develop` branch is the development version and may be unstable — use it only to try new features. Docker images follow the same split: `grandnode/grandnode2:latest` is built from `main`, specific versions are tagged with their number. ### Install with Docker You need Docker. The two commands below start MongoDB and GrandNode in separate containers: ``` docker run -d -p 127.0.0.1:27017:27017 --name mongodb mongo docker run -d -p 80:8080 --name grandnode2 --link mongodb:mongo \ -v grandnode_images:/app/wwwroot/assets/images \ -v grandnode_appdata:/app/App_Data \ grandnode/grandnode2 ``` 1. Run the first command to start MongoDB. It listens only on the local interface of the host. 2. Run the second command. GrandNode listens on port 8080 inside the container, published as port 80 on the host. `--link mongodb:mongo` makes the database reachable from GrandNode under the host name `mongo`. 3. The two volumes keep uploaded product images and `App_Data` (which holds `Settings.cfg` with the database connection) when the container is recreated. Do not skip them. This is enough for a trial; for production - connection string from an environment variable, which folders to keep, several replicas and Redis - see [Running in production: Docker and Kubernetes](https://grandnode.com/getting-started-docker-kubernetes). 4. Open `http://localhost/`. You are redirected to `/install`. In the wizard enter `mongo` as the **MongoDB Server name** and any database name, for example `grandnode`. 5. After the wizard reports success, restart the container: `docker restart grandnode2`. To pin a release instead of `latest`, pull it by number: `docker pull grandnode/grandnode2:x.xx`, and use that tag in `docker run`. ### Install from a release package 1. Install the .NET 10 SDK and MongoDB (see [System requirements](https://grandnode.com/getting-started-system-requirements)). 2. Download the source code package of the version you want from the [Releases page on GitHub](https://github.com/grandnode/grandnode2/releases) and extract it. 3. In the extracted folder build the whole solution. This also compiles every module and plugin and copies them into the web project's output: ``` dotnet build GrandNode.slnx ``` 4. Start the web project: ``` dotnet run --project src/Web/Grand.Web ``` 5. Open the address printed in the console (the Kestrel profile uses `https://localhost:5001` and `http://localhost:5000`) and complete the wizard. Always build the solution, not only `Grand.Web`: the web project does not reference the plugins, they install themselves into its output when they are built. ### Install from source ``` git clone https://github.com/grandnode/grandnode2.git cd grandnode2 dotnet build GrandNode.slnx dotnet run --project src/Web/Grand.Web ``` Or open `GrandNode.slnx` in Visual Studio or Rider, build the solution, set `Grand.Web` as the startup project and run it. Both launch profiles set `ASPNETCORE_ENVIRONMENT=Development`. If you start the application another way in development, set that variable yourself — without it the files under `_content/...` return 404 and the Admin panel loads without CSS and JavaScript. ### Host on a Linux server Install nginx, the .NET 10 SDK and MongoDB, then build and publish. Modules and plugins must be built before the publish step, because each one copies itself into the web project's output: ``` git clone -b x.xx https://github.com/grandnode/grandnode2.git ~/source/grandnode cd ~/source/grandnode dotnet restore GrandNode.slnx for module in src/Modules/*; do dotnet build "$module" -c Release; done for plugin in src/Plugins/*; do dotnet build "$plugin" -c Release; done dotnet publish src/Web/Grand.Web -c Release -o /var/webapps/grandnode ``` Run it as a service with a systemd unit whose `WorkingDirectory` is `/var/webapps/grandnode` and whose `ExecStart` is `/usr/bin/dotnet /var/webapps/grandnode/Grand.Web.dll`, with `Restart=always` and `User=www-data`. Point nginx at the application and set `Security:UseForwardedHeaders` to `true` in `App_Data/appsettings.json` so links and redirects use your public HTTPS address. ### Supplying the connection string up front For automated deployments you can put the MongoDB connection string in `appsettings.json` under `ConnectionStrings:Mongodb` (or the environment variable `ConnectionStrings__Mongodb`). The wizard then hides the database fields and asks only for the administrator account, the collation and sample data, and it does not write `Settings.cfg`. ### Tips and common mistakes - **Admin panel without styles** — the application runs without `ASPNETCORE_ENVIRONMENT=Development` on a development build. Set the variable or publish a Release build. - **A plugin is missing** — the solution or that plugin was not built. Build it; plugin views are compiled into the plugin DLL. - **Locked DLL during build** — stop the running site before rebuilding a plugin. - **Starting over** — delete `App_Data/Settings.cfg` and restart; the wizard appears again. Use a new, empty database. ### Related - [The installation wizard](https://grandnode.com/getting-started-installation-wizard) - [Upgrading to a new version](https://grandnode.com/getting-started-upgrading) - [Web page](https://grandnode.com/getting-started-installing) --- Source: https://grandnode.com/getting-started-installation-wizard # The installation wizard Getting started The first time GrandNode starts without a database, every request is redirected to `/install`. The installation wizard is a single page: you fill it in once, press **Install**, and GrandNode creates the database, the administrator account, the default store and — if you want — a complete demo shop. This article goes through every field. ### Before you start - MongoDB is running and reachable from the application (see [System requirements](https://grandnode.com/getting-started-system-requirements)). - You know the server address, and the user name and password if your MongoDB requires authentication — or you have a full connection string, for example from MongoDB Atlas. - The database you will name is empty or does not exist yet. The wizard stops with “This database already exists and has GrandNode installed on it. Choose different database.” otherwise. ### The page, top to bottom The page is titled **grandnode installation**. In the top right corner there is a language selector: it changes the language of the wizard itself (English and Polish are shipped; the browser language is picked by default). It does not decide the languages of your store. #### Company information | Field | What it does | |---|---| | Company name | Saved on the default store as the company name, used on invoices and in emails. Optional. | | Company address | Saved on the default store. Optional. | | Company phone number | Saved on the default store. Optional. | | Company email | Saved on the default store. Optional. | All four can be changed later under **Configuration → Stores**. #### Store information | Field | What it does | |---|---| | Admin user email | The email of the first administrator; you sign in with it. Prefilled with `admin@yourstore.com` — change it to a real address. Required, must be a valid email. | | Admin user password | The administrator's password. Required. | | Confirm the password | Must match the password, otherwise the wizard shows “Passwords must be equals”. | #### Data provider Choose **MongoDB** (the default), **CosmosDB**, **DocumentDB** or **LiteDB**. Choosing CosmosDB or DocumentDB switches the form to the connection string field, because those services are reached with a connection string. LiteDB needs no connection details, but it works only when `Database:UseLiteDb` is set to `true` in `App_Data/appsettings.json`; the database file is then the one named in `Database:LiteDbConnectionString`. Mixing them up is caught: installing MongoDB while `UseLiteDb` is on (or LiteDB while it is off) stops with a message telling you which setting to change. #### Create sample data Tick **Create sample data** to install a demo shop: categories, brands, collections, products with pictures and attributes, a vendor, warehouses, pickup points, discounts, blog posts, news, knowledgebase articles, checkout attributes, affiliates and order tags. With sample data the storefront uses the Nordic theme; without it the Default theme and an empty catalog. Sample data is ideal for evaluation and training. For a production store leave it unticked — removing hundreds of demo products later is more work than adding your own. Some things are installed in both cases: the store, English language, currencies (US Dollar is primary, Euro is published, several more unpublished), countries and states, measures, tax categories, the shipping methods Ground, Next Day Air and 2nd Day Air, message templates, a sample email account, landing pages, layouts, schedule tasks, merchandise return reasons, order statuses and permissions. #### Database information | Field | What it does | |---|---| | MongoDB Server name | Host name and optional port, for example `localhost`, `localhost:27017` or `mongo` in the Docker setup. Required. | | Database name | The database GrandNode creates and uses, for example `grandnode`. Required. | | Collation | The language rules MongoDB uses to compare and sort text (see below). | | MongoDB Server Username | Only when your server requires authentication. | | MongoDB Server Password | Only when your server requires authentication. | Instead of the separate fields you can tick **Connection string** and paste a full MongoDB connection string, for example `mongodb+srv://user:password@cluster0.abc.mongodb.net/grandnode?retryWrites=true&w=majority`. Include the database name in the connection string. #### Collation The collation list contains over a hundred languages plus **-None-**. When you pick one, GrandNode creates every collection with that MongoDB collation, so names are compared and sorted by the rules of that language (accented letters, alphabetical order). The entry matching the wizard's language is preselected. Pick the main language of your catalog; choose **-None-** to keep MongoDB's default binary comparison. The collation is fixed when the collections are created, so decide before you install. ### Installing 1. Fill in the fields and press **Install**. An overlay with “Installing grandnode...” appears; with sample data this takes a minute or two. 2. If something is wrong — the server cannot be reached, a required field is empty, the database already holds GrandNode — the page comes back with the error at the top. Fix it and press **Install** again. 3. On success the page shows “Application has been installed successfully. Please restart the application.” Restart the application (stop and start the process, `docker restart`, or restart the service). 4. Open the store address. The storefront appears; the Admin panel is at `/admin`. During installation GrandNode writes the database connection to `App_Data/Settings.cfg` (unless you supplied it in `appsettings.json`) and installs every plugin present in the `Plugins` folder. The default store is named “Your store name” and its URL is taken from the address you used to open the wizard. The **Restart installation** button clears the wizard's cached values by stopping the application; your hosting (IIS, systemd, Docker with a restart policy) starts it again. ### After installation - The success message recommends switching the installer off: set `"Grand.Module.Installer": false` under `FeatureManagement` in `App_Data/appsettings.json`. An installed site already redirects `/install` to the home page, but a module that is not loaded cannot be misused. - Back up `App_Data/Settings.cfg` together with your database. - To install again from scratch, delete `Settings.cfg`, restart, and use a new database name. ### Related - [A tour of the Admin panel](https://grandnode.com/getting-started-admin-tour) - [First steps for a new store](https://grandnode.com/getting-started-first-steps) - [Web page](https://grandnode.com/getting-started-installation-wizard) --- Source: https://grandnode.com/getting-started-admin-tour # A tour of the Admin panel Getting started Everything you configure in GrandNode starts in the Admin panel. This tour shows how to sign in, what the dashboard tells you, where each part of the menu leads, and how the Store owner and Vendor panels differ from it. Use it as a map for the rest of the documentation. ### Signing in 1. Open `/admin` on your store's address, for example `https://yourstore.com/admin`. If you are not signed in, you are sent to `/admin/login`. 2. Enter the **Email** and **Password** of the administrator created in the [installation wizard](https://grandnode.com/getting-started-installation-wizard). Tick **Remember me?** to stay signed in on this computer. 3. Press **Log in**. The dashboard opens. ![Admin panel sign-in page with Email and Password fields, Remember me and Forgot password](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/getting-started/admin-login.webp) The Admin panel sign-in page. Store managers use `/store/login`, vendors `/vendor/login`. Forgot the password? Use **Forgot password?** — it sends a recovery link to the email address, so an email account must be configured first (see [Configuration](https://grandnode.com/docs-configuration)). ### The dashboard ![Admin dashboard with a welcome message, online visitors, active shopping carts, today's orders, a registered customers chart and the activity overview](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/getting-started/admin-dashboard.webp) The dashboard. The date range in the top right corner drives the charts. From top to bottom: - **Welcome message** — a text you can change with **Edit this message**; it is a landing page under **Content → Landing pages**. - **Online visitors** (last 20 minutes), **Active shopping carts** (last 60 minutes) and **Today orders** (amount and count). Each tile links to its list. - **Number of registered customers in time** and **Orders in time** — charts for the selected date range. - **Activity Overview** — counters for what needs attention: **Order Pending**, **Abandoned carts**, **Low Stock Products**, **Today Registered Customers** and **Pending merchandise returns**. - **Latest orders** — the newest orders with customer, payment status and total; **View more** opens the order list. - **News from GrandNode** — announcements from grandnode.com. ### The side menu The dark rail on the left holds the main sections. Clicking a section opens a panel with its pages; the close button (×) or a click outside hides it. ![Admin side menu with the Catalog section open, listing Products, Categories, Brands, Collections and more](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/getting-started/admin-menu-flyout.webp) Clicking **Catalog** opens its pages. | Section | What you find there | |---|---| | Dashboard | Dashboard, Statistics, Active carts and wishlists, Online customers | | Catalog | Products, Categories, Brands, Collections, Product tags, Bulk edit products, Product reviews, Product attributes, Specification attributes | | Sales | Orders, Shipments, Merchandise returns, Payment Transactions, Order's tags, Checkout Attributes, Order status | | Customers | Customers, Customer groups, Customer tags, Vendors, Vendor reviews, Sales employees, Customer and Address attributes | | Marketing | Discounts, Gift vouchers, Affiliates, Contact Attributes, Newsletter, Push notifications, Documents | | Content | Landing pages, Message templates, Knowledgebase, News, Blog, Manage courses | | Reports | Low stock report, Bestsellers, Products never purchased, Country report, Customer reports | | Configuration | Stores, Permissions, Email Accounts, Languages, Currencies, Countries, SEO Names, Admin menu, Payment, Shipping, Measures, Tax, Layouts | | Settings | General, Catalog, Customer, Sales, Media, Content, Vendor, Push notifications, Admin search, System settings | | Plugins | External authentication, Widgets, Local plugins | | System | System information, Message Queue, Message Contact form, Maintenance, Schedule tasks, Developer Tools | | Help | Links to support services, documentation and the community | The difference between **Configuration** and **Settings**: Configuration holds lists of things you create (stores, languages, currencies, payment and shipping methods), Settings holds switches and options that change behaviour. ### The top bar - **Search in store...** — jump to products, orders, customers or admin pages by typing. - **Dark mode** switch. - **Notifications** (bell) — for example when a new GrandNode version is available. - **Your account** — **My profile** and **Logout**. - **Gear** — **Clear memory cache** and **Restart application**. - **Info** — documentation, community and the installed GrandNode version. - **Home** — opens the storefront. ### Plugins **Plugins → Local plugins** lists every plugin grouped by type, with its version, system name and status. From here you install, uninstall and configure plugins, upload new ones as ZIP files and reload the list. ![Local plugins page listing Facebook and Google authentication plugins as Installed with Configure and Uninstall buttons](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/getting-started/local-plugins.webp) Payment, shipping and tax plugins are configured from their own pages under Configuration. ### Store owner and Vendor panels The Store owner panel (`/store`) and the Vendor panel (`/vendor`) look the same but show fewer sections and only their own data. A store manager has no Plugins, System, Permissions or Stores; a vendor sees only Dashboard, Catalog, Sales, Customers (vendor reviews), Reports and Help. See [What is GrandNode](https://grandnode.com/getting-started-what-is-grandnode). ### Related - [First steps for a new store](https://grandnode.com/getting-started-first-steps) - [Configuration](https://grandnode.com/docs-configuration), [Catalog](https://grandnode.com/docs-catalog), [Sales](https://grandnode.com/docs-sales) - [Web page](https://grandnode.com/getting-started-admin-tour) --- Source: https://grandnode.com/getting-started-first-steps # First steps for a new store Getting started A fresh GrandNode installation works out of the box, but it is not yet *your* store: it is called “Your store name”, it sells in US dollars, and payment and shipping still need your decisions. Work through this checklist in order before you invite customers. Each step names the screen and links to the documentation that covers it in depth. ### 1\. Store name, URL and company details 1. Go to **Configuration → Stores** and click your store. 2. On **Store info** set **Store name** (shown in page titles and emails) and check **URL of the store** — it must be the public address customers use, including `https://`. The installer took it from the address you used to open the wizard, which is often `localhost`. 3. Set **Default language**, **Default currency**, **Default country** and **Default warehouse** if you want this store to differ from the installation defaults. 4. Fill in the company fields (name, address, VAT, phone, email) — they appear on invoices. 5. On **Domains** add every host name the store answers to and mark the primary one. 6. Press **Save**. ![Store edit page with Store info, Domains and House bank tabs; fields Store name, Shortcut, URL of the store and defaults](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/getting-started/store-edit.webp) **Configuration → Stores**, the store edit page. ### 2\. Currency Under **Configuration → Currencies** publish the currencies you sell in and unpublish the rest. US Dollar is the primary store currency after installation and Euro is also published. If your prices are in another currency, make it primary *before* entering products — product prices are stored in the primary currency. ### 3\. Languages English is installed. Add more under **Configuration → Languages**, and import a translation file for each language, or translate texts yourself. Every product, category and page can then be translated. ### 4\. Email account Order confirmations, password recovery and all notifications are sent through an email account. The installer creates a placeholder (`test@mail.com` on `smtp.mail.com`) that will not work. Replace it under **Configuration → Email Accounts** with your SMTP server and send a test email. ### 5\. Tax Under **Configuration → Tax** choose a tax provider on **Tax providers** (fixed rate, or by country/state/zip), set the rates per tax category, and on **Tax settings** decide whether prices include tax and how tax is displayed. The installer creates tax categories such as Home & Living, Electronics & Software, Downloadable Products, Sports & Outdoor and Apparel; rename or add your own. ### 6\. Shipping Under **Configuration → Shipping** enable a provider on **Shipping providers** — fixed rate, by weight, or shipping points for pickup — and configure its rates. The methods Ground, Next Day Air and 2nd Day Air exist already; rename them on **Shipping methods**. Add your **Warehouses** and **Delivery dates**, and use **Shipping restrictions** to hide methods for certain countries. ### 7\. Payment Under **Configuration → Payment → Payment methods** activate and configure at least one method — Cash on delivery for testing, Stripe Checkout or BrainTree for card payments. Enter the provider's live keys only when you go live. **Payment restrictions** hides methods for chosen countries or shipping methods. ### 8\. Theme and logo 1. Go to **Settings → General**, tab **Store information**. 2. Upload your **Logo**. 3. Under **Default store theme** choose Default theme, Modern or Nordic Editorial. 4. Set **Default store time zone**, and switch on **Store closed** while you prepare the store — administrators can still browse it. 5. Press **Save**. ![Settings General, Store information tab, with time zone, Store closed, logo upload and the Default store theme picker](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/getting-started/settings-general-theme.webp) The theme picker shows a preview of each installed theme. ### 9\. Legal and information pages Under **Content → Landing pages** review the pages the installer created — about us, shipping and returns, privacy notice, conditions of use — and replace the sample text with your own. ### 10\. Your first category and product 1. **Catalog → Categories** → **Add new**: give the category a name and publish it. 2. **Catalog → Products** → **Add new**: enter the name, short description, price, SKU, stock, tax category and at least one picture; assign it to the category and publish it. 3. Open the storefront and find the product in the category menu. The [Catalog](https://grandnode.com/docs-catalog) documentation covers product types, attributes, specifications, inventory and prices in detail. ### 11\. Place a test order Register a customer account on the storefront, buy your product with a test payment method and follow the order in **Sales → Orders**: check the emails that arrived, the tax, the shipping cost and the invoice. See [Sales](https://grandnode.com/docs-sales). ### Tips and common mistakes - Change the primary currency before adding products, not after. - A wrong **URL of the store** breaks links in emails and redirects after payment. - If you installed sample data, remove or unpublish the demo products, vendor and discounts before going live. ### Related - [Configuration](https://grandnode.com/docs-configuration) - [Catalog](https://grandnode.com/docs-catalog) - [Sales](https://grandnode.com/docs-sales) - [Web page](https://grandnode.com/getting-started-first-steps) --- Source: https://grandnode.com/getting-started-upgrading # Upgrading to a new version Getting started Upgrading GrandNode means replacing the application files with a newer version and starting it against your existing database. You do not run any scripts yourself: on startup GrandNode compares the database version with its own and runs the database migrations that are missing. This article explains how that works and the steps for Docker and for a self-built installation. ### How migrations work The database remembers which GrandNode version it was last upgraded to (in the version collection), and every migration that has run is recorded in a migrations collection. When the application starts: 1. The migration module (`Grand.Module.Migration`, enabled in `FeatureManagement` in `appsettings.json`) reads the installed version. 2. It takes all migrations of *newer* versions, in version order, and skips those already recorded. 3. It runs each one — adding new permissions, admin menu entries, translation resources, settings, indexes, or reshaping data — and records it. 4. The last migration of each version stamps the database with that version. Because the migrations are ordered by version, you can skip releases: upgrading from 2.2 to 2.4 runs the 2.3 and 2.4 migrations in turn. If a migration fails, the process stops before the version is stamped, the error is written to the log, and it is retried on the next start. A request only reaches your store when the database version matches the application (major.minor). Otherwise every page shows “The database version is not supported in this software version”, with both versions. This is what you see if migrations failed or were switched off. ### Before you upgrade - **Read the release notes** for every version between yours and the target — the installed version is shown under the **Help** menu and in **System → System information**. - **Back up the database** with `mongodump` (or your hosting's snapshot). Migrations change data and there is no automatic downgrade. - **Back up** `App_Data` (`Settings.cfg`, `appsettings.json`) and `wwwroot/assets/images` if images are stored on disk. - **List your own plugins and themes**. They must be rebuilt against the new version. - Try the upgrade on a copy of the database first when the store is live. ### Upgrade a Docker installation 1. Pull the new image: `docker pull grandnode/grandnode2:x.xx` (or `latest`). 2. Stop and remove the old container: `docker stop grandnode2`, `docker rm grandnode2`. 3. Start the new one with the same volumes, so `App_Data` and images are kept: ``` docker run -d -p 80:8080 --name grandnode2 --link mongodb:mongo \ -v grandnode_images:/app/wwwroot/assets/images \ -v grandnode_appdata:/app/App_Data \ grandnode/grandnode2:x.xx ``` 4. Watch the log (`docker logs -f grandnode2`) for lines such as “The migration of … has been completed successfully.” Note that the image's `appsettings.json` lives in the `App_Data` volume: new settings added in the new version are not merged into your existing file. Compare it with the file in the release and copy new sections over. ### Upgrade a self-built installation 1. Get the new version: download the release package or `git checkout` the release tag. 2. Build it exactly as for a new installation — the solution, or modules and plugins followed by `dotnet publish` (see [Installing GrandNode](https://grandnode.com/getting-started-installing)). 3. Stop the site. 4. Replace the application files with the new build, but keep your `App_Data/Settings.cfg`, your `appsettings.json` changes and the uploaded images. Merge new settings from the new `appsettings.json` into yours. 5. Copy in your own plugins and themes, rebuilt against the new version. 6. Start the site and check the log for the migration messages. ### After the upgrade - Sign in to the Admin panel and check **System → System information** for the new version and for warnings. - Open **Plugins → Local plugins** and confirm your plugins are still installed. - If the admin menu or texts look outdated, use **Clear memory cache** under the gear icon in the top bar. - Place a test order. ### Tips and common mistakes - **“The database version is not supported”** — the migrations did not finish. Check the log for the failing migration, fix the cause and restart; it will be retried. Make sure `Grand.Module.Migration` is `true` in `FeatureManagement`. - **Do not run the installation wizard** to upgrade — it is only for new databases. - **Do not go back** to an older version on a migrated database; restore the backup instead. - Several application instances sharing one database: upgrade them together, start one first and let it finish the migrations. ### Related - [Installing GrandNode](https://grandnode.com/getting-started-installing) - [System requirements](https://grandnode.com/getting-started-system-requirements) - [Web page](https://grandnode.com/getting-started-upgrading) --- Source: https://grandnode.com/getting-started-docker-kubernetes # Running in production: Docker and Kubernetes Getting started The GrandNode image is a stateless .NET application plus a few folders it writes to. Running one container on one host is simple; running several replicas in Kubernetes needs three things: **configuration from the environment** (no secrets in files), **shared state** for the few files the application writes, and **Redis** so that every pod's in-memory cache is cleared when data changes. This article describes all three, as of GrandNode 2.4 (Q4 2026). ### The connection string from an environment variable The installation wizard normally writes the MongoDB connection string into `App_Data/Settings.cfg`. In containers, pass it as an environment variable instead - it takes precedence over the file, and the wizard then does not ask for the database and does not write `Settings.cfg`: ``` ConnectionStrings__Mongodb=mongodb://grandnode:•••@mongo-0.mongo:27017/grandnode?authSource=admin ConnectionStrings__Provider=0 ``` - The name is `ConnectionStrings__Mongodb` - the configuration key `ConnectionStrings:Mongodb` with the colon written as a double underscore, as for every ASP.NET Core setting. - `ConnectionStrings__Provider` is optional; `0` is MongoDB (the default). - In Kubernetes, keep it in a **Secret** and reference it with `secretKeyRef`; never bake it into the image or a ConfigMap. The same applies to API keys and the password pepper (`Security__PasswordHashKey`). - Any setting from `App_Data/appsettings.json` can be overridden the same way, for example `Security__UseForwardedHeaders=true`. With `Azure__AppConfiguration` set, settings can also come from Azure App Configuration. ### What the application writes Everything else lives in MongoDB. These are the only places on disk the application writes to, and what to do with each: | Path | What it holds | One container | Several pods | |---|---|---|---| | `App_Data/Settings.cfg` | The connection string written by the wizard. | Persist, or use the environment variable. | Use the environment variable. | | `App_Data/InstalledPlugins.cfg` | Which plugins are installed. Without it the store starts with no plugins - no theme, no payment methods. | Persist. | Use `Extensions__InstalledPlugins` (comma-separated system names; it overrides the file), or put the file on a shared volume. | | `App_Data/DataProtectionKeys` | Keys that protect sign-in cookies and form tokens. | Persist, or customers and staff are signed out on every restart. | Must be the same for all pods: Redis (`Redis__PersistKeysToRedis=true`, `Redis__PersistKeysToRedisUrl`), Azure, or a shared volume set in `Security__KeyPersistenceLocation`. Otherwise a form posted to another pod fails and users are signed out randomly. | | Runtime web files: custom CSS/JS (`assets/custom`), editor uploads (`assets/images/uploaded`), thumbnails (`assets/images/thumbs`), pictures stored on disk, `sitemap*.xml`, `firebase-messaging-sw.js` | Files the shop writes while it runs. | Set `Application__MediaPath` to a volume (for example `/app/media`). | Set `Application__MediaPath` on every pod to the **same** ReadWriteMany volume (Azure Files, EFS, NFS). All pods then serve the same sitemap, custom CSS and uploads. Pictures can also stay in the database (the default) or go to Azure Blob Storage / Amazon S3. | | `wwwroot/assets/files` | Generated PDF files (not covered by `MediaPath`). | Persist if you keep them. | Shared volume, or accept that a generated file is available only on the pod that created it. | | `Plugins/` | Plugin binaries. | Baked into the image. | Baked into the image. Set `Extensions__DisableUploadExtensions=true`: a plugin uploaded through the admin would land on one pod only. | Product downloads (digital products) are stored in the database, not on disk. `Application:MediaPath` is available from GrandNode 2.4; its rules - served ahead of `wwwroot`, which paths are refused, how to move an existing installation - are in the [application settings reference](https://grandnode.com/system-appsettings#media-path). Without it (older versions), the runtime files live in `wwwroot` and each pod has its own copies. > **Do not mount a volume over the whole `App_Data` in Kubernetes.** The folder also contains `appsettings.json` and `Resources` (the language files, including `Resources/Upgrade/*.xml` that upgrade migrations import). An empty PersistentVolumeClaim hides them and the application does not start. Docker fills a new named volume from the image, so it works there at first - but after an upgrade the old volume still shadows the new `appsettings.json` and language files, and new texts are missing. Mount only the subfolders you need, or use environment variables. ### One container with Docker A production-style single host keeps state in named volumes and the connection string in the environment: ``` docker run -d --name grandnode -p 8080:8080 \ -e ConnectionStrings__Mongodb="mongodb://grandnode:•••@mongo:27017/grandnode?authSource=admin" \ -e Security__UseForwardedHeaders=true \ -e Application__MediaPath=/app/media \ -v grandnode_media:/app/media \ -v grandnode_keys:/app/App_Data/DataProtectionKeys \ grandnode/grandnode2:x.xx ``` The official image creates `/app/media` and makes it writable for the application user. After the installation wizard has run, copy the list from `App_Data/InstalledPlugins.cfg` into `Extensions__InstalledPlugins` (or bind-mount that single file), so a recreated container keeps its plugins. ### Several pods with Kubernetes - **Deployment** with two or more replicas of the same image; configuration from a ConfigMap and a Secret as above. - **Probes**: liveness `GET /health/live`, readiness `GET /health/ready` (container port 8080). Readiness reports the application started; it does not test MongoDB or Redis. - **Ingress** terminating TLS, with `Security__UseForwardedHeaders=true` so links use https. Sticky sessions are not required once data protection keys are shared. - **Shared storage**: one ReadWriteMany volume mounted on every pod at the path in `Application__MediaPath`; nothing else needs to be shared when keys are in Redis and plugins are listed in `Extensions__InstalledPlugins`. - **Redis** for cache invalidation and data protection keys - required, see below. - **Scheduled tasks** need no extra setup: every run of a task is claimed atomically in the database by exactly one pod (see [Scheduled tasks](https://grandnode.com/system-scheduled-tasks)). - **Upgrades**: migrations run at start-up. Roll out one pod first (or scale to one), let it finish the upgrade, then scale up; back up the database before. ### Redis: clearing every pod's cache GrandNode caches data - settings, categories, menus, prices, permissions - in each process's own memory. When an administrator saves something, the pod that handled the request clears its cache. The other pods do not know about it and keep serving the old data until it expires (`Cache__DefaultCacheTimeMinutes`, 60 minutes by default). With several pods this shows up as settings that "sometimes" apply, prices that differ between page loads, and new products that appear only on refresh. With Redis pub/sub enabled, every cache removal is also published on a Redis channel; all other pods receive it and remove the same keys from their memory. Redis carries only these invalidation messages - the cached data itself stays in each pod's memory. GrandNode does not use Redis as a distributed cache (as of Q4 2026). ``` Redis__RedisPubSubEnabled=true Redis__RedisPubSubConnectionString=redis-master.redis:6379,password=•••,abortConnect=false Redis__RedisPubSubChannel=grandnode-production Redis__PersistKeysToRedis=true Redis__PersistKeysToRedisUrl=redis-master.redis:6379,password=•••,defaultDatabase=1 ``` - All pods of one store must use the same channel. Use a different channel for each environment (staging, production) that shares a Redis server. - If Redis is unavailable at start-up, the pod starts anyway and keeps retrying the subscription in the background; while it is disconnected, its cache is not cleared by other pods. Monitor the log for `Failed to subscribe to Redis pub/sub channel`. ### Test that invalidation really works Do this once after setting up the cluster and after every change to Redis or the network policy - a misconfigured channel fails silently. You can rehearse the whole test on your own machine first: the repository's .NET Aspire host starts MongoDB, Redis and two replicas of the store - see [Local multi-instance testing with .NET Aspire](https://grandnode.com/developers-aspire-local-testing). 1. Check each pod's start-up log for `Subscribed to Redis pub/sub channel grandnode-production`. 2. For the test, raise the log level of the cache bus: `Logging__LogLevel__Grand.Infrastructure.Caching.Redis=Debug`. 3. Open a product on the storefront through two different pods (port-forward to each pod, or call the pods directly) so both have it cached. 4. In the admin, change the product's name or price and save. 5. The pod that saved logs `Published cache invalidation message ... delivered to N subscriber(s)`, where N should equal the number of pods. Every other pod logs `Received cache invalidation message ... from client ...`. 6. Reload the product on the other pod: it must show the new value immediately. If it shows the old one until the cache expires, invalidation does not work. 7. Repeat with gear menu → **Clear memory cache**: every pod should log a `ClearCache` message. 8. Set the log level back to Information. ### Checklist - Connection string and secrets from a Secret, not from files in the image. - Installed plugins from `Extensions__InstalledPlugins` or a shared file; plugin upload disabled. - Data protection keys in Redis (or Azure / shared volume). - Redis pub/sub enabled, one channel per environment, invalidation tested. - `Application__MediaPath` on a shared volume (custom CSS/JS, uploads, thumbnails, sitemap); pictures in the database, cloud storage or on that volume. - Forwarded headers on, store URL set to the public https address. - Probes on `/health/live` and `/health/ready`. ### Related - [Installing GrandNode](https://grandnode.com/getting-started-installing) - [Application settings (appsettings.json)](https://grandnode.com/system-appsettings) - [Upgrading GrandNode](https://grandnode.com/getting-started-upgrading) - [Web page](https://grandnode.com/getting-started-docker-kubernetes) --- Source: https://grandnode.com/catalog-overview # Catalog overview Catalog The catalog is everything a customer can browse and buy in your store. In GrandNode it is built from a small number of building blocks: **products** that are sold, **categories**, **brands** and **collections** that group them, **attributes** that describe the options a customer chooses and the specifications a customer filters by, **product tags** for loose grouping and search, and **product reviews** written by customers. This article explains how the pieces fit together and where to find each of them, so that the rest of this section is easy to follow. ### Where to find it Open the admin panel (`/admin`) and click **Catalog** in the left sidebar. The flyout lists every catalog screen: - **Products** - the product list, with search, filters, Excel import and export, and the product editor. - **Categories** - the category tree that forms the main navigation of the storefront. - **Brands** - the makers of your products (in other platforms often called manufacturers). - **Collections** - curated, cross-category groupings such as seasonal edits or gift guides. - **Product tags** - free-form keywords shared across products. - **Bulk edit products** - a spreadsheet-style grid for changing names, SKUs, prices, stock and publishing of many products at once. - **Product reviews** - moderation of customer reviews. - **Product attributes** - the reusable definitions of options such as Size or Color. - **Specification attributes** - the reusable definitions of facts such as Material or Screen size, used for comparison and filtering. ![The Catalog flyout in the admin sidebar listing Products, Categories, Brands, Collections, Product tags, Bulk edit products, Product reviews, Product attributes and Specification attributes](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/catalog-menu.webp) Everything in this section starts from the Catalog menu. Two related screens live elsewhere: the **layouts** that decide how a product, category, brand or collection page is rendered are under **Configuration → Layouts**, and the store-wide catalog behaviour (page sizes, what is shown on product pages, search options) is under **Settings → Catalog**. The **Low stock** report is under **Reports**. ### How the pieces fit together A **product** is the central record. It has a type (simple, grouped, bundled, reservation or auction), prices, inventory rules, pictures and SEO data. A product is then *mapped* to the places where it should appear: - to one or more **categories** - a product may live in several categories at once, for example both *Kitchen & Coffee* and *Gifts*; - to one **brand** - chosen on the product's General tab; - to any number of **collections**. Attributes come in two kinds and are easy to confuse: | Kind | What it is for | Example | |---|---|---| | Product attribute | A choice the customer makes when adding the product to the cart. It can change the price, weight, SKU and stock. | Size: S, M, L; Color: Navy, White | | Specification attribute | A fixed fact about the product, shown in the specification table and usable as a filter in category pages. | Material: Cotton; Fit: Slim | Both kinds are defined once in the Catalog menu and then attached to individual products, so the same Size or Material definition is reused across the whole store. ### Stores, customer groups and vendors GrandNode is multi-store. Products, categories, brands and collections each have **Limited to stores** and **Limited to customer groups** fields: leave them empty to show the item everywhere and to everyone, or pick stores or customer groups to restrict it. A product can also be assigned to a **vendor**; vendors then manage their own products in the vendor panel (`/vendor`), and store managers manage the catalog of their store in the store panel (`/store`). The screens described in this section are the same in all three panels, with fewer options where a panel is limited to its own scope. Stores, customer groups and vendors themselves are set up under **Configuration → Stores** and **Customers**. ### Recommended order when you start 1. Create the **category tree** and the **brands** - see [Categories](https://grandnode.com/catalog-categories-brands-collections) and [Brands and collections](https://grandnode.com/catalog-categories-brands-collections). 2. Define the **product attributes** and **specification attributes** you will need - see [Product attributes and combinations](https://grandnode.com/catalog-attributes) and [Specification attributes](https://grandnode.com/catalog-attributes#specifications). 3. Add products one by one ([Adding and editing products](https://grandnode.com/catalog-products)) or in bulk from Excel ([Import, export and bulk edit](https://grandnode.com/catalog-import-export-bulk-edit)). 4. Set prices and stock rules - see [Prices, discounts and inventory](https://grandnode.com/catalog-prices-inventory). 5. Check the result on the storefront with **Show in the shop page** on the product editor. ### Tips and common mistakes - A product that is not visible on the storefront is usually unpublished, limited to another store or customer group, outside its **Available from**/**Available to** dates, or not mapped to any category that is itself published. - Use product attributes only for choices that really change what is shipped. A fact that never varies belongs in a specification attribute, where it can also be filtered. - Catalog changes are cached. They normally show on the storefront immediately after saving; if they do not, check that you saved (not only switched tabs) the product. ### Related - [Adding and editing products](https://grandnode.com/catalog-products) - [Product types](https://grandnode.com/catalog-product-types) - [Prices, discounts and inventory](https://grandnode.com/catalog-prices-inventory) - [Web page](https://grandnode.com/catalog-overview) --- Source: https://grandnode.com/catalog-products # Adding and editing products Catalog Products are managed under **Catalog → Products**. From the list you search and filter the catalog, open a product to edit it, add a new one, copy an existing one, and delete what you no longer sell. This article covers the list and the **General** tab of the product editor, which holds the name, descriptions, brand, visibility and publishing of a product. The other tabs have articles of their own, linked at the end. ### The product list The list shows a thumbnail, the product name with its SKU underneath, price, stock quantity, product type, brand, main category and a **Published** badge. Click a row to open the product. Type in the search box and press **Search** to find products by name. ![The Products list in the admin panel with pictures, names, SKUs, prices, stock, type, brand, category and published status](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/product-list.webp) Catalog → Products: one row per product, with its SKU under the name. Click **Filters** to narrow the list further: | Filter | What it does | |---|---| | Product type | Only products of one type (grouped, reservation, bundled, auction). | | Published | All, only published or only unpublished products. | | Warehouse | Products stocked in a given warehouse. | | Category, Include subcategories | Products mapped to a category; with **Include subcategories** switched on, products of its child categories are included too. | | Brand, Collection | Products of one brand or one collection. | | Store, Vendor | Products available in one store or managed by one vendor. | | Edit product with a specified SKU | Type an exact SKU and click **Go** to jump straight into that product's editor. | ![The product list with the Filters panel open showing product type, published, warehouse, category, brand, collection, store, vendor and SKU fields](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/product-list-filters.webp) The Filters panel. Edit product with a specified SKU opens the product directly. Tick the checkboxes in the first column to act on several products: **Delete (selected)** appears above the grid, and **Export → Export to Excel (selected)** exports only the ticked rows. Excel import and export are described in [Import, export and bulk edit](https://grandnode.com/catalog-import-export-bulk-edit). ### How to add a product 1. Go to **Catalog → Products** and click **Add new**. 2. On the **General** tab choose the **Product type**. For an ordinary product that is shipped and stocked, keep **Simple**; the other types are explained in [Product types](https://grandnode.com/catalog-product-types). 3. Enter the **Product name**, a **Short description** (shown in lists and at the top of the product page) and a **Full description** (the rich text body of the product page). 4. Pick the **Brand**, add **Product tags**, and fill in **SKU** (your stock keeping unit, needed for Excel import), and if you have them the **Manufacturer part number** and **GTIN**. 5. Switch on **Published** when the product is ready to be seen. 6. Click **Save and Continue Edit**. The remaining tabs - pictures, mappings, attributes, linked products and so on - need a saved product, and several of them (reviews, documents, user fields, purchased with orders) only appear once the product exists. 7. Set the price on the **Prices** tab, map the product to categories on the **Mappings** tab, and upload pictures on the **Pictures** tab. Save again. 8. Click **Show in the shop page** to open the product on the storefront in a new tab. ![The product editor for Fieldstone Oxford Shirt with the General tab open: product type, product layout, visible individually, name, short and full description](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/product-edit-general.webp) The product editor. Tabs run down the left; the General tab is open. ### Fields on the General tab | Field | What it does | |---|---| | Product type | Simple, Grouped (product with variants), Reservation, Bundled product or Auction. Changing it shows and hides the tabs that apply to that type. | | Product layout | The Razor layout used to render the product page. Layouts are defined under **Configuration → Layouts → Product layouts**; a standard install has one for simple and one for grouped products. | | Visible individually | When on, the product has its own page and appears in lists and search. Switch it off for products that should be reachable only as a variant of a grouped product. | | Flag | A short custom label (for example "Limited") shown on catalog tiles and on the product page. | | Admin comment | An internal note, never shown to customers. | | Vendor | The vendor that manages the product in the vendor panel. | | Show on home page, Mark as a bestseller | Feature the product in the home page product blocks. A display order field appears when either is on. | | Allow to review this product | Lets customers write reviews on the product page - see [Product tags and reviews](https://grandnode.com/catalog-tags-reviews). | | Limited to customer groups, Limited to stores | Restrict who can see and buy the product. Empty means everyone, in every store. | | Available from, Available to | A time window in which the product can be bought. | | Mark as new | Shows a "new" badge, optionally between a start and end date. | ### Copying and deleting a product The **⋮** button next to **Save** holds **Copy product** and **Delete**. Copy product asks for a new name, whether the copy should be published, and whether to copy the images. Everything else - prices, attributes, mappings, specification attributes - is copied, so this is the quickest way to create a family of similar products. The copy opens as a new product; give it its own SKU and SEO name. ### The other tabs - **Prices** and **Inventory** - [Prices, discounts and inventory](https://grandnode.com/catalog-prices-inventory). - **Additional info** - display order per category, brand and collection page, gift voucher, digital product, recurring product and required products settings. - **SEO**, **Pictures**, **Mappings** and **Linked products** - [Pictures, SEO, mappings and linked products](https://grandnode.com/catalog-pictures-seo-mappings). - **Specification attributes** and **Product attributes** - [Specification attributes](https://grandnode.com/catalog-attributes#specifications) and [Product attributes and combinations](https://grandnode.com/catalog-attributes). - **Purchased with orders** - the orders that contain this product, with links to them. - **Product Reviews** - the reviews of this product. - **Documents** and **User fields** - linked documents and free key-value data for integrations. ### Tips and common mistakes - Remember to save. Switching tabs does not save; **Save and Continue Edit** keeps you on the same tab. - In the **Product type** filter of the list, **All** and **Simple** currently share the same value, so the filter opens with Simple shown and choosing Simple lists products of every type. Pick another type to filter. - Keep SKUs unique. Excel import matches existing products by SKU, and **Edit product with a specified SKU** relies on it. ### Related - [Catalog overview](https://grandnode.com/catalog-overview) - [Product types](https://grandnode.com/catalog-product-types) - [Import, export and bulk edit](https://grandnode.com/catalog-import-export-bulk-edit) - [Web page](https://grandnode.com/catalog-products) --- Source: https://grandnode.com/catalog-product-types # Product types Catalog Every GrandNode product has a **Product type**, chosen at the top of the **General** tab. The type decides how the product is sold - added to the cart as it is, chosen from a list of variants, sold as a set, booked for dates, or auctioned - and which tabs the product editor shows. Pick the type before you fill in the rest: switching it later hides tabs whose data then stops being used. ### The five types at a glance | Type | Use it for | Extra tab | |---|---|---| | Simple | An ordinary product: one price, one stock level, optional attributes such as size and color. Also used for downloads, gift vouchers and subscriptions. | \- | | Grouped (product with variants) | A shared page that lists several simple products, each bought separately with its own price and stock. | Associated products | | Bundled product | A set of existing products sold together at one price and added to the cart as one line. | Bundle product | | Reservation | Something booked for days or hours: rentals, rooms, courses, appointments. | Reservation calendar | | Auction | A single item sold to the highest bidder before a closing date. | Bids | ### Simple products Simple is the default and covers most of a catalog. All tabs are available: prices, inventory, product attributes, and on **Additional info** the switches that turn a simple product into something special - **Is gift voucher**, **Digital product** (a downloadable file, with download limits and an optional sample), **Recurring product** (a subscription with a cycle length and period) and **Require other products added to the cart**. A shirt in three sizes is still a simple product: the sizes are [product attributes](https://grandnode.com/catalog-attributes). ### Grouped products A grouped product is a shop window for a family of simple products. The grouped product itself has no price, inventory or attributes - those tabs are hidden. Instead, the **Associated products** tab lists the simple products shown on its page, each with its own price, stock and add-to-cart button. 1. Create the individual variants as simple products first. If they should not appear on their own in lists and search, switch off **Visible individually** on each. 2. Create the grouped product, set **Product type** to **Grouped (product with variants)** and **Product layout** to **Grouped product (with variants)**, and save. 3. Open **Associated products**, click **Add new associated product**, search for the variants and tick them. Set their **Display order**. ![The Associated products tab of Stoneware Mug Set listing Stoneware Mug Small, Medium and Large](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/type-grouped-associated.webp) Stoneware Mug Set is a grouped product with three associated mugs. A product can be associated with only one grouped product at a time. On the storefront, the variants are listed under the description of the grouped product, each with its own options and price: ![The Stoneware Mug Set page on the storefront, with a variant row showing a picture, description, color choice and price of 22 dollars](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/sf-stoneware-mug-set.webp) Each associated product is a row on the grouped page with its own attributes and price. ### Bundled products A bundle sells several existing products together as one cart line, for example a coffee starter kit made of a kettle, a dripper and beans. The bundle has its own price on the **Prices** tab; price adjustments of attributes chosen for the bundled items are added to it, multiplied by the item quantity. 1. Create a product with type **Bundled product** and save it. 2. On the **Bundle product** tab click **Add new products**, pick the items and set the **Quantity** of each in one bundle and their display order. 3. On **Inventory**, choose **Track inventory by bundle products** if the bundle's availability should follow the stock of its items. The cart then checks, for every item, that *bundle quantity × item quantity* is in stock. ![The Bundle product tab of Slow Morning Coffee Bundle listing the kettle, dripper and coffee beans with quantity and display order](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/type-bundle-products.webp) A bundle of three products, one of each. ![The Slow Morning Coffee Bundle product page listing the kettle and the pour-over dripper it contains, each with its quantity, price and colour choice](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/sf-slow-morning-coffee-bundle.webp) On the storefront a bundle lists its items; a bundle item with attributes asks for its own choice, here the dripper colour. ### Reservation products Reservation products are booked rather than stocked. Choosing this type switches inventory tracking off, unticks shipping and marks the product as not returnable, and shows the **Reservation calendar** tab. The calendar is a list of bookable slots that you generate once and top up from time to time. 1. On **Reservation calendar**, set a **Start date** and **End date** for the period to open for booking. 2. Choose the **Interval** unit. With **Day(s)** each slot is a whole day; you may name a **Resource** (for example a room or bike number) and choose **Include both dates** to count the end date as booked. With **Hour(s)** or **Minute(s)** you set the interval length, the daily **From hour** and **To hour**, how many parallel bookings a slot takes (**Quantity**) and an optional **Additional parameter** the customer chooses (for example a language or a guide). 3. Tick the **Week day**s that can be booked and click **Generate calendar**. The slots appear in the grid below; booked ones link to their order. 4. Use **Clear old, unused records** to remove past slots nobody booked, and **Clear calendar** to start over. ![The Reservation calendar tab of Touring E-Bike Rental with start and end date, a day interval, resource, week days and a grid of daily slots](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/type-reservation-calendar.webp) A daily rental calendar. Generate calendar fills the grid with bookable days. On the storefront the customer picks the reservation dates and any add-ons, and the button reads **Reservation** instead of Add to cart. The price is shown per interval: ![The Touring E-Bike Rental product page with price per day, rental add-on checkboxes, reservation start and end date fields and a Reservation button](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/sf-touring-e-bike-rental.webp) The storefront of a daily reservation product. ### Auction products An auction sells one item to the highest bid. Set **Product type** to **Auction**; the **Prices** tab then shows a **Start price**, the lowest acceptable first bid, and the **Bids** tab lists every bid with date, customer, amount and, once won, the order. ![The Prices tab of the auction product Vintage Steel Road Bike 1984 with a start price of 450 dollars](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/type-auction-prices.webp) An auction product. The start price is the minimum first bid. ![The Vintage Steel Road Bike 1984 auction page with start price, time left, a bid field and a Buy now button](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/sf-vintage-steel-road-bike-1984.webp) The auction on the storefront: start price, countdown, a bid field and, when a buy-now price is set, a Buy now button. The auction closes at the product's **Available to** date on the General tab - set it, or the auction never ends. After that moment the **End of the auctions** scheduled task (**System → Scheduled tasks**) picks the highest bid, puts the item in the winner's cart at the bid amount, and sends the *auction ended* messages to the store owner, the winner and the other bidders. If nobody bid, the auction is simply marked as ended and the store owner is notified. ### Tips and common mistakes - Changing the type of an existing product does not delete its data - associated products, bundle items or calendar slots stay stored but are ignored while the type does not use them. - Variants of a grouped product that are still **Visible individually** also appear on their own in category pages and search, which usually looks like duplicates. - Remember to regenerate the reservation calendar before the last generated date passes, otherwise the product can no longer be booked. ### Related - [Adding and editing products](https://grandnode.com/catalog-products) - [Product attributes and combinations](https://grandnode.com/catalog-attributes) - [Prices, discounts and inventory](https://grandnode.com/catalog-prices-inventory) - [Web page](https://grandnode.com/catalog-product-types) --- Source: https://grandnode.com/catalog-prices-inventory # Prices, discounts and inventory Catalog What a product costs and whether it can be bought are set on two tabs of the product editor: **Prices** and **Inventory**. This article walks through both, including quantity-based tier prices, product discounts, stock tracking, the automatic low stock actions and the **Low stock report**. ### The Prices tab Open a product under **Catalog → Products** and click **Prices**. Amounts are entered in the store's primary currency, shown beside each field. ![The Prices tab of Fieldstone Oxford Shirt with price 79, old price, catalog price, product cost, a currency price grid and switches for disable buy button, call for quote and pre-order](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/product-edit-prices.webp) The top of the Prices tab. | Field | What it does | |---|---| | Price | The selling price. Taxes are added or included according to your tax settings. | | Old price | A previous price, shown struck through next to the current one to signal a reduction. Leave 0 to hide it. | | Catalog price | A reference price (for example a list or RRP price) that may be shown beside the standard price. | | Product cost | What the product costs you. Never shown to customers; used for your own margin reporting. | | Currency code / Price grid | Click **Add new record** to set a fixed price in another currency. When a customer shops in that currency, this price is used instead of converting the main price. | | Disable buy button, Disable wishlist button | Hide the add-to-cart or add-to-wishlist button, for example for products shown only for information. | | Call for quote | Replaces the price with a request to contact you. | | Available for pre-order | Lets customers order before the product is in stock; an optional start date controls when the pre-order button turns into a normal one. | | Customer specify a price | The customer types the amount (donations, pay-what-you-want), within a minimum and maximum you set. | | Use the PAngV (base price) | Shows a unit price such as "2 euro per 1 kg", required for some goods in Germany and other EU countries. | | Tax exempt, Tax category | Exclude the product from tax, or pick the tax category whose rates apply. Tax categories are managed under **Configuration → Tax → Tax categories**. | | TBE services | Marks telecommunications, broadcasting and electronic services for EU VAT rules. | ### Tier prices Tier prices lower the unit price when a customer buys more. Lower on the **Prices** tab, click **Add new tier price** and enter: - **Quantity** - the minimum quantity in the cart from which this price applies; - **Price** - the unit price at that quantity; - optionally a **currency**, a **store**, a **customer group** and a **start** and **end date**. At checkout GrandNode keeps only the tier prices that match the current date, store, currency and the customer's groups (empty fields match everyone), and applies the one with the highest quantity the cart reaches. If two tiers have the same quantity, the lower price wins. This makes wholesale prices simple: create a customer group *Wholesale* and add tier prices limited to it, starting at quantity 1. ![The lower part of the Prices tab with tax settings, a tier prices grid with prices for 3 and 6 units, and the Available discount list](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/product-edit-tier-prices.webp) Ember Single Origin Coffee Beans: 16.99 from 3 bags, 15.49 from 6 bags. ### Discounts on a product The **Available discount** card at the bottom of the Prices tab lists every discount whose type is *Assigned to products*. Tick a discount to apply it to this product and save. Discounts themselves - amount or percentage, dates, coupon codes and rules - are created under **Marketing → Discounts**; see [Sales and orders](https://grandnode.com/docs-sales) and the marketing articles for how they are calculated. A discount can also be assigned to whole categories, brands or collections, which is quicker than ticking it on every product. ### The Inventory tab The **Manage inventory method** decides how stock is counted: | Method | When to use it | |---|---| | Don't track inventory | Services, digital goods, made-to-order items. The product can always be bought. | | Track inventory | One stock number for the product. Orders reserve and reduce it. | | Track inventory by product attributes | Stock per combination of attributes, such as size M in navy. Quantities are kept on the attribute combinations - see [Product attributes and combinations](https://grandnode.com/catalog-attributes). | | Track inventory by bundle products | For bundles: availability follows the stock of the bundled items. | ![The Inventory tab with manage inventory method Track inventory, warehouse, stock quantity 90, reserved quantity, minimum stock quantity, notify store owner, low stock activity and backorders](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/product-edit-inventory.webp) The Inventory tab with stock tracking switched on. | Field | What it does | |---|---| | Warehouse, Use multiple warehouses | Where the stock is kept. With multiple warehouses you enter the quantity per warehouse and the product's total is their sum. | | Stock quantity, Reserved quantity | Units on hand and units already reserved by placed orders that have not shipped yet. | | Display stock availability | Shows "in stock" or "out of stock" on the product page; optionally also the exact quantity. | | Minimum stock quantity, Low stock activity | When an order brings the stock to or below the minimum, GrandNode performs the chosen activity: **Nothing**, **Disable buy button** or **Unpublish**. | | Notify store owner for quantity below | Sends the store owner an email when an order brings the stock below this number. | | Backorders | **No backorders** stops sales at zero; **Allow qty below 0** keeps selling. | | Allow out of stock subscriptions | Customers can ask to be emailed when the product is back in stock. | | Minimum / Maximum purchase quantity, Allowed quantities | Limits per cart line. Allowed quantities is a comma-separated list (for example 1, 6, 12) that turns the quantity box into a drop-down. | | Product is not returnable, Shippable product | Excludes the product from merchandise returns; marks it as needing shipping, with weight, dimensions, free shipping and delivery date fields. | ### Low stock handling Low stock activities run when stock is reduced by an order. If you choose **Unpublish**, the product disappears from the storefront the moment the minimum is reached. When stock goes back up because an order is cancelled, the product is published again (or its buy button re-enabled) only if the catalog setting that publishes products back on cancellation is switched on. Stock you raise by hand in the admin does not re-publish the product: switch **Published** on yourself. To see what needs restocking, open **Reports → Low stock**. It lists simple and bundled products flagged as low stock, and every attribute combination with zero or less in stock, with a link to each product. ![The Low stock report listing two attribute combinations, Loom Merino Wrap Cardigan size XS charcoal and Fieldstone Waxed Cotton Jacket size XXL navy, with zero stock](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/low-stock-report.webp) Reports → Low stock shows products and attribute combinations that ran out. ### Tips and common mistakes - A product with **Track inventory**, stock 0 and **No backorders** cannot be added to the cart - the most common reason for "out of stock" on a new product. - Minimum stock quantity 0 with **Unpublish** hides the product when the last unit sells. Use a small positive number if you want a buffer. - In the tier price grid the price is followed by its currency in brackets; for a tier price without a currency the brackets are currently shown empty. ### Related - [Product attributes and combinations](https://grandnode.com/catalog-attributes) - [Import, export and bulk edit](https://grandnode.com/catalog-import-export-bulk-edit) - change prices and stock of many products at once - [Sales and orders](https://grandnode.com/docs-sales) - [Web page](https://grandnode.com/catalog-prices-inventory) --- Source: https://grandnode.com/catalog-pictures-seo-mappings # Pictures, SEO and category mappings Catalog Three tabs of the product editor decide how a product is found and how it looks: **Pictures** (the gallery), **SEO** (the address and the text search engines show) and **Mappings** (the categories and collections the product appears in). This article covers all three. Open any product under **Catalog → Products** to follow along. ### Pictures The **Pictures** tab lists the product's images with a thumbnail, the default-photo marker, the display order and the alt and title texts. ![The Pictures tab of Fieldstone Oxford Shirt with one picture marked as the default photo, its display order, alt and title, and an upload area below](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/product-edit-pictures.webp) The Pictures tab: the gallery above, the upload area below. 1. Under **Add a new picture**, click **Upload a file** or drop files onto the area. Each file becomes a picture immediately. 2. Click a picture in the grid to edit it: set **Display order** (the lowest number is shown first), **Alt** (read by screen readers and search engines) and **Title** (the tooltip). 3. Use **Delete** to remove a picture from the product. The first picture by display order is the main image on product listings and the product page. Thumbnails in several sizes are generated on demand; their sizes and the image quality are set under **Settings → Media settings** (see [Configuration](https://grandnode.com/docs-configuration)). > Always fill in **Alt**. It is what a blind shopper hears and what search engines and AI assistants read instead of the image. ### SEO ![The SEO tab with meta keywords, meta description, title and search engine friendly page name fields](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/product-edit-seo.webp) The SEO tab. | Field | What it does | |---|---| | Search engine friendly page name | The last part of the product address, for example `fieldstone-oxford-shirt` gives `/fieldstone-oxford-shirt`. Leave it empty and GrandNode builds it from the product name. It must be unique across products, categories, pages and other entities with an address; a duplicate gets a number appended. | | Title | The page title shown in the browser tab and as the headline in search results. Empty means the product name is used. | | Meta description | The snippet search engines show under the title. Aim for one or two sentences, about 150 characters. | | Meta keywords | Kept for completeness; major search engines ignore it. | When you change the page name, GrandNode keeps the old one as an inactive address and answers it with a permanent (301) redirect to the new one, so existing links keep working. ### Mappings: categories and collections The **Mappings** tab places the product in the catalog. It has a grid for categories and one for collections (brands are chosen on the **General** tab). ![The Mappings tab with the category Fashion \>\> Men, not featured, display order 2, and an empty collection grid](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/product-edit-mappings.webp) The Mappings tab: one category, no collection yet. 1. Click **Add new record** above the **Category** grid. 2. Pick the category, tick **Is featured product?** if it should appear in the category's featured block, and set the **Display order** of the product inside that category. 3. Save the row. Repeat for more categories, and the same way for collections. A product can live in any number of categories and collections. The display order is per mapping, so the same product can be first in "New arrivals" and tenth in "Shirts". You can also map from the other side: the **Products** tab of a category, brand or collection lets you add several products at once with a search popup, which is quicker when you build a new category. ### Tips and common mistakes - A product that is not mapped to any category is still reachable by its address and by search, but it will not appear in the category navigation. - Pictures are stored in the database by default; on large catalogs consider storing them on disk (Media settings). - Upload images at least as large as your largest thumbnail size, or the storefront scales small images up and they look blurry. ### Related - [Products](https://grandnode.com/catalog-products) - [Categories, brands and collections](https://grandnode.com/catalog-categories-brands-collections) - [Configuration](https://grandnode.com/docs-configuration) - media and SEO settings - [Web page](https://grandnode.com/catalog-pictures-seo-mappings) --- Source: https://grandnode.com/catalog-categories-brands-collections # Categories, brands and collections Catalog GrandNode groups products in three ways. **Categories** form a tree and are the main navigation of the storefront. **Brands** say who makes a product; each product has at most one. **Collections** are curated groupings that cut across categories, such as "Autumn essentials" or a gift guide. All three share the same editor shape, so once you know one you know the others. ### Categories Open **Catalog → Categories**. The list shows the full path of every category (for example *Fashion \>\> Men*), whether it is on the home page, in the menu, visible, and its display order. ![The Manage Categories list with category paths such as Tech & Audio \>\> Headphones & Speakers, columns for home page, menu, visibility and display order, and Export and Add new buttons](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/category-list.webp) Catalog → Categories. #### Add a category 1. Click **Add new**. 2. On **Category Info** enter the **Name**, a **Description** shown above the product list and optionally a **Bottom description** shown below it (useful for longer SEO text). 3. Choose the **Parent category** to place it in the tree; leave it empty for a top-level category. 4. Set the switches described below, then click **Save** or **Save and Continue Edit**. ![Editing the category Men: the Category Info tab with name, description and bottom description editors, and tabs SEO, Products, Discounts, Documents and User fields](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/category-edit.webp) The category editor. The Products tab maps many products at once. | Field | What it does | |---|---| | Parent category | Places the category in the tree. The path appears in breadcrumbs and in the admin list. | | Picture, Icon | An image for category tiles and an icon for menus, where the theme uses them. | | Category layout | The template used to render the category page (grid, list, or a theme's own layouts). | | Page size, Allow customers to select page size, Page size options | How many products a page shows and which sizes a shopper may pick, for example `6, 12, 24`. | | Default sort, Available sort options | The initial ordering (position, name, price, newest) and which orderings shoppers can choose. | | Show on home page | Adds the category to the home page category block. | | Featured products on home page | Shows the category's featured products on the home page. | | Include in menu | Shows the category in the top menu. | | Hide on catalog | Keeps the category out of the catalog navigation while its page stays reachable, for landing pages. | | Show on search box | Offers the category as a filter in the search box, ordered by **Search box display order**. | | Flag, Flag style | A short label such as "New" or "Sale" shown next to the category name. | | Published, Display order | Whether shoppers see it, and its position among its siblings. | The other tabs: **SEO** (page name, title, meta description - as for products), **Products** (map products with a search popup and set their order and featured flag), **Discounts** (discounts of the type "assigned to categories"), **Documents** and **User fields**. Access by customer group and store limits appear when those features are in use. ### Brands **Catalog → Brands** lists the makers of your products with the same home page, menu and visibility columns. ![The Brands list with Aurora Audio, Nordvik Home, Ember & Oak and six more brands](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/brand-list.webp) Catalog → Brands. A brand has a name, description, picture, layout, page size and sort options, SEO fields and a Discounts tab - the same fields as a category, without the parent. A product gets its brand on the product's **General** tab. Shoppers can browse all brands at `/brand/all` and each brand has its own page. ### Collections **Catalog → Collections** works exactly like brands, but a product can belong to any number of collections, mapped on the product's **Mappings** tab or from the collection's **Products** tab. Use collections for merchandising themes that should not change the category tree: seasonal edits, "Staff picks", or products of one designer. ### Import and export The category, brand and collection lists have an **Export** button that downloads an Excel file and an import action that reads the same format back. An imported row with an existing **Id** updates that record; a row without one creates a new record. This is the quickest way to translate or reorganise a large tree - see [Import, export and bulk edit](https://grandnode.com/catalog-import-export-bulk-edit). ### Tips and common mistakes - Keep the tree shallow. Two or three levels are easier to navigate on a phone than five. - Turning off **Published** hides the category, not its products; they stay reachable through search and their own addresses. - If a category does not appear in the menu, check **Include in menu**, **Published**, the store and customer group limits, and that its parent is visible too. ### Related - [Pictures, SEO and category mappings](https://grandnode.com/catalog-pictures-seo-mappings) - [Content management](https://grandnode.com/docs-content) - page and category layouts - [Marketing and promotions](https://grandnode.com/docs-marketing) - discounts on categories and brands - [Web page](https://grandnode.com/catalog-categories-brands-collections) --- Source: https://grandnode.com/catalog-attributes # Product attributes, combinations and specifications Catalog GrandNode has two kinds of attributes, and mixing them up is the most common catalog mistake. **Product attributes** are choices the customer makes when buying - size, colour, engraving text, a gift wrap checkbox. They can change the price, weight and stock. **Specification attributes** are facts about the product - material, fit, battery life. The customer does not choose them; they are shown in a specification table and used for filtering in categories. ![The Fieldstone Oxford Shirt product page with a required Size drop-down and Color squares next to the Add to cart button](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/sf-fieldstone-oxford-shirt.webp) On the storefront: Size is a drop-down, Color is a set of colour squares. Both are product attributes. ### Product attributes Attributes are defined once under **Catalog → Products attributes** (Size, Color, Engraving...) and then added to each product that uses them. ![The Product attributes list with Capacity, Color, Engraving, Graphics, Grind, Material, Memory and more](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/product-attribute-list.webp) Catalog → Products attributes: the shared definitions. #### Add an attribute to a product 1. Open the product and click the **Product attributes** tab, sub-tab **Attributes**. 2. Click **Add new attribute**, choose the attribute, a **Control type**, optionally a **Text prompt** shown instead of the attribute name, and whether it **Is required**. 3. Save, then edit the row to add its values (for a drop-down, radio list, checkboxes or squares). ![The Product attributes tab of Fieldstone Oxford Shirt with Size as a required drop-down list and Color as required color squares](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/product-edit-attributes.webp) Two attributes on one product: a drop-down and colour squares. | Control type | Use it for | |---|---| | Drop-down list, Radio list | One choice from a list (size, grind). | | Checkboxes, Read-only checkboxes | Several optional extras; read-only shows included extras that cannot be removed. | | Color squares, Image squares | A visual choice; each value has an RGB colour or a picture. | | Textbox, Multiline textbox | Free text such as an engraving; set minimum and maximum length in the validation rules. | | Date picker | A date the customer picks, for example a delivery or event date. | | File upload | A file the customer sends (a logo to print); limit extensions and size in the validation rules. | | Hidden | A value set by a plugin or a default, not shown to the customer. | #### Attribute values Each value has a **Name**, a **Price adjustment** (added to the product price, for example +5 for XXL), a **Weight adjustment**, a **Cost**, **Is pre-selected**, a **Display order**, and for squares a colour or picture. A value can also show a different product picture when chosen, or be linked to another product (the value type "associated to product"), which adds that product to the cart with the chosen quantity. #### Conditions The **Condition** link on an attribute makes it appear only when another attribute has a given value - for example show "Engraving text" only when "Engraving" is ticked. ### Attribute combinations When stock or the SKU differs per variant (the shirt in size M, blue), use the **Attribute combinations** sub-tab. Mark the attributes that take part with the **Combination** switch in their settings, then click **Generate all possible combinations** or add them one by one. | Field | What it does | |---|---| | Stock quantity | Stock for this exact variant. Used when the product's inventory method is *Track inventory by product attributes* (Inventory tab). | | Allow out of stock orders | Lets customers order this variant when it is sold out. | | SKU, MPN, GTIN | Identifiers of the variant; feeds and structured data use them. | | Overridden price | A fixed price for this variant instead of price plus adjustments. | ### Specification attributes Define them under **Catalog → Specification attributes**: an attribute (Material) with its options (Cotton, Wool, Linen). ![The Specification attributes list: Color family, Material, Connectivity, Battery life, Capacity, Fit, Season and more](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/specification-attribute-list.webp) Catalog → Specification attributes. On a product, open **Specification attributes** and click **Add product specification**. Choose the attribute type **Option** to pick one of the defined options (filterable), or a custom text or HTML value for facts that are unique to the product. ![The Specification attributes tab of Fieldstone Oxford Shirt with Color family Blue, Material Cotton, Fit Slim and Season All season, all filterable and shown on the product page](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/product-edit-specifications.webp) Four specifications, each allowed for filtering and shown on the product page. - **Allow filtering** - the option becomes a filter on category, brand and collection pages. - **Show on product page** - the value appears in the product's specification table. ### Tips and common mistakes - Do not use a product attribute for a fact the customer does not choose; it adds a pointless required field to the product page. Use a specification. - If a required attribute has no values, the product cannot be added to the cart. - Combinations only restrict stock when the inventory method is set to track by attributes. ### Related - [Prices and inventory](https://grandnode.com/catalog-prices-inventory) - [Product types](https://grandnode.com/catalog-product-types) - [Web page](https://grandnode.com/catalog-attributes) --- Source: https://grandnode.com/catalog-tags-reviews # Product tags and product reviews Catalog Product tags and product reviews are two lightweight catalog features. Tags are free keywords that link products across categories; reviews are ratings and comments from your customers, which you moderate in the admin. ### Product tags Tags are typed on the product's **General** tab in the **Product tags** field; a new word becomes a new tag. On the storefront each tag has its own page listing its products, and the product page shows its tags as links. **Catalog → Product tags** lists every tag with the number of products that use it. Click a tag to rename it (and set its SEO name and translations) or use **Delete** to remove it from all products. ![The Product tags list with coffee, running, handmade, laptop and others, each with the number of tagged products and a Delete button](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/product-tags.webp) Catalog → Product tags. - Keep tags few and consistent - "wireless", not "wireless", "Wireless" and "wire-less". - Use tags for themes that cross categories (gift, handmade, eco); use categories for the main structure. ### Product reviews Customers write reviews on the product page: a title, a text and a rating from 1 to 5. **Catalog → Product reviews** lists all of them with the product, the customer, the title, the rating, whether it is approved and when it was written. ![The Product reviews list with products such as Vertex Pro 16 and Kinetic Trail Running Shoes, customer, title, rating 4 or 5, approved flag and date](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/product-reviews.webp) Catalog → Product reviews. #### Moderate reviews 1. Use the search box and **Filters** to find reviews by date, text or approval status. 2. Tick reviews and approve or disapprove them in bulk, or open a review to edit its title and text, add a **Reply text** shown under it on the storefront, and set **Is approved**. 3. Delete spam and abuse. Only approved reviews are shown and counted in the product rating. The reviews of one product are also on its **Product Reviews** tab. #### Review settings Under **Settings → Catalog settings**: | Setting | What it does | |---|---| | Product reviews must be approved | New reviews wait for approval before they appear. Recommended. | | Allow anonymous users to write product reviews | Lets guests review. Off by default, and best left off. | | Product review possible only after purchasing | Only customers who bought the product can review it. | | Notify store owner about new product reviews | Sends an e-mail for every new review. | Each product also has an **Allow customer reviews** switch, to turn reviews off for a single product. ### Related - [Products](https://grandnode.com/catalog-products) - [Configuration](https://grandnode.com/docs-configuration) - catalog settings - [Web page](https://grandnode.com/catalog-tags-reviews) --- Source: https://grandnode.com/catalog-import-export-bulk-edit # Import, export and bulk edit Catalog Editing products one by one is fine for a small shop. For hundreds of products GrandNode offers two tools: **Excel import and export** for any field, and the **Bulk edit products** grid for the everyday numbers - price, old price, stock and whether a product is published. ### Export products 1. Open **Catalog → Products**. 2. To export everything that matches the current filters, choose **Export → Export to Excel (all found)**. To export only some products, tick them in the grid and choose **Export to Excel (selected)**. 3. Open the downloaded `.xlsx` file. Each row is a product; the first columns are its **Id** and **Sku**. ### Import products 1. Prepare an `.xlsx` file with the same columns as the export. The easiest start is an export of one product. 2. On the product list choose **Import from Excel** and pick the file. 3. GrandNode processes the rows and reports the result. How a row is matched: - If the **Id** matches an existing product, that product is updated. - Otherwise, if the **Sku** matches an existing product, that product is updated. - Otherwise a new product is created. Only the columns present in the file are changed. Category and collection columns take lists of ids; the page name is generated from the name when it is empty and made unique. Missing references (a layout, tax category, warehouse or unit that does not exist) fall back to the defaults. > Import into a copy of your store first, or export a backup before a large import. An import cannot be undone in one click. ### Bulk edit products **Catalog → Bulk edit products** shows products in an editable grid: **Name**, **SKU**, **Price**, **Old price**, **Stock qty**, **Manage inventory** and **Published**. ![The Bulk edit products grid with name, SKU, price, old price, stock quantity, manage inventory and published columns, and Save changes and Cancel changes buttons](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/catalog/bulk-edit.webp) Catalog → Bulk edit products. 1. Narrow the list with the search box and **Filters** (category, brand, store, vendor, product type). 2. Click a cell and type the new value. Changed cells are marked. 3. Click **Save changes** to write all changes at once, or **Cancel changes** to discard them. The icons at the end of each row open the full product editor or the product page, and **Delete** removes the product. ### Other lists Categories, brands and collections have the same Excel export and import, and orders and customers can be exported the same way. The format is always the one the export produces. ### Tips and common mistakes - Keep the **Id** column when you re-import an export; without it rows are matched by SKU, and rows with an empty SKU become new products. - Excel changes long numbers such as GTINs into scientific notation. Format those columns as text before saving. - The **Picture1**-**Picture3** columns take a file path on the server or an http(s) address; each picture is read and stored, so large imports with pictures take a while. ### Related - [Products](https://grandnode.com/catalog-products) - [Prices and inventory](https://grandnode.com/catalog-prices-inventory) - [Web page](https://grandnode.com/catalog-import-export-bulk-edit) --- Source: https://grandnode.com/sales-overview # Sales and orders: an overview Sales and orders Everything that happens after a customer clicks **Confirm** at checkout is handled in the **Sales** menu of the admin panel. An order is created with its items, prices, addresses and payment method frozen at that moment. From then on your staff take payment, ship the goods, answer questions in order notes and, when needed, accept merchandise returns or refund money. This article maps the screens involved and explains the life of an order, so the rest of this module is easier to follow. ### Where to find it Open the admin panel (`/admin`) and click **Sales** in the left bar. The menu contains: | Menu item | What you do there | |---|---| | **Orders** | Search and open orders; change statuses, edit items and totals, print invoices. See [Finding orders](https://grandnode.com/sales-orders-list) and [Order details](https://grandnode.com/sales-order-details). | | **Shipments** | All shipments across orders; mark them shipped or delivered, print packaging slips. See [Shipments](https://grandnode.com/sales-shipments). | | **Merchandise returns** | Return requests submitted by customers. See [Merchandise returns](https://grandnode.com/sales-merchandise-returns). | | **Payment Transactions** | One record per payment attempt: mark as paid, capture, refund or void. See [Payments and refunds](https://grandnode.com/sales-payments). | | **Order's tags** | Keywords you attach to orders to group them (for example *wholesale* or *priority*). | | **Checkout Attributes** | Extra questions asked at checkout, such as gift wrapping. See [Checkout attributes](https://grandnode.com/sales-checkout-attributes). | | **Order status** | The names of the order statuses and any extra statuses you add. See [Order, payment and shipping status](https://grandnode.com/sales-order-statuses). | Three related screens live in other menus: **Dashboard → Active carts and wishlists** (what customers have in their carts right now), **Marketing → Gift vouchers**, and the sales reports under **Reports**. Behaviour such as "complete the order only after delivery" or "allow merchandise returns" is set in **Settings → Sales settings**. ![The Orders list in the GrandNode admin panel with four orders, their order, payment and shipping statuses, customer and total](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/orders-list.webp) Sales → Orders: every order with its three statuses at a glance. ### The life of an order Every order carries three independent statuses. Keeping them apart is the key to understanding GrandNode: - **Order status** – where the order stands as a whole: *Pending*, *Processing*, *Complete* or *Cancelled*. - **Payment status** – whether the money has arrived: *Pending*, *Authorized*, *Paid*, *Partially paid*, *Partially refunded*, *Refunded*, *Voided*. - **Shipping status** – whether the goods have left: *Shipping not required*, *Pending*, *Prepared to shipped*, *Partially shipped*, *Shipped*, *Delivered*. You normally change only the payment and shipping side; GrandNode derives the order status from them. A typical order goes like this: 1. The customer places the order. Order status *Pending*, payment status *Pending* (or *Authorized*/*Paid* if an online payment method already charged the card), shipping status *Pending* if any item needs shipping, otherwise *Shipping not required*. 2. Payment arrives – automatically from a payment plugin, or you click **Mark as paid** for cash on delivery or bank transfer. The order moves to *Processing*. 3. You create a shipment for the items and mark it shipped, later delivered. The shipping status follows. 4. When the order is paid and shipped (or delivered, depending on the **Complete order when delivered** setting), GrandNode sets it to *Complete* and emails the customer. 5. After delivery the customer may request a merchandise return from their account, and you may refund all or part of the payment. The exact rules are in [Order, payment and shipping status](https://grandnode.com/sales-order-statuses). ### Who sees which orders Administrators see all orders of all stores. A store manager working in the store panel (`/store`) sees only the orders of their store, and a vendor in the vendor panel (`/vendor`) sees only orders containing their products, with only their own items. Those panels are described in [Store panel](https://grandnode.com/docs-store-panel) and [Vendor panel](https://grandnode.com/docs-vendor-panel); this module describes the full admin panel. ### Tips and common mistakes - Do not use **Change status** on the order to "mark it paid" – it changes only the label. Use **Mark as paid** on the payment transaction so the paid date, notifications and loyalty points are handled. - An order whose products all have shipping disabled shows *Shipping not required* and has no **Shipments** tab; it becomes *Complete* as soon as it is paid. - Orders are never really removed: **Delete** hides the order and returns stock, but an order with shipments cannot be deleted or cancelled. ### Related - [Finding orders: list, filters and export](https://grandnode.com/sales-orders-list) - [Order details](https://grandnode.com/sales-order-details) - [What the customer sees](https://grandnode.com/sales-customer-orders) - [Web page](https://grandnode.com/sales-overview) --- Source: https://grandnode.com/sales-orders-list # Finding orders: list, filters and export Sales and orders The order list is where daily order processing starts. It shows the newest orders first and lets you narrow the list down by almost any property of an order: its statuses, dates, the products in it, the store it was placed in or the tags you gave it. From here you also export orders to Excel and print PDF invoices in bulk. ### Where to find it Go to **Sales → Orders**. Each row shows the order number (**Id**), **Order status**, **Payment status**, **Shipping status**, the **Customer** name and email, **Created on** and **Order total**. Click the number, a status or the row to open the order; click the customer to open their customer record. ![Orders list with a quick search box, Filters and Search buttons, and a grid of orders](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/orders-list.webp) The order list with the quick search on top. ### How to search and filter 1. Type a customer's billing email in the search box and press **Search** for the quickest lookup. 2. Click **Filters** to open all other criteria. 3. Set the fields you need (see the table below) and click **Search**. The criteria combine: every filter you set must match. 4. To jump straight to one order, enter its number in **Go directly to order #** and click **Go**. ![The expanded order filters: order number, creation dates, order GUID, billing country, product, billing last name, statuses, vendor, store, warehouse, payment method and order tag](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/orders-filters.webp) All filters of the order list. ### Filters | Field | What it does | |---|---| | **Go directly to order #** | Opens the order with that number without searching. | | **Orders creation date from / to** | Limits the list to orders created in that period. | | **Order GUID** | Finds an order by its technical identifier, for example one quoted by a payment provider. | | **Billing country**, **Billing last name** | Match the billing address of the order. | | **Product** | Shows only orders that contain the chosen product. | | **Order status**, **Payment status**, **Shipping status** | Filter by any of the three statuses – for example all *Paid* orders whose shipping is still *Pending*, i.e. the orders waiting to be packed. | | **Vendor** | Orders containing products of one vendor. | | **Store** | Orders placed in one store of a multi-store installation. | | **Warehouse** | Orders with items shipped from a given warehouse. | | **Payment method** | Orders paid with one method, e.g. cash on delivery. | | **Order's tag** | Orders you tagged with a keyword on the order's **Info** tab. | ### Export and bulk actions The **Export** menu in the top right offers: - **Export to Excel (all found)** – every order matching the current filters, one row per order. - **Export to Excel (selected)** – only the orders ticked in the grid. - **Print PDF invoices (all found)** and **Print PDF invoices (selected)** – one PDF with an invoice per order, the same document the customer can download. Ticking orders also shows a bar with **Delete (selected)**. Deleting marks the orders as deleted and returns their stock; orders that already have shipments cannot be deleted. ### Tips and common mistakes - A daily "to ship" view: **Payment status** = *Paid*, **Shipping status** = *Pending*. - A "chase payment" view: **Order status** = *Pending*, **Payment method** = your offline method, and a date range older than a few days. - The quick search matches the *billing* email, which is normally, but not always, the customer's account email. - Use order tags for anything the statuses cannot express – they are free text and filterable. ### Related - [Order details](https://grandnode.com/sales-order-details) - [Order, payment and shipping status](https://grandnode.com/sales-order-statuses) - [Sales reports](https://grandnode.com/sales-reports) - [Web page](https://grandnode.com/sales-orders-list) --- Source: https://grandnode.com/sales-order-details # Order details: the order screen tab by tab Sales and orders Opening an order from **Sales → Orders** takes you to the order screen. It has no single **Save** button: an order is a record of what was sold, and each tab changes only its own part – the status, the tags, the totals, an address, an item or a note. This article walks through the tabs so you know where to look when a customer calls. ### Where to find it Go to **Sales → Orders** and click an order number. The header shows the order number, a **back to order list** link, the **Invoice (PDF)** button, and a menu (three dots) with **Cancel order** and **Delete**. The tabs are on the left. ![The Info tab of order 3: statuses, customer, store, payment method, order GUID, tags and totals](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/order-info.webp) The Info tab: statuses on top, then the order facts, then the totals. ### Info The first card shows the **Order status**, **Shipping status**, **Payment status** and **Created on**. The **View** link next to the payment status opens the payment transaction, where payments are taken and refunded (see [Payments and refunds](https://grandnode.com/sales-payments)). **Cancel order** appears here while the order is still *Pending*, and **Change status** lets you set the order status by hand (see [Order, payment and shipping status](https://grandnode.com/sales-order-statuses)). The second card holds the facts of the order: the **Code** (a short reference the customer can quote), **Customer**, **Customer IP address**, **Store**, **Currency code** (with the rate if the customer paid in another currency), **Payment method**, the VAT number, affiliate and sales employee when present, and the **Order GUID**. Below them is **Orders tags**: type keywords separated by commas and click **Save**; the tags then appear in the order list filter. The third card lists the money: subtotal, subtotal discount, shipping, payment method fee, tax, order discount, gift vouchers and loyalty points used, **Order total**, refunded amount, the **Used discounts** and the **Profit**. **Edit order totals** opens editable fields for all of these – see [Editing, cancelling and deleting orders](https://grandnode.com/sales-editing-orders). ### Billing and Shipping Two cards, the billing address and the shipping address, each with an **Edit** button. For shippable orders the tab also shows the **Shipping method** the customer chose (editable, for example when you switch carrier) and whether the customer picks the order up in store. Orders with nothing to ship show *Shipping not required* instead of a shipping address. ![Billing info card with name, email, phone, address and country; the order needs no shipping](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/order-addresses.webp) Billing and Shipping for an order of non-shippable products. ### Shipments Shown only when at least one item requires shipping. It lists the shipments of this order with tracking number, total weight, shipped and delivered dates, and has the **Add shipment** button. See [Shipments and tracking](https://grandnode.com/sales-shipments). ### Products One row per ordered item: picture, name with the chosen attributes (colour, size), SKU, vendor, unit price, quantity, the **Open** quantity (not yet shipped or cancelled), the vendor commission when the item belongs to a vendor, and the total. **Edit**, **Delete** and **Cancel** act on one item, and **Add product** adds a new one. Downloadable products also show download controls, gift voucher products a link to the created voucher, and returned items a link to the merchandise return. ![Products tab with three items, their attributes, SKU, vendor, price, quantity, commission and total, plus Edit, Delete and Cancel buttons](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/order-products.webp) The Products tab. The Commission column appears when the order has vendor items. ### Order notes The order's history. GrandNode writes a note for every important event – order placed, marked as paid, item added or cancelled, shipment sent – and you can add your own. Fill in **Note**, optionally switch on **Attached file** to upload a document, and switch on **Display to customer** if the customer should read it. Then click **Add order note**. A note displayed to the customer appears on their order page and is also emailed to them (message template *Customer.NewOrderNote*). ![Order notes grid with system notes and the Add order note form with Attached file and Display to customer switches](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/order-notes.webp) System notes and the form for your own notes. ### Documents, User fields and Notifications - **Documents** – business documents from **Marketing → Documents** linked to this order. Visible to staff allowed to manage documents. - **User fields** – free key/value pairs stored on the order, used mostly by plugins and integrations. - **Notifications** – every email queued for this order, with subject, recipient, creation and sent dates. Use it to answer "did the customer get the confirmation?". Visible to staff allowed to manage the message queue. ![Notifications tab listing the order confirmation to the customer and the new order email to the store owner](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/order-notifications.webp) Emails queued for this order. ### Printing the invoice **Invoice (PDF)** in the header downloads the invoice for this order. To print many at once, use the **Export** menu on the order list. ### Tips and common mistakes - Use notes, not the order status, to record what you told the customer – notes are timestamped and can be shown to the customer. - Editing the billing or shipping address changes only this order, not the customer's address book. - If a tab you expect is missing, check permissions: Documents and Notifications depend on them, and Shipments appears only for shippable orders. ### Related - [Editing, cancelling and deleting orders](https://grandnode.com/sales-editing-orders) - [Payments and refunds](https://grandnode.com/sales-payments) - [Shipments and tracking](https://grandnode.com/sales-shipments) - [Web page](https://grandnode.com/sales-order-details) --- Source: https://grandnode.com/sales-order-statuses # Order, payment and shipping status Sales and orders Every GrandNode order has three statuses that move independently: the **order status**, the **payment status** and the **shipping status**. The payment and shipping statuses follow what actually happens to the money and the goods. The order status is mostly derived from those two – GrandNode moves an order to *Processing* and *Complete* by itself. Knowing the rules lets you process orders with the right buttons instead of overriding statuses by hand. ### Order status | Value | Meaning | |---|---| | *Pending* | The order is placed but nothing has happened yet: no payment and nothing shipped. Only a pending order can be cancelled. | | *Processing* | Set automatically when a pending order becomes *Authorized*, *Paid* or *Partially paid*, or when any part of it is shipped. | | *Complete* | Set automatically when the order is *Paid* and shipping is finished (see below). The customer receives the "order completed" email. | | *Cancelled* | Set by **Cancel order** (by you, or by the customer when the store allows cancelling unpaid orders). Stock and loyalty points are returned and the customer is notified. | ### Payment status | Value | Meaning | |---|---| | *Pending* | No money yet – typical for cash on delivery, bank transfer or a payment the customer has not finished. | | *Authorized* | The card is authorised but not charged; you capture it later. | | *Partially paid* | Part of the amount was recorded with **Partial paid (offline)**. | | *Paid* | The full amount arrived – from a payment plugin, a capture, or **Mark as paid**. | | *Partially refunded* / *Refunded* | Part or all of the money was returned. | | *Voided* | An authorisation was cancelled before it was captured. | All payment changes are made on the payment transaction – see [Payments and refunds](https://grandnode.com/sales-payments). ### Shipping status | Value | Meaning | |---|---| | *Shipping not required* | No item in the order has shipping enabled (services, downloads, gift vouchers, or products with **Shippable product** switched off). | | *Pending* | Something needs to be shipped and no shipment exists yet. Adding a shippable product to such an order also sets it to *Pending*. | | *Prepared to shipped* | A shipment was created but not sent yet. | | *Partially shipped* | Some shipments were sent, but items are still waiting or other shipments are not sent. | | *Shipped* | Every item is in a shipment and every shipment is marked shipped. | | *Delivered* | Every item is in a shipment and every shipment is marked delivered. | Shipments are described in [Shipments and tracking](https://grandnode.com/sales-shipments). ### When does an order become Complete? After every payment or shipping change GrandNode re-checks the order. It becomes *Complete* when the payment status is *Paid* and: - the shipping status is *Shipping not required*, or - the shipping status is *Shipped* or *Delivered* – or only *Delivered* if **Complete order when delivered** is switched on in **Settings → Sales settings**. A complete or cancelled order is not moved automatically any more. A refund does not reopen a complete order. ### How to change the order status by hand 1. Open the order and stay on the **Info** tab. 2. Click **Change status**. 3. Read the warning, choose the new **Order status** and click **Save**, then confirm. ![The Change status panel with a warning for advanced users, an Order status dropdown and Save and Cancel buttons](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/order-change-status.webp) Changing the order status by hand. This changes only the label and writes an order note. As the warning says, nothing else happens: no emails, no stock adjustment, no loyalty points, no gift voucher activation. Use it to correct a status, not to process an order. ### Renaming statuses and adding your own **Sales → Order status** lists the order statuses with their **Name** and **Display order**. You can rename the four built-in statuses (they cannot be deleted) and add your own with **Add new record** – for example *Awaiting stock* or *On hold*. Custom statuses are then available in **Change status** and in the order list filter. GrandNode's automatic rules only use the built-in four, so an order you put in a custom status stays there until you change it. A status that is used by any order cannot be deleted. ![Order status list with Pending, Processing, Complete and Cancelled, each with Edit and Delete](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/order-status-list.webp) Sales → Order status. ### Tips and common mistakes - Order *Pending* + payment *Paid* should not happen; if you see it, the status was set by hand. - If an order stays *Processing* after shipping, check that it is really *Paid* and whether **Complete order when delivered** is on. - Orders with shipments can be neither cancelled nor deleted – delete the shipments first if you really must. ### Related - [Payments and refunds](https://grandnode.com/sales-payments) - [Shipments and tracking](https://grandnode.com/sales-shipments) - [Editing, cancelling and deleting orders](https://grandnode.com/sales-editing-orders) - [Web page](https://grandnode.com/sales-order-statuses) --- Source: https://grandnode.com/sales-editing-orders # Editing an order Sales and orders Customers change their minds and phone in corrections: one more item, a different size, a goodwill discount. GrandNode lets staff edit an order after checkout. This article shows how to add a product, change an order line and correct the totals, and what the system does and does not recalculate for you. ### Before you start - Open the order under **Sales → Orders**. - A cancelled order cannot be edited; its product lines are read only. - Payment is not changed by an edit. If the new total is higher, collect the difference outside the order (a payment link, an invoice) and record it on the payment transaction; if it is lower, refund the difference. See [Payments and payment transactions](https://grandnode.com/sales-payments). ### Add a product to an order 1. Open the **Products** tab of the order and click **Add product**. 2. Search for the product by name or SKU and click it in the list. 3. On the next screen enter the **Price (incl tax)**, **Price (excl tax)**, **Quantity** and **Tax rate**, choose attribute values if the product has any, and click **Add product**. ![Add a new product to order #4: a searchable list of products with name and SKU](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/order-add-product-search.webp) Step 2: pick the product. ![Add product KB Speaker Stand to order #4 with price incl and excl tax 39.00, quantity 1 and tax rate 0](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/order-add-product.webp) Step 3: price, quantity and tax rate are entered by hand. The line is added with the prices you entered, not with the current catalog price. That lets you honour a quoted price, but it also means you must enter the correct tax yourself. ### Change or remove a line On the **Products** tab each line has **Edit** and **Delete**. Edit lets you change the unit price (incl and excl tax), the discount, the quantity and the total of that line. Delete removes the line from the order. ### Edit order totals The totals on the **Info** tab are stored values. Adding or changing lines does not rewrite them automatically, so after an edit click **Edit order totals** and correct them. ![The order totals editor with order subtotal, subtotal discount, shipping, payment method additional fee, tax, discount, currency rate and order total, each incl and excl tax](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/order-edit-totals.webp) Edit order totals: every amount, including and excluding tax. | Field | What it is | |---|---| | Order subtotal | The sum of the product lines, including and excluding tax. | | Order subtotal discount | Discounts applied to the subtotal. | | Order shipping | The shipping charge. | | Payment method additional fee | A fee some payment methods add. | | Order tax | The tax total. | | Order discount | A discount on the order total (after the subtotal). | | Currency rate | The rate from the store currency to the currency the customer paid in. | | Order total | What the customer owes. It is what payments and refunds work against. | Click **Save order totals** when done, or **Cancel order totals** to discard. ### Tell the customer Add an order note on the **Order notes** tab and tick **Display to customer**; the note appears in the customer's order details and can be e-mailed. Keep internal remarks in notes that are not displayed. ### Tips and common mistakes - Edit the totals right after changing lines, so the invoice (PDF) and the customer's view agree. - Stock is managed per product; check the product's stock after adding or removing lines by hand. - For a larger change it is often cleaner to cancel the order and let the customer order again. ### Related - [Order details](https://grandnode.com/sales-order-details) - [Order, payment and shipping statuses](https://grandnode.com/sales-order-statuses) - [Web page](https://grandnode.com/sales-editing-orders) --- Source: https://grandnode.com/sales-payments # Payments and payment transactions Sales and orders Every order has a **payment transaction**: a record of what the customer owes, what has been paid and refunded, and through which payment method. The order's payment status follows the transaction. This article explains the transaction list, the transaction statuses and the actions you use to settle payments by hand. ### The payment transaction list Open **Sales → Payment transaction**. Each row shows the payment method, the transaction amount, the paid amount, the customer, the order number, the status and the date. ![The Payment Transactions list with four Cash on delivery transactions, three pending and one paid](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/payment-transactions.webp) Sales → Payment transaction. Filters narrow it by status, method or date. ### Transaction statuses | Status | Meaning | |---|---| | Pending | Nothing has been paid yet. Offline methods such as Cash on delivery stay here until you mark them paid. | | Authorized | The payment provider reserved the money but has not taken it. Capture it before the authorization expires. | | Partial paid | Part of the amount has been paid. | | Paid | The full amount has been paid. | | Partially refunded, Refunded | Part or all of the payment was returned. | | Voided | An authorization was cancelled before capture; no money moved. | | Canceled | The transaction was cancelled. | ### Settle a payment Open a transaction to see its details and the actions its payment method and status allow. ![Payment Transaction Details of a pending Cash on delivery transaction of 340.10 USD with Mark as paid and Partial paid (offline) buttons](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/payment-transaction-pending.webp) A pending offline payment: mark it paid, or record a partial payment. - **Capture** takes an authorized payment through the payment provider. - **Mark as paid** records that the full amount arrived outside GrandNode (cash, bank transfer). The order's payment status becomes Paid. - **Partial paid (offline)** records a part payment; the paid amount grows and the status becomes Partial paid. - **Refund** returns money through the provider, if it supports refunds; **Refund (offline)** only records a refund made outside GrandNode. Partial variants refund a given amount. - **Void** and **Void (offline)** cancel an authorization. Every action asks for confirmation and adds a note to the order. ![The same transaction after Mark as paid: status Paid, paid amount 340.1 USD, with Refund offline and Partial refund offline buttons](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/payment-transaction-paid.webp) After Mark as paid: the refund actions become available. ### How payment completes an order When an order is paid and needs no shipping, or is paid and delivered, GrandNode moves it to **Complete**. An order that is delivered but not yet paid stays in **Processing**. See [Order, payment and shipping statuses](https://grandnode.com/sales-order-statuses). ### Tips and common mistakes - Mark as paid does not contact the payment provider. Use it only for money you have actually received. - An offline refund does not send money back; it only records that you did. - Payment methods and their settings are under **Configuration → Payment** (see [Configuration](https://grandnode.com/docs-configuration)). ### Related - [Order details](https://grandnode.com/sales-order-details) - [Editing an order](https://grandnode.com/sales-editing-orders) - [Web page](https://grandnode.com/sales-payments) --- Source: https://grandnode.com/sales-shipments # Shipments Sales and orders A **shipment** is one parcel sent for an order. An order can be sent in several shipments - for example when one item is back-ordered - and the order's shipping status follows them: *Not yet shipped*, *Partially shipped*, *Shipped*, *Delivered*. Orders that contain only downloadable or virtual products do not need shipping at all. ### Create a shipment 1. Open the order and go to the **Shipments** tab. 2. Click **Add shipment**. 3. Enter the **Tracking number** from your carrier and, if needed, an **Admin comment** (internal). 4. In **Products shipped**, enter the **Qty to ship** for each line. Lines with quantity 0 stay for a later shipment. If you use several warehouses, choose the warehouse the item leaves from. 5. Click **Save** or **Save and Continue Edit**. ![Add a new shipment to order #4 with tracking number and admin comment fields and the product KB Speaker Stand with quantity to ship 1](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/shipment-add.webp) Add a new shipment: tracking number and quantities. ### Mark it shipped and delivered The shipment page shows the shipment and order numbers, the weight, the products, and the dates. ![Shipment 1 of order 4 not yet shipped, with a Set as shipped button, tracking number, date shipped and date delivered fields](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/shipment-details-new.webp) A new shipment: not shipped yet. 1. Click **Set as shipped** when the parcel leaves. The date is recorded and the customer gets the "shipment sent" e-mail. 2. Click **Set as delivered** when it arrives - by hand, or automatically if a shipment tracker plugin reports it. ![The same shipment with shipped and delivered dates filled in](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/shipment-details-delivered.webp) Shipped and delivered, with both dates. The dates can also be typed into **Date shipped** and **Date delivered** to backdate them. **Print packaging slip** produces a PDF to put in the box. ### All shipments **Sales → Shipments** lists shipments across orders with their tracking numbers and dates. Select several and use the bulk actions to print packaging slips or set them shipped or delivered in one go. ![The Shipments list with shipment 1 of order 4, its tracking number, shipped and delivered dates](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/shipment-list.webp) Sales → Shipments. ### Tracking for customers The customer sees each shipment in the order details on the storefront, with the tracking number. If the shipping method has a tracker (see [Configuration](https://grandnode.com/docs-configuration)), the number links to the carrier's tracking page, and with **Display shipment events to customers** on, the events are listed too. ### Tips and common mistakes - Enter the tracking number before you set the shipment as shipped, so it is in the e-mail. - With **Complete order when delivered** (Sales settings), a paid order becomes Complete when its last shipment is delivered. ### Related - [Order, payment and shipping statuses](https://grandnode.com/sales-order-statuses) - [Merchandise returns](https://grandnode.com/sales-merchandise-returns) - [Web page](https://grandnode.com/sales-shipments) --- Source: https://grandnode.com/sales-merchandise-returns # Merchandise returns Sales and orders A **merchandise return** (often called an RMA) is a customer's request to send back items from an order - for a refund, a replacement or a repair. Customers file it from their account; staff review and process it in the admin. ### Enable returns Open **Settings → Sales settings**, tab **Merchandise returns**. ![The Merchandise returns tab of the sales settings with Enable Returns System, number of days, pickup options, and the reasons and actions grids](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/sales-settings-returns.webp) Settings → Sales settings → Merchandise returns. | Setting | What it does | |---|---| | Enable Returns System | Shows the return option to customers. | | Number of days that the merchandise return is available | The return window, counted from the order date. 0 means no limit. | | Allow to specify return pickup address / date | Lets the customer give an address and a date for a courier pickup; the date can be made required. | | Merchandise return reasons | The reasons a customer picks from, for example "Received wrong product". | | Merchandise return actions | What the customer wants: Repair, Replacement, Store credit... | A return is possible only for items that were **delivered**, within the window, and for products without **Product is not returnable** ticked. ### How a customer requests a return In **My account → Orders** the order details show a return button for eligible orders. The form lists the delivered items: the customer chooses the quantity, a reason and an action for each, and adds a comment. ![The storefront form Return item(s) from order #4 with the item, quantity, return reason and action drop-downs and a comments field](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/storefront-return-request.webp) The return form on the storefront. ### Process a return 1. Open **Sales → Merchandise returns**. New requests have the status **Pending**. 2. Open the return to see the items, quantities, reason, requested action and the customer's comment. 3. Set the **Merchandise return status** as you progress: *Accepted*, *Rejected*, *Cancelled* or *Completed*. Add a **Staff note** and an **External identifier** (your carrier or ERP reference) if you use one. 4. Tick **Notify customer about status change** to e-mail the customer when you save. 5. Refund the money on the order's payment transaction if the action is a refund - the return itself does not move money. ![The Merchandise returns list with return 1 for order 4, quantity 1, total 39.00, customer, pending status and date](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/merchandise-returns.webp) Sales → Merchandise returns. ![Editing merchandise return 1: status Pending, customer comment about a scratched plate, staff notes, and the returned item KB Speaker Stand with reason and action](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/merchandise-return-edit.webp) A return: status, comments and the returned items. The **Merchandise returns notes** tab keeps a conversation with the customer; notes marked to display are visible in their account. ### Tips and common mistakes - If customers say the return button is missing, check that the order is delivered (not just shipped) and within the window. - Restock returned items by hand on the product's inventory tab after you inspect them. ### Related - [Shipments](https://grandnode.com/sales-shipments) - [Payments and payment transactions](https://grandnode.com/sales-payments) - [Web page](https://grandnode.com/sales-merchandise-returns) --- Source: https://grandnode.com/sales-checkout-attributes # Carts, gift vouchers and checkout attributes Sales and orders Three smaller tools under **Sales** complete the picture: the view of customers' current **shopping carts and wishlists**, **gift vouchers**, and **checkout attributes** - extra questions asked on the cart page. ### Shopping carts and wishlists **Sales → Shopping carts and wishlists** shows the carts and wishlists customers have right now, with the number of items. Open one to see its products. Use it to understand what people are about to buy, to answer "I had it in my cart" calls, or together with the abandoned cart reminders in [Marketing](https://grandnode.com/docs-marketing). ![Active carts and wishlists with the tabs Current shopping carts and Current wishlists](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/current-carts.webp) Sales → Shopping carts and wishlists. ### Gift vouchers A gift voucher is a code worth an amount that a customer enters at checkout. Vouchers are created in two ways: - **Sold in the store**: a product marked as a gift voucher on its General tab. When the order is placed, a voucher is created for the recipient named at checkout. It becomes active when the order reaches the status set in **Sales settings → Gift voucher activation order status**. - **Issued by hand**: **Sales → Gift vouchers → Add new**, for refunds, competitions or apologies. ![The Gift vouchers list with columns initial value, remaining amount, coupon code, recipient name, is activated and creation date](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/gift-vouchers.webp) Sales → Gift vouchers. | Field | What it does | |---|---| | Gift voucher type | Virtual (sent by e-mail) or physical (posted). | | Initial value, Currency | The amount the voucher is worth. | | Coupon code | The code the customer types; **Generate code** creates a random one. | | Is activated | Only active vouchers can be used. | | Recipient and sender name and e-mail, Message | Used in the e-mail; **Notify recipient** sends it. | | Valid to | An optional expiry date. | The **Usage history** tab of a voucher lists the orders it paid for; the remaining amount goes down with each use. ### Checkout attributes Checkout attributes are questions on the cart page that belong to the order rather than to a product: gift wrapping, a gift message, a delivery instruction, a purchase order number. ![The Checkout Attributes list with Gift wrapping as a drop-down list and Gift message as a multiline textbox](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/checkout-attributes.webp) Sales → Checkout attributes. 1. Click **Add new**, enter the **Name** and optional **Text prompt**, choose the **Control type** (the same types as product attributes: drop-down, checkboxes, textbox, date picker, file upload...) and whether it is **Required**. 2. For list types, add values; a value can add a **Price adjustment** to the order (for example +5 for gift wrapping) and a weight. 3. Use **Shippable product required** to show the question only when the cart contains something to ship, and **Tax exempt** or a tax category for the price adjustment. The answers appear in the order details, the invoice and the order e-mails. ### Related - [Product attributes, combinations and specifications](https://grandnode.com/catalog-attributes) - [Marketing and promotions](https://grandnode.com/docs-marketing) - [Web page](https://grandnode.com/sales-checkout-attributes) --- Source: https://grandnode.com/sales-customer-orders # What customers see: order history and details Sales and orders Much of the work in the admin is visible to the customer in **My account**. Knowing what they see helps you answer questions and decide what to write in order notes. ### Order history Under **My account → Orders** a signed-in customer sees every order with its number, status, date and total, and a **Details** button. ![My account Orders page listing orders 4, 3, 2 and 1 with statuses Processing, Pending, Pending and Complete, dates and totals](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/storefront-order-history.webp) The order history in My account. ### Order details The details page shows: - the order number, date, status and total; - billing and shipping addresses, the shipping method and the payment method with its status; - the products with attributes, prices and quantities, and the totals including discounts and tax; - shipments with their tracking numbers and dates; - order notes you marked as **Display to customer**; - checkout attribute answers, such as a gift message. ![The storefront order details of order 4 with addresses, payment and shipping, products, totals, shipments and notes](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/storefront-order-details.webp) Order details on the storefront. Buttons on the page, depending on your settings and the order state: | Button | Shown when | |---|---| | Print, PDF invoice | Always; the invoice uses the same template as the admin. | | Re-order | **Is re-order allowed** is on in Sales settings. It puts the same products in the cart again. | | Return item(s) | Merchandise returns are enabled and the order has delivered, returnable items within the window. | | Cancel order | **Allow to cancel orders by users** is on and the order is not paid yet. | | Add order note | **Allow customer to add order note** is on. | ### Guest orders Customers who checked out as guests have no account page and rely on the order e-mails. Anything they should know, send as a displayed order note - it is e-mailed to them. ### Related - [Order details](https://grandnode.com/sales-order-details) - [Merchandise returns](https://grandnode.com/sales-merchandise-returns) - [Customers](https://grandnode.com/docs-customers) - [Web page](https://grandnode.com/sales-customer-orders) --- Source: https://grandnode.com/sales-reports # Sales reports Sales and orders GrandNode's reports answer the everyday sales questions: how much did we sell, what sells, what does not sell, and where do buyers come from. They are under **Reports** in the admin, and the most important figures are on the dashboard. ### The dashboard The admin home page shows today's orders, online visitors, active carts, the latest orders and charts of orders and new customers for the selected date range. Use the date picker in the top right to change the range. ### Bestsellers **Reports → Bestsellers** lists products by quantity sold and by amount. Filter by date range, store, order status, payment status, billing country and vendor - for example only paid orders of last month. ![The Bestsellers report with filters for dates, store, order status, payment status, billing country and vendor, and products with total quantity and total amount](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/report-bestsellers.webp) Reports → Bestsellers. ### Products never purchased **Reports → Products never purchased** lists products with no sales in the chosen period. Use it to find dead stock, products with bad pictures or prices, or products nobody can find. ![The Products never purchased report with start and end date filters and a list of product names](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/report-never-sold.webp) Reports → Products never purchased. ### Other reports | Report | Answers | |---|---| | Country report | Order count and total per billing country. | | Low stock report | Products and combinations below their minimum stock (see [Prices and inventory](https://grandnode.com/catalog-prices-inventory)). | | Customer reports | Best customers by order total and count, and registrations over time (see [Customers](https://grandnode.com/docs-customers)). | ### Exporting data For analysis in a spreadsheet, export orders from **Sales → Orders** with **Export to Excel** - all orders matching the filters or only the selected ones. ### Tips - Filter reports by payment status *Paid* to see revenue you actually received. - Vendors see the same reports limited to their own products in the [vendor panel](https://grandnode.com/docs-vendor-panel), and store managers for their store in the [store owner panel](https://grandnode.com/docs-store-panel). ### Related - [The order list](https://grandnode.com/sales-orders-list) - [Web page](https://grandnode.com/sales-reports) --- Source: https://grandnode.com/sales-order-tags # Order tags Sales and orders **Order tags** are short labels for orders - "gift", "priority", "wholesale", "call customer". They do not change how an order is processed; they help staff mark and find orders that need attention. ### Tag an order 1. Open the order under **Sales → Orders**. 2. On the **Info** tab, type in **Orders tags**, separating tags with commas. New words become new tags. 3. Click **Save** next to the field. The same field is available to store managers in the [store owner panel](https://grandnode.com/docs-store-panel). ### The tag list **Sales → OrderTags** lists every tag with the number of tagged orders. Click a tag to rename it, or delete it - deleting removes it from all orders. ![The order tags list with gift, priority and wholesale, the number of tagged orders and Delete buttons](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/sales/order-tags.webp) Sales → OrderTags. ### Find tagged orders In **Sales → Orders**, open **Filters** and choose the tag to list only orders that carry it - for example everything marked "priority" that is not shipped yet. ### Tips - Agree a small, fixed set of tags with your team; free-form tags quickly become a long, unused list. - Use order notes, not tags, for information the customer should see - tags are internal. ### Related - [The order list](https://grandnode.com/sales-orders-list) - [Order details](https://grandnode.com/sales-order-details) - [Web page](https://grandnode.com/sales-order-tags) --- Source: https://grandnode.com/customers-overview # Customers in GrandNode: an overview Customers In GrandNode every visitor is a customer. The moment someone opens the storefront, adds a product to the cart or starts checkout, GrandNode keeps a customer record for them, even before they register. Registration does not create a new account, it converts that guest record into a registered one, so the cart, the wishlist and the browsing history carry over. This article explains the model and walks through the **Customers** menu of the admin panel, so you know which screen to open for which job. ### Guests and registered customers Every customer belongs to one or more **customer groups**. Two of them describe the account itself and exactly one of them is always present: - **Guests** - a visitor who has not registered. Guests can browse, see prices and use the cart and wishlist (these are the default permissions of the Guests group). Guest records are not shown in the customer list unless you filter for them. - **Registered** - a customer with an e-mail address and a password who can sign in, see the order history and manage addresses on the storefront. GrandNode refuses to save a customer who is in both groups or in neither of them. On top of that a customer can belong to any number of other groups: the built-in **Administrators**, **Vendors**, **Store manager** and **Sales manager** groups, and groups you create yourself for pricing, visibility or free shipping. Group membership is what decides who may open which panel and what they may do there - see [Customer groups and access control](https://grandnode.com/customers-customer-groups). ### One account, many roles GrandNode has no separate "user" table for staff. An administrator, a store manager or a vendor is a customer record with extra groups and a link to what they manage: | Who | Customer groups | Link on the customer record | Panel | |---|---|---|---| | Shopper | Registered (or Guests) | \- | storefront only | | Administrator | Administrators, Registered | \- | `/admin` | | Store manager | Store manager, Registered | **Manager of store** | `/store` | | Vendor | Vendors, Registered | **Manager of vendor** | `/vendor` | | Sales manager | Sales manager, Registered | **Sales employee** | `/admin`, limited to own customers and orders | Because it is all one record, the same person can shop in your store with the account they use to manage it. The only combinations GrandNode blocks are the ones that would mix scopes: an administrator cannot also be linked to a vendor or a store, and a vendor account cannot be a store manager at the same time. ### The Customers menu ![The Customers flyout in the admin sidebar: Customers, Customer groups, Customer tags, Vendors, Vendor reviews, Sales employees, Customer attributes and Address attributes](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/customers/customers-menu.webp) The Customers menu. Open **Customers** in the left-hand menu of the admin panel. The entries are: | Menu entry | What you do there | |---|---| | **Customers** | Search, create, edit, export and delete customer accounts. See [Finding and editing customers](https://grandnode.com/customers-manage-customers). | | **Customer groups** | Built-in and custom groups, their order limits, free shipping, tax exemption and the access control list. | | **Customer tags** | Free labels for segmenting customers - used by newsletter campaigns and suggested products. | | **Vendors** | Sellers in a marketplace set-up and the customer accounts that manage them. | | **Vendor reviews** | Approve or remove reviews customers wrote about vendors. | | **Sales employee** | Internal sales staff that customers can be assigned to, with a commission rate. | | **Customer attributes** | Extra fields on the registration and account forms. | | **Address attributes** | Extra fields on the address form. | Two customer screens live under **Reports**: **Online customers** (who is on the site right now) and **Customer reports** (best customers and registrations over time). They are described in [Online customers and customer reports](https://grandnode.com/customers-online-customers-and-reports). ![The Customers list in the GrandNode admin panel with four registered accounts](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/customers/customer-list.webp) Customers → Customers: the default view lists registered customers, newest first. ### Where customer settings live How people register and sign in - the registration method, which form fields are shown and required, password rules, two-factor authentication, whether customers may delete or export their account - is configured in **Settings → Customer settings**. The settings that change what you see in the Customers screens are summarised in [Registration, login and customer privacy](https://grandnode.com/customers-registration-login-and-privacy); the full reference is in [Configuration](https://grandnode.com/docs-configuration). ### Customers in a multi-store installation A customer record has a **Store** field - the store the customer registered in. Store managers working in the `/store` panel only see and create registered customers of their own store; administrators see everybody. By default an e-mail address is unique across the whole installation, so one person has one account that works in every store. Loyalty points, newsletter subscriptions and orders are kept per store. ### Related - [Finding and editing customers](https://grandnode.com/customers-manage-customers) - [Customer groups and access control](https://grandnode.com/customers-customer-groups) - [Vendor panel](https://grandnode.com/docs-vendor-panel) - [Web page](https://grandnode.com/customers-overview) --- Source: https://grandnode.com/customers-manage-customers # Finding and editing customers Customers The customer list is where you look people up, open their account, correct their data, reset a password or create an account on their behalf - for a phone order, a B2B customer or a new member of staff. This article covers the list, the **Customer Info** tab and deleting accounts. The other tabs of the customer record are described in [The customer record: orders, carts, addresses and more](https://grandnode.com/customers-customer-record). ### Where to find it Go to **Customers → Customers**. The list shows e-mail, name, customer groups, whether the account is active, when it was created and the last activity. Click an e-mail address to open the customer. ### Searching and filtering The wide box at the top searches by **Email** (a part of the address is enough). Click **Filters** to show more fields: **First name**, **Last name**, **Customer groups** and **Customer tags**. **Username**, **Company**, **Phone** and **Zip code** appear as well when those fields are enabled in customer settings. Then click **Search**. ![Customer list with the filter panel open: first name, last name, customer groups and customer tags](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/customers/customer-list-filters.webp) The Filters panel. The Registered group is preselected, so guests are hidden until you remove it. > The **Customer groups** filter starts with **Registered** selected. To find a guest - for example the owner of an abandoned cart - remove Registered and choose **Guests**. To list your staff, choose **Administrators**, **Store manager** or **Vendors**. ### How to create a customer 1. On the customer list click **Add new**. 2. Enter the **Email** and a **Password**. If usernames are enabled, the **Username** is required too. 3. In **Customer groups** keep **Registered**. Add other groups only when the account needs them (see the rules below). 4. Choose the **Store** the customer belongs to and fill in the name, company and address fields you need. 5. Leave **Active** switched on, otherwise the customer cannot sign in. 6. Click **Save**, or **Save and Continue Edit** to stay on the record and open the other tabs. GrandNode checks that the e-mail address (and username) is not already used and that the password matches the password rule from customer settings. ### Fields on the Customer Info tab ![Customer edit page, Customer Info tab, with e-mail, customer groups, tags, active switch, manager of vendor, manager of store, store, owner and sales employee](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/customers/customer-edit-info.webp) Customers → Customers → a customer: the Customer Info tab. | Field | What it does | |---|---| | **Email** | Sign-in name and address for all messages. Must be unique. | | **Password** | Leave empty to keep the current password. Type a value to set a new one - useful when a customer cannot use the password recovery e-mail. | | **Customer groups** | Group membership: Registered or Guests, plus any others. Drives permissions, prices, visibility and panel access. | | **Customer tags** | Free labels. Type at least three letters to pick an existing tag or type a new one - it is created on save. See [Customer tags](https://grandnode.com/customers-customer-tags). | | **Active** | Inactive customers cannot sign in. New registrations waiting for e-mail validation or admin approval are inactive. | | **Two-factor authentication is enabled** | Shows whether the customer turned on 2FA; switch it off to let a customer who lost their authenticator sign in with the password only. | | **Manager of vendor** | Links the account to a vendor, so it can sign in to the vendor panel. The account must also be in the Vendors group. | | **Manager of store** | Links the account to a store, so it can sign in to the store manager panel. The account must also be in the Store manager group. | | **Store** | The store the customer belongs to. Required when a non-administrator creates the account. | | **Owner** | E-mail of a parent account. Makes this account a sub-account of that customer (the owner manages sub-accounts from **My account** on the storefront). | | **Sales employee** | The sales employee who looks after this customer. Orders the customer places carry this sales employee and, if set, their commission. | | Name, gender, date of birth, company, address, phone, fax | Personal data. Which of these fields appear depends on the form fields enabled in customer settings. | | **Is tax exempt** | No tax is charged on this customer's orders. | | **Free shipping to the next order** | Shipping is free on the next order; GrandNode clears the flag after that order. | | **VAT number** | Shown when EU VAT is used; **Mark as valid** / **Mark as invalid** change its status by hand. | | **Newsletter** | One check box per store; subscribes or unsubscribes the customer's e-mail. | | **Admin comment** | Internal note, never shown to the customer. | At the bottom of the tab you see read-only facts: **IP Address**, **Created on**, **Last activity**, **Last visited page** (when storing it is enabled) and **Last purchase date**. Custom [customer attributes](https://grandnode.com/customers-customer-attributes) appear between the personal fields. ### Rules GrandNode enforces on groups - A customer must be in **Registered** or **Guests**, never both. - Only an administrator can add someone to **Administrators**. - A customer in **Vendors** must have **Manager of vendor** set, and a vendor account cannot also be a store manager. - A customer in **Store manager** must have **Manager of store** set. - A customer in **Sales manager** must have **Sales employee** set. - An administrator cannot be linked to a vendor or a store at the same time. If a rule is broken the record is not saved and the message appears at the top of the form. ### Exporting customers Click **Export** on the list and choose **Export to Excel (all found)** to download every customer matching the current filters, or tick rows first and choose **Export to Excel (selected)**. The file is an .xlsx workbook. ### Deleting customers Open a customer and choose **Delete** from the **⋮** menu, or tick several rows on the list and use **Delete (selected)**. Deleting does not remove the document from the database: GrandNode marks it deleted, replaces the e-mail and username with an anonymous value, clears the addresses, personal fields, cart, groups and tags, and removes newsletter subscriptions. Orders stay, so your sales history and invoices remain complete. You cannot delete your own account, and built-in system accounts (such as the search engine and background task accounts) cannot be deleted. ### Tips and common mistakes - "Add the customer to 'Guests' or 'Registered' customer group" - you removed Registered while editing groups. Add it back. - A new vendor or store manager cannot open their panel: check both the group and the link field (**Manager of vendor** / **Manager of store**). - A customer says they registered but cannot sign in: check **Active**. With e-mail validation, use **Re-send activation message** from the **⋮** menu; with admin approval, switch Active on. ### Related - [The customer record: orders, carts, addresses and more](https://grandnode.com/customers-customer-record) - [Customer groups and access control](https://grandnode.com/customers-customer-groups) - [Registration, login and customer privacy](https://grandnode.com/customers-registration-login-and-privacy) - [Web page](https://grandnode.com/customers-manage-customers) --- Source: https://grandnode.com/customers-customer-record # The customer record: orders, carts, addresses and more Customers Opening a customer shows far more than the account form. The tabs on the left collect everything GrandNode knows about that person: orders, reviews, saved addresses, what is in the cart right now, individual prices, internal notes, messages and loyalty points. From the same page you can e-mail the customer or place an order in their name. The **Customer Info** tab is covered in [Finding and editing customers](https://grandnode.com/customers-manage-customers); this article walks through the rest. ### Where to find it Go to **Customers → Customers** and click the customer's e-mail. The tabs appear once the customer has been saved - on **Add new** you only see **Customer Info**. When you use **Save and Continue Edit**, GrandNode reopens the tab you were on. ### The tabs | Tab | What it shows and what you can do | |---|---| | **Orders** | All orders of the customer with total, order, payment and shipping status. Expand a row to see the items; click the order number to open the order. | | **Reviews** | Product reviews written by the customer. Open or delete a review from here. | | **Addresses** | The customer's address book. **Add new address**, **Edit** or **Delete** - the same addresses the customer picks from at checkout. | | **Current cart and wishlist** | What is in the cart and the wishlist right now. In the cart you can change the unit price of an item or delete it and click **Save changes** - handy when you agree a price by phone before the customer checks out. | | **Personalized products** | Two lists. **Personalized products** are shown to this customer in a block on the home page (enable **'Personalized products' enabled** in catalog settings). **Individual Product Prices** give this customer their own price for a product (requires **Customers have independent product price** in catalog settings). | | **Customer notes** | Notes with a title, text and an optional attached file. Tick **Display to customer** to show a note on the storefront under **My account → Notes**; otherwise it stays internal. | | **Activity** | Messages the customer sent through the contact form, and the e-mails queued for the customer's address (subject, created, sent) - useful when someone says they never got the order confirmation. | | **Out of stock subscriptions** | Products for which the customer asked to be notified when they are back in stock. | | **Loyalty points** | Points history per store with the balance; add or subtract points by hand. Visible when loyalty points are enabled. | | **Documents** | Documents (offers, contracts, invoices) linked to the customer. Visible to users with the permission to manage documents. | ![Orders tab of a customer with four pending orders](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/customers/customer-edit-orders.webp) The Orders tab lists every order the customer placed. ![Addresses tab of a customer with one address and Add new address, Edit and Delete buttons](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/customers/customer-edit-addresses.webp) The Addresses tab is the address book the customer picks from at checkout. ### How to give a customer loyalty points 1. Open the customer and go to the **Loyalty points** tab. 2. Under **Add points** enter the **Value**. A negative number takes points away. 3. Write a **Message** - the customer sees it in their points history, so make it clear ("Apology for the late delivery"). 4. Choose the **Store** the points are for. Points are kept per store. 5. Click **Add loyalty points**. The row appears in the history with the new balance. ![Loyalty points tab with one history row of 100 points and the Add points form](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/customers/customer-edit-loyalty-points.webp) Adding 100 points by hand. The balance column shows the running total. ### How to e-mail a customer 1. Click **Send email** at the top of the customer page. 2. Fill in **The subject** and **The email body**. 3. Leave **Send immediately** on, or switch it off and pick the **Planned date of sending**. 4. Click **Send email**. The message goes to the e-mail queue and is sent by the default e-mail account; you can follow it in the **Activity** tab. ![Send email dialog with subject, body and the Send immediately switch](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/customers/customer-send-email.webp) The Send email dialog. Messages are queued, not sent synchronously. The **⋮** menu next to **Save** also offers **Send welcome message** and **Re-send activation message** when they apply - the welcome message for accounts that are registered and active, the activation message for accounts still waiting for e-mail validation. ### How to place an order for a customer (impersonation) **Place order** lets you use the storefront as that customer - with their cart, addresses, prices and discounts - to take a phone order or to see exactly what the customer sees. 1. Open the customer and click **Place order**. 2. GrandNode opens the storefront. The header shows that you are impersonating the customer, with a **finish impersonated session** link. 3. Add products to the cart and go through checkout as usual. The order is created for the customer, and the order confirmation goes to the customer's e-mail. 4. Click **finish impersonated session** to return to your own account. Impersonation needs the **Allow Customer Impersonation** permission (administrators have it by default), and only an administrator can impersonate another administrator. ### Tips and common mistakes - Individual prices or personalized products have no effect: check the two catalog settings named above - both features are off by default for performance. - Store managers see a shorter set of tabs: **Customer notes**, **Activity** and **Documents** are only in the main admin panel. - Guest customers have tabs too. A guest's **Current cart and wishlist** tab is the quickest way to see an abandoned cart. ### Related - [Finding and editing customers](https://grandnode.com/customers-manage-customers) - [Sales: orders, shipments and merchandise returns](https://grandnode.com/docs-sales) - [Online customers and customer reports](https://grandnode.com/customers-online-customers-and-reports) - [Web page](https://grandnode.com/customers-customer-record) --- Source: https://grandnode.com/customers-customer-groups # Customer groups and access control Customers Customer groups are the backbone of permissions in GrandNode. Every customer belongs to at least one group, and the group decides what the customer may do - see prices, use the cart, open the admin panel, edit products. Groups also drive business rules: free shipping, tax exemption, minimum and maximum order totals, and which products, categories or discounts a customer can see. Use this article to understand the built-in groups and to create your own, for example "Wholesale" or "VIP". ### Where to find it Go to **Customers → Customer groups**. The list shows each group with **Free shipping**, **Tax exempt**, **Active** and **Is system group**. ![Customer groups list with the six system groups: Administrators, Guests, Registered, Sales manager, Store manager, Vendors](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/customers/customer-groups-list.webp) The six built-in groups of a fresh installation. ### The built-in groups | Group | Who is in it | Default permissions | |---|---|---| | **Administrators** | Operators of the whole installation. | Everything, including the admin panel, settings, plugins and permissions. | | **Registered** | Every customer with an account. | Browse, see prices, use cart and wishlist, use the Web API. | | **Guests** | Visitors without an account. | Browse, see prices, use cart and wishlist. | | **Vendors** | Accounts that manage a vendor (a seller). | The vendor panel: own products, orders, shipments, merchandise returns, vendor reviews and reports. | | **Store manager** | Accounts that run one store in a multi-store installation. | The store manager panel: products, categories, brands, collections, orders, payments, shipments, merchandise returns, customers and reports of that store. | | **Sales manager** | Accounts linked to a sales employee. | The admin panel, limited to orders and customers assigned to their sales employee. | System groups cannot be deleted or deactivated, and their **System name** cannot be changed - GrandNode finds them by that name. You can rename them and change their other settings. ### How to create a customer group 1. On **Customers → Customer groups** click **Add new**. 2. Enter a **Name**, for example "Wholesale". A **System name** is optional - it matters only to plugins or custom code that look the group up. 3. Set the options you need (see the table below) and keep **Active** on. 4. Click **Save and Continue Edit**. The **Recommended products** and **Access control list** tabs become available. 5. Add customers to the group on each customer's **Customer Info** tab, in **Customer groups**. ![Edit page of the Registered customer group with name, system name, free shipping, tax exempt, active, password lifetime and order total limits](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/customers/customer-group-edit.webp) Customer group Info tab. ### Fields and settings | Field | What it does | |---|---| | **Name** | Name shown in the admin panel. | | **System name** | Stable identifier for code. Read-only on system groups. | | **Free shipping** | Members never pay for shipping. | | **Tax exempt** | No tax is charged to members. | | **Active** | An inactive group is ignored - its permissions and benefits do not apply. | | **Enable password lifetime** | Members must change their password after the number of days set in **Password lifetime** in customer settings. | | **Min order total amount** | Checkout is blocked until the cart reaches this total. If a customer is in several groups, the lowest minimum applies. | | **Max order total amount** | Checkout is blocked above this total. With several groups, the highest maximum applies. | The **Recommended products** tab lists products suggested to members of the group. They are ignored by default for performance; enable them in the performance section of catalog settings. The **User fields** tab stores extra key/value data for plugins and integrations. ### The access control list The **Access control list** tab shows every permission in GrandNode - **Access Admin Panel**, **Access Store Manager Panel**, **Access Vendor Panel**, **Display Prices**, **Enable Shopping Cart**, **Manage Products**, **Manage Orders** and so on - with a tick or a cross for this group. 1. Click **Edit** on a row, tick or clear **Access** and save the row. 2. For permissions with finer actions a gear icon appears. Click it to choose which actions the group may perform - for example allow **List** and **Preview** of products but not **Delete** or **Export**. ![Access control list of the Store manager group, with Access Store Manager Panel allowed and Access Admin Panel denied](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/customers/customer-group-acl.webp) The Access control list tab of the Store manager group. A customer's permissions are the sum of the permissions of all their active groups. The same matrix for all groups at once is under **Configuration → Permissions**. ### Limiting content to groups Products, categories, brands, collections, pages, news, knowledgebase articles, courses, documents and checkout attributes have a **Limited to customer groups** field. When you pick groups there, only members of those groups see the item. This is how you build a wholesale price list, members-only products or pages only approved B2B customers can read. (Discounts can be tied to groups with a discount rule instead.) The check can be switched off for the whole installation with `AccessControl:IgnoreAcl` in `appsettings.json`, which makes large catalogues faster when you do not need it. ### Tips and common mistakes - Removing **Display Prices** from Guests is the quickest way to hide prices until customers sign in. - Do not take **Access Admin Panel** or **Manage ACL** away from Administrators - you can lock yourself out. - Giving a group **Access Store Manager Panel** is not enough on its own: the account must also have **Manager of store** set. The same applies to vendors. ### Related - [Finding and editing customers](https://grandnode.com/customers-manage-customers) - [Store manager panel](https://grandnode.com/docs-store-panel) - [Vendor panel](https://grandnode.com/docs-vendor-panel) - [Web page](https://grandnode.com/customers-customer-groups) --- Source: https://grandnode.com/customers-customer-tags # Customer tags Customers A **customer tag** is a simple label you attach to customers - "vip", "wholesale", "newsletter-2026". Unlike customer groups, a tag grants no permissions and does not change prices by itself. It is a way to mark and find people, and to target them in promotions. ### Where to find it **Customers → Customer tags** lists every tag with the number of customers who have it. ![The Customer tags list with the tag kb vip used by one customer](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/customers/customer-tags-list.webp) Customers → Customer tags. ### Tag a customer 1. Open the customer under **Customers → Customers**. 2. In the **Customer tags** field on the **Customer info** tab, type a tag and press Enter. A tag that does not exist yet is created. 3. Save the customer. To see or manage everyone with a tag, open the tag from the list. The **Customers** tab lists the tagged customers and lets you remove the tag from one of them. ![The tag kb vip with its tabs Tag info, Suggested products and Customers, listing customer@kb.local](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/customers/customer-tag-customers.webp) A tag and the customers who carry it. ### Suggested products The **Suggested products** tab of a tag links products to it. Customers with the tag see those products as suggestions on the storefront (where the theme shows the suggested products block) - an easy way to show wholesale-only items or VIP previews. ### Other uses - Filter the customer list by tag to find the people you labelled. - Export the filtered list for a mailing. - Name tags in lower case with no spaces; they are easier to type and search. ### Related - [Customer groups](https://grandnode.com/customers-customer-groups) - for permissions and access - [Marketing and promotions](https://grandnode.com/docs-marketing) - [Web page](https://grandnode.com/customers-customer-tags) --- Source: https://grandnode.com/customers-customer-attributes # Customer and address attributes Customers The registration form and the address form have a fixed set of built-in fields (name, company, phone, VAT number...), which you switch on and off in the customer settings. When you need a field GrandNode does not have - "How did you hear about us?", a customer number from your ERP, a door code for deliveries - add a **customer attribute** or an **address attribute**. ### Customer attributes **Customers → Customer attributes** lists your custom fields for customers. They appear on the registration page and in **My account → Customer info**, and staff see them on the customer's page in the admin. ![The Custom customer attributes list with name, control type, required, display order and an Add new button](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/customers/customer-attributes.webp) Customers → Customer attributes. 1. Click **Add new**. 2. Enter the **Name** customers see, choose a **Control type** - drop-down list, radio list, checkboxes, textbox, multiline textbox, date picker, colour squares - and tick **Is required** if the field must be filled. 3. For list types, save and then add the values on the attribute's values tab, with one pre-selected if you like. 4. Set **Display order** to place it among the other custom fields. The **View** column shows where the attribute is used. Customer attributes can be translated like other texts. ### Address attributes **Customers → Address attributes** works the same way for addresses: the fields appear wherever an address is entered - in the address book, at checkout for billing and shipping, and in the admin. The answers are stored with the address and printed on the order details and invoice. ### Built-in fields first Before adding an attribute, check **Settings → Customer settings**, tabs **Customer form fields** and **Address form fields**. Company, VAT number, street address 2, phone, fax, date of birth, gender and more are built in; you can make each enabled or required. ### Tips and common mistakes - Every required field is one more reason to abandon registration or checkout. Make fields optional unless you truly need them. - Do not ask for sensitive data you do not need; it all falls under your privacy obligations. ### Related - [Registration, login and privacy](https://grandnode.com/customers-registration-login-and-privacy) - [The customer record](https://grandnode.com/customers-customer-record) - [Web page](https://grandnode.com/customers-customer-attributes) --- Source: https://grandnode.com/customers-registration-login-and-privacy # Registration, login and privacy Customers How people become customers and sign in is set in one place: **Settings → Customer settings**. It has four tabs - **Customer**, **Security**, **Customer form fields** and **Address form fields**. ![Customer settings, Customer tab: registration method Standard, customer name format, switches for notifications, e-mail changes, account export and deletion, and the tabs shown in My account](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/customers/customer-settings.webp) Settings → Customer settings. ### Registration method | Method | What happens | |---|---| | Standard | The account is active as soon as the form is sent. | | Email validation | The customer must click a link in an activation e-mail first. | | Admin approval | A staff member activates the account (set **Active** on the customer). Use it for B2B shops. | | Disabled | No new registrations; guest checkout may still be allowed in the Sales settings. | Other switches on the same tab: **Notify about new customer registration** (an e-mail to you), **Allow users to change email**, **Usernames enabled** (sign in with a user name instead of e-mail), **New customer has a free shipping for the first order**, and which tabs of **My account** are hidden (downloads, auctions, reviews, courses, documents...). ### Passwords and sign-in security The **Security** tab: | Setting | What it does | |---|---| | Regular Expression for password validation | The password rule, for example a minimum length and a digit. The message shown to customers explains it. | | Default password format | How new passwords are stored. Keep the hashed default; never store clear text. | | Unduplicated passwords number | How many previous passwords cannot be reused. | | Password lifetime | Days after which a customer must change the password (0 = never). Applies to customer groups that enforce it. | | Maximum login failures, Lockout time | After this many wrong passwords the account is locked for the given minutes. Slows down password guessing. | | Password recovery link. Days valid | How long a "forgot password" link works. | | Two factor authentication enabled, type | Lets customers protect their account with a second factor - an authenticator app, or a code by e-mail or SMS depending on the plugins installed. | External sign-in with Google or Facebook is provided by the authentication plugins under **Plugins → External authentication methods**. ### Privacy: customers' own data - **Allow users to export account** adds a button in My account that downloads the customer's data. - **Allow users to delete account** lets customers delete their account themselves. - Staff can export or delete a customer's data from the customer's page in the admin. - The newsletter box can require an explicit opt-in, and the **Newsletter box. Allow to unsubscribe** switch shows an unsubscribe option. What customers see in **My account**: ![The storefront Customer info page in My account with first name, last name, e-mail and the newsletter option, and the account menu with addresses, orders, returns, loyalty points and reviews](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/customers/storefront-account-info.webp) My account → Customer info. ### Tips and common mistakes - With **Email validation**, make sure outgoing e-mail works first ([message templates and e-mail accounts](https://grandnode.com/docs-content)), or nobody can finish registering. - Changing the password rule does not affect existing passwords until they are changed. ### Related - [Customer and address attributes](https://grandnode.com/customers-customer-attributes) - [Configuration](https://grandnode.com/docs-configuration) - [Web page](https://grandnode.com/customers-registration-login-and-privacy) --- Source: https://grandnode.com/customers-vendors-and-sales-employees # Vendors and sales employees Customers Two lists under **Customers** are about people who sell rather than buy: **vendors** - the sellers of a marketplace - and **sales employees** - your own sales staff who look after customers and earn a commission. ### Vendors **Customers → Vendors** lists the vendors with their e-mail and whether they are active. ![The Vendors list with Nordic Craft Collective, Alpine Rental Co. and Vintage Velo, their e-mails and active flags](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/customers/vendors-list.webp) Customers → Vendors. #### Create a vendor and give someone access 1. Click **Add new**, enter the vendor's **Name**, **Email**, description and picture, set **Active**, and save. 2. Open (or create) the customer account the vendor's staff will use. Set its **Vendor** field to the new vendor and add it to the **Vendors** customer group. 3. That person can now sign in to the vendor panel at `/vendor` and manage the vendor's products and orders. Products are assigned to a vendor on the product's General tab. The full marketplace set-up - vendor settings, applications from the storefront, vendor reviews, commissions and the vendor panel - is described in [Vendor panel (marketplace)](https://grandnode.com/docs-vendor-panel). **Customers → Vendor reviews** is where you moderate reviews customers write about vendors, the same way as product reviews. ### Sales employees **Customers → Sales employee** lists your sales staff: name, e-mail, phone, whether they are active, their **Commission** percentage and display order. Click **Add new record** to add one. Assign a sales employee to a customer on the customer's page (**Sales employee** field). Orders of that customer are then attributed to the employee, the order shows the commission, and the employee can be used in reports and filters. ### Related - [Customer groups](https://grandnode.com/customers-customer-groups) - [Vendor panel (marketplace)](https://grandnode.com/docs-vendor-panel) - [Web page](https://grandnode.com/customers-vendors-and-sales-employees) --- Source: https://grandnode.com/customers-online-customers-and-reports # Online customers and customer reports Customers Two views help you understand your customers as a group: the list of who is on the store **right now**, and the **customer reports** that rank customers by what they buy. ### Online customers **Dashboard → Online customers** (also linked from the dashboard's "Online visitors" tile) lists visitors active in the last minutes: the customer (or "Guest"), IP address, location when geo-coordinates are enabled, the time of the last activity and the last page they visited. The time window is **Online Customers minutes** in the customer settings (20 minutes by default). Recording the last visited page needs **Store last visited page** switched on in the customer settings; it costs a database write per page view, so leave it off on busy stores unless you use it. ### Customer reports **Reports → Customer reports** has three tabs: - **Customers by order total** - customers ranked by how much they spent. - **Customers by number of orders** - ranked by how often they ordered. - **Registered customers** - how many customers registered in recent periods. ![Customer reports, tab Customers by order total, with date, order status, payment status and shipping status filters and customer@kb.local with 1,422.19 total and 4 orders](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/customers/customer-reports.webp) Reports → Customer reports. Filter by date range and by order, payment and shipping status - for example only paid orders this year - and click **Search**. Click a customer to open their record. ### Activity log What a single customer did - signed in, placed an order, changed the address, and for staff what they changed in the admin - is on the **Activity log** tab of the customer's page. ### Related - [The customer record](https://grandnode.com/customers-customer-record) - [Sales reports](https://grandnode.com/sales-reports) - [Web page](https://grandnode.com/customers-online-customers-and-reports) --- Source: https://grandnode.com/marketing-overview # Marketing and promotions overview Marketing and promotions GrandNode gives you the promotional tools most stores need without extra plugins: **discounts** with coupon codes and rules, **loyalty points** that reward repeat customers, **affiliates** that track orders brought in by partners, and **newsletters** with targeted mailing campaigns. This article is the map: what each tool is for, where it lives in the admin panel, and which article explains it in detail. ### Where to find it Open the admin panel (`/admin`) and click **Marketing** in the left sidebar. The flyout groups the screens: - **Discounts** - percentage or fixed-amount reductions on products, categories, brands, collections, vendors, the order subtotal, the order total or shipping, with optional coupon codes and rules. - **Gift vouchers** - prepaid codes customers buy or receive and redeem at checkout (covered in [Sales and orders](https://grandnode.com/docs-sales)). - **Affiliates** - partners with their own tracking link; orders placed through the link are attributed to them. - **Contact Attributes** - extra fields on the storefront *Contact us* form. - **Newsletter** → **Mailing Campaigns**, **Newsletter Category**, **Newsletter Subscribers** - the subscriber list, the topics people can subscribe to, and the e-mails you send them. - **Push notifications** → **Send**, **Messages**, **Receivers** - browser push messages to customers who allowed them (requires push notification settings). - **Documents** → **Type of document**, **Document list** - documents such as contracts or invoices attached to customers, orders or vendors. ![The Marketing flyout in the admin sidebar with Discounts, Gift vouchers, Affiliates, Contact Attributes, Newsletter, Push notifications and Documents groups](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/marketing/menu.webp) The Marketing menu. Newsletter, Push notifications and Documents open sub-menus. Two marketing tools are configured elsewhere: - **Loyalty points** are switched on and tuned in **Settings → Sales** on the **Loyalty points** tab, and each customer's balance is shown on the customer's **Loyalty points** tab under **Customers → Customers**. - **Contact form messages** sent by visitors are listed under **System → Contact Us form**. ### Which tool for which goal | Goal | Tool | Article | |---|---|---| | Put a category or brand on sale for a season | Discount assigned to categories, brands or collections, with start and end dates | [Discount types and where they apply](https://grandnode.com/marketing-discount-types) | | Give a code to newsletter readers or influencers | Discount with **Requires coupon code** | [Coupon codes, limits and usage history](https://grandnode.com/marketing-coupon-codes-and-limits) | | Reward only wholesale or VIP customers | Discount rule *Must be assigned to customer group* | [Discount rules](https://grandnode.com/marketing-discount-rules) | | Free shipping above a basket value | Discount assigned to shipping plus the cart subtotal rule | [Discount rules](https://grandnode.com/marketing-discount-rules) | | Bring customers back for the next order | Loyalty points | [Loyalty points](https://grandnode.com/marketing-loyalty-points) | | Pay partners for the sales they refer | Affiliates | [Affiliates](https://grandnode.com/marketing-affiliates) | | Announce a sale by e-mail | Newsletter categories and a mailing campaign | [Mailing campaigns](https://grandnode.com/marketing-newsletter-campaigns) | ### Stores, vendors and store managers Most marketing records can be **limited to stores**: a discount, a newsletter category or a campaign that is limited to one store is ignored in the others. If you run several stores, decide early whether a promotion is global or per store. Store managers working in the store panel (`/store`) also have a Discounts screen: every discount they create is limited to their own store automatically, and they only see and edit their store's discounts. See [Store panel](https://grandnode.com/docs-store-panel) for details. ### Permissions Each screen is protected by its own permission (*Manage Discounts*, *Manage Affiliates*, *Manage Newsletter Subscribers*, *Manage Newsletter Categories*, *Manage Campaigns*, *Manage Push Notifications*, *Manage Documents*; contact form messages need *Manage Message Contact Form*). If a staff member cannot see an item in the Marketing menu, give their customer group the permission under **Customers → Customer groups** (see [Customers](https://grandnode.com/docs-customers)). ### Related - [Creating a discount](https://grandnode.com/marketing-discounts) - [Sales and customer settings](https://grandnode.com/configuration-sales-customer-settings) - where loyalty points are configured - [Sales and orders](https://grandnode.com/docs-sales) - gift vouchers, orders and what customers pay - [Web page](https://grandnode.com/marketing-overview) --- Source: https://grandnode.com/marketing-discounts # Creating a discount Marketing and promotions A discount lowers a price automatically or with a coupon code. Every discount in GrandNode has the same parts: **what** it applies to (its type), **how much** (a percentage or an amount), **when** (dates), **for whom** (requirements) and **how often** (limitations). This article walks through creating one; the next articles go deeper into types, codes and rules. ### Where to find it **Marketing → Discounts** lists all discounts with their type, value, dates, how many times they were used and whether they are enabled. ![The Discounts list with Coffee Bundle 20 percent, Free shipping over 75, KB Autumn 10%, Members 5 percent, Outdoor and Active 15 percent and Welcome 10 percent, their types, values, times used and enabled flags](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/marketing/discount-list.webp) Marketing → Discounts. ### Create a discount 1. Click **Add new**. 2. Enter a **Name**. Customers see it in the cart and on the order, so make it readable ("Autumn sale 10%"). 3. Choose the **Discount type** - for example *Assigned to categories*. See [Discount types](https://grandnode.com/marketing-discount-types). 4. Set the value: switch **Use percentage** on and enter the **Discount percentage**, or leave it off and enter a fixed **Discount amount** in the chosen **Currency code**. 5. Optionally set **Start date** and **End date**, the stores it is **Limited to**, and a **Discount limitation**. 6. Tick **Is enabled** and save. For types that apply to something (products, categories...), open the new tab **Applied to ...** and add the items. ![The Discount info tab of KB Autumn 10%: name, discount type Assigned to categories, maximum discounted quantity, cumulative switch, stores, use percentage 10, maximum amount, currency, dates, coupon code switch and limitation](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/marketing/discount-edit-info.webp) The Discount info tab. ### Fields | Field | What it does | |---|---| | Is enabled | Switches the discount on and off without deleting it. | | Use percentage, Discount percentage | A percentage off. With **Maximum allowed discount amount** you cap it, for example 10% but at most 50. | | Discount amount, Currency code | A fixed amount off, in the currency you choose. | | Maximum discounted quantity | For product-level types: how many units of a product get the discount (0 = all). "10% off, max 2 per order". | | Cumulative with other discounts | If off, the customer gets the best single discount. If on, this discount can add up with other cumulative discounts. | | Calculate by plugin | Lets a discount plugin compute the amount instead of the fixed value. | | Start date, End date | The period in which the discount works. Empty means no limit. | | Requires coupon code | The discount applies only after the customer enters a code. See [Coupon codes and limits](https://grandnode.com/marketing-coupon-codes-and-limits). | | Discount limitation | No limits, N times only, or N times per customer. | | Limited to stores | On a multi-store installation, the stores in which the discount works. | ### Usage history The **Usage history** tab lists every order that used the discount, with the date and order total. Delete an entry to give a use back to a limited discount, for example after a cancelled order. ![The Usage history tab of Members 5 percent with four orders, dates and totals](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/marketing/discount-usage-history.webp) Usage history: which orders used the discount. ### Tips and common mistakes - Test a new discount with a customer account before you announce it; check the cart, not only the product page. - Leave **Cumulative** off unless you mean it; two stacked percentage discounts are easy to forget about. - Expired discounts stay in the list; disable or delete them to keep the list readable. ### Related - [Discount types](https://grandnode.com/marketing-discount-types) - [Discount rules](https://grandnode.com/marketing-discount-rules) - [Web page](https://grandnode.com/marketing-discounts) --- Source: https://grandnode.com/marketing-discount-types # Discount types Marketing and promotions The **discount type** decides what the discount is taken from. It is chosen when you create the discount and determines which "Applied to" tab it gets. ### The types | Type | Applies to | Typical use | |---|---|---| | Assigned to order total | The whole order, after shipping and tax. | "10% off your first order" with a coupon. | | Assigned to order subtotal | The sum of the products, before shipping. | A members' discount on everything in the cart. | | Assigned to products | Products you pick on the **Applied to products** tab (or on the product's Discounts tab). | A bundle price, a clearance item. | | Assigned to all products | Every product's price. | A store-wide sale shown on product pages. | | Assigned to categories | Products in the chosen categories. | "15% off Outdoor". | | Assigned to brands | Products of the chosen brands. | A brand promotion. | | Assigned to collections | Products in the chosen collections. | A seasonal collection sale. | | Assigned to vendors | Products of the chosen vendors. | A marketplace seller's promotion. | | Assigned to shipping | The shipping charge. | Free shipping: 100% off shipping, combined with a spent-amount rule. | ### Choose what it applies to For the product, category, brand, collection and vendor types, save the discount first, then open the **Applied to ...** tab and add items. ![The Applied to categories tab of KB Autumn 10% with the category Tech & Audio \>\> Headphones & Speakers and an Add a new category button](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/marketing/discount-applied-categories.webp) Applied to categories: the discount covers this category. The same link also appears on the other side: a category, brand, collection or product has a **Discounts** tab listing the discounts of the matching type. ### Where customers see it - Product-level types (products, all products, categories, brands, collections, vendors) lower the product price itself; the product page and listings show the discounted price, when no coupon or other requirement stands in the way. - Order total, subtotal and shipping discounts appear in the cart and checkout totals. - A discount that needs a coupon or a rule the customer does not meet is applied only once the condition is met. ### Related - [Creating a discount](https://grandnode.com/marketing-discounts) - [Discount rules](https://grandnode.com/marketing-discount-rules) - [Web page](https://grandnode.com/marketing-discount-types) --- Source: https://grandnode.com/marketing-coupon-codes-and-limits # Coupon codes and limits Marketing and promotions A discount can work automatically or only after the customer types a **coupon code** in the cart. Codes let you target a newsletter, an influencer or a single customer, and measure which channel worked. ### Require a coupon code 1. Open the discount and tick **Requires coupon code** on the **Discount info** tab. Save. 2. A **Coupon Codes** tab appears. Click **Add new record** and enter a code, or generate one. 3. Add as many codes as you need. Each row shows whether that code has been **Used**. ![The Coupon Codes tab of Welcome 10 percent with the code WELCOME10, not used](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/marketing/discount-coupon-codes.webp) The Coupon Codes tab: one code, not used yet. Customers enter the code in **Enter your coupon here** on the cart page. Several codes can be entered in one cart when the discounts are cumulative. ### Limit usage | Discount limitation | Effect | |---|---| | No limits | The discount can be used any number of times. | | N times only | The discount stops working after N uses in total - "the first 100 orders". | | N times per customer | Each customer can use it N times - "once per customer". | Uses are counted from the discount's **Usage history**. When you cancel an order that used a discount, delete the usage entry to give the use back. ### Many single-use codes For personal codes - one per newsletter subscriber, for example - add one code per person and use **N times only** with N = 1 on a discount with many codes; the **Used** column shows which were redeemed. ### Tips and common mistakes - Avoid look-alike characters (0/O, 1/I) in printed codes. - A code with an end date in the past or on a disabled discount is rejected with a message in the cart - check both when a customer complains. ### Related - [Creating a discount](https://grandnode.com/marketing-discounts) - [Discount rules](https://grandnode.com/marketing-discount-rules) - [Web page](https://grandnode.com/marketing-coupon-codes-and-limits) --- Source: https://grandnode.com/marketing-discount-rules # Discount rules (requirements) Marketing and promotions A discount without requirements applies to everyone. **Discount rules**, on the discount's **Requirements** tab, narrow it down: only for members, only above a cart value, only when a certain product is in the cart. Rules come from discount rule plugins; GrandNode ships with the **Standard discount requirements** plugin. ### Add a rule 1. Open the discount and click the **Requirements** tab. 2. Under **Add a new discount requirement**, choose a **Discount rule**. 3. Fill in the rule's settings and click **Save** inside the rule's box. ![The Requirements tab of Members 5 percent with the rule Must be assigned to customer group set to Registered](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/marketing/discount-rule-customer-group.webp) A customer group rule: only registered customers get 5% off. ![The Requirements tab of Free shipping over 75 with the rule SubTotal in Shopping Cart x.xx set to 75.00](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/marketing/discount-rule-subtotal.webp) A cart subtotal rule: free shipping from 75. ### The standard rules | Rule | The discount applies when | |---|---| | Must be assigned to customer group | The customer belongs to the chosen group (Registered, a wholesale group, VIP...). | | Had spent x.xx amount | The customer's completed orders add up to at least the amount - a loyalty reward. | | SubTotal in Shopping Cart x.xx | The products in the cart are worth at least the amount. | | Customer has all of these products in the cart | Every listed product is in the cart - a "buy the set" deal. | | Customer has one of these products in the cart | At least one listed product is in the cart. | When a discount has several rules, all of them must be met. **Remove requirement** deletes a rule. ### More rules Other conditions - a date of birth, a first order, a country - can be added with discount rule plugins. Developers: see [For developers](https://grandnode.com/docs-developers). ### Related - [Creating a discount](https://grandnode.com/marketing-discounts) - [Customer groups](https://grandnode.com/customers-customer-groups) - [Web page](https://grandnode.com/marketing-discount-rules) --- Source: https://grandnode.com/marketing-loyalty-points # Loyalty points Marketing and promotions Loyalty points reward customers for buying and registering. Points are earned on completed orders and can be spent at checkout, where each point is worth a fixed amount of money. ### Turn the program on Open **Settings → Sales settings**, tab **Loyalty points**. ![The Loyalty points tab: enabled, exchange rate 1 point = 1.00 USD, minimum points to use, points for registration, points for purchases per 10 USD spent, awarded order status Complete, cancel and all-stores switches](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/marketing/loyalty-points-settings.webp) Settings → Sales settings → Loyalty points. | Setting | What it does | |---|---| | Enabled | Switches the whole program on. | | Exchange rate | How much one point is worth when spent, in the primary currency. | | Minimum loyalty points to use | Customers can pay with points only from this balance. | | Points for account registration | A welcome bonus. | | Points for purchases | "Each X spent will earn Y points". | | Awarded order status | Points are credited when the order reaches this status - usually Complete, so returns and cancellations do not cost you points. | | Points are canceled when the order status is canceled | Takes the points back from a cancelled order. | | Display number of points that will be earned | Shows the points in the cart and checkout. | | Points accumulated for all stores | One balance across all stores, instead of a balance per store. | ### What customers see In **My account → Loyalty points** customers see their balance and history. At checkout, with enough points, they can tick **Use my loyalty points** on the payment step to pay part of the order. ### Add or remove points by hand On the customer's page in the admin, the **Loyalty points** tab shows the history and lets you add or subtract points with a message - for a goodwill gesture or a correction. See [The customer record](https://grandnode.com/customers-customer-record). ### Related - [Sales and orders](https://grandnode.com/docs-sales) - [Web page](https://grandnode.com/marketing-loyalty-points) --- Source: https://grandnode.com/marketing-affiliates # Affiliates Marketing and promotions An **affiliate** is a partner who sends customers to your store - a blogger, a comparison site, a club. GrandNode remembers which affiliate a visitor came from and attributes their registration and orders to that affiliate, so you can pay a commission. ### Create an affiliate 1. Open **Marketing → Affiliates** and click **Add new**. 2. Enter the partner's name, e-mail and address, tick **Active**, and optionally a **Friendly URL name** such as `maya`. 3. Save. The page shows the affiliate's **URL** to give to the partner. ![The Affiliates list with maya.bennett@affiliatepartner.example, first and last name and active flag](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/marketing/affiliates.webp) Marketing → Affiliates. ### Affiliate links Any store address works as an affiliate link with one of these parameters added: - `?affiliateid=` - the affiliate's id; - `?affiliate=` - the friendly URL name, e.g. `https://yourstore.com/headphones?affiliate=maya`. The first affiliate a visitor arrives with is stored on their customer record; orders they place are marked with it. ### Customers and orders of an affiliate Open an affiliate to see the **Customers** and **Orders** tabs: everyone who came through them and what they bought, with filters by date and status - the basis for paying commission. ### Related - [The order list](https://grandnode.com/sales-orders-list) - [Web page](https://grandnode.com/marketing-affiliates) --- Source: https://grandnode.com/marketing-newsletter-campaigns # Newsletter, campaigns and the contact form Marketing and promotions GrandNode can collect newsletter subscribers, send them e-mail campaigns, and store the messages visitors send through the contact form - all under **Marketing**. ### Newsletter subscribers Visitors subscribe with the newsletter box in the footer or in **My account**. **Marketing → Newsletter subscriptions** lists them with their status, categories and the date. Filter the list, **Export** it to CSV, or import subscribers from a CSV file. - With **Newsletter box. Allow to unsubscribe** on (Customer settings), the box also offers unsubscribing. - A new subscription is confirmed with an activation link sent by e-mail (double opt-in). ### Newsletter categories **Marketing → Newsletter categories** lets subscribers choose topics - "New products", "Offers", "Events". When a visitor subscribes, a popup asks for the categories; campaigns can then be sent to one category only. ### Campaigns **Marketing → Campaigns → Add new** creates an e-mail campaign. ![Add a new campaign: name, subject, e-mail account, language, and a body with the list of allowed message tokens for store, subscription, shopping cart and customer](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/marketing/campaign-create.webp) A new campaign. The token list shows what can be inserted into the body. 1. On **Campaign info**, enter the **Name** (internal), the **Subject**, the **Email account** it is sent from, the **Language** of the recipients and the **Body**. Tokens such as the store name, the customer's first name or the unsubscribe link are inserted by clicking them in the list. 2. On **Conditions for campaign**, narrow the audience: stores, customer groups, customer tags, newsletter categories, and whether customers have a cart or have ordered. 3. Use **Test campaign** to send it to your own address first. 4. Check the recipients on **Email address**, then send. **History of sent emails** lists what went out. Campaign e-mails go through the queued e-mail system like all other e-mails, so a large campaign is sent over time by the scheduled task. See [Content management](https://grandnode.com/docs-content) for e-mail accounts and queued e-mails. ### Contact form Messages from the **Contact us** page are e-mailed to the store and also saved under **Marketing → Contact form** with the date, the sender, the IP address and the subject - useful when an e-mail got lost. Extra fields on the form are added with **Marketing → Contact attributes**. ### Tips and common mistakes - Always include the unsubscribe link token in a campaign body. - Test a campaign on a real mail client; the admin preview is not what Outlook shows. ### Related - [Customer tags](https://grandnode.com/customers-customer-tags) - [Content management](https://grandnode.com/docs-content) - [Web page](https://grandnode.com/marketing-newsletter-campaigns) --- Source: https://grandnode.com/marketing-documents # Documents for customers Marketing and promotions The **Documents** module lets you publish documents for individual customers - invoices from your ERP, contracts, price lists, certificates - with a status, amounts and due dates. Customers see them in **My account → Documents**. It is mostly used in B2B stores, where customers expect their paperwork next to their orders. ### Document types **Marketing → Documents → Document types** lists the kinds of documents you use. Create one per kind - Invoice, Contract, Credit note - with a name, description and display order. ![The Type of documents list with Invoice and Contract and an Add new button](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/marketing/document-types.webp) Document types. ### Documents **Marketing → Documents → Document list** lists documents with their number, name, customer e-mail, whether they are published and display order. ![The Manage document list with KB-INV-0001 Invoice September 2026 and KB-CTR-0007 Wholesale agreement 2026 for customer@kb.local](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/marketing/documents-list.webp) Marketing → Documents → Document list. #### Create a document 1. Click **Add new**. 2. On **Document info** enter the **Number** and **Name**, choose the **Document type** and **Status**, optionally a **Sales employee** and a **Link**, and a description. 3. Choose the customer, attach the file (for example the PDF of the invoice) and set **Published**. 4. On **Accounting Information** enter the currency, the total and outstanding amounts, the quantity, and the document and due dates. 5. Save. ![Editing the document Invoice September 2026: number KB-INV-0001, name, document type Invoice, status Approved, sales employee, link and description; tabs Accounting Information and User fields](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/marketing/document-edit.webp) A document. | Status | Typical use | |---|---| | Open | Created, not yet processed. | | Processing | Being handled, e.g. a contract under review. | | Approved | Valid and final. | | Closed | Settled or expired. | | Cancelled | No longer valid. | A document can also refer to an order, a product, a category or another entity, and documents can be nested (a parent document with its attachments). The **Documents** tab on a customer's page lists that customer's documents. ### What customers see In **My account → Documents** customers see their published documents with number, type, status, amounts and dates, and can download the files. The tab can be hidden with **Hide 'Documents' tab** in the customer settings. ### Tips - Documents are often created automatically by an ERP integration through the web API, rather than by hand. - Unpublished documents are kept but not shown to the customer - useful for drafts. ### Related - [The customer record](https://grandnode.com/customers-customer-record) - [The REST API](https://grandnode.com/developers-rest-api) - [Web page](https://grandnode.com/marketing-documents) --- Source: https://grandnode.com/marketing-push-notifications # Push notifications Marketing and promotions Push notifications are short messages that appear on the customer's screen through the browser, even when your store is not open - a new collection, a flash sale, back in stock. GrandNode sends them through **Firebase Cloud Messaging** (Google), so you need a free Firebase project. ### Set up 1. Create a project in the Firebase console and add a web app. Copy its configuration values. 2. Open **Settings → Push notifications settings**, tick **Enabled**, and enter the **Private Api Key**, **Public Api Key**, **Auth Domain**, **Project Id**, **Storage Bucket**, **Sender Id** and **AppId**. 3. Decide whether guests may subscribe (**Allow guest notifications**) and save. ![Push notifications settings with a note that Firebase is used, a warning to press Save after every upgrade, Enabled and Allow guest notifications switches and the Firebase key fields](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/marketing/push-settings.webp) Settings → Push notifications settings. > As the warning on the page says: press **Save** on this page again after every GrandNode upgrade - the upgrade rewrites the registration script and the settings have to be written into it again. ### Who receives them When push notifications are enabled, the storefront asks visitors whether they want to receive notifications. Those who allow it appear in **Marketing → Push notifications → Receivers**, where you can also remove a receiver. ### Send a notification 1. Open **Marketing → Push notifications → Send**. 2. Enter the **Title** and **Message text**, the **Click Url** the notification opens (a product, a category, a page), and optionally a **Picture**. 3. Click **Send**. The message goes to all receivers. ![The Send push notification page with title, message text, click URL and picture upload, and a Send button](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/marketing/push-send.webp) Marketing → Push notifications → Send. **Messages** lists the notifications that were sent. ### Tips - Browsers show the permission prompt only on HTTPS. - Send rarely and only what is worth an interruption; a visitor who blocks notifications cannot be asked again. ### Related - [Newsletter, campaigns and the contact form](https://grandnode.com/marketing-newsletter-campaigns) - [Web page](https://grandnode.com/marketing-push-notifications) --- Source: https://grandnode.com/content-overview # Content management overview Content management Besides products and orders, every store needs words: an About us page, shipping and returns rules, a blog, a news feed, help articles and the e-mails the store sends to customers. In GrandNode all of this is managed from the admin panel, most of it from the **Content** menu. This article is the map: what each screen is for, where the related settings live, and which panel (administrator, store manager) can use it. ### Where to find it Open the admin panel (`/admin`) and click **Content** in the left sidebar. A panel slides out with the content screens grouped in two columns. ![The Content menu opened in the admin sidebar, listing Landing pages, Message templates, Knowledgebase, News, Blog and Manage courses](https://grandnode.com/Plugins/Theme.GrandNodeCom/Content/kb/content/menu.webp) The Content menu in the admin panel. ### What is in the Content menu | Menu item | What it is for | |---|---| | **Landing pages** | Static pages of the storefront (About us, Conditions of use, Shipping & returns, the home page welcome text). Each page has a title, a rich-text body, SEO fields, a layout, menu and footer placement, visibility dates and access rules. See [Landing pages](https://grandnode.com/content-pages). | | **Message templates** | The e-mails GrandNode sends automatically: order placed, shipment sent, password recovery, new review, and many more. See [Message templates and e-mail accounts](https://grandnode.com/content-message-templates). | | **Knowledgebase** | A help centre made of categories and articles, with optional customer comments. The documentation you are reading is built with it. See [Knowledgebase](https://grandnode.com/content-knowledgebase). | | **News** | Dated announcements with a short and a full text, optional comments and an RSS feed. See [News](https://grandnode.com/content-news). | | **Blog** (Blog categories, Blog posts, Blog comments) | A blog with categories, tags, pictures and comment moderation. See [Blog](https://grandnode.com/content-blog). | | **Manage courses** (Levels, Courses) | Online courses with subjects and lessons, sold together with a product. They are a separate topic and are not covered in this module. | ### Related screens in other menus Some screens that shape content live under other menus, because they are also used by other parts of the system: - **Configuration → Layouts → Page layouts** (and category, brand, collection and product layouts) decide which Razor view renders a page. See [Page layouts and other layouts](https://grandnode.com/content-layouts). - **Configuration → Email Accounts** holds the SMTP accounts message templates send through. - **System → Message Queue** shows every e-mail GrandNode has generated, whether it was sent, and lets you resend it. See [Message queue](https://grandnode.com/content-message-queue). - **Plugins → Widgets** turns on widget plugins such as the home page slider or the Facebook pixel. See [Widgets and widget zones](https://grandnode.com/content-widgets). - **Settings → Content** has the **Blog**, **News** and **Knowledgebase** sections: they enable or disable each feature on the storefront and set page sizes, home page blocks and comment rules. ### One editor for all rich text Page bodies, blog posts, news, knowledgebase articles, message template bodies and product descriptions all use the same HTML editor, with a file manager for pictures. Whatever you type is cleaned by an allowlist HTML sanitizer before it is saved, which is why a pasted `