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

# Troubleshooting

> Find what went wrong from what you see on screen, why it happens and what to do, from sign-in to deliveries, WhatsApp, the API and MCP.

Use this page when something did not work. Entries are grouped by area and named after what you see. Each one says why it happens, what to do, and which page explains the topic in full.

The console shows its messages in the language you chose. This page quotes them in English, in bold, exactly as the console writes them.

<Tip>
  Many problems come from access. A person's access has three parts: permissions, locations and warehouses. No role includes inventory, orders, approvals, delivery or report permissions, not even **Owner**. When a screen is empty or refuses an action, check [Roles and permissions](/docs/en/account/roles-and-permissions) first.
</Tip>

## Before you contact support

Collect this before you write, so the team can find the problem on the first reply:

| What | Where to find it |
| - | - |
| The dental clinic name | The **Dental clinic** selector at the top of the sidebar, or **Choose a dental clinic**. |
| Your account email | In the sidebar, above **Sign out**. Write from that address if you can. |
| The screen address | The browser's address bar, for example `console.muveya.com/fulfillment/…/pick`. |
| The date, time and time zone | When it happened, as precisely as you can. |
| The exact message | Copy the text shown on screen. |
| The record | The order number (for example `#42`), the box code (for example `BX-7K3QM9`), the SKU (for example `GLV-NIT-M`), or the import status page address. |
| For API and MCP errors | The `requestId` of the problem document, the operation, and for `/v1` only, the API key name or prefix. |
| For WhatsApp | The time of the message and the option you were using. |

<Warning>
  Never send a password, a verification code, a full API key or a patient reference (`patientRef`, care references or anything that identifies a patient). Do not send screenshots that show them either. Support never asks for them.
</Warning>

## Sign-in and access

