Billing
Each line Ostra assigns you is its own monthly subscription, charged the day it is assigned and renewing on that day each month, plus the calls your lines receive, by the minute. You add and manage your card on Stripe’s own pages, so no card number ever reaches Ostra.
Prices
| Item | Unit | Price |
|---|---|---|
| A line | Per line, per month, from the day it is assigned, charged up front | $199 |
| Calls received | Per minute, each call rounded up to the next whole minute | 5 cents |
| Setup | Per line | None |
| Data through your lines | In and out, on every line | Included |
| Texts | Every text to your lines | Included |
| A new carrier IP | Within the limits | Included |
Prices are before sales tax, which is added where it applies. GET /v1/billing carries the price sheet in force (price_sheet), with each amount in cents as a string, as Stripe writes it.
How billing starts
- Ostra verifies your organization and you accept the acceptable use policy in force.
- An admin opens Billing in the dashboard and adds a card. The browser goes to Stripe Checkout, which saves the card and the billing address. Nothing is charged.
- Stripe tells Ostra, usually within seconds, and the dashboard shows the card on file.
- A person in your organization agrees to the renewal terms in force, with an order or on their own, word for word as
GET /v1/orders/renewal-termsgives them: each line renews every month until you cancel it. - When Ostra assigns you a line, its own subscription starts that moment and its first month is charged to the card. If the card is refused, the line is not assigned and nothing is charged. Each line renews on the day it was assigned, so your lines can renew on different days.
Adding a card refuses, in this order: 503 billing_unavailable while billing is switched off, 403 forbidden for anyone but an admin, 409 organization_not_verified before verification, 409 aup_not_accepted before the policy is accepted, 409 price_pending while Ostra’s price sheet is not set, and 409 conflict while a card is already on file (change it in the card portal). After those, too many in an hour is 429 rate_limited; then a Checkout still open is offered again rather than a second one; then a price Stripe holds that differs from the sheet is 409 price_pending.
Card and invoices opens Stripe’s Customer Portal (POST /v1/billing/portal, an admin), for the card, a business’s tax id and the invoices.
Cancelling a line
You can end a line at any time from Billing in the dashboard (POST /v1/lines/{line_id}/cancel, an admin, a signed-in session only, with a sign-in or a second step from the last 10 minutes, or the answer is 403 recent_sign_in_required). Your number is deleted when you cancel. Move any accounts that use it first.
- The line ends at once: its proxy credentials stop, texts and calls to its number stop arriving, and it sends
line.unassigned. - Its subscription ends at once. The rest of its month is not refunded.
- Its number is released to the carrier after the line ends, and never given to another Ostra customer. It cannot be brought back.
Calls
A call is counted from when Ostra answers it until it ends, and rounded up to the next whole minute, call by call: a call of 61 seconds is 2 minutes, and two calls of 30 seconds are 2 minutes. Calls that are answered, missed or sent to voicemail are billed, since Ostra answered them; a call Ostra refused unanswered, or one of 0 seconds, is not. Every 15 minutes Ostra reports the minutes of the calls that ended to Stripe, from its own record of calls. Calls are one subscription for your organization, not one per line, invoiced each month, and GET /v1/billing shows the calls and minutes so far in its period. Each report is stored before it is sent and resent with the same identifier after a lost answer, so nothing is counted twice.
A failed payment
- A failed payment for a line starts a grace period on that line. Your other lines are not affected. Billing in the dashboard shows when it ends.
- If Stripe still says the invoice is unpaid when it ends, that line is suspended: its proxy credentials stop, its app devices are cut off, the API answers
409 line_suspendedon changes, and it sendsline.suspended. Reads still work, and the line keeps its number. An unpaid calls invoice suspends every line. - Paying again does not lift it by itself. Once Stripe says it is paid and the overdue invoice settled, a person at Ostra restores access, and the line sends
line.unsuspended. A person decides because a card payment can still be reversed or disputed, and access should not switch on and off with each attempt.
Renewal
Before each line renews, Ostra sends line.renewal_upcoming for that line, with its own renews_at and held_since.
Billing is managed from the dashboard only: GET /v1/billing, adding a card, the portal and cancelling a line take a signed-in session, never a key (the routes).