The website admin portal
All 28 administration pages: licences and pricing, the AI models chat actually runs on, every organization and user, knowledge hosting, backups and analytics.
Who can get in
Website admin only Sign in at /admin/login. Access comes from a row in the platform's WebsiteAdmins table with an Active status — nothing else grants it. An organization admin, a reseller or a plain user cannot reach these pages, and every page under /admin refuses a circuit that lacks the website-admin role.
The sidebar is grouped as License Control, Management, Analytics, Tenant Admin, Organization and Help. This page follows the same order, with the URL of each page so you can link to it directly. A condensed operator's version, kept next to the pages themselves, is at Admin Help inside the portal.
Dashboard /admin
Read-only. Live SignalR client connections, active sessions, totals for users, teams, organizations and active subscriptions, plus this month's tokens and estimated cost. Below that, the eight most recently updated sessions, a subscription count per plan, and a highlighted banner when new enterprise inquiries are waiting.
Two figures are worth reading carefully. Connected Clients counts add-ins attached right now, so it drops to zero out of hours — that is not an outage. Cost This Month sums the estimated cost of every usage record, including turns that ran on customers' own keys; the split between what you actually pay for and what they pay for is on Usage.
License Control
Licenses /admin/licenses
The subscription record behind every account, team and organization. Filter by plan (Trial, Pro, Team, Org Dedicated, Suspended) or search by name. Each row shows the plan, seat maximum, status and either the days left on a trial or the period end. Suspend and Activate flip the status straight from the row.
+ New License and Edit open the same dialog:
- Plan Type and Status.
- Trial Days and Trial Token Limit appear only for a Trial plan; leaving them blank means “use the global default” from Trial Settings. Extend by adds days to the current trial.
- Max Seats, Monthly Token Limit and Monthly Cost Limit USD — in all three, 0 means unlimited. This is the single most common misreading on the page: a zero seat count does not lock anybody out, it removes the cap.
- Contact name, email and phone appear for an Org Dedicated plan and are what the customer sees on their own licence page.
Saving is immediate and is enforced on the next chat turn. Reducing Max Seats below the number of seats already handed out does not revoke anyone — it only stops new assignments, so tidy up on Org Members as well.
Trial Settings /admin/trial-config
Global defaults — default trial length in days, default trial token limit (0 = unlimited), the maximum number of days a single extension may grant, and the contact address used for notifications. These apply to new registrations only; existing trials keep the end date they already have, which is exactly what you want when you shorten a trial for future signups.
Extend individual trials lists active trials with the fewest days left first. Enter a number of days and press Extend; the new end date is recomputed from the account's creation date plus its base trial length plus every extension granted so far, so repeated extensions accumulate rather than restart the clock.
Pricing /admin/pricing-admin
What the public /pricing page shows. One row per plan: display name and description, monthly fee (0 renders as “Contact us”), included tokens (0 renders as “Unlimited”), the overage price per million tokens, the seats included, and a Show on public pricing page flag for staging a plan before announcing it.
This page is marketing copy, not enforcement. Editing a price here changes nothing about what an existing customer is allowed to do — limits live on their subscription in Licenses, and token cost accounting lives in Token Cost Rates.
Enterprise Inquiries /admin/contacts
Submissions from the public Contact Sales form: company, contact details, which CAD systems they use, estimated user count and their message. View opens the full message and lets you move the status through New → In Progress → Converted or Closed. New inquiries are what the dashboard banner counts, so keeping the status current keeps the dashboard honest.
Resellers /admin/resellers
Partners who own customer companies. A company with no reseller is direct, platform-owned business.
- Add Reseller — a name, an optional slug (generated from the name if you leave it blank, and made unique automatically) and an optional admin user email. The email must belong to a registered account; an unknown address is refused. That account is what signs in at
/reseller/login. - Companies opens a read-only list of that partner's customers with plan, status and seats.
- Deactivate disables the partner without deleting the record or their customers.
What a reseller can then do for themselves is described in Reseller Portal.
License Orders /admin/orders
The approval queue for reseller requests: New company, Increase seats, Decrease seats. The filter opens on Pending. Approve is what applies the change — it creates or updates the subscription's seat count and keeps the dedicated server key records in step — and Reject closes the order without effect. Both record who acted.
If an approval fails, the reason is shown in red at the top and the order stays pending; the usual cause is a target company that no longer exists.
Teams /admin/teams
Teams are the lighter alternative to organizations. + New Team asks for a name, a URL-safe slug and the email of an existing user, who becomes the team admin and its first member. The slug must be unique and both name and slug are required. View lists the members and their roles. The team-facing version of this data is described in Team Portal.
AI models and what they cost
Four pages hold AI keys and only their combination makes sense. Read this section before changing any of them.
AI Providers /admin/providers — the one chat actually uses
Each row is a chat configuration. Config Name selects the agent role it applies to — default, main_agent, worker_agent or verifier. Organization scopes the row to one company, or leave it blank for a Server Default every company can fall back to.
The provider name decides the wire protocol; the model name never does.
Anthropic(orClaude) talks the native Anthropic API. Leave Endpoint blank — filling it switches the client into OpenAI-compatible proxy mode, which fails against the Anthropic API.OpenAI,Groq,OpenRouter,GitHubuse the OpenAI wire format at the vendor's own URL; Endpoint is optional.AzureOpenAIandOllamause the OpenAI wire format and require an Endpoint.openai-compatibleplus an Endpoint is how Gemini, xAI, DeepSeek, Mistral and self-hosted vLLM or LM Studio are configured.
Other fields: API Key (encrypted at rest; on an existing row a blank box keeps the stored key and the masked current value is shown), Temperature, Max Tokens, Context Window (0 = unset), per-model input and output cost per million tokens (0 = fall back to the published table), and Mark as default for this scope.
Saving makes it live on the next chat turn — there is no restart or sync step. A provider name the chat client does not recognise is rejected at save time rather than on a customer's first message.
Token Cost Rates /admin/cost-rates
The published price per one million tokens for each provider and model, in USD. These drive the cost shown in usage statistics and on invoices. Add a rate with the provider, model, input and output prices and a source note; edit any value in the table and press Save on that row. Untick Active to retire a rate without deleting its history.
A turn is priced by the model it used. A model missing from this table falls back to a flat server default, which is how a very cheap model once recorded a cost roughly eight times its real price. To audit a suspicious figure, compute the implied rate from a usage record — cost × 1,000,000 ÷ input tokens — and compare it with the provider's published price. Providers change prices without notice, so re-check against the source when a number looks wrong.
Provider Credentials /admin/platform-providers
A vault for the platform owner's provider keys, with Add Key, Rotate, Remove and a Test button in the dialog. Keys are stored encrypted at rest and only ever shown masked.
Below the table, Default Rate Limits (Platform Key) sets tokens per minute, requests per minute and a daily token cap, applied per tenant whenever they consume the platform-supplied key.
AI Provider (tenant) /admin/tenant-ai-provider
A single tenant's own AI arrangement. The page needs a team-scoped sign-in; without one it reports that no tenant is in scope rather than guessing.
- Enabled credential modes — three independent switches: platform-supplied, tenant BYOK (one shared key for the whole tenant) and user-level BYOK (each person supplies their own).
- Tenant BYOK appears once that mode is enabled: provider, API key with a Test button, a default and a fallback model, and an optional custom URL for a self-hosted endpoint. The key is encrypted at rest under the tenant's own scope; a blank box on an existing config keeps it, and the current value is shown masked.
- Default mode for users — platform-supplied, tenant BYOK, or let each user choose.
- Monthly budget cap in USD, with a progress bar of the current month's spend. 0 means unlimited.
Remember the precedence: a user's personal key on My AI Key beats whatever is configured here.
Tenants and people
Organizations /admin/orgs
Add Organization takes a name, a slug and a Dedicated flag for customers running their own server. Both name and slug are required. Creating a company also creates its messaging-channel settings row, so all channels start enabled and the customer only has to enter credentials.
Org Members /admin/org-members
Pick a company, then manage its people. This is where seats actually get handed out.
- Add member — the email of a registered user plus a role (Member or Org Admin). Adding an address that already has a membership updates that membership's role instead of creating a duplicate.
- Seats — the header line shows seats used against the plan's maximum. Assign seat is refused when the pool is full, with the exact count in the message; increase Max Seats on Licenses first. Revoke hands the seat back.
- Seat holders get the organization's plan. A member without a seat is on Trial and must supply their own AI key before they can chat at all. That is the single most useful thing to explain to a new customer.
- Make Admin promotes someone to
org_admin— and demotes the previous org admin to member, because a company has one tenant admin at a time. Remove deletes the membership only; the user account survives. - Invitations lists pending, accepted and revoked invites with their expiry date; a pending one can be revoked.
Messaging Channels /admin/channels
Per-tenant Telegram, Microsoft Teams and WhatsApp credentials, entered on behalf of a customer. Select the organization, then fill the panels: a Telegram bot token from BotFather; an Entra application ID, directory ID and client secret for Teams, together with an Azure Bot whose messaging endpoint points at this server; a Twilio account SID, WhatsApp number and auth token, with Twilio's inbound webhook pointed here. The last panel controls whether users may self-connect from the add-in and tray Agent.
Secrets are encrypted at rest and a blank box keeps the stored value. Saving is immediate except for a new Telegram bot token, which the messaging service picks up when it next restarts. Customers can do all of this themselves in the org portal — the full walkthrough is Channels & Messaging.
Connections /admin/connections
Per-tenant connections to external systems, again with an organization picker. Same template gallery as the customer's page — Dynamics 365 Business Central, SAP S/4HANA Cloud, ERPNext, Salesforce, HubSpot, Microsoft 365 mail, SendGrid, Postmark and generic REST — plus one field the customer's page does not have:
- Auth mode: Service account stores a shared company secret, encrypted at rest, and the server attaches it when chat calls the API. The secret never reaches a user's PC.
- Auth mode: On behalf stores only OAuth metadata. Each user's token stays on their own machine, which is the right choice when the external system must see who is asking.
Worked configurations with the exact JSON for each provider are on Connections (ERP & Email).
Users /admin/users
A read-only roster: display name, email, the organization of their first membership, that membership's role, whether the account is active, and the last login. Use it to confirm an address is registered before adding it anywhere else — several forms across the portal accept only existing accounts. Memberships and roles are changed on Org Members, not here.
Website Admins /admin/admins
Who can see this portal at all. Grant Website Admin Access takes the email of an existing user; an unknown address, or one that is already an admin, is refused with a message. Revoke marks the grant inactive and Restore brings it back, so history is preserved rather than deleted.
Knowledge, backups and infrastructure
RAG Settings /admin/rag
The platform default RAG server — endpoint and API key — used by every organization that has not configured its own. A badge shows whether the key is configured; a blank box keeps the stored key. Test connection reports the server's embedding model, vector dimensions and version, and is worth pressing before saving.
Organization Overrides below is read-only: which companies point at their own server, the endpoint, whether a key is stored and when it changed. Customers manage this themselves on their RAG Provider page — see Organization Portal.
Backup /admin/backup
Daily encrypted backups of the server's databases, uploaded files and data-protection keys to a OneDrive for Business folder, through a dedicated Entra application with the Files.ReadWrite.All application permission.
- Enabled (daily), plus the Entra tenant ID, client ID and client secret of that application. The secret is encrypted at rest; blank keeps it.
- Target user (UPN) — whose OneDrive receives the archives — and the folder inside it.
- Run hour (UTC) and Keep newest, the retention count.
- Archive passphrase — encrypts every archive.
Test connection verifies the Graph credentials, Backup now runs one immediately, and Refresh list shows what is in OneDrive with size and date. Stage restore requires the passphrase typed into the box next to the refresh button.
Recent runs lists each attempt with its status, file name, size and any error.
Hermes Settings /admin/hermes-settings
Server Settings /admin/settings
A read-only view of the running configuration: database provider, JWT issuer, audience and a masked signing key, the default AI provider and model from configuration, and the environment name. Nothing here can be edited from the browser — these values come from the server's configuration files and environment. Use it to confirm which environment you are actually looking at before making a change somewhere else.
Analytics and shared content
Usage /admin/usage
Four tiles for the current month: total tokens, cost on our key, BYOK tokens and the request count. The distinction matters commercially:
- Only turns run on the platform key cost you money. That is the “billed to us” figure.
- Turns run on a user's or an organization's own key are billed by their provider. Their estimated cost is displayed for reference and excluded from your figure.
- Records created before bring-your-own-key existed carry no key source and are counted as platform.
The table repeats the split per organization with input tokens, output tokens, requests, the amount billed to you and the tokens run on the customer's own key.
Sessions /admin/sessions
Active Connections (SignalR) is the live picture: one row per attached CAD add-in with its connection identifier, user, organization and CAD system, and when it connected. An empty table simply means nobody has CoPilot open. This is the first place to look when a customer reports that chat “does not reach the CAD system”.
Database Sessions is the stored history, filterable by active state, showing the user, CAD system, title, whether the session was remote, and when it was last updated.
Skills /admin/skills
Shared skills — reusable named instructions. Add one with a name, a category, a scope and the instruction body. Scope Common makes it available to everyone on the platform; Organization limits it to a company. Deleting is immediate and there is no confirmation step, so check the name first. What a skill is and how users invoke one is covered in Skills.
Macros /admin/macros
Shared macros, with a name, description, a target CAD system (or Universal for all of them) and the same Common or Organization scope. The version number increments as a macro is updated. Recording and running macros is covered in Macros.
Also reachable from this portal
The sidebar links across into pages documented elsewhere: AI Provider under Tenant Admin (above), and Chat History, Knowledge, My Memory and RAG Provider under Organization. Those are the organization portal's own pages — see Organization Portal. A website admin opening them falls back to their own membership scope, so for company-wide work use the admin pages instead.
Setting up a new company — the short path
- Create the organization on Organizations, or approve the reseller's order on License Orders. All messaging channels start enabled.
- Set the plan and seat count on Licenses.
- Add the people on Org Members and assign their seats. Make at least one of them an Org Admin so they can configure channels, connections and knowledge themselves.
- Decide who pays for the AI: their own key (tenant BYOK on AI Provider), an organization-specific row on AI Providers, or just the Server Default.
- Confirm the model has a rate on Token Cost Rates, so usage is priced correctly from the first turn.
- Send their admin to the Organization Admin Guide and their users to Getting Started.
Common mistakes
- Storing a chat key on Provider Credentials. Chat never reads it. Use AI Providers.
- Filling in an Endpoint for Anthropic. That silently switches to proxy mode and the calls fail.
- Adding a model without a cost rate. The flat default is applied and reported spend can be wildly wrong in either direction.
- Reading 0 as “none”. Across seats, token limits and cost limits, 0 means unlimited.
- Adding a member and expecting them to chat. Without a seat they are on Trial and must add their own AI key first.
- Losing the backup passphrase. There is no recovery path.