V1.1 ships the next chunk of the roadmap: multi-currency invoices, separate pay and billing rates, custom fields on timesheets, and a pile of fixes around dates and permissions.
Multi-currency invoices
If you bill a client in USD but pay a contractor in INR, you no longer have to do the conversion in your head (or in a spreadsheet you forget about). Saturn now captures exchange rates at the moment an invoice is created and stores them with the invoice, so the numbers stay reproducible months later.
- Invoices record the exchange rates used for every line item.
- A new "Rate breakdown" view shows which billing rates were applied, and a "Captured rates" view shows the conversion snapshots.
- Once an invoice has a line item, its currency is locked so you cannot accidentally mix things up halfway through.
- Timesheet reports and totals now render in the project's configured currency.
Separate pay and billing rates per member
Until now a member had one rate and that rate did double duty. That made it awkward if you pay a contractor one number and bill the client another.
You can now set a pay rate and a billing rate on each member, independently, each with its own currency and frequency. If you only set a pay rate, billing falls back to it, so nothing changes for existing setups.
Timezones, finally done properly
Dates in Saturn used to be stored as UTC midnight timestamps, which meant a date you picked could render a day early for anyone west of UTC. We have moved every user-picked date (invoice dates, due dates, timesheet entries, expense dates, rate effective-from dates, and so on) to proper zoneless date columns, and we now store each user's timezone so formatting is consistent whether it happens on the server or in the browser.
If you ever saw an invoice dated "Jan 14" show up as "Jan 13" for your client, that is fixed.
Custom fields on timesheet entries
Owners and admins can now define extra fields on timesheet entries. This is the one a lot of you asked for: storing a PR number, a ticket ID, a URL, or whatever else gives a time entry its context. When extra fields exist, the quick-log flow routes through a proper create page so you can fill them in.
Recurring expenses
You can mark an expense as recurring, and it will show up automatically when you create the next invoice. Good for retainers, subscriptions you re-bill, and any cost that just keeps coming back every month.
Attachments on expenses
Expenses now accept file attachments, so receipts live with the expense itself instead of in a folder somewhere you will never find again.
Member invoices
Invoices can now be issued to a member, not just a client. This is the groundwork for paying contractors out of the same system you use to bill clients. You can create a member invoice straight from a timesheet report, and the approve / dispute flow works the same way it does for clients.
Smaller things that add up
- Time entry units in the invoice editor. Switch a line between hours and minutes without leaving the invoice. The default can be set per organization or per project.
- Default invoice "to" and "from". Set these once in org settings and every new invoice autofills them.
- Invoice numbers are unique per project, not globally. You can finally use "INV-001" across more than one project.
- Google OAuth on sign-in and sign-up.
- Email verification is now required before you reach the dashboard. Spam accounts were getting noisy.
- Settings got a real layout. The settings page is split into tabbed subsections (billing, invoice numbering, timesheet defaults, client approval, workspace, project), and member rates now support more precision.
License change: MIT to AGPL
Saturn is now AGPL-licensed. The code is still open, you can still read it, fork it, run it, and contribute to it. What you cannot do is take it, rebrand it, wrap a paywall around it, and sell it as your own without giving the same freedoms back. MIT made that too easy.
What's next
Recurring invoices, and a proper test suite so new features stop breaking old ones. Track progress on GitHub.