Usho

Sign in

Merchant dashboard

Forgot password?  ·  Create an account
Usho

Create account

Get started in seconds

Loading plans…
Already have an account? Sign in
Usho

Reset password

We'll send a reset link to your email

Back to sign in
Usho

Choose new password

Enter your new password below

Back to sign in
Usho

Confirm your email

We've sent a link to . Click it and your account is ready.

You won't be able to sign in until the address is confirmed. If nothing arrives in a few minutes, check your spam folder.

Back to sign in

Usho

AI-powered store assistant

  • 1
    Choose your platform
  • 2
    Connect Usho
  • 3
    Add first knowledge

Usho

Notifications

Dashboard

Your store at a glance — click any tile to jump to that section.

Loading…

Trigger Reindex

Start a full catalog reindex for the current store. This re-extracts all products, categories, attributes, and admin knowledge sources.

Product reindex by ID

Job History

Loading…
✓
Your catalog is synced automatically by your store plugin. Products are pushed to Usho on every change, so you don't need a feed or CSV import — they're hidden to keep things simple.
ℹ️ How CSV upload & feed sync update your products

Your catalog is a mirror of your source (CSV/feed). Each time a file is uploaded or a feed syncs, we update existing products in place (matched by their id), add new ones, and remove products that are no longer in the file. Products are view-only here — change them at your source and re-upload / re-sync.

What happens to a product's fields:

  • A column your file includes → that field is updated (and if it's blank for a product, it's cleared).
  • A column your file doesn't include at all → that field is left untouched — so an ads-style feed that only carries title/price/image won't wipe your descriptions or custom attributes.
  • name and price are required — a row missing them is skipped.

How to manage it: keep your feed/CSV complete for the fields you want us to control; leave a column out entirely if you'd rather manage that field elsewhere. A product removed from the file is removed from search — so upload your full catalog, not a partial slice.

Product Feed recommended

Paste your Google Merchant / Shopping feed URL (also works with Meta, Bing and most affiliate feeds). We validate it, import your products — including variants — and re-sync automatically on a schedule. XML or text (TSV/CSV) feeds are both accepted — no need to convert.

The feed's product ID (<g:id>) is my product's:

Scheduled CSV Imports

Point Usho at a CSV you publish at an https:// URL and we'll import it automatically on a schedule — same columns as a manual upload. Every file is checked before anything changes: if any row is invalid the whole file is rejected, your live catalog is left untouched, and you're notified with the reasons. Also supports SFTP, FTPS, and plain FTP.

Add a source
⚠️ Plain FTP sends your credentials and catalog unencrypted. Use SFTP or FTPS if your host supports it.
This source is my catalog's:

CSV Product Upload

Upload your product catalog as a CSV file. Uploading replaces the existing catalog.

How to format your CSV

Required: name (or title) and price.

Standard optional: id, sku, description, short_description, old_price, currency, in_stock, url, image_url, category. Prices may include a currency symbol (£ $ €).

Custom columns (searchable): any extra column becomes a searchable attribute — add whatever describes your products:

  • Supplements → ingredients, allergens, servings
  • Electronics → voltage, warranty, screen_size
  • Fashion → material, fit, care

Variants (size, colour…): use a handle column to group a product's variant rows together.

  • What's a handle? A short shared ID for one product — any unique slug (e.g. mens-tee). Use the same value on every row of that product, and a different value for other products. (If you export from Shopify it's already called handle; on other platforms it's your product/parent ID or SKU-group.)
  • Give each variant its options via option1_name/option1_value (up to option3), plus its own sku, price and in_stock.
  • The first row of a handle carries the product name/description; later rows can leave name blank.
  • No handle column (or a blank handle) = a plain product with no variants.

Encoding: UTF-8. One product — or one variant — per row.

📄
Drop a CSV file here or click to browse
Max 50 MB · UTF-8 encoding recommended

Uploading…

Your products

Your catalog is view-only here — manage products at your source (plugin, feed, or CSV) and re-sync.

Content is managed by your nopCommerce plugin. Sitemap import and content auto-refresh are disabled here to avoid conflicts — the plugin keeps your Topics, blog and news current automatically. You can still add and edit FAQs manually below.

Teach the assistant everything it can't get from your product catalog — policies, shipping, returns, FAQs, about-us. The quickest start is Guided setup below; you can also import from a URL, upload a file, or add items by hand. Usho flags duplicates and keeps imported pages fresh automatically — the Knowledge Sources list further down shows where each item came from and whether it updates on its own.

Guided setup easiest

Answer the common questions — fill in what applies, skip the rest

The quickest way to give the assistant quality answers — no page or file needed. Each answer is saved as one clean knowledge item, and if you already have that content elsewhere we'll offer to replace it.

Loading…

Import from URL

