Security & Trust Center

PURPOSEBUILT SYSTEMS LLC · Microsoft verified publisher (MPN 7123774) · Last updated July 26, 2026

This page answers the questions IT security reviewers ask about our Microsoft 365 add-ins — written for the reviewer, not the marketer. Every claim below is verifiable from the served source code (unminified, publicly readable on this site) and from each app's Microsoft Entra consent prompt.

The architecture in one paragraph: every PurposeBuilt add-in is static HTML/JavaScript served from GitHub Pages, running inside Outlook's own task-pane sandbox. There is no publisher server, no database, no telemetry, and no data collection of any kind. All mail, calendar, file, and Teams operations execute as the signed-in user via Microsoft Graph — Microsoft 365's own API — using delegated permissions only, inside the customer's tenant boundary. Email content has nowhere to go except where the user could already put it.

Per-app permission matrix

Delegated Microsoft Graph scopes only. No application permissions. No ".All" mailbox scopes. No access to other users' mailboxes, ever. Add-in manifest permission shown in parentheses.

Add-inDelegated Graph scopesWhat they're for
Reply All with Attachments
(manifest: ReadItem)
Mail.ReadWrite Create the reply-all draft and copy the original attachments onto it. Drafts only — the user sends.
Biweekly Activity Report
(manifest: ReadItem)
Calendars.Read, Mail.ReadWrite Read the user's own calendar/mail to build the report; optionally save it as a draft.
Auto Contacts
(manifest: ReadItem)
Mail.Read, Contacts.ReadWrite Read senders/signatures; create or enrich the user's own contacts.
Waiting On
(manifest: ReadItem)
Mail.ReadWrite Scan the user's own sent/received mail for unanswered asks; create nudge drafts.
Attachment Librarian
(manifest: ReadItem)
Mail.Read (read-only) Index attachment metadata only — file contents are never downloaded.
Public Records Packager
(manifest: ReadItem)
Mail.Read, Files.ReadWrite Search the user's own mail; write records bundles to the user's own OneDrive.
Travel Desk
(manifest: ReadItem)
Files.ReadWrite.All, Mail.ReadWrite Append rows to the org's shared travel planner (files the user can already reach — delegated scopes grant no new access); create the authorization email as a draft.
Legislative Report Router
(manifest: ReadWriteItem)
Mail.ReadWrite, Mail.Send, ChannelMessage.Send, ChannelMessage.Read.All, Sites.ReadWrite.All, Team.ReadBasic.All, Channel.ReadBasic.All, TeamworkTag.Read
Requested only on use: Sites.Manage.All, TeamworkTag.ReadWrite
Parse bill reports; post to Teams channels and send division emails — only after explicit user confirmation; read routing rules from, and write audit records to, the customer's own SharePoint lists. ChannelMessage.Read.All reads divisions' replies to the add-in's own bill posts, so cost estimates need not be retyped — Graph offers no "replies to messages I posted" scope, and it reads only channels the signed-in coordinator already belongs to. Team.ReadBasic.All / Channel.ReadBasic.All populate the setup wizard's team and channel pickers. Two scopes are requested only at the moment the feature is used, so a tenant that never grants them still has a working add-in: Sites.Manage.All to create the add-in's own three lists (Microsoft splits this from Sites.ReadWrite.All, which cannot create a list), and TeamworkTag.ReadWrite to create a division's Teams tag during guided setup. Sites.Selected hardening available on request.
Roster Auditor
(manifest: ReadItem)
Group.Read.All, Group.ReadWrite.All, Mail.ReadWrite, Calendars.Read, OnlineMeetings.Read, OnlineMeetingArtifact.Read.All Read the rosters of groups the signed-in user belongs to; scan their own sent mail for group sends and bounce notifications; draft re-engagement email. Teams attendance reports are available only for meetings the user organised — the add-in cannot observe anyone else's meetings. Group.ReadWrite.All is used solely to remove a member from a Microsoft 365 group the user owns, after a two-step confirmation; classic distribution lists are read-only in Graph and are handled by CSV export instead.
Successor Console
(manifest: ReadItem)
Mail.Read, Mail.Read.Shared, Files.ReadWrite.All Read an inherited or shared mailbox the user has already been granted Full Access to by IT — the delegated scope grants no new access on its own — and write the resulting knowledge pack to the organisation's own OneDrive or SharePoint. Extraction is deterministic and verbatim with source links; the add-in makes no AI calls.

Data handling

Authentication

Microsoft Entra ID via MSAL Nested App Authentication — Microsoft's current, supported pattern for Outlook add-ins. No legacy Exchange tokens, no EWS, no basic auth anywhere in the suite; the 2026 retirement of legacy token patterns requires no changes to these apps. Tenant admins can require and grant admin consent centrally; each app is a multi-tenant Entra application from a verified publisher, so the consent prompt shows the verified checkmark.

Auditing & monitoring

Because the add-ins have no publisher-side activity, the complete audit surface is the customer's own Microsoft 365 audit log: every operation an add-in performs is a delegated Graph call by the signed-in user, attributable to the app's application ID in the unified audit log (Microsoft Purview). Monitoring an add-in = filtering audit records by its app ID. There is no side channel to instrument.

Deployment controls

Certification status

Questions, security reports, and reviews

We answer security review questionnaires quickly — most controls resolve to "no publisher infrastructure exists." Contact Matthew@purposebuilt.systems. Vulnerability reports: same address, and thank you.