> ## Documentation Index
> Fetch the complete documentation index at: https://help.clinikehr.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Run an online store

> List products from your inventory, publish a storefront at your own address, and take orders online alongside your clinical work.

export const StillStuck = ({topic}) => <div className="ck-callout ck-callout--note" role="note">
    <p className="ck-callout__body">
      <strong>Still stuck{topic ? ` with ${topic}` : ''}?</strong>{' '}
      Check <a href="/platform/help/troubleshooting">Troubleshooting</a> first —
      it covers the failures we see most often. If that does not resolve it,{' '}
      <a href="/platform/help/contact-support">contact support</a> and include
      your workspace name and the time the problem happened, so we can find the
      matching entry in your audit log.
    </p>
  </div>;

export const TaskHeader = ({before, time, after}) => <div className="ck-task">
    {before ? <div className="ck-task__cell">
        <div className="ck-task__title">Before you start</div>
        <p className="ck-task__body">{before}</p>
      </div> : null}

    {time ? <div className="ck-task__cell">
        <div className="ck-task__title">Takes about</div>
        <p className="ck-task__body">{time}</p>
      </div> : null}

    {after ? <div className="ck-task__cell">
        <div className="ck-task__title">When you're done</div>
        <p className="ck-task__body">{after}</p>
      </div> : null}
  </div>;

export const Path = ({steps = []}) => <span className="ck-path">
    {steps.map((s, i) => <span key={i} className="ck-path__step">
        {i > 0 ? <span className="ck-path__sep" aria-hidden="true">
            ›
          </span> : null}
        {s}
      </span>)}
  </span>;

export const Availability = ({editions = ['all'], plans, roles, note}) => {
  const list = editions.includes('all') ? ['clinic', 'pharmacy', 'lims'] : editions;
  return <div className="ck-avail" role="note" aria-label="Feature availability">
      <span className="ck-avail__label">Available in</span>

      {list.map(e => <span key={e} className={`ck-pill ck-pill--${e}`}>
          {EDITION_LABELS[e] || e}
        </span>)}

      {plans ? <span className="ck-avail__label">Plan</span> : null}
      {plans ? <span className="ck-pill ck-pill--plan">{plans}</span> : null}

      {roles ? <span className="ck-avail__label">Who</span> : null}
      {roles ? <span className="ck-pill ck-pill--role">{roles}</span> : null}

      {note ? <span className="ck-avail__note">{note}</span> : null}
    </div>;
};

<Availability editions={['clinic']} plans="Starter, Essential and Team — Free has no storefront" roles="Owners and managers" note="Needs inventory items to sell and a connected payment account" />

The store sells what your inventory already holds — supplements, devices, dressings, anything you stock — at a public address clients can reach without signing in. Stock and cost stay in inventory; the store is the shop window.

<Path steps={['Sidebar', 'Store']} />

<TaskHeader before="Inventory items to sell, a connected payment account, and a plan above Free" time="Fifteen minutes for your first product and a published page" after="A live storefront taking orders, with stock drawn from inventory" />

## What you're looking at

| Tab                 | What it holds                                                                |
| ------------------- | ---------------------------------------------------------------------------- |
| **Products (\{n})** | Everything you have listed                                                   |
| **Orders (\{n})**   | What clients have bought                                                     |
| **Overview**        | **Revenue (paid)**, **Orders**, **Avg. order value** and **Active products** |

The header carries **Collections**, **Discounts**, **Share store** (or **Set up link** before you have an address), **Sell from inventory** and **New product**.

Your shop lives at `/store/<address>` — the address you claim under **Settings** → **Store Page**. Until you claim one and switch the page **Live**, there is nothing public to visit even if **Products** is full. Selling also needs a connected payment account: without one the screen shows **Connect payouts to sell products**.

A new practice sees an empty **Products** tab and zeroes on **Overview**. Money figures are in your practice's own currency; see [Currency](/platform/settings/currency).

## List something for sale

There are two routes in, and the fast one is usually right.

### The fast route — sell from inventory

<Steps>
  <Step title="Open Sell from inventory">
    The sheet explains itself: "Publish an existing inventory item as a store product. We'll create a draft you can finish editing." Search with "Search inventory by name or SKU…".
  </Step>

  <Step title="Select Sell on the item">
    You get a **draft** product linked to that inventory item, confirmed with "Draft created for \{item}".
  </Step>

  <Step title="Finish and publish it">
    A draft is not on sale. Open it, add whatever it needs, and set **Status** to **Active (published)**.
  </Step>
</Steps>

### The full route — build the product

Use the product editor when the product needs a description, photographs or more than one size. It says what it is: "Details, variants, and photos. Stock + cost come from the linked inventory item."

<Steps>
  <Step title="Enter the details">
    Give it a **Title** and a **Description**, set **Type** (**Physical**, or **Digital** on Team), pick a **Collection**, and set **Status** — **Draft**, **Active (published)** or **Archived**. **Featured** and **Members only** decide where and to whom it shows.
  </Step>

  <Step title="Set tax if this one differs">
    Turn on **Charge tax / VAT**, then set **Rate %** and **Label**, and **Prices include tax** if your prices are gross.
  </Step>

  <Step title="Save once to create it">
    The product is created on the first save. **Photos** and extra variants attach to a product that already exists, so save before you try to add them.
  </Step>

  <Step title="Add variants">
    Under **Variants**, select **Add variant** and name it — "Variant name (e.g. 100ml)". The variant you start with is named **Default**; rename it if you sell more than one size. Each carries its own **Price**, **Compare-at (optional)** and **SKU (optional)**, and links to an **Inventory item (stock source)** — leave that as "Not stock-tracked" only for something you do not hold.
  </Step>

  <Step title="Save each variant in turn">
    Variants save one at a time, not in a batch. Save each before moving to the next, or the one you are typing into is the only one that sticks.
  </Step>
