-
-
Home: what's owed, overdue and collected at a glance
-
Paid through PayPal: the tab ticks itself off
-
The customer's own page, with a Pay now button
-
Collect: one tap sends each customer a PayPal invoice
-
Insights, with Nudge answering who to chase and drafting a reminder
-
Scan: AI reads the notebook page; the owner checks every line
Inspiration
Walk into almost any kedai runcit or kopitiam in Malaysia and you'll find a "buku 555": a small notebook where the owner writes down who took what on credit. "Ah Seng, 2 Bag of Chips RM10." It runs on trust, but pages get lost, names get smudged, and nobody likes asking a regular customer for money. Owners quietly lose hundreds of ringgit a month to tabs that are simply forgotten. We wanted to keep the notebook (it works, and owners trust it) and fix the part that doesn't: getting paid.
What it does
555 Buku turns a photo of a handwritten IOU page into money collected:
- Scan: snap a page of the notebook. AI reads each line's name, item, amount and date, flags crossed-out lines, repayments and anything it isn't sure about, and the owner checks every line before anything is saved.
- Collect: one tap sends each customer a PayPal invoice. Each customer also gets their own page showing what they owe, with a button to pay through PayPal. When PayPal says it's paid, the debt ticks itself off.
- Remind: the owner sets the rules once (when to start, how often, when to stop, and never during Friday prayers). Reminders show on a calendar, can be dragged to another day, and go out as PayPal reminder emails or a one-tap WhatsApp message in the owner's chosen tone.
- Nudge: an AI assistant that answers "who should I chase this week?" and drafts a polite reminder for a customer.
- Ledger and Insights: an AG Grid ledger of who owes what, overdue first, and an AG Studio dashboard of totals and trends.
- Works on a phone or a laptop, in nine languages (English, Malay, Chinese, Tamil and more).
How we built it
- PayPal: the PayPal Invoicing API (v2, sandbox) creates and sends invoices, checks their status and sends reminder emails. PayPal webhooks (invoice paid, cancelled, refunded) update a Postgres database, so a payment shows up even while the app is closed. Owners can also sign in with Log in with PayPal.
- Reading the notebook: Google Gemini (gemini-3.5-flash) reads the photo through the Vercel AI SDK and returns structured rows. Photos are kept in private Vercel Blob storage. The app then checks the model's work: dates are read day/month the Malaysian way, a missing year becomes the most recent such day, and anything unreadable is flagged for the owner instead of guessed.
- The ledger and insights: AG Grid for the ledger, AG Studio for the dashboard, including a custom "who owes you" widget and an AI panel run by Nudge.
- Reminders: a scheduled job runs every hour and sends due reminders at the owner's chosen time. Bryntum Scheduler and Calendar show the plan, with drag to move.
- Nudge: Gemini through the AI SDK, with tools that read the ledger and draft messages; it never sends anything itself.
- Stack: Next.js 16 and React 19 in TypeScript on Vercel, Neon Postgres, nearly 1,000 unit tests.
- How we worked: a team of three sharing one GitHub repo, small pull requests reviewed before merging, and Claude Code as a pair programmer with a shared rulebook.
Challenges we ran into
- Handwriting is messy, and so are dates. The model sometimes read "9/11" as September instead of 9 November, or guessed last year. We now take the date written at the start of a line ourselves and flag anything that isn't a real day.
- Money needs to be exactly right. Retrying a failed batch must never send a customer two invoices, and a refund or cancellation has to undo a "paid" tick. We built per-invoice results, safe retry and webhook handling with tests for each case.
- Keeping the owner in control. AI reads and drafts, but nothing is saved, sent or charged until the owner approves it.
- Local details matter. Ringgit invoices only work between Malaysian PayPal accounts, and reminders should never land during Friday prayers.
Accomplishments that we're proud of
- The whole journey works end to end in the PayPal sandbox: photo of a notebook, checked lines, PayPal invoices sent, the customer pays, and the debt ticks off by itself.
- An app a corner-shop owner can use on their phone, in their own language, without changing how they already work.
What we learned
- PayPal's invoicing does a lot of the heavy lifting (emails, a payer page, reminders), which let us focus on the owner's experience.
- AI is great at reading and drafting, but it needs checks around it, especially for money and dates.
- Small, reviewed pull requests kept three people (and an AI pair programmer) from stepping on each other.
What's next for 555 Buku
- A monthly summary for owners ("RM2,340 collected, 3 regulars always late") that could also support a small-business loan application.
- Reminders over WhatsApp and Telegram sent automatically, where customers already are.
- A "talking till": the hawker says the order out loud and the customer pays by PayPal.
- Testing with real shop owners in our neighbourhood.
Built With
- ag-grid
- ag-studio
- bryntum
- claude
- claude-code
- gemini
- neon
- next.js
- node.js
- paypal
- paypal-invoicing-api
- paypal-webhooks
- postgresql
- react
- typescript
- vercel
- vercel-ai-sdk
- vercel-blob