We fetch the page and split it into sections (or keep it as one) — you review before saving

Upload a file

PDF, Word, text or Markdown — we extract & split it into sections you review before saving
📄
Drop a PDF, Word, text or Markdown file here, or click to browse
Max 20 MB · we structure it into reviewable sections
Advanced: bulk import from sitemap — discover & import many pages at once, and enrich products (the power option)

Scheduled content updates

Keep your imported content fresh — re-crawls only what changed

Add Knowledge Source

Knowledge Sources

Loading…

Clear Data

Permanently removes data from the database and vector store. This cannot be undone. (Products are managed under Products.)

These settings override the server defaults for your store. Leave a field blank to use the default.

AI Behaviour

When off, answers are text only — products are still linked inline in the reply, so no product information is lost.
Most cards to show on a single answer (1–12).
The small collapsible list of pages/FAQs an answer drew from. Turn off for a cleaner shopper-facing reply.

Brand & Content

Injected into every AI response so the assistant understands your specific business.

Widget appearance

How the chat widget looks on this store. Changes take effect on your storefront within a few minutes — you do not need to re-paste your embed code.

Used for the launcher button and the chat header.
💬Ask Usho Ask Usho
Shown on the launcher and the chat header.
Move it left if something else already sits in the bottom-right corner of your site.
The first thing a shopper sees when they open the chat. Leave blank for none.

Chat Session

⚠ Requires Growth plan or above. Upgrade to enable. When enabled, conversation turns are stored so the AI remembers context within a session.
How long a visitor's session lasts after their last message (idle timeout). Managed by Usho — contact support to change.
A once-a-week summary — conversations, confidence, and the new knowledge gaps to fix. Sent only in weeks with activity.

Order status

Let shoppers ask "where's my order?" and get a real answer — status, tracking and estimated delivery — in the chat. Choose how we get that status below. Full setup is in Help → Order status.

—
Custom status messages (optional)

Reword the line shown for each order status. Leave a field blank to use the default (shown as the placeholder). Use {order} where you want the order number. If your endpoint returns its own message, that still wins.

Handoff Contact Form

Fields shown to customers after a handoff is triggered. Use arrows to reorder. Changes are saved with Save Settings.

+ Add Field

Security

Restrict which domains can embed your Usho widget. Leave empty to allow all origins. Add the hostname only (e.g. myshop.com).

Loading…

Stores

Applies to your whole account. Each store has its own products, content, conversations, settings and language — your plan allowances are shared across all of them, so you are not paying twice for one business. Use the picker in the header to switch between them.

Loading…

Add a store

What you will see in the store picker.
Letters, numbers, hyphens. Used in your widget snippet and cannot be changed later — leave blank and we will derive one from the name.
The language this store's assistant replies in.
It will not count towards the store limit on your plan, and what you put in it will not use your item allowance — so it is capped at 100 items and only answers on domains you list under Security.

Sharing between stores

Applies to your whole account, not just the store you are currently on. Items you upload to Shared content are held once, count once against your allowance, and are read by every store — you describe the exceptions here rather than listing them product by product. A store always keeps the items uploaded directly to it.

What each store would see

Nothing changes until you apply.
Run a preview to see what each store would read.

Rules

One rule can decide thousands of products — “Germany does not sell anything in the category UK Exclusive”. Rules are checked in order and the first one that matches decides, so put a narrow exception above a broad sweep.

Loading…

Exceptions you have set

When a rule gets one item wrong, set that item here. Your own choices always win, and nothing automatic ever overwrites them.

Loading…

Why is this item where it is?

Conversations

Search to load conversations

Hover any card (ⓘ) for what it means. The biggest lever is Unanswered Questions below — each one is a gap you can close.

Top Questions

What shoppers ask most — make sure your best content covers these.

Load report to see data

Unanswered Questions

Your knowledge gaps — questions the assistant couldn't confidently answer. Add an FAQ or content page (Knowledge tab) for each to close them; this is what drives the Knowledge Gap score above.

Load report to see data

Top Cited Sources

Which knowledge items the assistant relies on most in its answers.

Load report to see data

What shoppers care about

Preferences the assistant picked up from shoppers this period (Pro plan). Spot demand at a glance — lots of "vegan" or budget-conscious shoppers is a signal for your range and merchandising.

Order status (WISMO)

How shoppers asking "where's my order?" were answered this period.

Daily Trend

Conversations and handoffs per day over the selected range.

Load report to see data

Peak Hours (UTC)

Volume of customer messages by hour of day.

Load report to see data

Handoff Queue

Loading…

My Account

Loading…

Widget Integration

Loading…
Issues a new key and invalidates the current one immediately.

Embed Snippet

Add this to the <head> of your storefront.


            
          

Server / Sync API Key

