Finta (YC W23)

The 'Make something people love' poster in the Finta office, with the San Francisco bay through the window
Timeline
4 Months, May – August 2026
Role
AI Software Engineer Intern
Location
San Francisco, California
Overview
I spent the summer doing product engineering at Finta, a YC-backed startup that does bookkeeping and taxes for other startups. Most of my time went into bank integrations, transaction filters, a referral program, making Slack and Stripe more reliable, and AI tools with an eval suite behind them.
Stack
Ruby on Rails, Hotwire/Turbo/Stimulus, Packwerk, Sidekiq, PostgreSQL, ViewComponent, OAuth2, Stripe, Flipper, Respan

142

merged PRs

1000+

commits

What I Built

Most of my summer went into these six things.

The Work

Bank Integrations

I built Finta's Slash and Rho bank integrations from scratch, covering OAuth connect, account, transaction and treasury sync, multi-account support and reconnect alerts, all behind feature flags. Later on I added reconnect logging across all four bank providers that never writes a token or raw payload to the logs. Finta announced the Slash partnership once it went live.

The bug I remember most was Slash sync quietly stopping after 100 rows, so accounts looked synced when they weren't. I fixed the pagination, added a regression test and backfilled the accounts that got affected.

Slash API

banking + treasury

Rho API

banking + cards

OAuth2 connect

full-page return · guarded token recovery

Accounts

multi-account persistence

Transactions

multi-page sync

Treasury

balance history

The books

Flipper staged rollout

Reconnect observability · 4 providersNo tokens or payloads in logsConcurrency + retry on refresh
RailsOAuth2PackwerkSidekiqPostgreSQLFlipper

Cards & Spender Filters

These are two filters customers kept asking for, one by card and one by who spent the money, and they work across Mercury, Rho, Slash and Plaid banks like Amex, Chase and Citi. When a Slash card deploy got rolled back I reconciled the production schema and got both filters working again. Here are the launch demos Finta put out:

Spender filter: pick people, see only their spend
Card filter: physical and virtual cards across providers
RailsPostgreSQLHotwire/StimulusPlaid

Agentic AI Tools

Ask Finta is the in-app assistant. I gave it tools that can search, edit and split transactions and create rules, with permission and company checks on every call, and built a Respan eval suite to make sure it behaves before anything goes live.

Ask Finta

the in-app assistant

Search

Edit

Split

Rules

The books

permission and company checks on every call

50+

scenarios

×3

repetitions

99%

pass rate

RailsPackwerkPostgreSQLMinitestRespan

Slack Delivery

Founders already live in Slack, so that's where Finta meets them: transaction alerts and monthly summaries land in a channel they pick, and Ask Finta posts its updates there too. I built out the Slack side of that, with a settings flow that walks you through connecting your workspace and picking a channel, a welcome DM once you're connected, and delivery that only counts a message as sent once Slack confirms it, so nothing quietly goes missing.

A Finta Slack message with a monthly summary of cash, net burn, runway and MRR
  1. 1

    Connect your workspace

    One Slack sign-in, with a clear connected state and a welcome DM

  2. 2

    Choose where Finta talks to you

    A channel for alerts and monthly summaries, and Ask Finta’s own channels

  3. 3

    Hear from Finta, reliably

    Every message is confirmed by Slack before it counts as sent, so nothing quietly goes missing

RailsSidekiqOAuthHotwire/Turbo/Stimulus

Referral System

I built the referral program end to end, from the invite in settings and matching at signup to applying the Stripe coupon on upgrade, the claim link and the accept and reject emails, and shipped it behind a feature flag.

Invite

settings page

Attribute

signup match

Coupon

auto-applied

Claim

token URL

Follow-up

accept / reject email

RailsHotwire/StimulusPunditFlipperStripe

Stripe Bookkeeping

Every Stripe event, whether it's a charge, a refund, a dispute or a payout, has to get booked to the right category in a customer's books. The trouble was that webhooks, admin tools and cleanup jobs each had their own copy of those rules, so the same event could get booked differently depending on which path touched it. I moved the rules into one routing policy that all three paths call, then worked through the edge cases one by one: credits, cancellations, disputes, reversals, sales tax, financing and missing balance transactions. Along the way I also made the multi-page catch-up jobs resumable and capped admin imports at 100 transactions.

WebhooksAdmin toolsCleanup jobs
One category policyThe books
RailsSidekiqStripePundit

Reflection

Finta was my first startup job and my first summer living in San Francisco, working on a small team where the code I wrote went in front of real customers within days, and a few things from that stayed with me.

  • The first week is a work trial

    Nobody at an eleven-person company has time to onboard you. The summer started to click once I started picking up real tickets instead of waiting to be pointed at things, and Slash, the first big thing I got handed, ended up being the area I knew best.

  • Do the thinking first

    Before bringing anything to anyone I got into the habit of starting from why we were building it, figuring out the real options and picking one. In code that meant finding the riskiest piece first and designing around it, which saved me a lot of rework.

  • Don’t run from the painful bugs

    A sync that stopped at 100 rows or a message marked as sent that never showed up is easy to patch. The real job was figuring out why each one was possible and making sure it couldn’t happen again.

It was the most I've grown in a few months, and I'm grateful to the Finta team for trusting an intern with work that customers actually relied on.