Work / BirdReel

BirdReel

A consumer store and a B2B wholesale portal in one application.

E-commerceB2B portalStripeShipStationQuickBooks
Visit birdreel.com →
BirdReel online store home page

The situation

BirdReel makes smart bird feeders with a camera, AI bird identification and live streaming. It sells direct to consumers online and wholesale to specialty retailers, and the two channels have different prices, terms, shipping rules and accounting.

Off-the-shelf store platforms handle one channel well and the other with plugins and workarounds. The brand needed one catalog, one order pipeline and one set of books.

What we built

  • Consumer store at birdreel.com: catalog, cart, Stripe checkout, customer accounts and order history, product demo videos.
  • Retailer portal at retailer.birdreel.com: retailer applications, wholesale price lists, net terms, bulk ordering, order status.
  • Fulfilment: orders flow to ShipStation, tracking flows back, customers are notified.
  • Accounting: orders and invoices posted to QuickBooks Online, payments matched to Stripe payouts, an audit that lists every mismatch.
  • Monitoring of the integrations themselves: a daily check that flags stuck orders, failed syncs and unmatched payments.
  • Marketing: email campaigns and a cookie banner that only measures what the brand can justify.
BirdReel consumer store home page
birdreel.com
BirdReel retailer portal
retailer.birdreel.com

How it is built

One application serves both sites, with the channel decided by the host name and the account type. Stripe handles payment and payouts, ShipStation handles the warehouse, QuickBooks holds the books, and BirdReel reconciles the three so that a shipped order, a paid invoice and a bank deposit always point at each other.

For the engineer reading along: Python and FastAPI, MySQL, Stripe Checkout and webhooks, ShipStation API, QuickBooks Online API with a token-bucket rate limiter and terminal states for retries (the reconcile job once burned a month of QuickBooks quota in days by retrying the same orders forever; it cannot now). gunicorn under systemd behind nginx, on the same server as Axis. 1,643 commits.

What it does today

1,720orders, 1,672 of them paid
4,472customer accounts
133products and variants
2channels, consumer and wholesale, from one catalog
3systems reconciled: Stripe, ShipStation, QuickBooks
1,643commits

Counts from the production database and repository, 2026-11-03.

Running it

Hosted alongside Axis with its own process, deployed with the same rolling pattern, monitored by Watchdog. A daily integration check reports stuck orders and failed syncs before a customer asks where their feeder is.

Have something that needs building, or running?

Tell us what you are trying to do. We reply within one business day, and the first conversation is free.