AI-Driven Marketing & Customer Insights

Create intelligent marketing campaigns by analyzing customer behavior, segmenting audiences, predicting churn, and generating personalized content...

All recipes· ml· 10 minutesadvancedsql

AI-Driven Marketing & Customer Insights

Problem

Create intelligent marketing campaigns by analyzing customer behavior, segmenting audiences, predicting churn, and generating personalized content using AI-powered insights.

What You'll Learn

  • Segment customers using AI-powered clustering
  • Analyze campaign performance and customer sentiment
  • Predict customer lifetime value and churn risk
  • Generate personalized marketing content automatically

Setup: Create Marketing Database

CREATE TABLE customers (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT,
    age INTEGER,
    gender TEXT,
    location TEXT,
    signup_date DATE,
    total_spent DECIMAL(10,2),
    last_purchase_date DATE,
    purchase_frequency INTEGER,
    preferred_channel TEXT,
    customer_profile VECTOR(384)
);

CREATE TABLE campaigns (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    type TEXT,
    channel TEXT,
    start_date DATE,
    end_date DATE,
    budget DECIMAL(10,2),
    target_audience TEXT,
    content TEXT,
    campaign_embedding VECTOR(384)
);

CREATE TABLE campaign_interactions (
    id INTEGER PRIMARY KEY,
    customer_id INTEGER REFERENCES customers(id),
    campaign_id INTEGER REFERENCES campaigns(id),
    interaction_type TEXT,
    interaction_date TIMESTAMP,
    conversion BOOLEAN DEFAULT FALSE,
    revenue DECIMAL(10,2) DEFAULT 0
);

CREATE TABLE customer_feedback (
    id INTEGER PRIMARY KEY,
    customer_id INTEGER REFERENCES customers(id),
    feedback_type TEXT,
    rating INTEGER CHECK (rating >= 1 AND rating <= 5),
    comment TEXT,
    feedback_date DATE,
    sentiment_score REAL
);

CREATE TABLE product_purchases (
    id INTEGER PRIMARY KEY,
    customer_id INTEGER REFERENCES customers(id),
    product_name TEXT,
    category TEXT,
    price DECIMAL(10,2),
    purchase_date DATE,
    quantity INTEGER
);

Seed Data: Customer Base

INSERT INTO customers (id, name, email, age, gender, location, signup_date, total_spent, last_purchase_date, purchase_frequency, preferred_channel) VALUES
(1, 'Emma Wilson', 'emma.w@email.com', 28, 'Female', 'New York, NY', '2024-01-15', 1250.50, '2025-01-10', 8, 'Email'),
(2, 'Michael Chen', 'michael.c@email.com', 35, 'Male', 'San Francisco, CA', '2023-11-20', 2100.75, '2025-01-08', 12, 'Social Media'),
(3, 'Sarah Johnson', 'sarah.j@email.com', 42, 'Female', 'Chicago, IL', '2024-03-10', 890.25, '2024-12-15', 4, 'Email'),
(4, 'David Rodriguez', 'david.r@email.com', 31, 'Male', 'Austin, TX', '2024-06-05', 1650.00, '2025-01-12', 10, 'Mobile App'),
(5, 'Lisa Park', 'lisa.p@email.com', 26, 'Female', 'Seattle, WA', '2024-08-20', 750.80, '2025-01-14', 6, 'Social Media'),
(6, 'James Martinez', 'james.m@email.com', 38, 'Male', 'Miami, FL', '2023-09-12', 3200.40, '2025-01-11', 15, 'Email'),
(7, 'Anna Kim', 'anna.k@email.com', 29, 'Female', 'Los Angeles, CA', '2024-02-28', 1100.60, '2024-11-20', 3, 'Mobile App'),
(8, 'Robert Taylor', 'robert.t@email.com', 45, 'Male', 'Boston, MA', '2023-12-03', 2800.90, '2025-01-09', 14, 'Email');

