Free sample · answers included

Free Salesforce Marketing Cloud Engagement Developer
Practice Questions

18 free Marketing Cloud Engagement Developer practice questions from our bank of 300 reviewed questions, picked across all 5 official exam sections in proportion to their weight. Each one shows the correct answer, why it is right and why the others are wrong, and the official documentation it was checked against.

Last updated

What is the Marketing Cloud Engagement Developer exam like?

60 + up to 5

Scored + unscored questions

105 min

Time limit

63%

Passing score

$200

Registration (retake $100)

Salesforce Certified Marketing Cloud Engagement Specialist Certification

Prerequisite

Confirm current details in the official Marketing Cloud Engagement Developer exam guide.

Questions by exam section

Heavier sections get more questions, the same way the real exam and our 60-question practice exams are weighted.

Data Modeling

14% of the exam
  1. Question 1 · Easier

    Ursa Major Solar's developer is building a table of installer depots with DepotCode, City and SupportPhone. Emails will look up the nearest depot to personalize content, but nobody will ever send a message to a depot. What type of data extension should the developer create?
    • A.A filtered data extension built from the All Subscribers list by depot city
    • B.A sendable data extension related to Subscriber Key on the DepotCode field
    • C.A non-sendable standard data extension used as reference data for personalization
    • D.A random data extension built from the subscriber data extension each night
    Show the answer and explanation
    Correct answer: C. A non-sendable standard data extension used as reference data for personalization
    The Trailhead unit describes non-sendable data extensions as reference data, such as airport codes, orders or product tables, used to personalize emails without being the audience of a send. Making it sendable on DepotCode would wrongly treat depots as subscribers. A random data extension selects a random sample from a source data extension, which isn't a lookup table. A filtered data extension is a segment of an existing data extension, not a standalone reference table.
  2. Question 2 · Harder · Choose 2

    After a Contact Delete completes at Northern Trail Outfitters, an audit finds the deleted customers still in Store_Visits, a non-sendable data extension that isn't part of any population in Data Designer. Which two actions should the developer take? Choose 2 answers.
    • A.Resubmit the same contact keys to Contact Delete with a longer suppression period so the next pass includes Store_Visits
    • B.Restore the deleted contacts and submit them again after linking Store_Visits to the contact with a one-to-one link
    • C.Remove the deleted customers' rows from Store_Visits directly, because Contact Delete doesn't cover that data extension
    • D.Combine Contact Delete with a data retention policy on Store_Visits, since retention alone doesn't ensure compliance
    • E.Mark Store_Visits as Used for Testing so that the next Contact Delete run scans it with the sendable data extensions
    Show the answer and explanation
    Correct answers: C. Remove the deleted customers' rows from Store_Visits directly, because Contact Delete doesn't cover that data extension; D. Combine Contact Delete with a data retention policy on Store_Visits, since retention alone doesn't ensure compliance
    The Contact Deletion article says the final deletion removes contact information from lists and sendable data extensions, does not apply to non-sendable data extensions not included in a population through Data Designer, and leaves you responsible for deleting that information yourself. The best practices article adds that retention policies don't ensure regulatory compliance and recommends using Contact Delete and retention policies together. A longer suppression period changes timing, not scope. Used for Testing applies only alongside Used for Sending and doesn't change what Contact Delete scans. Deleted contacts can't be restored.
  3. Question 3 · Harder · Choose 2

    A Universal Containers developer is documenting how Contact Builder decides who counts as a contact before the team designs its data model. Which two statements should the developer include? Choose 2 answers.
    • A.Deleted contacts stay in the contact count until the end of the billing period, and Held contacts are excluded from it
    • B.An individual counts as a contact once Journey Builder processes them in a journey, even if no message is sent on any channel
    • C.Two records with different Contact Key values but the same email address are merged and counted as one unique contact
    • D.Contact Builder counts an individual only after a message is delivered on at least one channel, so journey entries alone never count
    • E.Records used by queries, filters and data extracts can be saved with a Held status, and deleted contacts don't appear in the count
    Show the answer and explanation
    Correct answers: B. An individual counts as a contact once Journey Builder processes them in a journey, even if no message is sent on any channel; E. Records used by queries, filters and data extracts can be saved with a Held status, and deleted contacts don't appear in the count
    The contact definition article says Engagement considers an individual a contact if Journey Builder processes them in a journey, regardless of whether a message is sent. It also says some contacts are saved as Held because queries, filters and data extracts can still use them, and that deleted contacts don't appear in contact counts. Requiring a delivered message contradicts the Journey Builder rule. Deduplication is by Contact Key, so two keys with one email address count as two contacts. Deleted contacts don't linger in the count until a billing period ends.

