Account & support

Account & Billing

6 min read

Lunadeck has two self-serve plans at launch — Hobby (free) and Starter ($19/mo or $190/yr). Higher tiers (Team, Business, Enterprise) exist in the matrix but route through a contact form for v1.0; the self-serve checkout and customer portal cover everything most builders need.

Plans

HobbyStarter
PriceFree$19 / month or $190 / year ($16/mo equivalent — 17% discount)
Build credits per month60600
AI credits per month50500
Projects15
BYO keystores (Certificate Vault)0 — managed debug keystore only5
Max source archive100 MB250 MB
Build timeout10 minutes30 minutes
Artifact retention7 days30 days
Concurrent builds11
Watermarked APKYesNo
Play Store-publishable signingNo (shared debug cert)Yes (your own keystore)

Numbers in this table are the values the gating code enforces today (see api/internal/billing/tiers.go if you want to audit). If the landing pricing page disagrees with this table, treat the landing page as the source of truth and please tell us so we can update.

Need more?

Team / Business / Enterprise are tracked in the same backend matrix and will become self-serve as we grow. Until then, contact us and we'll set you up manually with the right limits and an invoice.

How credits work

A build credit buys you one minute (rounded up) of build time. A 22-second build costs 1 credit. A 4-minute-30-second build costs 5. Your credit balance pays for the actual elapsed time on our build worker — not the number of builds, not the size of your APK.

AI credits are a separate bucket that pays for AI Check runs (the 6-check fan-out on every upload). Both buckets refill on the same monthly cadence.

What consumes a credit

  • Successful builds charge ceil(elapsed_seconds / 60) credits, minimum 1.
  • Failed builds caused by your code (BUILD_FAILED, NO_APK, ICON_DOWNLOAD_ERROR) charge the same way — we ran the worker, your code didn't compile.
  • Failed builds caused by us (SYSTEM_ERROR, WORKER_TIMEOUT, WORKSPACE_ERROR, DOWNLOAD_ERROR, KEYSTORE_DOWNLOAD_ERROR, EXEC_ERROR, UPLOAD_ERROR) refund — you don't pay for our outages.
  • Cancelled builds charge nothing in v1.

See Troubleshooting for what each error code means and how to recover.

When credits reset

Credits reset once per calendar month on the anniversary of your last reset (e.g., if your Starter plan started on the 12th, credits refill on the 12th of every month). Unused credits do not roll over — a fresh allotment lands on reset day regardless of how many were left in the old period.

You'll get an email and an in-app notification when you've burned through 80% of your monthly build credits, so you have time to upgrade before you're blocked. The 80% threshold fires once per period.

When you run out

When you have zero build credits remaining, the next build request returns 402 INSUFFICIENT_CREDITS and the dashboard opens an upgrade prompt. You have two recovery paths:

  1. Upgrade to Starter — checkout completes in under a minute and you'll have 600 credits immediately.
  2. Wait for your monthly reset — see the reset date in Settings > Billing.

There's no per-build "overage" charge; we'd rather you upgrade once than nickel-and-dime a balance you didn't plan for.

Upgrading your plan

The upgrade flow uses Stripe-hosted checkout — you never enter card details on lunadeck.io.

  1. In the dashboard, click Upgrade in the sidebar or from any out-of-credits prompt.
  2. Pick monthly or annual billing in the UpgradeModal.
  3. The button takes you to Stripe Checkout. Enter your card; the checkout session is for $19/mo or $190/yr depending on your choice.
  4. On success, you're redirected back to Settings > Billing. Your plan_tier flips to starter within seconds (we listen on Stripe's customer.subscription.created webhook and refresh your credit balance from there).

If you've already subscribed and try to upgrade again, the API returns ALREADY_SUBSCRIBED and the UpgradeModal points you at the customer portal instead.

Switching between monthly and annual

Open the Stripe customer portal from Settings > Billing > Manage Subscription and swap cadence there. Stripe handles proration automatically.

Cancelling your plan

We use the Stripe-hosted customer portal for cancellation. We do not bury the cancel button.

  1. In the dashboard, go to Settings > Billing > Manage Subscription. This calls POST /v1/billing/portal and redirects you to Stripe's portal.
  2. In the portal, click Cancel plan. Stripe will ask you to confirm.
  3. Your subscription stays active until the end of the current billing period. You keep your 600 credits and your 5-project / 5-keystore limits until the period ends.
  4. At period end, Lunadeck's webhook handler reverts you to Hobby. Your data is preserved — you keep all your projects, builds (within Hobby's 7-day retention from now on), and one keystore slot — but Hobby's signing path is the shared managed-debug keystore, so APKs you build after the revert can't go to the Play Store.

If you only want to pause for a billing cycle, the portal also has "Pause subscription" which leaves you on Starter without rebilling for a chosen number of months.

Refunds

We refund any first-time Starter subscriber on request within 7 days of the first paid invoice, no questions asked. Refunds are processed by us in the Stripe dashboard — there is no self-serve refund button.

To request a refund, email support@lunadeck.io with the email address on your account. We'll process the refund within one business day and reply on the thread.

Outside the 7-day window or for renewals beyond the first invoice, we generally do not refund automatically but we'll talk — write to support@lunadeck.io and tell us what happened.

Failed payments

If a renewal payment fails, your account enters a 7-day grace period (plan_status = past_due). During grace:

  • You keep full Starter access: 600 credits, 5 projects, BYO keystore signing.
  • You'll get emails on day 1, day 4, and day 7 (the 7th is the final warning).
  • Stripe will automatically retry the card.

If the payment is still unrecovered after 7 days, your account auto-reverts to Hobby. Your data stays — you just lose paid-tier limits and start producing watermarked APKs again. Update your card in the customer portal and we'll re-upgrade you on the next successful charge.

Managing notification emails

Two of our transactional emails are user-toggleable in Settings > Notification preferences:

  • Build succeeded — off by default (opt-in). Switch on if you want a green ping every time a build lands.
  • Build failed — on by default (opt-out). Switch off if your build logs already flow to Slack/Discord and the email is noise.

Other transactional emails (credits-warning, billing receipts from Stripe, security and account events) are not user-toggleable.

Reporting an issue

Pricing or billing wrong on this page, the dashboard, or the landing site? Email support@lunadeck.io. We treat billing accuracy as a release-blocker; we'd rather over-fix than have someone make a plan decision against stale numbers.