INSERT INTO campaigns (id, name, type, channel, start_date, end_date, budget, target_audience, content) VALUES
(1, 'Spring Fashion Sale', 'Promotional', 'Email', '2025-01-01', '2025-01-31', 5000.00, 'Women 25-40', 'Discover our new spring collection with 30% off on all items!'),
(2, 'Tech Gadgets Launch', 'Product Launch', 'Social Media', '2025-01-10', '2025-01-25', 8000.00, 'Men 25-45', 'Revolutionary tech gadgets that will change your daily routine. Pre-order now!'),
(3, 'Loyalty Rewards Program', 'Retention', 'Mobile App', '2025-01-05', '2025-01-20', 3000.00, 'High-value customers', 'Exclusive rewards for our most valued customers. Unlock special benefits today!'),
(4, 'Winter Clearance', 'Clearance', 'Email', '2024-12-01', '2024-12-31', 2000.00, 'Price-sensitive shoppers', 'Last chance! Up to 70% off on winter items. Limited time only!'),
(5, 'Valentine\'s Day Special', 'Seasonal', 'Social Media', '2025-02-01', '2025-02-14', 4500.00, 'Couples 25-50', 'Show your love with our Valentine\'s Day special collection. Perfect gifts await!');

INSERT INTO product_purchases (id, customer_id, product_name, category, price, purchase_date, quantity) VALUES
(1, 1, 'Wireless Headphones', 'Electronics', 199.99, '2025-01-10', 1),
(2, 1, 'Summer Dress', 'Fashion', 89.50, '2024-12-20', 2),
(3, 2, 'Smart Watch', 'Electronics', 299.99, '2025-01-08', 1),
(4, 2, 'Laptop Bag', 'Accessories', 79.99, '2024-12-15', 1),
(5, 3, 'Coffee Maker', 'Home & Kitchen', 149.99, '2024-12-15', 1),
(6, 4, 'Running Shoes', 'Sports', 129.99, '2025-01-12', 1),
(7, 4, 'Fitness Tracker', 'Electronics', 199.99, '2025-01-05', 1),
(8, 5, 'Skincare Set', 'Beauty', 89.99, '2025-01-14', 1),
(9, 6, 'Premium Suit', 'Fashion', 599.99, '2025-01-11', 1),
(10, 6, 'Leather Shoes', 'Fashion', 249.99, '2024-12-20', 1);

INSERT INTO campaign_interactions (id, customer_id, campaign_id, interaction_type, interaction_date, conversion, revenue) VALUES
(1, 1, 1, 'OPEN', '2025-01-15 09:30:00', TRUE, 89.50),
(2, 2, 2, 'CLICK', '2025-01-12 14:20:00', FALSE, 0),
(3, 3, 4, 'OPEN', '2024-12-10 10:15:00', TRUE, 149.99),
(4, 4, 3, 'CLICK', '2025-01-07 16:45:00', TRUE, 199.99),
(5, 5, 1, 'OPEN', '2025-01-16 11:20:00', FALSE, 0),
(6, 6, 2, 'CLICK', '2025-01-13 19:30:00', TRUE, 299.99),
(7, 7, 4, 'OPEN', '2024-12-12 08:45:00', FALSE, 0),
(8, 8, 3, 'CLICK', '2025-01-08 12:10:00', TRUE, 599.99);

INSERT INTO customer_feedback (id, customer_id, feedback_type, rating, comment, feedback_date) VALUES
(1, 1, 'Product Review', 5, 'Amazing headphones! Great sound quality and comfortable fit.', '2025-01-12'),
(2, 2, 'Service Review', 4, 'Fast delivery but packaging could be better.', '2025-01-10'),
(3, 3, 'Product Review', 3, 'Coffee maker works fine but instructions were unclear.', '2024-12-18'),
(4, 4, 'Service Review', 5, 'Excellent customer service and quick response to my questions.', '2025-01-14'),
(5, 6, 'Product Review', 5, 'Perfect suit! Great quality and perfect fit.', '2025-01-13');

Generate Customer and Campaign Embeddings

UPDATE customers 
SET customer_profile = EMBED(
    name || ' ' || age || ' ' || gender || ' ' || location || ' ' || 
    preferred_channel || ' ' || total_spent || ' ' || purchase_frequency
);

UPDATE campaigns 
SET campaign_embedding = EMBED(name || ' ' || type || ' ' || target_audience || ' ' || content);

Analyze Customer Sentiment

UPDATE customer_feedback 
SET sentiment_score = SENTIMENT(comment);

Customer Segmentation Analysis

WITH customer_segments AS (
    SELECT 
        c.*,
        CASE 
            WHEN c.total_spent > 2000 AND c.purchase_frequency > 10 THEN 'VIP'
            WHEN c.total_spent > 1000 AND c.purchase_frequency > 6 THEN 'Loyal'
            WHEN c.total_spent > 500 AND c.purchase_frequency > 3 THEN 'Regular'
            WHEN c.last_purchase_date < DATE('2024-12-01') THEN 'At Risk'
            ELSE 'New'
        END as segment,
        CASE 
            WHEN age < 30 THEN 'Gen Z/Young Millennial'
            WHEN age < 40 THEN 'Millennial'
            WHEN age < 50 THEN 'Gen X'
            ELSE 'Boomer'
        END as age_group
    FROM customers c
)
SELECT 
    segment,
    age_group,
    COUNT(*) as customer_count,
    AVG(total_spent) as avg_spending,
    AVG(purchase_frequency) as avg_frequency,
    GROUP_CONCAT(DISTINCT preferred_channel) as preferred_channels
