Content Personalization Engine
2026 · Snowflake Cortex · AWS Bedrock · AWS Lambda · Marketing Automation
Impact
- 1 campaign in active testing, reducing a manual copy-writing task from around 5 hours to 1 hour
- All output is still human-reviewed before going live: the main risk is off-brand tone, where generated copy is factually correct but misses the voice and register customers associate with the brand
Business Problem
Marketing campaigns already vary across segments, but doing it manually does not scale. With weekly campaigns across an increasing number of segments, writing differentiated content per group becomes a bottleneck: time-consuming to produce and hard to track across runs.
The marketing automation platform supports rich segmentation, and the segment data already sits in Snowflake. The challenge is turning that data into differentiated copy automatically, without losing the human oversight that keeps content on-brand.
Solution Design
A hybrid personalization architecture that separates two concerns:
- Persona interpretation (Cortex): structured customer and segment data is interpreted inside Snowflake into aggregated persona profiles: motivations, tone preferences, objections. Cortex is used here because it runs close to governed data with no data leaving Snowflake. It acts as a semantic layer on top of structured attributes.
- Content generation (Bedrock): persona profiles (not raw data) are passed to AWS Bedrock for campaign prompt generation and variant creation. Bedrock provides full control over prompts, versioning, and evaluation.
Marketers keep control of targeting. The LLM handles copy direction, and a human approves the generated content per segment before it goes live.
The end-to-end flow:
- The marketing automation platform defines segments and exports structured attributes per segment to Snowflake.
- Snowflake Cortex reads the segment attributes and generates a persona profile for each group: motivations, tone preferences, and likely objections.
- Persona profiles are written back to Snowflake as a structured output layer, acting as a cache. If a segment's profile hasn't changed, step 4 is skipped.
- AWS Lambda passes the persona profiles to AWS Bedrock, which generates campaign copy variants and prompt alternatives per segment.
- Generated content is surfaced for human review. A marketer approves or rejects each segment's copy before it is passed back to the marketing automation platform.
- Approved copy is loaded into the campaign and delivered to the target segment.
- Campaign results are stored in Snowflake and automatically monitored via the A/B Test Evaluation and Uplift Modelling Pipeline, which measures the actual retention effect per segment.
Technical Challenges
Data governance boundary between Cortex and Bedrock. Raw customer data can't leave Snowflake. The challenge is designing persona profiles that are abstract enough to be PII-safe, but specific enough for Bedrock to generate meaningfully differentiated copy. Getting that abstraction right (what to include, what to aggregate away) took iteration and is the most consequential design decision in the system.
Prompt stability across segments. Cortex persona generation must produce consistent, structured output across all segments. Small prompt changes cascade into outputs that can't be compared across runs or segments. Prompt versioning and output schema validation are necessary from the start, not an afterthought.
Evaluating output quality without ground truth. There's no labelled dataset of good vs. bad campaign copy. A/B testing is the only real signal, but it's slow: a campaign cycle takes weeks. Until results are in, quality relies entirely on human review, which makes marketer trust a first-class concern. If the output is inconsistent, the approval workflow breaks down.
Segment granularity vs. cost. Finer segmentation improves relevance but multiplies Bedrock invocations. Persona profiles written back to Snowflake act as a cache layer: if a segment's profile hasn't changed since the last run, there's no need to regenerate content.
Status
- 1 campaign in active testing, with generated copy reviewed and approved by a marketer before go-live
- End-to-end pipeline live: segment export, Cortex persona generation, Bedrock copy generation, human review gate
- A/B test results pending; evaluation window is several weeks per campaign cycle
Next Steps
- Brand, tone, and campaign details as markdown: editable by marketers outside code, giving Bedrock explicit brand framing to reduce off-brand output
- Prompt versioning and improvement loop based on performance metrics and stakeholder feedback
- Build a Streamlit UI for marketers to review and approve generated content per segment
- Set up SNS-based notifications to Teams and mail groups when content is ready for approval