Loading
Ongoing maintenance for Salesforce HelpRead More

MicrositeURL and CloudPagesURL Changes

Publish Date: May 29, 2026
Description

The Marketing Cloud Engagement product behavior for the MicrositeURL() and CloudPagesURL() functions has been updated. Effective 05/28/2026, parameter values are no longer re-evaluated after URL assembly. Personalization strings and AMPscript markers passed as string literals will be included in the URL as literal text — they will not resolve to subscriber values.

This change applies across all channels where these functions are used, including email, SMS, and push.

What changed

The functions previously assembled the destination URL and then the AMPscript processing engine performed a second evaluation pass over the newly assembled URL string. This second pass resolved personalization tokens like %%subscriberid%% and executed AMPscript functions like %%=Concat(...)=%% found within parameter values.

 

That second evaluation has been removed. Function arguments are evaluated once — where they are called — by the surrounding AMPscript block. The result is included in the URL as a string literal.

Patterns that no longer work

Personalization strings or AMPscript markers passed as quoted string literals will no longer resolve:

 

/* %%subscriberkey%% reaches the URL as literal text — not the actual key */

%%=CloudPagesURL(123, 'sid', '%%subscriberkey%%')=%%

 

/* The Concat expression reaches the URL as literal text — not executed */

%%=CloudPagesURL(123, 'name', '%%=Concat(@first, @last)=%%')=%%

 

/* Multiple affected parameters — all literal tokens remain unresolved */

%%=CloudPagesURL(123, 'sid', '%%subscriberkey%%', 'email', '%%emailaddr%%', 'jid', '%%jobid%%')=%%

 

%%=MicrositeURL(1, 'sid', '%%subscriberid%%')=%%

How to update your script to follow best practices

Resolve all values before passing them to the function. Three equivalent approaches:

Option 1 — Direct system variable references (simplest)

 

%%=CloudPagesURL(123, 'sid', _subscriberkey)=%%

 

%%=CloudPagesURL(123, 'sid', _subscriberkey, 'email', emailaddr, 'jid', jobid)=%%

 

%%=MicrositeURL(1, 'sid', _subscriberkey)=%%

Option 2 — Function calls as arguments

 

%%=CloudPagesURL(123, 'sid', AttributeValue('_subscriberkey'))=%%

 

%%=CloudPagesURL(123, 'name', Concat(@first, ' ', @last))=%%

Option 3 — Intermediate variables (clearest for complex logic)

 

%%[

  SET @sid = _subscriberkey

  SET @email = emailaddr

  SET @token = Base64Encode(Concat(@sid, '|', @email))

]%%

%%=CloudPagesURL(123, 'token', @token)=%%

 

All three produce the same result: the resolved value is passed to the function, and the URL contains the actual subscriber data.

 

Note: _subscriberkey returns the string-based Subscriber Key, while subscriberid returns the numeric Subscriber ID. These are different values. If your CloudPage landing logic uses RequestParameter() to look up a contact by numeric ID, use subscriberid in your script rather than _subscriberkey. Match what your original %%...%% personalization string was resolving to.

What is not affected

Variables and function calls passed as arguments — these already resolve during normal evaluation and continue to work without modification.

 

  • RedirectTo() — wrapping behavior is unchanged.

  • RequestParameter() on the receiving CloudPage — reads whatever value arrives in the URL. The issue is what value gets placed in the URL, not how it is read on the destination page.

  • Manually constructed URLs via Concat() — unaffected by this change.

  • SSJS — Server-Side JavaScript does not have a native CloudPagesURL equivalent. SSJS typically invokes the AMPScript function via Platform.Function.TreatAsContent(). Since the AMPScript function call resolves parameters at execution time (not via %%...%% tokens in string literals), SSJS usage is not affected by this change.

Action required

  1. Identify any active emails, journeys, triggered send definitions, SMS messages, or push messages that pass %%...%% personalization strings as quoted arguments to CloudPagesURL() or MicrositeURL(). Also check shared Content Blocks referenced via ContentBlockByKey() or ContentBlockByName().

  2. Update the code using one of the patterns above.

  3. For triggered send definitions, execute Publish Changes to pick up the updated content. Active Journey Builder journeys using the transactional messaging engine will pick up email content changes at the next send time without requiring a new journey version. Verify with a test send after updating.

 

As of 05/28/2026, unresolved tokens will appear as literal text in the encrypted URL payload, causing the destination CloudPage to receive the token string instead of the subscriber's actual value.

 

In summary, you must resolve all values in AMPscript before supplying them to the MicrositeURL() and CloudPagesURL() functions. The URL will no longer be evaluated twice.

How to identify affected content

The Content Builder UI search bar does not search within email HTML body content. Use one of the following methods to find affected templates.

Option 1 — Content Builder REST API (recommended for bulk discovery)

Use the advanced query endpoint to search email asset content for the affected pattern:  POST /asset/v1/content/assets/query

 

{

  "page": { "page": 1, "pageSize": 50 },

  "query": {

    "leftOperand": {

      "property": "assetType.id",

      "simpleOperator": "in",

      "value": [207, 208, 209]

    },

    "logicalOperator": "AND",

    "rightOperand": {

      "property": "content",

      "simpleOperator": "mustcontain",

      "value": "CloudPagesURL"

    }

  },

  "fields": ["id", "name", "content", "views"]

}

 

Repeat the query with "MicrositeURL" in the value field. Review the returned content for any parameter values containing %%...%% personalization strings in quotes.

 

To update an affected asset, PUT the corrected content. The payload structure depends on the asset type:  PUT /asset/v1/content/assets/{id}

Asset type 207 (template-based email):

 

{

  "views": {

    "html": {

      "content": "<updated HTML with corrected AMPscript>"

    }

  }

}

Asset type 208 (HTML email):

 

{

  "content": "<updated HTML with corrected AMPscript>"

}

Asset type 209 (text-only email):

 

{

  "views": {

    "text": {

      "content": "Updated text with corrected AMPscript"

    }

  }

}

 

Required Installed Package scopes: Saved Content (Read, Write).

Option 2 — Manual audit in Content Builder

Open each email or content block in Content Builder, switch to the HTML or Code View, and use your browser’s find function (Ctrl+F / Cmd+F) to search for CloudPagesURL or MicrositeURL. Check whether any parameter values contain %%...%% personalization strings in quotes.

How to verify your script changes

Use Subscriber Preview in Content Builder to confirm the corrected code works:

 

1. Open the email asset in Content Builder.

2. Click Preview & Test.

3. Select a test subscriber.

4. Inspect the rendered output. The CloudPagesURL will produce an encrypted URL (a long qs= parameter). If you still see literal %%...%% text in the URL, the scripting pattern has not been applied correctly.



Sending a test message to an internal address is also a valid verification method — click the link in the received email and confirm the destination CloudPage resolves subscriber data correctly.

Knowledge Article Number

005385624

 
Loading
Salesforce Help | Article