Payments

Payments

4 pieces of work

Tagly

Double-entry ledger

Designed the double-entry ledger behind every balance on Tagly. The ledger has 16 transaction kinds, covering deposits, withdrawals, refunds, payments, locks, unlocks, referral bonuses and adjustments. Customers, businesses and the platform each have an available and a reserved balance. Every movement of money is one row that can't be edited, and every row write goes through a single helper.

  • Stripe
  • PostgreSQL and PostGIS
  • Prisma

Tagly

Three ways for a business to pay

Built the 3 ways a business can pay on Tagly: prepaid credits, pay-as-you-go, and automatic monthly top-ups. Credits are a one-off payment with no card kept on file. Pay-as-you-go charges a saved card whenever someone shares the business. Monthly top-ups refill the credit balance from the saved card at the start of each month. In the app, payments go through Stripe's native payment sheet. The sheet reporting success isn't proof the money moved, so the app only shows success once the backend has confirmed the payment.

  • Stripe
  • Express
  • React Native
  • Expo

Tagly

Customer payouts to real bank accounts in Czechia and the US

Built the payouts that let customers withdraw their rewards straight to their own bank account, through Stripe Connect. Money moves from Tagly's platform balance to the customer's Stripe Connect account, then on to their bank. Every step shows up in the app. A reconciliation worker catches any payout stuck in an edge-case state.

  • Stripe

Tagly

Stripe webhooks and reconciliation workers

Built the Stripe webhook handling that keeps Tagly's balances in sync with Stripe. The webhook handler covers 12 event types. Each event is recorded before Tagly acts on it, so nothing is ever counted twice. Reconciliation workers sweep for deposits that were never credited and withdrawals that got stuck, so no error state is left unresolved.

  • Stripe
  • Express
  • Node.js