Access model
The initial OAuth grant requests only owner and meeting-link read access. When HubSpot conditional meeting access is enabled, Pro meeting automation uses a separate same-app authorization for crm.objects.contacts.read and crm.objects.contacts.write because HubSpot's official Meetings API specification maps meeting search and update to those scopes. BookableCheck never calls a Contacts endpoint or retrieves contact records. It writes only the confirmed CRM owner and internal attendee-owner fields. If an admin also confirms a replacement event, invite content and associated contact IDs are read transiently and sent to HubSpot without being persisted or logged.
BookableCheck exposes this feature only when the required conditional scopes are available, separately authorized, and enabled for the portal.
Detailed in-app endpoints require the exact HubSpot integration-management permission from a signed request context. Users without it receive only an aggregate summary.
Data minimization
- Free scans retain counts, status, and timestamp—not names or scheduling-page details.
- Pro stores only the owner, page, finding, replacement, and workflow fields needed for remediation.
- For the Pro meeting feature when it is enabled and the required conditional scopes are separately authorized, future-meeting data is limited to ID, owner, times, outcome, replacement-event status and ID, and a portal-level HubSpot Meetings navigation link. Replacement invite content, internal attendee-owner IDs, and contact associations are transient.
- Meeting titles, attendee details, descriptions, notes, locations, and contact associations are discarded and must not be logged.
- Alert emails contain portal-level counts and an app link, not identifying finding data.
Infrastructure and subprocessors
The production service uses Cloudflare Workers, D1, and Queues for application hosting and data processing; HubSpot for authorization and source records; Stripe for subscription billing; and SendGrid for transactional alerts. See the Privacy Notice for their roles.
Deletion and recovery history
Confirmed uninstall disables scheduled work immediately and removes operational records from active systems within 24 hours. Cloudflare D1 Time Travel may hold recoverable encrypted database states for up to 30 days on Workers Paid. Minimal Stripe-linked billing records follow a separate accounting and subscription retention policy. Records still needed for open findings or cases may remain while the portal is installed and entitled.
Security posture
These controls describe the current service architecture and operating practices. They reduce risk but do not eliminate it, and this page is not a certification or guarantee. We review the controls as the service and its dependencies change.
Report a vulnerability
Email support@bookablecheck.com with “Security” in the subject. Include reproduction steps and impact, but do not include real OAuth tokens, customer data, or destructive proof-of-concept activity. Security reports are reviewed separately from ordinary support requests. BookableCheck does not offer a guaranteed security-response time.