Programmatic Languages

35% of the exam
  1. Question 4 · Harder

    Universal Containers' newsletter pulls a shared weekly article into every email with HttpGet(). To track who requested it, the developer appended &sk= plus each subscriber key to the URL. The send now takes far longer, and the content server is overloaded. What explains this?
    • A.Adding parameters makes the request use a non-standard port, which HttpGet() handles more slowly
    • B.One call is made per unique URL and the response is cached, so each subscriber key forces a new call
    • C.HttpGet() never caches responses whose URL has a query string, regardless of the parameter values
    • D.HttpGet() retries each request three times whenever the URL contains more than one parameter
    Show the answer and explanation
    Correct answer: B. One call is made per unique URL and the response is cached, so each subscriber key forces a new call
    When the URL is the same for multiple subscribers in a send, Marketing Cloud Engagement makes one call per unique URL and caches the response, so adding each subscriber key makes every URL unique and removes the benefit of caching. The documented behaviour depends on whether URLs are unique, not on whether a query string exists. Nothing in the reference describes automatic retries for URLs with parameters. Query string parameters don't change the port, and HttpGet() works only on port 80 or 443.
  2. Question 5 · Medium · Choose 2

    Ursa Major Solar's developer plans to report newsletter clicks by product line with alias="%%=Concat(ProductLine,' banner')=%%" on product links, in both the HTML and text versions. The product links currently sit inside a dynamic content block. Which two statements should the developer plan for? Choose 2 answers.
    • A.Dynamic link aliases are available only in HTML emails, so the text version can't split its clicks this way
    • B.The alias text appears to recipients when they hover over a link, so each alias value must be written for customers
    • C.Aliases must be static strings, because Marketing Cloud Engagement doesn't evaluate AMPscript in anchor attributes
    • D.Aliases on links inside an impression region aren't recorded, so insert the content with ContentBlockByKey() instead
    • E.Dynamic alias names have no limit, so every product line gets its own entry in the click metrics however many exist
    Show the answer and explanation
    Correct answers: A. Dynamic link aliases are available only in HTML emails, so the text version can't split its clicks this way; D. Aliases on links inside an impression region aren't recorded, so insert the content with ContentBlockByKey() instead
    The dynamic link alias page says AMPscript aliases are only available in HTML emails, and that aliases on links inside an impression region aren't recorded; because dynamic content blocks add impression regions automatically, it recommends inserting the block with ContentBlockByName(), ContentBlockByKey() or ContentBlockById() instead. The same page sets a limit of 100 alias names, after which excess aliases are grouped under a common name, so unlimited entries is wrong. The alias attribute isn't visible to recipients. AMPscript in the alias attribute is the documented way to create dynamic aliases.
  3. Question 6 · Harder

    Northern Trail Outfitters reuses one weekly email and overwrites its sendable data extension before each send. Subscribers who were dropped from the data extension report that the View as a Web Page links in their older emails no longer work. What does Salesforce recommend?
    • A.Use send logging and read the web page content from the send log when the message context is VAWP
    • B.Move the personalization to the subject line, which is stored as static text for web page views
    • C.Replace AMPscript with Dynamic Content rules, which are rendered once and saved for web page views
    • D.Copy the email for each week's send, because each copy keeps a stored rendering of its web page
    Show the answer and explanation
    Correct answer: A. Use send logging and read the web page content from the send log when the message context is VAWP
    A web page view re-renders the email with AMPscript, so when the same email is sent more than once without send logging and a recipient is removed from the data extension before the next send, their View as a Web Page link stops working. Salesforce recommends send logging for this case, with AMPscript that reads the send-time values from the send log when _messagecontext is VAWP. Copying the email doesn't keep the old subscriber row. The subject line is AMPscript content processed like the rest of the message, not stored static text. Dynamic Content rules also depend on the subscriber's data when the content is rendered.
  4. Question 7 · Harder

    Refer to a Cloud Kicks email block below.
    %%[ If _messagecontext == "SEND" then ]%%
        <p>Your member code: CK-4410</p>
    %%[ Else ]%%
        <p>Open this message in your inbox to see your code.</p>
    %%[ EndIf ]%%
    A subscriber clicks View as a Web Page in the sent email. What does the page show?
    • A.Nothing at all, because _messagecontext returns null whenever content is rendered outside an email
    • B.Both paragraphs, because conditional blocks are ignored when an email is rendered as a web page
    • C.Open this message in your inbox to see your code, because the context value isn't SEND on a web page view
    • D.Your member code: CK-4410, because the page is the same message that was sent to the subscriber
    Show the answer and explanation
    Correct answer: C. Open this message in your inbox to see your code, because the context value isn't SEND on a web page view
    _messagecontext has the value SEND when content is viewed as an email, but the documentation states that it doesn't have that value when an email is viewed as a web page; that view has the value VAWP. The condition is therefore false and the Else branch renders the inbox message. Treating the web page as the original send ignores the separate VAWP context. The variable isn't null outside email: it reports contexts such as VAWP, SITE and LANDINGPAGE. AMPscript, including If blocks, is still processed for web page views.
  5. Question 8 · Medium

    Cloud Kicks' order-status email should list each customer's three most recent orders from the Orders data extension, newest first. @key holds the customer's key. Which AMPscript call returns exactly those rows?
    • A.LookupOrderedRows("Orders", 3, "OrderDate DESC", "CustomerKey", @key)
    • B.LookupRows("Orders", "CustomerKey", @key, 3, "OrderDate DESC")
    • C.LookupOrderedRows("Orders", "OrderDate DESC", 3, "CustomerKey", @key)
    • D.LookupOrderedRows("Orders", 0, "OrderDate ASC", "CustomerKey", @key)
    Show the answer and explanation
    Correct answer: A. LookupOrderedRows("Orders", 3, "OrderDate DESC", "CustomerKey", @key)
    LookupOrderedRows() takes the data extension, then the number of rows, then the sort column with ASC or DESC, then the search column and value, so passing 3 and "OrderDate DESC" in that order returns the three newest orders. Swapping the row count and sort arguments breaks the documented parameter order. LookupRows() returns an unordered rowset and treats extra arguments as more search column and value pairs, not as a count and sort. A count of 0 returns all matching rows (up to 2,000), and ASC sorts the oldest orders first.
  6. Question 9 · Harder

    Refer to the exclusion script on a Cumulus Financial journey email below.
    ROWCOUNT(LOOKUPROWS("Recent_Buyers", "SubscriberKey", _subscriberkey)) > 0
    AND
    ROWCOUNT(LOOKUPROWS("Premier_Clients", "SubscriberKey", _subscriberkey)) == 0
    Which contact receives the email?
    • A.A contact who isn't in Recent_Buyers and isn't in Premier_Clients
    • B.A contact who is in Recent_Buyers and isn't in Premier_Clients
    • C.No contact who is in Recent_Buyers, whether or not they're a Premier client
    • D.No contact, because an exclusion script can contain only one condition
    Show the answer and explanation
    Correct answer: A. A contact who isn't in Recent_Buyers and isn't in Premier_Clients
    A contact is excluded when the whole script evaluates to true, and with AND both conditions must be true: the contact must be in Recent_Buyers and must not be in Premier_Clients. A contact in neither data extension fails the first condition, so the script is false and the contact receives the email; a recent buyer who is also a Premier client is sent the email too. A recent buyer who isn't a Premier client meets both conditions and is excluded. Exclusion scripts can combine conditions, as Salesforce's own OR example shows. Premier clients who bought recently aren't excluded, so not every recent buyer is skipped.

