This Privacy Policy explains how Spooled Cloud collects, uses, stores, and protects your information when you use our job queue and background job services (the "Service"). Spooled Cloud is operated by YS Progress Inc., a corporation registered in Ontario, Canada ("we", "our", or "us"). We are committed to protecting your privacy and handling your data responsibly.
1. Information We Collect
The categories below describe data the Service actually stores or processes. We do not use password authentication; accounts use email one-time codes and API keys.
Account information
When you create or manage an organization, we store:
| Data | Purpose |
|---|---|
| Email address (billing email) | Account login codes, notifications, billing contact, and support |
| Organization name and slug | Tenant identity and dashboard/API routing |
| Plan tier and optional custom limits | Enforce plan quotas and retention |
| Organization settings (JSON) | Product configuration for your tenant (for example webhook tokens) |
Authentication (no passwords): We do not collect or store account passwords. Sign-in uses a short-lived email one-time code (OTP). API access uses API keys that we store only as bcrypt hashes (the raw key is shown once at creation). After a successful login we issue JWT access and refresh tokens for the dashboard session.
Billing information
| Data | Where it lives |
|---|---|
| Payment method and card details | Processed and stored by Stripe; we do not store full card numbers |
| Billing address and tax details | Collected and stored by Stripe as required for invoicing |
| Stripe customer and subscription IDs, status, period end | Stored on your organization record to sync plan status |
| Transaction and invoice history | Maintained by Stripe for paid accounts |
Job and queue data
When you use the Service to process jobs, we store:
| Data | Notes |
|---|---|
| Job payloads and results | Stored as plain JSONB in PostgreSQL (not encrypted at the application layer) |
| Job metadata | Status, timestamps, retry counts, queue name, priority, errors, worker lease fields |
| Idempotency keys | Used to prevent duplicate processing within an organization |
| Webhook / delivery payloads | Inbound or outgoing webhook delivery records as plain JSONB |
| Dead-letter records | Including a copy of the original payload for failed jobs that enter the DLQ |
| Schedules, workflows, queue config, workers | Configuration and operational state for your queues |
Job payloads are stored in PostgreSQL on infrastructure we operate. They are not encrypted at rest by the application; protect sensitive content in payloads yourself (for example by encrypting before enqueue) if required by your threat model.
Operational and security data
| Data | How it is used |
|---|---|
| Application and error logs | Debugging, security investigation, and service reliability (structured logging / tracing) |
| Performance metrics | Aggregated latency, throughput, job and worker counters (Prometheus-style operational metrics) |
| IP addresses (limited) | Used for rate limiting on sensitive auth endpoints; for some email-check requests the client IP is written into a short-lived rate-limit marker row |
| User-Agent (ephemeral) | May be hashed in-memory as a rate-limit fallback when no API key or IP is available; not stored as a dedicated profile field |
| Email login codes | 6-digit OTP values with expiry and attempt counters for passwordless login |
We do not maintain a general-purpose “API access log” table of every request with a fixed multi-month retention window in the application database. Edge providers (for example Cloudflare) may process connection metadata as part of network protection.
2. How We Use Information
We use the information we collect to:
- Provide the Service: Process jobs, manage queues, deliver webhooks, and provide real-time updates
- Authenticate users and API clients: Email OTP, JWT sessions, and API-key verification
- Process payments: Manage subscriptions and billing via Stripe
- Maintain security: Rate limiting, abuse prevention, and operational monitoring
- Improve reliability: Metrics and logs used to operate and debug the Service
- Communicate: Service announcements, security alerts, and support replies
- Comply with law: Meet legal obligations and respond to lawful requests
3. Data Sharing
We do not sell your personal information. We share data only in these circumstances:
Service providers
We work with trusted third parties who help us operate the Service:
| Provider | Role | Typical data involved |
|---|---|---|
| Cloudflare | Network, TLS termination, DDoS protection, CDN, and website hosting | Connection metadata, website traffic |
| Stripe | Payment processing for paid plans | Billing contact, payment method, invoices |
| Transactional email provider | Delivery of login codes and service email (provider configurable: e.g. Resend, SendGrid, Postmark, or SMTP) | Email address and message content |
These providers are expected to use data only to provide their services to us. We operate our own application, PostgreSQL, and Redis infrastructure rather than a managed cloud database product.
Legal requirements
We may disclose information when required by:
- Valid court orders or subpoenas
- Law enforcement requests (with proper legal process)
- Government regulatory requirements
We will notify you of such requests unless legally prohibited from doing so.
Business transfers
In the event of a merger, acquisition, or sale of assets, your information may be transferred. We will notify you and provide options before your data is transferred to a new entity.
4. Data Retention
Retention depends on the data type and, for job data, your plan. Where the application does not implement an automatic purge, data can remain until you or an administrator delete it.
Job data by plan
Automatic cleanup deletes completed and cancelled jobs
after the plan’s job retention window. It does not automatically purge
failed or dead-letter jobs on that schedule (unless a job has an explicit
expires_at that has passed, or you call the dead-letter purge API).
| Plan | Completed / cancelled jobs | Job history / webhook deliveries |
|---|---|---|
| Free | 3 days | 1 day |
| Starter | 14 days | 7 days |
| Pro | 30 days | 30 days |
| Enterprise | 90 days | 90 days |
Workflows in completed, failed, or cancelled status are cleaned on the same job-retention windows. Custom per-organization limit overrides may change these windows when configured.
The second column is applied by a per-organization retention sweep, which deletes job history and outgoing webhook delivery records once they are older than that window. Independently of retention, only the most recent 100 deliveries per webhook are readable through the API.
Other data
| Data type | Retention |
|---|---|
| Failed / dead-letter jobs and DLQ original payloads |
Not removed by the timed completed/cancelled cleanup. Removed when you purge the
dead-letter queue, when a job’s expires_at has passed (for eligible
statuses), or when the organization is hard-deleted
|
| Account / organization records | Kept while the account is active. Self-service organization deletion permanently deletes the organization and cascaded related data immediately (subject to pre-delete checks for active jobs, workers, and schedules). Admin soft-delete marks the plan as deleted and revokes API keys but leaves rows in place until an admin hard-delete is performed; there is no automatic “delete after 30 days” job |
| Email one-time login codes | Valid for a short window (about 10 minutes) for authentication, with attempt limits. Once expired, the code records are deleted by the same per-organization retention sweep described above, on the plan’s history-retention window |
| API key material | Bcrypt hashes stored until the key is revoked/deleted or the organization is hard-deleted |
| Billing records (Stripe) | Retained by Stripe under their policies and applicable financial record rules |
| Application logs and metrics | Operational retention; not a fixed multi-year legal archive defined in application code |
You can request earlier deletion of personal data by contacting us at privacy@spooled.cloud.
5. Data Security
We implement the following measures reflected in the product:
- Encryption in transit: TLS for API traffic (REST, gRPC, WebSocket), typically terminated at the Cloudflare edge in production
- No application-layer encryption at rest for job payloads: payloads and results are plain JSONB in PostgreSQL
- Access controls: organization-scoped API keys with optional per-queue least-privilege scoping
- Key management: API keys hashed with bcrypt before storage
- Data isolation: queries scoped to your organization
- Monitoring: operational metrics, logging, and alerting
For more details, see our Security page.
6. Your Rights
Depending on your location, you may have the right to:
- Access: Request a copy of your personal data
- Correction: Request correction of inaccurate data
- Deletion: Request deletion of your data (subject to legal retention requirements and technical deletion paths described above)
- Export: Receive job and account data available through our API
- Objection: Object to certain processing activities
- Restriction: Request limitation of processing in certain circumstances
- Withdraw consent: Where processing is based on consent (for example optional marketing analytics cookies)
To exercise these rights, contact us at privacy@spooled.cloud. We will respond within 30 days.
7. Cookies and Tracking
We use two categories of cookies and similar technologies:
- Essential cookies: Authentication (keeping you logged into the dashboard), session state, and security. These are strictly necessary for the Service to function and cannot be disabled.
- Analytics cookies (optional): Google Analytics 4 and Meta Pixel on this marketing website, used to understand how the site is used. Choosing "Essential only" in the consent prompt stops them and is remembered on this browser; you can clear your site data at any time to be asked again.
When analytics runs. On this marketing site, analytics starts on page load and continues until you decline — it does not wait for you to accept. Declining stops collection and prevents it from starting on later visits. If your browser sends a Global Privacy Control signal, we treat that as a decline and never start analytics, with no prompt shown. The Spooled dashboard and API carry no analytics or marketing tags at all.
We do not sell personal information. The analytics described here apply to this marketing site only, and are not a substitute for authenticated product telemetry.
8. Sub-processors and Data Transfers
We operate our own application, database (PostgreSQL), and queue (Redis) infrastructure. A small number of third-party sub-processors help us run the service, and your data may be processed in the regions where they operate:
| Sub-processor | Purpose |
|---|---|
| Cloudflare | Network, TLS, DDoS protection, CDN, and website hosting |
| Stripe | Payment processing for paid plans (billing data) |
| Transactional email provider | Login codes and transactional email (email address and message content) |
9. GDPR Compliance (For EU Users)
For users in the European Economic Area:
- Legal bases: We process data based on contract performance, legitimate interests, and consent
- Data controller: YS Progress Inc. (Ontario, Canada) is the data controller for account data
- Data processor: We act as a data processor for job payloads you submit
- Contact: For GDPR requests, email privacy@spooled.cloud
- Supervisory authority: You have the right to lodge a complaint with your local data protection authority
10. CCPA Compliance (For California Users)
For California residents:
- Right to know: You can request what personal information we collect and how we use it
- Right to delete: You can request deletion of your personal information
- Right to opt-out: We do not sell personal information
- Non-discrimination: We will not discriminate against you for exercising your rights
11. PIPEDA (Canada)
YS Progress Inc. is an Ontario corporation, so our handling of personal information is subject to Canada's Personal Information Protection and Electronic Documents Act (PIPEDA):
- Consent: We collect personal information only for the purposes described in this policy, and you may withdraw consent by closing your account
- Access: You can request the personal information we hold about you and ask for corrections
- Cross-border storage: Data may be stored or processed outside Canada by the sub-processors listed above, where it is subject to the laws of those jurisdictions
- Complaints: Write to privacy@spooled.cloud. You may also complain to the Office of the Privacy Commissioner of Canada
12. Children's Privacy
The Service is not intended for children under 16. We do not knowingly collect personal information from children under 16. If you believe we have collected information from a child, please contact us at privacy@spooled.cloud.
13. Changes to This Policy
We may update this Privacy Policy periodically. We will notify you of material changes via:
- Email to your registered address
- Notice in the dashboard
- Update to the "Last updated" date
Continued use of the Service after changes constitutes acceptance of the updated policy.
14. Contact Us
For privacy and security-related inquiries:
Email: privacy@spooled.cloud
We aim to respond to all privacy inquiries within 30 days.