Loading

Marketing Cloud Email Subject Line Personalization Guidance

게시 일자: Mar 23, 2026
상세 설명

As of January 30, 2026, the email subject line double evaluation feature is now deprecated for new customer adoption. On March 15, 2026, email subject line double evaluation was disabled for all existing customer accounts. 

 

 

솔루션

Understanding Double Evaluation in Subject Lines

In Marketing Cloud Engagement, email subject lines are processed twice to enable nested variables (and as such, nested AMPscript), which allows for a unique level of personalization. This is different from how the email body and pre-header render AMPscript.

Here’s an example:

Subject: 
%%=V(@subject)=%%

Body:
%%[
    SET @dealType = Lookup("Deals", "DealType", "DealCode", DealCode)
    SET @subject = "Check out the latest deals on %%=V(@dealType)=%%!"
    SET @dealType = ‘televisions’
]%%


In the example above, the subject will resolve to this after the first pass:

Subject:  Check out the latest deals on %%=V(@dealType)=%%!

Then on the second pass, it fully resolves to:

Subject:  Check out the latest deals on televisions!


This is just one example. AMPscript is extremely flexible, so the manner in which your email subject line is rendered will be specific to your account. 

There are additional customer use cases where AMPscript or personalization strings are stored within data extension field values per subscriber row. For example, a customer may configure an email subject line as a simple personalization string referencing a field called "Subject" within the target sendable data extension. In this case, the subject line would be:

Subject: %%Subject%%

If the value for "Subject" stored in the data extension contains a personalization string or AMPscript, it will result in nested personalization within the subject line. This pattern will fully resolve.

The same is true for a TreatAsContent() function like this:

Subject:  %%=TreatAsContent(Subject)=%%


This will cause the first pass to fully render the subject line.

Note: TreatAsContent() behaves similarly to the JavaScript eval() function — using this function without understanding where the underlying data comes from carries risk.

What is changing about email subject line personalization?  

Salesforce is deprecating double evaluation in subject lines. As of January 30, 2026, this feature is deprecated for new customers, and on March 15, 2026, it was disabled for all accounts.

To ensure that your email campaigns function as intended as we make these changes, we've introduced a new AMPscript string: 

%%__SINGLE_RESOLVE%%

How to Use It:

Append this string to the end of your subject line to enforce single resolve:

%%=TreatAsContent(SubjectLine)=%% %%__SINGLE_RESOLVE%%

-or-

%%=v(@SubjectLine)=%% %%__SINGLE_RESOLVE%%

What It Does:

When the platform sends the email, it will remove this AMPscript string and resolve the subject line only once.

After Enforcement Date:

After March 15th 2026, single resolve will become the default platform behavior for all subject lines. At that point, this string will no longer be necessary and can be removed or left in place.

Important Note:

This string only works in the subject line. If used elsewhere, it will appear as plain text in your content.

 

Use Case 1: Using personalization strings in a subject line variable

Subject: 
%%SubjectLine%%

SubjectLine field in the sending Dataextension:
"%%Name%% - Your New Offer"

Name field in the sending Dataextension: 
Alex

Pass 1: 
%%Name%% - Your New Offer

Pass 2: 
Alex - Your new offer

How to fix:

Set the Subject Line to use TREATASCONTENT and add %%__SINGLE_RESOLVE%%

Subject: 
%%=TREATASCONTENT(SubjectLine)=%% %%__SINGLE_RESOLVE%%

SubjectLine field in the sending Dataextension:
"%%Name%% - Your New Offer"

Name field in the sending Dataextension: 
Alex

Pass 1:
Alex - Your new offer

Pass 2:
(There is no pass 2 with %%__SINGLE_RESOLVE%%)

Alternate fix without TreatAsContent() but instead using Concat()

Subject: 
%%=v(SubjectLine)=%% %%__SINGLE_RESOLVE%%

Body:
SET @SubjectLine = concat(Name," - Your New Offer")

Name: 
Alex

Pass 1:
Alex - Your new offer

Pass 2:
(There is no pass 2 with %%__SINGLE_RESOLVE%%)

Alternate fix with AMPscript ONLY in Subject line

Subject:

%%=concat(Name," - Your New Offer")=%% %%__SINGLE_RESOLVE%%

Name field in the sending Dataextension: 

Alex


Pass 1:

Alex - Your new offer

Pass 2:

(There is no pass 2 with %%__SINGLE_RESOLVE%%)

Use Case 2: Using AMPscript functions in a subject line variable

Subject: 
%%=V(@SubjectLine)=%%

Name:
Alex

SpendDollars:
$100

Body:
SET @SubjectLine = "%%=ProperCase(@Name)=%%, you have spent %%=V(@SpentDollars)=%% this month"

Pass 1: 
%%=ProperCase(@Name)=%%, you have spent %%=V(@SpentDollars)=%% this month

Pass 2: 
Alex, you have spent $100 this month

How to fix:

Set the Subject Line to use TreatAsContent() and add %%__SINGLE_RESOLVE%%