API

22% of the exam
  1. Question 10 · Medium

    Refer to the SOAP body below, which a Cumulus Financial developer sends with a valid access token:
    <RetrieveRequestMsg xmlns="http://exacttarget.com/wsdl/partnerAPI">
      <RetrieveRequest>
        <ObjectType>DataExtensionObject[MembershipRewardsProgramme]</ObjectType>
        <Properties>FirstName</Properties>
        <Properties>Surname</Properties>
        <Properties>Area</Properties>
        <Properties>RewardsPoints</Properties>
        <Filter xsi:type="SimpleFilterPart">
          <Property>MemberId</Property>
          <SimpleOperator>equals</SimpleOperator>
          <Value>dc415965-f672-4381-993f-1ffd00a9dab6</Value>
        </Filter>
      </RetrieveRequest>
    </RetrieveRequestMsg>
    What does this request return?
    • A.The four listed values for the matching rows plus the MemberId column, because filter properties are always returned
    • B.The field definitions of the MembershipRewardsProgramme data extension, including the data types of the four listed fields
    • C.The FirstName, Surname, Area and RewardsPoints values of the rows in that data extension whose MemberId matches the value
    • D.Every column of every row in the MembershipRewardsProgramme data extension, with MemberId used only to sort the rows
    Show the answer and explanation
    Correct answer: C. The FirstName, Surname, Area and RewardsPoints values of the rows in that data extension whose MemberId matches the value
    Putting the data extension name in brackets after DataExtensionObject targets that data extension's rows, Properties lists the columns to return, and the SimpleFilterPart limits the rows to those whose MemberId equals the value. The official sample response returns only FirstName, Surname, Area and RewardsPoints, so the filter column isn't added automatically. The filter limits the rows rather than sorting them, and not every column comes back. Field definitions come from the DataExtensionField object, not from a DataExtensionObject retrieve.
  2. Question 11 · Easier

    A Bloomington Caregivers integration runs a long batch of REST calls with a server-to-server token. Partway through, calls start returning HTTP 401 with the custom code 0, Not Authorized. What should the integration do?
    • A.Resend the call to the auth subdomain host, because 401 means the request was sent to the wrong REST host
    • B.Stop the batch and ask an admin to add scopes, because 401 with code 0 means the package lacks a permission
    • C.Wait for the number of seconds in the Retry-After header, because 401 means the account sent too many requests
    • D.Request a new access token from v2/token and retry the failed call, because the token is missing, invalid or expired
    Show the answer and explanation
    Correct answer: D. Request a new access token from v2/token and retry the failed call, because the token is missing, invalid or expired
    The error table maps HTTP 401 with custom code 0 to Not Authorized, meaning the access token in the request is missing, invalid or expired; a token lasts 20 minutes, so a long batch must request a new one from v2/token. Retry-After is documented for 429 and 503, not 401. Missing privileges are reported as 403 errors such as 20002 Insufficient Privileges. The auth subdomain only issues tokens and doesn't serve REST resources.
  3. Question 12 · Harder

    Cumulus Financial runs an Enterprise 2.0 account. An integration authenticated at the parent business unit must retrieve SentEvent data for only one child business unit, MID 7281934, without pulling events from the other children. How should the developer build the RetrieveRequest?
    • A.Set QueryAllAccounts to true and then filter the events afterwards on the MID value 7281934
    • B.Put 7281934 in the ContinueRequest property so the retrieve continues in the child account
    • C.Add a ClientIDs entry whose ID is 7281934 so the retrieve runs against that child account
    • D.Set RetrieveAllSinceLastBatch to true with the MID value 7281934 as the request's Properties
    Show the answer and explanation
    Correct answer: C. Add a ClientIDs entry whose ID is 7281934 so the retrieve runs against that child account
    The RetrieveRequest ClientIDs property specifies the accounts and sub-accounts, including Enterprise 2.0, to retrieve data from, so a ClientID for the child MID scopes the call to that business unit. QueryAllAccounts queries the parent and all children and ignores specified ClientIDs, which pulls far more than needed. RetrieveAllSinceLastBatch handles incremental retrieval, and Properties lists fields to return rather than an account. ContinueRequest takes the RequestID of an earlier retrieve to page results, not a MID.
  4. Question 13 · Harder

    Cumulus Financial still runs an integration built in 2018 on a legacy installed package that requests tokens from v1/requestToken. The security team now wants that integration on OAuth 2.0 client credentials with 20-minute tokens. What should the developer recommend?
    • A.Convert the legacy package to enhanced functionality from its Licenses tab, keeping the same client ID and secret
    • B.Keep the legacy package and change its code to call v2/token, because legacy packages accept both endpoints
    • C.Create a new enhanced package with a server-to-server API integration and move the code to its v2/token endpoint
    • D.Keep v1/requestToken but add grant_type client_credentials, which shortens legacy tokens to a 20-minute lifetime
    Show the answer and explanation
    Correct answer: C. Create a new enhanced package with a server-to-server API integration and move the code to its v2/token endpoint
    Legacy integrations must keep using v1/requestToken and can't use OAuth 2.0 flows, while enhanced packages use v2/token with 20-minute tokens, so moving to OAuth 2.0 means a new enhanced package, which is the only kind that can be created since legacy creation was deprecated in August 2019. A legacy package can't call v2/token. The Licenses tab manages user licensing on a legacy package and doesn't convert it. Adding a grant type to the legacy endpoint doesn't turn it into OAuth 2.0; legacy tokens keep their 1-hour lifetime.

