Plans and limits¶
The hosted SimpleOTA service ships with three plans.
| Feature | Free | Maker | Pro |
|---|---|---|---|
| Monthly price | $0 | $12 | $39 |
| Active devices | 5 | 50 | 500 |
| Firmware uploads / month | 10 | 100 | 500 |
| Storage | 1 GiB | 5 GiB | 50 GiB |
| Email support | No | ✅ | ✅ |
Need more than 500 devices? Contact us for custom limits, storage, and SLA.
Counters¶
- Active devices = devices in your projects with
active = true. Aggregated across all projects you own. - Artifacts this month = artifacts uploaded in the current calendar month (UTC). The window resets at 00:00 UTC on the 1st of every month, the same boundary for every user regardless of plan or Stripe billing cycle.
The dashboard shows usage bars on the Billing page.
What happens when I hit a cap?¶
| Cap | Behavior |
|---|---|
| Device cap (auto-register) | New device sees 200 + reason: over_limit. No row created. |
| Device cap (manual create) | API returns 400 over_device_limit. |
| Artifact cap | API returns 400 over_artifact_limit. Upload form blocks. |
Downgrade behavior¶
Switching from Pro → Maker → Free deactivates devices to fit the new cap, oldest-active-wins:
- Order all your active devices by
created_atascending. - Keep the oldest N as
active = true, where N is the new cap. - The rest flip to
active = false.
Devices that go inactive are not deleted. Upgrading later (or going into the dashboard and toggling them) reactivates them. The deactivation is recorded in the audit log.
Cancellation¶
Clicking Cancel sets cancel_at_period_end = true in Stripe. You
keep paid features until the period ends; on customer.subscription.deleted
the user falls back to Free and the downgrade behavior above runs.