Portal Audit

Portal Audit: Privacy Policy

Last updated: October 15, 2026

1. Who we are

Portal Audit by TJM ("Portal Audit") and its paid plans (the "Service") are operated by Jon Martin, a sole proprietor trading as TheJonMartin ("we", "us", "our"). Portal Audit is a HubSpot app that audits your portal's data quality, setup and usage, scores it, and gives a prioritized fix plan. On the Fix plan it can apply fixes you approve.

Contact: Jon Martin, sole proprietor trading as TheJonMartin, 819 E. Orange St., Lancaster, PA 17602, United States. Email: jon@thejonmartin.com. We are reachable by email only.

This policy explains what the Service reads from your HubSpot account, what we keep, who we share it with, how long we keep it, and the choices you have. Section 16 is the extra notice for people in the European Economic Area and the United Kingdom.

2. Who the Service is for

The Service is a business tool for organizations that use HubSpot, including organizations in the European Economic Area and the United Kingdom. It is not a consumer product. Users must be at least 18.

This policy covers the person who installs Portal Audit, the organization that owns the HubSpot account (the "portal"), and the HubSpot users and record owners whose details show up in the settings we read. HubSpot's own privacy policy governs your HubSpot account itself. Paid orders are placed with Paddle, the merchant of record, which calculates and collects VAT and similar taxes. Paddle's privacy notice covers the payment data Paddle controls (section 8).

3. What Portal Audit reads from HubSpot

During installation you approve a set of HubSpot permissions ("scopes"). The public install link asks for read permissions. Nothing changes in your portal unless you approve it. Write permissions are not on that public link.

Required permissions

HubSpot dataScopeWhat the audit reads
AccountoauthAccount details: portal ID, time zone, currency, data hosting location
Contactscrm.objects.contacts.readRecord counts (including totals of calls, meetings, notes and tasks; activity text is not stored) and field-completeness checks (counts only; no contact records are copied)
Companiescrm.objects.companies.readRecord counts and field-completeness checks
Dealscrm.objects.deals.readRecord counts, field completeness, deal pipelines and stages
Ticketscrm.objects.tickets.readRecord counts, field completeness, ticket pipelines and stages
Contacts, companies, deals, ticketscrm.schemas.contacts.read, crm.schemas.companies.read, crm.schemas.deals.read, crm.schemas.tickets.readProperty definitions (names, types, groups, usage flags). Contact and company lifecycle stage options and their order.
Line itemscrm.objects.line_items.read, crm.schemas.line_items.readRecord counts; property definitions
Quotescrm.objects.quotes.read, crm.schemas.quotes.readRecord counts; property definitions
Userscrm.objects.owners.readRecord owners, used to find unassigned or departed owners
Userssettings.users.readUsers, roles and the super admin flag, used for the access review
Userssettings.users.teams.readTeams and team membership
Segments (lists)crm.lists.readSegment names, types, sizes and last-updated dates
Account securityaccount-info.security.readLogin history, security activity and audit-log summaries for the last 90 days; private-app API usage

