Cross-border giftingMarch 2026 to present, in private beta
Re-Galito
Pick a country and an amount, pay by card, and family abroad gets a real Visa prepaid card by email, in their language.
CTO of a small founding team: I lead product and engineering and built the platform end to end.
- Next.js 16
- React 19
- TypeScript
- Stripe Checkout
- Prepaid-card issuer API
- Prisma + PostgreSQL
- Clerk
- next-intl
- Resend
- Twilio Voice
- Tailwind CSS 4
- Zod

- Client
- Re-Galito
- Industry
- Cross-border gifting
- My role
- CTO
- Timeline
- March 2026 to present, in private beta
- Stack
- 12 technologies
- Status
- Pre-launch (private)
The problem
The idea is easy to say and hard to build. Someone wants to send a family member abroad a gift they can spend right away, without a bank account on the other end, a pickup window or an app the recipient has to install. The product has to work in the sender's language and the recipient's, across 27 countries in Latin America, the Caribbean and beyond, and it has to feel like a gift, not a wire.
Behind that simple promise sits real money. Every order is a card payment, a purchase from a card-issuing partner and an email carrying something that spends like cash. If a person has to touch each order, the business cannot grow past the hours in a day. If a step fails quietly, the sender has paid and the recipient has nothing, which means a refund, a support call and a customer who does not come back.
The founding team needed one person to own the whole technical side: the product people use in four languages, the payments, the integration with a financial partner, the handling of sensitive customer data, and the tooling to run it all day to day. That is the job I took on as CTO.
What I built
I designed and built Re-Galito as one web application. A sender creates an account, finishes a one-minute onboarding, picks a destination from a searchable grid of 27 country flags, chooses an amount from 25 to 100 dollars, adds a message and pays through Stripe Checkout in their own language. The whole product, from the landing page to the delivery email, runs in English, Spanish, Portuguese and French, and it installs on a phone like an app.
Once the payment lands, the system does the rest. It buys a Visa prepaid card from the card-issuing partner for every card in the order, waits until each one is ready and sends the recipient one branded email in the language of their country with a button per card. The order moves from pending to paid to delivered with nobody on the team involved, and the sender watches the status change on their dashboard.
For the owner side I built an admin area with live order, revenue and fee figures, drill-down charts, a transactions console that can retry or resend a stuck order with one click, user management and a test-mode switch for safe demos. A support line rings the whole team at once, and the first person to pick up takes the call.
What it does
Features that pay for themselves
Each one in terms of what it does for the business, not what it is made of.
Pick a country, pick an amount, write the message
A searchable flag grid covers 27 countries across Latin America, the Caribbean and beyond. The purchase screen shows a preview of the card, amount chips from 25 to 100 dollars, a quantity up to 50, the recipient's name and email, a gift message and an option to send anonymously. The order summary, service fee included, updates as the sender types, so there is no surprise at checkout.
Behind sign-inPrivate
The order summary, service fee included, updates as the sender fills in the form.
A landing page in four languages
The marketing site, the app and the emails all run in English, Spanish, Portuguese and French. A visitor lands in their own language, can switch with one click, and the choice is remembered on their profile. A sender who would never finish a form in English can finish this one.
Onboarding that takes a minute
Three short steps collect a name, a home country, a preferred language and a phone number with a dial-code picker. The app uses those answers from then on: returning senders skip the country search and land straight on their home country, and the interface stays in the language they chose.
Delivery with nobody touching the order
After Stripe confirms the payment, the system buys one Visa prepaid card per gift from the card-issuing partner, waits for every card to be ready and sends the recipient a single branded email in Spanish, Portuguese or French depending on the destination, with the sender's message and a button for each card. No one on the team handles an order, which is what lets a small team run the business.
A sender dashboard that updates itself
The dashboard greets the sender by name and shows what they sent this month, the month total, what has been delivered and what is still pending, with recent gifts and their status badges underneath. While an order is in flight the page checks for updates every few seconds, then slows down once nothing is pending, so a sender sees the delivery land without refreshing or emailing support.
Full history and one-click Send again
Every gift a sender has made is listed with in-progress, delivered and failed filters and pagination. Send again opens the previous order, lets the sender edit the message, re-prices it and goes straight to checkout. Repeat gifts to the same person are the natural habit for this product, so the repeat path is the shortest one in the app.
An owner console that shows the numbers and fixes problems
The admin area opens on eleven clickable tiles: orders today, this week and this month, paid revenue, service fees, failed and refunded orders, and new and total users, with top products and top destination countries beside them. Every tile drills down into a chart by hour or by day, and hovering a point lists the actual orders behind it. The transactions console searches by buyer, recipient or any reference and opens an order drawer with buttons to fetch the card link, retry the purchase or resend the email, so a stuck order is a click, not a refund.
Engineering
Under the hood
For the partner who reads code.
Payments that survive missed events
Stripe's webhook is verified by signature and marks an order paid only if it is still pending, so a replayed event cannot fulfill it twice. The slow card purchase runs after the response is sent (Next.js after()), so Stripe gets its acknowledgement at once instead of timing out. Two independent backups, the payment-succeeded event and the success page itself, each trigger fulfillment if the first path never arrives.
One record per card, and webhooks backed by polling
A ten-card order is ten purchases from the card-issuing partner, each tracked by its own fulfillment record, unique per order line. Transaction IDs are generated so they cannot collide and are retried automatically if the partner reports a duplicate. A reference echoed back in each webhook maps it to the exact card, and the recipient's email goes out exactly once, when every card has a link. If a webhook never comes, the app polls the partner every two seconds with a hard time limit and pulls the card link, status and recipient out of whichever payload shape comes back.
A service fee solved to a target margin
Stripe takes a percentage plus a fixed amount per charge, so a flat fee would earn a different margin on every order size. Instead the fee is solved algebraically: given the gift value, the margin the business wants to keep and Stripe's rate and fixed fee, one small pure function returns the total that nets exactly that margin. The same function runs in the browser for the live summary and on the server for the real charge, so the two never disagree. The server also re-checks the product, the country, the allowed amounts and the quantity of 1 to 50 against the catalog before it creates a Checkout Session. A price sent from the browser is never trusted.
A runtime test mode and a view-as-customer switch
One setting stored in the database routes new checkouts and card purchases to Stripe's and the partner's test keys without a deploy, and every order carries a sandbox flag so demo orders never mix with real revenue. The app picks the right Stripe client per order from the session's own ID, so each order is always verified against the account that created it. The owner can also flip into the customer app without a second account: the effective role is the database role plus a server-only cookie, enforced in the page layouts and again in the API guards.
Four locales end to end, not just translated text
Every route is locale-prefixed, with hreflang alternates and a sitemap per language, so search engines index each version. Locale is detected from a cookie, then the browser, then falls back to English, and a signed-in sender's choice is saved to their profile. Stripe Checkout opens in the matching locale, and the recipient's email language is inferred from the destination country rather than the sender's. About 630 strings per language keep the four versions in step.
Defense in depth, and failures you can see
Checkout APIs enforce same-origin checks and per-IP rate limits. The Stripe session's owner is verified before the success page renders or an abandoned order is deleted. Inbound support calls are accepted only with a valid Twilio signature, compared in constant time; partner webhooks need a shared secret; card redemption redirects are signed and HTTPS-only. When a purchase fails, the full request and response from the partner is saved on the order and shown in the admin drawer next to Retry, Sync and Resend, so the team debugs from the screen instead of from the logs.
Gallery
Screens
- Behind sign-inPrivate

Every tile opens a drill-down chart. The figures are blurred in this capture.
On a phone

- Behind sign-in

On phones the Buy button stays pinned to the bottom of the screen.
Screens behind sign-in and the sample delivery email were captured in test mode with demo data, except the admin overview, a capture of the real admin area with its figures blurred.
Building something similar?
Tell me what your business needs. I will tell you what I would build, what it would take, and whether I am the right person for it.