<AccordionGroup>
  <Accordion title="I can't find a screen in the menu">
    **What you see:** an entry such as **Orders**, **Order approvals**, **Deliveries**, **Reports** or **Team** is missing from the menu.

    **Why:** the console shows those five entries only to people who can use them.

    | Menu entry | Shown when you hold |
    | - | - |
    | **Orders** | `orders.create`, `orders.read.all`, `approvals.decide` or any delivery permission |
    | **Order approvals** | `approvals.decide` or `approvals.policy.manage` |
    | **Deliveries** | Any of `fulfillment.pick`, `fulfillment.dispatch`, `delivery.confirm`, `receipt.confirm`, `fulfillment.close`, `fulfillment.read` |
    | **Reports** | `reports.read` |
    | **Team** | `members.manage` |

    The other entries (**Home**, **Locations**, **Warehouses**, **Catalog**, **Inventory**, **Replenishment**, **Stock corrections**) are shown to everyone, but their content still depends on your permissions.

    **What to do:**

    1. Ask a person who manages the team to open **Team**, select your name and tick the permission you need. An **Owner** does this on their own page.
    2. Reload the page after the change.
    3. On a phone, open the menu with the menu button in the top bar.

    If you typed or pasted an address and see **This page doesn't exist**, the address is wrong. Select **Back to home** and use the menu.

    See [Roles and permissions](/docs/en/account/roles-and-permissions) and [Team](/docs/en/account/team).
  </Accordion>

  <Accordion title="A screen says I don't have permission">
    **What you see:** one of these messages.

    | Message | Missing |
    | - | - |
    | **Your account does not have permission for this action.** | A permission for that screen or action. On **Inventory** (**Stock**) it means `inventory.read`. |
    | **You don’t have permission to receive deliveries. Ask an administrator for “Receive deliveries”.** | `inventory.receive` |
    | **You don’t have permission to view stock. Ask an administrator for access.** | `inventory.read` (on **Lot recall**) |
    | **You cannot create orders. Ask your clinic's administrator for permission to request supplies.** | `orders.create` |
    | **You do not decide order approvals. If you should, ask your clinic's administrator for the permission.** | `approvals.decide` |
    | **You cannot change the approval policy. Ask your clinic's administrator for the permission.** | `approvals.policy.manage` |
    | **You do not take part in deliveries. Ask your clinic's administrator if you should prepare, deliver or receive orders.** | All six delivery permissions |
    | **You cannot prepare orders. Ask your clinic's administrator for permission to pick.** | `fulfillment.pick` |
    | **You cannot receive orders. Ask your clinic's administrator for the permission.** | `receipt.confirm` |
    | **To receive box by box you also need permission to view deliveries. Ask your clinic's administrator.** | `fulfillment.read` |
    | **You need the View reports permission** | `reports.read` |
    | **You do not have access to team management. Ask your clinic administrator.** | `members.manage` |

    Two more messages are about sites, not permissions:

    * **You have no warehouses assigned. Ask an administrator for access.** Your **Warehouse access** is empty, so no stock can appear.
    * **You have no locations assigned. Ask an administrator for access.** Your **Location access** is empty, so no orders can appear.

    **Why:** muveya checks every request on the server against your permissions and your locations and warehouses. Something outside your locations or warehouses answers as if it did not exist, for example **This record is not available in the active dental clinic account.** or **This order does not exist or you cannot see it.**

    **What to do:** ask a person with **Manage team access** to grant the permission, or the location or warehouse, in **Team**. Changes apply from your next action. If **Stock alerts** or **Counts** only show their loading message, you are missing **View inventory**. **Adjust and count stock** does not include **View inventory**: people who correct stock need both.

    See [Roles and permissions](/docs/en/account/roles-and-permissions).
  </Accordion>

  <Accordion title="“This dental clinic is no longer available” or no clinics to choose">
    **What you see:**

    * **This dental clinic is no longer available to your account. Choose another clinic.** when you select a clinic on **Choose a dental clinic**.
    * **No dental clinics available** with **Your account has no active dental clinic access. Ask an administrator to review your invitation or membership.**
    * **We could not load your dental clinics** with a **Try again** button.

    **Why:** your membership in that clinic ended (you were suspended or removed) after the list was loaded, or you have no active membership at all. You may also not have accepted your invitation yet. Suspended and removed memberships are not listed.

    **What to do:**

    1. Choose another clinic, or select **Try again** if the list did not load.
    2. If you should belong to the clinic, ask a person who manages its team. A suspended person can be reactivated with **Reactivate access**; a removed person needs a new invitation.
    3. After a reactivation, sign in again.

    If another tab switched the clinic, you see **The active dental clinic account changed in another tab. Nothing you were entering here was sent: check it in this account before you continue.** or **The active dental clinic account changed. Reload the page before trying again.** Reload the page and check which clinic is active before you repeat the action.

    See [Sign in](/docs/en/account/sign-in).
  </Accordion>

  <Accordion title="I can't sign in, or I was signed out">
    | What you see | Why | What to do |
    | - | - | - |
    | **Check your email, password and verification code, if you use one. Then try again.** | Wrong email or password, a missing or wrong authenticator code, an unverified email, or an unfinished password setup. The message is the same on purpose. | Check each value. If your account has an authenticator, open **I have a verification code** and type the six digits. If you never finished setup, use **Need to verify your email?** |
    | **There have been too many attempts. Wait a few minutes before trying again.** | Too many failed attempts for that email from your network. | Wait 15 minutes, then try again carefully. |
    | **This link is no longer available** | A verification or Google link was already used, expired, or removed by a page reload. | Request a new link, or start the Google sign-in again. |
    | You land on the sign-in screen while working | Your session ended: 30 minutes without activity, 30 days after sign-in, or your access changed (suspension, removal, role change). | Sign in again and choose the clinic. You return to the page you were on; anything you had not saved was not sent. |

    There is no "forgot password" screen yet. Write to [team@muveya.com](mailto:team@muveya.com) from your account email. If you created your account with Google, keep using **Continue with Google**: that account has no muveya password.

    See [Sign in](/docs/en/account/sign-in) and [Account security](/docs/en/account/security).
  </Accordion>

  <Accordion title="The invitation link does not work">
    **What you see** and **what to do**:

    | Message | Why | What to do |
    | - | - | - |
    | **This invitation is not available** | The link is unknown, expired (links last 24 hours), revoked, already used, or replaced by a newer email. | Use the most recent invitation email, or ask for a new invitation. |
    | **Open your invitation link again** | For your security, an open invitation lasts only 10 minutes after each step. | Open the link from the email again. It still works while the invitation is valid. |
    | **We could not verify your email** | The confirmation link was opened in another browser, after 10 minutes, or twice. | Open the invitation link again in one browser and repeat the steps there. |
    | **This invitation is for a different account. Use the account that received the invitation.** | You signed in, or chose a Google account, with another email. | Use **Use another account** and sign in with the invited email. |
    | **You already have an account with this email. Sign in to continue with the invitation.** | You chose **Create my account**, but the email already has an account. | Sign in and continue as that account. |
    | **You already belong to this dental clinic. Sign in to enter.** | Your membership already exists, active or suspended. | Sign in and choose the clinic, or ask to be reactivated. |
    | **This invitation needs to be reviewed by the clinic administrator. Ask them to send it again.** | The person who sent it no longer holds the access it offers. | Ask a team manager to revoke it and create a new one. A resend does not fix it. |
    | **We are still setting up your access. Try again in a moment.** | Your account is still being prepared. | Wait a few seconds and repeat. |
    | **This invitation changed while you were reviewing it. Open your invitation link again.** | It was resent or revoked meanwhile. | Open the newest invitation email. |

    Opening the link never accepts anything by itself: you join only when you select **Accept invitation**.

    See [Accept an invitation](/docs/en/account/sign-in) on the sign-in page.
  </Accordion>

  <Accordion title="The invitation email did not arrive, or I can't invite someone">
    **For the invited person:** check the spam folder. The email is titled **You’re invited to a clinic on muveya**. Only the newest email works.

    **For the person who invites:** **Invitation created for** only means muveya is sending the email; it never confirms delivery. On **Team**, under **Pending invitations**:

    * **Resend invitation** sends a fresh 24-hour link and cancels the previous one. You can resend once a minute; until then the row shows **You can resend it from** and a time.
    * An invitation whose **Expires** time has passed stays listed and still blocks a new invitation to that email. Resend it or revoke it.

    | Message when inviting | What to do |
    | - | - |
    | **This email already has a pending invitation. Resend it from the team page.** | Resend or revoke the existing invitation in **Pending invitations**. |
    | **Some of the selected permissions or locations cannot be granted. Review the selection.** | Untick what you do not hold yourself, or the sites outside your own access. |
    | **Only an owner can invite an administrator or change this role. Choose the member role, or ask an owner.** | Invite as **Member**, or ask an **Owner**. |
    | **This person already belongs to this clinic.** | Open their page in **Team** instead. |

    See [Team](/docs/en/account/team).
  </Accordion>
