> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.moyoinnovations.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.moyoinnovations.com/_mcp/server.

# Changelog

## September 7, 2026

## OpenAI models in the AI Assistant

The AI Assistant's model picker now includes three OpenAI-backed tiers
alongside the existing Claude ones — **GPT Fast**, **GPT Balanced**, and
**GPT Deep** — each supporting the same streaming replies, image
attachments, and (on Balanced/Deep) extended thinking as their Claude
counterparts.

* Model choice stays per-thread, exactly as before — pick a tier when
  starting a thread, or switch tiers on an existing one.
* On the GPT tiers, the "thought process" section may stay empty even with
  thinking on; reasoning still happens and is billed, but a written summary
  isn't always available from OpenAI. See the
  [AI Assistant guide](/guides/ai-assistant) for the full tier list.

## CRM dashboard: a real layout instead of eight identical tiles

The CRM Overview dashboard now sizes each widget by what it actually shows,
instead of forcing every card into the same quarter-width tile. Sales
Funnel, Revenue Trend, Performance Analytics, and Lead Sources — the ones
with real charts, multi-part layouts, or period toggles — now get a full
primary-width tile; Recent Leads, Deal Pipeline, Conversion Metrics, and
Activities stay as compact companions alongside them.

## Clearer validation errors on Lead forms

The Add Lead and Edit Lead forms now surface validation problems as a toast
— one message when a single field is wrong, a count when several are —
instead of a static banner that always read the same regardless of what
was actually wrong. Field-level errors (the red text under a field) also
now clear the instant you fix that field, rather than staying stuck on
screen after you've already corrected it.

## Session-expiry warning now fires on time

The "your session is about to expire" notice was computing against the
wrong session length, so it could show up minutes late, or after you'd
already been signed out. It's fixed to match the real session length, so
the warning — and its "stay logged in" option — now appears with real time
left to act on it.

## September 5, 2026

## Bring your own chatbot

