Let's talk about your project
Tell us your email use case -- transactional, onboarding, behavioural, or reporting. We'll scope the system and give you a fixed cost.
Manual email processes don't scale with your business. Transactional emails that require someone to send them, onboarding sequences that run inconsistently, follow-up emails that get forgotten, and reporting emails that take staff hours to assemble -- all of these are automation problems. We build email automation systems that send the right email at the right time based on what happens in your product and your business -- without anyone having to remember to do it.
Recent outcomes
Voice AI · Research
Text-based interviews converted to automated phone calls
6× deeper insightsAI Automation · Ops
Manual invoice OCR across 40+ gas stations
20k+ txns day oneLoyalty · Retail
SuperValu & Centra loyalty platform with receipt validation
1,062 users in 4 weeksSaaS · Logistics
Multi-carrier shipping hub for Indonesian eCommerce
2,000+ shipments yr 1RaftLabs builds email automation systems for businesses -- transactional email infrastructure, event-triggered behavioural sequences, onboarding workflows, follow-up automation, and automated reporting emails. Email automation ensures consistent communication at every stage of the customer lifecycle without manual execution. Most email automation projects deliver in 6--12 weeks at a fixed cost with full source code ownership.
Trusted by
The order confirmation sent by a team member who is on leave. The onboarding email that depends on a sales rep to trigger it. The weekly report assembled in a spreadsheet by someone who is juggling other priorities. When the person responsible is unavailable, the email doesn't go out.
Email automation turns process reliability into a software problem. Software doesn't take sick days.
Capabilities
Reliable transactional email delivery infrastructure for every system-triggered message your product sends: password resets, email address verification, order confirmations, payment receipts, payment failure notifications, account change confirmations (email address updated, password changed), subscription upgrade/downgrade confirmations, and system alert notifications. We build on the sending platforms your business needs -- SendGrid Mail Send API v3 (SMTP or REST), Mailgun API v3, Amazon SES (v2 API or SMTP endpoint), Postmark, and Resend -- with the right platform selected based on your volume, deliverability requirements, and existing infrastructure. DNS configuration is treated as a prerequisite, not an afterthought: SPF TXT record listing all authorised sending sources, DKIM 2048-bit RSA key pair with signing configured on the sending platform and the TXT record published on the sending subdomain, DMARC policy configured at p=quarantine or p=reject with an aggregate reporting address (rua) so you receive weekly RUA reports showing pass/fail rates and any spoofing attempts. Dedicated sending subdomain (transactional.yourdomain.com separate from your marketing subdomain) prevents marketing bounce and complaint rates from affecting transactional deliverability. Bounce handling: hard bounces (permanent delivery failures) automatically added to the suppression list so they are never retried; soft bounce handling configured per ESP (SendGrid's bounce groups, Mailgun's bounces API, SES bounce SNS notification) with retry policy per soft bounce code. Complaint handling: spam complaints from ISP feedback loops processed via SendGrid's spam report webhook or SES complaint SNS notification and suppressed immediately. Delivery monitoring: hourly delivery rate and bounce rate tracking with alert when bounce rate exceeds 2% or complaint rate exceeds 0.1% -- the thresholds that trigger ESP-level sending restrictions. Email volume scaling: SES sending limits increased via AWS Support request; SendGrid IP pools added for high-volume senders.
Onboarding email sequences triggered by user sign-up events and in-product behaviour milestones -- not by a salesperson remembering to send them. Sign-up trigger fires the welcome email within 60 seconds of account creation, confirmed by a webhook from your authentication system (Auth0 post-registration action, Firebase Cloud Function on user creation, Cognito post-confirmation Lambda trigger, or a direct API call from your registration endpoint). Welcome email sets context, states the single most valuable next action, and links directly to the completion step -- not to the product home page. Day-1 email (sent 24 hours after sign-up if activation step not completed): reminder with a different frame, link to the same activation step, and a low-friction support path (reply to this email or book a call). Activation milestone emails: when the user completes a key setup step (connected integration, created first project, invited team member, published first item), the sequence detects the event and sends a confirmation email acknowledging the progress and pointing to the next step -- advancement emails for users who are progressing, not just nudges for users who are stuck. Feature introduction emails: sent at day 3, day 7, and day 14, each introducing one capability matched to where the user is in the activation flow, not a generic product tour. Branching logic: users who complete activation before a scheduled nudge have that nudge suppressed -- the sequence checks completion state before each send, not just at enrolment. Exit conditions: user completes full activation (sequence exits to success track), user upgrades to paid plan (sequence exits to customer onboarding track), user explicitly unsubscribes (suppressed). Personalisation data pulled from your user record at send time: first name, company name, plan type, signup source, the specific feature or use case they selected during signup -- emails that feel written for the user, not for a generic new sign-up cohort.
Emails triggered by specific product events or data conditions -- not by a calendar date -- using your product's event stream as the primary trigger source. Event triggers consumed via webhook (POST to a receiver endpoint), message queue (SQS, Pub/Sub, RabbitMQ), or direct database query on a schedule. Trigger types built: feature limit warnings (user reaches 80% of plan limit -- email warns before they hit the wall, not after; at 100% hit -- email explains the specific limit and presents the upgrade path with the correct plan tier highlighted); re-engagement for dormant users (last login date queried against your users table on a daily schedule -- users inactive for 7, 14, or 30 days receive a re-engagement email with a specific hook referencing their usage history rather than a generic "we miss you" message); upsell signals (usage pattern events -- user runs the same action 5+ times in a week, user invites 3+ team members, user creates more than N items -- indicate upsell readiness; email sent within the same session window is 4-6x more likely to convert than a batch-scheduled equivalent); session-based cart abandonment or checkout interruption (e-commerce or subscription checkout left incomplete -- email within 60 minutes with the specific items or plan in the cart); account risk warnings (user has not set up a backup email or MFA, subscription payment method expiring in 14 days, account storage nearing limit). Inaction triggers: scheduled query checks for users who signed up more than 48 hours ago and have not completed a key step -- triggered by absence of an event, not presence. Frequency capping: configurable maximum emails per user per 7-day window across all behavioural triggers combined -- prevents a user hitting a limit, triggering re-engagement, and being mid-sequence all at once from receiving multiple emails the same day. Suppress on conversion: every behavioural sequence checks whether the conversion event occurred before each send in the sequence, suppressing remaining emails when the goal is achieved.
Automated follow-up sequences for leads and prospects triggered by the lead's own actions -- form submission, demo booking, trial sign-up, or a qualifying product usage signal -- rather than requiring a sales rep to notice and act. Trigger-to-first-email time targeted under 5 minutes for leads generated during business hours; the first email confirms receipt, sets expectations, and presents immediate value before the lead's attention shifts elsewhere. Sequence structure for inbound leads: email 1 (0--5 min) -- confirmation and value hook; email 2 (day 1, if no reply) -- adds specific detail, proof point, or relevant case study matched to the lead's industry or stated use case; email 3 (day 3, if no reply) -- a different angle (ROI, risk, or process framing) with a lower-commitment CTA (a short article or resource rather than a meeting request); email 4 (day 7, if no reply) -- final touch with a specific question or observation. Reply detection: outbound emails sent via an SMTP address with a reply-monitored inbox; inbound replies detected via IMAP polling every 5 minutes (SendGrid Inbound Parse, Mailgun's Routes, or a dedicated inbox monitored via Gmail API / Microsoft Graph API); on reply detection, the sequence is paused immediately and the lead record in CRM is updated. CRM integration: lead status updated via Salesforce REST API, HubSpot Contacts API, Pipedrive Deals API, or Zoho CRM; all automated emails logged as activities on the lead record with the email subject, send timestamp, and engagement status (delivered, opened, clicked); CRM contact properties updated on open/click events so sales reps see engagement history. A/B variant support: subject line variants and first-sentence variants tested with configurable split percentages; winning variant auto-selected after statistically significant sample size (minimum 50 opens per variant before winner declared). Sequence enrolment deduplication: lead enrolled in a sequence only once; if they re-submit a form, the system checks for an active sequence and either skips re-enrolment or restarts from the beginning depending on the configured deduplication rule.
Subscription lifecycle email automation covering the renewal, payment failure, and churn recovery phases -- the highest-revenue-impact automations for any subscription business. Renewal reminders triggered by subscription end date: 30-day reminder (informational, no urgency), 14-day reminder (introduces the renewal process and any pricing changes), 7-day reminder (direct renewal CTA with the specific subscription being renewed and the amount), 3-day reminder (urgency framing), 1-day reminder (final call with support contact for renewal issues). For annual subscriptions, a 60-day reminder is added giving the account manager lead time for renewal negotiation. Subscription data pulled from Stripe (Stripe Webhooks on customer.subscription events + Stripe Billing Portal URL), Chargebee (Chargebee Webhooks + hosted page URL), Recurly (Recurly Push Notifications), or Zuora (Zuora Event Notifications) -- the sequence is tied to the actual subscription record, not a manually maintained spreadsheet. Dunning sequences for failed payments: payment_failed webhook from the billing platform triggers the dunning sequence immediately with the specific card that failed highlighted; retry schedule aligned to your billing platform's automatic retry cadence (Stripe Smart Retries, Chargebee Retry Logic) so emails don't arrive the day after a retry already succeeded; emails at 1, 3, 7, and 14 days after first failure with escalating urgency; card update link embedded in every dunning email (Stripe customer portal, Chargebee self-serve portal, or a custom payment update page with pre-populated card form); sequence exits on successful payment detected via payment_intent.succeeded or invoice.paid webhook. Account grace period logic: service access continued for a configurable grace period (3-7 days post-failure) to prevent churn caused by card updates that are in progress -- email sequence communicates the grace period end date explicitly. Win-back sequences for churned users: triggered 3 days after subscription cancellation or non-renewal (gives the churn a chance to be a data error before messaging); email 1 -- an honest acknowledgement with a specific question about the reason for leaving (reply-monitored); email 2 (day 10) -- a product update or use case that addresses the most common churn reason for this user segment; email 3 (day 21) -- a time-limited reactivation offer if the churn reason warrants one.
Scheduled and threshold-triggered emails that assemble live data from your systems and deliver formatted reports to the right recipients -- replacing the manual process of querying a database, formatting numbers in a spreadsheet, and copy-pasting into an email that one person on your team does every Monday morning. Data source integrations: direct PostgreSQL/MySQL/SQL Server queries with parameterised queries per report (no raw SQL in email templates -- queries are version-controlled, reviewed, and tested); REST API polling from your analytics platform (Amplitude, Mixpanel, Google Analytics GA4 Data API, Looker API, Metabase API); third-party service APIs (Stripe API for revenue metrics, HubSpot Reporting API for pipeline metrics, Salesforce Reports API for sales metrics). Report types built: weekly KPI digest (7 metrics with current value, prior period value, and change direction rendered in a clean HTML table with inline conditional formatting -- green for positive trends, amber for within 5% of target, red for misses); daily exception reports (operational anomalies surfaced -- orders not fulfilled within SLA, tickets open beyond target, accounts past due above a threshold -- with direct links to each item in the operational system); monthly executive summary (narrative + data assembled from multiple sources with a consistent format every month, sent to a distribution list from the reporting system rather than from a team member's personal email); threshold alert emails (metric crosses a configurable threshold -- revenue below daily run rate target, error rate above 1%, queue depth above 500 -- email sent immediately with the current value, the threshold, the chart for the past 24 hours, and the relevant dashboard link). Email rendering: HTML email templates built on responsive layouts (MJML or Litmus Email Foundation) tested across Gmail, Outlook 2016+, Apple Mail, and mobile clients; inline CSS for Outlook compatibility; fallback plain-text part included. Scheduling infrastructure: AWS EventBridge cron rules, GCP Cloud Scheduler, or standard cron with a job monitoring system (Cronitor, Healthchecks.io) so missed or failed report jobs generate an alert rather than silently not sending.
Transactional infrastructure, behavioural sequences, and reporting emails that run on your data and your triggers. Fixed cost.
Process
Before a single sequence is built, we establish the DNS and sending infrastructure that determines whether emails reach the inbox or the spam folder. SPF record published on the sending domain listing all authorised sending sources (ESP IPs, your own mail server if applicable, third-party sending services) with -all hard fail; SPF record kept under 10 DNS lookups (the RFC 7208 limit that causes SPF permerror when exceeded). DKIM 2048-bit RSA key pair generated; private key configured in the ESP (SendGrid domain authentication, Mailgun domain verification, SES DKIM identity); public key published as a DNS TXT record on the DKIM selector subdomain; DKIM signing enabled on every outbound message. DMARC policy configured with p=quarantine initially (p=reject after baseline monitoring confirms no legitimate flows are failing); rua aggregate report address configured so daily/weekly RUA XML reports from participating ISPs (Google, Microsoft, Yahoo, AOL) are received and parsed for pass/fail rates and any unauthorised sending sources. Dedicated sending subdomain (e.g. mail.yourdomain.com for transactional, news.yourdomain.com for marketing) keeps each stream's sender reputation separate -- a marketing campaign with elevated bounces cannot damage the transactional subdomain's reputation. New sending domain warm-up: sending volume ramped from 50 emails/day to full volume over 4--6 weeks using a warm-up schedule; ISPs build reputation based on engagement during warm-up, so early sends target the highest-engagement user segments first. IP warm-up for dedicated IP pools at SendGrid or SES when volume warrants dedicated IPs (typically 100K+ emails/month per stream). Bounce and complaint processing wired to suppression lists before the first production send -- there is no scenario where a previously bounced address should receive an email without an explicit re-subscription.
Email sequences are only as reliable as the trigger pipeline feeding them. We build the event integration layer that captures trigger signals from your product and infrastructure and routes them into the email automation system with the reliability guarantees that production systems require. Webhook receiver endpoints: HTTPS endpoints deployed on your infrastructure (Node.js/Fastify, Python/FastAPI, or AWS Lambda function URL) that accept inbound event payloads from your product, your billing platform (Stripe, Chargebee, Paddle), your authentication system (Auth0 post-registration hook, Cognito Lambda trigger), and your CRM (HubSpot workflow webhook action, Salesforce outbound message). Each receiver validates the payload signature (Stripe webhook signature using Stripe-Signature header + HMAC-SHA256; SendGrid event webhook signature; HubSpot signature using X-HubSpot-Signature-V3; Auth0 webhook secret) before processing -- unsigned or incorrectly signed payloads are rejected with a 401. Idempotency controls: every processed event stores a deduplication key (event ID or a hash of the triggering entity ID + event type) in Redis with a 24-hour TTL; duplicate deliveries of the same event (common with at-least-once webhook delivery guarantees) are detected and suppressed before entering the email queue. Event queue processing: incoming events placed on an SQS FIFO queue (or equivalent) for async processing with DLQ configured for events that fail after 3 retries; queue decoupling prevents a spike in trigger events from overwhelming the sending system or causing out-of-order processing. Database-polled triggers for inaction-based sequences: a scheduled job (EventBridge cron, Cloud Scheduler, or pg_cron) queries the database for user records meeting inaction criteria (last_login_at less than 14 days ago, has_completed_activation = false, subscription_status = active); qualifying records are enrolled in the sequence with deduplication to prevent re-enrolment of users already mid-sequence. Rate limiting on event ingestion: configurable maximum enrolments per sequence per hour to prevent a bulk import or a system bug from enrolling thousands of users in a sequence simultaneously.
Email sequence logic defined as version-controlled configuration -- not hard-coded in a sending platform's proprietary drag-and-drop builder that is difficult to audit, test, or migrate. Each sequence is defined with: trigger event type and conditions (fields, values, and operators that qualify an event for enrolment), delay schedule (absolute offsets in hours from enrolment or relative to a date field on the user record such as trial_end_date or renewal_date), branching rules (if user has opened email 1 but not clicked, send variant B of email 2; if user has completed activation_event, skip to advancement branch), and exit conditions (explicit unsubscribe, conversion event received, inactivity period exceeded, manual suppression). Personalisation data fetched at send time -- not at enrolment -- so the email reflects the user's current state: first name, plan type, company name, number of items created, last feature used, support ticket open status, account health score. Template rendering: Handlebars or Jinja2 templating with conditional blocks (show upsell section only if plan = "free") and loop rendering (list of items from a query result); templates stored in version control alongside sequence configuration. Fallback values for all personalisation fields -- missing first_name falls back to "there", missing plan_name falls back to "your account" -- so no email sends with a visible merge tag placeholder. Dynamic subject lines: subject personalised per user segment (users with no activity get urgency framing, users who have been active get feature-focused framing) with the personalisation rule version-controlled. Send-time optimisation: optional per-user send-time selection based on prior email engagement data (if the user's last 5 opens were between 8--10am their local time, schedule the next email in that window); requires timezone data on the user record. Preview and test environment: every sequence can be triggered against a test user record with all branch paths exercised and the rendered HTML inspected before enabling the sequence in production.
Email automation without measurement is email automation without improvement. We build the analytics layer that captures engagement events from the ESP, correlates them with business outcomes, and surfaces the actionable metrics in a dashboard your team can monitor without writing SQL queries. Engagement event pipeline: ESP event webhooks processed in real time (SendGrid Event Webhook, Mailgun Webhooks, SES SNS notifications, Postmark Activity Webhooks) capturing delivered, opened, clicked, bounced, complained, and unsubscribed events per email per user; events stored in a PostgreSQL events table (or BigQuery/Redshift for high-volume senders) with user_id, sequence_id, email_step, event_type, timestamp, and metadata (clicked URL, bounce code, client, device type). Open rate and click rate per sequence step displayed as a funnel: enrolments -- email 1 sent -- email 1 opened -- email 1 clicked -- email 2 sent -- email 2 opened (showing step-level drop-off so under-performing steps are visible). Conversion tracking: goal events (activated, upgraded, paid, completed onboarding) correlated with sequence enrolment and email engagement using a configurable attribution window (7-day or 14-day first-touch); sequence conversion rate = users who completed the goal event within the attribution window / total enrolments. Deliverability monitoring dashboard: daily delivery rate, bounce rate (hard and soft separately), complaint rate, and unsubscribe rate per sending domain and per sequence; alert thresholds configurable (alert when daily complaint rate exceeds 0.08% -- the Gmail threshold that triggers inbox demotion); trend charts showing 30-day history so gradual reputation degradation is visible before it becomes a deliverability crisis. Suppression list monitoring: size of suppression list by category (hard bounce, complaint, manual unsubscribe) tracked over time; unexpected growth in hard bounces flags a data quality issue in the email list source. A/B test reporting: per-variant open rate, click rate, and conversion rate with statistical significance calculation; winner declared when both variants have at least 50 opens and the difference is statistically significant at 95% confidence -- no manual winner selection based on gut feel.
From transactional emails to full lifecycle automation. We build and configure, you own the code.
Business Process Automation -- broader workflow automation
Customer Support Automation -- automated support ticket handling
Reporting Automation -- automated data reports and digests
Invoice Processing Automation -- financial document automation
Document Automation -- automated document generation and processing
Tell us your email use case -- transactional, onboarding, behavioural, or reporting. We'll scope the system and give you a fixed cost.
Frequently asked questions
Email automation is software that sends emails automatically based on triggers -- user actions, time delays, data conditions, or external events. Types we build: (1) Transactional emails -- password resets, order confirmations, payment receipts, account changes. (2) Onboarding sequences -- welcome emails, feature introduction, activation nudges triggered by sign-up and product actions. (3) Behavioural emails -- triggered by specific user actions or inactions in your product. (4) Follow-up sequences -- sales follow-up, churned user win-back, subscription renewal reminders. (5) Reporting emails -- automated digests, performance reports, and alerts assembled from your data and sent on schedule.
We integrate with all major transactional email platforms -- SendGrid, Mailgun, Amazon SES, Postmark, and Resend. For marketing email sequences, we integrate with or build alongside Mailchimp, ActiveCampaign, HubSpot, Klaviyo, and Customer.io. The right platform depends on your email volume, use case mix, and existing tools. We help you choose or work with what you already have.
Deliverability is a system design consideration, not an afterthought. We configure SPF, DKIM, and DMARC DNS records, implement bounce and complaint handling to maintain sender reputation, separate transactional and marketing email streams (different sending IPs and domains), implement list hygiene with automatic suppression of bounced and unsubscribed addresses, and monitor deliverability metrics. Poor deliverability typically comes from poor infrastructure setup and list management, not from content.
A transactional email system -- password reset, order confirmation, and account notification emails with delivery monitoring -- typically runs $8,000--$20,000. A complete onboarding and lifecycle email automation system with 5--10 sequences, product event integration, and analytics runs $20,000--$50,000. Multi-channel systems with email, SMS, and in-app notifications run higher. Cost depends on the number of sequences, the complexity of the trigger logic, and the data integrations required. We scope every project before pricing it.
Work with us
We scope Email Automation Development in 30 minutes. You walk away with a clear cost, timeline, and approach. No commitment required.