Paste the Web App URL and token from your Apps Script deployment. They are stored only on this device — nothing is committed to the public repo.
Got an invite link? Paste the whole link into the first box and leave the token empty.
Run setup() once in the Apps Script editor, deploy as a Web App (Execute as: Me · Who has access: Anyone), then run showToken().
The fewest transactions that clear every balance. Debts are chained through, so nobody pays a middleman.
Live rates come from open.er-api.com (Frankfurter as backup) and are cached in the ExchangeRates tab for the day. A manual override sticks until you clear it.
An invite link lets someone use the app on their own phone. They see only the projects you pick, and only the expenses they're part of. They can add and edit their own expenses and log their own settlements, but can't change people, rates or projects. Turning a link off takes effect on their next sync.
Every change is saved on this phone first and pushed when Google is reachable, so the app keeps working with no signal. Google services are blocked in some countries — there the queue simply holds until you are back online or on a VPN.
The photo is read once — only the expense it produces is saved.
A project keeps its own expenses, balances and settle-up. Give one a date range and the app switches to it by itself while you're away.
New occurrences are added by the Sheet on the day they fall due, the next time any phone syncs. Ones already added are ordinary expenses — editing or deleting one never touches the series.