Data Management

22% of the exam
  1. Question 14 · Harder

    Bloomington Caregivers' email send log has a custom field named ShiftCode. The developer adds this AMPscript to a volunteer reminder email that is sent with send logging enabled:
    %%[
    VAR @code, @ShiftCode
    SET @code = Lookup("Shifts", "ShiftCode", "VolunteerID", VolunteerID)
    ]%%
    After the send, ShiftCode is empty in every send log row. What should the developer change?
    • A.Output the value with %%=v(@code)=%% in the email body, because only values that are displayed get logged
    • B.Remove @ShiftCode from the VAR statement, because declared variables override the send log field
    • C.Rename the send log field to code, because send log fields must match the name of the Lookup's return field
    • D.Set @ShiftCode instead of @code, because a log field is filled from the variable of the same name
    Show the answer and explanation
    Correct answer: D. Set @ShiftCode instead of @code, because a log field is filled from the variable of the same name
    The send logging knowledge article says send-time data is written to the send log when an AMPscript variable name matches a send log field name, as in its example that sets @EmailName for an EmailName field. Here @ShiftCode is declared but never set, while the looked-up value goes into @code, so the ShiftCode field receives nothing. The article's own example only sets the variable and doesn't display it. Declaring the variable is normal AMPscript and doesn't block logging. Renaming the field to code would match @code, not the Lookup's return field, and the requirement is a matching variable name.
  2. Question 15 · Medium · Choose 2

    Ursa Major Solar's installer roster lands on the Enhanced FTP with the same file name each time, but the vendor sometimes misses a day and the previous file stays in place. The import runs in an automation scheduled every 6 hours. The developer must make sure an old file isn't loaded and that the roster isn't imported again within 20 hours of the last import. Which two import settings should the developer configure? Choose 2 answers.
    • A.Bad Data Behavior, so that rows with invalid data are emailed to the notification address
    • B.Blank File Behavior, set to stop the import when the file has no rows
    • C.Map Manually, using a sample file that matches the roster's columns
    • D.Skip import if last import occurred within a specified time period
    • E.Fail import if file is older than a specified number of hours
    Show the answer and explanation
    Correct answers: D. Skip import if last import occurred within a specified time period; E. Fail import if file is older than a specified number of hours
    Fail import if file is older checks the file's modified date and stops the import when the file is older than the hours specified, which keeps a leftover file from being loaded. Skip import if last import occurred stops the import when one already ran within the specified period, which prevents a second load within 20 hours. Blank File Behavior only decides what happens when the file is empty, and the leftover file isn't empty. Bad Data Behavior handles invalid rows, and Map Manually only controls how columns are mapped, so neither addresses file age or import frequency.
  3. Question 16 · Medium · Choose 2

    Northern Trail Outfitters submitted a Contact Delete request for 200 customers using the default settings. Which two things happen after the suppression period elapses? Choose 2 answers.
    • A.Salesforce Support can restore the customers for 30 days if the request was made in error
    • B.Their rows in non-sendable data extensions outside Data Designer populations are deleted
    • C.Their rows in synchronized data extensions are deleted along with the source records in Sales Cloud
    • D.Tracking and preference information stored for them in sendable data extensions is removed
    • E.Their contact information is deleted from lists and sendable data extensions
    Show the answer and explanation
    Correct answers: D. Tracking and preference information stored for them in sendable data extensions is removed; E. Their contact information is deleted from lists and sendable data extensions
    Help says that after the suppression period elapses, contact information for the deleted contacts is removed from lists and sendable data extensions, and that this removal includes any tracking or preference information. The process doesn't apply to non-sendable data extensions that aren't included in a population through Data Designer. All contact deletion processes are final, and Salesforce can't restore deleted contact information. For synchronized data sources, you delete the record in the source cloud, which removes the synchronized row; Contact Delete doesn't delete Sales Cloud records.
  4. Question 17 · Medium

    Cloud Kicks sends its Price_Changes data extension to a pricing partner with a Data Extension Extract. The partner reports that discount rates stored in a Decimal field, such as 0.15, arrive as .15 and fail its validation. What should the developer do?
    • A.Set the delimiter to a pipe character so the decimal point isn't read as a column separator in the file
    • B.Turn on Convert_All_Dates_to_Selected_Timezone so numeric columns are formatted for the selected region
    • C.Turn on TextQualified so that every value, including Decimal values, keeps its leading zero inside quotes
    • D.Store the rate in a Text field, because the extract drops the zero before the decimal point in Decimal fields
    Show the answer and explanation
    Correct answer: D. Store the rate in a Text field, because the extract drops the zero before the decimal point in Decimal fields
    The Data Extension Extract page notes that when you export a Decimal field, the extract file omits the zero before the decimal point, and that storing the value in a Text field keeps it. TextQualified only controls whether text appears within double quotation marks and doesn't change how Decimal values are written. The decimal point isn't a delimiter, so changing to a pipe doesn't restore the zero. Convert_All_Dates_to_Selected_Timezone converts date and time columns and has no effect on numbers.

