> ## 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.

# Record your first sale

> Ring up one product at the till, take cash, print the receipt, and see stock come down — the whole loop in two minutes.

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={['pharmacy']} plans="All plans" roles="Anyone with 'Dispense and sell at the till'" />

Step 3 of the [setup checklist](/pharmacy/get-started) — "Ring up a sale at the point of sale — it works offline too." This page walks one simple cash sale end to end so you can see the whole loop: product out, money in, stock down, receipt printed.

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

<TaskHeader before="At least one stock item that is set to sell at the till" time="2 minutes" after="A completed sale with a receipt number, stock drawn down, and the day's tiles updated" />

## Ring one up

<Steps>
  <Step title="Open the till">
    Select **POS** in the sidebar. The page is headed **Sales POS** with today's date and two tiles for the day so far — **\{n} Sales** and **\{amount} Today**.
  </Step>

  <Step title="Add a product">
    Select any tile in the **Available Products** grid, or search for the item by name in "Search or scan (name, generic, brand, barcode)…". It lands in the **Cart** card on the right.

    The grid shows 100 tiles at a time — the badge says **100 of \{total}** — so search rather than scroll if your catalogue is bigger than that.
  </Step>

  <Step title="Leave the customer as walk-in">
    The **Customer** card defaults to **Walk-in**, which needs nothing. That is the right choice for a first test sale; attaching a registered customer matters only for loyalty, account balance and credit.
  </Step>

  <Step title="Take cash">
    Under **Payment Method**, leave **Cash** selected and enter what the customer handed over in **Amount Received** — or use a **Quick Select** button. **Change Due** works the change out for you.
  </Step>

  <Step title="Complete the sale">
    Select **Complete Sale • \{total}**. Pressing **Enter** does the same thing from anywhere on the till.
  </Step>

  <Step title="Print the receipt">
    The **Sale Complete!** panel shows the **Sale Number**, the **Total** and the **Change Due**. Select **Print Receipt** to print, or **New Sale** to serve the next customer.
  </Step>
</Steps>

## Check it worked

* A toast reads **Sale completed successfully!** and the cart is empty.
* The day tiles at the top of the till have gone up by this sale.
* The sale is in **Sales History** on the [Sales page](/pharmacy/money/sales) with a receipt number of the form **POS-20260819-A1B2C3** and a **Completed** status.
* The item's stock in **Inventory** has fallen by what you sold, taken from the lot that expires soonest.

## What you have just proved

<AccordionGroup>
  <Accordion title="The till works without the internet">
    The same steps complete a sale during an outage. It is saved on the device with a provisional number and syncs itself when the connection returns — see [Selling when the internet is down](/pharmacy/pos/offline).
  </Accordion>

  <Accordion title="Stock is real, and honest about being stale">
    The figures at the till come from your inventory, and when they are not fresh the header says **Stock as of HH:MM** rather than pretending.
  </Accordion>

  <Accordion title="The receipt is scannable">
    A completed sale's receipt carries its number as a barcode, so scanning it on the Sales page pulls the sale straight back up for a return — see [Returns, voids and amendments](/pharmacy/pos/returns).
  </Accordion>
</AccordionGroup>

## If something goes wrong

<AccordionGroup>
  <Accordion title="The product grid is empty">
    You have no sellable stock yet. **Add New Medication** on the empty grid opens the inventory **Add item** sheet — see [Add your first stock item](/pharmacy/get-started/first-stock-item).
  </Accordion>

  <Accordion title="'… is out of stock'">
    The item has no recorded stock and **Selling without stock** is switched off. Receive the delivery in Inventory, or turn the setting back on so oversells are logged for reconciliation instead of refused.
  </Accordion>

  <Accordion title="A warning says the item has no recorded stock">
    The sale is allowed and the shortfall is logged: "\{n} item(s) sold beyond recorded stock — logged for reconciliation in Inventory." Clear it on **Inventory › Reconciliation** once the delivery is booked in.
  </Accordion>

  <Accordion title="'… requires a witnessed dispense — use the inventory Fill Rx flow instead of POS.'">
    That item is flagged as controlled and needs a countersignature, which the till cannot capture. Dispense it from [the dispensing station](/pharmacy/dispensing/station) instead.
  </Accordion>

  <Accordion title="Nothing printed">
    In a browser you get the print dialog rather than a silent print. On a counter machine running the desktop app, see [Print and reprint receipts](/pharmacy/pos/receipts) — a blank or cut-short receipt is almost always the paper setting.
  </Accordion>

  <Accordion title="I cannot open POS at all">
    The till needs the "Dispense and sell at the till" permission; without it the page refuses access and tells you to contact your administrator. See [Staff permissions](/platform/team/permissions).
  </Accordion>
</AccordionGroup>

<StillStuck topic="your first sale" />

The full point-of-sale reference — discounts, held carts, every tender and the offline behaviour — starts at [Ring up a sale](/pharmacy/pos/index).