Optional permissions (you can uncheck any of these on HubSpot's install screen; the related checks are then marked "not assessed")

HubSpot dataScopeWhat the audit reads
FormsformsForm names, types and settings (submissions are not read)
Marketing emailmarketing-emailMarketing email status and settings (nothing is sent)
WorkflowsautomationWorkflow names, status, object type, enrollment settings and actions (no workflow is changed)
Marketing emailcontentMarketing email inventory when marketing-email is not enough
Custom objectscrm.objects.custom.read, crm.schemas.custom.readCustom object record counts, field completeness, schemas and property definitions
Websitecms.domains.readConnected domains, used to find your company website for the business profile
Goalscrm.objects.goals.readHow many goal targets exist (the id only; owner and creator ids are not requested)
Leadscrm.objects.leads.readWhether the leads object is turned on, then the lead total (one search, id only)
Meetingsscheduler.meetings.meeting-link.readHow many meeting links exist (the total only; link URLs and organizer ids are not stored)
Reportingreporting.full.readHow many custom reports and dashboards exist (totals only)
Knowledge basecms.knowledge_base.articles.readHow many knowledge base articles exist. Article bodies are not requested
Feedbackcrm.objects.feedback_submissions.readHow many feedback survey responses exist (the total only; answers are not read)
Orderscrm.objects.orders.readHow many orders exist (the total only; amounts and line items are not read). Skipped when the permission is not granted or orders are turned off
Invoicescrm.objects.invoices.readHow many invoices exist (the total only; amounts and line items are not read). Skipped when the permission is not granted or invoices are turned off
Subscriptionscrm.objects.subscriptions.readHow many commerce subscriptions exist (the total only; amounts and line items are not read). Skipped when the permission is not granted or subscriptions are turned off
Commerce paymentscrm.objects.commercepayments.readHow many commerce payments exist (the total only; amounts, status, and payer details are not read). HubSpot lists this permission for Starter accounts. Skipped when it is not granted or payments are turned off

About four of these permissions. HubSpot offers no read-only version of forms, marketing-email, automation and content, so HubSpot's install screen describes them as permissions that can also make changes. The audit path checks every request before it goes to HubSpot. It allows reads (GET requests and a short list of search and batch-read requests). It blocks every create, update or delete request on that path before it leaves our server.

Write permissions, only after you approve a fix. A Fix reauthorize on this same app can ask for eight write permissions (crm.objects.contacts.write, crm.schemas.contacts.write, crm.schemas.companies.write, crm.schemas.deals.write, crm.objects.deals.write, crm.objects.tickets.write, crm.objects.companies.write, settings.users.teams.write). They are conditionally required: the public install link does not include them. Fixes that use them stay off until you approve them, and each change still needs a dry run and an approval. The app does not request Sensitive Data scopes, crm.export, or crm.import.

Disconnect. If you ask us to disconnect, the app calls HubSpot's uninstall-app API to remove itself from your account. That call changes none of your records or settings.

What we do not read or keep. We do not read form submissions, conversations, files or payment data from HubSpot. We do not copy contact, company, deal or ticket records. Data-quality checks keep only counts of records with missing or inconsistent fields. We do not keep the content of marketing emails. Products and one-to-one emails are listed in the object inventory as not assessed, and those APIs are not called. Call, meeting, note and task text is not stored; only those record totals are kept. Portal Audit never requests HubSpot Sensitive Data or Highly Sensitive Data permissions, and never reads or checks that data. That includes any permission whose name contains .sensitive. or .highly_sensitive., and the older ticket permissions tickets.sensitive and tickets.highly_sensitive.

4. Automated fixes

Nothing changes in your portal unless you approve it.

5. What we store

WhatDetails
Connection recordYour portal ID, HubSpot account domain, the HubSpot user ID of the person who installed the app, the HubSpot data center, the permissions granted, install and uninstall timestamps, and a refresh token. The refresh token is encrypted with AES-256-GCM and bound to your portal ID. Short-lived access tokens stay in memory and are never written to disk.
Audit reports and fix plansReport files (JSON, Markdown, HTML, PDF), fix plans and supporting files. They contain configuration details and counts. Personal data in them is limited to: names of HubSpot record owners and HubSpot owner/user IDs; team names; for each HubSpot user, a user ID, display name (first and last, when HubSpot returns them), role and team IDs, seat names and the super admin flag; the time of each user's latest successful login in the review window; and, for users past their inactivity threshold, how many contacts, companies, deals and tickets they own and a suggested reassignment target. Login activity is also summarized as counts by event type and country code, plus the IDs of the users who logged in. A matched public job title may be stored on the org chart only when this portal has ticked the separate org-chart box (off by default) and APIFY_TOKEN is set. Website research alone does not turn that on. We do not store email addresses, IP addresses, browser user agents, cities, or public profile URLs from login history or from that people lookup, and owner email addresses are left out of reports. When the Service emails a report to the HubSpot user who installed the app, that person's email address is stored with the delivery record for that report. It is not written into the report file.
Fix logs (plans with automated fixes)As described in section 4.
Business profileYour industry, company size band and website, which you confirm on the page shown right after you install (or skip; see section 7). If you tick the research box on that page, we also keep a short summary and strengths/weaknesses analysis built from your public website and from public outside sources. To read your website we fetch up to five of its public pages, chosen from its sitemap and from links on the home page, we respect its robots.txt, and we remove email addresses and phone numbers from the text we keep. For outside sources, the AI agent that drafts your report may consult public pages about your company (for example a company profile or a news article) and quote a short passage with the page's address. Our server does not fetch those outside pages; the agent does, outside our systems, and only the quoted passage and address come back to us. No HubSpot data is sent to look anything up.
Billing and account details (paid plans)The billing contact's name and email, business name, billing address where Paddle needs it for tax, your plan and billing period, and payment status. Card and bank details are collected and held by Paddle, the merchant of record (section 8); we do not receive or store full card or bank account numbers.
Support messagesEmails you send to jon@thejonmartin.com and our replies.
Optional inputs you give usFor example, a HubSpot Context Home score you choose to share, the cost-input ranges an admin picks (people, deal size, loaded hourly cost, hours per week; each can be N/A), and anonymous survey answers from people the admin invites. The survey asks what part of HubSpot they would skip and a few dropdowns. It does not ask for a name or an email. A written answer that contains an email, a link, a long number, or a name is dropped. Survey totals in the report are for that portal only.
Anonymized survey countsWhen someone submits that survey, we also store a separate count of the dropdown answers (which area, how often, and whether they want the work taken off their plate). That count has no portal id, no name, no email, and no written answer. We collect it for product improvement and for future benchmarks. Collection is on. Your report shows your portal’s own anonymous answers. It does not show a comparison with other portals unless we later turn that comparison on.
Anonymized usage-shape dataFor each audit we store a separate summary of the shape of your HubSpot usage: portal plan and size band, counts of pipelines, stages, properties, objects, lists, forms, emails, and workflows, fill rates, activity rates, user and team counts, which audit checks fired, and the multiple-choice answers on the shaping checklist. We collect this for product improvement and for future benchmarks. We do not store in that summary any person's name, any email address, the portal id, or the names or labels of your properties, pipelines, stages, teams, workflows, forms, or lists. We store a one-way code derived from the portal id so we can keep one current summary per portal and so we can delete it. Collection starts with this version of the Service. A comparison with other portals appears in your report only when the group is large enough, the range is tight and stable, and we have turned that comparison on. Until then, your report does not include one. This summary is deleted on the same schedule as the rest of your data when you disconnect, and immediately if you opt out.
Schedule and historyYour audit settings and a record of past runs.
Operational logsErrors and timings. Each error is logged as one line with tokens and secrets removed. Logs contain no response bodies or record data.

Our public web pages (setup guide, pricing, support, privacy, terms, refund) set no cookies and use no analytics or tracking. Our hosting provider may record technical data such as visitor IP addresses at its network edge for security and operations, under its own policies.

6. How we use it

Only to provide and support the Service: to run audits, produce reports and fix plans, apply the catalog fixes you enable, compare results over time, bill your subscription, answer support requests, and keep the Service secure. We use the anonymized usage-shape summary described in section 5 for product improvement and for future benchmarks. Product improvement means understanding which setups are common so we can make the audit more useful, including the internal review we do of those summaries. Future benchmarks means a comparison range in a report, shown only when the rules in section 5 are met. We do not sell these summaries, we do not use them to train a model, and we do not send them to our AI provider. If a report includes a comparison sentence, the draft of the surrounding narrative may include that finished sentence and not the underlying summaries. We use the anonymized survey counts in section 5 for product improvement and for future benchmarks. We do not sell those counts, we do not use them to train a model, and we do not send them to our AI provider. A comparison with other portals is not included in a report while that comparison is off. We do not sell personal information, share it for cross-context behavioral advertising, or use it for advertising. We do not use your data to train AI models, and we do not permit our AI provider to.

Right after you install Portal Audit, we show a confirmation page. There you confirm your industry, company size and website, and you choose whether to allow research. The research box is unticked until you tick it. Its label reads: "Let Portal Audit read my public website and public sources about my company."

A second box, also unticked until you tick it, reads: "Let Portal Audit look up public job titles for the org chart." That choice is per portal and off by default. Ticking the website box does not tick it. "Continue without tailoring" leaves it off.

Parts of each report (the written summary, strengths and weaknesses, priorities) are drafted with the help of AI.

8. Who we share data with

We share data only with service providers that help us run the Service, and only as far as they need it:

ProviderPurposeDataLocation
Railway Corporation (railway.com)Hosts the app, its database and report filesEverything listed in section 5 except card and bank detailsUnited States (us-east4 region)
xAI (Grok)Drafting the report narrative, when AI is usedRedacted, aggregated material only (section 7)xAI's infrastructure, under xAI's terms
Google Workspace (email for jon@thejonmartin.com)Support email, notices and sending you your reportsYour messages, billing notices and the reports we send youGoogle's infrastructure, under Google Workspace terms
Resend (resend.com)Emailing the audit report to the HubSpot user who installed the appThat person's email address and the report attached to that emailUnder Resend's terms
Paddle (Paddle.com Market Limited, and the Paddle company that sells the order; paddle.com)Merchant of record and reseller: checkout, payment, invoices, subscription renewal, and tax, including VATBilling contact name and email, business name, billing country and address where Paddle collects them, the plan, and payment status. Card and bank numbers stay with Paddle. We do not receive them.Independent controller of that payment data. Privacy notice: paddle.com/legal/privacy. Buyer support: paddle.net

By installing Portal Audit or subscribing, you give us express permission to share your data with the providers listed above, for the purposes listed above. We will update this list before adding a provider.

We may also disclose data when the law requires it. If the Service is transferred to another operator, this policy will continue to apply to the data that was collected under it.

9. Where data is stored

The data we host is stored in the United States. If you or your organization are in the European Economic Area or the United Kingdom, using the Service transfers that data to the United States. The companies that receive it are listed in section 8. Email jon@thejonmartin.com if you want to know how a particular transfer is protected.

10. How long we keep data

11. Security

No system is perfectly secure. If a breach affects your data, we will tell you without undue delay.

12. Your choices

13. Children

The Service is a business tool for people 18 and older. It is not directed at children, and we do not knowingly collect children's personal information.

14. Changes to this policy

We will post changes on this page and update the date above. For material changes we will email the contact on file at least 30 days before they take effect.

15. Contact

Jon Martin, sole proprietor trading as TheJonMartin, 819 E. Orange St., Lancaster, PA 17602, United States. Email: jon@thejonmartin.com. We are reachable by email only.

For payment data Paddle holds, contact Paddle at paddle.net.

16. People in the European Economic Area and the United Kingdom

This section applies when the organization, or a person whose personal data we process, is in the European Economic Area or the United Kingdom. It adds to the rest of this policy. It does not change what the app actually reads or stores.

Who is responsible

Why we use it

We do not use this data for advertising, and we do not sell it.

Your rights

Where the law gives them, you can ask us to:

Email jon@thejonmartin.com. We aim to reply within 30 days. We may need to confirm that the request comes from the HubSpot account or from the person named in a report. For data we process on an organization's behalf, we may refer the request to that organization. For card, bank, invoice, and tax data, contact Paddle at paddle.net, because Paddle holds that data and we do not.

You can also complain to a data protection authority. In the United Kingdom that is the Information Commissioner's Office. In the European Economic Area it is the authority in your country. You can complain to us first if you want to.

Where it goes

Section 9 describes the transfer to the United States. We have not appointed a representative in the European Economic Area or the United Kingdom. Use the address and email in this section to reach us.