</AccordionGroup>

## Catalog

<AccordionGroup>
  <Accordion title="Import CSV or Export CSV is refused">
    **What you see:** you have **Import CSV** and **Export CSV** on **Catalog**, but the upload or the export answers **Your account does not have permission for this action.**

    **Why:** the buttons appear for anyone with `catalog.manage` (**Manage the catalog**), but muveya only accepts a CSV import or export from a member whose role is **Owner** or **Administrator**. A **Member** with **Manage the catalog** is refused.

    **What to do:** ask an owner or administrator to import or export the file, or ask an owner to change your role to **Administrator**. Meanwhile you can still create and edit supplies one by one.

    See [Import and export](/docs/en/catalog/import-export).
  </Accordion>

  <Accordion title="The import failed or some rows were rejected">
    | What you see | What to do |
    | - | - |
    | **The file does not contain the required CSV columns.** | Check the header names (English, exact letter case), that the separator is a comma (spreadsheets in Spanish or Portuguese often save with semicolons), and that no quote is left open. |
    | **The file must be 5 MB or smaller.** / **Use no more than 10,000 data rows per file.** | Split the file. |
    | **Processing was interrupted. Automatic recovery will retry the pending work.** | Wait. The page keeps checking, and rows already created are not created twice. |
    | **This SKU already exists.** | An import never updates supplies. Remove the row or use another SKU. |
    | **Category not found in this clinic.** | Copy the id from **Category IDs for your CSV** on the import screen. |
    | **The original uploader no longer has permission.** | The uploader lost access while the import ran. Ask an owner or administrator to upload the remaining rows. |

    Build the corrected file with only the rejected rows. Imported supplies start as drafts: activate each one before it can be ordered or received. There is no list of past imports, so keep the address of the **Import status** page.

    See [Import and export](/docs/en/catalog/import-export).
  </Accordion>

  <Accordion title="A supply can't be added to an order because of its cost">
    **What you see:** on an order draft, **Add supply** answers **The record changed or already exists. Review it before trying again.**

    **Why:** the supply has a cost that is not confirmed for its current unit (cost state `review_required` or `invalid`, code `catalog.cost_unverified`). muveya refuses to copy a cost that may be counted in the wrong unit. The order screen shows the generic message.

    **What to do:**

    1. Ask someone with **Manage the catalog** and **View supply costs** to open the supply in **Catalog**.
    2. If the cost shows **Needs confirmation for the current unit.**, they check the amount and select **Save cost** in **Supply cost** to confirm it for the current unit.
    3. If it shows **The previous cost data needs review.**, write to [team@muveya.com](mailto:team@muveya.com) with the SKU.
    4. Add the supply to the order again.

    A supply with no cost at all (**Not set**) can be ordered; it just adds nothing to the order value. Other messages on the same form: **The unit of this supply has not been reviewed in the catalog yet.** (the unit is not fixed) and **This supply is not active in the catalog.**

    See [Costs](/docs/en/catalog/costs).
  </Accordion>
</AccordionGroup>

## Inventory

