{{ annIcon }}
{{ annText }}
{{ sampleBarText }}
{{ trialBarTitle }} {{ trialBarBody }}
{{ dashGreeting }}
{{ dashDateLine }}
Layout
Reset restores the layout recommended for your role.
Every card is on the board.
{{ deskW.kpis.title }}
{{ deskW.deflect.title }}
Tickets avoided
{{ deflect30 }}
in the last 30 days
Times someone found their own answer in the portal instead of raising a ticket — work that never reached your queue.
Doing the most work
{{ t.count }}
{{ deflectEmptyText }}
{{ deskW.sla.title }}
SLA at risk
{{ deskW.cat.title }}
Open tickets by category
{{ c.label }}
{{ c.count }}
{{ deskW.csat.title }}
CSAT this week
{{ csatPct }}{{ csatSub }}
{{ csatFoot }}
{{ deskW.coverage.title }}
Coverage & delegation
{{ covCardSub }}
{{ covEmptyText }}
{{ cv.title }}
{{ cv.sub }}
{{ deskW.triage.title }}
Needs triage
{{ triageCount }}Every ticket has an owner. Nice.
{{ deskW.awaiting.title }}
{{ awaitingTitle }}
{{ awaitingCount }}{{ awaitingEmptyText }}
{{ deskW.projopen.title }}
Open projects
{{ dashProjCount }}No open projects.
{{ deskW.projmine.title }}
Projects assigned to me
{{ dashMyProjCount }}Nothing assigned to you right now.
{{ deskW.reqs.title }}
Equipment requests
{{ reqsEmptyLabel }}
{{ r.title }}
{{ r.sub }}
{{ r.meta }}
{{ deskW.cal.title }}
{{ d.name }}
{{ d.dateLabel }}
{{ calPk.badge }}
{{ calPk.title }}
{{ calPk.when }}
Who: {{ calPk.who }}
{{ vocClientSing }}: {{ calPk.co }}
{{ calPk.notes }}
{{ calManagedNote }}
{{ ceHead }}
Title
Date
Until (optional)
Time (optional)
{{ ceWhoLabel }}
{{ ceWhoHint }}
{{ vocClientSing }}
Repeats
Details (optional)
{{ ceErr }}
{{ calMonthLabel }}
MonTueWedThuFriSatSun
{{ c.num }}
Nothing scheduled this month.
{{ m.dayLabel }}
{{ deskW.trend.title }}
Opened vs resolved · 7 days
{{ trendDeltaText }}
{{ trendOpenTotal }}opened
{{ trendResTotal }}resolved
{{ deskW.daily.title }}
My day
{{ myDayLeft }}
{{ md.label }}
Nothing on the list. This one is just yours — nobody else on the desk sees it.
{{ deskW.moves.title }}
Onboarding & offboarding
Nobody joining or leaving right now. A ticket that reads like a new starter offers to open one.
{{ deskW.focus.title }}
Waiting on you
{{ focusCount }}
Nothing waiting on you right now. Anything you want to remember goes in My day.
{{ deskW.recvisits.title }}
Recurring visits
{{ recCardCount }}
No visit schedules yet. Add one on a client and its ticket is raised for you each period.
Answers come from your own desk
AI suggestions and drafted replies are answered from these articles and your resolved tickets — {{ kbScopeNote }} Article search and portal deflection are plain keyword retrieval and keep working with AI switched off.
Weekly advisory feed Platform owner
{{ feedSub }}
{{ feedErr }}
{{ fi.title }}
{{ fi.meta }}
Satisfaction — last 7 days
{{ csatPopSub }}
{{ csatPct }}positive
{{ d.label }}
{{ d.value }}
{{ d.pct }}
No ratings yet this week. Requesters are asked once, on the request itself, when it is resolved.
Open tickets by category
{{ catPopSub }}
{{ catPopTotal }}open
{{ d.label }}
{{ d.value }}
{{ d.pct }}
{{ viewTitle }}
{{ viewCount }}
{{ t.idLabel }}
{{ t.reqInitials }}
{{ t.asgInitials }}
{{ t.updatedLine }}
✓
Nothing here
No tickets match this view right now.
{{ selectedCount }} selected
Time logged
{{ timeTotalLabel }}
{{ te.minutes }}
{{ te.billLabel }}
{{ te.typeLabel }} · {{ te.who }} · {{ te.note }}
Snippets
Canned responses for the ▾ menu. {{ snScopeNote }}
No snippets yet — add one below.
{{ snErr }}
Quick reply buttons
Up to three one-click inserts above the reply box. {{ qrScopeNote }}
{{ sl.n }}
Maximum reply length
Characters allowed in one reply. Default 32,000.
{{ qrErr }}
{{ fieldModalTitle }}
{{ fieldModalDesc }}
On this ticket
Add someone
Everyone's already on it.
{{ m.initials }}
{{ m.from }}Internal note {{ m.time }}
{{ m.redactedNote }}
{{ m.body }}
{{ m.attCount }}
{{ mvRunText }}
{{ mvHintText }}
Research is ready — {{ aiResSummaryLine }}.
{{ kbCaptureNote }}
Reply
{{ replyCount }} / {{ replyMax }}
min
Internal only
{{ attBusyLabel }}
{{ attErr }}
Drafted from:
{{ aiErr }}
{{ projViewTitle }}
Planned work with a budget and a finish line. The day-to-day still happens on linked tickets — their hours roll up here automatically.
{{ sc.label }}
{{ sc.value }}
No projects yet
Create a project for planned work — an office move, a workstation refresh, a new-hire batch. Link tickets to it and their hours roll up against the budget.
{{ p.name }}
{{ p.sub }}
{{ p.metaLabel }}
No projects in this view.
{{ projDetail.name }}
{{ projDetail.sub }}
{{ st.label }}
{{ st.value }}
Project manager
{{ projDetail.managerInitials }}{{ projDetail.managerName }}
Not assigned
Checklist
{{ t.label }}
{{ t.byLabel }}
Stage the work as steps — rack the server, migrate mailboxes, hand over — and tick them off as they land. Who ticked what, and when, is kept.
{{ movesTitle }}
{{ movesSub }}
{{ movesEmptyLabel }}
{{ m.person }}{{ m.kindLabel }}
{{ m.sub }}
{{ m.progLabel }}
{{ eqPageTitle }}
{{ eqPageSub }}
{{ equipMsg }}
Nothing in this view yet.
{{ e.catLabel }}{{ e.visLabel }}
{{ e.name }}
{{ e.desc }}
{{ e.priceLabel }}
Nothing here. New requests land in this list, on your dashboard, and in your inbox.
Decline this request
{{ eqDecSub }}
{{ eqPk.client }}
Equipment request
{{ eqPk.note }}
{{ m.k }}{{ m.v }}
Recurring visits — {{ cd.name }}
A ticket is created on schedule so the tech has somewhere to log the visit — time entered on it bills into the contract and the timesheet like any other work.
{{ r.title }}
{{ r.sub }}
No schedules yet. Add one for a weekly or monthly onsite visit and its ticket is raised for you each period.
Software checklist — {{ suClient }}
What gets installed and configured on a new machine here. Tick each item as you do it — who ticked it, and when, is kept. The list stays for the next machine.
{{ suProgLabel }}
Nothing listed yet. Add what a new machine needs here — Revit, licence seats, VPN, drive mappings.
Put a note after a dash — it shows under the item.
{{ suErr }}
{{ eqEditTitle }}
Name
Description
Price ($) — blank = quoted
Category
Visible to
{{ eqErr }}
{{ tplTitle }}
{{ tplSubtitle }}
No checklists yet — add one below.
Used for
{{ tplEdCount }}
Steps — one per line, in order
{{ tplErr }}
{{ mvPk.person }}
{{ mvPk.sub }}
{{ mvPk.ownerLabel }}
Every step is done — this is your record that it was handled.
{{ mvPk.notes }}
New at {{ mvPk.company }} — invite them to the portal so their tickets land under the right person from day one.
{{ mvPk.person }} still has a portal sign-in at {{ mvPk.company }}. Suspending keeps their tickets and history.
Steps{{ mvPk.progLabel }}
{{ t.label }}
{{ t.doneBy }}
{{ mvHead }}
Pick a list and it copies the steps in. You can add or remove steps on this run without changing the template.
Their name
Job title
{{ mvCompanyLabel }}
Needs to be done by
Who is running it
Checklist
From ticket # (optional)
Anything specific (optional)
{{ mvErr }}
Knowledge health
What the knowledge base is saving you, what it is missing, and what has gone stale.
{{ kbhDeflect30 }}
tickets avoided, 30 days
{{ kbhPublished }}
published articles
{{ kbhDrafts }}
waiting for review
Answered more than once, never written down
Nothing repeating yet — this fills in as tickets are resolved.
{{ g.sub }}
Needs a look
Nothing stale — everything has been touched recently and is still rated useful.
{{ st.why }}
Doing the most work
{{ t.count }}
{{ kbErr }}
{{ kbGapTitle }}. {{ kbGapWhy }}
{{ g.title }}
{{ g.sub }}
No articles yet
Write up a fix once and every technician has it. Articles marked Public also reach the portal — fill in For the requester and they head off tickets before anyone files them. {{ kbEmptyScopeNote }}
Nothing matches that search in this scope.
{{ kbQuietLine }}
{{ kbArticle.title }}
{{ kbArticle.clientHidWhy }}
{{ kbArticle.scopeLabel }}
{{ kbArticle.visLabel }}
Not shown to clients
{{ kbArticle.srcLabel }}
{{ kbArticle.catName }}
{{ kbArticle.tagLabel }}
{{ kbArticle.updatedLabel }}
{{ kbArticle.draftNote }}
Symptoms
{{ p.p }}
Resolution
{{ p.n }}
{{ p.p }}
Public and published, but with no “For the requester” steps clients see nothing for it — the portal only offers steps a person wrote for them.
For the requester
{{ kbArticle.reqProseText }}
{{ p.n }}
{{ p.p }}
{{ kbArticle.reqLine }}
{{ kbArticle.reqLine }}
Cause & notes
{{ p.p }}
Sources
Published {{ kbArticle.pubDate }}
This is failing more often than it helps — {{ kbArticle.notHelpfulCount }} people said it did not solve their problem. Worth a review.
Did this work?
{{ kbArticle.resolvedLabel }}
{{ kbArticle.byLine }}
{{ billFilterLabel }}
{{ ctEditHeading }}
{{ vocClientSing }}
Contract type
Status
Starts
Ends
Billing period
Notice (days)
{{ ceValueLabel }}
{{ ceRateLabel }}
After hours (% of rate)
Block hours per period
Renewal term (months)
Account manager
Service level
{{ ceSlaHint }}
PO / reference
Excluded work
✓
Auto-renew at the end of the term
✓
New tickets are billable by default
Notes
What changed (goes in the amendment history)
Every change is stamped with your name either way. This line adds the reason, so the renewal conversation has the story and not just the numbers.
{{ ceErr }}
{{ ct.client }}
{{ ct.type }}
{{ ct.status }}
{{ ct.value }}
{{ ct.valueNote }}
{{ ct.termLine }}
{{ ct.renewLine }}
{{ ct.notes }}
{{ ct.noticeText }}
Profitability
{{ ct.marginLabel }}
{{ p.label }}
{{ p.detail }}
Block drawdown
{{ ct.blockLabel }}
{{ ct.marginNote }}
Coverage
{{ c.k }}
{{ c.v }}
Recent time
{{ a.when }}
{{ a.what }}
Logged on this client’s tickets. Time is never entered against a contract directly.
No time logged against this contract yet. It appears here when a technician logs minutes on one of {{ ct.client }}’s tickets — nothing is entered on the contract itself.
Documents
{{ cdocCount }}
{{ cdocErr }}
{{ cd.ext }}
Your role cannot see contract paperwork. Ask an admin if you need it.
{{ cdocEmptyNote }}
Amendment history
{{ h.when }}
{{ h.kindLabel }}
{{ h.what }}
{{ h.by }}
Edits, renewals and notes, newest first — the paper trail for the renewal conversation.
{{ ctCountLabel }} · {{ ctMrrLabel }} recurring. Hours and margin come from the time entries on each client’s tickets.
{{ ctErr }}
No contracts yet
A contract records what you agreed and when it ends, so the renewal date is real and every hour logged can be measured against it. Draft one from each client record, or add the first by hand.
{{ ctNeedsTitle }}
{{ profitHeading }}
{{ profitSub }}
{{ p.pctLabel }}
{{ p.label }}
{{ bInvHeading }}
{{ bPropDraftLabel }}
{{ bInvDraftLabel }}
{{ bInvOverdueLabel }}
{{ bInvSub }}
Invoice appearance
The brand colour is used on invoices and quotes, and on the emails your clients receive — the header tint, links and buttons. The footer note goes on the PDF and at the bottom of emailed invoices. Your branding logo is used automatically — upload a different one only if invoices should look different.
Brand colour
Accent colour
Lightness
Document style — applies to invoices and quotes alike
Company details — address, phone, email (shown under your name)
Footer note — payment instructions, remit-to, terms
{{ wiAppErr }}
Generate invoice
Pick the client — everything else is already known. Nothing is sent; you get a draft to check first.
Client
What lands on the draft
Their contract's fee for this period — recurring, retainer or fixed — as one line.
Every billable hour logged on their tickets that has not been invoiced yet, at the contract rate.
A due date 14 days out. Those hours lock so they can never be billed twice.
{{ wiGenErr }}
No proposals yet
Quote a project before it exists — create a proposal, send it like an invoice, and when the client approves it one click creates the project with the budget already set.
Import-clean line items — no accounting integration fees.
{{ tsBillable }}
billable
{{ tsNonBillable }}
non-billable
{{ tsTotal }}
logged in {{ tsDaysLabel }}
Blended technician cost
{{ costRateDesc }}
$
per hour
By technician
{{ u.label }}
No time logged yet
Time appears here when a technician logs minutes on a reply, or records them in the Resolve dialog. Nothing is ever logged automatically.
AI assistant
{{ aiStatusText }}
Runs on AECDesk Intelligence — our hosted service, kept current as better models ship, at no change to your price. Your tickets are never used to train anyone's model{{ aiExcludeNote }}.
{{ aiKeyLabel }}
Only used when “use our own key” is on below. Encrypted with AES-256-GCM before it is stored, and never sent back to the browser. Save an empty field to remove it.
This server has no app_secret set, so keys cannot be encrypted — saving one is blocked until it is. Nothing is stored in the clear.
{{ aiKeyMsg }}
Monthly spend cap
AECDesk Library
{{ intelSub }}
Per-client AI
Enable the assistant client by client — a disabled client's tickets never touch the model (some CMMC contracts require this).
{{ c.name }}
{{ c.note }}
The assistant is switched off — turn it on under AI assistant first.
Credits are the prepaid actions your technicians spend — one pack per technician per month, topped up any time. Every action’s price is listed below.
AI credits
Nothing runs on its own — an action is only used when someone presses a button. Buy a pack per technician, or top up when you need more.
{{ aiMsg }}
{{ aiMonthLabel }}
{{ aiLeftLabel }}
{{ aiUsedLabel }}{{ aiPctLabel }}
{{ aiTrialLabel }}
Technician packs — {{ aiMonthlyLabel }}
Give a pack to each tech who should have the AI buttons — {{ aiPerSeatLabel }}. {{ aiIncludedLabel }}.
{{ aiSeatsLabel }} bought before per-technician assignment existed. Toggle the techs below to assign them — the pack count and monthly price update automatically.
{{ p.initials }}
{{ p.statusLabel }}
{{ p.usageLabel }}
{{ p.poolLabel }}
{{ p.usageLeft }}
Shared top-up pool
Anyone can draw from this once their own monthly actions are gone — no assignment needed.{{ aiTopupSentence }}
{{ aiPoolLabel }}{{ aiPoolLeft }}
{{ aiSuggestLabel }}
Previous months
{{ h.label }}
{{ h.usedLabel }}
What each action costs
Every one of these is a button a technician presses. Nothing is charged in the background, and nothing runs just because a panel was opened.
{{ c.name }}
{{ c.what }}
Research costs more because it runs several live searches against vendor documentation. Suggested articles, ticket search and knowledge matching are keyword-based and always free — they keep working with AI switched off.
The assistant is switched off — turn it on under AI assistant first.
Branding
Your logo and name appear on the sign-in page {{ brandAudience }}, and in the app itself.
Logo
Square works best — PNG, JPG, WebP or SVG, under 250 KB.
Name on the sign-in page
Leave blank to use your workspace name.
{{ brandMsg }}
{{ brandErr }}
Preview
{{ brandPreviewName }}
Powered by AECDesk
{{ brandUrl }}
{{ intHelp.title }}
{{ intHelp.intro }}
{{ st.n }}
{{ st.t }}
{{ intHelp.foot }}
Your AECDesk subscription
Payment is handled by Stripe — card details never touch AECDesk. Cancelling keeps your data; the workspace is suspended, not deleted.
Plan
{{ stPlanLabel }}
Billed for
{{ seatEach }} · {{ seatTotal }}
{{ seatMsg }}
Next
{{ stRenewLabel }}
{{ stErr }}
AI credit packs
Buy a block of AI actions any time — a one-off charge on the same card, added to this month straight away.{{ aiTopupSentence }}
{{ aiMonthLabel }}
See usage per technician →
{{ aiUsedLabel }}{{ aiLeftLabel }}
{{ aiBreakdownLabel }}
A shortcut on every {{ vocClientLower }} machine
Downloads a desktop shortcut that opens your sign-in page, named {{ scName }} Support and carrying your logo — your branding if you have set it, our mark otherwise. Hand it out, or push it with your RMM.
One click — your name and logo, its own window, pinnable to the taskbar. The downloads below are for pushing to {{ vocClientLower }} machines.
Deploying it
1. Put support.ico at C:\ProgramData\AECDesk\support.ico — the shortcut looks there for its icon.2. Copy the .url file into C:\Users\Public\Desktop so everyone on the machine gets it.
3. Both are two lines in an RMM script or a GPO file copy — set it up once per site and new machines pick it up.
Windows only draws an icon from a local file, which is why the .ico is a separate download rather than baked in. Skip step 1 and the shortcut still works — it just wears the browser's icon.
Getting started
What each part of AECDesk does and where to begin. The short version: add your {{ vocClientsLower }}, connect email, invite your team — tickets take care of themselves.
1 · Dashboard
Your morning view — key numbers, what is waiting on you, equipment requests and SLA risk. Every card can be resized, hidden, added or reordered with the layout button, per person.
2 · Tickets
Everything lands here: portal requests and email. Assign, reply, log time, attach a file, link an article. The AI tab drafts replies and suggests fixes from your own knowledge base.
3 · {{ impCompaniesLabel }}
One card per {{ vocClientLower }} — primary and backup engineer, their people, the software checklist for a new machine, and recurring visits. Invite a lead so requests arrive under the right name from day one.
4 · Projects
Planned work with a budget and a finish line. Link tickets so hours roll up automatically, and stage the work with the checklist — progress is provable afterwards.
5 · Onboarding & offboarding
Joiners and leavers, run from reusable checklists. A ticket that reads like a new starter offers to open one, and the ticket then tracks the checklist to completion.
6 · Equipment catalogue
What people can request from the portal, grouped by category and priced (or quoted). Requests land on your dashboard and in the Requests view here.
7 · Knowledge base
Write a fix once — it answers portal searches and feeds AI suggestions. Each article has two bodies: Resolution for your engineers, and For the requester — four plain steps, the only thing clients ever see. Leave it blank and the portal shows nothing for that article — it never shows a technician procedure. Resolve a ticket and it offers to turn the fix into an article. The AECDesk Library adds curated starter and advisory articles, free.
8 · Billing & time
Contracts, proposals, invoices and timesheets on an MSP desk; hours and labour cost on an in-house desk. Quotes preview the exact email before you send, and after-hours time bills at the contract premium.
9 · Calendar
Visits, meetings, time off and holidays. Recurring visits schedule themselves; time logged on a visit bills correctly.
10 · Portal
What requesters see: raise and follow requests, read public articles, request equipment. Their view is scoped to their own company — always.
11 · Settings
Ticketing rules and SLAs, business hours, sign-in and Microsoft 365, branding, users and roles, outgoing email, AI. Most switches save on their own.
12 · AI assistant
Drafted replies, summaries, triage and research — powered by AECDesk Intelligence, never trained on your tickets. Buy credits from the AI page; the Library stays free either way.
Helpdesk features
Not every team runs deadlines and surveys. Switch either off and it disappears everywhere — dashboard cards, ticket lists, and the portal — for the whole workspace.
SLA deadlines
Response/resolution targets by priority, the "SLA at risk" list, and deadline chips on tickets.
CSAT surveys
The "How did we do?" thumbs after a ticket is resolved, and the weekly satisfaction card.
{{ ftMsg }}
Business hours
SLA countdowns only run during these hours — nights, weekends and days you don't cover are paused, so deadlines reflect the time you actually promised.{{ bhPerClientNote }} Changes save on their own.
Working days
Opens
Closes
Timezone
{{ hoursTzNote }}
Auto-close resolved tickets
Resolved tickets with no further reply from the requester close on their own after the set number of days. Closing only tidies the queue — logged time and billing are untouched, and a client reply reopens the ticket. Changes save on their own.
Close afterdays of no reply
Bring your data across
Export a CSV from your current system, check the column mapping, import. You run it, your data never passes through us, and every run can be undone.
What are you importing?
Exported from
{{ impSourceNote }}
Past imports
Nothing imported yet.
{{ b.title }}
{{ b.sub }}
{{ st.n }}
{{ st.label }}
Choose your file
{{ impPickHint }}
{{ impFileErr }}
{{ impFileSummary }}
Check the column mapping
{{ impMapHint }}
{{ impMapErr }}
Dry run — nothing written yet
Checking your rows…
{{ impPrevCreate }}
to create
{{ impPrevUpdate }}
already here — will be updated
{{ impPrevSkip }}
skipped
{{ impPrevErrTitle }}
Row {{ e.line }} — {{ e.msg }}
Import
{{ impProgLabel }}
{{ impRunErr }}
{{ l.l }}
{{ impDoneNote }}
How your users sign in
{{ signinPageSub }}
Sign in with Microsoft
{{ m365Status }}{{ ssoMsSub }}
{{ ssoWorksNote }}
Sign-in codes — client users only
Staff at a client can sign in with a one-time emailed code instead of a password — but only for clients whose email domains you have verified. Turn it on per client under Clients → open the client → Edit company.
{{ codeSummary }}
Two-factor authentication
A 6-digit code from an authenticator app (Microsoft Authenticator, Google Authenticator, 1Password, Authy) on top of the password. Off everywhere by default — switch it on where you want it.
{{ mfaLockNote }}
Require it for your team
{{ mfaStaffNote }}
{{ mfaCliTitle }}
{{ mfaCliNote }}
{{ mfaPerClientTitle }}
{{ mfaNoClientsMsg }}
{{ c.name }}
{{ c.countLabel }}{{ c.note }}
Who has it set up
{{ mfaCardErr }}
{{ p.initials }}
{{ p.chipLabel }}
{{ p.name }}
{{ p.sub }}
Support email address
The address clients write to. Anything sent here opens a ticket, and replies to ticket notifications land on the ticket.
Your AECDesk address — works now, no setup
{{ mboxSystem }}
Open new tickets from email
{{ mboxNewSub }}
Use your own address instead
{{ mboxStatusLabel }}
No DNS changes needed — you just forward your address to ours. In Microsoft 365: Admin center → the mailbox → Mail → Manage email forwarding.
Forward it here
{{ mboxForwardTo }}
{{ mboxMsg }}
{{ mboxErr }}
Send replies from your domain too
Optional. Two DNS records and outgoing mail shows your address instead of ours.
{{ r.type }}
{{ r.value }}
{{ r.note }}
Outgoing email
How replies, notifications and invoices leave AECDesk. {{ mailSummaryLine }}
Server mail lands in spam at Microsoft 365 and Gmail. Add your Zoho (or Postmark) SMTP details to
api/config.php so invitations arrive reliably.Tell the requester when their ticket is resolved
One email carrying the fix you recorded, plus a link to rate it. Replying to it reopens the request.
Every email carries your logo and workspace name from Branding. Send one of each to check how it lands in your own mail client.
{{ mailMsg }}
{{ userMsg }}
{{ portalRoleNote }}
{{ platHeading }}
Owner only{{ platSub }}
{{ wsMsg }}
All cards are shown.
{{ deskW.renewals.title }}
Renewals & certificates
{{ rw.label }}
{{ rw.sub }}
{{ deskW.todo.title }}
To-do
{{ todoLeftLabel }}
{{ td.label }}
Nothing yet — your list syncs to your account.
{{ deskW.timer.title }}
Timer
{{ timerDisplay }}
{{ deskW.notes.title }}
Notes
{{ notesStatus }}
{{ deskW.revenue.title }}
Revenue snapshot
{{ rvSnapMonth }}
This month
{{ rvSnapAddon }}
AI add-on
{{ rvSnapDue }}
Past due
{{ deskW.aiusage.title }}
AI usage
{{ aiuAddon }}
Add-on revenue / mo
{{ aiuFirms }}
Firms subscribed
{{ deskW.kpis.title }}
Recurring revenue
{{ platMrr }}
{{ platArr }} annualized
Active workspaces
{{ platActive }}
{{ platTotal }} total incl. suspended
AI add-on
{{ povAi }}
{{ povAiSub }}
Support tickets
{{ povSupport }}
open in your own desk
{{ repriceTitle }}
{{ repriceWhy }}
{{ w.detail }}
{{ w.change }}
{{ repriceMsg }}
{{ deskW.status.title }}
{{ deskW.errors.title }}
Server errors · {{ stErrCountLabel }}
{{ e.kind }}
{{ e.meta }}
No errors need review.
{{ deskW.security.title }}
Security & backups
{{ stSecFails }}
Failed logins 24h
{{ stSecThrottled }}
Throttled 24h
{{ stSecLocks }}
Lockouts 24h
{{ stBackupText }}
nightly · deploy/backup.php
{{ stHrText }}
hourly snapshot · keeps 48
{{ stNasText }}
offsite copy on the NAS
{{ stSlackText }}
incident alerts to Slack
{{ stSlackMsg }}
{{ deskW.attention.title }}
Needs attention
{{ a.text }}
All quiet — payments current, nobody over their seats, no ceilings hit.
{{ deskW.workspaces.title }}
Workspaces
{{ w.name }}
{{ w.mrr }}
{{ w.last }}
No active workspaces yet — create the first one.
{{ deskW.activity.title }}
Recent activity
{{ e.when }}
{{ e.detail }}
{{ e.who }}
Nothing recorded yet.
{{ deskW.email.title }}
Email & domains
Outbound {{ povMailOut }}
From {{ povMailFrom }}
Domain {{ povMailDomain }}
Email-to-ticket {{ povMailIn }}
set in the config file, serves every workspace
{{ wsViewLabel }}
{{ wsViewCount }}
Filter from the Workspaces menu on the left rail
Demo & internal
{{ demoGroupCount }}
Ours, not customers — excluded from revenue and seat counts
A failed payment starts a 14-day grace period, then the workspace is suspended. Closing one keeps its data for {{ purgeDays }} days so the firm can come back.
Recurring revenue
{{ platMrr }}
{{ platArr }} annualized
AI add-on
{{ pvAi }}
packs and top-ups, {{ pvMonth }}
This month
{{ pvTotal }}
plan + AI across active firms
Past due
{{ pvPastDue }}
firms with a failed payment
Invoices — {{ pvMonth }}
One numbered invoice per firm: the plan charge plus the AI they bought. Stripe collects the card — this is the record you send them.
{{ pvMsg }}
{{ i.no }}
{{ i.total }}
{{ i.statusLabel }}
No billing email
{{ i.name }}
{{ i.linesLabel }}
None generated for {{ pvMonth }} yet.
Card payments will run through Stripe — AECDesk stores only the subscription reference, never card numbers. Emailing an invoice from here can be wired to the existing Postmark path when you want it.
Add-on revenue
{{ paiRevenue }}
{{ paiMonth }}
Our token cost
{{ paiCost }}
metered by us, live
Margin
{{ paiMargin }}
{{ paiMarginSub }}
Actions used
{{ paiUsed }}
{{ paiEnabledLabel }}
Anthropic account
Platform key {{ paiKeyLabel }}
Admin key {{ paiAdminLabel }}
Model {{ paiModel }}
Pricing {{ paiPriceLabel }}
Billed this month {{ paiBilled }} · {{ paiTokens }} tokens
Add
anthropic_admin_key to the config file (Console → Admin keys) to show what Anthropic actually charged.Who may use AI
You allow a firm below (AI on), then their admin turns the assistant on in their settings.
{{ paiMasterLabel }}
{{ paiMasterSub }}
New firms start allowed
Off is the safe default — you switch each firm on yourself.
Defaults for newly allowed firms
Applied the moment you allow a firm · per-firm overrides under Manage below.
Trial actions
Monthly ceiling
Trial actions — free actions a firm gets to taste the assistant before buying; around 20 works well, zero means they must buy first. Monthly ceiling — caps how many actions one firm can run per month, whatever they bought; our exposure limit.
Payment failed — {{ phDunningCount }}
{{ d.name }}
{{ d.graceLabel }}
Failed sign-ins
{{ phFailed }}
last 7 days, all workspaces
Idle workspaces
{{ phIdle }}
no activity in 14 days
Over seat count
{{ phOverSeats }}
more technicians than seats sold
Server
PHP {{ phPhp }}
{{ phServerSub }}
External services
{{ phDepsFetched }}
Reading service status…
Server resources
{{ psvSub }}
Audit · kept 90 days
to
Nothing recorded in this view yet.
{{ e.when }}
{{ e.action }}
{{ e.detail }}
{{ e.who }}
Every time the platform owner opens a customer workspace it is recorded here as
tenant_enter.Broadcast a notice
{{ annComposeSub }}
Live now: {{ cpText }}{{ cpAudLabel }}
Message
Audience
Tone
Show for (days)
Empty message + Save takes the banner down. Days as 0 keeps it up until you clear it.
{{ ctcName }}
Who to call at this firm. Their own clients' contacts stay in their workspace — never here.
Their staff
Phone
Billing email
Timezone / hours
Notes
{{ dashGreeting }}
{{ finDateLine }}
Equipment requests
{{ reqsCount }} waiting
{{ r.title }}
{{ r.sub }}
{{ r.meta }}
Contracts up for renewal
Nothing renews in the next 30 days.
{{ vocClients }}
{{ clientsPageSub }}
{{ clientInviteHeadline }}
{{ clientInvite }}
Valid 7 days. They set their own password — you never see it. The link is here in case you would rather send it yourself.
{{ engAsgTitle }}
{{ engAsgDesc }}
Engineer
No company matches that search.
{{ emptyTitle }}
{{ emptySub }}
{{ cd.name }}
{{ cd.metaLabel }}
Office
{{ cd.address }}
Main phone
{{ cd.phone }}
Contract
{{ cd.contract }}
Sign-in domains
{{ cd.domainsLabel }}
{{ cd.autoLabel }}
Edit client company
Changes apply everywhere — tickets, portal and billing.
Company name
Discipline
CMMC level
Office address
Main phone
Contract
SLA coverage
Sign-in domains
Auto-create users from these domains
Verified sign-ins on these domains create an end-user automatically. Free-mail domains are never matched.
{{ ecErr }}