Home
Chase Teichmann Request an intro

Senior full stack engineer, TypeScript · Node.js · PostgreSQL · AWSMaryland-based, open to hybrid in the Baltimore/DC area

I helped build the returns product a competitor bought.

I was one of four engineers at ReturnLogic. Now I build telecom billing integrations at Actifai, whose clients include about a third of North America’s 25 largest telecom companies.

Selected work

Product Project 01

The returns product

ReturnLogic’s entire product: a returns portal each retailer could shape to its own policy. I designed and built its core, plus exchanges and warranties end to end.

250+ Retailers served over the years, up from 7

Company
ReturnLogic
Role
Designed and built the portal, calculations, bundles, auto authorization, and processing
Period
2019 – 2026
Stack
TypeScript · Node.js · Angular · PostgreSQL · AngularJS · Sequelize · TSOA · REST · Kong · Shopify · BigCommerce · EasyPost · LaunchDarkly · Docker · ECS · Fargate · S3 · CloudFront · Route 53 · CloudWatch · Jest
Category
Product
The brief

Every retailer runs returns differently, with its own windows, fees, and outcomes. ReturnLogic’s portal had to fit each retailer’s policy instead of making the retailer bend to the software.

A return, start to finish
  1. StartShopper portalWhere a shopper starts a return. Each retailer could customize all of it: design, text, flow, and step order.
  2. PriceReturn calculationsWhat the shopper gets back after fees, accounting for discounts and promos, tax and shipping, and the price difference on exchanges. Bundles come back whole or item by item, as the retailer chooses.
  3. ApproveAuto authorizationA return that meets the retailer’s rules is approved and gets its shipping label, through EasyPost or the retailer’s own carrier account.
  4. CloseAutomated processingThe refund, gift card, or exchange item goes out and the return is closed, with no one touching it.

I built every step. Teammates built the return rules engine and return analytics; I contributed to analytics.

The hard part

Everything in the portal was configurable per retailer, and the settings interacted, so there were far more combinations than anyone could test by hand.

I kept it manageable three ways: defaults plus overrides, so a retailer only set what differed; LaunchDarkly flags to roll changes out retailer by retailer; and Jest tests on the risky combinations.

Outcome

In 2026 a major reverse-logistics competitor acquired ReturnLogic.

  • 2M+Returns processed

Data Project 02

Shopify webhooks to polling, Christmas week

Shopify warned our merchants that our webhooks would stop working, and its support gave conflicting answers. Another engineer and I moved 130+ stores to polling without waiting for an answer. No data lost.

130+ Stores moved to polling

Company
ReturnLogic
Role
Built with one other engineer: half of engineering
Period
2022
Stack
AWS Lambda · SQS · Shopify REST API · TypeScript · Node.js · PostgreSQL
Category
Data
What happened

ReturnLogic ran as a private Shopify app and took in each merchant’s data through webhooks. We had registered them without a version, which Shopify’s docs said meant “latest.”

In Christmas week 2022, right as peak returns season began, Shopify flagged that version as deprecated.

What we built

Lambda functions on a 30-minute schedule pulled products, orders, customers, collections, and inventory from Shopify’s REST API and fed them through SQS into our existing ETL, so nothing downstream changed.

Each poll asked for records updated since the last one for that store and resource, with a small overlap, throttled and backing off on Shopify’s 429 responses. Records were upserted by Shopify ID, so the overlap, and data arriving through both webhooks and polling, merged instead of duplicating. Thirty minutes was fresh enough: returns start days after an order.

Another engineer and I split it by layer: I built the Lambda pollers, and the other engineer handled the path through SQS into the ETL. We switched every store over at once.

Outcome

No outage, and record counts matched Shopify’s through the peak returns week. The deprecation turned out to be a non-issue.

  • <1wkFrom Shopify’s email to all stores polling

Integrations Project 03

Order submission and exceptions queue

Actifai builds the online shops where telecom customers order service, for about a third of North America’s 25 largest telecom companies. I built the integration that submits those orders into each provider’s billing system, and I work with each provider through go-live.

3 Telecom providers live

Company
Actifai
Role
Built the billing integration and exceptions queue, and worked with each provider and its integration partners through go-live
Period
2026
Stack
TypeScript · Node.js · NestJS · PostgreSQL · Datadog · Bun · Vue 3 · Nuxt · REST
Category
Integrations
What made it hard
  • Two sources of truthOne of the first external APIs on Actifai’s order framework where state lives on both sides: an order lives in Actifai and in the provider’s billing system, and the two have to agree. The provider calls back with each order’s status, which is how we catch a mismatch.
  • Plan mappingSingle, double, and triple play orders (internet, TV, and phone, alone or bundled) have to map onto each provider’s billing products.
  • Go-live coordinationEach launch lines up the provider and its integration partners, and I gather the requirements with them. A runbook covers each new provider’s credentials and config, plan mapping, and go-live checklist.
