Triggering Ads from Email Activity and Vice Versa

Introduction: Paid and Owned Are Not Separate

Most businesses treat email and PPC as separate lanes. One is owned, the other paid. But users do not care what budget line their experience comes from. What matters is the continuity, whether the message, value and next step make sense.

In my growth strategy work, I integrate both. I track how users engage with email to determine when to show ads, and how users arrive via paid ads to decide which emails they should get. This two-way synergy improves relevance, reduces waste and massively increases conversion velocity.


1. Retargeting Based on Email Opens (Without Clicks)

Email opens signal interest. But if there is no click, it means they hesitated. Instead of letting that user disappear, I use open activity as a trigger to generate a paid ad.

In one campaign, a user received an email featuring a new product category. If they opened but did not click within 6 hours, I pushed them into a Facebook Ads custom audience with a matching image carousel.

This was implemented using a webhook from Klaviyo to a Google Cloud Function, which called the Meta Ads API:

import requests

def create_custom_audience(user_email):
    audience_payload = {
        "name": f"EmailOpener_{user_email}",
        "subtype": "CUSTOM",
        "customer_file_source": "USER_PROVIDED_ONLY",
        "description": "Opened email but did not click",
        "schema": ["EMAIL"],
        "data": [[user_email]]
    }
    requests.post(
        "https://graph.facebook.com/v19.0/act_<AD_ACCOUNT_ID>/customaudiences",
        json=audience_payload,
        headers={"Authorization": "Bearer <ACCESS_TOKEN>"}
    )

The result: conversion rate improved by 38 percent compared to standalone email campaigns. These ads acted as friction reducers, they re-presented the CTA in a less committed format, often leading to the next step.


2. Email Sequences Based on Paid Ad Entry

When a user clicks through from a Google ad and signs up, they should not receive a generic onboarding flow. I capture the UTM parameters from the ad (especially utm_term, utm_content, and utm_campaign) and store them in the user profile.

From there, I feed this into conditional email logic. If someone came via the keyword “gdpr compliance for startups” and signed up, their onboarding sequence included:

  • A case study for early-stage B2B SaaS
  • A how-to for data privacy onboarding
  • A checklist for legal readiness at launch

This increases activation rate and reduces unsubscribes. Instead of repeating general content, I deliver what the ad promised, extended into the email journey.

To capture UTMs in JavaScript:

const params = new URLSearchParams(window.location.search);
const utmSource = params.get("utm_source");
const utmTerm = params.get("utm_term");
localStorage.setItem("utm_term", utmTerm);

These values are included at signup or via hidden fields in form submissions and sent to your email platform (e.g. through custom fields in ConvertKit or Customer.io).


3. Closing the Loop: Tag-Based Synchronisation

To keep both systems in sync, I use a tag enrichment layer. When a user reaches a certain point in a campaign, for example, clicking 2 emails but still not purchasing, they receive a tag like mid_funnel_no_purchase. This tag is passed to both:

  • Google Ads via offline conversion or audience list update
  • Email automation system for an offer nudge or testimonial insert

I use tools like Segment or serverless middleware (AWS Lambda, Supabase edge functions) to manage these tag updates.

With this loop in place, I maintain a shared view of where the user is, not just in each channel, but across the journey. When the data is right, the story reads better.


Final Thought: Continuity Beats Volume

A perfect ad and a perfect email do not matter if the user sees them as disconnected. Continuity wins. I build joined-up flows where signals from one channel shape the experience in another.

This is how real growth works, not by flooding the user, but by understanding what they saw, what they did not do, and what message will move them next.

If your ad and email teams do not talk, or your systems do not know what the other has said, I can help you connect the pipes, and build smarter journeys that perform better together.