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:

  1. Enter the domain. A subdomain such as shop.yourdomain.com is recommended; it can be pointed at the portal with a single CNAME record. Apex domains such as yourdomain.com are supported but need an A record and, depending on your DNS provider, extra support.
  2. 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).
  3. 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:

  1. Create a user account (email and password)
  2. Enter their customer number (found on invoices or order confirmations)
  3. 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:

  1. Customer details: company name, customer group, shipping terms, and payment terms
  2. Billing address: full address with search-assisted entry
  3. 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.

  1. 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.
  2. Shipping: choose the ship-to address from the customer's saved addresses or add a new one.
  3. 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:

  1. Base product price: the product's default sell price
  2. Customer prices: product-line-specific pricing that overrides the base price when a matching customer price exists
  3. Volume discounts: tiered percentage discounts based on order quantity
  4. 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
StatusWhat it means
PendingOrder is an estimate, not yet issued
ProcessingOrder has been issued and is being worked
FulfilledOrder 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:

ColumnWhat it shows
SKUProduct identifier
Lot NumberBatch or lot reference
Owner AccountWho owns the inventory
Holder AccountWhere the inventory is physically held
Remaining QuantityHow 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:

VisibilityVisible to the customer
ExternalYes — messages sent to or received from the customer
SystemYes — system events both sides should see
InternalNo — 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:

SectionPages
SalesSales Orders
InventoryInventory
GeneralMessages, 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

Next: Ship Products