Information Security Policy

Effective: May 21, 2026 · Last reviewed: June 3, 2026 · Owner: Cameron Betz (cameron@rinserightservices.com) · Reviewed annually at minimum.

This policy is approved by the business owner and is the authoritative reference for all information-security practices in RinseRight. Sections below address each domain of the program; URL fragments (e.g. /security#mfa) link straight to a given section for vendor questionnaires.

1. Scope and objectives

RinseRight is a single-operator residential and commercial exterior-cleaning business in Idaho. This policy applies to:

Objectives:

2. Accountability

The business owner (Cameron Betz) is the executive sponsor and the operational owner of this policy. All security decisions, exception approvals, and policy updates are signed off by the owner. Contact: cameron@rinserightservices.com.

3. Access control policy

RinseRight enforces role-based access control (RBAC) in the application layer combined with the principle of least privilege. Each user account is bound to exactly one of three roles:

Additional fine-grained permissions (overrides on a per-user basis) are stored as a JSON array on the User record (permissions column) and checked at every server route via requirePermission(). ADMIN implicitly satisfies all permission keys.

New-user provisioning: the owner invites a new user with one of the three roles. Until they verify the invitation, their status is PENDING_ACTIVATION and they cannot log in. Access changes require an admin to edit the User record from the Team page.

4. Multi-factor authentication standard

MFA is mandatory for all users with ADMIN role and is enforced before any admin-gated route — including the Plaid Link integration and bank-feed inbox — becomes reachable.

Approved MFA methods:

Both methods exceed the minimum “robust MFA” definition used by our payments and banking processors (Plaid, Stripe), which expressly recognizes TOTP and per-session codes as robust forms.

External account hardening: the RinseRightFly.io account, Plaid dashboard, Stripe dashboard, and GitHub repository all enforce MFA on the owner's account. Recovery codes for each are stored in a password manager on a hardware-encrypted device.

5. Identity and access management

At single-operator scale, RinseRight does not subscribe to a third-party identity provider (Okta, Auth0, JumpCloud, etc.). The CRM provides a centralized identity and access-management surface through the following components:

If RinseRight grows beyond ~5 users with production access, the policy review process will re-evaluate the adoption of a hosted IAM provider with SAML/OIDC support. Trigger condition: any addition of staff requiring long-term production-data access beyond the current owner-led model.

6. Zero-trust posture

RinseRight operates under the core principles of zero trust: no implicit trust based on network location, continuous verification of identity, and minimum-privilege access. The architecture implements these principles as follows:

7. De-provisioning

When a user's engagement with RinseRight ends or changes, access is revoked or adjusted automatically via the following enforced mechanism:

Offboarding checklist:

  1. Set CRM User.status = DISABLED from the Team page.
  2. Reset their 2FA, forcing re-enrollment if they ever return.
  3. Revoke any external-service access (GitHub collaborator, Fly.io member, Google Workspace if applicable).
  4. Confirm in the audit log that no sessions remain active.

8. Periodic access reviews

RinseRight conducts an access review at minimum annually, with an additional review triggered any time a team member's role or engagement status changes.

Review procedure:

  1. Open /team and confirm every User row is either the active owner or an active, currently-engaged employee/contractor.
  2. For each active user, confirm the role and any fine-grained permission overrides match their current responsibilities.
  3. Check /admin/audit for unexpected admin actions in the past 12 months (e.g. permission changes, user re-activations, password resets initiated outside a documented support flow).
  4. Confirm all admin accounts have 2FA enabled (visible from the Team page).
  5. Verify trusted-device counts; force-clear any device entries on an admin account if the device might no longer be in the owner's possession.
  6. Re-confirm external accounts (Fly.io, Plaid, GitHub, Stripe) only list intended members and that recovery email addresses are current.
  7. Document the review date and findings in this policy file's “Last reviewed” header.

9. Vulnerability management and patching SLA

RinseRight runs automated dependency vulnerability scanning continuously and patches identified vulnerabilities according to the following Service Level Agreement, measured from the moment a CVE is published or a vulnerability is otherwise disclosed to us:

SeverityPatching SLAAction
Critical (CVSS ≥ 9.0)Within 7 daysOut-of-band patch + deploy
High (7.0 ≤ CVSS < 9.0)Within 30 daysScheduled patch + deploy
Medium (4.0 ≤ CVSS < 7.0)Within 90 daysNext routine dependency refresh
Low (CVSS < 4.0)Best effortBundled with next major dependency upgrade

Scanning and detection:

10. Encryption

11. Incident response

Reporting: Anyone who notices or suspects a security incident should report to cameron@rinserightservices.com immediately.

Containment procedure:

  1. Set affected User.status to DISABLED to immediately invalidate sessions.
  2. Rotate Fly secrets associated with the compromised path (AUTH_SECRET, third-party API keys).
  3. For a compromised bank connection, click Disconnect on /admin/taxes/banks (revokes Plaid access token and deletes BankAccount + BankTransaction rows).
  4. For a compromised GBP connection, click Disconnect on /admin/reviews.
  5. Review the audit log for the affected user / time window to characterize impact.
  6. Notify affected customers and applicable regulators within timeframes required by law.

12. Policy review

This policy is reviewed at least annually. Material changes are reflected in the “Last reviewed” date at the top of this page and noted in the version-control history of the application repository. Out-of-cycle reviews are triggered by:

See also: Privacy Policy, Data Retention and Disposal Policy, SMS Terms & Conditions.