When an order fails

A failed submission goes into an exceptions queue in Actifai’s manager portal, where staff fix and resend it, and the provider gets an email when one of its orders is flagged.

A correlation ID on every submission ties logs, Datadog monitors, and the queue to one order, with personal data redacted first.

Billing Project 04

Automated billing on Recurly

I automated retailer billing on Recurly, taking about ten minutes per retailer, per cycle, off our VP of Operations’ desk.

10min Per retailer, per billing cycle, automated

Company
ReturnLogic
Role
Built the billing automation and the in-app billing section
Period
2020
Stack
TypeScript · Node.js · Recurly · PostgreSQL · AngularJS · Sequelize · Jest · Docker · ECS · Fargate
Category
Billing
By hand vs. automated
By hand, every weekly and monthly cycle
  1. Run the usage queries
  2. Enter each retailer’s charges into Recurly
  3. Download the invoice
  4. Email it with the usage report
Nearly 7 hours a month at 40 retailers.
Automated
  1. A scheduled job compiles each retailer’s usage report
  2. Posts the charges to Recurly
  3. Emails the invoice
  4. Retailers find every report and invoice in the app
No manual work, however many retailers.
What a bill covered

Each return (RMA) at that retailer’s own price, shipping labels for retailers on our managed shipping integration, and any add-on features they used.

Safe to re-run

Every posted charge was recorded in Postgres, so re-running a failed cycle skipped what had already posted instead of charging a retailer twice.

AI Project 05

Returns fraud evaluator

I built an AI fraud evaluator that holds suspicious returns for a person to review, instead of letting automation approve them.

Company
ReturnLogic
Role
Built the evaluator
Period
2025
Stack
OpenAI · TypeScript · Node.js · PostgreSQL · AngularJS · Sequelize · Jest · Docker · ECS · Fargate
Category
AI
The risk

Retailers on ReturnLogic could authorize and process returns automatically, which is also the path a fraudulent return takes. Fraud leaves patterns in a shopper’s return history: the same item sent back again and again, the same return type or reason every time, a burst of returns in a short window.

How a return is judged
  1. ScoreRulesRules score the return’s fraud indicators. Clear-cut returns are settled here.
  2. JudgeOpenAIWhen the rules can’t decide, OpenAI decides whether to flag the return and writes its reasoning.
  3. HoldThe automationA flagged return is held back from automatic authorization and processing. It isn’t denied.
  4. DecideStaffStaff see the flag and the reasoning on the return and make the final call.
What testing caught

A provider abstraction let us A/B test prompts and swap providers without a rewrite. The test picked the prompt we shipped and exposed three guardrail gaps, which we closed.

  • Flagging on thin evidenceThe model flagged returns the rule scores didn’t support.
  • Inconsistent verdictsThe same return history could get different answers.
  • Shopper text steering the modelReturn reasons and notes that shoppers write could sway the verdict.
Cost

Each evaluation got cheaper three ways: a shorter prompt, varied reasoning effort on one primary model, and calling the model only when the rules can’t decide.

Checkout Project 06

Instant exchanges through Shopify

Exchanges become real Shopify orders, paid with a one-time discount worth the shopper’s return credit, so they never pay full price up front.

Company
ReturnLogic
Role
Built the whole feature
Period
2023
Stack
Shopify · TypeScript · Node.js · Angular · Sequelize · Jest · Docker · ECS · Fargate
Category
Checkout
A $50 item for a $60 one

Retailer feedback said shoppers hated the old way, and our cart-abandonment data showed high-value carts left behind.

Before
  1. Pay $60 for the new item up front
  2. Ship the $50 item back
  3. Wait for it to arrive
  4. Get a $50 refund
Two purchases, with the full $60 paid first.
After
  1. Get a Shopify cart with the $60 item and a one-time code worth the $50 credit, minus fees
  2. Pay $10, plus any fees, at checkout
  3. Land back on the return’s tracking
  4. The new item ships as soon as the return is received
One order, and only the difference paid.
How it works