Subject: 
%%=TREATASCONTENT(@SubjectLine)=%% %%__SINGLE_RESOLVE%%

Name:
Alex

SpendDollars:
$100

Body:
SET @SubjectLine = "%%=ProperCase(@Name)=%%, you have spent %%=V(@SpentDollars)=%% this month"

Pass 1: 
Alex, you have spent $100 this month

Pass 2
(There is no pass 2 with %%__SINGLE_RESOLVE%%)

Alternate fix without TreatAsContent() but instead using Concat()

Subject: 
%%=v(@SubjectLine)=%% %%__SINGLE_RESOLVE%%

Name:
Alex

SpendDollars:
$100

Body:
SET @SubjectLine = concat(ProperCase(@Name),", you have spent ",@SpentDollars," this month")

Pass 1: 
Alex, you have spent $100 this month

Pass 2:
(There is no pass 2 with %%__SINGLE_RESOLVE%%)

Alternate fix with AMPscript ONLY in Subject line

Subject: 
%%=concat(ProperCase(@Name),", you have spent ",@SpentDollars," this month")=%% %%__SINGLE_RESOLVE%%

Name:
Alex

SpendDollars:
$100

Pass 1: 
Alex, you have spent $100 this month

Pass 2:
(There is no pass 2 with %%__SINGLE_RESOLVE%%)

Use Case 3: Using AMPscript lookup in a subject line variable

Subject: 
%%=V(@subj)=%%

Subject_Data:
%%First_Name%%'s Weekly Update.

First_Name:
Alex

Body:
%%[
    SET @subjRow = LookupRows("Subject_Data", "SubscriberKey", _subscriberkey)
    IF RowCount(@subjRow) > 0 THEN
        SET @subj = Field(Row(@subjRow, 1), "SubjectLineContent")
    ELSE
        SET @subj = "Your Weekly Update"
    ENDIF
]%%

Pass 1: 
%%First_Name%%'s Weekly Update.

Pass 2: 
Alex Weekly Update

How to fix:

Set the Subject Line to use TreatAsContent() and add %%__SINGLE_RESOLVE%% to enforce only resolving the subject line once.

Subject: 
%%=TREATASCONTENT(@subj)=%% %%__SINGLE_RESOLVE%%

SubjectLineContent:
%%First_Name%%'s Weekly Update.

First_Name:
Alex

Body:
%%[
    SET @subjRow = LookupRows("Subject_Data", "SubscriberKey", _subscriberkey)
    IF RowCount(@subjRow) > 0 THEN
        SET @subj = Field(Row(@subjRow, 1), "SubjectLineContent")
    ELSE
        SET @subj = "Your Weekly Update"
    ENDIF
]%%

Pass 1: 
Alex’s Weekly Update

Pass 2:
(There is no pass 2 with %%__SINGLE_RESOLVE%%)

Use Case 4: Using SSJS with AMPscript in a subject line variable

Subject: 
%%=v(@subjectLine)=%%  

widgetType:
springs.

subscriberName:
Alex

Body:
%%[
    SET @subjectLine = "You have sent %%=v(@subscriberName)=%% %%=v(@widgetType)=%%"
]%%

<script runat="server>

var payload = Platform.Recipient.GetAttributeValue("payload");
 payload = Platform.Function.ParseJSON(payload);
 var Content = payload.emailSend.emailContent;
 Platform.Variable.SetValue("@subscriberName", Content.subscriberName);
 Platform.Variable.SetValue("@widgetType", Content.widgetType);

</script>

Pass 1: 
You have sent %%=v(@subscriberName)=%% %%=v(@widgetType)=%%

Pass 2: 
You have sent Alex springs.

How to fix:

Set the Subject Line to use TreatAsContent() and add %%__SINGLE_RESOLVE%%

Subject: 
%%=TREATASCONTENT(@subjectLine)=%%  %%__SINGLE_RESOLVE%%

widgetType:
springs.

subscriberName:
Alex

Body:
%%[
    SET @subjectLine = "You have sent %%=v(@subscriberName)=%% %%=v(@widgetType)=%%"
]%%

<script runat="server">

var payload = Platform.Recipient.GetAttributeValue("payload");
 payload = Platform.Function.ParseJSON(payload);
 var Content = payload.emailSend.emailContent;
 Platform.Variable.SetValue("@subscriberName", Content.subscriberName);
 Platform.Variable.SetValue("@widgetType", Content.widgetType);

</script>

Pass 1: 
You have sent Alex springs

Pass 2:
(There is no pass 2 with %%__SINGLE_RESOLVE%%)

Practical Considerations

1. Customers should update emails that they are currently using or intend to use in the future. For example, if a user created an email last week, used it once, and doesn't plan to reuse it, no action is needed. However, if they plan to reuse an old email in the future, they should update it before sending. 

2. Remember that triggered sends (including Journey Builder emails) do not reflect email changes until republished. When updating a triggered send email, customers must update the email AND republish the associated triggered sends. 

Knowledge 기사 번호

000391994

 
로드 중
Salesforce Help | Article