FROM customer_segments
GROUP BY segment, age_group
ORDER BY avg_spending DESC;

Campaign Performance Analysis

SELECT 
    c.name as campaign_name,
    c.type,
    c.channel,
    c.budget,
    COUNT(ci.id) as total_interactions,
    COUNT(CASE WHEN ci.conversion = TRUE THEN 1 END) as conversions,
    ROUND(COUNT(CASE WHEN ci.conversion = TRUE THEN 1 END) * 100.0 / COUNT(ci.id), 2) as conversion_rate,
    SUM(ci.revenue) as total_revenue,
    ROUND(SUM(ci.revenue) / c.budget, 2) as roi
FROM campaigns c
LEFT JOIN campaign_interactions ci ON c.id = ci.campaign_id
GROUP BY c.id, c.name, c.type, c.channel, c.budget
ORDER BY roi DESC;

Predict Customer Churn Risk

WITH churn_analysis AS (
    SELECT 
        c.*,
        COALESCE(AVG(cf.sentiment_score), 0) as avg_sentiment,
        COUNT(cf.id) as feedback_count,
        JULIANDAY('2025-01-20') - JULIANDAY(c.last_purchase_date) as days_since_purchase,
        CASE 
            WHEN JULIANDAY('2025-01-20') - JULIANDAY(c.last_purchase_date) > 60 THEN 0.8
            WHEN JULIANDAY('2025-01-20') - JULIANDAY(c.last_purchase_date) > 30 THEN 0.5
            WHEN purchase_frequency < 3 THEN 0.4
            WHEN COALESCE(AVG(cf.sentiment_score), 0) < 0 THEN 0.6
            ELSE 0.1
        END as churn_risk_score
    FROM customers c
    LEFT JOIN customer_feedback cf ON c.id = cf.customer_id
    GROUP BY c.id
)
SELECT 
    name,
    total_spent,
    days_since_purchase,
    purchase_frequency,
    ROUND(avg_sentiment, 2) as avg_sentiment,
    ROUND(churn_risk_score, 2) as churn_risk,
    CASE 
        WHEN churn_risk_score > 0.6 THEN 'High Risk'
        WHEN churn_risk_score > 0.3 THEN 'Medium Risk'
        ELSE 'Low Risk'
    END as risk_category
FROM churn_analysis
ORDER BY churn_risk_score DESC;

Find Similar Customers for Targeting

WITH target_customer AS (
    SELECT customer_profile FROM customers WHERE id = 6  -- James Martinez (VIP customer)
)
SELECT 
    c.name,
    c.total_spent,
    c.purchase_frequency,
    c.preferred_channel,
    COSINE_SIMILARITY(tc.customer_profile, c.customer_profile) as similarity_score
FROM customers c
CROSS JOIN target_customer tc
WHERE c.id != 6
ORDER BY similarity_score DESC
LIMIT 5;

Generate Personalized Campaign Content

SELECT 
    c.name as customer_name,
    c.preferred_channel,
    c.total_spent,
    GENERATE(
        'Create a personalized marketing message for ' || c.name || 
        ' (age ' || c.age || ', ' || c.gender || ' from ' || c.location || ') ' ||
        'who prefers ' || c.preferred_channel || ' and has spent $' || c.total_spent || 
        '. Focus on fashion and electronics based on purchase history.',
        '{"max_length": 150, "tone": "friendly", "focus": "personalization"}'
    ) as personalized_message
FROM customers c
WHERE c.total_spent > 1000
ORDER BY c.total_spent DESC
LIMIT 4;

Customer Lifetime Value Prediction