When a shopper picks an exchange, ReturnLogic generates a Shopify cart and a one-time discount code worth their return credit, minus return shipping, restocking, and any other retailer fees. They check out on the retailer’s own Shopify store, so taxes, inventory, and payment all stay in Shopify, and an embedded script sends them back to their return’s tracking in ReturnLogic.

The code

Each code works once, only for that shopper, and expires. When the new item costs less than the credit, each retailer chooses what happens to the difference.

Product Project 07

Third-party warranties

I built warranty claims into the same workflow as returns and exchanges, including claims for orders placed on Amazon, Walmart, or Best Buy.

Company
ReturnLogic
Role
Built the whole feature
Period
2021
Stack
TypeScript · Node.js · Angular · PostgreSQL · Sequelize · Jest · Docker · ECS · Fargate
Category
Product
Not just another return

Warranty claims run through the same portal as returns and exchanges, but three things work differently.

AspectReturnWarranty claim
OutcomeRefund, gift card, or exchangeA replacement
Proof of purchaseThe retailer’s own orderAny order, including Amazon, Walmart, or Best Buy: the shopper enters the order number or uploads a receipt, and staff verify it
Time limitThe return windowThe warranty period
After a claim

Each retailer sets a separate workflow for each case.

  • In stock: Exact replacementChecked against the store’s live inventory.
  • Out of stock: A choiceA replacement from the full catalog, or a way to contact the retailer.
Who used it

Mostly enterprise customers selling consumer products, who until then had handled warranty claims outside ReturnLogic.

Maps Project 08

Territory maps, autocomplete, and geolocation

At Actifai I helped build territory management for the door-to-door sales app, so each team gets its own area, and I work on the location and address features around it.

Company
Actifai
Role
Territory drawing, assignment, and rep view (with teammates), the location-tracking fix, and shop autocomplete
Period
2026
Stack
Google Places · TypeScript · Node.js
Category
Maps
Territories

Actifai’s door-to-door sales app puts addresses on a map for reps to work, but managers had no way to hand an area to a team.

With teammates, I built both sides of it: the drawing tools managers use to outline clusters of addresses, assigning each territory to reps by user group, and the view where reps see their own territory. Now each team gets its own area.

Location tracking

Rep positions jumped around on the map, and the app’s location permissions weren’t handled correctly. I fixed both. The app now asks for location at the right moment and handles a rep who says no.

Address autocomplete

Every service order in Actifai’s online shop needs an address. Google Places autocomplete gets customers to a valid service address with less typing, so fewer orders come in with bad addresses.

Maps Project 09

FishLog: a fishing journal for Maryland

My friends and I log every catch on a map, with the weather at that place and hour saved automatically.

30 Species with Maryland size and creel limits

Company
Personal project
Role
Solo project
Period
2026
Stack
React · Leaflet · OpenStreetMap · Python · AWS Chalice · Lambda · MySQL · S3 · Open-Meteo
Category
Maps
Why I built it

I’m an avid fisherman, and I wanted one place where my friends and I could log our catches, track the conditions we caught them in, and compete.

What it does
  • JournalCatches, spots, and gear, with the temperature, wind, and moon phase saved for each catch.
  • RegulationsSize and creel limits for 30 Maryland species, shown next to each one and imported automatically from Maryland DNR.
  • LeaderboardBiggest fish per species, most catches, and most species, with filters.
  • ProfilesA public profile for each angler.
How it’s built

React and React Leaflet over OpenStreetMap tiles on the front end; a Python API on AWS Chalice (Lambda and API Gateway) with MySQL on RDS.

The weather is saved with the catch, so the log never depends on a weather API later. Geocoding (OpenStreetMap’s Nominatim) and weather (Open-Meteo) need no API keys. Photos go from the browser straight to S3 through presigned URLs, so the API never streams image bytes, and iPhone HEIC photos are converted to JPEG in a Lambda.

The hard part

Keeping the map, the catch list, and the filters in agreement. Change a filter or move the map, and all three have to update together.

Web Project 10

This site

A portfolio built as a store, with real booking on Google Calendar.

~19KB JavaScript, gzipped

Company
Personal project
Role
Product, design, and engineering
Period
2026
Stack
TypeScript · Astro · Cloudflare Workers · Playwright
Category
Web
How it’s built

No framework runtime and no third-party widgets: static Astro pages with one interactive island. The store’s state is a pure, unit-tested reducer in plain TypeScript, and the cart lives in the URL, so a cart can be shared as a link.

Checkout books a real call: a small Cloudflare Worker reads my Google Calendar free/busy and sends the invite with a Meet link. Everything renders as plain HTML first, so the site works without JavaScript and prints as a résumé.

