Encryption in transit & at rest
All traffic to WheelsUp is served over HTTPS/TLS. Your account and plan data are encrypted at rest on the hosting platform's storage.
Password handling
Passwords are hashed server-side with PBKDF2-HMAC-SHA256 and a unique per-user salt before storage. We never store or log plaintext passwords, and we cannot see them. Password changes and resets invalidate existing sessions on your other devices.
When you choose a password we check its strength and screen it against known public data breaches, so a password that attackers already have on a list can't be used here. That check never transmits your password — we send only the first five characters of its hash and compare the results locally. See Service providers in our Privacy Policy for details.
Two-factor authentication
You can turn on two-factor authentication from your account settings. It uses a standard authenticator app (TOTP, RFC 6238) — Google Authenticator, 1Password, Authy, or your password manager — and we never send authentication codes by SMS, which is the weakest of the common methods.
The secret your app is set up with is encrypted before it is stored, under a key held separately from the database, so a copy of the database alone cannot be used to generate your codes. Each code can be used once: a code that has already signed you in is refused for the rest of the period it would otherwise be valid.
Turning two-factor authentication on gives you ten single-use recovery codes for the day you lose your phone. They are shown once and stored only as hashes, so we cannot recover them for you — keep them somewhere safe. Turning the feature off again requires both your password and a current code, and resetting your password does not bypass it.
Account isolation
Every data request is scoped to your authenticated account at the query layer, so one user can never read or modify another's data. Sessions are signed and can be revoked.
Payments
Payments are processed by Stripe. We never see or store your full card number. Your access level is set only by Stripe's signature-verified confirmation — it can't be forged from the browser.
Abuse & bot protection
- Rate limiting on sign-up, login, and password-reset to slow brute-force and abuse.
- A bot challenge (CAPTCHA) on account creation and password reset.
- Email verification required before an account can be used.
- Administrative actions on accounts are recorded in an audit log.
Your data, your control
You can export your data or delete your account at any time from your account settings — no support ticket, no waiting on us.
The export is a single JSON file containing your account record, your complete plan data, your billing record, and the analytics and error events still linked to your account. Deleting removes your account, plan data, and billing record from the live database immediately; encrypted backups still hold a copy for up to 30 days before they age out (see Backups). See the Privacy Policy for the full picture.
Backups
A consistent snapshot of the database is taken daily, compressed, and stored encrypted at rest in Cloudflare R2 — deliberately a different provider from the one hosting the app, so a single provider's bad day can't take both the service and its backups. We keep about 30 days of snapshots and automatically delete older ones.
The job that moves a backup off the host runs on GitHub's build infrastructure, which means a copy of the encrypted database passes through it in transit. Backups are used only to restore the service — never to look up an individual account. Because a snapshot is a point-in-time copy, data from a deleted account persists in backups until those snapshots age out, up to 30 days.
Third-party code
The app runs no third-party analytics, advertising, or tracking scripts. Our webfonts are served from our own origin rather than a font CDN, so opening a page doesn't disclose your IP address to a third party. The only external code we load is Cloudflare's anti-bot widget on sign-up and password reset, and payment pages hosted by Stripe — both of which have to run on their own infrastructure to do their job.
Data minimization
We don't ask for your SSN, DoD login credentials, or other sensitive government identifiers, and you shouldn't enter them. We collect only what's needed to run your plan.
Report a vulnerability
Responsible disclosure is welcome. If you believe you've found a security vulnerability, contact us → with the details and please give us a reasonable chance to fix it before public disclosure.