Customer portal
A branded, self-service portal where your customers register, place orders, submit payments, and track inventory.
The customer portal is a branded, self-service storefront that gives your customers direct access to your business. Each portal lives at a URL based on your account slug (or on a custom domain you connect), carries your company logo and branding, and lets customers register, place orders, pay, message your team, and monitor their account without involving your internal team.
Why the customer portal matters
- Self-service ordering: customers browse products, build orders with the correct pricing already applied, and submit them on their own schedule
- Branded experience: the portal carries your logo, favicon, and account identity — and optionally your own domain — so customers interact with your brand rather than a generic interface
- Payment collection: customers pay directly through the portal via Stripe, reducing manual invoicing and accelerating cash flow
- Operational visibility: customers can review order history, download pro-forma documents, and see inventory you are holding for them
- A direct line to your team: customers can message you from the portal, and their messages land in a support case routed to the people you nominate
Account slug and branding
By default every portal URL is built from your account slug, a short, unique identifier for your OpenMRP account. The slug determines the base URL for all customer-facing pages:
- Login:
/<account-slug>/auth/login - Register:
/<account-slug>/auth/register - Dashboard:
/<account-slug>/dashboard
You can also serve the portal from a domain you own, in which case the slug disappears from the URL entirely. See Custom domain below.
Branding is configured on the Customer Portal tab of account settings and applies across the whole portal:
- Logo: shown throughout the experience. If no logo is configured, the default OpenMRP branding is used.
- Favicon: a small square image shown in the browser tab while a customer is on your portal. If no favicon is uploaded, the default OpenMRP icon is used.
Together this means every customer touchpoint (login, registration, ordering, account management) feels like an extension of your own website.
Custom domain
An account can connect one custom portal domain, so customers reach you at an address such as shop.acme.com instead of an OpenMRP URL. Connect it from the Customer Portal tab of account settings:
- Enter the domain. A subdomain such as
shop.yourdomain.comis recommended; it can be pointed at the portal with a single CNAME record. Apex domains such asyourdomain.comare supported but need an A record and, depending on your DNS provider, extra support. - Publish the DNS records. Connecting the domain returns the exact records to create at your DNS provider. Each record is either a routing record (points traffic at the portal) or an ownership record (proves you control a domain that is claimed elsewhere).
- Verify. The domain starts as pending. Run the verification check after publishing the records; DNS changes can take a few minutes to propagate, so you may need to check more than once. The API also reports securing while the TLS certificate is being issued, though the dashboard panel keeps showing "Pending verification" until the domain reaches verified — the certificate is live and the portal answers on the domain.
Once a domain is verified:
- Requests to that host are mapped back to your account and served as your portal, with the
/<account-slug>prefix stripped from the visible URL. - Requests to the slug-based address redirect to the custom domain, so there is one canonical portal address.
- Portal links OpenMRP generates in customer emails — the password-reset link, and the one-click login link sent when someone tries to register with an email that already has an account — point at the custom domain rather than the slug URL.
Removing the domain detaches it immediately: customers fall back to the slug-based portal address, and you can safely delete the DNS records you published. Because an account holds only one custom domain, removing it is also how you free the slot up for a different one.
Registration
Customers access the portal by registering through one of two paths, both available from the same registration page.
Existing customers
If a customer already has a record in your system, they can link their portal account to it:
- Create a user account (email and password)
- Enter their customer number (found on invoices or order confirmations)
- Submit the form to link their user to the existing customer record
This connects the portal user to all existing pricing, terms, and order history already configured for that customer.
New customers
New customers go through a three-step registration:
- Customer details: company name, customer group, shipping terms, and payment terms
- Billing address: full address with search-assisted entry
- Contact information: phone number
When only one option exists for a field (e.g., a single customer group), it is selected automatically so the customer does not need to make unnecessary choices.
Registration flows
You configure what customers see during registration through customer registration flows in your dashboard. Registration flows control which customer groups, shipping terms, and payment terms are available to new customers signing up through the portal. This lets you tailor the registration experience: for example, offering only prepaid payment terms to portal customers while reserving net terms for customers you set up internally.
Discount codes at registration
A discount code can be passed to the portal as a URL parameter. When present, the code follows the customer through registration and is automatically applied to their first order, making it easy to run promotions or onboard new customers with an introductory offer.
Placing orders
Once registered, customers create sales orders through a guided, multi-step flow.
Order creation steps
The portal checkout has three steps, with a running order summary alongside them. An in-progress cart is saved locally, so a customer who leaves and comes back is offered the option to pick up where they left off or start over.
- Products: search the catalog by SKU or product name, browse it by category, quick-add from a frequently ordered products list, or bulk upload an Excel (
.xlsx) or CSV file. A downloadable template shows the expected columns. - Shipping: choose the ship-to address from the customer's saved addresses or add a new one.
- Review: check line items and quantities, enter a PO number and an optional note, set the acknowledgement and invoice email contacts for the order, apply or remove a discount code, pick a shipping service, and confirm the total before submitting.
Shipping options and rates
The shipping choices on the review step come from rate shopping: OpenMRP quotes every carrier and service level configured on your account, filtered to the ones you have enabled for the portal, and returns them sorted cheapest first. Rates for carriers linked to a Shippo carrier account come from Shippo. Carriers with no Shippo carrier account are still listed, at a rate of 0 — they are options the customer can pick, not priced quotes. Carriers that are mapped to Shippo are dropped from the list entirely when your account has no Shippo integration connected, or when their rates cannot be fetched, rather than being shown at a fabricated zero.
Your freight rules are applied on top of those quotes, and they can legitimately change what a customer sees:
- Freight exempt: if any product line on the order is freight exempt, or if the customer (or one of its groups) is freight exempt, or if the customer's shipping term is free freight, no options are returned at all and the result is marked
exemption_type: freight_exempt. The portal shows "Free shipping" and charges nothing for freight. An empty option list here is the expected outcome, not a misconfiguration. - Flat rate: a flat-rate shipping term replaces every option's carrier rate with the term's flat amount (
exemption_type: flat_rate). The customer is charged that amount whatever the carrier would have quoted. - Minimum order met: when the customer's shipping term sets a free-shipping minimum order value and the order total is strictly above it, eligible options are rated at zero (
exemption_type: minimum_order_met). If the term restricts free shipping to specific service levels, only those are zeroed and the rest keep their carrier or flat rate. A met minimum takes precedence over a flat rate. - None: standard carrier rates apply with no exemption.
The same rules drive the rate estimates on internally created orders — see shipping for the full picture.
Pricing
Products in the portal are priced using the same pricing stack as internal orders:
- Base product price: the product's default sell price
- Customer prices: product-line-specific pricing that overrides the base price when a matching customer price exists
- Volume discounts: tiered percentage discounts based on order quantity
- Discount codes: order-level percentage or fixed-amount reductions
Customers always see the correct resolved price for their account. There is no need for manual price entry or negotiation through the portal.
Bulk product upload
For customers ordering many SKUs at once, the portal supports uploading an Excel or CSV file with columns for SKU, quantity, and unit. A downloadable template is available to ensure the correct format.
Payments
When your account has Stripe connected, customers are routed to a checkout page immediately after placing an order. The checkout experience includes:
- Payment method selection: card entry via Stripe's secure payment form
- Save payment method: option to store a card for future orders
- Order summary: order number, total amount, and quantity displayed alongside the payment form
If Stripe is not connected, orders are submitted without an immediate payment step and follow your standard invoicing workflow.
Order history
The Sales Orders page gives customers a complete view of their orders with:
- Status tabs: filter by All, Pending, Processing, or Fulfilled
- Search: find orders by keyword
- Pagination: navigate through large order sets
- Order detail: click into any order to see full line items, addresses, terms, and status
| Status | What it means |
|---|---|
| Pending | Order is an estimate, not yet issued |
| Processing | Order has been issued and is being worked |
| Fulfilled | Order has been completed |
Pro-forma documents
Customers can print or download a pro-forma document from any order's detail or checkout page. The portal uses a print-friendly layout that outputs a formatted order confirmation suitable for internal approvals, records, or advance payment processing.
Inventory
The Inventory page shows any inventory you are holding on behalf of the customer. The table displays:
| Column | What it shows |
|---|---|
| SKU | Product identifier |
| Lot Number | Batch or lot reference |
| Owner Account | Who owns the inventory |
| Holder Account | Where the inventory is physically held |
| Remaining Quantity | How much is left, with unit of measure |
Customers can search, filter, and export this data for their own planning.
Messages and support
The Messages page gives customers the same chat surface your team uses internally, with a deliberately reduced set of capabilities. Customers can read and reply in threads they are part of, but they cannot start ad-hoc conversations, create groups, add or remove participants, or attach linked records to a message. In place of all that, they get a single Contact support action.
Contact support
Contact support opens the customer's support case with you — or reopens the one they already have. A customer has exactly one support case per account relationship, so repeat clicks return the same thread rather than piling up new ones. When the case is created, the people you have designated to handle support are seated on it as participants, so the customer's first message has a definite recipient rather than landing in an unattended queue.
The button only appears once support routing is configured. The portal checks support availability before offering the action, and opening a first case is refused unless your account resolves to a support route whose group has at least one active member. An account that never sets one up therefore ships a portal where support simply appears to be missing — nothing is broken, the feature is gated. Configure it on the Support tab of account settings.
Re-pointing or clearing the route later only affects cases opened from then on. People already seated on an open case stay on it.
What customers can and cannot see
Messages carry a visibility, and the portal is filtered on it server-side:
| Visibility | Visible to the customer |
|---|---|
| External | Yes — messages sent to or received from the customer |
| System | Yes — system events both sides should see |
| Internal | No — team-only notes, never returned to a portal caller |
Internal notes are excluded from the customer's message list, from the conversation preview, and from their unread count, so your team can discuss a case in the same thread the customer is reading without exposing anything.
Your team works the other side of these threads from the internal inbox — see Inbox.
Account management
The Account page has three tabs:
- General: update name and email address
- Addresses: review the customer's saved addresses, split into active and drop-ship, with search
- Security: change password with validation requirements (minimum 8 characters, mixed case, digit, and special character)
Portal navigation
The customer dashboard is organized into three sections:
| Section | Pages |
|---|---|
| Sales | Sales Orders |
| Inventory | Inventory |
| General | Messages, Account |
Messages carries a live unread badge in the sidebar, so a reply from your team is visible without opening the page.
The dashboard home page provides quick-access cards for viewing order history, creating a new order, managing account settings, and jumping straight to saved addresses.
Where the customer portal connects
- Customers: portal users are linked to customer records, inheriting all defaults and pricing
- Customer prices and volume discounts: applied automatically when customers add products to orders
- Discount codes: redeemable during order review
- Sales orders: portal orders follow the same lifecycle as internally created orders
- Payment terms and shipping terms: defaults from the customer record are applied to portal orders
- Customer portal settings: logo, favicon, portal slug, and custom domain
- Support routing: decides who receives the messages customers send from the portal
Next: Ship Products