Security

7% of the exam
  1. Question 18 · Harder

    AW Computing has used Marketing Cloud Engagement for three years, and its customer data sits in data extensions created in Email Studio. Professional Services is now enabling field-level encryption so that email addresses are encrypted at rest. What must the developer plan for?
    • A.Change nothing, because turning on the feature encrypts text and email fields in every existing data extension
    • B.Edit each existing Email Studio data extension and mark the email address field as encrypted in its field properties
    • C.Run a Query Activity with the Overwrite action on each data extension so the platform rewrites its rows encrypted
    • D.Re-create the data extensions in Contact Builder with encrypted fields, load the data into them, then delete the old ones
    Show the answer and explanation
    Correct answer: D. Re-create the data extensions in Contact Builder with encrypted fields, load the data into them, then delete the old ones
    When field-level encryption is enabled in an account where it wasn't enabled before, existing data extensions must be re-created, and encrypted fields can be defined only in data extensions created through Contact Builder; the old data extensions can then be deleted. You can't select fields to encrypt in data extensions created from Email Studio, so editing the existing ones doesn't work. Overwriting rows with a Query Activity doesn't change how the data extension stores the field. The feature doesn't retroactively encrypt existing data extensions.

Where to go after these 18 questions

Get Marketing Cloud Engagement Developer exam updates by email

Occasional emails when Salesforce changes this exam, plus practice questions with full explanations.

Occasional emails about Salesforce exam changes, plus practice questions with full explanations. We'll email you to confirm. Unsubscribe anytime. See our privacy policy.

Ready for a full Marketing Cloud Engagement Developer practice exam?

Take a timed 60-question exam drawn from all 300 reviewed questions in the real exam's section mix, then drill the sections you miss.