Marketing Automation App Development

Build custom app solutions with Scrums.com's expert development team. With an NPS (Net Promoter Score) of 82, Scrums.com crafts cost-effective, custom applications that drive results.

Marketing automation platforms are workflow engines with a marketing user interface on top. The engineering complexity is not in the email send; delivery infrastructure is a commodity. It is in the workflow execution layer: state machines that track where each contact is in a journey, evaluate branching conditions in real time, handle re-entry and exit logic correctly, and do this reliably across millions of simultaneous enrolments without missing a trigger or duplicating a send. Scrums.com builds dedicated engineering teams for MarTech companies and SaaS platforms building marketing automation engines from scratch or rebuilding a legacy automation layer that cannot scale.

Workflow Engine Architecture

The workflow engine is the core of a marketing automation platform. It must represent arbitrary directed acyclic graphs of triggers, conditions, and actions; execute steps in order with correct branching logic; persist state durably so that workflows survive process restarts; and handle delays (wait for 3 days, wait until Monday 9am in the contact's timezone) without holding an active thread.

Workflow definitions are stored as configuration data (JSON or YAML DAG definitions), not compiled code. A workflow record specifies: entry trigger (form submitted, tag added, score threshold crossed), steps (send email, wait N days, evaluate condition, add to list, notify sales), and exit conditions (goal achieved, manual removal, disqualification trigger). When a contact enters a workflow, a workflow_enrolment record is created. The current step position is stored on the enrolment record; the workflow definition itself is never mutated.

Step execution uses a durable workflow orchestrator (Temporal is the reference implementation) or a purpose-built state machine backed by a workflow_step_queue. Wait steps create a scheduled job (Redis sorted set keyed by enrolment_id, scored by the wake time in Unix timestamp) rather than blocking a thread. The scheduler polls for due enrolments and resumes them. This architecture supports millions of concurrent enrolments without proportional thread count.

Branching conditions are evaluated at runtime against the contact's current attribute values, not at enrolment time. This means that a condition branch checking whether a contact is a paid subscriber reflects their current subscription status at the moment they reach that step. A configuration option to snapshot contact attributes at enrolment time is available for workflows where point-in-time evaluation is required.

Lead Scoring and Contact Lifecycle Management

Lead scoring translates diverse contact signals into a single number that sales teams use to prioritise outreach. Getting the scoring model wrong wastes sales capacity on low-intent contacts or under-prioritises high-intent contacts who disengage while waiting for follow-up.

Scoring is implemented as a rules engine: each rule defines a signal (email opened, page visited, form submitted, job title contains "Director", company size above 200), a score delta (positive for intent signals, negative for disqualification signals), and an optional decay function (email open scores decay 50% over 30 days to prevent old activity from inflating current intent). Rules are stored as configuration data. The composite score is a projection over the contact's event history evaluated against the active ruleset at query time, not a pre-aggregated field. This means that changing the scoring model retroactively re-scores all contacts against the new rules without data migration.

Contact lifecycle stages (subscriber, lead, MQL, SQL, opportunity, customer, churned) are stored as an append-only lifecycle_events log, not as a status field. Lifecycle progression rules are configured in the workflow engine: when a contact's score crosses the MQL threshold, a lifecycle_event is emitted, which triggers a notification workflow for the assigned sales rep. Regression (SQL back to MQL after a deal is lost) creates a new lifecycle event rather than overwriting the previous stage, preserving the full history.

Suppression logic is applied at the delivery layer, not the workflow layer. A contact who has unsubscribed continues to progress through the workflow state machine but all delivery actions are intercepted by the suppression check. This design keeps the workflow history complete for analytics while enforcing communication compliance. The suppression check is atomic with the send action, not a pre-flight check that could be bypassed by a race condition.

Marketing automation platforms like these are built and delivered by dedicated engineering teams through our mobile app development service.

Trigger Architecture and Real-Time Event Processing

Triggers are the entry points into marketing automation workflows. They must fire reliably, fire exactly once (or at-least-once with idempotent processing), and fire with low latency for time-sensitive workflows (a welcome email triggered by a sign-up event must arrive within seconds, not minutes).

Events that trigger workflows are emitted as messages to a Kafka topic (or equivalent: SQS, Google Pub/Sub). Each event carries a contact_id, event type, timestamp, and a deduplication_key (typically contact_id + event_type + event_timestamp truncated to minute). A Kafka consumer group processes events and evaluates which workflows have a matching entry trigger. The deduplication_key is checked against a processed_triggers table before processing; duplicate events (from retry logic or double-firing pixels) are discarded. This ensures at-least-once delivery from the event bus combined with idempotent processing produces exactly-once workflow enrolments.

Re-entry logic is a critical edge case. A workflow configured with allow_re_entry: false must check whether the contact has an active or completed enrolment before creating a new one. The check and enrolment creation are performed inside a serialisable-isolation transaction to prevent race conditions where two simultaneous events for the same contact both pass the re-entry check and create duplicate enrolments.

Web behaviour tracking feeds triggers via a first-party tracking endpoint: a JavaScript snippet posts page views and custom events to a collection endpoint, which emits them to the trigger event bus. The tracking endpoint respects the contact's consent categories: contacts who have not consented to marketing tracking emit events that are stored but not processed for workflow triggering.

Automation Analytics and Performance Measurement

Marketing automation analytics has two distinct use cases that should not be served by the same data layer. Operational analytics (is this workflow running correctly? are emails delivering?) must be low-latency and always current. Strategic analytics (which workflows drive the most pipeline? what is the time-to-MQL for contacts who enter this journey?) can tolerate a few hours of lag and benefit from warehouse-scale computation.

Operational metrics are maintained as materialised counters per workflow step: enrolments, completions, exits (goal-achieved vs timed-out vs manually removed), email send/open/click rates. These counters are updated by the workflow execution layer via event-driven counter increments (Redis or ClickHouse for real-time aggregation). The workflow builder UI reads these counters directly for in-product reporting.

Strategic metrics are computed as dbt models in the data warehouse: time-in-stage distributions (how long does it take contacts to move from MQL to SQL for contacts who entered via workflow X vs workflow Y?), workflow-to-revenue attribution (which journey touch points appear most often in the paths of contacts who converted?), and cohort analysis. These models run nightly and are exposed via a BI layer.

A/B testing on workflows (send the welcome email immediately vs wait 1 hour) uses deterministic hash variant assignment at enrolment time (contact_id + experiment_id modulo variant_count), SPRT sequential testing for early stopping, and holdout groups defined at workflow configuration time. Test results are materialised in the warehouse alongside other strategic metrics.

Ready to build a marketing automation platform that scales? Start a conversation with Scrums.com or explore our dedicated team model.

Frequently Asked Questions

How do you handle timezone-aware wait steps at scale: for example, "send this email at 9am in the contact's local timezone"?

Each contact record stores a timezone attribute (IANA timezone identifier, e.g. "America/New_York"). When a workflow step schedules a "send at 9am local time" action, the scheduler converts 9am in the contact's timezone to a UTC timestamp and stores it as the wake time in the sorted set. Contacts without a stored timezone fall back to a configurable default. Timezone updates do not retroactively adjust already-scheduled wake times; they apply to steps that have not yet been scheduled. The wake time calculation uses a timezone library that correctly handles DST transitions: a contact in New York scheduled for 9am during a DST change receives the send at 9am local time, not 8am or 10am UTC offset.

What prevents a high-volume trigger event from overwhelming the workflow engine?

The trigger event bus (Kafka) decouples event production from workflow processing. The workflow engine consumer group has a configurable concurrency cap per workflow, so a viral event that triggers 500,000 enrolments within a minute does not spin up 500,000 concurrent execution threads; it queues them and processes them at a rate the execution infrastructure can handle. Priority queues separate time-sensitive triggers (sign-up events, purchase confirmations) from bulk triggers (marketing list imports) so that sign-up welcome emails are processed in near-real-time even during a bulk import. The pending_enrolments queue depth is a monitored SLA metric with an alert threshold.

How do you correctly handle a contact who is simultaneously enrolled in multiple workflows that could send conflicting communications?

Contact communication frequency capping is implemented as a shared state per contact: a contact_send_log table records every outbound communication attempt (channel, timestamp, workflow_id). Before any delivery action executes, the workflow engine checks the send log against the contact's configured frequency cap (maximum 1 email per day, maximum 3 emails per week). If the cap is reached, the delivery action is skipped (not re-queued) and a send_suppressed_frequency_cap event is recorded. Workflow designers can configure per-workflow priority levels so that transactional or high-priority workflows override the frequency cap for their send actions.

Want to Know if Scrums.com is a Good Fit for Your Business?

Get in touch and let us answer all your questions.

Get started

Don't Just Take Our Word for It

Hear from some of our amazing customers who are building with Scrums.com Teams.

"Scrums.com has been a long-term partner of OneCart. You have a great understanding of our business, our culture and have helped us find some real tech rockstars. Our Scrums.com team members are high-impact, hard working, always available, and fun to have around. Thanks a million!"
CTO, OneCart
On-demand marketplace connecting users and top retailers
"The Scrums.com Team is always ready to take my call and assist me with my unique challenges. No problem is to big or small. Great partner, securing strong talent to support our teams."
CIO, Network
Leading digital payments provider
"Finding great developers through Scrums.com is easier than explaining to my mom what I do for a living. Over the past couple of years, their top-tier devs and QAs have plugged seamlessly into Payfast by Network, turbo-charging our sprints without a hitch."
Engineering Manager, PayFast by Network
A secure digital payment processor for online businesses
"Our project was incredibly successful thanks to the guidance and professionalism of the Scrums.com teams. We were supported throughout the robust and purpose-driven process, and clear channels for open communication were established. The Scrums.com team often pre-empted and identified solutions and enhancements to our project, going over and above to make it a success."
CX Expert, Volkswagen Financial Services
Handles insurance, fleet and leasing
"The Scrums.com teams are extremely professional and a pleasure to work with. Open communication channels and commitment to deliver against deadlines ensures successful delivery against requirements. Their willingness to go beyond what is required and technical expertise resulted in a world class product that we are extremely proud to take to market."
Product Manager, BankservAfrica
Africa's largest clearing house
“Scrums.com Team Subscriptions allow us to easily move between tiers and as our needs have evolved, it has been incredibly convenient to adjust the subscription to meet our demands. This flexibility has been a game-changer for our business. Over and above this, one of their key strengths is the amazing team members who have brought passion and creativity to our project, with enthusiasm and commitment. They have been a joy to work with and I look forward to the continued partnership.”
CEO & Co-Founder, Ikue
World's first CDP for telcos
“Since partnering with Scrums.com in 2022, our experience has been nothing short of transformative. From day one, Scrums.com hasn't just been a service provider; they've become an integral part of our team. Despite the physical distance, their presence feels as close and accessible as if they were located in the office next door. This sense of proximity is not just geographical but extends deeply into how they have seamlessly integrated with our company's culture and identity.”
SOS Team, Skole
Helping 60k kids learn, every day
"Scrums.com joined Shout-It-Now on our mission to empower young women in South Africa to reduce the rates of HIV, GBV and unwanted pregnancy. By developing iSHOUT!, an app exclusively for young women, and Chomi, a multilingual GBV chatbot, they have contributed to the critical task of getting information & support to those who need it most. Scrums.com continues to be our collaborative partner on the vital journey."
CX Expert, iShout
Empowering the youth of tomorrow
"Scrums.com has been Aesara Partner's tech provider for the past few years; and with the development support provided by the Scrums.com team, our various platforms have evolved. Throughout the developing journey, Scrums.com has been able to provide us with a team to match our needs for that point in time."
Founder, Aesara Partners
A global transformation practice

Find Related App Types

Remote Work app

E-Commerce Platform App

Credit Management App

Stock market app

Courier Delivery App

Payment Processing app