MSP AlignMSP Align Suggest a feature Docs GitHub

What's new

Tidier flow, from the same review: in the client portal, Documents has its own tab and Meetings moved under Plan; Home no longer repeats the proposed projects or shows an empty "Next meeting" box; every page has the same header; the tech closet's "who's taking it" list loads once per page. On the staff side, new dashboards hide Due for a meeting, Renewals and Clients needing attention (Needs attention and Client health show the same; they're still under Customize, and saved layouts don't change); a client's Reports button opens the business review pack or all reports; the duplicate "Asset summary (no inventory)" entry is gone (the asset report's own option does it); license and vendor dates are called Renewals everywhere; template pages opened from Libraries have a way back; a meeting's Prepare card links to Since last QBR and the executive summary; Unassigned links both ways with Devices; after the setup wizard, Getting set up keeps only the setup steps (day-to-day upkeep is in To do); and the client portal switches point to each other. - Fix (2.35.2): an existing client's new contract (a renewal) no longer shows under Onboarding → New clients → Signed, ready to onboard: a client already in MSP Align 30 days or more before its contract was made is left out on its own. Anything else that doesn't need onboarding has a Not needed button. Both are listed under Not needed on the same page, with Undo or Onboard anyway. - Fix (2.35.1): in the client portal, View & accept on a quote and Reply on a ticket gave "not found" for most quotes and tickets: ITFlow's guest page keys can contain - and _, which were refused. They open ITFlow's page again. - Administration moves to the user menu (2.35.0): Integrations, Libraries, Staff & portal users, Settings and the Audit log leave the left menu. Click your name (top right) → Administration for an overview of them; their pages have their own menu, with Back to MSP Align at the top. Everyone sees only what they can open: viewers Libraries and the sync history, techs also client mapping, hosted backups and client portal users, admins everything (plus Diagnostics and Updates & backups). A dot on your picture means something there needs a look (an integration error or an update). - Tickets, quotes, ITFlow documents and bill pay in the client portal (2.35.0): with ITFlow, the client portal can be your clients' one place to go. On a portal user, tick Tickets to let them see their tickets (the ITFlow contact with their email address, or ones they opened in the portal) with your replies and their own (never internal notes), and open new tickets under their contact (up to 10 an hour); tick See every ticket of their company too for the owner or office manager. Reply opens ITFlow's own page for that ticket, where they reply or close it without another sign-in. Quotes lists the quotes you've sent their company (never drafts); View & accept opens ITFlow's page for the quote to accept or decline it. With Documents shared in the PSA ticked (it needs Documents access), the documents ITFlow shows to the client (its client-visible setting: check it first) appear on the portal's Documents page under From ITFlow, read from ITFlow when opened. Invoices are not shown; instead, set a Bill pay address under Integrations → ITFlow (your ITFlow portal or payment provider's page) and tick Pay bills on whoever pays your invoices, and they get a Pay a bill button in the portal's top bar and on Home. The lists come from the hourly sync (a ticket is read again whenever someone opens it); everything is off until you tick it (and an MSP that uses ITFlow's own portal can turn the whole feature off with the Client portal switch on Integrations → ITFlow), each portal user only ever sees their own company's records, and opening tickets, replies and quotes is audited. - Send documents for signature (2.34.0): on any active client document, Send for signature emails one or more of the client's contacts their own private link. A written document is sent as a PDF, the way it prints; an uploaded PDF is sent as it is (a Word or Excel file has to be uploaded as a PDF first). Everyone signs at once on the same signing page as contracts (typed or drawn, with the consent to sign electronically). Options: Ask for a code emailed to them before they can open it, I countersign after they've signed, how long the links work, a message, and Ask again when this document changes: when a signed document changes later it shows Needs signing again with a Send again button (nothing is emailed until you press it). The document page shows where each request stands (Sent, Signed by 1 of 2, Waiting for countersignature, Completed, Declined, Expired, Cancelled), with Remind, Send again and Cancel; reminders follow the contracts' schedule. When everyone has signed, the signed copy is the PDF that was sent with the signatures and a certificate added at the end (who signed, when, from which IP address and browser, how they were identified, and the SHA-256 of the PDF sent). It's kept with the document and emailed to the signers. Portal users who are signers see Waiting for your signature on the portal home and Documents pages and can sign there without the code; one portal user can never sign for another. The compliance report has Send for signature too: the client's version of the report is kept as a client document, then sent. Create links only makes the links without emailing them (they're shown to you once, with a Copy button, to send from your own email; it works without email set up), and Link on one person does the same for them; Align sends link-only people no reminders. When the document is shared in the client portal, portal users with Documents access can download the signed copy there; signed copies of unshared documents stay with staff. Techs and admins; everything is audited. - Staff acknowledgments of policies (2.34.0): next to Send for signature, Ask staff to acknowledge emails the client's contacts you tick and/or staff addresses you paste (one per line or separated by commas, Name <address> works; invalid addresses and repeats are left out, up to 500 people per request; pasted people aren't added as contacts). Each person opens their own private link, reads the document (the same PDF as for signature) and ticks I have read and agree to this policy with their name. No drawn signature and no code. Align records the name, address, time, IP address, browser, and the version and SHA-256 of what they read. The document's Acknowledgments box shows who acknowledged, who is waiting and whose link expired, with Remind, Send again, Add people and Cancel; reminders follow the contracts' schedule. Record prints an acknowledgment record for audits and insurance (document, version, fingerprint, date sent, each person with status and time) and saves it as a client document (Assessment) in one click. Optional Counts as evidence for a control of the client's frameworks: Set as evidence writes "5 of 5 staff acknowledged … on " to that control and links the document (only when you press it). Portal users who were asked see Waiting for you to acknowledge and can acknowledge there, only as themselves. Each person gets a short receipt by email after acknowledging (not link-only people). Create links only works here too. Acknowledgment records are never shown in the portal. With Ask again when this document changes, a changed document shows Needs acknowledging again with Ask everyone again or Only those who acknowledged (nothing is emailed until you press one). Techs and admins; everything is audited. - Compliance report (2.33.0): a printable report for one of a client's frameworks, with your branding: a cover with the review dates, the score with counts (Met, Partial, Not met, N/A, Not assessed) and a bar per section, the open items with their owner and due date (overdue ones in red), the full checklist by section with notes, evidence and the linked document, and a sign-off for the client and you. Open it with Print report on a checklist, from the client's Reports page, or from Reports → Compliance report. Switches at the top: Open items only, Include notes and Include guidance. Any staff role; printing is audited. Portal users who can see compliance can print it too, from Print report on a framework: it shows only what the portal shows them (no notes, evidence, review dates or documents that aren't shared). - NinjaOne at your own web address (2.33.0): if NinjaOne gave you your own web address (a branded domain), enter it under Integrations → NinjaOne → Console address for links. The NinjaOne buttons on devices then open your address instead of app.ninjarmm.com (or your region's); the API keeps using the instance, so syncing doesn't change. Leave it empty to keep the old links. - Fixes (2.32.1): amounts below 0 show the minus sign first: -$45, -$1,234.50 and -$1.3M on charts (they showed $-45), -CHF 45 for a currency written with letters, and -45 € when the symbol goes after the amount. Contract PDFs that print their own symbol keep the sign. Two people adding a client with the same name at the same moment (with Add client, a CSV import, a signed contract or RMM organizations made into clients) now make one client: the second one waits a moment and then finds it. The Budgets page reads every client's budget in four database queries instead of about four per client, and checking a contacts CSV file reads the file's contacts once instead of twice per row, with the same results. Lenovo warranty lookups stop at 200 devices per sync (devices never checked go first); the next sync goes on with the rest. - Alignment write-ups with AI (2.32.0): a finished alignment review has Write recommendations with AI: about a page for the business owner, with a short opening on where they stand and then recommendations grouped by priority (High, Medium, Low): what the issue is, why it matters to the business and what you propose, naming the roadmap project already planned for it. AI is sent the score, how each area did and the standards not met (their priority, why they matter, how you check them and the usual fix from your library) with their roadmap projects. It never gets the notes on answers, names of people, contact details, device names or serial numbers, and What AI is sent shows exactly what goes. Edit it and press Save: it's kept with that review (older reviews can have one too) and shown on the review page. The staff QBR pack prints the newest review's write-up in its Alignment section (an Alignment write-up switch leaves it out); the client portal never shows it. Techs and admins; admins can turn it off under Integrations → AI (Alignment write-up). - QBR summaries and meeting prep with AI (2.31.0): a client's QBR executive summary page (from Reports, or Executive summary in the QBR pack's toolbar) has Write a summary with AI: a few plain-language paragraphs for the business owner and the top 3 recommendations, from a digest of the client's numbers (health, changes since the last review, service levels, devices reaching end of life, licensing and renewals, backups, security, compliance, alignment, roadmap and budget). The digest never holds names of people, contact details, device names or serial numbers, and Show it displays exactly what is sent. Edit it and press Use in report: the staff QBR pack prints it at the top of the executive summary (a Summary switch leaves it out), and the client portal's pack never shows it. On a client meeting, Draft agenda with AI suggests an agenda (from the digest, the projects waiting for the client's decision and the previous meeting's notes) next to the current one; Use saves it. Turn notes into actions reads the meeting's notes and lists new roadmap items, decisions on the client's open projects (approve, decline, defer) and a follow-up meeting, each with the words from the notes; tick what's right and apply it. Decisions are recorded as decided in the meeting; the follow-up is scheduled without sending invitations. Admins can turn each feature off under Integrations → AI (QBR summary, Meeting prep). - Draft documents with AI (2.30.0): a finished compliance review has a Draft documents section: the templates that cover its gaps come first (with how many gaps each covers), and any template can be chosen. Draft fills the template for the client with the facts the review read; anything AI doesn't know is left as [To confirm: …]. On a client document (and next to each document a review read), Update with AI either keeps the document's own structure and wording (out-of-date points updated, missing ones added and marked [Added], a short What changed list at the top) or moves it onto one of Align's templates. Every draft is a new document (a Draft, not shared in the portal); the original is never changed. Techs and admins; its own switch under Integrations → AI. - Review compliance documents with AI (2.30.0): on a client's Compliance page, Review documents with AI (or Review with AI on one of its documents) reads the client's policies, procedures and plans (its own pages and PDF, Word, Excel and CSV files, plus up to 5 uploaded files of 10 MB) and checks them against the frameworks you tick: the client's own, and others under Also check against. AI first reads the documents into short facts with their exact words, then compares the facts with the controls in steps while the page shows its progress (a failed step can be tried again without redoing the others). Controls that share tags in the crosswalk get one answer. The review shows each control's answer now, the suggestion, the reason and the quoted words; controls not assessed yet start ticked, and replacing an answer starts unticked. It also lists the gaps (controls nothing was found for) and stale documents (not reviewed in 12 months, or past their review date). Apply saves the ticked answers with the reason added to the notes, the quoted words as evidence and the document linked (uploads can be kept as client documents); a framework you only checked against is added when one of its answers is applied. Techs and admins; its own switch under Integrations → AI. Reviews left for 14 days are discarded. - Read vendor documents with AI (2.29.0): on a client's Licensing or Vendors page, Read a document takes a vendor invoice, quote, order, renewal notice or contract (PDF, Word, Excel, CSV, text, or an email as .eml or Outlook .msg with its attachments; up to 5 files of 10 MB). AI reads it, and a review page shows what it would change, each with the document's own words: a new vendor with its phone, email, website and account number; missing vendor details; new licenses; and for licenses you already have, new seats, price (increases flagged), billing and contract dates, term, notice and auto-renew. Hardware, labour, fees and taxes are listed but not added. Nothing changes until you tick it and press Apply: vendors go to ITFlow too when two-way sync is on, licenses are saved in Align (ITFlow's API can't take licenses), and the PDF, Word, Excel and CSV files can be kept as the client's documents. A document billed to another company is flagged. Techs and admins; switch it off under Integrations → AI. - AI providers and a monthly limit (2.29.0): under Integrations → AI an admin chooses the AI provider for Align's AI features: Claude, OpenAI, Grok, Gemini or a self-hosted Ollama server (plain http:// works on your own network), with the model and the API key (a key belongs to the provider it was entered for, so switching providers asks for the new one). Test connection checks it before AI is switched on. A monthly token limit stops AI for everyone when it's used up, until the 1st or until an admin raises it, and nothing else in Align stops; admins are emailed at 80% and when it stops (notification AI usage). The page shows this month's use against the limit, by person and feature, and each month's tokens, with an estimated cost if you enter your provider's prices. Align keeps how many tokens each request used and who asked, never the text, and AI is off on a test server. - Discounts on any contract row (2.28.1): a price below 0 now works on every row of a contract's services, not only on a line you add while preparing it, and a template's own rows can have a negative default price (a standing bundle discount, for example). Totals, the preview and the signed PDF count it off. Quantities still can't go below 0. - ITFlow 26.10: vendors both ways, domains and leads (2.28.0): With Two-way sync on, a vendor you add, edit, retire or restore in Align is added, updated, archived or restored in ITFlow too (its details are saved in Align only once ITFlow has accepted them, and a vendor that was only in Align is added on its next save). Each client's domains in ITFlow join its domain list: checked for email authentication like the others (leave one out if it sends no email), read from the public registration records, and dated from ITFlow where those have no expiry; a domain you add in Align goes to ITFlow too. ITFlow leads aren't brought in until they become clients, and critical projects now open Urgent tickets. The vendor and domain changes need ITFlow 26.10 or later (an older one says so and keeps the change in Align); archived vendors, licenses and locations, which ITFlow 26.10 no longer sends, are handled as before. - Feedback is a setting (2.27.1): the Feedback button (below) is off until an admin turns it on under Settings → General → Feedback. Turning it off hides the button and the Feedback list again and keeps the reports already sent. - Feedback: bug reports and feature requests (2.27.0): Once turned on (2.27.1), a Feedback button (a speech bubble) at the top right of every page: Report a bug or Request a feature with a title, details, a priority and an optional screenshot (choose a file or paste one with Ctrl+V); the page you were on is sent with it. Everyone on your team sees every report under Feedback, so nothing is asked twice. Admins see how many are new on the button, mark each one Planned, Done or Won't do (or press Mark done in the list), change its priority and add a note shown with it, or delete it. Not in the client portal. - Backups: copy job sizes and clients that don't need backups (2.26.0): Backup copy (offsite) jobs, which Veeam reports with a size of 0, now show the size of the restore points they hold for their protected machines; a job with no size at all shows — instead of 0 B. A client that doesn't need backups can be marked — Doesn't need backups — in the backup product's column on Client mapping (or on the client's Connectors page): it's no longer listed under Missing a link, sync never links it by name, and its Backups page, the Alignment backups standard (suggested N/A), the portfolio report and the all-clients Backup Status report say it doesn't need backups instead of flagging it. A client that does have backup data keeps showing it. - Monitors and your own asset types (2.25.0): Monitor is a new built-in type in its own Monitors & displays category, with its own lifespan (6 years) and replacement cost (250) under Settings → Planning & lifecycle, so monitors plan and budget apart from other gear and get their own group in reports. PSA assets typed monitor, display, screen or TV come in as monitors (a new Monitors & displays choice under the PSA's "bring in" settings, ticked wherever "everything else" was), and ones still Unassigned are sorted on update. Admins can also add their own asset types under Settings → Planning & lifecycle → Your own asset types: a name, the category it plans under (its lifespan and cost), an icon and whether it's virtual. They show in every device's type list and plan under their category; a PSA asset whose type has exactly that name comes in as that type (Unassigned ones are sorted when you add it). Renaming a type renames it on every device; removing one sends its devices back to their own type, or to Unassigned to sort again. - Long text in contract boxes wraps (2.24.2): on a contract built on your own PDF, a long value in a tall box (special terms, for example) now wraps onto several lines while you prepare, preview and sign it, the way the signed PDF prints it. Before, it shrank to one tiny line that ran off the page in the browser, even though the PDF was right. - QR code straight away (2.24.1): while two-factor sign-in isn't on yet, setup starts by itself, so a client portal user arriving from their invitation (or a new staff member) sees the QR code right after setting their password, without pressing Set up two-factor sign-in first. - 2FA QR codes, contact review report and a client-built software policy (2.24.0): setting up two-factor sign-in (client portal invitations and staff accounts) now shows a QR code to scan with the authenticator app, drawn by Align itself (the key never leaves the page and is never emailed); the portal invitation tells people to have the app ready. Contact review (Reports, a client's Reports and Contacts pages) prints a client's contacts with details, roles, client portal access and licenses, with columns to mark who's still there and what changed, rows for anyone missing and a sign-off; Contact list (CSV) has the contacts as a spreadsheet, and client portal users who can see Documents, contacts & meetings can print the review themselves (with licenses only if they can see Budget & licensing). New document template: Client-Built Software Policy, for tools a client's own staff build (often with AI): intake, a data-flow-first review, packaging and signing, updates, support and retirement. - Policy templates for stricter requirements (2.23.2): for clients whose parent organization, funder or insurer sets minimum security rules. The Information Security Policy gains a Network and wireless security section (current WPA standard, guest or public Wi-Fi only when it's kept separate) and an optional board of directors approval. Security Awareness Training now requires training at least every quarter for anyone who can reach sensitive data. In Vulnerability & Patch Management the critical patch time is a choice (7 days or 2 business days), with a rollback plan and a yearly compliance audit. The Incident Response Plan lists organizations that must be told about an incident and by when, adds a checklist step for those reports and a communication plan. In Access Control, access can be removed on the day someone leaves or changes role. Built-in templates you haven't edited are updated; documents already made from them don't change. - Easier portal invitations (2.23.1): in Invite a user on a client's Client portal page, typing part of a name or an email now lists the client's matching contacts (not yet invited); pick one with a click or the arrow keys and Enter to fill in both. Before, suggestions only came up in the Email field and only in some browsers. - Outlook calendars and one-click Microsoft 365 email setup (2.23.0): under Integrations → Email, Set up with Microsoft replaces registering an app by hand: an admin signs in once (a device code) and Align creates its own single-tenant app with a certificate it renews itself and only delegated permissions (sign-in, send mail and calendars, as whoever signs in to it), granted for your organization; then Connect with Microsoft signs in as the sending mailbox. An app you registered yourself still works. Each person can then connect their own Outlook calendar (Your account or the Calendar page): their Outlook events show on Align's calendar with subject, place and attendees (private ones only as Busy), and the meetings they own in Align go into their Outlook, kept up to date every few minutes and removed when cancelled. Migration 081. - Community connectors (2.22.0): anyone can add a connector for a tool Align doesn't support yet. php bin/align make:connector <rmm|psa|backup|saas> "Product name" writes a working connector from a template, with a fake API and a test suite, and registers it; Writing a connector explains the rest and the review checklist is what each pull request goes through. Security and SaaS connectors keep their tenants and check results in shared tables (migration 080) and add automatic checks that compliance controls, alignment standards, the health score, reports and the evidence check use like the built-in ones; a check that can't be worked out is unknown, never a pass. Community connectors ship as beta and read-only. - Asset tags (2.21.0): a device (or tech closet spare) can carry the client's own asset tag, kept in Align with its other values. Type it on the device, or import a client's list from Devices & assets → Import asset tags (a CSV with an Asset tag column and a Serial or Device column; serial numbers are matched first, then names, and every row is shown before anything is saved). Tags aren't unique: one used twice is saved and flagged. Tags show in the device lists, global search, the client portal's Devices, the printed asset reports and the CSV export, and the REST API reads and sets asset_tag. Migration 079. Also fixed: 2.20.0's Word import needs PHP's zip extension, which the installer didn't add; updating installs it (php-zip), Settings → Diagnostics lists it, and without it a Word or Excel upload is still checked by the part names inside it. - Upload files to Documents (2.20.0): a document can be an uploaded file as well as a page written in Align: PDF, Word (.docx, .doc), Excel (.xlsx, .xls), CSV, PNG or JPEG, up to 25 MB (Upload a file on a client's Documents page or on Documents). Each file is checked against its type and stored under a random name next to the other uploads (and in backups). PDFs are shown in the page with the built-in PDF viewer and pictures as images; Word, Excel and CSV files download. Uploaded files have the same category, status, review date, client portal sharing (clients can view and download them) and compliance evidence links as written documents. Replace file keeps every earlier file in the history, where it can be downloaded or restored. A Word (.docx) file can be imported into a new editable document (text, headings, bold, italic, lists and links; tables become one line per row; pictures, headers and footers are left out). Migration 078; the web server allows 25 MB on the two upload addresses only. - Easier to find who has a license (2.19.1): each license has a People button (or Assign people) on a client's Licensing page and on Licensing & renewals for all clients, its edit window links to it, and the all-clients Contacts page lists each person's licenses. - Who has which license (2.19.0): each license lists the people who hold it. Microsoft 365 assignments are read with the hourly license sync (no new permissions: the app already reads users) and matched to contacts by email; accounts that can't sign in but still hold a license are flagged, and accounts that aren't contacts are listed with Add as contact. Any other license (Adobe, AutoCAD, line-of-business software) is assigned to contacts by hand from the license's people page, several at once; more people than seats bought is flagged. The client's Contacts page and a contact's window show their licenses and the devices they last signed in to (matched on the RMM's last user), and the client portal shows who has each license under Licensing and each person's licenses under Your team. New table license_assignments (migration 077). - Portal devices fit the page (2.18.1): the client portal's device list shows every device without scrolling sideways (type and last user under the name, serial under the make and model, warranty and replacement dates in one column) and turns into one small card per device on a phone. - Evidence check for the automatic security results (2.18.0): before Align's automatic checks (Huntress, Microsoft 365, Google Workspace, email authentication, security awareness training) are relied on as compliance evidence, a tech answers each one for a client from the client's own systems, without seeing Align's result (Compliance → Evidence check → Answer the checks on the client), and Align shows each answer next to what it found at that moment: agree, disagree, couldn't tell, or no result. Compliance → Evidence check brings the clients together: each check is trusted once answers from at least two clients agree with Align and none disagree, a system passes only when every one of its checks is trusted, every disagreement is listed with what Align found and how the tech checked, and an anonymized CSV can go with a report of a check that's wrong (clients as Client A, B…; no notes or people; the client's and its tenants' names, device and agent names, domains, addresses and IDs taken out of Align's text; read it before sharing, since Align can only remove names it knows). The checks are the same ones alignment standards use, so the answers cover both. Nothing about the checklists themselves changes. - Faster syncs on large installs (2.17.1): measured on a test install with 150 clients and 11,000 devices. The two-minute PSA asset check reads linked devices a hundred at a time (5,193 linked devices: 1.4 seconds and 5,197 database queries before, 0.26 seconds and 56 queries now). A Huntress sync stores its agent, incident, escalation, report and port lists a few hundred rows per statement in one transaction (10,000 agents: 5.6 seconds and 10,114 queries before, 1.4 seconds and 148 queries now), so a failure part way leaves the stored list as it was. Health for a client added since the morning refresh reads only that client's devices (0.26 to 0.03 seconds). Text from NinjaOne, Datto RMM, Tactical RMM, KnowBe4, Huntress and Curricula is cleaned by one shared rule (Huntress and Curricula now follow the RMMs' rule: stray control characters are dropped and a number in a name field is kept as text), and the client portal's tech closet has its own controller (same addresses). Nothing on screen changes. - A cleaner, more modern look (2.17.0): a white page with softly tinted cards and no borders, rounder corners, the Inter typeface (bundled with Align, so nothing loads from outside) and a blue-grey menu (the current page keeps the brand color), in light and dark mode, on the sign-in pages and in the client portal. Settings → Branding's preview and the light and dark choices under Account show the new look. Every page has a main heading and one tab style (tabs scroll sideways on phones), empty lists show one empty state, and status colours mean the same on every page: anything ended (archived, expired, cancelled, declined, revoked, withdrawn) is grey. Field labels are tied to their fields, so clicking a label focuses its field and screen readers read it; icon-only buttons have names, and keyboard focus has a clear outline. Printed reports and PDFs don't change. - Tidier navigation, one Connectors page per client and regrouped settings (2.16.0): each client's menu has a Setup group (Connectors, Client portal and Onboarding, which is now always there). A client's Connectors page is the one place for everything specific to that client: a status line with every connection, then its PSA and RMM links, Security (its Huntress organization, and security awareness training: the KnowBe4 token, the Curricula account and Huntress SAT uploads with their history), Email and domains (Microsoft 365, Google Workspace, email authentication and the domains' registrar and expiry, moved from Vendors) and Backups (backup company links and hosted machines to claim, moved from the Backups page). An RMM, backup or security tool link can be changed right there for that client; Client mapping still does many clients at once, and both save the same way. The overview keeps the results, with a Manage link. In the main menu, a new Libraries page leads to every template and list you reuse (alignment standards, compliance frameworks, document, vendor, contract and onboarding templates; Standards left Settings for it, and vendor templates left the Clients menu), Licensing and Renewals are one item with two tabs, and People is Staff & portal users. Settings has a new Health & checks tab with the health score and the pass marks for training, phishing, backups overdue and the SLA goal (moved from Planning & lifecycle and the Huntress, Veeam and PSA integration pages; the values you set are kept). The company address moved from Contract templates to Settings → General, Branding shows the company name from General, and demo data moved to Diagnostics. Phones get a search button. - Fixes from a code review (2.15.2): a Curricula phishing campaign with a long title no longer stops that client's training results from being read. A reply from Huntress or Curricula that isn't the list Align asked for is now refused instead of being read as "no records" (which could clear stored incidents or results), and Curricula accounts with a long report history read again. Only admins can now connect over, confirm or disconnect a client that uses its own Microsoft 365 app or Google Workspace key (saving those was already admin-only), and techs no longer see Disconnect there. A retired vendor no longer blocks its name: you can add a vendor with that name again and edit it, and restoring the retired one is refused while an active vendor has the name. In the client portal's tech closet, people without the Documents, contacts & meetings permission check things out to themselves instead of picking from a list of every contact, parallel requests can't pass the hourly limits, and a malformed form no longer causes a server error. HaloPSA reads each list to its end, so records added during a sync can't push others out of it (and get them archived); Datto RMM tries devices with no hardware read yet again weekly instead of never or every run. Health score settings can't be saved contradicting each other, and database error details no longer reach pages, the sync log or alert emails from the newer connectors. - Document templates and tech closet updates (2.15.1): the Acceptable Use Policy now covers AI tools (approved tools only, business accounts whose data isn't used for training, no Confidential or Restricted data in unapproved tools, checking AI output, telling people before recording a meeting, reporting deepfakes), prohibited activities including unapproved cloud apps, single sign-on, personal devices and enforcement. The Incident Response Plan is rewritten around the client reporting and your team running the response: definitions, roles (your Incident Handler and the client's Service Manager), four severity levels with response targets, what staff do first (and don't do), what your team does at intake, a remediation checklist and the steps when sensitive data may be involved. The WISP adds where customer information lives, clean desk and visitor rules, one spokesperson, signed acknowledgments, 90-day log reviews and sending passwords apart from files. The BC/DR plan gets an Emergency mode operation section (downtime procedures, emergency access, backup power, backing up before a move), and the Information Security Policy adds guest Wi-Fi, approving new devices before they join the network and turning off AutoRun. Two new templates: Data Classification & Handling Policy (handling rules per level, plus extra rules for PHI, card data and CUI where present) and Risk Management Policy (NIST SP 800-30 based assessment and treatment steps, yearly assessments and the risk register at each QBR). A new 24/7 security phone under Settings → General fills {{company_emergency_phone}} (the office phone when blank). Built-in templates you haven't edited are updated; ones you've changed, and documents already made, stay as they are. In the tech closet, a new portal permission, Add tech closet items and keep them up to date, lets a client's people add items to their own closet, fix details, update counts and remove what's gone, so your team and theirs keep it current together (every change shows who made it, with a portal badge, and a removed item can be brought back from your side; serials and staff notes stay on your side). The Mark spare button on a device now lines up with the others. - Tech closet (2.15.0): keep track of spare parts and equipment for each client and for your own offices, and who has what. Tech closet in the main menu is your own stock, kept by office (add your offices there; one is fine), and each client has a Tech closet page for what's kept at their site. Items are either counted stock (cables, mice, headsets: how many are on the shelf, with an optional minimum that puts "running low" on the To do list) or one tracked item with a serial (a monitor, a loaner laptop). Check things out to one of the client's contacts or anyone by name (your own stock: with the client they're at), with an optional due date (overdue ones go on the To do list), then check them back in, or mark counted stock used up. A computer that's already in Align can be marked spare from its page or the client's closet: it stays in replacement plans, budgets and reports with a spare badge and can be checked out the same way, but it isn't flagged stale and is left out of the health score, compliance and alignment indicators, the email digest and backup and Huntress coverage until it's back in use (whether spares count in contract seat counts is a setting under Settings → Planning; they do by default). Every item keeps a full history. In the client portal, a new Tech closet permission shows the client's closet and spare devices, and Check out lets them check their own items out and in and ask you for parts (a ticket in your PSA, else an email); adding items and changing counts stay with your team, and your loaners show as "return it to us". - KnowBe4 (2.14.0, beta): Align can now read each client's security awareness training and phishing results from KnowBe4. KnowBe4's reporting key belongs to one customer console, so switch it on under Integrations → KnowBe4, then on each client's Security awareness training card an admin picks the client's region and pastes a Reporting API token from that client's console (Account Settings → Account Integrations → API; Platinum, Diamond or SAT Foundations/Advanced). Align checks the token before saving it, encrypted, and reads once a day: the account's seats and risk score, training completion from the last 13 months (enrollments that are due, policy acknowledgements left out, each person counted once) and each phishing test's emails delivered, clicked, reported and data entered. Only totals are kept, never names. The results count in the same two training checks, the health score and the QBR security section as Huntress SAT, in place of uploads; a client with KnowBe4 doesn't also read Curricula. A refused or throttled read keeps the last results and shows the error on the card. It only reads from KnowBe4, and it's marked beta: built from KnowBe4's API documentation, so please report anything that looks wrong on GitHub. The website lists the new integration. - Datto RMM (2.13.0, beta): Align can now read devices from Datto RMM, on its own or alongside NinjaOne and Tactical RMM. Turn on API access in Datto (Setup → Global Settings → Access Control), generate API keys for a user with a read-only security level that sees every site, then under Integrations → Datto RMM pick your platform (the name in the user's API URL, such as merlot) and enter the API key and secret key. Each sync reads Datto's sites as organizations (its built-in Deleted Devices site left out), linked to Align clients by name on Client mapping, and its devices: host name, operating system and build, last check-in, logged-in user and online status, with servers, laptops, desktops, printers and virtual machines told apart. Datto gives make, model and serial number one device at a time and limits requests for the whole account, so Align reads up to 200 devices' hardware per sync, keeps it, and only asks again when Datto audits a device again: a large account fills in over a few hourly syncs, and Align backs off for the run whenever Datto asks it to slow down. A device deleted in or gone from Datto is marked removed; an answer that isn't Datto's changes nothing. It only reads from Datto, and it's marked beta: built from Datto's API documentation and open-source clients, not yet confirmed against many accounts, so please report anything that looks wrong on GitHub. The website lists the new integration. - HaloPSA (2.12.0, beta): Align can now use HaloPSA as its PSA, read-only. Under Integrations → HaloPSA enter your Halo web address and the client ID and secret of a Halo API application (Client ID and Secret (Services), logging in as an agent that can see every client, with only the read:customers, read:assets and read:invoices permissions). Each hourly sync reads Halo's clients (inactive ones archived), sites (the main site fills the client's address and phone), users as contacts (Halo's "General User" placeholders skipped), assets (make, model, serial and OS from the asset type's fields, brought in as devices like ITFlow's) and invoices (the managed-services estimate from recurring invoices). Tickets, SLAs, software licences and suppliers aren't read yet, nothing is ever written to Halo, and an answer that isn't Halo's (a sign-in page, an error) changes nothing. An install has one PSA: setting up HaloPSA next to ITFlow shows it as Not in use and never switches your client list. It's marked beta: built from Halo's API documentation, not yet confirmed against many installs, so please report anything that looks wrong on GitHub. The website lists the new integration. - Tactical RMM (2.11.0, beta): Align can now read devices from Tactical RMM, the open-source self-hosted RMM, on its own or alongside NinjaOne. Under Integrations → Tactical RMM enter Tactical's API address and an API key (for a Tactical user whose role has only List clients and List agents, covering every client: Tactical's keys skip its two-factor sign-in). Each sync reads Tactical's clients (with their sites) as organizations, linked to Align clients by name on Client mapping, and its agents as devices: make and model, serial number (so Dell and Lenovo warranty lookups work), operating system and build, last check-in, logged-in user and online status, with servers, laptops, desktops and virtual machines told apart. An agent gone from Tactical is marked removed; an answer that isn't Tactical's (a dashboard page, an error) changes nothing. It only reads from Tactical, and it's marked beta: it's built from Tactical's API and source code, not yet confirmed against many installs, so please report anything that looks wrong on GitHub. Also: the sync no longer lists RMMs that aren't set up, and with more than one RMM supported, screens say "your RMM" until one is connected. The website lists the new integration. - Domain expiry, vendors for clients, the QBR pack and the API (2.10.0): each client's domains (its email domains and its website's) are read from their public registration records (RDAP, the successor to WHOIS) every few days, and daily once expiry is close: a Domains card on the client's Vendors page shows each domain's registrar, matched to the client's vendors (or one click to add it as one), and its expiry date, which also shows on Renewals (by vendor too) and has a Check now button. A registry that can't be reached keeps the last good answer; an unregistered domain or an ending without a public service says so. The client portal has a Vendors page for users with Budget & licensing access: who to call and how (support phone, email, website, hours), never account numbers, contacts, notes or costs. The QBR pack has a Your vendors section (switchable; costs only with costs on; in the portal for users with budget access). The REST API reads client vendors and vendor templates (GET /vendors, /vendors/{id}, /vendor-templates) with a new vendors:read scope; existing keys need it ticked. The servers now make HTTPS requests to data.iana.org and the domain registries' RDAP services for these checks. - Vendors on budget lines, renewals by vendor and vendor import (2.9.0): budget lines (internet, phones, domains and the like) link to the client's vendors by their vendor name, as Align's licenses do: the budget line window suggests the client's vendors, a rename keeps the link, and lines saved before this release are linked when it installs. A vendor now shows its budget lines with its licenses, their monthly cost together and the next renewal or contract date among them (linked to that vendor's dates on Renewals), and vendor names on budget lines that aren't on the list are offered as one click. Renewals shows who each date is with, a By vendor list counting each vendor's dates and clients across every client, and filters to one vendor or one client. Client vendors import from a CSV file (Import on the Vendors page, or Clients → Import → Vendors): a Client and a Vendor column, plus account number, contact, support details, services, notes, a category by name and a template if you like; a vendor the client already has gets only the columns the file fills in, a vendor from ITFlow only takes category, services and notes, and licenses and budget lines that name a new vendor link to it. - Vendors (2.8.0): each client has a Vendors page for who it buys from (internet provider, domain registrar, phones, software, copiers, hosting and so on), grouped by category, with the account number, contact, support phone, email, website, hours and SLA, the services the client has, the licenses bought from each vendor with their monthly cost, and the next renewal among them. Vendors in the main menu holds vendor templates: the details that are the same for every client, entered once. A client vendor made from a template shows the template's details wherever its own field is blank, so a changed support number shows for every client; filling in a field overrides it for that client. A vendor only one client uses needs no template, and Save as template makes one from it later; deleting a template leaves its vendors showing what they did. Licenses link to their vendor: an Align license by its vendor name (the license window suggests the client's vendors; renaming a vendor keeps the link), and the Vendors page offers to add vendors that licenses name but the list doesn't have. With ITFlow, each client's vendors sync in read-only every few minutes (the MSP's own vendors, like a distributor, are left out), client vendors made from one ITFlow vendor template share one Align template, a license links to the vendor ITFlow gives it, a vendor archived in ITFlow is retired here (not deleted), and one added by hand with the same name is taken over rather than duplicated. A PSA that doesn't share vendors just leaves them to be added by hand. Passwords and PINs don't belong in vendor notes. - Website found more easily in search (2.7.8): the project website (mspalign.org) now gives search engines what they look for: a sitemap and robots.txt, one canonical address per page, share-card details, a clearer home page title and description, and a description of MSP Align as free software, so Google can list it properly. The not-found page is kept out of search results. Nothing in the app changes, so updating servers is optional. - Faster test runs on GitHub (2.7.7): the end-to-end suites now run as five groups at once on GitHub, each on its own machine with its own fresh test install, so a run takes about 15 minutes instead of about 50. Every suite still runs, in the same order within its group; a check fails the run if a suite is left out of the groups. Once a week (and on demand, with full), GitHub also runs every suite one after another on main, as before, to catch a suite that only passes because of what runs before it. Two suites that relied on data an earlier suite left behind now make their own. Also finishes 2.7.6's code scanning fixes: the two spots that change raised new alerts for (the text-block wording check, and signature and picture images on a PDF, now shown from their decoded bytes) no longer read page text into HTML or an image address. - Code scanning fixes (2.7.6): three GitHub code scanning (CodeQL) alerts in the contract builder are fixed: its box list and checks are now built as page elements rather than HTML text (labels and field details always stay text), and removing a text block checks for wording with the browser's own parser rather than a pattern that strips tags. While there, the contract builder's other drop-down lists escape every value, signatures and pictures on a PDF only load from an image or this site, hidden form fields are made as elements, and the sign-in redirects only go to this site's pages. None of these could be misused by someone without admin access to the templates. - Backed-up servers matched when their names differ (2.7.5): a server could show under Servers with no backup while its backup ran fine, because the virtual machine was named differently from the computer (for example FS01 (DC/File) for FS01). Machines now also match by their name without bracketed parts and by the part before " - ", always against the same client's devices (a loose name never moves a machine to another client). For names with nothing in common, a Backed up as… choice next to the server links it by hand (kept by every sync, shown as "linked by hand", and unlinked the same way). - Email authentication without false negatives (2.7.4): SPF, DKIM and DMARC are read through public DNS-over-HTTPS resolvers (Cloudflare, then Google), the way online checkers like MxToolbox see them, instead of only the server's own resolver: a record either one finds counts, and when neither can be reached the server's resolver is used (and a server without working DNS gets "unknown", not "No record"). DKIM is looked for at the mail service's selector, any selectors you list for the domain and 24 common ones (mail filters, newsletter tools and other providers). On a client's Connectors page you can now add email domains for any client, with or without Microsoft 365 or Google Workspace connected (the website's domain is suggested), set a domain's DKIM selectors, and leave the connected domain out; with several domains, each check takes the worst of them. The servers now make HTTPS requests to cloudflare-dns.com and dns.google for these checks. Also: the client overview's six tiles go three across when the page is narrower (at 1280px with the sidebar they broke words in half). - Readable buttons in light and dark mode (2.7.3): the tabs on Client mapping and Hosted backups (All clients, Missing a link, Not matched, Sorted into clients, Yours, All) had white text that disappeared in light mode unless selected; a few other buttons (Show/Hide archived, the meetings page's Calendar and Roadmap, the API's Turn off, and the compliance checklist's Partial) were just as hard to read. All fixed, and a new test checks the buttons, tabs and badges of every kind of staff page in both modes. The demo data now includes security awareness training results, and the website has a one-minute video tour and fresh screenshots, including Huntress and training. - Security awareness training from Curricula (2.7.2): Huntress SAT runs on Curricula, and its API now replaces the uploads. Under Integrations → Huntress SAT (Curricula) paste the client ID and secret of an OAuth application registered in Curricula (Client Credentials, read scopes only). Each sync matches Curricula accounts to clients through the Huntress organization they belong to, else by name (a Curricula column on Client mapping), and reads each linked client once a day: training completion over the assignments that have ended in the last 13 months (each active learner once, including those who never started), each phishing campaign's results, and the account summary reports (opened through Align, which asks Curricula for a fresh PDF link). Only totals are kept; learner ids count people once and names are never stored. The training card shows where the results came from and when, with a Refresh button; while Curricula has results for a client, its uploads don't count. - Huntress antivirus fix (2.7.1): the Managed Antivirus check failed every agent, because Huntress reports a healthy Defender as "Protected" (its API documentation shows "Healthy"). Both now count as healthy, as long as the signatures aren't out of date and the policy is compliant. - Huntress (2.7.0): under Integrations → Huntress (API key and secret, read-only), each sync reads Huntress's organizations, matched to clients by name like an RMM's (fix them on Client mapping), with their agents, Managed Antivirus, incidents, escalations, summary reports, ITDR identity counts and external ports. A Huntress card on the client overview compares agents with the client's RMM workstations and servers (by serial, else host name) and lists devices without one, open incidents and escalations, incidents closed in the last year and the summary reports. Five checks (agent on every device, no open critical/high incident, Defender healthy, no high-risk identity, no risky open port) count in the health score's Security area and suggest compliance answers; the built-in frameworks' anti-malware/EDR controls (CIS, CMMC, HIPAA, ISO, PCI, SOC 2, cyber insurance, MSP baseline and others) and the starter EDR standard are linked. Checks are unknown, not failed, when Huntress hasn't been read for a day or more, or a product isn't in use (ITDR, Managed Antivirus, external recon). Open critical/high incidents and overdue escalations show on the dashboard. The QBR pack gets a Security section. - Security awareness training results (2.7.0): Huntress's API has no SAT results, so upload a client's Huntress SAT exports (Assignment: Learner Progress, Phishing: Attempts or Phishing: Annual Overview, CSV) on its overview. Align keeps only totals, never names. Two checks: at least 90% of learners finished every assigned episode, in a report whose latest completion is within the last 12 months, and a phishing click rate under 10% with a campaign in the last 6 months (thresholds under Integrations → Huntress); the frameworks' awareness training and phishing simulation controls and the starter training standards are linked. Uploading the same report for the same dates again replaces it. The portal's QBR doesn't include the Security section. - Google Workspace for clients (2.6.3): connect a client's Google Workspace on its Connectors page and its editions appear in Licensing (users per edition, updated hourly), priced from a Google Workspace price list; a client's license can have its own price. Its security is checked once a day, read-only: every active user and super admin enrolled in 2-Step Verification, 2-Step Verification enforced, two to four super admins, no active account unused for 90 days, Drive sharing outside the organization restricted or warned, unconfigured third-party apps blocked or limited to Sign in with Google, and less secure apps off. Set up once under Integrations → Google Workspace (clients) with a service account key from your own Google Cloud project; each client's super admin allows it under Domain-wide delegation (a client that won't can use a service account in its own Google Cloud). Results show on a Google Workspace security card, count in the health score's Security area and suggest answers for linked compliance controls and alignment standards. The REST API marks these licenses gws and keeps what Google owns read-only. - Microsoft 365 security without Entra ID P1 (2.6.3): MFA registration (users and admins) and licensed accounts unused for 90 days were unknown for tenants without Entra ID P1 (Business Standard, Basic and the like), because the reports Align read need it. Now Align reads each account's registered MFA methods and Microsoft 365's active users report (Exchange, OneDrive, SharePoint and Teams activity) for those tenants, so the checks work with security defaults alone. The app asks for two more read-only permissions (UserAuthenticationMethod.Read.All, Reports.Read.All): each connected client's admin presses Approve new permissions once. - Email authentication (2.6.3): for every client with Google Workspace or Microsoft 365 connected, Align reads its email domain's SPF, DKIM and DMARC from public DNS once a day (and on Check now): one SPF record ending in -all or ~all, a DKIM key at Google's default selector or Microsoft's, and a DMARC policy of quarantine or reject. They show on the client overview, count in the health score's Security area (so Microsoft 365 clients' scores can change on upgrade), and the Microsoft 365 baseline's SPF, DKIM and DMARC controls and CIS IG2's 9.5 suggest an answer from them. - Microsoft 365 fixes (2.6.2): Connect Microsoft 365 and Approve new permissions now open Microsoft's sign-in in a new tab with a normal click (the browser's security policy stopped the redirect, so the page just reloaded; Ctrl+click worked); the Connectors page reloads when you come back to it. Approving no longer waits for the daily run to add new permissions to your app: Align adds them as soon as someone presses Approve or an admin opens Integrations → Microsoft 365 (clients), so one approval grants everything (before, an approval in between re-granted only the old permissions and the request came straight back). The card names any permission Microsoft hasn't granted yet, and right after approving it says Microsoft can take a few minutes, with Sync now to check again, instead of asking for another approval. - Microsoft 365 security (2.6.1): for clients with Microsoft 365 connected, Align now checks their tenant's security once a day (and on Sync now), read-only: Secure Score, MFA registered for every licensed user and every admin (disabled accounts and shared mailboxes left out), MFA enforced (security defaults or Conditional Access), legacy sign-in blocked, two to four Global Administrators, and licensed accounts unused for 90 days. Checks the tenant's licences can't show (some need Entra ID P1) are marked unknown, never failed. A Microsoft 365 security card on the client overview shows them; compliance controls and alignment standards linked to a check get a suggested answer (you decide), with the Microsoft 365 baseline framework and the starter MFA and legacy sign-in standards linked already; and the health score gets a sixth area, Security, the share of known checks that pass (weight under Settings → Planning & lifecycle; connected clients' scores change on upgrade, so set it to 0 to keep them as before). The app asks for four more read-only permissions: each connected client's admin approves once more (Approve new permissions on the client's Connectors page). A new Connectors page in each client's menu (below Client portal, staff only) holds the Microsoft 365 connection and shows how the client is linked to the PSA, RMM and backup products, with the last sync; Licensing keeps a one-line Microsoft 365 status. - Microsoft 365 licenses from each client's tenant (2.6.0): connect a client's Microsoft 365 and its subscriptions appear in Licensing, with seats bought and seats assigned, updated every hour (and on Sync now). Under Integrations → Microsoft 365 (clients) you sign in once with an admin of your own Microsoft tenant and Align creates the app it needs there: multi-tenant, read-only in client tenants, signing in with a certificate it replaces by itself every year. Each client's admin then approves it once, the way security tools connect tenants (or you send them a link and confirm the tenant afterwards). Prices come from your Microsoft 365 price list (free and trial subscriptions left out), and any client's license can have its own price. Subscriptions that end are retired; licenses from the PSA or added by hand that look the same are offered for retiring once, so nothing counts twice. A client that doesn't allow outside apps can use an app in its own tenant instead. Problems (a client not syncing, an expiring secret, a tenant to confirm) show on the dashboard. The REST API marks these licenses m365 and keeps what Microsoft owns read-only. - Installer fix (2.5.2): the installer's random password helper now always gives the length asked for. Before, a long one could now and then come out a few characters short; the installer's own passwords (32 and 20 characters) always had enough, so existing installs aren't affected. - Your own browser icon (2.5.1): Settings → Branding has a Browser icon: a small square image for browser tabs and bookmarks on every page, staff and client portal alike (re-encoded and scaled down to at most 256 pixels; SVG isn't accepted). Without one, tabs show the MSP Align icon. Logos are no longer used for the tab, so if you uploaded a logo, your tabs go back to the MSP Align icon until you upload a browser icon. - Client health score (2.5.0): every client gets one score from 0 to 100, made from five areas each scored 0 to 100: lifecycle (supported OS, within lifecycle, servers and network gear under warranty, checking in to the RMM), backups (machines, servers and Microsoft 365 items with a recent backup, less a little for failed jobs), compliance (the client's frameworks), service levels (SLA targets met in 90 days) and alignment (the latest review). An area with no data is left out rather than counted as zero. The client page shows the score and band (Healthy, Needs attention, At risk), a 90-day trend, the change since the last business review and what pulls each area down; a new Client health dashboard card lists every client worst first with the 30-day change and the weakest area; the QBR pack opens with it; the weekly vCIO digest lists clients whose band dropped. Admins set the weights and bands under Settings → Planning & lifecycle and can show the score in a client's portal (off by default; scores only, without the alignment area). A score is saved for every client each day. REST API: GET /clients/{id}/health and /health/history under a new Health score scope (existing keys need it ticked). - Remove an onboarding (2.4.1): started one by mistake? The client's Onboarding page has Remove onboarding: it deletes the onboarding and turns its link off. Techs can remove one until the client opens it, admins any time; contacts and requests the client already sent stay. - What changed since the last QBR (2.4.0): each client has a Since last QBR page comparing today with the last completed business review (or an earlier one, or any date): projects finished and what they cost, projects added, approved, started and declined, approved projects whose quarter has ended, devices replaced, added and removed, warranties, end of life and operating system support that ran out, the alignment score then and now with the gaps closed and opened, compliance scores and controls updated, licenses added and retired, and tickets opened and closed. Figures saved when a review is marked completed make the comparison exact; older reviews are worked out from dates. The QBR pack opens with a Since our last review section, the client portal has a Since your last review card and page (each user sees only what their permissions allow; alignment stays staff-only), and the REST API has GET /clients/{id}/changes. Projects now remember when they were finished. - Licensing and trademark clean-up (2.3.1): the built-in CIS checklists use our own wording, client-facing pages link to the license and source, the License page credits every bundled component, and a trademark policy covers the MSP Align name and logo. - Alignment reviews (2.3.0): measure each client against your own standards, the way vCIO tools do. Libraries → Alignment standards (Settings → Standards before 2.16.0) holds the library (a starter set built from the MSP Security Baseline plus continuity, documentation and Microsoft 365 standards; edit, add, export and import your own), each standard with a priority, why it matters in client words, how to check it, an optional automatic check and a suggested fix. On a client's Alignment page, a review marks each standard aligned, misaligned or N/A, starting from the last review's answers, with hints from Align's own data and from the client's compliance answers. The score is weighted by priority and banded (On track, Needs attention, At risk); each gap becomes a roadmap project in one click, noting the compliance controls it helps with. The score shows on the client overview and the client list, compliance checklists can fill from it, and the QBR pack gets an Alignment section and highlight. Completing a QBR also saves a quiet snapshot of the client's numbers for a later "what changed since the last review" page. The REST API has it too, under a new Alignment scope (existing keys need it ticked): the standards, a client's score and gaps, its reviews with their answers, and starting, answering, finishing and discarding a review; POST /projects takes alignment_standard_id. - Clean-up and Portainer (2.2.6): an amount too large for a project, device or license is refused with a message instead of saving as empty (which used to wipe the old amount on an edit). An empty contact list from the PSA no longer archives every contact. The tabs of one sign-in share the idle clock, so a forgotten background tab can't sign you out while you work in another, and signing out in one tab signs out the rest. With .ics invitations, someone taken off a meeting's attendee list now gets a cancellation. New compose.portainer.yaml and a Portainer section in the Docker guide: a stack that deploys with nothing filled in. - Setup wizard catches up (2.2.5): the wizard's logo is now saved as the Light mode logo (reports, emails and the client portal) and shown on white, with a pointer to Settings → Branding for the dark mode logo. The PSA step says that without a PSA, Ready to start marks projects started instead of making tickets, and the last step points to Settings → Diagnostics. The client portal preview on Settings → Branding now matches the real portal (always light, with the light mode logo), and the portal screenshots on mspalign.org show the portal again instead of its sign-in page. - Light and dark mode logos (2.2.4): Settings → Branding now takes two logos, so a white logo no longer disappears on white paper. The Light mode logo is for light backgrounds: the sign-in page in light mode, printed reports and the QBR, contracts and their signed PDFs, emails, the client portal and its sign-in, onboarding pages, a light menu and the browser tab. The Dark mode logo is for dark backgrounds: the dark menu and the sign-in page in dark mode. Either one stands in for the other while only one is uploaded, so nothing changes until you add the second. A logo you uploaded before stays as the dark mode logo (it's the one the menu always used). - Diagnostics (2.2.3): a new Settings → Diagnostics tab for admins shows how the install is doing, read on the spot: the server (uptime, load, memory, time), the app (version, PHP and its extensions, OPcache, site address, debug mode, database updates), the database (size, tables, connections, memory for its data, encryption at rest, slow queries), storage (free disk space, uploaded files, active sessions), how much data there is, and whether the background jobs ran when they should (sync, PSA check, email, nightly audit check, update check, system agent). Each line is marked healthy, needs a look or a problem, with what to do, and a summary row on top. Problems from the last 7 days are listed, and Copy report / Download report give the same facts as text for a support request, without the site address or error text. - Ready to start: tickets when the work is due (2.2.2): approve a whole year of projects without filling your PSA's ticket board. Each project gets one QUOTE- ticket, made only when you say so. - Ready to start: an approved or scheduled project with no ticket goes on To do (new Projects tab) on the first day of its quarter, and stays there while it's overdue. Ready to start shows what goes into the ticket (subject, devices or description, quarter and budget) before it's made; Ready to start: all does every project on the list at once. It also works any time from the project window and the new Ticket column on Projects. - Not yet: hides a project from To do for a month, or 2, 3 or 6 months from its menu. The project shows when it comes back. - Without a ticket: with no PSA connected, or for a client that isn't linked to the PSA, projects still go on To do when their quarter starts, and Ready to start marks the project started (the date and who, saved on the project and in the audit log) instead of making a ticket. A project started that way can get its ticket later from the project window or Projects page, once one can be made (it keeps who started it and when), and Not started in the project window undoes the mark. If the client is linked or unlinked while a Ready to start window is open, pressing it does nothing and says to reload, so a project meant to get a ticket is never just marked started (or the other way round). The column and filter on Projects say Started when there's no PSA. The API's projects have a new started_at. - On a test server ('staging' => true): Ready to start works as it would for real, but saves a pretend ticket number (TEST- and the project's number) and sends nothing to the PSA, so the whole flow can be tried on a copy of real data. - Making projects: Make projects and Add project no longer make a ticket unless you tick Make the QUOTE- ticket now. Projects added by hand work exactly like device projects. Projects that already have a ticket keep it. - After updating: approved or scheduled projects from this quarter or earlier that have no ticket show on To do right away, older hand-added ones too (and, new, the ones of clients not linked to the PSA, or every client's without a PSA). Mark the finished ones Done and they leave the list. - Also: purple and teal category labels (Software / licensing, Cloud / M365, some meeting, license and document kinds) had white text on no background and are readable again. - New logo and name (2.2.2): MSP Align has a new logo, in the app and on mspalign.org, and its name now reads MSP Align (it was MSP-ALIGN). A branding name still set to the old default changes with it; a name of your own stays. The menu, the browser tab and the sign-in pages show it (the sign-in pages in light or dark lettering to match), and the default brand color is now the logo's blue. The built-in client portal sign-in background has teal hills to match. Your own logo, name and color from Settings → Branding still take its place; the color choices there now include the logo's teal and navy, and the old bright blue. - More device filters (2.2.2): Devices & assets (every client's list and each client's) has a Filters button. Its panel narrows the list by make and model, operating system, age, replacement year, warranty, status, backup, location, whether the device is in a project, and whether it has a last user. Each choice shows how many devices it has. - Filters work together with the view tabs, Type, the client picker and the search. Active filters show as chips above the list; press one to remove it, or Clear all. - The filters are part of the page address, so a filtered list can be bookmarked or sent to a colleague. CSV downloads just the filtered devices, and Set replacement comes back to the same filtered list. - Security and quality review (2.2.1): every file of Align was read line by line, then a separate security audit checked the whole program, and everything found was fixed and tested. Security has the summary. What you may notice: - Sign-in: wrong two-factor codes after a correct password alert admins at 5 in a row. After 50, the password is replaced and that person's sessions end, because someone else probably knows it. A password change, 2FA change or Sign out everywhere also turns off that person's calendar feed link; make a new one on the Meetings page. - Integrations: connections use https:// only, don't follow redirects and never reach the server itself or cloud metadata addresses. Servers on your own network work as before. An integration installed on the same machine needs 'allow_local_integrations' => true in config.php. If Veeam's list of protected machines can't be read, the machines from the last sync are kept. - Contracts: editing a draft you already signed removes your signature, so you sign again. A contract the client signed counts as signed even after it's cancelled, so only an admin can delete it. Only an admin can link the contract of a deleted client again. A drawn signature needs visible ink. - Onboarding: only admins can remove an onboarding, finishing needs every step done, and the welcome page can save contacts 30 times a day. - Settings: the company email on Settings → General is checked only when you change it. The email settings form is checked as a whole before anything is saved. An interrupted backup download keeps the backup on the server, so you can try again within the hour. - Audit log: more is recorded: views of the contract and document lists, portal users and unassigned hardware, every visit to an onboarding page, PSA checks that only changed contacts or licenses, Sync now on a device, and which records a CSV import changed. - Docker: ALIGN_STAGING also accepts true, yes or on, and any other value stops the start-up. Scheduled jobs have time limits. The image now includes the release key file, so the update notice only offers signed releases. - Contracts, signed online (2.2): send your own contracts to be signed online, and keep the signed copies with the client. They're under Onboarding in the menu, with the welcome email and the onboarding guide (moved from Settings). - Your own agreement: upload it as a PDF and Align keeps it exactly as it is. Place boxes on it for the client's details, the contract start date, your prices (quantities counted from the client's devices, users and licenses), signatures, names, titles, dates and initials. Find the blanks suggests them for you. Or write the contract in Align instead. - Send and sign: make a contract for a client or a new lead, check the preview and send it. The client opens a private link (with a code emailed to them, if you turn that on) and is taken box by box through filling in, initialing and signing, or declines. Reminders go out automatically. - The signed copy: after you countersign, Align makes the signed PDF with a signature certificate (who signed, when, from which IP address and browser, and a fingerprint of the content), keeps it with the client and emails a copy. Check a signed PDF tells you whether a copy someone sends you is exactly the signed one. - Also: keep contracts signed elsewhere (DocuSeal or paper) by uploading them, and turn a new lead into a client in one click, ready for the welcome email. New clients lists every onboarding. - Sign-in backgrounds (2.1.1): the sign-in pages now have a background: a built-in dusk landscape for your team and a calm, light one for the client portal. Under Settings → Branding you can upload your own for each (JPG, PNG or WebP up to 8 MB), choose how much to darken it, or pick No image for the plain page. The logo and the sign-in box stay readable on any photo, on desktop and phones, in light and dark mode. Images are re-encoded before they're shown, so no camera or location details go out with them. - Replacements become projects, with a quote ticket (2.1): when a client approves replacing devices, tick them on the client's Devices & assets page (or open one device) and choose Make projects. You get one project per device, or one for several replaced together, in their replacement quarter or one you pick, at their budgeted cost or the quote amount. Align can also create a QUOTE- ticket in ITFlow for each one, listing the devices, serials, users and budget, with no client contact so it's simply a new ticket to assign. The devices leave the automatic replacement plan while the project stands, so the roadmap and budget never count them twice; decline or delete the project and they go back to their replacement dates. Each device links to its project, and the project lists its devices and ticket. - Microsoft 365: old backups kept are no longer counted (2.0.2): Veeam keeps the backups of people who left and of tenants no longer used, and lists them for years. A user, group, team or site with no new backup for 30 days now moves to a No longer backed up list on the client's Backups page (old backups kept, still restorable) and isn't counted as protected or overdue anywhere, including reports and the client list. Until then a stopped backup still shows as overdue. Change the days, or turn this off with 0, under Integrations → Veeam. A tenant whose last backup Veeam doesn't report now shows its newest restore point instead of "never". - Microsoft 365 backups in two repositories (2.0.1): when a tenant's backups moved from a legacy repository to a new one, Veeam lists each user, group, team and site once per repository, and Align could keep the legacy copy (months old) and show a current mailbox as overdue. Now the copies are one object and the newest restore point counts. The Backups page shows days with a backup for each one (several restore points on one day count once, across repositories), marks objects kept in more than one repository, and lists every protected user, group, team and site, not only the overdue ones. Align counts the days from its first sync after the update, since Veeam reports each repository's newest restore point rather than every date. - "Are you sure?" before big changes (2.0.1): changes that are wide, hard to undo, email clients or write to your PSA now ask first, in a dialog in the app's own style (light or dark) that says what will happen and to how many, e.g. "Change the replacement plan for 14 devices? Their place on the roadmap and in the budget moves with it." It only asks when it matters: saving the lifecycle policy asks only when a lifespan or cost changed, and says how many devices are recalculated. - Wide changes: bulk replacement plans and device types, the lifecycle policy, budget year and OS support dates, client mapping and hosted-backup moves, deleting framework controls (with how many clients lose their answers), turning off the API, client suggestions or online requests, and staff role changes (Cancel puts the old role back). - Emails to clients: meeting invitations and updates (and whole series), welcome emails, new portal invite and reset links, digests sent now, documents shared to the portal, and client emails being switched on. - Writes to the PSA: turning on two-way sync, asset creation or warranty write-back, bulk type changes sent to the PSA, syncing a device again and restoring a retired one. - Unsaved changes: closing an edit window (project, budget line, license, contact, device, meeting, portal user) with changes asks before discarding them, and leaving a long form (compliance checklist, framework editor, mapping, settings, integrations) asks before the page closes. - Enter is safe: pressing Enter in a field saves the form; it no longer runs a Delete, Retire, Restore or "new link" button that happened to come first. - MSP Align 2.0: ready for everyone (2.0.0). The first public release: everything from 1.27 to 1.45 (REST API, no-PSA mode, setup wizard, demo data, the new look and dark mode, Docker, the security audit) is now the base for other MSPs to install. New in 2.0: - Signed releases: a server installs only releases signed with the MSP Align release key, which is never stored on GitHub or a build machine, and checks the signature itself against the key file it already has. A release that isn't signed with it is refused and raises a security alert, so a stolen GitHub account can't push an update to your server. Settings → Updates & backups shows the key's fingerprint. Docker images are signed too. See Signed releases. - API: PSA ids are text. psa_id (clients, contacts, licenses) and psa_asset_id (devices) are now always text, for example "57", so every PSA fits the same field. If an integration compares psa_id with a number, update it or use the itflow_* fields, which stay numbers. From 2.0, the v1 API only adds things; anything that would break an integration will come as v2. See REST API. - Docs: new pages for the REST API (every endpoint, generated from the API itself), Troubleshooting, the FAQ and Contributing, fresh screenshots, and corrected install and Docker steps. - For contributors: a code of conduct, issue and pull request templates, sign-off on commits (DCO) and GitHub Discussions for questions. - Also: sudo msp-align-update with nothing new installs the current release again, which repairs packages, permissions and services. A restore no longer sets off a false audit log alert at the next nightly check. A Docker container can be a test server (ALIGN_STAGING). The installer waits for a backup or update that's running instead of overlapping it. - Branding page in the new look (1.45.2): Settings → Branding now matches the 1.43 interface: cards for name & logo, colors (suggested colors, and dark or light menu as picture choices) and the sign-in page message. The live preview shows the app, the staff sign-in page and the client portal as they look now, in light or dark mode, and follows every change as you type. Nothing else about branding changes, and your settings are kept. - Remember this browser, and yearly invoices (1.45.1): - Remember this browser: after the two-factor code, staff and client-portal users can tick Remember this browser to skip the code on that browser for 14 days. Their password is still asked for at every sign-in. Admins set the number of days, or turn it off, under Settings → General → Security. Each person sees and can forget their remembered browsers on their Account page, and a password or authenticator change, Sign out everywhere, a 2FA reset or disabling the account forgets them all. - Yearly recurring invoices: the managed-services estimate from ITFlow now follows each recurring invoice's own frequency. A yearly one counts as a twelfth a month instead of the whole amount every month. ITFlow's API doesn't say how often a recurring invoice repeats, so each one's frequency is worked out from the dates of the invoices it made. One billed only once counts as yearly until a second invoice shows it's monthly, and one that stopped billing drops out. The budget line says how it was worked out, e.g. "1 monthly, 1 yearly". - Security audit (1.45): before 2.0, every file of the app, installer, backup agent and Docker setup was reviewed line by line and tested against a live install; Security has the summary. - Serious fix: with code already running as the web user, the root backup agent (and the installer and Docker start-up) could be tricked by a symlink into handing a root-owned folder to the web user. The agent now does everything in the web user's folders as that user. - The audit log: its start and end are sealed too, and the nightly check keeps an outside checkpoint, so entries cut off either end, or an old copy written back, are caught. - Portal: - The QBR's key contacts and next meeting need the contacts permission. - A reset link on a 2FA account asks for the code before anything changes. - Service requests are rate limited. - Sign-in and 2FA: - Removing someone's 2FA also gives them a one-time password. - Moving 2FA to a new phone needs a code from the old one. - Lockouts and one-time codes hold up against parallel requests. - Integrations and email: changing an integration's address or the SMTP server needs the key or password typed again. - API: client-limited keys can't reword or cancel a meeting whose invitations went out, and a key stops when its creator is no longer an admin. - More in the audit log: scheduled syncs, PSA changes, document autosaves, license restores, meeting notes and views of device lists, compliance and contacts. - Also: - Brand logos are re-encoded. - Only admins can delete a document. - Onboarding links end a week after onboarding is done. - GitHub Actions are pinned to exact commits, with Dependabot watching them and the Docker images. - Contacts sync both ways with ITFlow, archiving too (1.44.1): archiving or restoring a contact in Align now does the same in ITFlow (ITFlow's own archive, so it also clears the contact's Important/Billing/Technical flags and archives their client-portal login there); a contact archived in ITFlow comes back in Align when it's restored there. Each client's Contacts page says whether its contacts sync both ways, come in only, or stay in Align (not linked, with a link to Client mapping), and the Integrations switch is now called Two-way sync (devices and contacts). If ITFlow refuses, or is too old to archive from other apps, Align says so and archives in Align only. - Install with Docker (1.44): MSP Align also ships as a container image (ghcr.io/msp-align/msp-align, amd64 and arm64) with a compose.yaml for the app and MariaDB and an optional compose.caddy.yaml for automatic HTTPS. One container runs the web app, the scheduled jobs and the backup agent; data lives in named volumes. Backups and restore work from Settings as before, and a backup moves between Docker and a dedicated server. Updates in Docker are docker compose pull && docker compose up -d. In Docker, trusted proxies can be narrow address ranges, and the database is encrypted at rest as on a dedicated server. Dedicated installs are unchanged, and CI now proves it: every change runs a fresh install.sh and an update from the previous release in a Debian 13 VM. See Install with Docker. The docs site has a new Screenshots page, and the docs are brought up to date with the 1.42 menus and 1.43 look. - A cleaner look, and dark mode (1.43): the interface moves to AdminLTE 4 and Bootstrap 5.3 with a cleaner design: white cards on a light gray page, softer borders and badges, one accent color (your brand color from Settings → Branding) and a compact dark sidebar. Each person picks Light, Dark or Match my computer under Account → Light or dark; printed reports and PDFs always stay light. The client portal gets a friendlier look: the client's logo and name at the top, larger text, more white space and simpler section tabs. jQuery is no longer used. - Faster at scale, and one layout (1.42): tested at 150 clients and 10,000 devices, where every page now loads in under a second. The hourly sync takes half as long, the 2-minute PSA check and the digest emails a quarter to a half, and the Licensing, Contacts, Projects and Client mapping pages send a tenth of the HTML (edit forms load when opened). The main menu is shorter: a new To do list (hardware to categorize, licenses to price, clients to link, hosted backups to match, client suggestions), a Devices & assets list across every client, and Admin pages with tabs (Integrations: connections, client mapping, hosted backups, sync history; People: staff and portal users). The top search also finds devices by name, serial or user, contacts and licenses. Client menus are grouped (Their IT · The plan · Meetings, with a Reports page), every list has the same header, tiles and one-row filter bar with 100 rows at a time and search over every row, the device table shows 7 columns with a Columns menu, device pages have tabs, and the client portal has six tabs instead of ten. The installer now sets PHP's memory limit to 512 MB and sizes the MariaDB buffer pool to a quarter of RAM; tests/perf/ builds a large test install and times every page. - Demo data (1.41): try MSP Align before adding your own clients: on an install with no clients, Load demo data (setup wizard → Clients, or Settings → Diagnostics → Demo data; on General before 2.16.0) adds four made-up clients with contacts, devices of every age (some past end of life or on an unsupported OS), licenses, budget lines and contracts, roadmap projects, meetings, a compliance assessment, documents, 30 days of backup results, a client portal user and a license suggestion waiting for review. Dates are relative to the day it's loaded. A banner shows while it's there, and Remove demo data deletes exactly the demo clients and everything attached to them. Names, email addresses (.example) and serial numbers are invented; service levels are left out because they come from a PSA. - Setup wizard (1.40): a new install opens a step-by-step wizard for the first admin: company details, logo and colour; currency, dates and timezone; PSA (ITFlow or none); RMM; backups and warranty lookups; email (Microsoft 365, Google Workspace or SMTP); first clients (first sync, RMM organizations, CSV import or by hand); and staff accounts. Every step can be skipped and shows as skipped; steps done elsewhere are ticked too. The forms are the app's own settings, integration, email and user forms, so nothing is saved differently. Existing installs are marked as set up when they update and never see it pop up; any admin can open it from Settings → General. - Client portal update (1.39): clients can suggest licenses (product, vendor, how many, price, billing, renewal date) and budget items (internet, phones, hosting, other costs) from the portal. Each waits for staff: it shows on the dashboard and at the top of the client's Licensing or Budget page, where Review and add opens the normal Add form filled in from the suggestion (edit anything first) and Decline takes a note. The client sees it as waiting, added or declined (with the note) and can withdraw it while it waits; an optional email tells them when it's reviewed. New portal permission Suggest licenses and budget items (existing users with Budget & licensing get it) and an admin switch on Client portal users. Portal contacts are now view-only (new user and termination requests stay), and the portal has a new layout: the client's name in full, every section on its own bar with icons (scrolls sideways on a phone), and a home page with four summary tiles and a Your IT team card with quick actions. - Currency & dates (1.38): Settings → General → Currency & dates sets the currency (20 common ones, symbol before or after the amount), how numbers are written (1,234.56, 1.234,56, 1 234,56 or 1'234.56), the date style (Sep 29, 2026, 29 Sep 2026 or 2026-09-29), a 12- or 24-hour clock, the first day of the week and the timezone (which used to be set only in config.php). One choice for the whole install, used on every page, report, email and the client portal, with a live preview. Amounts are never converted; CSV exports and the API keep plain numbers and ISO dates, and the API's budget says which currency it is in. The defaults are the US style MSP Align always used. - Email through any SMTP server (1.37): Integrations → Email now offers a third connection next to Microsoft 365 and Google Workspace: any SMTP server or relay (your own mail server, SMTP2GO, Mailgun, SendGrid, Amazon SES, or the Microsoft 365 / Google relay). STARTTLS or TLS from the start, an optional user name and password (never sent without encryption), and a certificate check that can be switched off for an internal relay. Everything goes through the same queue and retries; a recipient the server refuses for good fails straight away instead of retrying. Meeting invitations are sent as .ics emails that mail apps show with Accept / Decline, and a test server still sends only to its test mailbox. - No-PSA mode (1.36): MSP Align works without a PSA. With only an RMM connected, Client mapping adds a client for each RMM organization (once each, already linked; optionally on every sync), and Clients → Import brings in clients and contacts from a CSV file, showing what each row will do before anything is saved (existing ones are updated, not duplicated; details from a PSA are never overwritten). Clients are linked to RMM organizations by name on every sync even without a PSA, and screens leave out PSA-only features (tickets and service levels, invoice estimates, two-way asset sync) instead of showing them empty. Help has a Run MSP Align without a PSA guide. - Server names match the app (1.35): the update moves an existing server from the old mountaineer-align names to msp-align: /opt/msp-align (code), /etc/msp-align (config), /var/lib/msp-align (data), the msp-align-* services and timers, the Apache site and its logs (/var/log/apache2/msp-align-*.log). Each old folder is left as a link to the new one, so anything that used the old paths keeps working, and the mountaineer-align-update / -restore commands still work. Nothing is copied or lost: the folders are moved in place, the database keeps its name, and a server that was already moved (or installed fresh) is left alone. - Ready for PSAs with text ids (1.34): PSA ids (clients, contacts, licenses, assets, tickets, service requests) are stored as text, as RMM ids already were, so a PSA that uses GUIDs can plug in. Existing ids are kept exactly; the REST API still reports ITFlow's ids as numbers and reports any other id as text. The PSA poll timer is now mountaineer-align-psa (the update removes the old mountaineer-align-itflow one), and Help names your own RMM and backup products. - Project home (1.33): documentation now has its own site at mspalign.org, built from this README and docs/ on every release. The copyright notice reads Mountaineer IT Inc. and MSP Align contributors; security issues are reported privately through GitHub (see docs/SECURITY.md); calendar invitations identify as MSP Align. Optional update_check_url lets a server check a small version file before GitHub. - Tests pass in any timezone (1.32.2): the test suites now run in the app's timezone whatever the machine is set to, so they pass on GitHub's UTC runners as well as locally (no change to the app). Tests also run on pushes to develop. - Test servers (1.32.1): a test server can follow the develop branch (update_branch in config.php; Settings → Updates & backups shows the channel) and run on a restored copy of production in staging mode: reads from connected tools still work, nothing is written back to the PSA, every email and invitation goes only to one test mailbox marked [TEST], real calendar events are never touched, the client portal and API are off, and every page says "Test server". See docs/TEST-SERVER.md. - Tests in the repository (1.32): the 28 end-to-end suites (about 1,100 checks: every screen, the client portal, the REST API and its attack tests, email through Microsoft 365 and Google, sync with ITFlow / NinjaOne / Veeam, updates and backups, upgrades from 1.27, 1.28 and 1.29, and a crawl of every page for each role) now live in tests/e2e/, with one command to run them and GitHub Actions running them on every push. They start from a seed built from scratch with fictional data, so nothing from a real install is needed or stored. - One client mapping screen (1.31): Client mapping works the same for every connected tool that keeps its own customer list (each RMM's organizations, each backup product's companies): a card per tool with how many clients are linked and which records aren't, a Missing a link view, and plain labels for each link (by name, by hand, kept unlinked). Connectors plug in through one interface (LinksClients), and RMM and backup auto-matching now share one routine (same results as before). Forms from older pages still save. Help has a new Link clients guide. - Fictional test data (1.30.2): the mock servers used by the test suites now use made-up businesses, people, addresses and 555 phone numbers. Nothing changes in the app. - New home (1.30.1): the project now lives at github.com/MSP-ALIGN/MSP-ALIGN. Updating to 1.30.1 switches an install that pulls from the old repository to the new one automatically (if the new one can't be reached, it keeps the old one and says so). The license page's source link points to the new repository too. - Provider-neutral backup data (1.30): Veeam Service Provider Console is now one backup provider (src/Providers/Backup/BackupProvider.php), and an install can run several backup products. Backup companies live in backup_companies, each client's company link moves to client_links, and every job, machine and Microsoft 365 record notes its provider, so one product's sync never removes another's data. Client mapping shows a company column per backup product (the old veeam[] form field still saves). Screens, reports, the portal and the API work exactly as before; see docs/PROVIDERS.md. - Provider-neutral RMM data (1.29): NinjaOne is now one RMM provider (src/Providers/Rmm/RmmProvider.php), and an install can run several RMMs at once. Each device records the RMM it came from and that RMM's device and organization ids (devices.rmm_provider, rmm_device_id, rmm_org_id, stored as text because some RMMs use non-numeric ids). Client ↔ organization links moved from clients.ninja_org_id to a client_links table (one link per client per provider), and ninja_orgs became rmm_orgs. Client mapping shows a column per RMM. The API still reports NinjaOne devices with source: "ninja" and ninja_device_id, plus a new rmm object. - Provider-neutral PSA data (1.28): ITFlow is now one PSA provider behind a common interface (src/Providers/Psa/PsaProvider.php). The sync, screens, reports and API only see neutral records, so another PSA can feed the same areas by adding a provider; see docs/PROVIDERS.md. ITFlow-named tables and columns were renamed (itflow_assets → psa_assets, clients.itflow_client_id → psa_id and so on) by an automatic migration; nothing changes in how Align behaves. The API keeps its itflow_* fields as deprecated aliases of the new psa_* ones. - REST API (1.27): read and write access for automation tools (n8n, Zapier, Power Automate), AI agents, scripts and other systems, under Settings → API (off until an admin turns it on). Base URL /api/v1, JSON, Authorization: Bearer msa_…. Keys are hashed and shown once; each has read/write scopes per area (clients, contacts, devices, projects, budget, licensing, meetings, compliance, backups, service levels), an optional limit to specific clients, an optional expiry and a per-minute rate limit. Writes cover device lifecycle details (pushed to ITFlow like the device page), projects, budget lines, license prices and contracts, meetings (with optional calendar invitations), compliance controls and frameworks, backup exemptions and hosted backup assignments. PATCH changes only what you send; unknown fields are refused; POST accepts an Idempotency-Key; lists paginate and take updated_since. Every change is in the audit log under the key's name, and every request in a 30-day request log. The OpenAPI 3.1 description is at /api/v1/openapi.json and rendered as a reference page under Settings → API. The full reference is also on the docs site: REST API. - Hosted clients' backups (1.26): backups that run on your own Veeam server (your BDR) are filed by Veeam under your company. Align now sorts them into clients on every sync: a machine goes to the client with a device of the same name in NinjaOne or ITFlow; Client mapping → Hosted backups lists every job and machine on your servers, where each went and why, and lets you assign a job (its machines, including ones added later, follow it) or a single machine to a client, or mark it as yours. Jobs shared by several clients count for each; client reports and the portal leave out their error details. Jobs mapped to companies in VSPC keep working as before. If your own company is linked to a client, flag it as your backup server there. - Reports in meeting order (1.25): the QBR pack runs executive summary → service levels → assets & lifecycle → software & licensing → backup & recovery → compliance → roadmap → budget → decisions & next steps (projects awaiting approval with tick boxes, key contacts, next meeting), with the full inventory as an appendix. Devices are grouped servers & virtualization (hosts, servers, virtual servers) → storage → network & security → power → computers (desktops, laptops, virtual desktops) → printers & other, in the device-type table, devices needing attention, inventory and protected machines. The budget report goes this year → line items → three-year chart and outlook → contracts & renewals; the roadmap report starts with where things stand today.

Planned: budget vs. actual spend.