AI-Powered Marketing Automation: Beyond Email Drips
Let me tell you what marketing automation looks like at most ecommerce companies in 2026. Someone signs up. They get a welcome email. Three days later, they get an email about bestsellers. A week later, they get a discount code. If they buy, they enter the "post-purchase" sequence. If they don't, they get three more nudges before being marked as "inactive." This is called a drip campaign. It was revolutionary in 2015. In 2026, it's a flowchart pretending to be intelligence. The emails go out on the same schedule regardless of whether the customer is a bargain hunter or a premium buyer. The product recommendations are the same bestsellers shown to everyone. The timing is based on arbitrary delays, not on when this specific customer is most likely to engage. And the discount code? It's cannibalising margin from customers who would have bought at full price anyway. That's not AI-powered marketing. That's a timer with a mailing list. Real AI-powered marketing automation looks fundamentally different. It adjusts prices in real time based on demand, competition, and individual price sensitivity. It recommends products based on each customer's unique behaviour patterns, not just what's popular. It detects when a customer is about to churn and intervenes with the right message through the right channel at the right moment. And it reallocates marketing budget across campaigns autonomously, shifting spend from underperformers to opportunities in real time. This is what I'm building with [GrowCentric.ai](https://growcentric.ai), my marketing optimisation SaaS launching in June 2026. And it's what I implement for ecommerce clients running on Ruby on Rails and [Solidus](https://solidus.io/). Let me show you what's actually possible when you move beyond the drip.
The Problem With "Marketing Automation" in 2026
Here's an uncomfortable truth. Most of what the industry calls "AI-powered marketing automation" in 2026 is marketing automation from 2018 with a language model bolted on top.
The drip sequences are the same. The segmentation logic is the same. The timing rules are the same. The only thing that changed is that the email subject lines are now written by GPT instead of a junior copywriter. That's not a transformation. That's a font change.
Real AI-powered marketing automation is fundamentally different in four ways.
First, it's predictive, not reactive. It doesn't wait for a customer to do something and then respond. It anticipates what the customer is likely to do and positions the right message, price, or product before the customer even knows they want it.
Second, it's individual, not segmented. Traditional automation puts customers in buckets: "high value," "at risk," "new subscriber." AI treats each customer as a unique entity with their own behaviour patterns, preferences, and price sensitivity.
Third, it's continuous, not sequential. Drip campaigns have a beginning and an end. AI-powered systems run perpetually, constantly monitoring, learning, and adjusting in real time.
Fourth, it's autonomous, not rule-based. Someone had to write every rule in your current automation. "If cart value is above 100 euros, offer free shipping." AI learns which interventions work for which customers and applies them without being explicitly programmed for every scenario.
Let me walk through the four areas where this makes the biggest difference.
Dynamic Pricing: The Revenue Lever Most Businesses Ignore
Dynamic pricing is perhaps the most powerful and most misunderstood application of AI in ecommerce. McKinsey research shows that dynamic pricing increases company revenue by an average of 5% without requiring significant capital investment. The dynamic pricing software market is projected to grow from 6.16 billion dollars in 2025 to over 41 billion by 2033, and 55% of retailers plan to implement dynamic pricing AI in 2026.
But let me be very clear about what dynamic pricing is and isn't.
Dynamic pricing is not "surge pricing" that gouges customers during peak demand. That's what gives the practice a bad name. Done properly, dynamic pricing means finding the optimal price point that maximises value for both the business and the customer, adjusting in real time based on demand, competition, inventory, and market conditions.
The core concept is price elasticity: how sensitive demand is to price changes. Some products are highly elastic (customers will switch to a competitor over a 5% price difference). Others are inelastic (customers will pay a premium for convenience, trust, or quality). AI excels at calculating elasticity across different customer segments, product categories, time periods, and market conditions.
Here's what a dynamic pricing system looks like in a Solidus store:
class DynamicPricingEngine
GUARDRAILS = {
min_margin_pct: 15.0,
max_daily_change_pct: 8.0,
max_above_rrp_pct: 5.0,
min_below_competitor_pct: 0.0,
require_approval_above_pct: 15.0
}.freeze
def calculate_optimal_price(variant)
signals = gather_pricing_signals(variant)
base_price = variant.cost_price * (1 + target_margin(variant))
adjustments = [
demand_adjustment(signals[:demand_velocity], signals[:inventory_level]),
competition_adjustment(signals[:competitor_prices], variant.price),
elasticity_adjustment(signals[:price_elasticity], signals[:conversion_rate]),
seasonality_adjustment(signals[:seasonal_index])
]
optimal = base_price * adjustments.reduce(1.0, :*)
constrained = apply_guardrails(variant, optimal)
log_pricing_decision(variant, signals, optimal, constrained)
constrained
end
private
def gather_pricing_signals(variant)
{
demand_velocity: SalesVelocityService.for_variant(variant, period: 7.days),
inventory_level: variant.total_on_hand,
competitor_prices: CompetitorPriceTracker.latest_for(variant.sku),
price_elasticity: ElasticityModel.predict(variant),
conversion_rate: ConversionTracker.rate_for(variant, period: 30.days),
seasonal_index: SeasonalityModel.current_index(variant.product.taxons.first)
}
end
def demand_adjustment(velocity, inventory)
days_of_stock = inventory / [velocity, 0.1].max
if days_of_stock < 7
1.05 # Low stock, slight premium
elsif days_of_stock > 90
0.92 # Excess stock, encourage clearance
else
1.0
end
end
def apply_guardrails(variant, price)
price = [price, variant.cost_price * (1 + GUARDRAILS[:min_margin_pct] / 100.0)].max
price = [price, variant.recommended_retail_price * (1 + GUARDRAILS[:max_above_rrp_pct] / 100.0)].min if variant.recommended_retail_price
daily_change = ((price - variant.price) / variant.price * 100).abs
if daily_change > GUARDRAILS[:max_daily_change_pct]
direction = price > variant.price ? 1 : -1
price = variant.price * (1 + direction * GUARDRAILS[:max_daily_change_pct] / 100.0)
end
price.round(2)
end
end
Notice the guardrails. Minimum margin protection. Maximum daily change cap. RRP ceiling. Every decision logged. This is where most dynamic pricing implementations fail, not in the algorithm, but in the governance. Without guardrails, a pricing algorithm can enter a race to the bottom with competitors, destroy customer trust through volatile prices, or optimise for short-term revenue at the expense of long-term loyalty.
This is also directly relevant to the multi-agent conflict problem I'm solving in GrowCentric.ai. When multiple clients using the same optimisation platform compete on price, the system needs collision detection and equilibrium-seeking behaviour to prevent destructive price wars.
Product Recommendations That Actually Understand Your Customers
Most ecommerce recommendation engines work like this: "Customers who bought X also bought Y." That's collaborative filtering. It was innovative when Amazon popularised it in the early 2000s. In 2026, it's table stakes that's leaving enormous value on the table.
The problem with pure collaborative filtering is that it optimises for popularity, not relevance. It shows you what most people bought, not what you specifically need. It doesn't account for context: the difference between browsing casually on a Tuesday evening and searching urgently for a specific product on a Saturday morning.
Modern AI-powered recommendations combine multiple signals:
Purchase history tells you what the customer has bought before and what they might need next. If they bought a vehicle on Auto-Prammer.at, they'll likely need insurance, accessories, and eventually maintenance. The recommendation engine should know the typical accessory purchasing timeline and serve those suggestions at the right moment.
Browsing behaviour reveals intent. A customer who viewed five different winter tyre listings in the last hour has a very different need from someone casually browsing SUVs. The recommendation engine should recognise the urgency and adjust accordingly.
Session context matters enormously. Time of day, device type, referral source, and navigation patterns all signal what the customer is looking for. Someone arriving from a Google Shopping ad for "BMW 320i winter tyres" needs tyre recommendations, not a BMW 320i listing.
Predictive models anticipate future needs based on patterns. A customer who purchased a vehicle six months ago is approaching their first service interval. One who bought winter tyres last November might need summer tyres in March.
Here's how this looks architecturally in a Solidus store:
class IntelligentRecommendationEngine
def recommendations_for(user, context:, limit: 8)
candidates = generate_candidates(user, context)
scored = score_and_rank(candidates, user, context)
diversified = apply_diversity(scored, limit)
log_recommendations(user, context, diversified)
diversified
end
private
def generate_candidates(user, context)
[
collaborative_candidates(user),
content_based_candidates(user),
sequential_candidates(user),
contextual_candidates(context),
trending_candidates(user.primary_taxon)
].flatten.uniq(&:id)
end
def score_and_rank(candidates, user, context)
candidates.map do |product|
score = RecommendationModel.predict_relevance(
user_features: extract_user_features(user),
product_features: extract_product_features(product),
context_features: extract_context_features(context),
interaction_features: extract_interaction_features(user, product)
)
{ product: product, score: score }
end.sort_by { |r| -r[:score] }
end
def sequential_candidates(user)
last_purchase = user.orders.complete.last
return [] unless last_purchase
days_since = (Date.current - last_purchase.completed_at.to_date).to_i
NextPurchasePredictor.suggest(
purchased_products: last_purchase.line_items.map(&:variant),
days_since_purchase: days_since,
user_segment: user.predicted_segment
)
end
def apply_diversity(scored, limit)
# Prevent recommendations from being all the same category
selected = []
categories_used = Set.new
scored.each do |rec|
category = rec[:product].taxons.first&.id
next if categories_used.size >= 3 && categories_used.include?(category)
selected << rec[:product]
categories_used << category
break if selected.size >= limit
end
selected
end
end
The diversity filter is subtle but important. Without it, recommendation engines tend to show eight variations of the same thing. If a customer looked at winter tyres, a naive engine shows eight winter tyres. A good engine shows four winter tyres plus wheel chains, antifreeze, a car cover, and a battery charger, things the customer actually needs in winter but hasn't thought to search for.
BCG's Personalisation Index found that personalisation leaders grow revenue 10 percentage points faster per year than laggards. Twilio Segment's 2025 CDP report notes a 57% surge in companies using predictive traits for personalisation. This isn't marginal. It's the difference between growing and stagnating.
Predictive Churn Detection: Keeping Customers Before They Leave
Acquiring a new customer costs five to seven times more than retaining an existing one. Improving retention by just 5% can yield profit increases between 25% and 95%. Yet most ecommerce businesses only notice churn after it's happened, when a customer simply stops buying.
Predictive churn detection flips this. Instead of reacting to lost customers, you identify at-risk customers and intervene before they leave.
The signals are usually hiding in data you already have. Declining purchase frequency. Longer gaps between visits. Reduced average order value. Fewer pages viewed per session. Shift from browsing new products to only checking order status. Support tickets with negative sentiment. Unsubscribing from some but not all email lists.
No single signal means a customer is churning. But patterns of signals, weighted and combined by a machine learning model, can predict churn with remarkable accuracy. One case study reported 89% accuracy in churn prediction.
For a Rails/Solidus ecommerce store, here's how a churn prediction system works:
class ChurnPredictionAgent
include AgentLoop
# Run daily to score all active customers
def perceive
Spree::User.active.find_each.map do |user|
{
user: user,
features: extract_churn_features(user)
}
end
end
def reason(observations)
observations.filter_map do |obs|
score = ChurnModel.predict_risk(obs[:features])
if score > 0.7
{
user: obs[:user],
churn_risk: score,
primary_driver: identify_primary_driver(obs[:features]),
intervention: select_intervention(obs[:user], score, obs[:features])
}
end
end
end
def act(decisions)
decisions.each do |decision|
case decision[:intervention][:type]
when :personalised_offer
ChurnPreventionMailer.personalised_offer(
decision[:user],
offer: decision[:intervention][:offer],
products: decision[:intervention][:recommended_products]
).deliver_later
when :feedback_request
ChurnPreventionMailer.feedback_request(decision[:user]).deliver_later
when :vip_outreach
# High-value customers get personal outreach
SalesTeamNotifier.flag_at_risk_customer(
decision[:user],
risk_score: decision[:churn_risk],
driver: decision[:primary_driver]
)
end
AuditLog.record(
agent: 'ChurnPrediction',
user: decision[:user],
risk_score: decision[:churn_risk],
intervention: decision[:intervention]
)
end
end
private
def extract_churn_features(user)
orders = user.orders.complete
recent_sessions = user.sessions.where('created_at > ?', 90.days.ago)
{
days_since_last_order: days_since(orders.maximum(:completed_at)),
order_frequency_trend: frequency_trend(orders, periods: 3),
aov_trend: aov_trend(orders, periods: 3),
session_frequency_30d: recent_sessions.where('created_at > ?', 30.days.ago).count,
pages_per_session_trend: pages_per_session_trend(recent_sessions),
email_open_rate_30d: email_engagement_rate(user, 30.days),
support_tickets_90d: user.support_tickets.where('created_at > ?', 90.days.ago).count,
last_sentiment_score: latest_sentiment(user),
lifetime_value: user.lifetime_spend,
customer_tenure_days: (Date.current - user.created_at.to_date).to_i
}
end
def select_intervention(user, score, features)
if user.lifetime_spend > 500 && score > 0.85
{ type: :vip_outreach }
elsif features[:days_since_last_order] > 60
{
type: :personalised_offer,
offer: calculate_optimal_incentive(user),
recommended_products: predicted_next_purchase(user)
}
else
{ type: :feedback_request }
end
end
end
The intervention selection is crucial. Not every at-risk customer needs a discount. Some need a reminder of value. Some need a problem solved. High-value customers might need a personal phone call. The AI determines the intervention, not just the risk level.
How GrowCentric.ai Ties It All Together
Everything I've described above (dynamic pricing, intelligent recommendations, predictive churn, autonomous campaign management) these aren't separate systems. In GrowCentric.ai, they're specialised agents in a coordinated multi-agent system.
Here's how it actually works.
The Analytics Agent monitors all marketing channels in real time. It tracks campaign performance, detects anomalies (sudden cost spikes, conversion drops, budget overruns), and surfaces insights that would take a human analyst hours or days to find.
The Budget Allocation Agent takes those insights and acts on them. It shifts spend from underperforming campaigns to high performers. It respects daily and monthly caps. It accounts for diminishing returns: doubling spend on a campaign doesn't double results, and the agent knows where the inflection point is for each channel.
The Audience Agent analyses customer behaviour patterns and builds targeting segments. Instead of broad demographics ("women aged 25 to 34 in Vienna"), it identifies behavioural clusters: people who browse extensively before buying, price-sensitive comparison shoppers, brand-loyal repeat purchasers, seasonal buyers who only engage during specific periods.
I build these audiences using the behavioural trigger segmentation approach I've developed through Auto-Prammer.at, tracking signals like scroll depth, brand-specific browsing patterns, and cross-category exploration to create precise lookalike audiences for Google and Meta campaigns.
The Conflict Resolution Agent addresses the multi-agent conflict problem that's unique to a platform serving competing clients. When two GrowCentric clients sell similar products to similar audiences, their optimisation agents can unknowingly bid against each other, driving up costs for both. The Conflict Resolution Agent detects these collisions, applies intelligent audience segmentation to reduce overlap, and uses game theory concepts to find equilibrium states that benefit both parties.
These agents communicate through a shared event bus and coordinate their actions. When the Analytics Agent detects that a campaign's CPA has spiked, it fires an event. The Budget Allocation Agent receives it and reduces spend. The Audience Agent investigates whether the audience is being contested and proposes alternative segments. The Conflict Resolution Agent checks whether the spike is caused by a client collision and intervenes if necessary.
All of this runs on Rails, using the same architectural patterns I've described throughout this blog series: ActiveSupport::Notifications for event publishing, Sidekiq for background processing, comprehensive API layers, and tiered autonomy with human approval gates for high-risk decisions.
What This Means for Your Solidus Store
If you're running an ecommerce store on Solidus, here's the practical path from "email drips" to genuine AI-powered marketing automation.
Phase 1: Get your data right. As I covered in my AI integration post, this means auditing product data quality, deduplicating customer records, ensuring inventory accuracy, and establishing consistent event tracking. None of the systems I've described work without clean data.
Phase 2: Implement event-driven architecture. Add ActiveSupport::Notifications to key customer lifecycle events: product views, add-to-carts, checkouts, purchases, returns, support interactions. This creates the perception layer that AI agents need to understand what's happening in your store.
Phase 3: Start with recommendations. Product recommendations have the clearest ROI and the lowest risk. Start with a hybrid engine that combines collaborative filtering with content-based and contextual signals. Measure incremental revenue from recommended products versus your baseline.
Phase 4: Add churn prediction. Once you have clean customer data and event tracking, build a churn prediction model. Start with alerts only (flag at-risk customers for human review), then graduate to automated interventions with tiered strategies based on customer value.
Phase 5: Explore dynamic pricing. This requires the most governance and the most careful rollout. Start with a small product category, implement strict guardrails, and measure impact on both revenue and customer trust metrics. Never deploy without human oversight capability.
Phase 6: Connect to GrowCentric.ai for campaign automation. Once your store's data and events are clean, GrowCentric provides the autonomous marketing optimisation layer that manages campaigns, budgets, audiences, and multi-channel attribution without requiring your team to monitor dashboards all day.
The European Compliance Angle
Dynamic pricing, personalised recommendations, and predictive churn detection all involve processing personal data and making automated decisions that affect customers. In Europe, that means GDPR, the Cyber Resilience Act, and the NIS2 Directive all apply.
Specifically, dynamic pricing based on individual customer data may constitute automated decision-making under GDPR Article 22, which gives individuals the right not to be subject to decisions based solely on automated processing that significantly affect them. You need a lawful basis, transparency about how prices are determined, and the ability for customers to request human review.
Recommendation engines and churn prediction models need to be explainable: you should be able to articulate why a specific recommendation was made or why a customer was flagged as at risk. This is both a legal requirement and a practical one, because unexplainable AI is untrustworthy AI.
Everything I build, whether for GrowCentric.ai or for client implementations, includes comprehensive audit logging, GDPR-compliant data processing, algorithmic transparency mechanisms, and human override capabilities. Compliance isn't an afterthought. It's architecture.
The Bottom Line
Marketing automation in 2026 should be marketing intelligence, not marketing scheduling.
The technology exists right now to price dynamically based on real demand signals, recommend products based on genuine individual understanding, predict which customers are about to leave and intervene effectively, and manage marketing campaigns autonomously with the sophistication of an experienced marketing team.
Most businesses aren't using any of this. They're still running the same drip campaigns with fancier subject lines. That's a competitive opportunity for anyone willing to do the real work: clean the data, build the architecture, implement the agents, and deploy with proper guardrails.
And if you want help doing that work (whether it's implementing these systems on your Rails and Solidus store, connecting to GrowCentric.ai for autonomous marketing optimisation, or building a custom AI marketing solution for your specific needs), that's what I do. Let's move beyond the drip.