WITH clv_calculation AS (
    SELECT 
        c.id,
        c.name,
        c.total_spent,
        c.purchase_frequency,
        JULIANDAY('2025-01-20') - JULIANDAY(c.signup_date) as customer_lifetime_days,
        ROUND(c.total_spent / (JULIANDAY('2025-01-20') - JULIANDAY(c.signup_date)) * 365, 2) as annual_value,
        ROUND(c.total_spent / c.purchase_frequency, 2) as avg_order_value
    FROM customers c
    WHERE c.purchase_frequency > 0
)
SELECT 
    name,
    total_spent,
    purchase_frequency,
    avg_order_value,
    annual_value,
    ROUND(annual_value * 3, 2) as predicted_3year_clv,  -- Simple 3-year projection
    CASE 
        WHEN annual_value > 1000 THEN 'High Value'
        WHEN annual_value > 500 THEN 'Medium Value'
        ELSE 'Low Value'
    END as value_segment
FROM clv_calculation
ORDER BY predicted_3year_clv DESC;

Analyze Product Category Performance

SELECT 
    pp.category,
    COUNT(pp.id) as total_purchases,
    SUM(pp.price * pp.quantity) as total_revenue,
    AVG(pp.price) as avg_price,
    COUNT(DISTINCT pp.customer_id) as unique_customers,
    ROUND(AVG(cf.sentiment_score), 2) as avg_sentiment
FROM product_purchases pp
LEFT JOIN customer_feedback cf ON pp.customer_id = cf.customer_id
GROUP BY pp.category
ORDER BY total_revenue DESC;

Campaign Audience Matching

SELECT 
    ca.name as campaign_name,
    ca.target_audience,
    c.name as customer_name,
    c.age,
    c.gender,
    c.total_spent,
    COSINE_SIMILARITY(ca.campaign_embedding, c.customer_profile) as audience_match_score
FROM campaigns ca
CROSS JOIN customers c
WHERE COSINE_SIMILARITY(ca.campaign_embedding, c.customer_profile) > 0.3
ORDER BY ca.id, audience_match_score DESC;

Try These Additional Queries

-- Extract insights from customer feedback
SELECT 
    customer_id,
    comment,
    EXTRACT_KEYWORDS(comment, 3) as key_themes,
    sentiment_score
FROM customer_feedback
WHERE comment IS NOT NULL;

-- Generate campaign ideas based on customer segments
SELECT 
    'VIP Customers' as segment,
    GENERATE(
        'Create a luxury campaign idea for VIP customers who spend over $2000 annually and prefer email communication. Focus on exclusive products and premium service.',
        '{"max_length": 200, "focus": "luxury_marketing"}'
    ) as campaign_idea
UNION ALL
SELECT 
    'At-Risk Customers' as segment,
    GENERATE(
        'Create a win-back campaign for customers who haven\'t purchased in 60+ days. Focus on special offers and reconnection.',
        '{"max_length": 200, "focus": "retention_marketing"}'
    ) as campaign_idea;

-- Analyze seasonal purchase patterns
SELECT 
    CASE 
        WHEN SUBSTR(purchase_date, 6, 2) IN ('12', '01', '02') THEN 'Winter'
        WHEN SUBSTR(purchase_date, 6, 2) IN ('03', '04', '05') THEN 'Spring'
        WHEN SUBSTR(purchase_date, 6, 2) IN ('06', '07', '08') THEN 'Summer'
        ELSE 'Fall'
    END as season,
    category,
    COUNT(*) as purchase_count,
    SUM(price * quantity) as revenue
FROM product_purchases
GROUP BY season, category
ORDER BY season, revenue DESC;

-- Find cross-selling opportunities
SELECT 
    c.name,
    GROUP_CONCAT(DISTINCT pp.category) as purchased_categories,
    GENERATE(
        'Suggest cross-selling products for customer who bought: ' || GROUP_CONCAT(DISTINCT pp.product_name, ', '),
        '{"max_length": 100, "focus": "cross_selling"}'
    ) as cross_sell_suggestions
FROM customers c
JOIN product_purchases pp ON c.id = pp.customer_id
GROUP BY c.id, c.name
HAVING COUNT(DISTINCT pp.category) >= 2;

Key Takeaways

Smart Segmentation: AI-powered customer clustering based on behavior and preferences
Predictive Analytics: Churn prediction and lifetime value calculation for proactive marketing
Personalization: Generate targeted content and campaigns using customer insights
Performance Optimization: Data-driven campaign analysis and ROI measurement

Next Steps

  • Implement real-time recommendation engines
  • Add A/B testing capabilities for campaign optimization
  • Create automated email triggers based on customer behavior
  • Integrate social media sentiment analysis

Note: This tutorial demonstrates marketing analytics concepts using simulated customer data for educational purposes.

Tags

mlsqlmarketingsegmentationrag

Run this on your own machine

Install SynapCores Community Edition free, paste the SQL or Cypher above into the bundled web UI, and watch it run.

Download Free CE