The in-app chat widget is now configured per workspace. Connect your own
[ConvoSphere](https://app.convosphere.site) agent under **Settings →
Organization → Chatbot**: paste the agent ID from your ConvoSphere account,
enable it, and the chat bubble appears for everyone on your team.

* Your agent and its knowledge base stay entirely yours — no other
  workspace can see or use them.
* Owners and Admins configure it; everyone else can view the configuration.
* A workspace that hasn't connected one still sees Moyo's own default
  assistant, exactly as before — nothing changes until you configure your
  own or explicitly turn the widget off.

Previously the widget was a single shared agent applied identically to
every workspace, and could only be changed by redeploying the app. See the
[Chatbot guide](/guides/chatbot) for how to replace it with your own.

## September 4, 2026

## Introducing the AI Assistant

Moyo Suite now has a fifth module: a private, streaming chat assistant
powered by Anthropic's Claude models, available from any page via the "Ask
AI" button in the top bar, or from its own workspace at **AI Assistant**.

* Conversations are saved as **threads** and persist across sessions.
* Choose **Fast**, **Balanced**, or **Deep** depending on whether you want a
  quick answer or deeper reasoning — **Balanced** and **Deep** support an
  optional **extended thinking** mode that shows the assistant's reasoning
  before its answer.
* Attach images and text files (PDF, CSV, Markdown, JSON, plain text) to a
  message once a conversation is started.
* Replies stream in as they're generated, the same way you'd expect from a
  modern chat product.

> **Note**
>
> Threads are private to the person who created them — unlike most of Moyo
> Suite, this includes Owners and Admins. See the
> [AI Assistant guide](/guides/ai-assistant) for what that means and what data
> leaves your workspace when you use it.

Like every module, the AI Assistant is opt-in per organization and billed
separately — see [Plans & Modules](/guides/plans-modules).

## Your plan now decides which modules you get

Signing up put every new workspace on the Free plan but switched on all four
modules — CRM, Billing, Expense and Inventory — regardless of what Free
actually includes. The onboarding wizard did the same: it checked that the
modules you picked were real, never that your plan included them.

A workspace now only gets the modules its plan bundles. Free includes CRM;
Starter adds Billing and Expense; Pro and Enterprise include all four.

> **Warning**
>
> **This changes existing workspaces.** A workspace running on Free with Billing,
> Expense or Inventory switched on will lose access to them, because it was never
> entitled to them. If you need those modules, move the workspace to a plan that
> includes them — an admin can do this from the platform console, and doing it
> *before* you upgrade avoids any interruption.
>
> Modules bought as a standalone add-on are not affected and stay enabled.

If you pick a module the wizard can't give you, onboarding still completes with
what your plan allows and tells you which ones were left out and why, rather
than silently enabling them.

## One way to create a workspace

There were two ways to create a workspace, and only one of them worked
properly. The second, older route created the organization and the owner
account but nothing else — no team membership, no roles, no permissions, no
modules — so the owner could sign in and then be refused by every screen in the
product. It also skipped email verification entirely.

That route is gone. Signing up through the app is unchanged; it was already
using the correct path.

> **Note**
>
> Workspace addresses are also now checked against the reserved list on the
> remaining route — names like `www`, `api`, `app` and `accounts` belong to Moyo
> itself and can't be claimed. This check previously only existed on the route
> that was removed.

## Fixes

**Sample data is no longer duplicated.** Finishing onboarding a second time
with an extra module selected — going back to add Inventory, say — re-ran the
sample-data step and left you with two of every example contact, deal and
account. Onboarding now records that the sample data has been created and won't
create it again.

**Roles and permissions no longer error on the first page load after an
update.** When a release added new permissions, the first few requests after it
went live could collide with each other while filling them in, and one would
fail with a server error. Filling them in is now safe to do concurrently.

**A brand-new workspace can no longer end up with a duplicated deal pipeline.**
Opening the deals board at the same moment as creating your first deal could
set up the default pipeline twice, leaving twelve stages instead of six and two
stages answering to the same name.

## September 3, 2026

## WhatsApp's 24-hour reply window is now visible and enforced

WhatsApp only lets you send a written reply within 24 hours of a customer's
last message. After that, only a pre-approved template gets through.

Moyo used to ignore this. Replying to a day-old conversation sent the message
anyway, WhatsApp rejected it, and you got an unhelpful provider error with no
explanation. Worse, picking a template — the one thing that *would* have
worked — failed in exactly the same way, because templates were being sent as
ordinary text rather than as real templates.

Now:

* The conversation shows when the window closes, and the composer explains
  what to do once it has.
* Sending a template outside the window sends it as a genuine template, so it
  reaches the customer.
* A plain reply outside the window is refused before it is sent, so your
  transcript no longer fills with failed messages.
* Internal notes are never blocked — they don't go to the customer, so
  WhatsApp's rules don't apply.

> **Note**
>
> The clock is measured from the customer's last **incoming** message, not from
> your last reply — replying doesn't extend the window. Any incoming message
> resets it, including a photo or a voice note.

## Items now respect workspace permissions

The Items area previously had no permission checks at all — any signed-in
member could list, add and delete items regardless of their role. It now uses
the same permission model as everything else, with separate **view**, **create**
and **delete** permissions.

Existing roles keep working: Owner, Admin and Manager can view, add and delete;
Viewer can view.

> **Note**
>
> One change to be aware of: the **Member** role can now view items but not add
> or delete them. Members previously could, because nothing was checking. If your
> team relies on members adding items, grant them the permission from
> Settings → Roles.

## Removing an organization is now reversible

Deleting an organization used to be permanent and immediate — the record and
everything under it, every invoice, deal, contact and audit entry, went at
once, including the log that would have recorded the deletion.

An organization can now be marked as deleted instead. It stops being
reachable straight away, exactly as a suspended one does, but its data is
still there if the deletion needs undoing.

## Fixes

**Stock and WhatsApp messages are now isolated per workspace.** Two internal
uniqueness rules were not scoped to your organization. In practice this meant
two workspaces stocking the same catalogue product could conflict, and — for
WhatsApp — two workspaces using the same provider could be handed the same
message identifier, causing one of them to lose an incoming message as a
presumed duplicate. Both are now scoped to the workspace.

**Quotations and proforma invoices can no longer be linked to a deleted
customer.** Creating one against an account or deal you had already deleted
was accepted; it is now rejected the same way an unknown account is.

## September 2, 2026

## WhatsApp messages now find the customer you already have

When someone messages your WhatsApp Business number, Moyo checks whether
that number already belongs to a lead or a contact before creating anything
new. Previously that check only matched when the stored number happened to
be written in exactly the same format WhatsApp sends — no `+`, no spaces,
no brackets — so in practice it almost never matched. A customer already in
your CRM would arrive as a stranger, and every message from them created
another duplicate lead with a placeholder email address.

Numbers are now matched on their digits, so all of these are recognised as
the same person:

* `+91 98765 43210`
* `098765 43210`
* `9876543210`
* `+1 (415) 555-1001`

This applies to numbers however they got into Moyo — typed into a form,
brought in by CSV import, or captured from an earlier WhatsApp conversation.
Existing records are matched automatically; nothing needs re-importing.

The number you typed is still shown exactly as you typed it. Matching uses a
separate normalized value maintained behind the scenes.

> **Note**
>
> If duplicate leads were created before this change, they are left as they
> are — merging them is your call. New messages thread onto the oldest
> matching record, so the duplicates stop accumulating.

## Photos, PDFs and voice notes no longer disappear

Only plain text messages used to be recorded. If a customer sent a photo of
the product they wanted, a PDF purchase order, a voice note, their location,
or tapped a button on one of your templates, **nothing was saved at all** —
no message, no conversation, and for a first-time sender, no lead. Nobody at
the business ever found out they had been in touch.

Every message type is now captured, and the conversation shows what arrived:

| They send           | Your inbox shows                                            |
| ------------------- | ----------------------------------------------------------- |
| Photo or video      | **Photo** / **Video**, plus their caption if they wrote one |
| Document            | The filename, e.g. **purchase-order.pdf**                   |
| Voice note or audio | **Voice message**                                           |
| Location            | **Location**, with the place name and address               |
| Contact card        | The contact's name                                          |
| Quick-reply button  | The button they tapped, as their reply                      |

A first-time sender now becomes a lead whatever they sent — a photo-first
enquiry is still an enquiry.

> **Note**
>
> The message text still only ever contains words the customer actually typed.
> A photo sent without a caption shows as **Photo** with no message body,
> rather than a made-up placeholder — the transcript stays a faithful record
> of what they said.

Attachments are recorded with a reference to the file, and the label tells
you what was sent. Downloading the file itself into Moyo is coming next.

## The platform admin console is reachable again

Opening **/admin** as a Moyo platform administrator bounced back to the login
page, then out to your account profile — the console could not be opened at
all by the role it exists for. Two things were wrong: `/admin` was being
treated as a workspace page and rewritten to `/{workspace}/admin`, which does
not exist, and a platform admin has no workspace to put in that slot. Once
past that, the console crashed on a missing notifications provider.

Both are fixed. **/admin** now opens the Platform Overview directly, with
tenants, global users, infrastructure, system health, feature flags and the
audit trail.

## August 18, 2026

## Workspace switching

Opening a different organization from **Account → Organizations** now
actually switches your active workspace instead of silently continuing to
operate against your previous one. Creating an additional organization
while already a member of one no longer fails.

## Session-expiry warning

You'll now see a warning about 5 minutes before your session expires, with
a **Stay logged in** option to extend it in place — instead of being
silently logged out mid-work with no chance to save.

## Dashboard resilience

If a single dashboard widget fails to load, it now shows an inline
"Failed to load" card with a retry option instead of taking down the
entire dashboard.

## Lead email lookup

The lead edit form's email field now offers the same duplicate-detection
and auto-fill suggestions (from existing leads and contacts) that the new
lead form already had.

## August 17, 2026

## Import/export wizard resilience

The bulk import wizard now rejects empty files and files over the
per-format size limit (256MB CSV / 50MB XLSX) before uploading, instead of
uploading first and failing later. Only one import can run at a time — the
wizard shows a clear message and disables uploads while another import for
your workspace is still in flight.

## Import and export history

Past import jobs are now listed at **Settings → Data → Import → View
import history**, with row counts, status, and a download link for any
row-level error report. Past exports are listed on the Export page itself,
with a re-download link for anything still available.

## August 15, 2026

## Fixed the bulk import wizard getting stuck after upload

Clicking **Upload & Continue** could silently do nothing if the file upload
failed — the wizard now shows an error instead of hanging on step 1 with no
feedback.

## Saved import mapping templates

The import wizard's Map Fields step can now save a column mapping as a
reusable template ("Save as template") and load it again on a future
import, instead of remapping every time. Manage saved templates — rename,
set a default per entity, or delete — at **Settings → Data → Import →
Manage templates**.

## August 12, 2026

## Redesigned auth pages

Login, signup, and every other auth/flow screen (magic link, 2FA setup and
verification, password recovery, email verification, unsubscribe
preferences, workspace creation, and team invites) now share a single dark,
split-screen layout — a bordered form panel alongside a product panel whose
icon, headline, and accent color change per screen. No functional changes:
same fields, same actions, same validation.

## August 10, 2026

## Documentation now covers the real product

Replaced the placeholder content scaffolded alongside the Fern project
(fictional AI-agent/knowledge-base/conversation docs, a non-existent SDK,
and an MCP section) with real documentation of Moyo Suite as it exists
today:

* Getting Started now covers real signup, the onboarding wizard, and the
  actual login/2FA/session model — not API keys, which aren't available yet
* New Product Guides for CRM, Billing & Invoicing, Inventory, Expense
  Management, Data Import & Export, Team & Permissions, and Plans & Modules
* Errors and Rate Limits now document the actual response shapes and
  SlowAPI limits instead of placeholder values
* Removed the Webhooks, MCP, and SDKs sections — none of these are shipped
  features today

## August 9, 2026

## Release 1.1 — CRM, Billing, Inventory, and Expense Management

The biggest platform update to date. Moyo Suite goes from a single-purpose
tool to a connected business suite — see the [Product Guides](/getting-started/introduction)
for the full detail on each module below.

**CRM** — leads, contacts, accounts, and deals on a configurable pipeline,
with a kanban board for moving leads and deals between stages, activities
(calls, meetings, tasks) attached to any record, and custom fields per
entity. See [CRM](/guides/crm).

**Billing & Invoicing** — invoices with line items and automatically
computed totals, credit notes, payment recording, and per-organization tax
rates, payment terms, invoice templates, and document numbering. See
[Billing & Invoicing](/guides/billing).

**Inventory** — product and stock tracking for a single location, with
every change to a stock count logged as an adjustment with a reason —
including automatic adjustments when an invoice is sent. See
[Inventory](/guides/inventory).

**Expense Management** — general and mileage expenses, expense categories,
individual or batch approval, expense reports, and rebilling a billable
expense straight onto a client's invoice. See
[Expense Management](/guides/expense).

**Data Import & Export** — a guided wizard for bulk-loading or exporting
CRM, billing, inventory, and expense records from a CSV or XLSX file, with
vendor presets for Zoho, HubSpot, and Salesforce exports, a review step
before anything commits, and the ability to undo an import. See
[Data Import & Export](/guides/data-import-export).

**Team & Permissions** — invite teammates and assign one of seven
role-based permission profiles (Owner, Admin, Manager, Member, Viewer,
Billing User, Expense Approver) that govern access across every module.
See [Team & Permissions](/guides/team-permissions).

**Guided setup** — new organizations now go through a step-by-step wizard
covering business details, tax compliance, module selection, bringing in
existing data, and inviting the team. See
[Creating Your Organization](/getting-started/creating-your-organization).

**Plans & Modules** — CRM, Billing, Inventory, and Expense Management can
now be added or removed independently of your plan tier. See
[Plans & Modules](/guides/plans-modules).

**Account security** — added authenticator-app-based two-factor
authentication and a sessions screen for seeing and revoking every device
you're signed in on. See [Authentication](/getting-started/authentication).

Also included: standardized date, currency, empty-state, confirmation, and
error-page behavior across the product, and improved data consistency
during bulk operations and concurrent billing/inventory updates.

## August 8, 2026

## Developer platform launch

Scaffolded the Moyo Suite docs on Fern: Getting Started, Product Guides, API
Reference (generated from OpenAPI), and this changelog.