Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions mdx-components.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
Callout,
ProcessFlow,
StatBlock,
MilestoneCard,
} from '@/components/mdx';
import { Mermaid } from '@/components/mdx/Mermaid';

Expand All @@ -32,6 +33,7 @@ export const mdxComponents: MDXComponents = {
Callout,
ProcessFlow,
StatBlock,
MilestoneCard,
// Headings
h1: ({ children }) => (
<h1 className="mb-4 sm:mb-6 mt-6 sm:mt-8 font-heading text-3xl sm:text-4xl font-bold uppercase text-foreground">
Expand Down
6 changes: 3 additions & 3 deletions pnpm-workspace.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
packages:
- '.'

ignoredBuiltDependencies:
- sharp
- unrs-resolver
allowBuilds:
sharp: true
unrs-resolver: true
84 changes: 84 additions & 0 deletions src/components/mdx/MilestoneCard/MilestoneCard.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
'use client';

import { ArrowRight, Award, Calendar, Mic, Rocket, Sparkles, TrendingUp } from 'lucide-react';
import { cn } from '@/lib/utils';
import type { MilestoneCardProps, MilestoneKind } from './MilestoneCard.types';

const kindConfig: Record<MilestoneKind, { label: string; Icon: typeof TrendingUp }> = {
promotion: { label: 'Promotion', Icon: TrendingUp },
award: { label: 'Award', Icon: Award },
launch: { label: 'Launch', Icon: Rocket },
talk: { label: 'Talk', Icon: Mic },
milestone: { label: 'Milestone', Icon: Sparkles },
};

/**
* MilestoneCard Component - Career milestone callout
* Neo-Brutalist visual for a single career event: promotion, award, launch, talk.
* Optional FROM → TO transition row makes it especially fit for promotions.
* Slim layout: header strip + title row + optional transition + optional highlights.
*/
export function MilestoneCard({
title,
subtitle,
kind = 'milestone',
date,
from,
to,
highlights,
className,
}: MilestoneCardProps) {
const { label, Icon } = kindConfig[kind];

return (
<div
className={cn(
'my-8 overflow-hidden rounded-none border-[4px] border-foreground bg-bg-elevated shadow-[8px_8px_0px_0px] shadow-black',
className
)}
>
<div className="flex items-center gap-2 border-b-[4px] border-foreground bg-secondary px-4 py-2">
<Icon size={14} className="text-secondary-text" strokeWidth={3} />
<span className="font-mono text-[10px] font-bold uppercase tracking-widest text-secondary-text">
{label}
</span>
{date && (
<span className="ml-auto inline-flex items-center gap-1 font-mono text-[10px] font-bold uppercase tracking-widest text-secondary-text">
<Calendar size={11} strokeWidth={3} />
{date}
</span>
)}
</div>

<div className="p-4 sm:p-5">
<h3 className="font-heading text-lg sm:text-xl font-bold uppercase tracking-tight text-foreground leading-tight">
{title}
</h3>
{subtitle && (
<p className="mt-1 font-mono text-xs uppercase tracking-wider text-muted">{subtitle}</p>
)}

{(from || to) && (
<div className="mt-4 flex flex-wrap items-center gap-2 font-mono text-xs sm:text-sm">
<span className="text-foreground/60 line-through decoration-[2px] decoration-red-500">
{from ?? '—'}
</span>
<ArrowRight size={14} className="text-foreground" strokeWidth={3} />
<span className="font-bold text-foreground">{to ?? '—'}</span>
</div>
)}

{highlights && highlights.length > 0 && (
<ul className="mt-4 space-y-1 font-mono text-xs sm:text-sm">
{highlights.map((item, idx) => (
<li key={idx} className="flex items-start gap-2 text-foreground/90">
<span className="mt-1 inline-block h-1.5 w-1.5 flex-shrink-0 bg-secondary" />
<span className="leading-relaxed">{item}</span>
</li>
))}
</ul>
)}
</div>
</div>
);
}
12 changes: 12 additions & 0 deletions src/components/mdx/MilestoneCard/MilestoneCard.types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
export type MilestoneKind = 'promotion' | 'award' | 'launch' | 'talk' | 'milestone';

export interface MilestoneCardProps {
title: string;
subtitle?: string;
kind?: MilestoneKind;
date?: string;
from?: string;
to?: string;
highlights?: string[];
className?: string;
}
2 changes: 2 additions & 0 deletions src/components/mdx/MilestoneCard/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export { MilestoneCard } from './MilestoneCard';
export type { MilestoneCardProps, MilestoneKind } from './MilestoneCard.types';
2 changes: 2 additions & 0 deletions src/components/mdx/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,5 @@ export { ProcessFlow } from './ProcessFlow';
export type { ProcessFlowProps, ProcessStep } from './ProcessFlow';
export { StatBlock } from './StatBlock';
export type { StatBlockProps, Stat } from './StatBlock';
export { MilestoneCard } from './MilestoneCard';
export type { MilestoneCardProps, MilestoneKind } from './MilestoneCard';
60 changes: 49 additions & 11 deletions src/content/projects/recurly.mdx
Original file line number Diff line number Diff line change
@@ -1,25 +1,39 @@
---
title: "Software Engineer II at Recurly"
description: "Building Recurly Commerce, a subscription management platform integrated with Shopify for recurring revenue businesses"
publishedAt: "2025-07-01"
title: 'Senior Software Engineer at Recurly'
description: 'Building Recurly Commerce, a subscription management platform integrated with Shopify for recurring revenue businesses. Promoted to Senior Software Engineer in May 2026.'
publishedAt: '2025-07-01'
current: true
category: "current"
tags: ["shopify", "subscriptions", "saas", "ecommerce", "fullstack"]
category: 'current'
tags: ['shopify', 'subscriptions', 'saas', 'ecommerce', 'fullstack']
featured: true
type: 'experience'
author: "Esteban Estrada"
thumbnail: "/images/projects/recurly.jpg"
author: 'Esteban Estrada'
thumbnail: '/images/projects/recurly.jpg'
---

# Software Engineer II at Recurly
# Senior Software Engineer at Recurly

Currently working at Recurly as a Software Engineer II, focused on building and enhancing **Recurly Commerce**, a subscription management platform that helps Shopify merchants manage recurring revenue through subscriptions, memberships, and subscription boxes.
Currently working at Recurly as a **Senior Software Engineer**, focused on building and enhancing **Recurly Commerce**, a subscription management platform that helps Shopify merchants manage recurring revenue through subscriptions, memberships, and subscription boxes.

<MilestoneCard
kind="promotion"
title="Promoted to Senior Software Engineer"
subtitle="Recurly · Recurly Commerce"
date="May 2026"
from="Software Engineer II"
to="Senior Software Engineer"
highlights={[
'Owning end-to-end delivery on Shopify checkout and customer-portal features',
'Driving architectural decisions across the subscription lifecycle layer',
'Mentoring teammates and raising the floor on review quality',
]}
/>

## Experience Overview

- **Company**: Recurly
- **Role**: Software Engineer II
- **Timeline**: July 2025 - Present (8 months)
- **Role**: Senior Software Engineer _(promoted from Software Engineer II, May 2026)_
- **Timeline**: July 2025 - Present
- **Location**: Medellín, Antioquia, Colombia
- **Product**: Recurly Commerce (Shopify Subscription Platform)
- **Tech Stack**: Full-stack web development, Shopify API, Payment Processing
Expand All @@ -39,41 +53,47 @@ The platform integrates directly into Shopify's native checkout experience and p
## Key Responsibilities

### Shopify Integration Development

- Building and maintaining Shopify app extensions (checkout and customer account integrations)
- Developing seamless integration between Recurly Commerce and Shopify's native checkout
- Implementing webhook handlers for Shopify events (orders, products, customers)
- Ensuring compliance with Shopify API rate limits and best practices
- Working with Shopify's GraphQL Admin API for store data access

### Subscription Management Features

- Developing subscription lifecycle management (create, pause, skip, cancel)
- Building bundle configuration systems (gift boxes, fixed bundles, customizable options)
- Implementing pricing models (subscribe and save, tiered pricing, usage-based)
- Creating trial period functionality and promotional pricing
- Developing subscription modification flows (swaps, add-ons, upgrades/downgrades)

### Customer Portal Development

- Building low-code customer portal for subscription self-service
- Implementing skip and swap functionality for subscription flexibility
- Creating gift subscription management features
- Developing subscription preference controls
- Ensuring mobile-responsive portal experience

### Payment Processing & Billing

- Working with payment processing pipelines for recurring billing
- Implementing retry logic for failed payments
- Developing dunning management for recovering failed charges
- Creating invoice generation and management systems
- Handling proration calculations for subscription changes

### Analytics & Reporting

- Building analytics dashboards for merchant insights
- Implementing metrics tracking (MRR, churn rate, LTV)
- Creating executive reporting features
- Developing data export capabilities
- Integrating with third-party analytics platforms (Klaviyo, Fivetran)

### Churn Reduction Features

- Developing retention tools (pause subscriptions, incentives)
- Building cancellation flow optimizations
- Implementing win-back campaigns and offers
Expand All @@ -83,39 +103,47 @@ The platform integrates directly into Shopify's native checkout experience and p
## Key Challenges & Solutions

### Challenge 1: Shopify API Rate Limiting

**Problem**: High-volume operations (bulk imports, sync operations) hitting Shopify API rate limits.

**Solution**:

- Implemented request queuing with exponential backoff
- Built batch processing for bulk operations
- Added caching layer for frequently accessed data
- Created monitoring and alerting for rate limit proximity
- Optimized API calls to use bulk operations where possible

### Challenge 2: Subscription State Synchronization

**Problem**: Keeping subscription state consistent between Recurly Commerce and Shopify (orders, inventory, customer data).

**Solution**:

- Implemented event-driven architecture with webhooks
- Built idempotent webhook handlers to prevent duplicate processing
- Created conflict resolution strategies for out-of-sync states
- Added sync status tracking and manual reconciliation tools
- Implemented retry mechanisms with dead letter queues

### Challenge 3: Complex Pricing Calculations

**Problem**: Handling various pricing models (tiered pricing, promotions, trials, proration) with correct tax calculations.

**Solution**:

- Built comprehensive pricing engine with rule-based calculations
- Implemented preview functionality for subscription changes
- Created extensive test coverage for pricing scenarios
- Integrated with Shopify's tax calculation APIs
- Documented pricing logic for support team reference

### Challenge 4: Checkout Extension Performance

**Problem**: Checkout extensions need to load fast to not impact conversion rates.

**Solution**:

- Optimized bundle size for checkout extensions
- Implemented lazy loading for non-critical features
- Added performance monitoring and alerting
Expand All @@ -125,6 +153,7 @@ The platform integrates directly into Shopify's native checkout experience and p
## Skills Developed

**Technical Skills**:

- Shopify app development and ecosystem
- Subscription billing system architecture
- Payment processing and PCI compliance
Expand All @@ -133,20 +162,23 @@ The platform integrates directly into Shopify's native checkout experience and p
- Multi-tenant SaaS architecture

**Domain Knowledge**:

- Subscription business models and metrics (MRR, churn, LTV)
- E-commerce best practices
- Recurring payment processing
- Merchant onboarding flows
- Customer retention strategies

**Tools & Platforms**:

- Shopify Admin API (GraphQL & REST)
- Shopify App Extensions
- Third-party integrations (Klaviyo, Postscript, Gorgias)
- Payment gateway integrations
- Analytics platforms

**Soft Skills**:

- Working on a product used by thousands of merchants
- Balancing merchant needs with platform scalability
- Cross-functional collaboration with product, design, and support teams
Expand All @@ -156,18 +188,21 @@ The platform integrates directly into Shopify's native checkout experience and p
## Impact & Results

### Platform Performance

- Maintaining high availability for subscription processing (critical for recurring revenue)
- Fast checkout extension load times to prevent conversion drop-off
- Reliable webhook processing for real-time sync
- Scalable architecture handling thousands of subscription operations daily

### Merchant Experience

- Simplified subscription setup process for new merchants
- Intuitive admin interface for managing subscriptions
- Comprehensive analytics for business insights
- Flexible subscription options to match various business models

### Customer Experience

- Seamless Shopify-native checkout experience
- Easy-to-use customer portal for subscription management
- Reliable subscription deliveries and billing
Expand All @@ -176,20 +211,23 @@ The platform integrates directly into Shopify's native checkout experience and p
## Technical Highlights

**Shopify Integration Architecture**:

- OAuth 2.0 authentication for merchant stores
- Webhook subscriptions for real-time updates
- App extensions embedded in Shopify admin and checkout
- Theme app extensions for storefront integration
- Metafield management for subscription data

**Subscription Engine**:

- Recurring billing scheduler with timezone handling
- Subscription lifecycle state machine
- Flexible pricing rule engine
- Inventory allocation for upcoming orders
- Automated notification system

**Third-Party Integrations**:

- Klaviyo for email marketing automation
- Postscript for SMS notifications
- Gorgias for customer support context
Expand Down
Loading