Back to the reel

FinanceMe.

Finance Me is a family expense tracker I designed and built. After an Apple Pay purchase, an iOS Shortcut can send the amount, merchant and date into the app, where it lands as a categorized expense the household can see.

A cheerful wallet character puts a coin into a household savings jar beside an open ledger
Role
Product design
Full-stack development
Product
Family finance
Mobile-first web app
Integration
Apple Wallet
iOS Shortcuts
System
Next.js · TypeScript
MongoDB · NextAuth

Catch the purchase as it happens.

A household budget only works if the small payments actually get recorded. Forget a few of them and the shared ledger is useless. I designed Finance Me around that moment: capture the purchase, then give the family one place to look at it.

After setup, a Wallet transaction can become a recorded expense with the merchant, category and tags already attached. An iOS Shortcut picks up the Wallet fields and posts them to the app’s import endpoint.

The workflow below is how the import works, drawn from the source. It uses example data; it is not a recording of the app.

  1. Pay with Apple Pay

    The Wallet transaction supplies the amount, merchant and date.

  2. Run the Shortcut

    A personal automation sends those fields to the import URL.

  3. Check and classify

    Validate the payload, pick a category and check for a duplicate.

  4. Add to the ledger

    Save the expense in the member’s family, or their own history.

One payment, from the checkout to the family’s records.

Keep the merchant. Add the category.

“Groceries” says what the money was for. “Lidl Sofia” says where it went. The import keeps both, so monthly totals do not wipe out the detail you need to understand a month of spending.

Merchant rules suggest a category; an unrecognized merchant falls back to other expenses. Amount parsing accepts comma decimals and currency labels from Shortcuts, so a payload that looks like “12,50 EUR” still lands as 12.50.

Merchant name from Wallet

Recorded asGroceries
Merchant tag
Lidl Sofia
Source tag
apple-pay
Interactive example of the category rules in the import.

A retry should not become a second expense.

The import fingerprints the user, the amount, the normalized merchant and the transaction minute. A uniqueness rule in the database catches a repeated payload and returns success without another row. Matching to the minute is a retry safeguard, not a bank-issued transaction identifier.

One household, one ledger.

Joining a family changes whose records you see. Members look at the family’s transaction pool, and new manual entries and Wallet imports belong to that family. Each transaction still carries its creator, so individual contributions stay visible.

That boundary is enforced in the server queries and in the access checks on each transaction. Solo users work with their own records. Family invitations check the recipient’s email and the expiry date before granting membership.

Coming back to the app refreshes the list, so a change from another phone shows up. It is a check-in, not a live dashboard that has to stay open.

Give the next euro a destination.

0–3years
3–10years
10+years

Shared goals group saving by how far away it is: under three years, three to ten, or ten and up. Each goal has a balance, an optional target and a contribution history, so progress traces back to actual entries.

Contributions record the member, the amount and an optional note. If someone has not joined a family yet, the goals page says so and links to family setup. Even the empty state has a job: show the next useful action.

Next on the reel: HLP Labs.

A Bulgarian shop for research peptides, with a reference library and the admin panel behind it.

View HLP Labs