Two designs

The same markup carries two designs. A theme layer of design tokens and component rules switches the whole site to a 1990s version with a CRT-style transition, remembers the choice, and never prints.

Scores

Lighthouse mobile scores 100 for accessibility and best practices on every page; performance is 96–97 on project pages and about 70 on the landing page. axe finds no WCAG 2.2 AA violations in any state.

  • 100Lighthouse accessibility

Cart add-on

ReturnGuard: return shipping protection

I built nearly all of ReturnGuard, the feature ReturnLogic pivoted its business model around in 2025. Shoppers add return shipping protection at checkout for a small fee, and if they return the item, the label is already paid for.

Company
ReturnLogic
Role
Built nearly all of it: the research spike, the Shopify checkout build, and its monitoring
Period
2025
Stack
Shopify · TypeScript · Node.js · AngularJS · LaunchDarkly · Jest · Docker · ECS · Fargate
Category
Cart add-on

A cart add-on: it was a checkout feature, so here it lives in the cart.

The pivot

Retailers paid for returns on both ends: a monthly subscription to ReturnLogic, and the cost of every return label. With ReturnGuard, ReturnLogic earned a share of every protected order instead, and the returns product became free for retailers. Adoption figures aren’t public.

Offer, track, redeem

My research spike settled three questions before the build.

QuestionWhat I built
Offer itA Shopify checkout UI extension that adds a protection product, at a fee each retailer sets
Track itA Shopify pixel script that records who added protection
Redeem itProtection comes into ReturnLogic with the order, and when the shopper starts a return, the handoff into their return session covers the label
Keeping it earning

Revenue depended on it, so I built health checks and monitoring for the three ways it could break.

  • Protection missingA retailer’s checkout stops offering it.
  • Pixel not firingTracking events stop arriving.
  • Orders not syncingProtected orders don’t reach ReturnLogic.

Checkout

Pick a time, then add your details.

Delivery slot

Your details

Your details go only into the calendar invite.

Order summary

    No projects added.

    Items
    0
    Call length
    15 min
    Return shipping protection
    $0.00
    Total
    $0.00

    Order confirmed

    The calendar invite is on its way.

    What happens next

    1. Order placedOn my calendar, with your cart in the event.
    2. Confirmation emailA Google Calendar invite with the Meet link.
    3. Delivery30 minutes on Google Meet.

    Items

      Return shipping protection: active. If the call isn’t a fit, the return label’s on me.

      Experience

      1. Jul 2026 – Present

        Senior Full Stack Engineer

        Actifai

        On a 12-person team at a 40-person company that builds sales tools for broadband, cable, and telecom providers, including about a third of North America’s 25 largest.

        • Integrations. Own the integration that submits telecom orders into the providers’ billing system, where order state lives on both sides. Live for 3 providers, with a runbook for the next.
        • Forward-deployed. Meet with telecom providers and their integration partners through go-live, gather requirements, and work across departments to ship them.
        • How I work. Prompt engineering across the full stack. I orchestrate Claude Code agents in T3 Code and Warp, track tickets through Linear’s MCP server, and use an internal MCP server to search our Obsidian knowledge base and query the database safely.
        • Team. Review code, take on-call, and lead the weekly icebreaker at our sprint retrospective.
      2. Jun 2019 – Jun 2026

        Intern to Senior Full Stack Engineer

        ReturnLogic

        Intern from summer 2019 until I graduated in 2020, then Full-Stack Software Engineer. Senior from 2024.

        One of four engineers at a 30-person company, from 7 retailers to more than 250 served over the years, through its 2026 acquisition by a reverse-logistics competitor.

        • Product. Designed and built the returns product’s shopper portal, return calculations, bundles, auto authorization, and automated processing, plus exchanges and warranties.
        • Revenue. Built nearly all of ReturnGuard, the feature the company pivoted its business model around in 2025, and automated billing on Recurly in 2020.
        • Reliability. With one other engineer, moved 130+ Shopify stores from webhooks to polling within a week over Christmas 2022, and built an AI fraud evaluator that keeps a person in the loop.
        • Data. Planned table relationships and built indexes across the product, and was a major contributor to the 2020 move from raw SQL to Sequelize.
        • Team. Mentored and onboarded engineers, reviewed code, took on-call, and was the daily bridge between product, customer support, and engineering.
      3. 2016 – 2020

        B.S. Computer Science

        York College of Pennsylvania

        Minors in Marketing and Mathematics

      Shop by stack

      Back end

      AWS

      Front end

      Integrations