approval status travels with the asset, but the governance rules must be consistent.
Step-by-Step Implementation:
- Navigate to Setup: Go to Setup > Feature Management > Content Builder Approvals.
- Enable the Feature: Toggle the feature on. This action is immediate and affects all users in the BU.
- Define Approval Levels: Configure the hierarchy. For regulated industries, a two-tier structure is standard:
- Level 1: Marketing Lead (Brand/Creative check).
- Level 2: Legal/Compliance (Regulatory check).
- Assign Approvers: Add users to the approver roles. Ensure you assign at least two users per level to prevent single points of failure.
2. The Approval Lifecycle
Once enabled, the asset lifecycle changes. The following TypeScript interface models the state machine that governs an email asset within this workflow. This abstraction helps developers understand the transitions and constraints.
/**
* Represents the state of an email asset within the SFMC Approval Workflow.
* Transitions are strictly enforced by the platform.
*/
interface EmailApprovalState {
assetId: string;
currentStatus: 'DRAFT' | 'SUBMITTED' | 'APPROVED' | 'REJECTED' | 'WITHDRAWN';
currentVersion: number;
// Metadata captured at the moment of approval
approvedVersionSnapshot?: {
version: number;
approverId: string;
timestamp: string;
comments?: string;
};
}
/**
* Transitions the asset state based on user action.
* Note: The system enforces that 'SCHEDULED' is only possible from 'APPROVED'.
*/
function transitionState(
currentState: EmailApprovalState,
action: 'SUBMIT' | 'APPROVE' | 'REJECT' | 'WITHDRAW' | 'EDIT'
): EmailApprovalState {
switch (action) {
case 'SUBMIT':
if (currentState.currentStatus !== 'DRAFT') {
throw new Error('Asset must be in DRAFT state to submit.');
}
return { ...currentState, currentStatus: 'SUBMITTED' };
case 'APPROVE':
if (currentState.currentStatus !== 'SUBMITTED') {
throw new Error('Asset must be SUBMITTED to be approved.');
}
return {
...currentState,
currentStatus: 'APPROVED',
approvedVersionSnapshot: {
version: currentState.currentVersion,
approverId: 'current_user_id', // Contextual
timestamp: new Date().toISOString()
}
};
case 'REJECT':
if (currentState.currentStatus !== 'SUBMITTED') {
throw new Error('Asset must be SUBMITTED to be rejected.');
}
return { ...currentState, currentStatus: 'DRAFT' };
case 'WITHDRAW':
// Critical: Withdrawal retracts approval but does not stop scheduled sends.
if (currentState.currentStatus !== 'APPROVED') {
throw new Error('Only APPROVED assets can be withdrawn.');
}
return { ...currentState, currentStatus: 'WITHDRAWN' };
case 'EDIT':
// Editing invalidates approval. Asset reverts to DRAFT.
return {
...currentState,
currentStatus: 'DRAFT',
currentVersion: currentState.currentVersion + 1,
approvedVersionSnapshot: undefined
};
default:
throw new Error('Invalid action');
}
}
3. What Approvers Evaluate
When an approver opens the asset in Content Builder, they are presented with a focused view. The system highlights specific fields that are high-risk for compliance:
- From Name: Verifies brand consistency and sender reputation.
- Subject Line: Checks for prohibited terms, placeholders, or misleading claims.
- Personalization Strings: Ensures
%%FirstName%% or similar variables have default values to prevent rendering errors.
- Links: Validates that all hyperlinks point to approved, secure destinations.
- Content Body: The full HTML/text review for regulatory language.
Approvers can preview the asset using representative subscriber data to verify personalization rendering before casting their vote.
Pitfall Guide
Production implementations of the Approval Workflow frequently encounter specific failure modes. The following pitfalls are derived from real-world governance deployments.
1. The Withdrawal Fallacy
Explanation: Approvers often assume that clicking "Withdraw Approval" on a scheduled email will cancel the send. It does not. Withdrawal retracts the authorization status but leaves the scheduled send job intact. The email will fire at the scheduled time using the previously approved version.
Fix: Treat withdrawal as a status change, not a cancellation. If a send must be stopped, the approver or marketer must explicitly cancel the scheduled send in the Interactions or Journey Builder interface. Document this distinction in team SOPs.
2. The Shared Asset Edit Trap
Explanation: When an approved email is shared across multiple Business Units, editing the asset in the source BU invalidates the approval. However, the shared copies in child BUs may retain the old approval status until synchronized, creating a state mismatch.
Fix: Establish a protocol for shared assets. Before editing, unshare the asset from all child BUs. Make the edit, which reverts the source to DRAFT. Resubmit for approval. Once re-approved, reshare to the child BUs. Never edit a shared, approved asset directly.
3. The Single-Point-of-Failure Approver
Explanation: Configuring only one user as an approver for a critical level (e.g., Legal) creates a bottleneck. If that user is on leave, campaign velocity halts.
Fix: Assign a minimum of two approvers per level. Ensure at least one is a backup who is trained on the compliance requirements. Rotate approvers periodically to distribute knowledge.
4. The "Minor Edit" Loophole
Explanation: Marketers may argue that changing a single word in the subject line or a link URL is a "minor edit" that doesn't require re-approval. In a regulated environment, any change to the asset content invalidates the previous approval.
Fix: Enforce a zero-tolerance policy. Any edit to an approved asset reverts it to DRAFT and requires a full resubmission. Automate this via the system; do not allow manual overrides.
5. Ignoring Internal vs. External Distinctions
Explanation: Applying the approval workflow to all sends, including internal staff communications or test sends, creates unnecessary friction and slows down operations.
Fix: Configure the workflow rules to apply only to external-facing assets. Use specific asset categories or naming conventions to distinguish internal vs. external content. Ensure test sends bypass the approval gate.
Explanation: Some teams attempt to manage approvals entirely in Slack or Teams, using SFMC only as the execution engine. This breaks the audit trail.
Fix: Keep the approval record in SFMC. External tools can be used for notifications (via webhooks or middleware), but the final "Approve" or "Reject" action must occur within the SFMC UI to ensure the audit log is complete.
Production Bundle
Action Checklist
Decision Matrix
Use this matrix to determine the appropriate governance strategy based on team size and regulatory requirements.
| Scenario | Recommended Approach | Why | Cost Impact |
|---|
| Regulated Industry (Bank/Pharma) | SFMC Approval Workflow (Multi-level) | Mandatory audit trail and system-enforced gates. | High setup effort; low compliance risk. |
| Large Marketing Team (10+) | SFMC Approval Workflow (Single-level) | Ensures brand consistency and quality control. | Moderate setup; improves asset quality. |
| Small Team (2-3) | Content Builder Proofing | Lightweight review without hard gates; reduces friction. | Low setup; faster iteration. |
| Cross-BU Asset Sharing | Approval Workflow + Unshare/Edit/Reshare Protocol | Prevents state mismatches and ensures consistent governance. | High process discipline required. |
| Ad-Hoc/Chat-Based | Not Recommended | Fragile audit trail; high risk of execution errors. | Low setup; high compliance risk. |
Configuration Template
The following JSON structure represents a typical configuration for a regulated client with a two-level approval chain. This can be used as a reference when setting up the workflow in the SFMC UI.
{
"approvalWorkflow": {
"enabled": true,
"businessUnit": "Production_BU",
"approvalLevels": [
{
"level": 1,
"role": "Marketing Manager",
"approvers": ["user_marketing_lead_1", "user_marketing_lead_2"],
"focus": ["Brand Consistency", "Creative Quality", "Personalization Defaults"]
},
{
"level": 2,
"role": "Legal & Compliance",
"approvers": ["user_legal_officer_1", "user_legal_officer_2"],
"focus": ["Regulatory Claims", "Subject Line Compliance", "Link Verification"]
}
],
"scope": {
"include": ["External Emails", "Campaign Assets"],
"exclude": ["Internal Communications", "Test Sends"]
},
"notifications": {
"email": true,
"slackIntegration": false,
"message": "Approval required before scheduling. Review comments are mandatory for rejections."
}
}
}
Quick Start Guide
- Access Setup: Log in to SFMC and navigate to Setup > Feature Management > Content Builder Approvals.
- Toggle On: Enable the feature. Confirm the prompt to apply changes to the current Business Unit.
- Add Approvers: In the Approval Workflow settings, add users to the approver roles. Ensure you have backups for each level.
- Test Cycle: Create a test email, submit it for approval, and walk through the approve/reject/withdraw cycle to verify the audit log and state transitions.
- Go Live: Communicate the new process to the team. Enforce the workflow for all external sends immediately.