Framework

Message–Signal Alignment Model (MSAM)

This framework defines a deterministic mapping from a detected signal to the only valid type of outbound opener — and blocks everything else.

It is intentionally rules-based, observable, and non-opinionated.

Purpose

Define a deterministic mapping between:

  • the primary signal detected, and
  • the only type of message opener that is appropriate.

This framework exists to prevent over-personalization, audits, and generic copy.

It is not a copywriting guide.

It is a message constraint system.

Core Principle (canonical)

If the message doesn’t reference the qualifying signal, it’s misaligned.

A message is only valid if it references the same signal that qualified the prospect.

If the message references anything else, it is misaligned.

Canonical Inputs (from ORF)

This framework assumes you already have, per business:

  • primary_reason (single enum)
  • evidence (1–3 observable facts)
  • confidence (low / medium / high)

No new data sources are introduced.

Core Output (must always produce)

For each prospect, output:

  • message_type = enum (defined below)
  • allowed_openers = pattern, not copy
  • forbidden_content = explicit list
  • personalization_depth = {none | light | moderate}
  • message_length_target = {short | medium}
  • cta_type = enum

This becomes a guardrail, not a script.

Message Types (authoritative enum)

Exactly five message types are allowed.

Each corresponds to one signal class.

1) Performance-Based Message

Trigger: primary_reason = performance_slow_mobile

Message Type: performance_contextual

Personalization depth: light

CTA type: open_ended_conversation

Allowed opener pattern

Reference observable performance context only (e.g., mobile load, UX friction — not design opinions)

Allowed

  • “Noticed mobile load issues on X”
  • “Mobile experience seems slower than expected”

Forbidden

  • Design critique
  • SEO promises
  • Conversion advice
  • Tools mentioned

2) SEO Structure Message

Trigger: primary_reason = seo_thin_or_missing_service_pages

Message Type: structure_gap

Personalization depth: moderate

CTA type: clarifying_question

Allowed opener pattern

Reference absence or structure, not performance claims

Allowed

  • “Noticed there aren’t dedicated pages for X services”
  • “Your homepage appears to cover multiple services without separation”

Forbidden

  • Rankings
  • Traffic claims
  • “Fix your SEO”
  • Audits

3) Paid Ads Context Message

Trigger: primary_reason = ads_running_weak_landing_page

Message Type: intent_mismatch

Personalization depth: moderate

CTA type: curiosity_prompt

Allowed opener pattern

Reference ad presence + destination mismatch

Allowed

  • “Saw active ads pointing to a general page”
  • “Traffic seems to be sent without a focused landing context”

Forbidden

  • ROAS
  • Cost assumptions
  • Funnel teardown
  • Critique of creatives

4) Conversion Structure Message

Trigger: primary_reason = conversion_no_clear_next_step

Message Type: path_clarity

Personalization depth: light

CTA type: process_question

Allowed opener pattern

Reference navigation or action clarity only

Allowed

  • “Couldn’t find a clear next step for visitors”
  • “Noticed multiple CTAs competing on the page”

Forbidden

  • Design feedback
  • Copy rewrites
  • “Low conversion rate” claims

5) Hiring / Expansion Message

Trigger: primary_reason = hiring_recent_growth_signal

Message Type: timing_context

Personalization depth: light

CTA type: timing_check

Allowed opener pattern

Reference timing and growth context

Allowed

  • “Saw you’re hiring for X recently”
  • “Looks like you’re expanding capacity”

Forbidden

  • Assumptions about budget
  • Claims of readiness
  • Urgency framing

Forbidden Global Patterns (critical)

Regardless of message type, never allow:

  • Audits (free or paid)
  • Guarantees or outcomes
  • Tool mentions
  • Multi-issue messages
  • “We noticed several things…”
  • Long explanations
One signal → one message → one reason.

Message Length Rules

  • short = 2–4 sentences
  • medium = 4–6 sentences

No message should exceed this.

If it does, it violates the framework.

Alignment Check (deterministic)

A message is invalid if:

  • The opener references a different signal than primary_reason
  • More than one issue is mentioned
  • Any forbidden content appears

This can be enforced programmatically.

Example (one row)

Input
primary_reason: seo_thin_or_missing_service_pages
evidence:
  “No dedicated service pages found”
confidence: high

Output
message_type: structure_gap
personalization_depth: moderate
message_length_target: short
cta_type: clarifying_question
forbidden_content:
  rankings
  traffic
  audits

Canonical Axioms

If the message doesn’t reference the qualifying signal, it’s misaligned.
One signal. One message. One reason.
Personalization depth is constrained by evidence, not effort.

Placement on the site

Canonical URL:

  • /frameworks/message-signal-alignment

Cross-linked from:

  • Leads vs Prospects
  • Outbound Relevance Filter

Snippet used on:

  • Product pages
  • Partner education

Why this is the correct third framework

Strategically

  • It prevents agencies from ruining good targeting
  • It explains why Zendory lists reduce copy complexity
  • It gives creators a strong, repeatable talking point
  • It completes the logic chain: classification → selection → communication

Operationally

  • You can enforce this in your own pipeline
  • You can expose it as guidance without giving scripts
  • It differentiates you from list sellers and audit peddlers

Positioning

Frameworks are: how to think, how to decide, how to reason about outbound.

Zendory is built using these principles, not presented as a perfect implementation of them.