<AccordionGroup>
  <Accordion title="A receipt is refused for lot, serial numbers or expiry date">
    **What you see:** **This supply needs its lot, serial numbers or expiry date to be received. Check them and receive again.** Nothing was received.

    **Why:** the supply tracks lots, serial numbers or expiry dates, and one of them is missing or invalid:

    * **Lot number** is empty or blank.
    * **Expiry date** is missing or earlier than today (UTC). A past date is always refused.
    * **Serial numbers** do not match the quantity: you need exactly one serial per base unit received (the count multiplied by the presentation's content), with no blanks and no repeats. The field is a single line: separate serials with commas, because Enter submits the form.

    **What to do:** check the package and correct the fields, then press **Receive** again. A product whose expiry date has already passed cannot be received.

    A different message names serial numbers, for example **These serial numbers were already received for this supply: SN-0042. A serial number identifies one unit: check the package, or correct the original box with an adjustment.** Each serial identifies one unit across every box of the supply, in any status. Check the serials against the package; if an earlier box was recorded wrong, see [Corrections](/docs/en/inventory/corrections).

    See [Receive stock](/docs/en/inventory/receive).
  </Accordion>

  <Accordion title="Scanning says “We could not find that box.”">
    **Why:** the scan screen shows this same message whenever the lookup fails:

    * the code does not exist in your dental clinic, or does not match exactly (upper and lower case count; spaces at either end are ignored);
    * the box is in a warehouse outside your **Warehouse access**;
    * you do not have **View inventory**;
    * the connection failed.

    muveya never tells whether a code exists in a warehouse you cannot see.

    **What to do:**

    1. Compare the code with the printed label and type it by hand.
    2. Check that you are in the right dental clinic.
    3. Open **Inventory**: if it shows **Your account does not have permission for this action.** or **You have no warehouses assigned. Ask an administrator for access.**, ask for access in **Team**.
    4. Check your connection and try again.

    A scan on the pick screen that answers **That code is not reserved for this order. Check the label and scan again.** is a different case: see [Pick and dispatch](/docs/en/deliveries/picking).

    See [Boxes and labels](/docs/en/inventory/boxes).
  </Accordion>

  <Accordion title="A box is used up, expired or closed">
    **What you see:** the box screen says **This box is closed and takes no further movements.** and offers no forms.

    **Why:** only **Active** boxes take movements. The status is under the box code:

    | Status | How it got there | What you can do |
    | - | - | - |
    | **Used up** | Its on hand reached zero through use or a loss correction. | Nothing on that box. If units turn up later, receive them as a new box with **Receive**. |
    | **Quarantined** | Someone quarantined it, a lot recall held it, or a disputed receipt returned it held. | Nothing from the console: there is no way to return a box to **Active**. |
    | **Expired** / **Disposed** | Someone took it out of use. | Nothing. Its history stays readable. |
    | **In transit** | It was dispatched for an order. | Wait for the receipt at the destination (see Deliveries below). |

    **An expired box that still says Active.** A box does not change status when its expiry date passes. From the day after that date (UTC), using or moving it answers **The record changed or already exists. Review it before trying again.**, separating it answers **This box has expired and cannot be separated.**, and orders never reserve it. With **Adjust and count stock**, open **Take the box out of use** and choose **Mark as expired** (or **Dispose**).

    To dispose of a box that is already quarantined or expired, write to [team@muveya.com](mailto:team@muveya.com): the console offers that action only for active boxes.

    See [Boxes and labels](/docs/en/inventory/boxes) and [Inventory overview](/docs/en/inventory/overview).
  </Accordion>

  <Accordion title="My correction was not applied: it is waiting for approval">
    **What you see:** after **Record correction**, **Sent for approval. Another person with permission to correct stock must approve it.** The box's **On hand** did not change.

    **Why:** the quantity is above the approval threshold for that supply at that warehouse. Without a threshold set it is 100; a threshold set in the minimum form (0 to 100) lowers it; a supply marked as high value always needs approval.

    **What to do:**

    1. Ask another member with **Adjust and count stock** and access to that warehouse to open **Stock corrections** and select **Approve** or **Reject**. You cannot decide your own request (**You cannot approve your own request.**).
    2. If it is no longer needed, select **Withdraw** on your own request.

    | Message | Meaning |
    | - | - |
    | **This box already has a correction waiting for approval.** | Only one waiting correction per box. Decide or withdraw it first. |
    | **The box changed; the correction must be requested or counted again.** | The box had a physical movement after the request. Nothing was written. Check **Movements**, then record it again or count the box. |
    | **Someone already decided this request.** | Switch **Show** to **Decided** to see the outcome. |
    | **The box does not hold that much.** | A loss cannot exceed the box's on hand. |

    A rejection reason is stored but not shown on the list.

    See [Corrections](/docs/en/inventory/corrections).
  </Accordion>

  <Accordion title="Available shows a negative number">
    **What you see:** on **Stock**, a box's **Available** is below zero.

    **Why:** **Available** is **On hand** minus **Reserved**. A loss correction or a use lowered what the box holds, but units the box holds for approved orders stay reserved. muveya never invents stock to cover them, so the negative number is the shortfall those orders face. **Replenishment** counts that box as zero usable units.

    **What to do:**

    1. Open the box and read its **Movements** to see what lowered it.
    2. If the units are really on the shelf, record a correction with **Add to the record** (it may need approval).
    3. If the units are really missing, the order that relies on the box cannot be dispatched with it (dispatch answers **A picked box holds more than this order takes…**, even though the box holds less). Write to [team@muveya.com](mailto:team@muveya.com) with the order number and the box code.

    See [Corrections](/docs/en/inventory/corrections) and [Inventory overview](/docs/en/inventory/overview).
  </Accordion>
</AccordionGroup>

## Orders and approvals

<AccordionGroup>
  <Accordion title="The order stays in Submitted">
    **What you see:** the order shows **Submitted** and **The order is moving to its next step. This screen refreshes by itself in a few seconds.**, but it never moves on. People who manage the policy may also see **No approval policy yet: submitted orders wait until one is published** on **Home**.

    **Why:** your dental clinic has never published an approval policy. Without one, muveya approves nothing and does not ask anyone to decide. Submitted orders are picked up only when muveya processes the clinic's submissions, which happens each time someone submits an order.

    **What to do:**

    1. Someone with **Manage approval rules** opens **Order approvals**, then **Approval policy**, and publishes a policy: rules, or **Publish without approvals** under **No approval required**.
    2. The orders already waiting move on the next time anyone in your dental clinic submits an order.
    3. If an order still shows **Submitted** a while after that, write to [team@muveya.com](mailto:team@muveya.com) with the order number.

    See [Approval policy](/docs/en/orders/approval-policy).
  </Accordion>

  <Accordion title="I can't approve my own order">
    **What you see:** your order is not in **Order approvals**. Opening it shows **You requested this order, so another person has to decide it.** and no form, and the order says **You requested this order, so another person has to approve it.** If a decision reaches muveya anyway: **You requested this order, so you cannot decide it.**

    **Why:** separation of duties. The requester can never approve or reject their own order, whatever their permissions. The attempt is recorded in the audit log.

    **What to do:** another person with **Decide approvals** and access to the order's location must decide it. Make sure every location has at least one such person besides its usual requesters. Approvers must also be granted **Decide approvals** explicitly: no role includes it.

    See [Order approvals](/docs/en/orders/approvals).
  </Accordion>

  <Accordion title="My decision was not recorded because the order changed">
    **What you see:**

    * **Someone decided or changed this order a moment ago. The screen now shows the latest version; review it before deciding.**
    * **This order is no longer waiting for a decision. The screen now shows where it is.**
    * **That stage is not part of this order's approval plan.**

    **Why:** muveya records a decision only against the version of the order your screen loaded. Another approver decided first, the requester cancelled it, or you had already recorded a different decision on that stage. A decision cannot be changed afterwards, not even by the person who made it.

    **What to do:** read the refreshed screen. If the order still waits, choose the stage again and decide. If it was already approved, rejected or cancelled, nothing more is needed. The **Decisions** section at the bottom lists every decision.

    See [Order approvals](/docs/en/orders/approvals).
  </Accordion>

  <Accordion title="I can't cancel an approved order">
    **What you see:** there is no **Cancel order** button, or cancelling answers **The order is no longer at a step where this can be done.**

    **Why:** only the requester can cancel, and only while the order is **Draft**, **Submitted** or **Waiting for approval**. From **Approved** onwards muveya refuses the cancellation, for everyone, including owners and administrators. **Rejected**, **Cancelled** and **Closed** are final.

    **What to do:** if an approved order must be stopped, write to [team@muveya.com](mailto:team@muveya.com) with the order number. If you only need to fix the header (location, destination, source or reason), cancel the draft while you still can and create a new order: the header cannot be edited.

    See [Create and track orders](/docs/en/orders/create-and-track).
  </Accordion>
</AccordionGroup>

## Deliveries

<AccordionGroup>
  <Accordion title="The order is approved but doesn't appear in Deliveries">
    **What you see:** the order stays **Approved** with **The order is moving to its next step. This screen refreshes by itself in a few seconds.**, it is not under **To prepare**, and the pick screen says **No boxes are reserved for this order right now.**

    **Why:** muveya reserves stock by itself when an order is approved, all or nothing. If any line cannot be covered by usable boxes, it reserves nothing and leaves the order **Approved**. Usable means **Active**, not past its expiry date, counted in the same unit as the order line, and in the source warehouse when the order names one in **Take stock from**. The reservation is tried again only when another order of your dental clinic is approved; there is no retry button.

    **What to do:**

    1. Check the stock of each supply on **Stock** and **Replenishment**.
    2. Receive or move the missing stock into a usable place.
    3. The order is reserved the next time another order of the dental clinic is approved.
    4. If it still stays **Approved**, write to [team@muveya.com](mailto:team@muveya.com) with the order number.

    With **Any central warehouse**, the reservation can take boxes from any warehouse of the dental clinic: check **Take from** on the pick list.

    See [Deliveries overview](/docs/en/deliveries/overview).
  </Accordion>

  <Accordion title="I can't dispatch the order">
    | What you see | Why | What to do |
    | - | - | - |
    | No **Dispatch** panel, or no access to the pick screen | Dispatch happens on the pick screen, which needs **Prepare orders** as well as **Dispatch orders**. | Ask for both permissions. |
    | **Dispatch becomes available once every box is picked.** | Some listed box is still **To pick**. | Scan every box on **Boxes to take**. |
    | **There are no picked boxes to dispatch yet.** | No box was picked, the order is not **Being prepared**, or the source location is outside your **Location access**. | Pick first, or ask for access to the source location. |
    | **A picked box holds more than this order takes. Boxes travel whole: scan it again to separate the order's quantity into its own container.** | A picked box no longer matches the order exactly: its **On hand** or **Reserved** differs from the order's quantity (extra units, another order's reservation, or a use or correction after picking), or it is no longer active or has expired. The message is the same even when the box now holds less. | Scanning the box again does not separate it: a box that is already picked only answers **That box is already recorded as picked for this order.** Open the box and read its **Movements**. If a correction was recorded by mistake and the box really holds the order's quantity, record the opposite correction. Otherwise write to [team@muveya.com](mailto:team@muveya.com) with the order number and box code. |
    | **This record is not available in the active dental clinic account.** | A box is in a warehouse outside your **Warehouse access**. | Ask for access, or ask a colleague who has it. |

    Nothing is dispatched until every picked box passes the check. A box outside your **Warehouse access** is refused only while dispatching, so boxes before it may already be in transit: ask a colleague with access to that warehouse to dispatch again. If a reserved box dropped off the list before you picked it (for example after a lot recall), the order can be dispatched without it: compare the list with the order lines first.

    See [Pick and dispatch](/docs/en/deliveries/picking).
  </Accordion>

  <Accordion title="A box stays In transit">
    **Why and what to do:**

    | Situation | What to do |
    | - | - |
    | The order is **Dispatched** or **Delivered** | Normal: a box stays **In transit** until the destination confirms the reception. Confirm the delivery, then receive the order. |
    | The order is **Delivery problem** | A problem was reported at delivery. There is no screen to resolve it, and the boxes stay **In transit**. The owner of the dental clinic writes to [team@muveya.com](mailto:team@muveya.com) with the order number and what happened. |
    | The order is **Received** or **Partially received** | A stock step after the reception did not finish. muveya retries it in the background. Check the **Boxes** table on the order's tracking page later. If a box stays **In transit**, write to [team@muveya.com](mailto:team@muveya.com). |

    A box in transit counts in neither warehouse and takes no movements.

    See [Delivery and receipt](/docs/en/deliveries/delivery-and-receipt).
  </Accordion>

  <Accordion title="I can't receive the order">
    | What you see | What to do |
    | - | - |
    | **This order has not been delivered, so there is nothing to receive yet.** | The origin must confirm the delivery first. |
    | **There is nothing to receive for this order here.** | The order is not **Delivered**, or its destination location is outside your **Location access**. |
    | **This delivery does not exist or you cannot see it.** | Shown when the page opens: the order's location is outside your **Location access**, or the address is wrong. |
    | **Your account does not have permission for this action.** | You lack **Confirm receipt**, or your **Location access** is a list of locations that includes the origin location of a transfer between two locations. Ask a member of the destination location. |
    | **A disputed box needs evidence. Describe what you saw.** | Fill in **Evidence of the problem** when you dispute a box. |
    | **The decision must cover exactly the delivered boxes. Reload the page and check again.** | Reload and decide every box again. |

    Reception is whole-box: there is no received quantity. See [Delivery and receipt](/docs/en/deliveries/delivery-and-receipt).
  </Accordion>

  <Accordion title="I can't close the order">
    **What you see:** no **Close order** button, or **This order cannot be closed yet.**

    **Why:**

    * The button is on the order's tracking page, which needs **View fulfillment** as well as **Close fulfillment**.
    * Only **Received** and **Partially received** orders can be closed. A **Delivery problem** order cannot.
    * A box of the order is still **In transit** (see the entry above).
    * The destination location is outside your **Location access**, or your access is a list of locations that includes the origin location of a transfer between two locations.

    **What to do:** check the order's status and the **Boxes** table, ask for the missing permission or location, and try again later if a box is still in transit. Closing twice only says **This order was already closed.**

    See [Delivery and receipt](/docs/en/deliveries/delivery-and-receipt).
  </Accordion>
</AccordionGroup>

## WhatsApp

<AccordionGroup>
  <Accordion title="The chat keeps asking me to link my account">
    **What you see:** every message gets the link prompt. The channel writes in Spanish: **Para operar muveya desde WhatsApp, primero vincula tu cuenta: responde con el código de un solo uso que generaste en la consola.** (To operate muveya from WhatsApp, first link your account: reply with the one-time code you generated in the console.) A failed code gets **Ese código no es válido o expiró. Genera uno nuevo en la consola y envíalo por aquí.** (That code is not valid or has expired. Generate a new one in the console and send it here.)

    **Why:** the number is not linked, the membership was suspended or removed, or the link was made before a suspension (links stay closed after a reactivation). A code lasts 10 minutes, works once, and a newer code cancels the older one.

    **What to do:** the console has no screen to create the link code yet, even though the prompt mentions it. The WhatsApp channel is also not switched on in the production service yet. A code can only be created for you while you are signed in to your own account; the muveya team cannot create one for you. Write to [team@muveya.com](mailto:team@muveya.com) if you want to use the channel. To move a linked number to another person or clinic, or to unlink it, also write to [team@muveya.com](mailto:team@muveya.com).

    A reply that starts with **No tienes permiso para** (You don't have permission to) means you lack the permission for that option, or no warehouse is assigned to you: ask for it in **Team**.

    See [WhatsApp channel](/docs/en/whatsapp/overview).
  </Accordion>

  <Accordion title="The chat answers in Spanish">
    **Why:** the channel currently replies in Spanish to everyone, whatever language you use in the console. English and Portuguese versions of every message exist but are not selected yet. Buttons are in Spanish too: **Confirmar** (Confirm), **Corregir** (Edit), **Cancelar** (Cancel).

    **What to do:** nothing is wrong with your account. [WhatsApp operations](/docs/en/whatsapp/operations) shows every message with its English meaning.
  </Accordion>
</AccordionGroup>

## Android app

The Android app shows its own messages in the language it is set to. This section quotes them in English, as the app writes them.

<AccordionGroup>
  <Accordion title="The app says it is not connected">
    **What you see:** **This development app is not connected yet. Ask your team for the configured app.** No sign-in option is offered.

    **Why:** this copy of the app is not connected to a muveya service, so nothing can be done with it. The Android app is not generally available yet and is not published on Google Play.

    **What to do:** write to [team@muveya.com](mailto:team@muveya.com) if you want to use the app. Meanwhile, use the console in your phone's browser.

    See [Android app](/docs/en/android/overview).
  </Accordion>

  <Accordion title="Google sign-in says there is no muveya account">
    **What you see:** **There is no Muveya account for this email. Ask an administrator of your clinic to invite you.**

    **Why:** the Google account you chose uses an email that has no muveya account. The app only signs in existing accounts: it never creates an account or a dental clinic.

    **What to do:**

    1. If you already have a muveya account under another email, choose the Google account with that email, or sign in with email and password.
    2. Otherwise, ask a person who manages your clinic's team for an invitation and accept it in the console.
    3. Then sign in to the app with the invited email.

    To start a new dental clinic, create it in the console. See [Sign in and create your account](/docs/en/account/sign-in).
  </Accordion>

  <Accordion title="The app sent me back to the sign-in screen">
    **What you see:** the sign-in screen with **Check your email, password and authenticator code.**, although you did not type anything.

    **Why:** your session ended: 30 minutes without activity, 30 days after sign-in, or your access changed (suspension, removal, role change). The app shows the same message as for wrong credentials.

    **What to do:** sign in again. Anything you had not sent was not recorded. If the same message appears when you do type your credentials, check them, and add the authenticator code if your account has one.

    See [Android app](/docs/en/android/overview).
  </Accordion>

  <Accordion title="The scanner does not open">
    **What you see:** **The scanner is not available on this phone. Type the code instead.**

    **Why:** the code scanner runs inside Google Play services. It cannot start when the phone has no Google Play services, when they are turned off, or when the scanner component has not finished downloading to the phone.

    **What to do:** type the code in **Or type the code** and press **Look up**, or receive the supply with **Receive a supply without a code**. On a phone with Google Play services, check that they are turned on and up to date, keep the phone connected for a few minutes, and try again.
  </Accordion>

  <Accordion title="A scanned code is not recognized or not allowed">
    **What you see:** **Code not recognized** with **No box or supply you can reach has the code** followed by the code, or **The operation is not allowed.**

    **Why:**

    * No box in your warehouses has that exact code. A box outside your warehouses is treated as if it did not exist.
    * The supplier code is not registered on an active presentation, or its presentation is retired.
    * For a GS1 DataMatrix, the presentation holds the GTIN in its 13-digit form, while the DataMatrix carries 14 digits.
    * You cannot receive (`inventory.receive`), so the app does not look up supplier codes.
    * **The operation is not allowed.** means you lack `inventory.read`, which the app needs to look for a box.

    **What to do:** check the code and your warehouse access. Ask a catalog manager to register the code, including the 14-digit GTIN of a DataMatrix, or receive the supply by name. Ask for **View inventory** if you see **The operation is not allowed.**

    See [Android app operations](/docs/en/android/operations).
  </Accordion>

  <Accordion title="Record use or Move is missing on a box">
    **Why:** **Record use** appears only when you can consume, the box is **Active**, its unit needs no review and **Available** is above zero. **Move to another warehouse** appears only when you can move boxes and the box is **Active**. The app shows buttons from the permissions it read when you signed in or last refreshed.

    **What to do:** check the box's **Status** and **Available**. If an administrator just granted you a permission, open **Menu**, **Change organization** and press **Refresh access**. A box whose unit needs a review is fixed in the console.
  </Accordion>

  <Accordion title="A use does not ask for a room or area">
    **What you see:** **This clinic has no rooms or areas yet, so this use will not say where it went.**

    **Why:** the box's location has no active rooms or areas, or the box is in a **Central** warehouse. The app offers rooms only for boxes in an express warehouse.

    **What to do:** set up rooms and areas for the location (see [Rooms and areas](/docs/en/locations/destinations)). To record where a use from a central warehouse went, use the console.
  </Accordion>

  <Accordion title="A Waiting for you row opens the console sign-in page">
    **Why:** the rows open the console in your phone's browser, which keeps its own session, separate from the app's.

    **What to do:** sign in to the console in that browser once. If nothing opens, the app shows **We could not open a browser. Check that one is available and try again.**: install or turn on a browser.
  </Accordion>
</AccordionGroup>

## API and MCP

<AccordionGroup>
  <Accordion title="401 api_keys.invalid">
    **Why:** one answer covers every key problem: the `Authorization` header is missing, empty or not `Bearer`; the key is malformed, mistyped or truncated; the key is unknown or revoked; the member it was created for was suspended or removed (a reactivation does not bring the key back); or the dental clinic is suspended.

    **What to do:**

    1. Send exactly `Authorization: Bearer` followed by the key, with no quotes or line breaks.
    2. Check that the variable holding the key is set where the program runs.
    3. Call `GET /v1/me`, which needs no scope.
    4. Ask the member who requested the key whether it was revoked or whether they are still active. If needed, request a new key through [team@muveya.com](mailto:team@muveya.com): there is no console screen for keys yet.

    See [Authentication](/docs/en/api-reference/authentication).
  </Accordion>

  <Accordion title="403 api_keys.scope_missing">
    **Why:** the key is valid but lacks a scope the operation requires. The answer does not name the scope. Scopes cannot be added to an existing key.

    **What to do:** call `GET /v1/me`, compare its `scopes` with [Scopes](/docs/en/api-reference/scopes), and request a new key with the right scopes. Order values and patient references are never returned to a key, whatever its scopes: that is not an error. A record of another dental clinic answers `404`, never `403`.

    See [Errors](/docs/en/api-reference/errors).
  </Accordion>

  <Accordion title="429 common.too_many_requests">
    **Why:** the API key used up its `/v1` request budget for the current window. MCP uses separate OAuth authentication.

    **What to do:** wait the seconds in `Retry-After`, then retry. Watch `X-RateLimit-Remaining`, use large pages, cache what rarely changes, and do not run overlapping jobs with one key. If you need a larger budget, write to [team@muveya.com](mailto:team@muveya.com) with the expected volume.

    See [Rate limits](/docs/en/api-reference/rate-limits).
  </Accordion>

  <Accordion title="An MCP tool always answers common.forbidden">
    **Why:**

    * `approvals.list_pending`, `management.pending_decisions` and `fulfillment.get_pick_list` read a person's own work (their pending decisions, their pick list). The current read-only OAuth scope set does not grant those permissions, so they answer `common.forbidden`, even though they appear in `tools/list`. Reading the resource `muveya://tenant/approval-policy-summary` is refused too, as a JSON-RPC error `-32600` whose `data.code` is `common.forbidden`.
    * `clinics.list` needs `inventory:read`, not `clinics:read`.
    * Any other tool answers `common.forbidden` when the connection lacks its delegated scope or the member lacks the permission.

    **What to do:** use the console for approvals and picking. For other tools, check the scope each one needs on [MCP tools](/docs/en/mcp/tools) and reconnect with that permitted OAuth scope. Answers follow the requested language.

    See [Connect an MCP client](/docs/en/mcp/connect).
  </Accordion>
</AccordionGroup>

## Contact

If your problem is not here, or the steps did not solve it, write to **[team@muveya.com](mailto:team@muveya.com)** with the details listed in **Before you contact support** at the top of this page. Write from the email address of your muveya account when you can.

## Related pages

<CardGroup cols={2}>
  <Card title="Roles and permissions" icon="key" href="/docs/en/account/roles-and-permissions">
    What each permission unlocks and how sites narrow it.
  </Card>

  <Card title="Sign in" icon="right-to-bracket" href="/docs/en/account/sign-in">
    Accounts, clinics, sessions and invitations.
  </Card>

  <Card title="Deliveries overview" icon="truck" href="/docs/en/deliveries/overview">
    The custody steps and who takes each one.
  </Card>

  <Card title="API errors" icon="triangle-exclamation" href="/docs/en/api-reference/errors">
    Every error code of the API and MCP.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.