Repository navigation
v0.8.0
LiteLLM usage for an unknown customer is held instead of lost, and new accounts retry failed payments. Also: Settings → Email with a test send, a dashboard that says what each page is for, and dates that follow the billing timezone. Three database migrations.
Before you upgrade
- Run migrations first, as for any upgrade. This release adds three: 0178 (a column on Stripe credentials), 0179 (a new
usage_held_eventstable) and 0180 (a column on dunning policies). None rewrites existing rows. - New accounts start with a "Default retries" dunning policy; existing accounts do not get one. An account created after the upgrade retries a failed payment on day 3, 7 and 14, then leaves the subscription and invoice alone. An account that had no default policy before the upgrade still retries nothing until you create one; the Dunning pages now say so. (#1155)
- LiteLLM usage for a customer or meter that does not exist yet is held, not dropped. The callback still answers 200, and its response gains a
heldcount. Held rows are listed on the Usage page and atGET /v1/usage-events/held. Create the customer, then release them. Released usage from before the customer's subscription started is stored but not invoiced. (#1151) - Email actions answer 409
email_not_configuredwhenSMTP_HOSTis not set. This covers sending an invoice or credit note, sending a payment-method setup link and inviting a teammate. They used to report "sent" while the queued email failed. Save & send still finalizes the invoice. Password reset is unchanged. - A charge Stripe never answered returns
payment_outcome_unknown, notprovider_error. A decline is stillprovider_error. If you branch on the code, add the new one. - Due dates and trials count calendar days in the billing timezone. "Net N" and
trial_daysadded N×24 hours, so across a daylight-saving change a due date printed one day early and a trial ended an hour late. Dates that do not cross a clock change are the same as before. - A date-only
tofilter now ends at 23:59:59.999999 UTC (was 23:59:59.000), so CSV exports, the invoice list and the audit log include the last second of that day. - Many messages were reworded; codes are unchanged.
attention.messageon an invoice is now up to three short lines, and the longer explanation moved toattention.detail. Subscription, pricing, recipe, webhook and password refusals read plainly. Match onreasonandcode, not on the text. - Set your company name if you have not (Settings → Business details). With none set, PDFs no longer print "Velox" as the seller. That includes already-issued invoices, because a PDF is rendered when it is opened. Totals and lines do not change. (#1093)
What changed
LiteLLM and usage
- Usage for an unknown customer or meter is kept, shown on the Usage page and released once, under its original key. Discard marks rows as never billed, even if LiteLLM resends them. (#1151)
- The Usage page shows each meter's value by its own aggregation, so a Maximum meter no longer adds up its readings. (#1097)
- Export CSV downloads every filtered row from the server (it stopped at 50,000), up to 365 days per file.
GET /v1/exports/usage-events.csvtakescustomer_id,meter_idanddimensions. (#1123)
Dunning and payments
- New accounts retry failed payments from day one with "Default retries". Your first enabled policy takes over as the default. (#1155)
- Charge now on an invoice paid entirely from credit closes its dunning run. (#1061)
- The customer payment page no longer shows a Pay button when Stripe is not connected; it says who to contact. (#1118)
- Stripe key errors say whether Stripe refused the key or could not be reached (
last_verified_error_kind). (#1067)
Billing and dates
- The next-invoice preview prorates like the invoice: a calendar first period, an added item and a quantity change show prorated lines. (#1096)
- Net N due dates and trial ends count calendar days in the billing timezone. New manual invoices store the account's timezone, so their PDFs print local dates. (#1077, #1087, #1081)
- Dashboard charts bucket by UTC day whatever the database server's time zone. (#1070)
- A margin request without dates follows the customer's test clock, and customer usage accepts a full leap year. (#1082, #1088)
- A new trial no longer hides the running cycle's usage. (#1073)
- Draft PDFs carry a DRAFT mark, and no PDF prints "Velox" as the seller when no company name is set. (#1093)
Settings and email
- Settings → Email shows whether this server can send email and sends a test email with the mail server's real answer. API:
GET /v1/settings/emailandPOST /v1/settings/email/test. (#1121) GET /v1/whoamigainssmtp_configured,can_send_invitesandcan_email_setup_links, and the Team tab says when invites are off.
Dashboard
- The customer Margin card shows each model's margin next to its billed amount and cost. API: each row of the margin response's per-model breakdown gains
margin_bps. The demo now bills two models, so it shows two rows. (#1159) - A task-grouped sidebar, one notice per page with wording that matches what billing does, and amounts in each invoice's or customer's own currency. (#1062 to #1067, #1091, #1092)
- A new account's Home explains Velox and opens a "Bill your first customer" checklist, and each page says what it is for. (#1138, #1145)
- Credits on the customer page show granted, used, expired, canceled and deducted amounts. (#1098)
- Margin shows "—" with the missing setup when no provider cost is known, instead of 100%. (#1095)
- Pages fit a 390px phone screen.
Docs
- New pages: a first-invoice tutorial, "How Velox works", "Production on one VM" and a quick-start page for each demo step. The operations runbook is one page per problem.
Every change, with its reasoning: CHANGELOG.