</Steps>

<Note>
  **Stock and cost are not editable in the store.** Both come from the linked inventory item, so there is one number for how many you have, wherever you look. Change stock in [Inventory](/practice/ops/inventory), not here.
</Note>

## Publish the storefront

Claim your address and style the page under **Settings** → **Store Page**: the address, the headline and success message, accent colour and layout, featured products, and your default tax rate. Then switch it from **Off** to **Live** and save — both, or the page stays private. Full walkthrough: [Store page](/practice/settings/store-page).

## What your plan allows

| Plan      | Active products          | Also                                                             |
| --------- | ------------------------ | ---------------------------------------------------------------- |
| Free      | 0 — no storefront at all | —                                                                |
| Starter   | 100                      | —                                                                |
| Essential | 1,000                    | —                                                                |
| Team      | Unlimited                | Digital products, embeddable storefront, abandoned-cart recovery |

Three limits people meet early:

* On Free: "Selling products is available on the Starter plan and above. Upgrade to open your store."
* "Digital products are available on the Team plan. Upgrade to sell downloads."
* "Embedding your storefront is a Team feature. Upgrade to add it to your website."

At the product cap: "You've reached your plan's limit of 1,000 products. Upgrade for more."

A custom address such as `shop.yourpractice.example` is a Team feature — see [Custom domains](/platform/settings/custom-domain).

<Warning>
  A subscription that lapses drops you to Free, and Free has no storefront. Your products are not deleted, but the public page stops selling until the plan is active again. See [Change your plan](/platform/plans/change-plan).
</Warning>

## Who can do this

| Action                                          | Who by default      | The permission, in the product's words |
| ----------------------------------------------- | ------------------- | -------------------------------------- |
| Open **Store**                                  | Owner, manager      | Role — no permission of its own        |
| List or edit a product                          | Owner, manager      | Role                                   |
| Change the linked stock item                    | Owner, manager      | Role                                   |
| Record payment against an order                 | Front desk, billers | **Add client payments**                |
| Publish or unpublish the storefront             | Owner, manager      | Role — it is a settings tab            |
| See **Revenue (paid)** and **Avg. order value** | Owner, manager      | **View financial dashboard**           |

* **Enforcement is opt-in, per person.** Someone never saved in the permissions sheet is unrestricted; the sheet warns **"Saving starts enforcing"**.
* **A denied action is recorded; an allowed one is not.** Hiding **Store** from a sidebar is a convenience, not a security boundary.

A figure you may not see renders as a dash, not a zero. See [Staff permissions](/platform/team/permissions).

## Check it worked

* The product appears under **Products** and counts towards **Active products** on **Overview**.
* Your store address loads in a private browser window, with the product and its price visible.
* A test order appears under **Orders**, and the linked inventory item's on-hand figure has dropped.

## Common issues

<AccordionGroup>
  <Accordion title="I cannot edit the stock level or the cost">
    That is deliberate. Both come from the linked inventory item — change them in [Inventory](/practice/ops/inventory).
  </Accordion>

  <Accordion title="My variant did not save">
    Variants save individually, and only after the product itself exists. Save the product first, then save each variant in turn.
  </Accordion>

  <Accordion title="The store address is refused">
    Addresses are checked for format, reserved words, and uniqueness across every ClinikEHR workspace. Choose something more specific to your practice.
  </Accordion>

  <Accordion title="The page is not public">
    The switch must read **Live** *and* you must select **Save**. Setting one without the other leaves the store off.
  </Accordion>

  <Accordion title="I have hit the product limit">
    Starter allows 100 active products and Essential 1,000. Deactivate what you are not selling, or move up a plan.
  </Accordion>

  <Accordion title="An order came in for something out of stock">
    The store sells against inventory, so this means the inventory figure was wrong. Reconcile with a stock count — see [Stock counts](/pharmacy/inventory/stock-counts).
  </Accordion>
</AccordionGroup>

## FAQ

<AccordionGroup>
  <Accordion title="Do I need a payment account to sell?">
    Yes. Online checkout collects through your connected provider — see [Online payments](/practice/settings/online-payments).
  </Accordion>

  <Accordion title="Do store orders appear in Billing?">
    Orders live on the **Orders** tab and their takings roll into the Store report. They do not raise a clinical invoice. See [Reports and analytics](/practice/insights/analytics).
  </Accordion>

  <Accordion title="Can a client buy without a client record?">
    Yes — the storefront is public and does not require a sign-in. That is why it is a shop, not the [client portal](/practice/settings/portal).
  </Accordion>

  <Accordion title="Can one product draw from two inventory items?">
    Each variant links to one item. A product with three sizes is three variants linked to three items.
  </Accordion>

  <Accordion title="What happens to listed products if I stop stocking something?">
    The listing stays but sells against a stock figure of zero. Deactivate the product so clients do not order what you cannot fulfil.
  </Accordion>
</AccordionGroup>

<StillStuck topic="the online store" />
