Constant Contact
Almost four years on the Internal Services team of an email marketing platform, responsible for the core Rails API: the service that orchestrates the microservices customers use to create, schedule and send their campaigns. At the same time I built React and TypeScript views on top of that same API.
WHAT I BUILT
01Core API of the ecosystemOrchestrates ~10 independent microservices.
The Rails API wasn’t the source of truth: it was the backbone that orchestrated the other services and held the campaign logic. Around it were the email delivery service, segments in Snowflake queried through Elasticsearch, per-contact product recommendations, reports and analytics, contact imports and DNS configuration. With the team, I kept it up to date, fixed failures and improved it for four years.
02Campaign logicFrom segment to send to stats.
Segment creation and import, campaign scheduling and sending, open and click tracking, stats and revenue calculation, and event-based automations, such as sending an email 30 days after a contact buys a product. The largest campaigns went to more than 3 million recipients per send, so any failure had a wide impact.
03Cross-service failuresShared state and silent errors.
I coordinated multi-step flows across services: passing state between them and handling partial failures, when one step succeeds and the next does not. A recurring case: when the service that updated contact status in Snowflake went down, the error spread silently to other parts of the platform. Our job was to fix the data, fix the cause and keep it from happening again.
04Contact imports and domainsOnline stores, files and DNS.
Customers brought their contacts from Shopify, WooCommerce or their own platforms, or imported them as files through AWS EFS. We also maintained the DNS setup that let each customer send campaigns from their own company domain.
05Anomaly detectionPython and Prophet integrated with the backend.
A Python tool built on Facebook Prophet and integrated with the Rails backend that learns each customer’s normal pattern of errors and contact-file imports (for example, daily or every three days) and flags deviations, such as a customer who stops importing, so the team can reach out before it becomes a problem.
06On-call and supportPagerDuty, one week out of eight.
The Internal Services team handled customer cases, bugs and production incidents while working through a backlog of customer-requested features. I was on the PagerDuty on-call rotation: one 24/7 week every eight weeks.
07React and TypeScript interfaceAnalytics, settings and the campaign editor.
I built and maintained views of the main application on top of the team’s own APIs: the analytics section with aggregated campaign performance (opens, reads, clicks), the account and product settings screens, and new campaign editor parameters wired end to end from API to UI.