Billing overview

Deploys.app meters everything you run in real time and bills monthly. Costs roll up from projects to a billing account, which is the entity invoices are issued to.

How pricing works#

Pricing is pay-as-you-go. You’re charged for what your deployments actually used during the billing period — there’s no upfront commitment and no per-deployment monthly minimum. The metered quantities are:

ResourceMetered inAllocated or actual
CPUvCPU-hoursAllocated (the requests.cpu you set)
MemoryGiB-hoursAllocated (the requests.memory you set)
DiskGiB-hoursAllocated (the size you provisioned)
Registry storageGiB-hoursActual stored size
Static site storageGiB-monthsActual stored size of your published static site releases
Dropbox storageGiB-monthsActual stored size of your project’s Dropbox files
EgressGiB transferred outActual bytes leaving the container (destination isn’t tracked)
External route egressGiB transferred outActual bytes served from the edge for an external HTTP route

Sizing your resources.requests matters — that’s the number that hits the invoice for CPU and memory, whether or not the workload uses every cycle.

Where a location provides edge caching, the CDN that fronts your custom domains is included at no extra charge — there’s no separate CDN line item.

Billing accounts#

A billing account is the cost center invoices roll up to. One billing account can own multiple projects (e.g. acme and acme-staging both bill to Acme Billing); a project belongs to exactly one billing account at any moment.

Each account carries:

  • Name — the human label.
  • Entity typeindividual or company (default individual). A company is a juristic person, so its tax invoices and receipts print the branch designation “Head Office (สำนักงานใหญ่)” beside its address, as Thai tax law requires; an individual does not. Set it on the create/edit form or via the type field on billing.create / billing.update.
  • Tax ID / name / address — what appears on invoices.
  • Active — whether new charges can post. Inactive accounts can’t have new resources created against them.

Our own company address (the seller) always shows “Head Office (สำนักงานใหญ่)” on every invoice and receipt.

Manage billing accounts at Billing → Accounts in the console, or via the billing.create, billing.update, billing.list API functions.

An account has one owner and can invite others to help manage it — an admin to co-run the account or an accountant who only pays invoices. See Members & roles for the roles and how to invite or remove people.

Invoices#

At the close of each billing period, the platform issues an invoice for each billing account. Invoices have:

  • A number like INV-2026-0009.
  • A period (periodStart, exclusive periodEnd).
  • Line items — one per resource SKU (CPU, memory, disk, egress).
  • Subtotal, tax (rate + amount), and total in the account’s currency.
  • A statusdraft, open, paid, or void.

Drafts are working-in-progress invoices the platform builds during the period. Once the period closes, the invoice moves to open and stays there until paid (then paid) or voided (void). You’ll see the badge change on the Billing → Invoices page as it progresses.

When an invoice is marked paid, it is also assigned a separate receipt number (receiptNumber) of the form DPLY-RC-YYYYMM-NNNN. This is the receipt / tax-invoice document’s own running number — a gapless sequence that resets each calendar month — and is distinct from the invoice number (number). A paid invoice’s receipt can be downloaded as its own PDF, which carries the receipt number as its document number.

curl https://api.deploys.app/billing.listInvoices \
  -H "Authorization: Bearer $DEPLOYS_TOKEN" \
  -d '{ "id": "ba_…" }'

curl https://api.deploys.app/billing.downloadInvoice \
  -d '{ "id": "inv_…" }'        # returns a URL to the invoice PDF

curl https://api.deploys.app/billing.downloadReceipt \
  -d '{ "id": "inv_…" }'        # paid invoices only; returns the receipt PDF

Paying an invoice#

Invoices are settled by bank transfer. On the Billing → Invoices page, open an open invoice and press Pay: the dialog shows the seller’s bank account and a PromptPay QR (for THB invoices) for the amount due. Transfer the amount, then upload your bank transfer slip as proof. An operator verifies the slip against the payment and marks the invoice paid — at which point it is assigned its receipt number and its receipt / tax-invoice PDF becomes available.

Withholding tax (หัก ณ ที่จ่าย)#

If your billing account is a company (a juristic person), you can withhold 3% tax on the payment, as Thai law requires for service payments. In the Pay dialog, tick Withhold 3% tax:

  • The withheld amount is 3% of the pre-VAT subtotal (the service value, before VAT) — not of the gross total.
  • Transfer the net amount the dialog shows: Total − withholding. For example, a ฿1,070 invoice (฿1,000 subtotal + 7% VAT) withholds ฿30, so you transfer ฿1,040.
  • Optionally attach your withholding tax certificate (หนังสือรับรองการหักภาษี ณ ที่จ่าย, “50 ทวิ”) alongside the slip — or later, from the invoice page’s Attach WHT certificate button (certificates commonly arrive a few days after the transfer).

The invoice is still settled in full — the withheld 3% is remitted to the Revenue Department on the seller’s behalf, so it is a tax credit, not an unpaid balance. The receipt shows the deduction explicitly (Less withholding tax (3%)) and the net amount received. Withholding is a company-only option; individual accounts pay the full total.

Where to watch your costs#

Two places:

  • Project dashboard — a live “allocated price” per deployment, summed across the project. Useful for “did anything just balloon?” checks.
  • Billing report — usage over a date range, broken down by project and resource. The right tool for monthly review and for splitting costs between teams.
TipPausing a deployment stops CPU and memory metering immediately — pause anything you’re not using during a long quiet period (overnight staging, off-hour batch jobs) and resume when you need it.