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.
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.
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%%)
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%%)
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%%)
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.
000391994

We use three kinds of cookies on our websites: required, functional, and advertising. You can choose whether functional and advertising cookies apply. Click on the different cookie categories to find out more about each category and to change the default settings.
Privacy Statement
Required cookies are necessary for basic website functionality. Some examples include: session cookies needed to transmit the website, authentication cookies, and security cookies.
Functional cookies enhance functions, performance, and services on the website. Some examples include: cookies used to analyze site traffic, cookies used for market research, and cookies used to display advertising that is not directed to a particular individual.
Advertising cookies track activity across websites in order to understand a viewer’s interests, and direct them specific marketing. Some examples include: cookies used for remarketing, or interest-based advertising.