Case Study
Quill & Pigeon
Full-Stack Software Engineer Co-op · Portland, Maine · Jan 2025 – Aug 2025

01
Product overview
Quill & Pigeon helps customers discover, personalize, schedule, and send handwritten cards created by independent New England artists.
I joined as a Full-Stack Software Engineer Co-op and worked across the customer-facing Next.js platform, Medusa commerce services, Stripe subscriptions and payments, AWS Lambda applications, search infrastructure, transactional email, shipping workflows, and context-aware AI agents.
02
My role and areas of ownership
I worked across the Next.js platform, Medusa commerce services, Stripe subscriptions and payments, AWS Lambda applications, search infrastructure, transactional email, shipping workflows, and context-aware AI agents.
Full-stack product development
Built accessible customer experiences for product discovery, personalization, recipients, reminders, subscriptions, checkout, and card delivery using Next.js, React, TypeScript, Prisma, Zod, and PostgreSQL.
Commerce, subscriptions, and card credits
Extended Medusa with custom subscription-credit and payment-provider functionality so customers could redeem included card credits during checkout while Stripe handled subscription and standard payment workflows.
Context-aware AI workflows
Built AI-powered customer workflows using the OpenAI API and Claude API, including an MCP server that provided agents with user context such as subscription tier and available card credits.
Platform integrations and delivery
Developed AWS Lambda services with Kysely, integrated Meilisearch and USPS delivery estimates, and improved CI/CD and local GitHub Actions testing with OIDC and act.
03
Results and impact
- Users supported
- 500+Users supported
- Transactions processed
- 1,000+Transactions processed
- Faster page loads and processing
- 50%Faster page loads and processing
- Accessible customer experience
- WCAG 2.2 AAAccessible customer experience
04
Full-stack customer experience
Built accessible customer workflows across product discovery, personalization, recipients, reminders, subscriptions, checkout, and card delivery using Next.js, React, TypeScript, Prisma, Zod, Medusa, and PostgreSQL.
These flows connected the storefront to commerce and fulfillment services so customers could discover cards, personalize them, manage recipients and important-date reminders, subscribe, check out, and track delivery — all with an accessible, WCAG 2.2 AA experience.
05
Commerce and subscription-credit architecture
Medusa did not natively support Quill & Pigeon's subscription card-credit model, so I extended its commerce and payment architecture to support it. Customers received card credits based on their subscription tier and could redeem those credits to receive included or free cards during checkout.
Extended Medusa's commerce and payment architecture to support subscription card credits, allowing customers to redeem included cards during checkout while preserving Stripe-based payment workflows for standard purchases and remaining balances.
- Customers received card credits based on subscription tier.
- Credits could be used to receive included or free cards.
- Credit redemption was integrated directly into checkout.
- Custom Medusa functionality backed the credit model — it is not a native Medusa capability.
- Custom payment-provider behavior connected Stripe payment workflows and credit redemption.
- Checkout logic distinguished between credit-funded and standard paid purchases.
- Subscription lifecycle events updated customer-credit availability.
Custom Stripe payment provider
Built custom payment-provider behavior that integrated subscription card-credit redemption with Stripe-backed payment and checkout workflows. The design keeps three concerns clearly separated: Stripe handled payment processing, the custom provider handled subscription-card credit redemption, and Medusa handled order creation. Card credits are an application-level entitlement — not cryptocurrency or a cash equivalent.
- Subscription purchased
- Stripe webhook
- Subscription tier resolved
- Card credits added
- Customer selects a card
- Checkout evaluates available credits
- Custom Medusa payment behavior
- Credit redeemed or Stripe payment collected
- Order created
06
Context-aware AI and MCP server
Built an MCP server that supplied AI agents with authenticated customer context, including subscription tier, available card credits, and relevant account information, allowing responses and recommendations to reflect the customer's actual product state.
- The AI could provide account-aware answers.
- Recommendations could consider the customer's subscription.
- The agent could determine whether the customer had credits available.
- Context did not need to be manually copied into each prompt.
- Context was exposed through controlled MCP tools.
- The AI did not receive unrestricted database access.
Customer context was exposed through controlled MCP tools rather than direct, unrestricted access to the application database.
Built AI-powered product and support workflows using the OpenAI API and Claude API, with provider failover and customer context supplied through the MCP server. Instrumented these AI workflows with Langfuse for prompt management, cost visibility, tracing, debugging, and understanding agent decisions — Langfuse provides observability around the workflows rather than making AI decisions itself.
- Customer request
- AI workflow
- MCP server
- Subscription tier
- Available card credits
- Relevant account context
- OpenAI API or Claude API
- Context-aware response
07
Search and product discovery
Integrated Meilisearch to support fast product discovery and search across the commerce experience, keeping product lookups responsive as the catalog grew.
08
Email conversation chaining and human escalation
Implemented email conversation chaining so AI workflows received the relevant conversation history before reacting to inbound messages.
Built conversation-aware inbound email handling that reconstructed the relevant message thread before invoking the AI workflow. Requests the agent could not safely or confidently resolve were escalated to the owners for human follow-up.
- Inbound emails were associated with their existing conversation.
- Prior messages were reconstructed or retrieved.
- The AI received the relevant thread context.
- The AI attempted to handle the request using the full conversation.
- Requests that could not be handled safely or confidently were escalated to the business owners.
- Human owners could continue the existing conversation.
Branded transactional email templates were built with React Email and connected to automated customer workflows, covering communication such as event reminders, order emails, and subscription updates alongside conversation-aware inbound handling.
- Inbound email
- Conversation identified
- Relevant thread reconstructed
- Customer context retrieved
- AI evaluates and drafts response
- Handling decision
- Automated response or owner escalation
09
Data-access architecture
Prisma and Kysely served different architectural needs and were not used interchangeably in the same runtime.
Next.js platform application
Used Prisma for typed data access in the Next.js platform and Zod for validating application inputs, API payloads, and workflow boundaries.
AWS Lambda applications
Used Kysely for typed SQL access in AWS Lambda applications, keeping the serverless data layer lightweight while preserving compile-time query safety.
10
Shipping and fulfillment integrations
Integrated USPS shipping estimates into the checkout and fulfillment experience so customers could see more accurate delivery expectations. These are estimated delivery windows, not guaranteed delivery dates.
11
CI/CD and developer experience
Configured GitHub Actions workflows with AWS OIDC authentication and used act to run and debug CI workflows locally before pushing changes. act is a local GitHub Actions runner — not an AWS service, a replacement for GitHub Actions, or a production deployment platform.
- Reduced reliance on long-lived AWS credentials through OIDC authentication.
- Improved confidence when modifying workflows.
- Reduced iteration time when debugging GitHub Actions with act.
- Supported automated testing and AWS deployments.
Validated API and application boundaries with Zod and tested service integrations using Bruno and Postman. Maintained consistent formatting and review quality using Prettier and automated repository checks.
12
Technology stack
Full stack
Commerce and search
AI and automation
Cloud and backend
Developer tooling
13
Visit live website
Contact
Let's talk
I'm looking for a full-time software engineering role in full-stack web and AI products. If your team needs work like Quill & Pigeon, get in touch.