An admin-scoped key for server-side use — the nopCommerce plugin's Sync API Key field, or scripted catalog/content pushes (/api/catalog/sync). It can modify your catalog, so keep it secret — never put it in public HTML (that's what the widget key above is for). Shown once when generated.

Loading…

User guide

Loading…

Super-admin guide

API reference →

Select a topic to read.

Tenant Management

Loading…

Tenants with no owner user (seeded demo or SuperAdmin-created shells). Registration is atomic, so these are never failed-signup debris — monitor the count for anomalies.

Purge empty ones (no stores/conversations) older than days
Loading…

Platform Maintenance

Enqueue a full catalog re-index for every active store across all tenants. Use this as a one-off sweep after a catalog content-format change (e.g. price formatting or inline product links) so existing tenants pick it up. Bypasses the per-store re-index cooldown.

Plans & features

Edit the plans merchants can be on — limits, retention, Stripe price, and which features each tier unlocks. Built-in plans can be edited but not deleted or deactivated; missing values fall back to safe built-in defaults.

Loading…

Logs

Loading…

Captured only for tenants with detailed logging ON (enable it per tenant in the Tenants tab). Sensitive endpoints (auth, API keys, billing) are redacted; entries auto-expire after 7 days.

Loading…

Email

Loading… Set via environment variable Usho__Email__Smtp__Password

Portal

Used in password reset email links.

Sign-ups

New paid-plan sign-ups get this many days free before they must subscribe to keep the widget running. 0 = no free period (subscribe immediately). The free Starter plan has no trial.

Stripe

How to connect Stripe (one-time setup)
  1. Create your plans in Stripe. Dashboard → Products → add a product with a recurring price for Growth and one for Pro. Copy each price_… ID. (Starter is free and Enterprise is custom — no price needed. Usho does not create these for you.)
  2. Add your secret key. Stripe → Developers → API keys → copy the Secret key (sk_…) and set it as the Stripe__SecretKey environment variable. Use live keys in production, test keys to trial it.
  3. Add the webhook. Use the endpoint URL and the three events shown below, then copy the signing secret (whsec_…) into Stripe__WebhookSecret.
  4. Enter the price IDs below (Growth & Pro) and click Save Stripe Settings.

Once done, merchants can upgrade from their Billing tab and plan changes sync automatically. The status rows below show ✓ when the keys are detected.

Loading… Set via environment variable Stripe__SecretKey
Loading… Set via environment variable Stripe__WebhookSecret
/api/billing/webhook
In Stripe → Developers → Webhooks → Add endpoint, use the URL above and enable exactly these four events:
  • checkout.session.completed — activates a merchant's plan after checkout
  • customer.subscription.updated — plan / status changes (active ↔ past‑due, up/downgrades)
  • customer.subscription.deleted — cancellation → downgrade
  • invoice.payment_failed — emails the merchant that their payment failed
Then copy the signing secret (whsec_…) into Stripe__WebhookSecret. No payment_intent.* events are needed.
Existing endpoints: invoice.payment_failed is new. If your webhook was created before it was added, enable it on the existing endpoint — otherwise merchants are never told a payment failed, and the first they know is the subscription cancelling and their plan dropping to Starter.

Sign-up protection

Three layers protect the public sign-up form. Rate limits are always on. New accounts must confirm their email before they can sign in. Turnstile is optional — turn it on if you see automated sign-ups, since it costs an attacker a solved challenge per attempt rather than just a fresh IP address.

Rate limits

A person signs up once; the headroom is for shared office connections. Counted per hour, not per minute — a per-minute cap still allows hundreds of accounts an hour. 0 removes the limit.
Covers sign-in, token refresh and password reset. Generous for someone mistyping a password. 0 removes the limit.

These take effect immediately — no restart, unlike the chat limits below.

Turnstile challenge (optional)

Both keys must be saved before this can be switched on. Get them from your Cloudflare dashboard under Turnstile.

A solved challenge names the domain it was solved on, and anything else is a replay from a copy of the form. Blank means "the domain this page is served from", which is right unless a proxy rewrites the Host header or the sign-up form lives on a separate marketing domain. Comma-separated.

Email confirmation

New accounts cannot sign in and have no API key until the address is confirmed.

How long the link in the email keeps working. A new one can always be requested.
Deletes the account and everything sign-up created for it. Must be longer than the link's life. 0 keeps them forever.

Security

Maximum characters a visitor can send in one message. Protects against token-cost attacks.
Minimum wait between full catalog re-index jobs per tenant. 0 = no limit (dev only).
— Set via env var Usho__Security__ChatRateLimitPerIpPerMinute — requires restart
— Set via env var Usho__Security__ChatRateLimitPerTenantPerMinute — requires restart
💬
Chat Preview
Admin preview — not billed