{
  "title": "SFMC Developer Certification - All Questions",
  "exam_code": "MCE-Dev-201",
  "total_questions": 286,
  "total_sets": 21,
  "passing_score_percent": 63,
  "domain_codes": {
    "A": "AMPscript",
    "S": "SQL & Data Views",
    "P": "API Integration",
    "D": "Data Modeling",
    "M": "Data Management",
    "E": "Security",
    "J": "SSJS",
    "B": "Journey Builder",
    "T": "Email Studio"
  },
  "sets": [
    {
      "set_number": 1,
      "set_name": "Practice Set 1",
      "question_count": 14,
      "domains_covered": {
        "AMPscript": 2,
        "Data Modeling": 1,
        "Security": 1,
        "SSJS": 1,
        "Data Management": 1,
        "SQL & Data Views": 4,
        "API Integration": 5
      },
      "questions": [
        {
          "id": 2,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Write an Exclusion Script comparing against a Boolean field SendBool in the Sendable DE:",
          "options": [
            {
              "label": "A",
              "text": "%%=Lookup('Excluded','SendBool','SubscriberKey',_SubscriberKey)=%%"
            },
            {
              "label": "B",
              "text": "%%SendBool%% < 1"
            },
            {
              "label": "C",
              "text": "%%=Lookup('Excluded','SendBool','Email',emailaddr)=%%"
            },
            {
              "label": "D",
              "text": "SendBool==1"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "%%=Lookup('Excluded','SendBool','SubscriberKey',_SubscriberKey)=%%",
          "explanation": "Lookup the Boolean field using personalization string _SubscriberKey (no @ prefix). Returns true/false to suppress the subscriber."
        },
        {
          "id": 18,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "NTO uses numeric identifier for Subscriber Key stored in a DE. Step required when creating relationships in Data Designer?",
          "options": [
            {
              "label": "A",
              "text": "Set Subscriber Key as a text data type before linking the data extension to Contact Key"
            },
            {
              "label": "B",
              "text": "Link the Contact Key to the Subscriber's email address when creating the relationship"
            },
            {
              "label": "C",
              "text": "Use a one-to-one cardinality when creating the relationship"
            },
            {
              "label": "D",
              "text": "Convert the Contact Key to numeric format to match"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Set Subscriber Key as a text data type before linking the data extension to Contact Key",
          "explanation": "Contact Key is stored as text in SFMC. Numeric Subscriber Key must be converted to text data type before the relationship can be created."
        },
        {
          "id": 13,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "A field value from a DE lookup contains a tab-delimited list. Which AMPscript function determines if a specific text string exists anywhere in the list?",
          "options": [
            {
              "label": "A",
              "text": "IndexOf"
            },
            {
              "label": "B",
              "text": "BuildRowSetFromString"
            },
            {
              "label": "C",
              "text": "Substring"
            },
            {
              "label": "D",
              "text": "Contains"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "IndexOf",
          "explanation": "IndexOf(string, searchString) returns position (0 if not found). Directly answers does it exist without iteration."
        },
        {
          "id": 169,
          "domain_code": "E",
          "domain": "Security",
          "question": "Cloud Kicks wants to encrypt and store form data submitted from a CloudPage in a DE using AMPscript. Which encryption option could be used? (S2 Q105)",
          "options": [
            {
              "label": "A",
              "text": "Asymmetric"
            },
            {
              "label": "B",
              "text": "SAML"
            },
            {
              "label": "C",
              "text": "Symmetric"
            },
            {
              "label": "D",
              "text": "Public Key"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Symmetric",
          "explanation": "AMPscript uses EncryptSymmetric() function with AES algorithm for encrypting data on CloudPages."
        },
        {
          "id": 199,
          "domain_code": "J",
          "domain": "SSJS",
          "question": "Developer leverages SOAP API to dynamically display Profile and Preference Attributes in a custom profile center. Which SOAP method supports dynamic functionality? (S2 Q135)",
          "options": [
            {
              "label": "A",
              "text": "Configure"
            },
            {
              "label": "B",
              "text": "Describe"
            },
            {
              "label": "C",
              "text": "Extract"
            },
            {
              "label": "D",
              "text": "Retrieve"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Describe",
          "explanation": "The Describe method retrieves metadata about API objects, enabling dynamic display of Profile and Preference Attribute names and values."
        },
        {
          "id": 181,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "NTO wants to exclude sending email at send time to specific subscribers based on a business rule in an Exclusion Script. Which type of send would support this functionality? (S2 Q117)",
          "options": [
            {
              "label": "A",
              "text": "Journey Builder Send SMS Activity"
            },
            {
              "label": "B",
              "text": "Send Marketing Cloud Email in Sales or Service Cloud"
            },
            {
              "label": "C",
              "text": "Automation Studio Send Email Activity"
            },
            {
              "label": "D",
              "text": "List Email Send in Email Studio"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Automation Studio Send Email Activity",
          "explanation": "Exclusion Scripts are supported in Automation Studio Send Email Activity. They are NOT supported in Journey Builder, SMS, or Sales/Service Cloud email sends."
        },
        {
          "id": 119,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Customer data has been imported into a staging DE. A text field named birthday contains date values in various formats. Some values are valid dates, but some are not. Which SQL keywords could be used to write the query? (S2 Q55)",
          "options": [
            {
              "label": "A",
              "text": "UPDATE, ISDATE, CONVERT CAST"
            },
            {
              "label": "B",
              "text": "WHERE, ISDATE, CONVERT CAST"
            },
            {
              "label": "C",
              "text": "CASE, ISDATE, CAST"
            },
            {
              "label": "D",
              "text": "SELECT, ISDATE, TRY_CONVERT"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "CASE, ISDATE, CAST",
          "explanation": "CASE for conditional per-row logic. ISDATE() to validate. CAST() to convert valid ones. Pattern: CASE WHEN ISDATE(birthday)=1 THEN CAST(birthday AS date)."
        },
        {
          "id": 143,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "How many months of data can a developer query from the tracking data views? (S2 Q79)",
          "options": [
            {
              "label": "A",
              "text": "One Month"
            },
            {
              "label": "B",
              "text": "There is no limit"
            },
            {
              "label": "C",
              "text": "Six Months"
            },
            {
              "label": "D",
              "text": "12 Months"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Six Months",
          "explanation": "SFMC system data views retain a maximum of 6 months of data. Any query filtering events older than 6 months will return no results."
        },
        {
          "id": 185,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer needs to identify all subscribers who were sent Job ID 420 but did not click any links. Which SQL statement produces the desired results? (S2 Q121)",
          "options": [
            {
              "label": "A",
              "text": "SELECT s.SubscriberKey FROM _Sent s LEFT JOIN _Click c ON s.SubscriberKey=c.SubscriberKey AND s.JobID=c.JobID WHERE s.JobID=420"
            },
            {
              "label": "B",
              "text": "SELECT s.SubscriberKey FROM _Sent s LEFT JOIN _Click c ON s.SubscriberKey=c.SubscriberKey AND s.JobID=c.JobID WHERE s.JobID=420 AND c.SubscriberKey IS NULL"
            },
            {
              "label": "C",
              "text": "SELECT s.SubscriberKey FROM _Sent s JOIN _Click c ON s.SubscriberKey=c.SubscriberKey AND s.JobID=c.JobID WHERE s.JobID=420"
            },
            {
              "label": "D",
              "text": "SELECT s.SubscriberKey FROM _Sent s WHERE s.JobID=420 AND s.SubscriberKey NOT IN (SELECT SubscriberKey FROM _Click)"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "SELECT s.SubscriberKey FROM _Sent s LEFT JOIN _Click c ON s.SubscriberKey=c.SubscriberKey AND s.JobID=c.JobID WHERE s.JobID=420 AND c.SubscriberKey IS NULL",
          "explanation": "LEFT JOIN anti-join: join on both SubscriberKey AND JobID, then WHERE c.SubscriberKey IS NULL keeps only those with no click record."
        },
        {
          "id": 124,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer is using the legacy endpoint www.exacttargetapis.com and has been asked to switch to Tenant Specific Endpoints (TSES). What is a benefit of switching to TSES? (S2 Q60)",
          "options": [
            {
              "label": "A",
              "text": "Improved API performance"
            },
            {
              "label": "B",
              "text": "A longer lasting OAuth token"
            },
            {
              "label": "C",
              "text": "API calls will no longer fail"
            },
            {
              "label": "D",
              "text": "Rate limits are automatically removed"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Improved API performance",
          "explanation": "TSEs route requests directly to your tenant specific infrastructure, improving performance by bypassing the shared routing layer."
        },
        {
          "id": 278,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer is writing a query to select unique subscribers who opened any emails sent since the beginning of the previous day. Which query would provide that result? (S3 Q57)",
          "options": [
            {
              "label": "A",
              "text": "SELECT DISTINCT o.SubscriberKey FROM _Open o INNER JOIN _Job j ON j.JobID=o.JobID WHERE o.SendDate>=CONVERT(date,GETDATE()-1)"
            },
            {
              "label": "B",
              "text": "SELECT DISTINCT o.SubscriberKey FROM _Open o WHERE o.OpenDate>=CONVERT(date,GETDATE()-1)"
            },
            {
              "label": "C",
              "text": "SELECT DISTINCT o.SubscriberKey FROM _Open o INNER JOIN _Job j ON j.JobID=o.JobID WHERE j.PickupTime>=CONVERT(date,GETDATE()-1)"
            },
            {
              "label": "D",
              "text": "SELECT DISTINCT o.SubscriberKey FROM _Open o WHERE o.IsUnique=1"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "SELECT DISTINCT o.SubscriberKey FROM _Open o INNER JOIN _Job j ON j.JobID=o.JobID WHERE j.PickupTime>=CONVERT(date,GETDATE()-1)",
          "explanation": "Join _Open to _Job. Filter on j.PickupTime (job start time) to get emails deployed since the previous day start."
        },
        {
          "id": 202,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer needs to push real-time updates of company product catalog to a DE. Which API option is available? (S2 Q138)",
          "options": [
            {
              "label": "A",
              "text": "Use the DataExtensionObject SOAP object"
            },
            {
              "label": "B",
              "text": "Upload a file to the Enhanced SFTP for import"
            },
            {
              "label": "C",
              "text": "Use the DataExtension SOAP object"
            },
            {
              "label": "D",
              "text": "Use the REST /data/v1/async DE endpoint"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Use the DataExtensionObject SOAP object",
          "explanation": "DataExtensionObject SOAP object with Create method inserts rows into a DE in real-time. DataExtension object manages structure, not rows."
        },
        {
          "id": 237,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer is building an integration with the Marketing Cloud API. In which way should the client ID and client secret credentials be stored? (S3 Q16)",
          "options": [
            {
              "label": "A",
              "text": "Store credentials in a key management system (KMS)"
            },
            {
              "label": "B",
              "text": "Set credentials as variables in application source code"
            },
            {
              "label": "C",
              "text": "Pass credentials in URL parameters over HTTPS"
            },
            {
              "label": "D",
              "text": "Hardcode in the Authorization header"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Store credentials in a key management system (KMS)",
          "explanation": "Credentials must be in a secure KMS. Never in source code (version control exposure), URL parameters (server log exposure), or hardcoded."
        },
        {
          "id": 282,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Company uses the REST API for triggered sends but gets Unable to queue Triggered Send request. There are no valid subscribers. The SOAP API response provides more detail. Which element of the SOAP API response provides this level of detail? (S3 Q61)",
          "options": [
            {
              "label": "A",
              "text": "ErrorCode"
            },
            {
              "label": "B",
              "text": "OverallStatus"
            },
            {
              "label": "C",
              "text": "ErrorDescription"
            },
            {
              "label": "D",
              "text": "RequestID"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "ErrorDescription",
          "explanation": "ErrorDescription provides the human-readable detail - which required DE field is missing from the payload."
        }
      ]
    },
    {
      "set_number": 2,
      "set_name": "Practice Set 2",
      "question_count": 15,
      "domains_covered": {
        "API Integration": 2,
        "Data Management": 1,
        "AMPscript": 5,
        "Security": 1,
        "SSJS": 1,
        "Data Modeling": 3,
        "SQL & Data Views": 2
      },
      "questions": [
        {
          "id": 7,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer gets Insufficient Privileges uploading base64 file to Content Builder via API Installed Package. What to check?",
          "options": [
            {
              "label": "A",
              "text": "Confirm the REST Base URI uses the correct subdomain"
            },
            {
              "label": "B",
              "text": "Validate client ID and client secret are correct"
            },
            {
              "label": "C",
              "text": "Confirm the Component's Channel options are available"
            },
            {
              "label": "D",
              "text": "Check the API rate limit quota"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Confirm the Component's Channel options are available",
          "explanation": "The Installed Package Component must have Content Builder channel access enabled for this upload operation."
        },
        {
          "id": 43,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "Marketing director wants to analyze Send, Click, and Open Data Views. Which activities generate data before SFTP transfer?",
          "options": [
            {
              "label": "A",
              "text": "Filter Activity > Data Extension Extract"
            },
            {
              "label": "B",
              "text": "Query Activity > Data Extension Extract"
            },
            {
              "label": "C",
              "text": "Query Activity > Tracking Extract"
            },
            {
              "label": "D",
              "text": "Tracking Extract > File Transfer"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Query Activity > Data Extension Extract",
          "explanation": "Query Activity runs SQL against data views into a target DE. Data Extension Extract exports that DE to Safehouse as a file."
        },
        {
          "id": 38,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer set up OAuth authentication successfully. REST call for triggered send returns 401 Unauthorized. What to check first?",
          "options": [
            {
              "label": "A",
              "text": "Automation permissions have been granted in Installed Packages"
            },
            {
              "label": "B",
              "text": "The email interaction has been published"
            },
            {
              "label": "C",
              "text": "Send permissions have been granted in Installed Packages"
            },
            {
              "label": "D",
              "text": "The OAuth token has not expired"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Send permissions have been granted in Installed Packages",
          "explanation": "The existing token lacks the specific send permission scope. Check the Installed Package component has send permissions granted."
        },
        {
          "id": 27,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer writes AMPscript to check if DE record exists and uses InsertDE() if not. Gets duplicate primary key error. Why?",
          "options": [
            {
              "label": "A",
              "text": "The InsertDE function comes AFTER the system added the row as part of the email send"
            },
            {
              "label": "B",
              "text": "The InsertDE function cannot be used at send time"
            },
            {
              "label": "C",
              "text": "The InsertDE function cannot be used with name and value pairs"
            },
            {
              "label": "D",
              "text": "InsertDE requires a transaction block"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "The InsertDE function comes AFTER the system added the row as part of the email send",
          "explanation": "At send time SFMC automatically creates a row in the sendable DE first. InsertDE() then finds it already exists. Use UpsertDE() instead."
        },
        {
          "id": 241,
          "domain_code": "E",
          "domain": "Security",
          "question": "NTO stores most of their customer data in Marketing Cloud. They do not mind their data being viewed in clear text within SFMC, but they want to ensure the underlying database files are encrypted at rest in case the physical media is stolen. Which encryption method? (S3 Q20)",
          "options": [
            {
              "label": "A",
              "text": "Encrypted Data Sending"
            },
            {
              "label": "B",
              "text": "Field-Level Encryption"
            },
            {
              "label": "C",
              "text": "Transparent Data Encryption"
            },
            {
              "label": "D",
              "text": "Salesforce Shield"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Transparent Data Encryption",
          "explanation": "TDE encrypts database files at the OS/disk level. It is transparent to the SFMC application - data is readable within platform but physical files on disk are encrypted."
        },
        {
          "id": 239,
          "domain_code": "J",
          "domain": "SSJS",
          "question": "Developer needs to process a payload from an external system in a CloudPage. What Marketing Cloud Server-Side JavaScript Platform function should be used for converting a string payload in JSON format to a JavaScript object? (S3 Q18)",
          "options": [
            {
              "label": "A",
              "text": "ParseJSON"
            },
            {
              "label": "B",
              "text": "CreateObject"
            },
            {
              "label": "C",
              "text": "Stringify"
            },
            {
              "label": "D",
              "text": "JSON.parse"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "ParseJSON",
          "explanation": "Platform.Function.ParseJSON() is the SFMC SSJS function to convert JSON strings to JavaScript objects. Standard JSON.parse() doesn't work in SFMC SSJS."
        },
        {
          "id": 127,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "A doctor's office creates Populations for staff, patients, and vendors. What is the maximum number of Populations that should be created to ensure performance? (S2 Q63)",
          "options": [
            {
              "label": "A",
              "text": "Three"
            },
            {
              "label": "B",
              "text": "One"
            },
            {
              "label": "C",
              "text": "Unlimited"
            },
            {
              "label": "D",
              "text": "Five"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Three",
          "explanation": "Hard limit: 3 Populations per SFMC account. More than 3 causes significant performance degradation system-wide."
        },
        {
          "id": 152,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "Developer started a Contact Delete process that is not complete. In which place would the Contact Delete process remove data? (S2 Q88)",
          "options": [
            {
              "label": "A",
              "text": "Sendable Data Extensions"
            },
            {
              "label": "B",
              "text": "Import Files on the Enhanced SFTP"
            },
            {
              "label": "C",
              "text": "ALL Data Extensions"
            },
            {
              "label": "D",
              "text": "All Contacts only"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Sendable Data Extensions",
          "explanation": "Contact Delete (in progress or complete) removes rows from Sendable Data Extensions only. Non-sendable DEs and SFTP files are untouched."
        },
        {
          "id": 165,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "Developer started a Contact Delete process that is now complete. In which place would the Contact Delete process remove data? (S2 Q101)",
          "options": [
            {
              "label": "A",
              "text": "ALL Data Extensions"
            },
            {
              "label": "B",
              "text": "Import Files on the Enhanced SFTP"
            },
            {
              "label": "C",
              "text": "Sendable Data Extensions"
            },
            {
              "label": "D",
              "text": "Non-sendable reference DEs"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Sendable Data Extensions",
          "explanation": "Completed Contact Delete removes rows from Sendable Data Extensions only. ALL DEs and Import Files on SFTP are not affected."
        },
        {
          "id": 195,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "NTO needs a query to aggregate clicks grouped by language of the recipient. Language is stored as a Profile Attribute. Which data views would be included? (S2 Q131)",
          "options": [
            {
              "label": "A",
              "text": "EnterpriseAttribute and _Click"
            },
            {
              "label": "B",
              "text": "AllSubscribers and _Click"
            },
            {
              "label": "C",
              "text": "Subscribers and _Click"
            },
            {
              "label": "D",
              "text": "ListSubscribers and _Click"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "EnterpriseAttribute and _Click",
          "explanation": "_EnterpriseAttribute contains custom profile attributes (like Language). Join it with _Click to aggregate clicks by language attribute."
        },
        {
          "id": 242,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer is experiencing timeouts when testing a SQL Query Activity in Automation Studio. How should the developer optimize the query? (S3 Q21)",
          "options": [
            {
              "label": "A",
              "text": "Limit joins to the INNER JOIN within all SQL Query Activities"
            },
            {
              "label": "B",
              "text": "Ensure all SQL Query Activities are in the same step in the automation"
            },
            {
              "label": "C",
              "text": "Use intermediate tables to break queries into smaller parts"
            },
            {
              "label": "D",
              "text": "Remove all aggregate functions"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Use intermediate tables to break queries into smaller parts",
          "explanation": "Break the complex query into smaller steps using intermediate staging DEs. Each query must complete within SFMC 30-minute auto-kill limit."
        },
        {
          "id": 164,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Which action could the RaiseError AMPscript function be configured to perform? (S2 Q100 - alternate options)",
          "options": [
            {
              "label": "A",
              "text": "Delete the subscriber record"
            },
            {
              "label": "B",
              "text": "Log the source of the error"
            },
            {
              "label": "C",
              "text": "Update the subscriber's status"
            },
            {
              "label": "D",
              "text": "Add subscriber to suppression list"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Log the source of the error",
          "explanation": "RaiseError can log the error source. It can also skip individual subscribers or cancel the entire send, but cannot update status or delete records."
        },
        {
          "id": 197,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "What AMPscript logic should be used to determine the background color of each table row within the loop? (S2 Q133)",
          "options": [
            {
              "label": "A",
              "text": "IF MOD(@numerator,2) = 1 THEN SET @color = 'Red' ELSE SET @color = 'White' ENDIF"
            },
            {
              "label": "B",
              "text": "IF @numerator/2 = 1 THEN SET @color = 'Red' ELSE SET @color = 'White' ENDIF"
            },
            {
              "label": "C",
              "text": "IF SUBSTRING(DIVIDE(@numerator,2),1) = 1 THEN SET @color = 'Red' ELSE SET @color = 'White' ENDIF"
            },
            {
              "label": "D",
              "text": "IF @numerator MOD 2 THEN SET @color = 'Red' ELSE SET @color = 'White' ENDIF"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "IF MOD(@numerator,2) = 1 THEN SET @color = 'Red' ELSE SET @color = 'White' ENDIF",
          "explanation": "MOD(@numerator, 2) returns remainder: 1 for odd (Red), 0 for even (White). DIVIDE returns decimals. MOD is the correct arithmetic function."
        },
        {
          "id": 225,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Why would a developer use LookupRows instead of the Lookup AMPscript function? (S3 Q4)",
          "options": [
            {
              "label": "A",
              "text": "To return a complete rowset from the data extension"
            },
            {
              "label": "B",
              "text": "To access a data extension, as Lookup only targets lists"
            },
            {
              "label": "C",
              "text": "To see how many rows are in a data extension"
            },
            {
              "label": "D",
              "text": "To improve performance on large data extensions"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "To return a complete rowset from the data extension",
          "explanation": "LookupRows returns ALL matching rows as a RowSet. Lookup returns ONE field from the FIRST matching row. Both functions access DEs."
        },
        {
          "id": 262,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer creates a CloudPage with AMPscript. @point gets value from RequestParameter(favfood) and @value is set to 5. With series of ELSEIF conditions checking Length(@point), what is @value if favFood = Tacos? (S3 Q41)",
          "options": [
            {
              "label": "A",
              "text": "1"
            },
            {
              "label": "B",
              "text": "4"
            },
            {
              "label": "C",
              "text": "5"
            },
            {
              "label": "D",
              "text": "3"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "4",
          "explanation": "Tacos has 5 characters. The ELSIF chain first matching condition (Length > 1) sets @value = 4."
        }
      ]
    },
    {
      "set_number": 3,
      "set_name": "Practice Set 3",
      "question_count": 15,
      "domains_covered": {
        "SQL & Data Views": 2,
        "SSJS": 1,
        "API Integration": 5,
        "AMPscript": 2,
        "Data Management": 3,
        "Data Modeling": 2
      },
      "questions": [
        {
          "id": 1,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Populate a DE with the date of the most recent click per subscriber. Which query?",
          "options": [
            {
              "label": "A",
              "text": "SELECT c.SubscriberKey,MAX(c.eventDate) AS eventDate FROM _Click c GROUP BY c.SubscriberKey"
            },
            {
              "label": "B",
              "text": "SELECT c.SubscriberKey,c.eventDate FROM _Click c WHERE c.isUnique=1"
            },
            {
              "label": "C",
              "text": "SELECT c.SubscriberKey,MIN(c.eventDate) AS eventDate FROM _Click c GROUP BY c.SubscriberKey"
            },
            {
              "label": "D",
              "text": "SELECT c.SubscriberKey,LAST(c.eventDate) FROM _Click c GROUP BY c.SubscriberKey"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "SELECT c.SubscriberKey,MAX(c.eventDate) AS eventDate FROM _Click c GROUP BY c.SubscriberKey",
          "explanation": "MAX(eventDate) returns the most recent date. MIN returns oldest. IsUnique=1 gets first click only. LAST() is not valid T-SQL."
        },
        {
          "id": 55,
          "domain_code": "J",
          "domain": "SSJS",
          "question": "What Marketing Cloud SSJS function converts a string payload in JSON format to a JavaScript object?",
          "options": [
            {
              "label": "A",
              "text": "Stringify"
            },
            {
              "label": "B",
              "text": "ParseJSON"
            },
            {
              "label": "C",
              "text": "CreateObject"
            },
            {
              "label": "D",
              "text": "Platform.Function.ParseJSON"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "ParseJSON",
          "explanation": "Platform.Function.ParseJSON(jsonString) converts JSON string to JS object in SFMC SSJS context. Standard JSON.parse() doesn't work here."
        },
        {
          "id": 26,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer troubleshoots why a parent-level DE cannot be accessed by a child BU. What to check to validate access for child BU queries?",
          "options": [
            {
              "label": "A",
              "text": "The DE is in Shared Data Extensions folder and query includes the ENT. prefix"
            },
            {
              "label": "B",
              "text": "The DE is in Salesforce Data Extensions folder and is accessible to child BU"
            },
            {
              "label": "C",
              "text": "The DE is in Synchronized Data Extensions folder and query includes ENT. prefix"
            },
            {
              "label": "D",
              "text": "The child BU must have Write access to the shared DE"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "The DE is in Shared Data Extensions folder and query includes the ENT. prefix",
          "explanation": "Two requirements: DE must be in Shared Data Extensions folder AND the SQL query must use the ENT. prefix (e.g., FROM ent.DEName)."
        },
        {
          "id": 41,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Company needs to retrieve a large number of rows from a DE via the API. Which solution optimizes performance?",
          "options": [
            {
              "label": "A",
              "text": "Use a SimpleFilterPart to retrieve small sets of relevant data"
            },
            {
              "label": "B",
              "text": "Use the REST API instead of the SOAP API"
            },
            {
              "label": "C",
              "text": "Use the AMPscript API functions on a CloudPage"
            },
            {
              "label": "D",
              "text": "Use the DataExtension SOAP object instead"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Use a SimpleFilterPart to retrieve small sets of relevant data",
          "explanation": "SimpleFilterPart reduces data per request. Combined with ContinueRequest for pagination, this optimizes large DE retrieval."
        },
        {
          "id": 42,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer wants to set a variable using a First Name field from the Sendable DE used to send the email. Which AMPscript is correct?",
          "options": [
            {
              "label": "A",
              "text": "SET @firstName = %%First Name%%"
            },
            {
              "label": "B",
              "text": "SET @firstName = AttributeValue('First Name')"
            },
            {
              "label": "C",
              "text": "SET @firstName = 'First Name'"
            },
            {
              "label": "D",
              "text": "SET @firstName = [First Name]"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "SET @firstName = AttributeValue('First Name')",
          "explanation": "AttributeValue('FieldName') reads a profile attribute or sendable DE field value at send time. Other options don't correctly retrieve the field value."
        },
        {
          "id": 53,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "NTO Enterprise 2.0 with 15 BUs can access Shared DE Inventory with Boolean field InStock. Which AMPscript returns all available products?",
          "options": [
            {
              "label": "A",
              "text": "LookupRows('Inventory','InStock','true')"
            },
            {
              "label": "B",
              "text": "LookupRows('Ent.Inventory','InStock','true')"
            },
            {
              "label": "C",
              "text": "LookupRows('Inventory','ItemName','InStock','true')"
            },
            {
              "label": "D",
              "text": "LookupRows('Ent.Inventory','InStock','ItemName','true')"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "LookupRows('Inventory','InStock','true')",
          "explanation": "LookupRows(DEname, searchField, value) - 3 parameters. ENT. prefix is for SQL queries, NOT required in AMPscript LookupRows."
        },
        {
          "id": 209,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "Developer receives a request for tracking data for all sends associated with a specific JobID, including Sends, Opens, Clicks, and Bounces. Which activity? (S2 Q145)",
          "options": [
            {
              "label": "A",
              "text": "File Transfer Activity"
            },
            {
              "label": "B",
              "text": "Campaign Data Extract"
            },
            {
              "label": "C",
              "text": "SQL Query Activity"
            },
            {
              "label": "D",
              "text": "Data Extension Extract"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "SQL Query Activity",
          "explanation": "SQL Query Activity against system data views (_Sent, _Open, _Click, _Bounce) filtered by JobID retrieves all required tracking data into a target DE."
        },
        {
          "id": 246,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "Customer wants to export send data to their SFTP. Which automation would accomplish this? (S3 Q25)",
          "options": [
            {
              "label": "A",
              "text": "Tracking Extract > File Transfer"
            },
            {
              "label": "B",
              "text": "Tracking Extract"
            },
            {
              "label": "C",
              "text": "Query (Data Views) > File Transfer"
            },
            {
              "label": "D",
              "text": "Data Extract > Import Activity"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Tracking Extract > File Transfer",
          "explanation": "Tracking Extract exports send tracking data to Safehouse (internal). File Transfer then moves it to the Enhanced FTP (external). Both steps required."
        },
        {
          "id": 271,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "NTO uses an external CRM which only exports encrypted files. They want to use some subscriber data for future marketing sends. Which action should be included in an automation? (S3 Q50)",
          "options": [
            {
              "label": "A",
              "text": "File drop to the SFTP Root directory"
            },
            {
              "label": "B",
              "text": "File transfer activity to the Import directory for decryption"
            },
            {
              "label": "C",
              "text": "File transfer activity to the Safehouse for decryption"
            },
            {
              "label": "D",
              "text": "Import Activity with built-in decryption"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "File transfer activity to the Safehouse for decryption",
          "explanation": "File Transfer Activity moves files from FTP to Safehouse AND handles decryption. Then Import Activity loads from Safehouse into DE."
        },
        {
          "id": 219,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "From which business unit can the Contact Delete feature be used within an Enterprise 2.0 account? (S2 Q155)",
          "options": [
            {
              "label": "A",
              "text": "The top level business unit"
            },
            {
              "label": "B",
              "text": "Any business unit"
            },
            {
              "label": "C",
              "text": "The business unit where the contact was introduced"
            },
            {
              "label": "D",
              "text": "The parent account's business unit"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "The top level business unit",
          "explanation": "Contact Delete is accessible only from the top-level parent business unit in an Enterprise 2.0 account setup."
        },
        {
          "id": 273,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "NTO has a sendable DE with 1,500,000 contact records they want to delete. Which step is required before deleting the contacts? (S3 Q52)",
          "options": [
            {
              "label": "A",
              "text": "Divide the records in half and delete each resulting data extension"
            },
            {
              "label": "B",
              "text": "Query the records into a new sendable data extension and delete it"
            },
            {
              "label": "C",
              "text": "Navigate to Contact Builder and delete the data extension"
            },
            {
              "label": "D",
              "text": "Use the REST API to delete contacts directly"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Query the records into a new sendable data extension and delete it",
          "explanation": "Contact Delete requires a sendable DE as the input source. Max batch is 1 million, so 1.5M must be split into batches."
        },
        {
          "id": 167,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "NTO is using REST API with async SOAP API call to TriggeredSend object. Which API object and attribute retrieves the status of the async API call? (S2 Q103)",
          "options": [
            {
              "label": "A",
              "text": "ResultItem Object and OrderID"
            },
            {
              "label": "B",
              "text": "ResultItem Object and RequestID"
            },
            {
              "label": "C",
              "text": "Result Object and EmailAddress"
            },
            {
              "label": "D",
              "text": "Automation Object and StatusID"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "ResultItem Object and RequestID",
          "explanation": "ResultItem object with RequestID attribute is used to check the status of an asynchronous SOAP API TriggeredSend call."
        },
        {
          "id": 214,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Which aspect should a developer consider before creating a Server-to-Server Installed Package? (S2 Q150 - alternate version)",
          "options": [
            {
              "label": "A",
              "text": "Using an Installed Package, APIs will have access to resources only in the Business Unit where it was created"
            },
            {
              "label": "B",
              "text": "Using an Installed Package, APIs will have access to resources in all Business Units"
            },
            {
              "label": "C",
              "text": "Scope will be granted based on the User who is creating the Installed Package"
            },
            {
              "label": "D",
              "text": "Scope is inherited from the organization's admin settings"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Using an Installed Package, APIs will have access to resources only in the Business Unit where it was created",
          "explanation": "By default, Installed Package access is scoped to the BU where it was created. Enterprise-wide access must be explicitly configured."
        },
        {
          "id": 238,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer needs to use the /contacts/ route of the REST API to update records in a data extension. What should the developer verify before making the API call? (S3 Q17)",
          "options": [
            {
              "label": "A",
              "text": "Journey Builder should be configured to use the data extension"
            },
            {
              "label": "B",
              "text": "Each contact should already exist in All Subscribers"
            },
            {
              "label": "C",
              "text": "The data extension should be linked in an Attribute Group in Contact Builder"
            },
            {
              "label": "D",
              "text": "The DE must be in the Shared Data Extensions folder"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "The data extension should be linked in an Attribute Group in Contact Builder",
          "explanation": "The /contacts/ API route requires the target DE to be linked in an Attribute Group in Contact Builder."
        },
        {
          "id": 286,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer wants to inject a Contact into a journey using API. What method and route would be used to accomplish this? (S3 Q65)",
          "options": [
            {
              "label": "A",
              "text": "POST /contacts/v1/contacts"
            },
            {
              "label": "B",
              "text": "PUT /hub/v1/dataevents/key:{key}/rows/{primaryKeys}"
            },
            {
              "label": "C",
              "text": "POST /interaction/v1/events"
            },
            {
              "label": "D",
              "text": "GET /interaction/v1/events"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "POST /interaction/v1/events",
          "explanation": "POST /interaction/v1/events with ContactKey, EventDefinitionKey, and Data payload injects contacts into Journey Builder API Event Entry."
        }
      ]
    },
    {
      "set_number": 4,
      "set_name": "Practice Set 4",
      "question_count": 15,
      "domains_covered": {
        "Data Modeling": 2,
        "Security": 1,
        "SQL & Data Views": 2,
        "API Integration": 2,
        "AMPscript": 8
      },
      "questions": [
        {
          "id": 14,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "Legal team is concerned daily imports add subscribers already targeted for deletion. Behavior if send is initiated to that sendable DE?",
          "options": [
            {
              "label": "A",
              "text": "Records in the suppression phase will be excluded from sends"
            },
            {
              "label": "B",
              "text": "Records that have been deleted will be excluded from sends indefinitely"
            },
            {
              "label": "C",
              "text": "Records in the suppression phase will only be excluded if manually specified"
            },
            {
              "label": "D",
              "text": "All records will receive the email normally"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Records in the suppression phase will be excluded from sends",
          "explanation": "During Contact Delete suppression period, contacts are suppressed system-wide regardless of new imports adding them to DEs."
        },
        {
          "id": 49,
          "domain_code": "E",
          "domain": "Security",
          "question": "Developer needs to store encrypted data from SFMC as a file on an external server. What steps?",
          "options": [
            {
              "label": "A",
              "text": "Data Extract > File Transfer with Marketing Cloud Public Key"
            },
            {
              "label": "B",
              "text": "Create PGP Key > Data Extract > File Transfer with PGP checked"
            },
            {
              "label": "C",
              "text": "Shield Platform Encryption is required for encrypted data export"
            },
            {
              "label": "D",
              "text": "Use SFTP SSL - no additional setup needed"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Create PGP Key > Data Extract > File Transfer with PGP checked",
          "explanation": "Create PGP key in Key Management, run Data Extract to Safehouse, then File Transfer with PGP encryption enabled to move to external SFTP."
        },
        {
          "id": 25,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "Developer wants Synchronized DE of Leads with only records with a phone number. Fields: PhoneExists Boolean, ValidPhone Formula Boolean, ContactType Text. Which field for filtering?",
          "options": [
            {
              "label": "A",
              "text": "ContactType"
            },
            {
              "label": "B",
              "text": "ValidPhone"
            },
            {
              "label": "C",
              "text": "PhoneExists"
            },
            {
              "label": "D",
              "text": "PhoneNumber"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "ContactType",
          "explanation": "Synchronization configuration filters only work on Text type fields. ContactType (Text) is filterable; Boolean and Formula Boolean fields are not."
        },
        {
          "id": 62,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "A DE has 2 fields populated by a query. A 3rd field was recently added. Which SELECT statement is optimal for returning all columns?",
          "options": [
            {
              "label": "A",
              "text": "SELECT *"
            },
            {
              "label": "B",
              "text": "SELECT *, field1, field2, field3"
            },
            {
              "label": "C",
              "text": "SELECT field1, field2, field3"
            },
            {
              "label": "D",
              "text": "SELECT ALL FROM DataExtension"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "SELECT field1, field2, field3",
          "explanation": "Always specify exact field names. SELECT * with JOIN is NOT PERMITTED in SFMC. Named fields are explicit and safe across schema changes."
        },
        {
          "id": 52,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "NTO uses REST API to send emails after a purchase. Which token consideration applies?",
          "options": [
            {
              "label": "A",
              "text": "Make a token call and re-use the token until the token expires"
            },
            {
              "label": "B",
              "text": "Make a token call before each triggered send API call"
            },
            {
              "label": "C",
              "text": "Make a token call and re-use the token for that subscriber"
            },
            {
              "label": "D",
              "text": "Use a permanent API key instead"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Make a token call and re-use the token until the token expires",
          "explanation": "Reuse the token until it expires (~20 min). One token per call hits rate limits and adds latency to every send."
        },
        {
          "id": 63,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer implements custom profile center using LogUnsubEvent. Which required parameter in the Job Context section records an UnSubEvent?",
          "options": [
            {
              "label": "A",
              "text": "JobID, BatchID, SubscriberID"
            },
            {
              "label": "B",
              "text": "JobID, ListID, SubscriberID"
            },
            {
              "label": "C",
              "text": "JobID, ListID, and BatchID"
            },
            {
              "label": "D",
              "text": "JobID and SubscriberKey only"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "JobID, ListID, and BatchID",
          "explanation": "Job Context requires: JobID + ListID + BatchID. Together these uniquely identify the specific send batch that triggered the unsubscribe."
        },
        {
          "id": 72,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer used LookupRows to retrieve data when building a dynamic email. What should be the next step before using this rowset within a FOR Loop? (S2)",
          "options": [
            {
              "label": "A",
              "text": "Use Row to return a specific row of the rowset"
            },
            {
              "label": "B",
              "text": "Use RowCount to ensure the rowset contains data"
            },
            {
              "label": "C",
              "text": "Close the delimited AMPscript Code Block"
            },
            {
              "label": "D",
              "text": "Declare all variables first"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Use RowCount to ensure the rowset contains data",
          "explanation": "Always check RowCount(@rows) > 0 before entering a FOR loop to prevent rendering empty HTML tags when no data exists."
        },
        {
          "id": 93,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "NTO wants to exclude sending an email at send time to those with a record on the Exclude DE. Primary key is SubscriberKey. How would a developer write the Exclusion Script? (S2 Q29)",
          "options": [
            {
              "label": "A",
              "text": "Rowcount(LookupRows('Exclude', 'SubscriberKey', _SubscriberKey)) > 0"
            },
            {
              "label": "B",
              "text": "Rowcount(LookupRows('Exclude', 'SubscriberKey', _SubscriberKey)) > 1"
            },
            {
              "label": "C",
              "text": "Lookup('Exclude','SubscriberKey','EmailAddress', emailaddr_) == emailaddr_"
            },
            {
              "label": "D",
              "text": "LookupRows('Exclude','SubscriberKey',@email) > 0"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Rowcount(LookupRows('Exclude', 'SubscriberKey', _SubscriberKey)) > 0",
          "explanation": "Threshold must be > 0 (not > 1). Use personalization string _SubscriberKey (no @ prefix). > 1 misses subscribers with exactly one record."
        },
        {
          "id": 101,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "How should a developer write an Exclusion Script to exclude sending an email at send time when comparing against a Boolean field in the Sendable DE? (S2 Q37)",
          "options": [
            {
              "label": "A",
              "text": "%%=Lookup('Excluded', 'SendBool', '_SubscriberKey', _SubscriberKey)=%%"
            },
            {
              "label": "B",
              "text": "%%=Lookup('Excluded', 'SendBool', 'SubscriberKey', _SubscriberKey)=%%"
            },
            {
              "label": "C",
              "text": "%%SendBool%% < 1"
            },
            {
              "label": "D",
              "text": "SendBool==1"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "%%=Lookup('Excluded', 'SendBool', 'SubscriberKey', _SubscriberKey)=%%",
          "explanation": "The DE field name is SubscriberKey (without underscore). The 4th parameter uses personalization string _SubscriberKey. Option A incorrectly uses _SubscriberKey as the field name."
        },
        {
          "id": 128,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer created a landing page in CloudPages which returns unique content when subscriber data is located on a related data extension. Developer wants default content if no subscriber data is found. Which best practice? (S2 Q64)",
          "options": [
            {
              "label": "A",
              "text": "Use the RowCount function and an IF statement"
            },
            {
              "label": "B",
              "text": "Use the LookupOrderedRows and Row functions"
            },
            {
              "label": "C",
              "text": "Use the Lookup, Row, and Field functions"
            },
            {
              "label": "D",
              "text": "Use TreatAsContent with a conditional variable"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Use the RowCount function and an IF statement",
          "explanation": "RowCount()>0 check with IF/ELSE renders unique content when rows exist, default content in ELSE branch when none found."
        },
        {
          "id": 142,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer builds complex dynamic email with 3 sections and 4 possible content blocks each, sent to over 1 million contacts. Which best practice prevents blank emails? (S2 Q78)",
          "options": [
            {
              "label": "A",
              "text": "Send a test of every possible version using Test Send"
            },
            {
              "label": "B",
              "text": "Review every possible version using Subscriber Preview"
            },
            {
              "label": "C",
              "text": "Create separate emails for each version"
            },
            {
              "label": "D",
              "text": "Confirm every version has default content"
            }
          ],
          "correct_index": 3,
          "correct_answer_label": "D",
          "correct_answer_text": "Confirm every version has default content",
          "explanation": "Every dynamic content version must have default content in the ELSE branch. No match + empty ELSE = blank email sent to subscriber."
        },
        {
          "id": 279,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer troubleshoots why a parent-level DE cannot be accessed by a child business unit. What should the developer check? (S3 Q58)",
          "options": [
            {
              "label": "A",
              "text": "The DE is in the Shared Data Extensions folder and the query includes the ENT. prefix"
            },
            {
              "label": "B",
              "text": "The DE is in the Salesforce Data Extensions folder and is accessible to child BU"
            },
            {
              "label": "C",
              "text": "The DE is in the Synchronized Data Extensions folder and the query includes the ENT. prefix"
            },
            {
              "label": "D",
              "text": "The child BU must have Write access to the shared DE"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "The DE is in the Shared Data Extensions folder and the query includes the ENT. prefix",
          "explanation": "Two requirements: DE must be in Shared Data Extensions folder AND the SQL query must use the ENT. prefix (e.g., FROM ent.DEName)."
        },
        {
          "id": 203,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer wants to create an AMPscript FOR loop that populates HTML table rows. Where should the developer place the FOR keyword to begin the loop? (S2 Q139)",
          "options": [
            {
              "label": "A",
              "text": "Before the <table> tag"
            },
            {
              "label": "B",
              "text": "Before the <tr> tag"
            },
            {
              "label": "C",
              "text": "Before the <td> tag"
            },
            {
              "label": "D",
              "text": "Before the </tr> closing tag"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Before the <tr> tag",
          "explanation": "Place FOR loop start before the <tr> opening tag so each iteration generates a complete new table row including all <td> cells."
        },
        {
          "id": 228,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "NTO Enterprise 2.0 account with 15 business units. Each can access a Shared DE named Inventory with Boolean field InStock. Which snippet of AMPscript would return all products which are currently available? (S3 Q7)",
          "options": [
            {
              "label": "A",
              "text": "LookupRows('Ent.Inventory', 'InStock', 'true')"
            },
            {
              "label": "B",
              "text": "LookupRows('Inventory', 'ItemName', 'InStock', 'true')"
            },
            {
              "label": "C",
              "text": "LookupRows('Inventory', 'InStock', 'true')"
            },
            {
              "label": "D",
              "text": "LookupRows('Ent.Inventory','InStock','ItemName','true')"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "LookupRows('Inventory', 'InStock', 'true')",
          "explanation": "LookupRows(DEname, searchField, value) - 3 parameters. ENT. prefix is only needed in SQL queries, NOT in AMPscript LookupRows function calls."
        },
        {
          "id": 269,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer writes AMPscript to check if a DE record exists and uses InsertDE() if the record doesn't yet exist. Why would the developer receive an error stating the application cannot insert a duplicate value for the primary key? (S3 Q48)",
          "options": [
            {
              "label": "A",
              "text": "The InsertDE function cannot be used at send time"
            },
            {
              "label": "B",
              "text": "The InsertDE function comes after the system added the row as part of the email send"
            },
            {
              "label": "C",
              "text": "The InsertDE function cannot be used with name and value pairs"
            },
            {
              "label": "D",
              "text": "InsertDE requires a transaction block"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "The InsertDE function comes after the system added the row as part of the email send",
          "explanation": "At send time SFMC automatically creates a row in the sendable DE first. InsertDE() then finds it already exists. Use UpsertDE() instead."
        }
      ]
    },
    {
      "set_number": 5,
      "set_name": "Practice Set 5",
      "question_count": 15,
      "domains_covered": {
        "Data Management": 2,
        "Email Studio": 1,
        "Data Modeling": 1,
        "SQL & Data Views": 2,
        "API Integration": 7,
        "AMPscript": 2
      },
      "questions": [
        {
          "id": 28,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "Customer wants to export send data to their SFTP. Which automation accomplishes this?",
          "options": [
            {
              "label": "A",
              "text": "Query (Data Views) > File Transfer"
            },
            {
              "label": "B",
              "text": "Tracking Extract"
            },
            {
              "label": "C",
              "text": "Tracking Extract > File Transfer"
            },
            {
              "label": "D",
              "text": "Data Extract > Import Activity"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Tracking Extract > File Transfer",
          "explanation": "Tracking Extract exports tracking data to Safehouse (internal). File Transfer then moves it to the SFTP (external). Both steps required."
        },
        {
          "id": 137,
          "domain_code": "T",
          "domain": "Email Studio",
          "question": "A marketer troubleshoots why email send tracking is not available in Sales Cloud. MC Connect is installed properly. What to confirm next? (S2 Q73)",
          "options": [
            {
              "label": "A",
              "text": "The email was sent to the All Subscribers list"
            },
            {
              "label": "B",
              "text": "The tracking destination folder was set to My Tracking"
            },
            {
              "label": "C",
              "text": "The audience was a Salesforce Data Extension containing the appropriate SFID"
            },
            {
              "label": "D",
              "text": "The audience was built using a Triggered Send DE template"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "The audience was a Salesforce Data Extension containing the appropriate SFID",
          "explanation": "MC Connect tracking synchronization to Sales Cloud requires the audience to be a Salesforce Data Extension containing the SFID field."
        },
        {
          "id": 61,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "Customer wants a list of subscribers who were sent an email within the past 12 months. How to complete this request?",
          "options": [
            {
              "label": "A",
              "text": "Run a tracking extract via the SOAP API"
            },
            {
              "label": "B",
              "text": "Create a measure with criteria sent_date is after today minus 365 days"
            },
            {
              "label": "C",
              "text": "Query against the _Job and _Sent data views"
            },
            {
              "label": "D",
              "text": "Export from Email Studio reporting"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Query against the _Job and _Sent data views",
          "explanation": "Query _Sent (send events) joined with _Job (email job metadata including dates) to find subscribers sent emails in last 12 months."
        },
        {
          "id": 69,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "NTO uses a number to uniquely identify Contacts across different marketing channels. Which action ensures contacts relate across channels? (S2)",
          "options": [
            {
              "label": "A",
              "text": "Create Attribute Groups linking the unique identifier to the Contact for each Channel"
            },
            {
              "label": "B",
              "text": "Use a unique identifier specific to each channel and automatically connect them"
            },
            {
              "label": "C",
              "text": "Link the numeric field value to the Contact ID in Attribute Groups in Contact Builder"
            },
            {
              "label": "D",
              "text": "Use the Subscriber ID as the universal connector"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Create Attribute Groups linking the unique identifier to the Contact for each Channel",
          "explanation": "Create Attribute Groups in Contact Builder linking the shared unique ID to the Contact record for each channel."
        },
        {
          "id": 84,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Customer data has been imported into a staging DE and needs to be normalized. A text field named birthday contains date values in various formats. Some values are valid dates, but some are not. Which SQL keywords could be used? (S2)",
          "options": [
            {
              "label": "A",
              "text": "WHERE, ISDATE, CONVERT, CAST"
            },
            {
              "label": "B",
              "text": "UPDATE, ISDATE, CONVERT, CAST"
            },
            {
              "label": "C",
              "text": "CASE, ISDATE, CAST"
            },
            {
              "label": "D",
              "text": "SELECT, ISDATE, TRY_CONVERT"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "CASE, ISDATE, CAST",
          "explanation": "CASE for conditional per-row logic. ISDATE() to validate. CAST() to convert valid ones. Pattern: CASE WHEN ISDATE(birthday)=1 THEN CAST(birthday AS date)."
        },
        {
          "id": 94,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "NTO puts the word TEST at the beginning of the name for each test email. Which query would return the subscribers? (S2 Q30)",
          "options": [
            {
              "label": "A",
              "text": "SELECT * FROM _Job J INNER JOIN _Sent S on J.JobID = S.JobID WHERE J.EmailName = 'TEST%'"
            },
            {
              "label": "B",
              "text": "SELECT * FROM _Job J INNER JOIN _Sent S ON J.JobID=S.JobID WHERE J.EmailName LIKE 'TEST%'"
            },
            {
              "label": "C",
              "text": "SELECT * FROM _Job INNER JOIN _Sent on JobID = JobID WHERE EmailName LIKE 'TEST%'"
            },
            {
              "label": "D",
              "text": "SELECT SubscriberKey FROM _Sent WHERE EmailName LIKE 'TEST%'"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "SELECT * FROM _Job J INNER JOIN _Sent S ON J.JobID=S.JobID WHERE J.EmailName LIKE 'TEST%'",
          "explanation": "LIKE for wildcard matching. = 'TEST%' is an exact match. Table aliases required to avoid JOIN ambiguity."
        },
        {
          "id": 68,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer is building an integration with the Marketing Cloud API. In which way should the client ID and client secret credentials be stored? (S2)",
          "options": [
            {
              "label": "A",
              "text": "Set credentials as variables in application source code"
            },
            {
              "label": "B",
              "text": "Store credentials in a key management system (KMS)"
            },
            {
              "label": "C",
              "text": "Pass credentials in URL parameters over HTTPS"
            },
            {
              "label": "D",
              "text": "Hardcode in API call headers"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Store credentials in a key management system (KMS)",
          "explanation": "Credentials must be in a secure KMS. Never in source code (version control exposure), URL parameters (server log exposure), or hardcoded."
        },
        {
          "id": 78,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Which aspect should a developer consider before creating a Server-to-Server Installed Package and associated API Integration in Marketing Cloud? (S2)",
          "options": [
            {
              "label": "A",
              "text": "Scope (Permissions) will be granted based on the User who is creating the Installed Package"
            },
            {
              "label": "B",
              "text": "Scope (Permissions) must be specifically granted when creating an API Integration component inside an Installed Package"
            },
            {
              "label": "C",
              "text": "Using an Installed Package, APIs will have access to resources in all Business Units"
            },
            {
              "label": "D",
              "text": "The package automatically inherits admin permissions"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Scope (Permissions) must be specifically granted when creating an API Integration component inside an Installed Package",
          "explanation": "Scope must be explicitly configured when creating the API Integration component. It does NOT automatically inherit from the user role."
        },
        {
          "id": 97,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer wants to add an image to Content Builder via the API and retrieve the image published URL. Which method should the developer use? (S2 Q33)",
          "options": [
            {
              "label": "A",
              "text": "Use the SOAP API to create a Portfolio object and identify the Source property"
            },
            {
              "label": "B",
              "text": "GET using the REST API /asset/v1/content/assets and parse the FileProperties Parameter"
            },
            {
              "label": "C",
              "text": "POST to the REST API /asset/v1/content/assets and parse the FileProperties Parameter"
            },
            {
              "label": "D",
              "text": "PUT to /asset/v1/content/assets/{id} to trigger URL generation"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "POST to the REST API /asset/v1/content/assets and parse the FileProperties Parameter",
          "explanation": "POST uploads the image (base64-encoded). The response contains FileProperties.publishedURL - the CDN URL."
        },
        {
          "id": 125,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "A company gets the error Unable to queue Triggered Send request. There are no valid Subscribers. The SOAP API response element provides this level of detail: (S2 Q61)",
          "options": [
            {
              "label": "A",
              "text": "ErrorCode"
            },
            {
              "label": "B",
              "text": "ErrorDescription"
            },
            {
              "label": "C",
              "text": "OverallStatus"
            },
            {
              "label": "D",
              "text": "RequestID"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "ErrorDescription",
          "explanation": "ErrorDescription provides the human-readable detail - which required DE field is missing from the payload."
        },
        {
          "id": 135,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Which parameter should be used to track subscriber behavior when appending data to links in ParameterManager? (S2 Q71)",
          "options": [
            {
              "label": "A",
              "text": "Contact Key"
            },
            {
              "label": "B",
              "text": "Subscriber Key"
            },
            {
              "label": "C",
              "text": "Subscriber ID"
            },
            {
              "label": "D",
              "text": "Email Address"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Subscriber Key",
          "explanation": "Subscriber Key is the correct parameter to use in ParameterManager for tracking subscriber behavior on appended link data."
        },
        {
          "id": 168,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer builds a link in an email where href value is an AMPscript variable. What should the developer do within the anchor tag to ensure clicks are tracked? (S2 Q104)",
          "options": [
            {
              "label": "A",
              "text": "Wrap the variable in a RedirectTo function"
            },
            {
              "label": "B",
              "text": "Wrap the variable in a V function"
            },
            {
              "label": "C",
              "text": "Include a variable for the Alias attribute"
            },
            {
              "label": "D",
              "text": "Add tracking=true attribute to the anchor tag"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Wrap the variable in a RedirectTo function",
          "explanation": "Wrap the dynamic URL in RedirectTo() inside the href attribute: href='%%=RedirectTo(v(@dynamicURL))=%%' ensures SFMC tracks clicks."
        },
        {
          "id": 217,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer wants to programmatically inject Contacts into a journey via the REST API using POST. Which route? (S2 Q153)",
          "options": [
            {
              "label": "A",
              "text": "POST /interaction/v1/interactions"
            },
            {
              "label": "B",
              "text": "POST /interaction/v1/events"
            },
            {
              "label": "C",
              "text": "POST /contacts/v1/contactEvents"
            },
            {
              "label": "D",
              "text": "POST /journeys/v1/inject"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "POST /interaction/v1/events",
          "explanation": "POST /interaction/v1/events is the endpoint for API Event Entry in Journey Builder. Requires ContactKey, EventDefinitionKey, and Data payload."
        },
        {
          "id": 243,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer is making an API REST call to trigger an email Send. How long are Marketing Cloud v2 access tokens valid? (S3 Q22)",
          "options": [
            {
              "label": "A",
              "text": "Access tokens expire after 24 hours"
            },
            {
              "label": "B",
              "text": "Access tokens expire after 20 minutes"
            },
            {
              "label": "C",
              "text": "Each API call requires a new access token"
            },
            {
              "label": "D",
              "text": "Access tokens are valid for 60 minutes"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Access tokens expire after 20 minutes",
          "explanation": "OAuth v2 access tokens expire after approximately 20 minutes. Best practice: cache the token, reuse it until expiry, then request a new one."
        },
        {
          "id": 272,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Which AMPscript function group could most negatively impact send processing? (S3 Q51)",
          "options": [
            {
              "label": "A",
              "text": "Date Time"
            },
            {
              "label": "B",
              "text": "String functions"
            },
            {
              "label": "C",
              "text": "Data extension functions"
            },
            {
              "label": "D",
              "text": "Utility functions"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Data extension functions",
          "explanation": "Data extension functions execute database queries for EVERY subscriber during the send. String and date functions run in-memory and are fast."
        }
      ]
    },
    {
      "set_number": 6,
      "set_name": "Practice Set 6",
      "question_count": 15,
      "domains_covered": {
        "SSJS": 2,
        "AMPscript": 4,
        "Data Management": 1,
        "Data Modeling": 2,
        "SQL & Data Views": 5,
        "API Integration": 1
      },
      "questions": [
        {
          "id": 19,
          "domain_code": "J",
          "domain": "SSJS",
          "question": "Developer wants to handle unexpected errors on a custom subscription center in CloudPages. Which feature handles this?",
          "options": [
            {
              "label": "A",
              "text": "Using RaiseError AMPscript function when an error occurs"
            },
            {
              "label": "B",
              "text": "Wrapping the code in an AMPscript HandleError block"
            },
            {
              "label": "C",
              "text": "Wrapping the code in a Server-Side JavaScript Try/Catch block"
            },
            {
              "label": "D",
              "text": "Using Platform.Function.RaiseError"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Wrapping the code in a Server-Side JavaScript Try/Catch block",
          "explanation": "SSJS Try/Catch blocks gracefully handle unexpected runtime errors in CloudPages. AMPscript has no HandleError block."
        },
        {
          "id": 10,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "CloudPage returns unique content when subscriber data exists on related DE, with default content if no data found. Best practice?",
          "options": [
            {
              "label": "A",
              "text": "Use the LookupOrderedRows and Row functions"
            },
            {
              "label": "B",
              "text": "Use the RowCount function and an IF statement"
            },
            {
              "label": "C",
              "text": "Use the Lookup, Row, and Field functions"
            },
            {
              "label": "D",
              "text": "Use TreatAsContent with a conditional variable"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Use the RowCount function and an IF statement",
          "explanation": "RowCount()>0 check with IF/ELSE renders unique content when rows exist, default content in ELSE branch when none found."
        },
        {
          "id": 82,
          "domain_code": "J",
          "domain": "SSJS",
          "question": "Developer who is new to Marketing Cloud needs to design a landing page and chooses to use Server-Side JavaScript (SSJS). Which feature can the developer leverage in their Server-Side code? (S2)",
          "options": [
            {
              "label": "A",
              "text": "External Libraries to extend functionality"
            },
            {
              "label": "B",
              "text": "Include Try/Catch blocks within the code"
            },
            {
              "label": "C",
              "text": "Direct modification of the DOM"
            },
            {
              "label": "D",
              "text": "Access the browser's localStorage"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Include Try/Catch blocks within the code",
          "explanation": "SSJS (ECMAScript 3) runs server-side on SFMC servers. No DOM access. No external libraries. Full Try/Catch support available."
        },
        {
          "id": 114,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "NTO uses an external CRM which only exports encrypted files. They want to use some of the subscriber data found in the CRM for future marketing sends. Which action should be included in an automation given these requirements? (S2 Q50)",
          "options": [
            {
              "label": "A",
              "text": "File drop to the SFTP Root directory"
            },
            {
              "label": "B",
              "text": "File transfer activity to the Safehouse for decryption"
            },
            {
              "label": "C",
              "text": "File transfer activity to the Import directory for decryption"
            },
            {
              "label": "D",
              "text": "Import Activity with built-in decryption"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "File transfer activity to the Safehouse for decryption",
          "explanation": "File Transfer Activity moves files from FTP to Safehouse AND handles decryption. Then Import Activity loads from Safehouse into DE."
        },
        {
          "id": 74,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "NTO legal team is concerned about the Daily import process that adds subscribers to a Sendable DE, even when records have already been targeted for Deletion. Expected behavior if a send is initiated? (S2)",
          "options": [
            {
              "label": "A",
              "text": "Records in the suppression phase will only be excluded if manually specified during send time"
            },
            {
              "label": "B",
              "text": "Records that have been deleted will be excluded from sends indefinitely"
            },
            {
              "label": "C",
              "text": "Records in the suppression phase will be excluded from sends"
            },
            {
              "label": "D",
              "text": "All records will receive the email normally"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Records in the suppression phase will be excluded from sends",
          "explanation": "During Contact Delete suppression period, contacts are suppressed system-wide regardless of new imports adding them to DEs."
        },
        {
          "id": 116,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "NTO has a sendable DE with 1,500,000 contact records they want to delete. Which step is required before deleting the contacts? (S2 Q52)",
          "options": [
            {
              "label": "A",
              "text": "Divide the records in half and delete each resulting data extension"
            },
            {
              "label": "B",
              "text": "Query the records into a new sendable data extension and delete it"
            },
            {
              "label": "C",
              "text": "Navigate to Contact Builder and delete the data extension"
            },
            {
              "label": "D",
              "text": "Use the REST API to delete contacts directly"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Query the records into a new sendable data extension and delete it",
          "explanation": "Contact Delete requires a sendable DE as the input source. Max batch is 1 million, so 1.5M must be split into batches."
        },
        {
          "id": 121,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer is writing a query to select unique subscribers who opened any emails sent since the beginning of the previous day. Which query would provide that result? (S2 Q57)",
          "options": [
            {
              "label": "A",
              "text": "SELECT DISTINCT o.SubscriberKey FROM _Open o INNER JOIN _Job j ON j.JobID=o.JobID WHERE o.SendDate>=CONVERT(date,GETDATE()-1)"
            },
            {
              "label": "B",
              "text": "SELECT DISTINCT o.SubscriberKey FROM _Open o WHERE o.OpenDate>=CONVERT(date,GETDATE()-1)"
            },
            {
              "label": "C",
              "text": "SELECT DISTINCT o.SubscriberKey FROM _Open o INNER JOIN _Job j ON j.JobID=o.JobID WHERE j.PickupTime>=CONVERT(date,GETDATE()-1)"
            },
            {
              "label": "D",
              "text": "SELECT DISTINCT o.SubscriberKey FROM _Open o WHERE o.IsUnique=1"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "SELECT DISTINCT o.SubscriberKey FROM _Open o INNER JOIN _Job j ON j.JobID=o.JobID WHERE j.PickupTime>=CONVERT(date,GETDATE()-1)",
          "explanation": "Join _Open to _Job. Filter on j.PickupTime (job start time) to get emails deployed since the previous day start."
        },
        {
          "id": 145,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer wants to populate a DE with information about all emails deployed in the last seven days, containing JobID, EventDate, and counts of how many emails were sent with each JobID. Which data view? (S2 Q81)",
          "options": [
            {
              "label": "A",
              "text": "Job"
            },
            {
              "label": "B",
              "text": "Sent"
            },
            {
              "label": "C",
              "text": "Journey"
            },
            {
              "label": "D",
              "text": "Subscriber"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Sent",
          "explanation": "_Sent contains send events per subscriber with JobID and EventDate. COUNT + GROUP BY JobID provides the required counts of sends per job."
        },
        {
          "id": 188,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer wants to built email that dynamically populates physical addresses. Deployment goes to millions. Which AMPscript solution is fastest? (S2 Q124 via Q132 second)",
          "options": [
            {
              "label": "A",
              "text": "SET @address = LookupRows('Building Locations','Address','Id')"
            },
            {
              "label": "B",
              "text": "SET @address = Field(Row(LookupRows('Building Locations','Address','Id'),1),'Address')"
            },
            {
              "label": "C",
              "text": "SET @address = Lookup('Building Locations','Address','Id',@Id)"
            },
            {
              "label": "D",
              "text": "SET @address = LookupOrderedRows('Building Locations',1,'Id ASC','Id',@Id)"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "SET @address = Lookup('Building Locations','Address','Id',@Id)",
          "explanation": "Lookup() is fastest for retrieving a single value - returns one field from the first match. LookupRows returns a rowset requiring additional Row/Field calls."
        },
        {
          "id": 200,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Email requires custom AMPscript to append subscriber zip code to a link. Marketing Cloud must track who clicks. (Choose 2) Which two AMPscript functions? (S2 Q136)",
          "options": [
            {
              "label": "A",
              "text": "Concat / RedirectTo"
            },
            {
              "label": "B",
              "text": "Concat / Lookup"
            },
            {
              "label": "C",
              "text": "Concat / HTTPGet"
            },
            {
              "label": "D",
              "text": "Lookup / RedirectTo"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Concat / RedirectTo",
          "explanation": "Concat() builds the dynamic URL by appending zip code to base URL. RedirectTo() wraps the dynamic URL to ensure SFMC tracks clicks on the variable-based href."
        },
        {
          "id": 251,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "NTO puts the word TEST at the beginning of the name for each test email. Which query would return the subscribers who were sent those emails? (S3 Q30)",
          "options": [
            {
              "label": "A",
              "text": "SELECT * FROM _Job J INNER JOIN _Sent S on J.JobID=S.JobID WHERE J.EmailName='TEST%'"
            },
            {
              "label": "B",
              "text": "SELECT * FROM _Job J INNER JOIN _Sent S ON J.JobID=S.JobID WHERE J.EmailName LIKE 'TEST%'"
            },
            {
              "label": "C",
              "text": "SELECT * FROM _Job INNER JOIN _Sent on JobID=JobID WHERE EmailName LIKE 'TEST%'"
            },
            {
              "label": "D",
              "text": "SELECT SubscriberKey FROM _Sent WHERE EmailName LIKE 'TEST%'"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "SELECT * FROM _Job J INNER JOIN _Sent S ON J.JobID=S.JobID WHERE J.EmailName LIKE 'TEST%'",
          "explanation": "LIKE for wildcard matching. = 'TEST%' is an exact match. Table aliases required to avoid JOIN ambiguity."
        },
        {
          "id": 171,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer troubleshoots why API client_id and client_secret authenticate but fail to access data from a child BU. What to check? (S2 Q107)",
          "options": [
            {
              "label": "A",
              "text": "Installed Package has full Enterprise access to all available child BUs"
            },
            {
              "label": "B",
              "text": "The account_id and parent MID are included in the authorization call"
            },
            {
              "label": "C",
              "text": "The Installed Package has access to the selected child business unit"
            },
            {
              "label": "D",
              "text": "The child BU must be the BU where the package was created"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "The Installed Package has access to the selected child business unit",
          "explanation": "The Installed Package must be specifically configured with access to the target child business unit."
        },
        {
          "id": 204,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer sends email to 250,000 subscribers using UpdateDE to update a column value, but user cancels after only 400 emails sent. How many subscriber rows would be affected by UpdateDE? (S2 Q140)",
          "options": [
            {
              "label": "A",
              "text": "400 subscribers who were sent the email"
            },
            {
              "label": "B",
              "text": "No rows are updated"
            },
            {
              "label": "C",
              "text": "Only subscribers who exist in All Subscribers"
            },
            {
              "label": "D",
              "text": "250,000 - AMPscript executes before send checks"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "400 subscribers who were sent the email",
          "explanation": "UpdateDE executes at send time for each individual email rendered. Only the 400 subscribers who actually received the email have their DE rows updated."
        },
        {
          "id": 233,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer used LookupRows to retrieve data when building a dynamic email. What should be the next step before using this rowset within a FOR loop? (S3 Q12)",
          "options": [
            {
              "label": "A",
              "text": "Use RowCount to ensure the rowset contains data"
            },
            {
              "label": "B",
              "text": "Close the delimited AMPscript Code Block"
            },
            {
              "label": "C",
              "text": "Use Row to return a specific row of the rowset"
            },
            {
              "label": "D",
              "text": "Declare variables before the loop"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Use RowCount to ensure the rowset contains data",
          "explanation": "Always check RowCount(@rowset) > 0 before entering a FOR loop. Prevents rendering empty HTML container tags when no rows returned."
        },
        {
          "id": 285,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer created a landing page in CloudPages which returns unique content when subscriber data is located on a related DE. The developer does not know if all subscribers have rows in the related DE, and wants default content to render if no subscriber data is found. Which best practice? (S3 Q64)",
          "options": [
            {
              "label": "A",
              "text": "Use the RowCount function and an IF statement"
            },
            {
              "label": "B",
              "text": "Use the LookupOrderedRows and Row functions"
            },
            {
              "label": "C",
              "text": "Use the Lookup, Row, and Field functions"
            },
            {
              "label": "D",
              "text": "Use TreatAsContent with a conditional variable"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Use the RowCount function and an IF statement",
          "explanation": "RowCount()>0 check with IF/ELSE renders unique content when rows exist, default content in ELSE branch when none found."
        }
      ]
    },
    {
      "set_number": 7,
      "set_name": "Practice Set 7",
      "question_count": 13,
      "domains_covered": {
        "Security": 2,
        "API Integration": 3,
        "SSJS": 1,
        "Data Management": 2,
        "Data Modeling": 5,
        "SQL & Data Views": 1
      },
      "questions": [
        {
          "id": 15,
          "domain_code": "E",
          "domain": "Security",
          "question": "Developer needs a fully-branded CloudPage with Content Builder-hosted images secured via SSL. Minimum SSL certificates required?",
          "options": [
            {
              "label": "A",
              "text": "One"
            },
            {
              "label": "B",
              "text": "Three"
            },
            {
              "label": "C",
              "text": "Two"
            },
            {
              "label": "D",
              "text": "Four"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Two",
          "explanation": "Content SSL for the CloudPage domain + CDN/Portfolio SSL for images = minimum 2 certificates required."
        },
        {
          "id": 29,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer builds Marketing Cloud API integration. How should client ID and client secret credentials be stored?",
          "options": [
            {
              "label": "A",
              "text": "Pass credentials in URL parameters over HTTPS"
            },
            {
              "label": "B",
              "text": "Store credentials in a key management system (KMS)"
            },
            {
              "label": "C",
              "text": "Set credentials as variables in application source code"
            },
            {
              "label": "D",
              "text": "Hardcode in the API call headers"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Store credentials in a key management system (KMS)",
          "explanation": "Credentials must be in a secure KMS. Never in source code (version control), URL parameters (server logs), or hardcoded."
        },
        {
          "id": 117,
          "domain_code": "E",
          "domain": "Security",
          "question": "Developer needs to configure a process that can store encrypted data from Marketing Cloud as a file on an external server. What steps should the developer take? (S2 Q53)",
          "options": [
            {
              "label": "A",
              "text": "Shield Platform Encryption is required for encrypted data export"
            },
            {
              "label": "B",
              "text": "Create PGP Key > Data Extract > File Transfer with PGP checked"
            },
            {
              "label": "C",
              "text": "Data Extract > File Transfer with Marketing Cloud Public Key"
            },
            {
              "label": "D",
              "text": "Use SFTP SSL - no additional setup needed"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Create PGP Key > Data Extract > File Transfer with PGP checked",
          "explanation": "Create PGP key in Key Management, run Data Extract to Safehouse, then File Transfer with PGP encryption enabled to move to external SFTP."
        },
        {
          "id": 163,
          "domain_code": "J",
          "domain": "SSJS",
          "question": "Developer wants CloudPages to work with a REST API returning data in JSON format. Which function should be used to efficiently ingest the data and write it to a DE? (S2 Q99)",
          "options": [
            {
              "label": "A",
              "text": "AMPscript function BuildRowSetFromString"
            },
            {
              "label": "B",
              "text": "Guide Template Language {{.data}} tag"
            },
            {
              "label": "C",
              "text": "Server-Side JavaScript function ParseJSON"
            },
            {
              "label": "D",
              "text": "AMPscript HTTPGet and LookupRows combination"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Server-Side JavaScript function ParseJSON",
          "explanation": "Platform.Function.ParseJSON() in SSJS converts JSON response to a JS object, which can then be iterated and written to a DE using DataExtension methods."
        },
        {
          "id": 166,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "Developer needs to import a file nightly that could arrive any time between 2am and 5am, with unique file name. Which action should be configured? (S2 Q102)",
          "options": [
            {
              "label": "A",
              "text": "Scheduled Automation"
            },
            {
              "label": "B",
              "text": "File Drop Automation"
            },
            {
              "label": "C",
              "text": "Dynamic File Import"
            },
            {
              "label": "D",
              "text": "Triggered File Import"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "File Drop Automation",
          "explanation": "File Drop Automation fires immediately when a file matching the filename pattern arrives, regardless of time. Scheduled automation needs a fixed start time."
        },
        {
          "id": 184,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "Developer wants to create a Send Log DE to increase efficiency with tracking email sends. Which best practice should be utilized? (S2 Q120)",
          "options": [
            {
              "label": "A",
              "text": "Create a number of fields equal to the fields in the source data extension"
            },
            {
              "label": "B",
              "text": "Use Data Retention to limit the amount of data captured"
            },
            {
              "label": "C",
              "text": "Maximize the field size to accommodate all incoming data"
            },
            {
              "label": "D",
              "text": "Create a separate Send Log per triggered send definition"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Use Data Retention to limit the amount of data captured",
          "explanation": "Use Data Retention on the Send Log DE to prevent unlimited growth. Keep field count minimal - only what you need for reporting."
        },
        {
          "id": 155,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "Developer needs to import a file into a DE which contains transactional data. File includes a column labeled Purchase_Price with values varying from '$.05' to '$100'. What Data Type should be used to prevent loss of data? (S2 Q91)",
          "options": [
            {
              "label": "A",
              "text": "Text"
            },
            {
              "label": "B",
              "text": "Decimal(9,2)"
            },
            {
              "label": "C",
              "text": "Number"
            },
            {
              "label": "D",
              "text": "Currency"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Text",
          "explanation": "The $ symbol means these values CANNOT be stored as Number or Decimal (numeric types only accept numbers). Text type stores the full value including the $ symbol."
        },
        {
          "id": 205,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "Developer needs to import a file into a DE which contains transactional data. File includes a column labeled Purchase_Price with values varying from '$.05' to '$100'. What Data Type prevents loss of data? (S2 Q141)",
          "options": [
            {
              "label": "A",
              "text": "Number"
            },
            {
              "label": "B",
              "text": "Decimal(9,2)"
            },
            {
              "label": "C",
              "text": "Text"
            },
            {
              "label": "D",
              "text": "Currency"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Text",
          "explanation": "The $ symbol means these values CANNOT be stored as Number or Decimal (numeric types only accept numbers). Text type stores the full value."
        },
        {
          "id": 226,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "Developer identified duplicate contacts and wants to delete roughly 10 million subscribers using Contact Delete. How could the process be expedited? (S3 Q5)",
          "options": [
            {
              "label": "A",
              "text": "Change the Suppression value to a larger value"
            },
            {
              "label": "B",
              "text": "Delete any unnecessary Sendable Data Extensions"
            },
            {
              "label": "C",
              "text": "Manually delete subscribers in All Contacts"
            },
            {
              "label": "D",
              "text": "Use parallel API delete requests"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Delete any unnecessary Sendable Data Extensions",
          "explanation": "Fewer Sendable DEs reduces cleanup work per contact. Larger suppression period slows (not speeds up) the process."
        },
        {
          "id": 275,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "NTO uses a number to uniquely identify contacts across different marketing channels. Which action should the developer take to ensure the contacts relate across channels? (S3 Q54)",
          "options": [
            {
              "label": "A",
              "text": "Use a unique identifier specific to each channel and automatically connect them"
            },
            {
              "label": "B",
              "text": "Create Attribute Groups linking the unique identifier to the Contact for each channel"
            },
            {
              "label": "C",
              "text": "Link the numeric field value to the Contact ID in Attribute Groups"
            },
            {
              "label": "D",
              "text": "Use the Subscriber ID as the universal connector"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Create Attribute Groups linking the unique identifier to the Contact for each channel",
          "explanation": "Create Attribute Groups in Contact Builder linking the shared unique ID to the Contact record for each channel."
        },
        {
          "id": 283,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer wants to populate a DE with the date of the most recent click for each subscriber. Which query would accomplish this? (S3 Q62)",
          "options": [
            {
              "label": "A",
              "text": "SELECT c.SubscriberKey, MAX(c.eventDate) AS eventDate FROM _Click c GROUP BY c.SubscriberKey"
            },
            {
              "label": "B",
              "text": "SELECT c.SubscriberKey, MIN(c.eventDate) AS eventDate FROM _Click c GROUP BY c.SubscriberKey"
            },
            {
              "label": "C",
              "text": "SELECT c.SubscriberKey, c.eventDate FROM _Click c WHERE c.IsUnique = 1"
            },
            {
              "label": "D",
              "text": "SELECT c.SubscriberKey, LAST(c.eventDate) FROM _Click c"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "SELECT c.SubscriberKey, MAX(c.eventDate) AS eventDate FROM _Click c GROUP BY c.SubscriberKey",
          "explanation": "MAX(eventDate) returns the most recent date. MIN returns oldest. IsUnique=1 gets first click only. LAST() is not valid T-SQL."
        },
        {
          "id": 218,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer integrates MC with a lead capture tool that creates a DE every time a new lead form is published. Which API feature enables dynamic DE creation? (S2 Q154)",
          "options": [
            {
              "label": "A",
              "text": "REST API using POST on /interaction/v1/EventDefinitions endpoint"
            },
            {
              "label": "B",
              "text": "SOAP API using Create Method and the DataExtension Object"
            },
            {
              "label": "C",
              "text": "Creating the data extension using API is not possible"
            },
            {
              "label": "D",
              "text": "REST API using POST on /data/v1/customobjectdata"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "SOAP API using Create Method and the DataExtension Object",
          "explanation": "SOAP API DataExtension.Create method creates DE structure programmatically. REST handles rows; SOAP handles structure."
        },
        {
          "id": 245,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer wants to retrieve a row of data from a data extension using the SOAP API. Which API Object should be used for this call? (S3 Q24)",
          "options": [
            {
              "label": "A",
              "text": "DataExtension"
            },
            {
              "label": "B",
              "text": "Row"
            },
            {
              "label": "C",
              "text": "DataExtensionObject"
            },
            {
              "label": "D",
              "text": "DataRow"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "DataExtensionObject",
          "explanation": "DataExtensionObject is the SOAP object for DE row operations. DataExtension manages DE structure (schema and field definitions), not rows."
        }
      ]
    },
    {
      "set_number": 8,
      "set_name": "Practice Set 8",
      "question_count": 13,
      "domains_covered": {
        "Email Studio": 1,
        "SQL & Data Views": 1,
        "AMPscript": 7,
        "Security": 1,
        "SSJS": 2,
        "Data Management": 2
      },
      "questions": [
        {
          "id": 8,
          "domain_code": "T",
          "domain": "Email Studio",
          "question": "The VAWP link displays The system is temporarily unavailable. What is the possible cause?",
          "options": [
            {
              "label": "A",
              "text": "The DE used for the send was moved to another folder"
            },
            {
              "label": "B",
              "text": "The data in the DEs used for the send was overwritten"
            },
            {
              "label": "C",
              "text": "The email used for the send was deleted, updated, or moved"
            },
            {
              "label": "D",
              "text": "The tracking URLs have expired"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "The email used for the send was deleted, updated, or moved",
          "explanation": "VAWP links depend on the email asset remaining intact at its original location. If deleted or moved, the page cannot render."
        },
        {
          "id": 9,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Query to select UNIQUE subscribers who opened emails sent since the BEGINNING of the previous day:",
          "options": [
            {
              "label": "A",
              "text": "SELECT DISTINCT o.SubscriberKey FROM _Open o WHERE o.OpenDate>=CONVERT(date,GETDATE()-1)"
            },
            {
              "label": "B",
              "text": "SELECT DISTINCT o.SubscriberKey FROM _Open o INNER JOIN _Job j ON j.JobID=o.JobID WHERE o.SendDate>=CONVERT(date,GETDATE()-1)"
            },
            {
              "label": "C",
              "text": "SELECT DISTINCT o.SubscriberKey FROM _Open o INNER JOIN _Job j ON j.JobID=o.JobID WHERE j.PickupTime>=CONVERT(date,GETDATE()-1)"
            },
            {
              "label": "D",
              "text": "SELECT DISTINCT o.SubscriberKey FROM _Open o WHERE o.IsUnique=1"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "SELECT DISTINCT o.SubscriberKey FROM _Open o INNER JOIN _Job j ON j.JobID=o.JobID WHERE j.PickupTime>=CONVERT(date,GETDATE()-1)",
          "explanation": "Join _Open to _Job. Filter on j.PickupTime (job start time) to get emails deployed since the previous day start."
        },
        {
          "id": 20,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer uses RaiseError when subscriber doesn't have necessary data to build an email. Which outcome is possible?",
          "options": [
            {
              "label": "A",
              "text": "An error message is sent to the From Address used in the email"
            },
            {
              "label": "B",
              "text": "The send is retried"
            },
            {
              "label": "C",
              "text": "The whole send is cancelled"
            },
            {
              "label": "D",
              "text": "The subscriber is logged to an error DE"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "The whole send is cancelled",
          "explanation": "RaiseError can skip one subscriber (skipLine=true) or cancel the entire send (skipLine=false). No retry or error email features."
        },
        {
          "id": 174,
          "domain_code": "E",
          "domain": "Security",
          "question": "Cloud Kicks wants to make sure no email from their welcome journey gets sent to competitor Rainbow Run. Which best practice? (S2 Q110)",
          "options": [
            {
              "label": "A",
              "text": "Create a Filter Activity in the journey that removes the Rainbow Run domain"
            },
            {
              "label": "B",
              "text": "Create a DE with the Rainbow Run domain for use with a Domain Exclusion"
            },
            {
              "label": "C",
              "text": "Create a Suppression List with all possible email addresses from Rainbow Run"
            },
            {
              "label": "D",
              "text": "Use an exclusion script to check email domain at send time"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Create a DE with the Rainbow Run domain for use with a Domain Exclusion",
          "explanation": "Domain Exclusion feature uses a DE containing domain names. SFMC automatically excludes all email addresses from those domains at send time."
        },
        {
          "id": 230,
          "domain_code": "J",
          "domain": "SSJS",
          "question": "Developer wants to build out a series of CloudPages that will interact with several REST APIs. Which Marketing Cloud supported scripting tool should be used? (S3 Q9)",
          "options": [
            {
              "label": "A",
              "text": "AMPscript"
            },
            {
              "label": "B",
              "text": "GTL"
            },
            {
              "label": "C",
              "text": "SSJS"
            },
            {
              "label": "D",
              "text": "Python"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "SSJS",
          "explanation": "SSJS (Server-Side JavaScript) is the correct tool for CloudPages that need to interact with REST APIs. AMPscript cannot make REST calls natively."
        },
        {
          "id": 266,
          "domain_code": "J",
          "domain": "SSJS",
          "question": "Developer wants to design a custom subscription center in CloudPages. The developer prefers to code in AMPscript, but is also skilled in SSJS. While the developer is confident their code is of high quality, they would still like to handle unexpected errors gracefully. Which feature? (S3 Q45)",
          "options": [
            {
              "label": "A",
              "text": "Wrapping the code in an AMPscript HandleError block"
            },
            {
              "label": "B",
              "text": "Using RaiseError AMPscript function"
            },
            {
              "label": "C",
              "text": "Wrapping the code in a Server-Side JavaScript Try/Catch block"
            },
            {
              "label": "D",
              "text": "Using Platform.Function.HandleError"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Wrapping the code in a Server-Side JavaScript Try/Catch block",
          "explanation": "SSJS Try/Catch blocks are the correct feature for graceful unexpected error handling on CloudPages."
        },
        {
          "id": 212,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "A particular data extension needs to be configured to store six months of data. How should data retention be added to the data extension? (S2 Q148)",
          "options": [
            {
              "label": "A",
              "text": "Import a file to overwrite the rows with six months of data"
            },
            {
              "label": "B",
              "text": "Run a query to overwrite the rows with six months of data"
            },
            {
              "label": "C",
              "text": "Update the data extension configuration"
            },
            {
              "label": "D",
              "text": "Delete and recreate the DE with retention settings"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Update the data extension configuration",
          "explanation": "Update the DE configuration to set a data retention period. Retention must be set at creation; if previously set, it can be modified."
        },
        {
          "id": 247,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "A customer wants a list of subscribers who were sent an email within the past 12 months. How should this request be completed? (S3 Q26)",
          "options": [
            {
              "label": "A",
              "text": "Query against the _Job and _Sent data views"
            },
            {
              "label": "B",
              "text": "Run a tracking extract via the SOAP API"
            },
            {
              "label": "C",
              "text": "Create a measure with criteria sent_date is after today minus 365 days"
            },
            {
              "label": "D",
              "text": "Export from Email Studio reporting"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Query against the _Job and _Sent data views",
          "explanation": "Query _Sent (individual send events) joined with _Job (job metadata including dates) to find subscribers who received emails in last 12 months."
        },
        {
          "id": 103,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "A sendable data extension with a text field named Balance contains the value '$6.96' for a particular record. IF (Balance > 6.00) yields unintended results. Why? (S2 Q39)",
          "options": [
            {
              "label": "A",
              "text": "Double quotes should be used instead of single quotes"
            },
            {
              "label": "B",
              "text": "The operands are not the same data type"
            },
            {
              "label": "C",
              "text": "The comparison should use the < operator"
            },
            {
              "label": "D",
              "text": "AMPscript cannot compare currency values"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "The operands are not the same data type",
          "explanation": "Balance is TEXT ('$6.96') and 6.00 is numeric. Comparing different data types gives unpredictable results in AMPscript."
        },
        {
          "id": 147,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer creates a CloudPage accepting secure parameters via email link. Developer does NOT want Appointment ID visible. Best method to pass the parameters? (S2 Q83)",
          "options": [
            {
              "label": "A",
              "text": "<input id='apptid' type='textarea' value='%%=v(@apptId)=%%' readonly>"
            },
            {
              "label": "B",
              "text": "<form action='%%=MicrositeURL(123,apptId,@apptId)=%%' method='post'>"
            },
            {
              "label": "C",
              "text": "<form action='%%=CloudPagesURL(123,apptId,@apptId)=%%' method='post'>"
            },
            {
              "label": "D",
              "text": "<input id='apptId' type='textarea' value='%%=v(@apptId)=%%' hidden>"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "<form action='%%=CloudPagesURL(123,apptId,@apptId)=%%' method='post'>",
          "explanation": "CloudPagesURL() with method='post' passes parameters via POST body - not visible in URL bar. POST is the secure method for parameter passing."
        },
        {
          "id": 173,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer wants to aggregate monthly energy usage data over four months. How to generate total in AMPscript? (S2 Q109)",
          "options": [
            {
              "label": "A",
              "text": "SET @total = ADD(@jan, ADD(@feb, ADD(@mar, @apr)))"
            },
            {
              "label": "B",
              "text": "SET @total = ADD((@jan, @feb), @mar, @apr)"
            },
            {
              "label": "C",
              "text": "SET @total = (ADD(@jan, @feb), ADD(@mar, @apr))"
            },
            {
              "label": "D",
              "text": "SET @total = SUM(@jan, @feb, @mar, @apr)"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "SET @total = ADD(@jan, ADD(@feb, ADD(@mar, @apr)))",
          "explanation": "AMPscript uses ADD() for addition, nesting calls for multiple values. The + operator is not used for arithmetic. SUM() doesn't exist in AMPscript."
        },
        {
          "id": 206,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer wants to transform the date and time field Date_Enrolled from Daylight Savings time by changing the time to fall back one hour. How? (S2 Q142)",
          "options": [
            {
              "label": "A",
              "text": "%%=DateAdd(Date_Enrolled, -1)=%%"
            },
            {
              "label": "B",
              "text": "%%=DateAdd(Date_Enrolled, -1, 'H')=%%"
            },
            {
              "label": "C",
              "text": "%%=FormatDate(Date_Enrolled, -1, 'HH', 'en-us')=%%"
            },
            {
              "label": "D",
              "text": "%%=DateAdd(Date_Enrolled, -60, 'MI')=%%"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "%%=DateAdd(Date_Enrolled, -1, 'H')=%%",
          "explanation": "DateAdd(date, -1, 'H') subtracts 1 hour. The 'H' is the unit for Hour. FormatDate does not perform date arithmetic."
        },
        {
          "id": 248,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer wants to include an AMPscript IIF statement where if subscriber tier is not premier then display heading encouraging them to upgrade. Tier value is set as @level. How? (S3 Q27)",
          "options": [
            {
              "label": "A",
              "text": "%%=IF(@level IS 'premier', 'Upgrade to premier now!', 'You are a premier member!')=%%"
            },
            {
              "label": "B",
              "text": "%%=IIF(@level == 'premier', 'You are a premier member!', 'Upgrade to premier now!')=%%"
            },
            {
              "label": "C",
              "text": "%%=IIF(@level = 'premier', 'You are a premier member!', 'Upgrade to premier now!')=%%"
            },
            {
              "label": "D",
              "text": "%%=IIF(@level!='premier','Upgrade to premier now!','You are a premier member!')=%%"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "%%=IIF(@level = 'premier', 'You are a premier member!', 'Upgrade to premier now!')=%%",
          "explanation": "IIF uses = or == for comparison. This version correctly uses = with proper IIF syntax. IF...IS is not valid IIF syntax."
        }
      ]
    },
    {
      "set_number": 9,
      "set_name": "Practice Set 9",
      "question_count": 14,
      "domains_covered": {
        "Journey Builder": 1,
        "Data Modeling": 1,
        "API Integration": 7,
        "AMPscript": 4,
        "Security": 1
      },
      "questions": [
        {
          "id": 136,
          "domain_code": "B",
          "domain": "Journey Builder",
          "question": "NTO wants to trigger follow-up messages after a subscriber opens an email. What process provides real-time engagement data? (S2 Q72)",
          "options": [
            {
              "label": "A",
              "text": "Query Activity"
            },
            {
              "label": "B",
              "text": "Client-Side JavaScript"
            },
            {
              "label": "C",
              "text": "WSProxy Service"
            },
            {
              "label": "D",
              "text": "Event Notification Services"
            }
          ],
          "correct_index": 3,
          "correct_answer_label": "D",
          "correct_answer_text": "Event Notification Services",
          "explanation": "Event Notification Services (ENS) provides real-time engagement data (opens, clicks) that can trigger subsequent journey activities."
        },
        {
          "id": 21,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "NTO has a sendable DE with 1,500,000 contact records to delete. Which step is REQUIRED before deleting the contacts?",
          "options": [
            {
              "label": "A",
              "text": "Navigate to Contact Builder and delete the data extension"
            },
            {
              "label": "B",
              "text": "Divide the records in half and delete each resulting data extension"
            },
            {
              "label": "C",
              "text": "Query the records into a new sendable data extension and delete it"
            },
            {
              "label": "D",
              "text": "Use the REST API to delete contacts directly"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Query the records into a new sendable data extension and delete it",
          "explanation": "Contact Delete requires a sendable DE as the input source. Max batch is 1 million, so 1.5M must be split into batches."
        },
        {
          "id": 39,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Which application utilizes the REST API?",
          "options": [
            {
              "label": "A",
              "text": "Content Builder"
            },
            {
              "label": "B",
              "text": "Automation Studio"
            },
            {
              "label": "C",
              "text": "Classic Content"
            },
            {
              "label": "D",
              "text": "Email Studio"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Content Builder",
          "explanation": "Content Builder uses REST API (/asset/v1/). Automation Studio and Classic Content use SOAP API. REST is for modern features."
        },
        {
          "id": 30,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Which AMPscript function group could most negatively impact send processing performance?",
          "options": [
            {
              "label": "A",
              "text": "Date Time functions"
            },
            {
              "label": "B",
              "text": "Data extension functions"
            },
            {
              "label": "C",
              "text": "String functions"
            },
            {
              "label": "D",
              "text": "Utility functions"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Data extension functions",
          "explanation": "Data extension functions execute database queries for EVERY subscriber during the send. String and date functions run in-memory and are fast."
        },
        {
          "id": 264,
          "domain_code": "E",
          "domain": "Security",
          "question": "Developer needs to create a fully-branded CloudPage which includes images hosted in Content Builder. Developer wants to secure the page and its elements using SSL. What is the minimum number of SSL certificates required? (S3 Q43)",
          "options": [
            {
              "label": "A",
              "text": "One"
            },
            {
              "label": "B",
              "text": "Two"
            },
            {
              "label": "C",
              "text": "Three"
            },
            {
              "label": "D",
              "text": "Four"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Two",
          "explanation": "Content SSL for the CloudPage domain + CDN/Portfolio SSL for images = minimum 2 certificates required."
        },
        {
          "id": 59,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer is troubleshooting incomplete link tracking data. How should the RedirectTo AMPscript function be described for link tracking?",
          "options": [
            {
              "label": "A",
              "text": "It ensures static link href values are recorded in tracking"
            },
            {
              "label": "B",
              "text": "It ensures link href values containing AMPscript variables are recorded in tracking"
            },
            {
              "label": "C",
              "text": "It ensures link href values containing HTML bookmarks or anchors are recorded in tracking"
            },
            {
              "label": "D",
              "text": "It disables tracking for dynamic links"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "It ensures link href values containing AMPscript variables are recorded in tracking",
          "explanation": "RedirectTo() wraps dynamically built URLs in SFMC tracking redirect system, enabling click tracking on variable-based hrefs."
        },
        {
          "id": 83,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "NTO wants to exclude sending email at send time to those with a record on the Exclude DE. The primary key on this DE is SubscriberKey. How would a developer write the Exclusion Script? (S2)",
          "options": [
            {
              "label": "A",
              "text": "RowCount(LookupRows('Exclude', 'SubscriberKey', SubscriberKey)) > 0"
            },
            {
              "label": "B",
              "text": "RowCount(LookupRows('Exclude', 'SubscriberKey', SubscriberKey!)) > 0"
            },
            {
              "label": "C",
              "text": "Lookup('Exclude', 'SubscriberKey', 'EmailAddress', emailaddr_) == Emailaddr"
            },
            {
              "label": "D",
              "text": "LookupRows('Exclude','SubscriberKey',@email) > 0"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "RowCount(LookupRows('Exclude', 'SubscriberKey', SubscriberKey)) > 0",
          "explanation": "Threshold must be > 0 (not > 1). Use personalization string _SubscriberKey (no @ prefix). > 1 misses subscribers with exactly one record."
        },
        {
          "id": 95,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer wants to personalize a welcome email with the recipient first name from the Customers DE. Both DEs contain the unique identifier in a field named CustomerKey. Which AMPscript Syntax? (S2 Q31)",
          "options": [
            {
              "label": "A",
              "text": "%%=Lookup('Customers', 'FirstName', 'CustomerKey', 'CustomerKey')=%%"
            },
            {
              "label": "B",
              "text": "%%=Lookup('Customers', 'FirstName', 'ContactID', CustomerKey)=%%"
            },
            {
              "label": "C",
              "text": "%%=Lookup('Customers', 'FirstName', 'CustomerKey', CustomerKey)=%%"
            },
            {
              "label": "D",
              "text": "%%=Lookup('NewSubscribers','FirstName','CustomerKey',CustomerKey)=%%"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "%%=Lookup('Customers', 'FirstName', 'CustomerKey', CustomerKey)=%%",
          "explanation": "Correct DE name, correct return field, correct search field, CustomerKey as variable not string literal."
        },
        {
          "id": 102,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer is using authentication with a client ID and client secret and has used them in several REST calls. When the REST call is made for a triggered send, a 401 Unauthorized error is returned. What should be checked first? (S2 Q38)",
          "options": [
            {
              "label": "A",
              "text": "The email interaction has been published"
            },
            {
              "label": "B",
              "text": "The send permissions have been granted for the client ID and client secret within Installed Packages"
            },
            {
              "label": "C",
              "text": "The automation permissions have been granted for the client ID and client secret within Installed Packages"
            },
            {
              "label": "D",
              "text": "The OAuth token has not expired"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "The send permissions have been granted for the client ID and client secret within Installed Packages",
          "explanation": "The existing token lacks the specific send permission scope. Check the Installed Package component has send permissions granted."
        },
        {
          "id": 129,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer wants to inject a Contact into a journey using API. What method and route would be used? (S2 Q65)",
          "options": [
            {
              "label": "A",
              "text": "POST /contacts/v1/contacts"
            },
            {
              "label": "B",
              "text": "PUT /hub/v1/dataevents/key:{key}/rows/{primaryKeys}"
            },
            {
              "label": "C",
              "text": "POST /interaction/v1/events"
            },
            {
              "label": "D",
              "text": "GET /interaction/v1/events"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "POST /interaction/v1/events",
          "explanation": "POST /interaction/v1/events with ContactKey, EventDefinitionKey, and Data payload injects contacts into Journey Builder API Event Entry."
        },
        {
          "id": 140,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "NTO developers want to use the Transactional Messaging API to send email receipts. What is the first step required? (S2 Q76)",
          "options": [
            {
              "label": "A",
              "text": "POST to /messaging/v1/email/messages/ with client_id"
            },
            {
              "label": "B",
              "text": "Request a token using the v1/requestToken endpoint"
            },
            {
              "label": "C",
              "text": "Request a token using the v2/authorize endpoint"
            },
            {
              "label": "D",
              "text": "POST to /messaging/v1 with client_id and client_secret"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Request a token using the v2/authorize endpoint",
          "explanation": "First step is always authentication: request an OAuth 2.0 token via the v2/authorize endpoint before making any API calls."
        },
        {
          "id": 172,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer wants to add From Addresses to Marketing Cloud and ensure they are verified before being used for sending. Which route allows this? (S2 Q108)",
          "options": [
            {
              "label": "A",
              "text": "POST /messaging/v1/dataevents/domainverification"
            },
            {
              "label": "B",
              "text": "POST /messaging/v1/push/domain/verification"
            },
            {
              "label": "C",
              "text": "POST /messaging/v1/domainverification/bulk/insert"
            },
            {
              "label": "D",
              "text": "POST /email/v1/addresses/verify"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "POST /messaging/v1/domainverification/bulk/insert",
          "explanation": "POST /messaging/v1/domainverification/bulk/insert is the correct REST endpoint for adding and verifying From Addresses in Marketing Cloud."
        },
        {
          "id": 220,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "NTO wants to trigger a receipt email via SOAP API when a customer makes a purchase. Developer used TriggeredSendDefinition.Create but no emails were sent. Which object and method to use? (S2 Q156a)",
          "options": [
            {
              "label": "A",
              "text": "TriggeredSendDefinition object and Update method"
            },
            {
              "label": "B",
              "text": "TriggeredSend object and Update method"
            },
            {
              "label": "C",
              "text": "TriggeredSend object and Create method"
            },
            {
              "label": "D",
              "text": "TriggeredSendDefinition object and Perform method"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "TriggeredSend object and Create method",
          "explanation": "TriggeredSendDefinition.Create only sets up the definition template. TriggeredSend.Create actually fires the send. Two different SOAP objects."
        },
        {
          "id": 249,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer wants to upload a base64-encoded file to Content Builder using an API Installed Package but receives an Insufficient Privileges error. What should be checked? (S3 Q28)",
          "options": [
            {
              "label": "A",
              "text": "Validate client ID and client secret are correct"
            },
            {
              "label": "B",
              "text": "Confirm the Component's Channel options are available"
            },
            {
              "label": "C",
              "text": "Confirm the REST Base URI uses the correct subdomain"
            },
            {
              "label": "D",
              "text": "Check the API rate limit quota"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Confirm the Component's Channel options are available",
          "explanation": "The Installed Package Component must have Content Builder channel access enabled for this upload operation."
        }
      ]
    },
    {
      "set_number": 10,
      "set_name": "Practice Set 10",
      "question_count": 14,
      "domains_covered": {
        "AMPscript": 5,
        "Data Management": 1,
        "SQL & Data Views": 4,
        "API Integration": 4
      },
      "questions": [
        {
          "id": 3,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "After LookupRows retrieves data, what is the NEXT step BEFORE using the rowset in a FOR loop?",
          "options": [
            {
              "label": "A",
              "text": "Use Row() to return a specific row"
            },
            {
              "label": "B",
              "text": "Use RowCount() to ensure the rowset contains data"
            },
            {
              "label": "C",
              "text": "Close the AMPscript Code Block"
            },
            {
              "label": "D",
              "text": "Declare all variables first"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Use RowCount() to ensure the rowset contains data",
          "explanation": "Always check RowCount(@rows) > 0 before entering a FOR loop to prevent rendering empty HTML tags when no data exists."
        },
        {
          "id": 44,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "NTO uses external CRM that only exports encrypted files for subscriber data. Which action should be in the automation?",
          "options": [
            {
              "label": "A",
              "text": "File transfer activity to the Import directory for decryption"
            },
            {
              "label": "B",
              "text": "File transfer activity to the Safehouse for decryption"
            },
            {
              "label": "C",
              "text": "File drop to the SFTP Root directory"
            },
            {
              "label": "D",
              "text": "Import Activity with built-in decryption"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "File transfer activity to the Safehouse for decryption",
          "explanation": "File Transfer Activity moves files from FTP to Safehouse AND handles decryption. Then Import Activity loads from Safehouse into DE."
        },
        {
          "id": 32,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer queries _Bounce data view joining _Subscribers on EmailAddress but returns no records. What update needed?",
          "options": [
            {
              "label": "A",
              "text": "Marketing Cloud _Bounce does not contain EmailAddress. Should join on SubscriberID"
            },
            {
              "label": "B",
              "text": "Marketing Cloud does not allow DateAdd in Query Activities"
            },
            {
              "label": "C",
              "text": "Marketing Cloud does not allow use of GETDATE function"
            },
            {
              "label": "D",
              "text": "Use INNER JOIN instead"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Marketing Cloud _Bounce does not contain EmailAddress. Should join on SubscriberID",
          "explanation": "_Bounce has NO EmailAddress field. It contains SubscriberKey, SubscriberID, JobID, EventDate, BounceCategory etc. Join on SubscriberID."
        },
        {
          "id": 46,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "How long are Marketing Cloud v2 access tokens valid?",
          "options": [
            {
              "label": "A",
              "text": "Each API call requires a new access token"
            },
            {
              "label": "B",
              "text": "Access tokens expire after 20 minutes"
            },
            {
              "label": "C",
              "text": "Access tokens expire after 24 hours"
            },
            {
              "label": "D",
              "text": "Access tokens expire after 60 minutes"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Access tokens expire after 20 minutes",
          "explanation": "OAuth v2 tokens expire after approximately 20 minutes. Best practice: reuse until expiry, then request a new one on 401 Unauthorized."
        },
        {
          "id": 45,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Sendable DE text field Balance contains '$6.96'. IF (Balance > 6.00) yields unintended results. Why?",
          "options": [
            {
              "label": "A",
              "text": "The operands are not the same data type"
            },
            {
              "label": "B",
              "text": "Double quotes should be used instead of single quotes"
            },
            {
              "label": "C",
              "text": "The comparison should use the < operator"
            },
            {
              "label": "D",
              "text": "AMPscript cannot compare currency values"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "The operands are not the same data type",
          "explanation": "Balance is TEXT ('$6.96') and 6.00 is numeric. Comparing different data types gives unpredictable results in AMPscript."
        },
        {
          "id": 64,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer wants to add an image to Content Builder via API and retrieve the published URL. Which method?",
          "options": [
            {
              "label": "A",
              "text": "POST to the REST API /asset/v1/content/assets and parse the FileProperties parameter"
            },
            {
              "label": "B",
              "text": "GET using the REST API /asset/v1/content/assets and parse the FileProperties parameter"
            },
            {
              "label": "C",
              "text": "Use the SOAP API to create a Portfolio object and identify the Source property"
            },
            {
              "label": "D",
              "text": "PUT to /asset/v1/content/assets/{id} to trigger URL generation"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "POST to the REST API /asset/v1/content/assets and parse the FileProperties parameter",
          "explanation": "POST uploads the image (base64-encoded). The response contains FileProperties.publishedURL - the CDN URL."
        },
        {
          "id": 71,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer wants to retrieve a row of data from a DE using the SOAP API. Which API Object should be used for this call? (S2)",
          "options": [
            {
              "label": "A",
              "text": "Row"
            },
            {
              "label": "B",
              "text": "DataExtensionObject"
            },
            {
              "label": "C",
              "text": "DataExtension"
            },
            {
              "label": "D",
              "text": "DataRow"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "DataExtensionObject",
          "explanation": "DataExtensionObject is the SOAP object for DE row operations (Retrieve=query rows). DataExtension manages DE structure."
        },
        {
          "id": 85,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "A company needs to retrieve a large number of rows from a DE via the API. Which solution would optimize the performance? (S2)",
          "options": [
            {
              "label": "A",
              "text": "Use the REST API instead of the SOAP API"
            },
            {
              "label": "B",
              "text": "Use a SimpleFilterPart to retrieve small sets of relevant data"
            },
            {
              "label": "C",
              "text": "Use the AMPscript API functions on a CloudPage"
            },
            {
              "label": "D",
              "text": "Use the DataExtension SOAP object instead"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Use a SimpleFilterPart to retrieve small sets of relevant data",
          "explanation": "SimpleFilterPart reduces data per request. Combined with ContinueRequest for pagination, this optimizes large DE retrieval."
        },
        {
          "id": 189,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer needs a representative sample from a larger data set to validate dynamic email aspects. Which SQL function should be used? (S2 Q124 - NTILE version)",
          "options": [
            {
              "label": "A",
              "text": "OVER"
            },
            {
              "label": "B",
              "text": "NTILE"
            },
            {
              "label": "C",
              "text": "HAVING"
            },
            {
              "label": "D",
              "text": "TOP"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "NTILE",
          "explanation": "NTILE(n) divides a result set into n equal parts, enabling representative sampling of the dataset."
        },
        {
          "id": 201,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer needs all subscribers on Customers DE who made a purchase in last 30 days. Purchase data is on Orders DE (PurchaseDate column). Orders DE can contain many instances of same subscriber. Which SQL keyword? (S2 Q137)",
          "options": [
            {
              "label": "A",
              "text": "OUTER JOIN"
            },
            {
              "label": "B",
              "text": "ORDER BY PurchaseDate ASC"
            },
            {
              "label": "C",
              "text": "INNER JOIN"
            },
            {
              "label": "D",
              "text": "LEFT JOIN"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "INNER JOIN",
          "explanation": "INNER JOIN returns only subscribers who exist in BOTH DEs (those who made a purchase). Returns unique subscribers who meet both criteria."
        },
        {
          "id": 261,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer's SQL query joining _Subscribers and _Bounce on EmailAddress returns no records. What updates should be made? (S3 Q40)",
          "options": [
            {
              "label": "A",
              "text": "Marketing Cloud _Bounce data view does not contain EmailAddress. Should join on SubscriberID"
            },
            {
              "label": "B",
              "text": "Marketing Cloud does not allow DateAdd functions in Query Activities. Should define a specific date"
            },
            {
              "label": "C",
              "text": "Marketing Cloud does not allow use of GETDATE function. Should define a specific date"
            },
            {
              "label": "D",
              "text": "Use a LEFT JOIN instead of INNER JOIN"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Marketing Cloud _Bounce data view does not contain EmailAddress. Should join on SubscriberID",
          "explanation": "_Bounce does NOT contain an EmailAddress field. Join on SubscriberID or SubscriberKey instead."
        },
        {
          "id": 179,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer is creating a CloudPage which accepts secure parameters. Developer does NOT want the Appointment ID visible. Best method to pass parameters? (S2 Q115 - alternate version)",
          "options": [
            {
              "label": "A",
              "text": "<form action='%%=CloudPagesURL(123,apptId,@apptId)=%%' method='post'>"
            },
            {
              "label": "B",
              "text": "<input id='apptid' type='textarea' value='%%=v(@apptId)=%%' readonly>"
            },
            {
              "label": "C",
              "text": "<input id='apptid' type='textarea' value='%%=v(@apptId)=%%' hidden>"
            },
            {
              "label": "D",
              "text": "Append to URL as an encoded query string parameter"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "<form action='%%=CloudPagesURL(123,apptId,@apptId)=%%' method='post'>",
          "explanation": "CloudPagesURL with method='post' keeps parameters out of the URL bar. Hidden and readonly inputs are visible in page source."
        },
        {
          "id": 207,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer wants to use the RaiseError AMPscript function when a subscriber does not have the necessary data to build an email. Which outcome is possible? (S2 Q143 - alternate)",
          "options": [
            {
              "label": "A",
              "text": "The email is not sent to the particular subscriber"
            },
            {
              "label": "B",
              "text": "The send is retried"
            },
            {
              "label": "C",
              "text": "An error message is sent to the From Address used in the email"
            },
            {
              "label": "D",
              "text": "The subscriber is added to a suppression list"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "The email is not sent to the particular subscriber",
          "explanation": "RaiseError with skipLine=true skips the individual subscriber (email not sent to them). With skipLine=false, the entire send is cancelled."
        },
        {
          "id": 250,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "NTO wants to exclude sending an email at send time to those with a record on the Exclude DE. Primary key is SubscriberKey. How would a developer write the Exclusion Script? (S3 Q29)",
          "options": [
            {
              "label": "A",
              "text": "Rowcount(LookupRows('Exclude','SubscriberKey',_SubscriberKey)) > 0"
            },
            {
              "label": "B",
              "text": "Rowcount(LookupRows('Exclude','SubscriberKey',_SubscriberKey)) > 1"
            },
            {
              "label": "C",
              "text": "Lookup('Exclude','SubscriberKey','EmailAddress',emailaddr_) == emailaddr"
            },
            {
              "label": "D",
              "text": "LookupRows('Exclude','SubscriberKey',@email) > 0"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Rowcount(LookupRows('Exclude','SubscriberKey',_SubscriberKey)) > 0",
          "explanation": "Threshold must be > 0 (not > 1). Use personalization string _SubscriberKey (no @ prefix). > 1 misses subscribers with exactly one record."
        }
      ]
    },
    {
      "set_number": 11,
      "set_name": "Practice Set 11",
      "question_count": 14,
      "domains_covered": {
        "API Integration": 5,
        "SSJS": 1,
        "Data Modeling": 4,
        "SQL & Data Views": 4
      },
      "questions": [
        {
          "id": 16,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer wants to inject a Contact into a journey using API. Which method and route?",
          "options": [
            {
              "label": "A",
              "text": "POST /contacts/v1/contacts"
            },
            {
              "label": "B",
              "text": "POST /interaction/v1/events"
            },
            {
              "label": "C",
              "text": "PUT /hub/v1/dataevents/key:{key}/rows/{primaryKeys}"
            },
            {
              "label": "D",
              "text": "GET /interaction/v1/interactions"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "POST /interaction/v1/events",
          "explanation": "POST /interaction/v1/events with ContactKey, EventDefinitionKey, and Data payload injects contacts into Journey Builder API Event Entry."
        },
        {
          "id": 58,
          "domain_code": "J",
          "domain": "SSJS",
          "question": "Developer wants to build a series of CloudPages that will interact with several REST APIs. Which scripting tool?",
          "options": [
            {
              "label": "A",
              "text": "GTL"
            },
            {
              "label": "B",
              "text": "SSJS"
            },
            {
              "label": "C",
              "text": "AMPscript"
            },
            {
              "label": "D",
              "text": "Python"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "SSJS",
          "explanation": "SSJS (Server-Side JavaScript) is the correct tool for CloudPages that need to interact with REST APIs. AMPscript cannot make REST calls natively."
        },
        {
          "id": 48,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "NTO uses a number to uniquely identify contacts across different marketing channels. Which action ensures contacts relate across channels?",
          "options": [
            {
              "label": "A",
              "text": "Create Attribute Groups linking the unique identifier to the Contact for each channel"
            },
            {
              "label": "B",
              "text": "Use a unique identifier specific to each channel and automatically connect them"
            },
            {
              "label": "C",
              "text": "Link the numeric field value to the Contact ID in Attribute Groups"
            },
            {
              "label": "D",
              "text": "Use the Subscriber ID as the universal connector"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Create Attribute Groups linking the unique identifier to the Contact for each channel",
          "explanation": "Create Attribute Groups in Contact Builder linking the shared unique ID to the Contact record for each channel."
        },
        {
          "id": 79,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer wants to identify email addresses that have bounced in the last 30 days. Their SQL joins _Subscribers and _Bounce on EmailAddress and returns no records. What update is needed? (S2)",
          "options": [
            {
              "label": "A",
              "text": "Marketing Cloud Bounce data view does not contain EmailAddress. Should join on SubscriberID"
            },
            {
              "label": "B",
              "text": "Marketing Cloud does not allow use of GETDATE function. Should define a specific date"
            },
            {
              "label": "C",
              "text": "Marketing Cloud does not allow DateAdd functions in Query Activities. Should define a specific date"
            },
            {
              "label": "D",
              "text": "Use INNER JOIN instead"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Marketing Cloud Bounce data view does not contain EmailAddress. Should join on SubscriberID",
          "explanation": "_Bounce has NO EmailAddress field. It contains SubscriberKey, SubscriberID, JobID, EventDate, BounceCategory. Join on SubscriberID."
        },
        {
          "id": 54,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer needs to use the /contacts/ REST API route to update records in a DE. What to verify first?",
          "options": [
            {
              "label": "A",
              "text": "The DE should be linked in an Attribute Group in Contact Builder"
            },
            {
              "label": "B",
              "text": "Each contact should already exist in All Subscribers"
            },
            {
              "label": "C",
              "text": "Journey Builder should be configured to use the DE"
            },
            {
              "label": "D",
              "text": "The DE must be in the Shared Data Extensions folder"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "The DE should be linked in an Attribute Group in Contact Builder",
          "explanation": "The /contacts/ API requires the DE to be linked in an Attribute Group in Contact Builder to identify contacts."
        },
        {
          "id": 104,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer's SQL query joining _Subscribers and _Bounce on EmailAddress does not return any records. What updates should be made? (S2 Q40)",
          "options": [
            {
              "label": "A",
              "text": "Marketing Cloud _Bounce data view does not contain EmailAddress. Should join on SubscriberID"
            },
            {
              "label": "B",
              "text": "Marketing Cloud does not allow DateAdd functions in Query Activities"
            },
            {
              "label": "C",
              "text": "Marketing Cloud does not allow use of GETDATE function"
            },
            {
              "label": "D",
              "text": "Use INNER JOIN instead"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Marketing Cloud _Bounce data view does not contain EmailAddress. Should join on SubscriberID",
          "explanation": "_Bounce has NO EmailAddress field. It contains SubscriberKey, SubscriberID, JobID, EventDate, BounceCategory. Join on SubscriberID."
        },
        {
          "id": 122,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer is troubleshooting why a parent-level DE cannot be accessed by a child business unit. What should the developer check? (S2 Q58)",
          "options": [
            {
              "label": "A",
              "text": "The DE is in the Shared Data Extensions folder and the query includes the ENT. prefix"
            },
            {
              "label": "B",
              "text": "The DE is in the Salesforce Data Extensions folder and is accessible to the child business unit"
            },
            {
              "label": "C",
              "text": "The DE is in the Synchronized Data Extensions folder and the query includes the ENT. prefix"
            },
            {
              "label": "D",
              "text": "The child BU must have Write access to the shared DE"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "The DE is in the Shared Data Extensions folder and the query includes the ENT. prefix",
          "explanation": "Two requirements: DE must be in Shared Data Extensions folder AND the SQL query must use the ENT. prefix (e.g., FROM ent.DEName)."
        },
        {
          "id": 149,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "NTO set up their North American BU to unsubscribe at the BU level. Which data view identifies all subscribers who are unsubscribed from that Business Unit? (S2 Q85)",
          "options": [
            {
              "label": "A",
              "text": "ListSubscribers"
            },
            {
              "label": "B",
              "text": "ENT.Subscribers"
            },
            {
              "label": "C",
              "text": "_BusinessUnitUnsubscribes"
            },
            {
              "label": "D",
              "text": "Subscribers"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "_BusinessUnitUnsubscribes",
          "explanation": "_BusinessUnitUnsubscribes data view contains BU-level unsubscribe records specifically for business unit-level unsubscribes."
        },
        {
          "id": 208,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "NTO mistakenly synced the User_Salesforce object which added to their billable contact count. What should be recommended to remove these contacts? (S2 Q144)",
          "options": [
            {
              "label": "A",
              "text": "Put the synced records into a sendable data extension and use Contact Delete"
            },
            {
              "label": "B",
              "text": "Use the REST API to delete the contacts from the All Subscribers table"
            },
            {
              "label": "C",
              "text": "Update the sync to remove these contacts from the All Contacts table"
            },
            {
              "label": "D",
              "text": "Use the SOAP API to delete subscribers from All Subscribers"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Put the synced records into a sendable data extension and use Contact Delete",
          "explanation": "Contact Delete with a sendable DE is the correct process to remove contacts from SFMC including All Contacts, subscriber lists, and sendable DEs."
        },
        {
          "id": 244,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "NTO legal team is concerned about the daily import process that adds subscribers to a Sendable DE, even when records have already been targeted for Deletion. What is the expected behavior if a send is initiated to this Sendable DE? (S3 Q23)",
          "options": [
            {
              "label": "A",
              "text": "Records in the suppression phase will only be excluded if manually specified during send time"
            },
            {
              "label": "B",
              "text": "Records that have been deleted will be excluded from sends indefinitely"
            },
            {
              "label": "C",
              "text": "Records in the suppression phase will be excluded from sends"
            },
            {
              "label": "D",
              "text": "All records will receive the email"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Records in the suppression phase will be excluded from sends",
          "explanation": "Contacts in the Contact Delete suppression phase are excluded from all sends system-wide, regardless of new imports adding them to DEs."
        },
        {
          "id": 277,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "NTO uses a numeric identifier for Subscriber Key. Customer data is stored in a DE with the Subscriber Key set as a Primary Key. Which step is required when creating relationships for this DE in Data Designer? (S3 Q56)",
          "options": [
            {
              "label": "A",
              "text": "Set Subscriber Key as a text data type before linking the data extension to Contact Key"
            },
            {
              "label": "B",
              "text": "Use a one-to-one cardinality when creating the relationship"
            },
            {
              "label": "C",
              "text": "Link the Contact Key to the Subscriber's email address when creating the relationship"
            },
            {
              "label": "D",
              "text": "Convert the Contact Key to numeric format to match"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Set Subscriber Key as a text data type before linking the data extension to Contact Key",
          "explanation": "Contact Key is stored as text in SFMC. Numeric Subscriber Key must be converted to text data type before the relationship can be created."
        },
        {
          "id": 175,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer needs to implement a newsletter registration form where an email address should be validated prior to form submission. Which option could be used? (S2 Q111)",
          "options": [
            {
              "label": "A",
              "text": "SOAP API, Perform method with ValidationAction object"
            },
            {
              "label": "B",
              "text": "SOAP API, Describe method with EmailAddress object"
            },
            {
              "label": "C",
              "text": "REST API, /address/v1/validateEmail route"
            },
            {
              "label": "D",
              "text": "AMPscript RegExMatch for format validation only"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "REST API, /address/v1/validateEmail route",
          "explanation": "REST API /address/v1/validateEmail validates email addresses for format and deliverability before form submission."
        },
        {
          "id": 227,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Which aspect should a developer consider before creating a Server-to-Server Installed Package and associated API Integration in Marketing Cloud? (S3 Q6)",
          "options": [
            {
              "label": "A",
              "text": "Scope (Permissions) will be granted based on the User who is creating the Installed Package"
            },
            {
              "label": "B",
              "text": "Using an Installed Package, APIs will have access to resources in all Business Units"
            },
            {
              "label": "C",
              "text": "Scope (Permissions) must be specifically granted when creating an API Integration component inside an Installed Package"
            },
            {
              "label": "D",
              "text": "Scope is automatically inherited from the parent organization"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Scope (Permissions) must be specifically granted when creating an API Integration component inside an Installed Package",
          "explanation": "Scope must be specifically and explicitly granted when configuring the API Integration component. Does not auto-inherit from user role."
        },
        {
          "id": 254,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer wants to add an image to Content Builder via the API and retrieve the image published URL. Which method should the developer use? (S3 Q33)",
          "options": [
            {
              "label": "A",
              "text": "Use the SOAP API to create a Portfolio object and identify the Source property"
            },
            {
              "label": "B",
              "text": "GET using the REST API /asset/v1/content/assets and parse the FileProperties parameter"
            },
            {
              "label": "C",
              "text": "POST to the REST API /asset/v1/content/assets and parse the FileProperties parameter"
            },
            {
              "label": "D",
              "text": "PUT to /asset/v1/content/assets/{id} to trigger URL generation"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "POST to the REST API /asset/v1/content/assets and parse the FileProperties parameter",
          "explanation": "POST uploads the image (base64-encoded). The response contains FileProperties.publishedURL - the CDN URL."
        }
      ]
    },
    {
      "set_number": 12,
      "set_name": "Practice Set 12",
      "question_count": 14,
      "domains_covered": {
        "SQL & Data Views": 2,
        "Security": 1,
        "Data Management": 1,
        "Data Modeling": 4,
        "AMPscript": 6
      },
      "questions": [
        {
          "id": 5,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Text field birthday has date values in various formats, some valid some not. Which SQL keywords normalize this?",
          "options": [
            {
              "label": "A",
              "text": "CASE, ISDATE, CAST"
            },
            {
              "label": "B",
              "text": "WHERE, ISDATE, CONVERT, CAST"
            },
            {
              "label": "C",
              "text": "UPDATE, ISDATE, CONVERT, CAST"
            },
            {
              "label": "D",
              "text": "SELECT, ISDATE, TRY_CONVERT"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "CASE, ISDATE, CAST",
          "explanation": "CASE for conditional per-row logic. ISDATE() to validate. CAST() to convert valid ones. Pattern: CASE WHEN ISDATE(birthday)=1 THEN CAST(birthday AS date)."
        },
        {
          "id": 80,
          "domain_code": "E",
          "domain": "Security",
          "question": "NTO stores most of their customer data in Marketing Cloud. They do not mind their data being viewed in clear text within SFMC, but they want to ensure the underlying database files are encrypted at rest in case the physical media is stolen. Which encryption method? (S2)",
          "options": [
            {
              "label": "A",
              "text": "Field-Level Encryption"
            },
            {
              "label": "B",
              "text": "Encrypted Data Sending"
            },
            {
              "label": "C",
              "text": "Transparent Data Encryption"
            },
            {
              "label": "D",
              "text": "Salesforce Shield"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Transparent Data Encryption",
          "explanation": "TDE encrypts database files at the OS/disk level. Transparent to SFMC app — data still visible within platform. Protects against physical media theft."
        },
        {
          "id": 99,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "Developer is configuring a File Drop Automation and wants to use a Filename Pattern to allow for timestamps on the file. The file name will always start with the month and day (e.g. MAY15). Which configuration? (S2 Q35)",
          "options": [
            {
              "label": "A",
              "text": "%%MMMMdd%%"
            },
            {
              "label": "B",
              "text": "Begins With operator"
            },
            {
              "label": "C",
              "text": "%%year%%%%Month%%%%Day%%"
            },
            {
              "label": "D",
              "text": "Exact Match with filename pattern"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Begins With operator",
          "explanation": "Use the Begins With operator in File Drop trigger configuration when the filename always starts with a known pattern."
        },
        {
          "id": 70,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "A doctor's office creates Populations for staff, patients, and Vendors. What is the maximum number of Populations that should be created to ensure performance? (S2)",
          "options": [
            {
              "label": "A",
              "text": "Unlimited"
            },
            {
              "label": "B",
              "text": "One"
            },
            {
              "label": "C",
              "text": "Three"
            },
            {
              "label": "D",
              "text": "Five"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Three",
          "explanation": "Hard limit: 3 Populations per SFMC account. More than 3 causes significant performance degradation system-wide."
        },
        {
          "id": 88,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "NTO puts the word TEST at the beginning of the name for each test email. Which query would return the subscribers who were sent those emails? (S2 Q24)",
          "options": [
            {
              "label": "A",
              "text": "SELECT * FROM Job INNER JOIN Sent on JobID=JobID WHERE EmailName LIKE 'TEST%'"
            },
            {
              "label": "B",
              "text": "SELECT FROM Job J INNER JOIN Sent S on J.JobID = S.JobID WHERE J.EmailName = 'TEST%'"
            },
            {
              "label": "C",
              "text": "SELECT * FROM Job J INNER JOIN Sent S ON J.JobID=S.JobID WHERE J.EmailName LIKE 'TEST%'"
            },
            {
              "label": "D",
              "text": "SELECT SubscriberKey FROM Sent WHERE EmailName LIKE 'TEST%'"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "SELECT * FROM Job J INNER JOIN Sent S ON J.JobID=S.JobID WHERE J.EmailName LIKE 'TEST%'",
          "explanation": "LIKE for wildcard matching. = 'TEST%' is an exact match. Table aliases required to avoid JOIN ambiguity."
        },
        {
          "id": 118,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "NTO uses a number to uniquely identify contacts across different marketing channels. Which action should the developer take? (S2 Q54)",
          "options": [
            {
              "label": "A",
              "text": "Use a unique identifier specific to each channel and automatically connect them"
            },
            {
              "label": "B",
              "text": "Create Attribute Groups linking the unique identifier to the Contact for each channel"
            },
            {
              "label": "C",
              "text": "Link the numeric field value to the Contact ID in Attribute Groups in Contact Builder"
            },
            {
              "label": "D",
              "text": "Use the Subscriber ID as the universal connector"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Create Attribute Groups linking the unique identifier to the Contact for each channel",
          "explanation": "Create Attribute Groups in Contact Builder linking the shared unique ID to the Contact record for each channel."
        },
        {
          "id": 144,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "NTO Enterprise 2.0 where subscribers unsubscribe from the BU only. Developer is identifying subscribers who unsubscribed from any child BU. Which method identifies most accurate status? (S2 Q80)",
          "options": [
            {
              "label": "A",
              "text": "Create Data Extracts of All Subscribers within the parent business unit"
            },
            {
              "label": "B",
              "text": "Query unsubscribes from Subscribers within the parent business unit"
            },
            {
              "label": "C",
              "text": "Create Data Extracts of All Subscribers within each child business unit"
            },
            {
              "label": "D",
              "text": "Query status from ListSubscribers within the parent business unit"
            }
          ],
          "correct_index": 3,
          "correct_answer_label": "D",
          "correct_answer_text": "Query status from ListSubscribers within the parent business unit",
          "explanation": "_ListSubscribers contains subscription status at the list/BU level. Querying it at parent BU level covers all child BU subscription statuses."
        },
        {
          "id": 160,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "Developer is configuring a new Marketing Cloud account and has decided to use a unique 10-digit integer as each customer's Contact Key. Which data type should be used? (S2 Q96)",
          "options": [
            {
              "label": "A",
              "text": "Number"
            },
            {
              "label": "B",
              "text": "Text"
            },
            {
              "label": "C",
              "text": "Decimal"
            },
            {
              "label": "D",
              "text": "Integer"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Text",
          "explanation": "Contact Key in SFMC is a text/string type. Even when using numeric values, the Contact Key field must be of Text data type."
        },
        {
          "id": 105,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer creates a CloudPage with AMPscript. @point gets value from RequestParameter(favfood) and @value is set to 5. With series of ELSEIF conditions checking Length(@point) > 1, > 2, > 3, > 4 - what is the expected value of @value if favFood = Tacos? (S2 Q41)",
          "options": [
            {
              "label": "A",
              "text": "1"
            },
            {
              "label": "B",
              "text": "4"
            },
            {
              "label": "C",
              "text": "5"
            },
            {
              "label": "D",
              "text": "3"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "4",
          "explanation": "Tacos has 5 characters. The ELSIF chain first matching condition (Length > 1) sets @value = 4."
        },
        {
          "id": 138,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer created an email with AMPscript variable as subject line, but wrong subject appears. Developer thinks outdated variable is declared in the email. Where could it be located? (S2 Q74)",
          "options": [
            {
              "label": "A",
              "text": "In the Text body which is processed after the subject line"
            },
            {
              "label": "B",
              "text": "In the HTML body which is processed after the subject line"
            },
            {
              "label": "C",
              "text": "In the Text body which is processed after the HTML body"
            },
            {
              "label": "D",
              "text": "In the HTML body which is processed after the Text body"
            }
          ],
          "correct_index": 3,
          "correct_answer_label": "D",
          "correct_answer_text": "In the HTML body which is processed after the Text body",
          "explanation": "AMPscript processes: HTML Body first, Text Body second, Subject Line LAST. A variable set in HTML body (first) will be in memory when subject line (last) processes."
        },
        {
          "id": 150,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Which action could the RaiseError AMPscript function be configured to perform? (S2 Q86)",
          "options": [
            {
              "label": "A",
              "text": "Log the source of the error"
            },
            {
              "label": "B",
              "text": "Update the subscriber's status"
            },
            {
              "label": "C",
              "text": "Delete the subscriber record"
            },
            {
              "label": "D",
              "text": "Send a notification email"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Log the source of the error",
          "explanation": "RaiseError can log the error source. It can also skip individual subscribers or cancel the entire send, but cannot update status or delete records."
        },
        {
          "id": 180,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer builds a landing page and email with a CTA link. Landing page displays personal subscriber information. How could the developer create the CTA link? (S2 Q116)",
          "options": [
            {
              "label": "A",
              "text": "Use the AMPscript CloudPagesURL function"
            },
            {
              "label": "B",
              "text": "Append SubscriberKey to the URL as an encoded parameter"
            },
            {
              "label": "C",
              "text": "Append EmailAddress to the URL as an encoded parameter"
            },
            {
              "label": "D",
              "text": "Use the MicrositeURL function"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Use the AMPscript CloudPagesURL function",
          "explanation": "CloudPagesURL() securely passes subscriber parameters from email to CloudPage, encrypting them in the URL to protect subscriber data."
        },
        {
          "id": 210,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer needs to know how many records are in a particular DE to dictate what is displayed on a landing page. Which AMPscript function returns the number of rows? (S2 Q146)",
          "options": [
            {
              "label": "A",
              "text": "DataExtensionRowCount"
            },
            {
              "label": "B",
              "text": "LookupRowCount"
            },
            {
              "label": "C",
              "text": "RowCount"
            },
            {
              "label": "D",
              "text": "DECount"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "DataExtensionRowCount",
          "explanation": "DataExtensionRowCount('DE_ExternalKey') returns total count of ALL rows in the specified DE. RowCount() counts rows in a RowSet, not a whole DE."
        },
        {
          "id": 252,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer wants to personalize a welcome email with the recipient first name from the Customers DE. Which AMPscript Syntax would populate the first name personalization? (S3 Q31)",
          "options": [
            {
              "label": "A",
              "text": "%%=Lookup('Customers','FirstName','ContactID',CustomerKey)=%%"
            },
            {
              "label": "B",
              "text": "%%=Lookup('Customers','FirstName','CustomerKey',CustomerKey)=%%"
            },
            {
              "label": "C",
              "text": "%%Lookup('Customers','FirstName','CustomerKey','CustomerKey')=%%"
            },
            {
              "label": "D",
              "text": "%%=Lookup('NewSubscribers','FirstName','CustomerKey',CustomerKey)=%%"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "%%=Lookup('Customers','FirstName','CustomerKey',CustomerKey)=%%",
          "explanation": "Correct DE name, correct return field, correct search field, CustomerKey as variable not string literal."
        }
      ]
    },
    {
      "set_number": 13,
      "set_name": "Practice Set 13",
      "question_count": 13,
      "domains_covered": {
        "Data Modeling": 2,
        "Email Studio": 1,
        "SSJS": 1,
        "Data Management": 4,
        "API Integration": 6
      },
      "questions": [
        {
          "id": 17,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "A doctor's office creates Populations for staff, patients, and vendors. Maximum number of Populations to ensure performance?",
          "options": [
            {
              "label": "A",
              "text": "Three"
            },
            {
              "label": "B",
              "text": "Unlimited"
            },
            {
              "label": "C",
              "text": "One"
            },
            {
              "label": "D",
              "text": "Five"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Three",
          "explanation": "Hard limit: 3 Populations per SFMC account. More than 3 causes significant performance degradation system-wide."
        },
        {
          "id": 280,
          "domain_code": "T",
          "domain": "Email Studio",
          "question": "Developer is notified the View Email As Web Page (VAWP) link displays the message The system is temporarily unavailable. What could be a possible cause for the error? (S3 Q59)",
          "options": [
            {
              "label": "A",
              "text": "The data in the data extensions used for the send was overwritten"
            },
            {
              "label": "B",
              "text": "The email used for the send was deleted, updated, or moved"
            },
            {
              "label": "C",
              "text": "The data extension used for the send was moved to another folder"
            },
            {
              "label": "D",
              "text": "The tracking URLs have expired"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "The email used for the send was deleted, updated, or moved",
          "explanation": "VAWP links depend on the email asset remaining intact at its original location. If deleted or moved, the page cannot render."
        },
        {
          "id": 89,
          "domain_code": "J",
          "domain": "SSJS",
          "question": "Developer wants to design a custom subscription center in CloudPages and handle unexpected errors gracefully. Which feature? (S2 Q25)",
          "options": [
            {
              "label": "A",
              "text": "Wrapping the code in an AMPscript HandleError block"
            },
            {
              "label": "B",
              "text": "Using RaiseError AMPscript function when an error occurs"
            },
            {
              "label": "C",
              "text": "Wrapping the code in a Server-Side JavaScript Try/Catch block"
            },
            {
              "label": "D",
              "text": "Using Platform.Function.HandleError"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Wrapping the code in a Server-Side JavaScript Try/Catch block",
          "explanation": "SSJS Try/Catch blocks gracefully handle unexpected runtime errors in CloudPages. AMPscript has no HandleError block."
        },
        {
          "id": 151,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "Developer needs to import a file nightly that could arrive any time between 2am and 5am, and there must be a unique file name for each import. Which action should be configured? (S2 Q87)",
          "options": [
            {
              "label": "A",
              "text": "Dynamic File Import"
            },
            {
              "label": "B",
              "text": "File Drop Automation"
            },
            {
              "label": "C",
              "text": "Scheduled Automation"
            },
            {
              "label": "D",
              "text": "File Transfer Activity only"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "File Drop Automation",
          "explanation": "File Drop Automation triggers immediately when a file matching the filename pattern lands in the SFTP folder, regardless of arrival time."
        },
        {
          "id": 96,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "Developer wants to create a Synchronized DE containing Lead data from Sales Cloud. Only records containing a phone number. Which field could be used to select a subset of records in the synchronization configuration? (S2 Q32)",
          "options": [
            {
              "label": "A",
              "text": "ValidPhone"
            },
            {
              "label": "B",
              "text": "PhoneExists"
            },
            {
              "label": "C",
              "text": "ContactType"
            },
            {
              "label": "D",
              "text": "MobilePhone"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "ContactType",
          "explanation": "Synchronization configuration filters only work on Text type fields. ContactType (Text) is filterable; Boolean and Formula Boolean fields are not."
        },
        {
          "id": 187,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "Developer wants to extract tracking data from Marketing Cloud to an FTP site. A marketer created a Data Extract Activity. Which option would be available to extract the data? (S2 Q123)",
          "options": [
            {
              "label": "A",
              "text": "REST API"
            },
            {
              "label": "B",
              "text": "Journey Builder"
            },
            {
              "label": "C",
              "text": "Automation Studio"
            },
            {
              "label": "D",
              "text": "Content Builder"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Automation Studio",
          "explanation": "Data Extract Activities are configured and executed through Automation Studio as part of an automation workflow."
        },
        {
          "id": 221,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "Which activity is required BEFORE a compressed file can be imported into a data extension? (S2 Q156b)",
          "options": [
            {
              "label": "A",
              "text": "Data Extract"
            },
            {
              "label": "B",
              "text": "Import File"
            },
            {
              "label": "C",
              "text": "File Transfer"
            },
            {
              "label": "D",
              "text": "Filter Activity"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "File Transfer",
          "explanation": "File Transfer Activity unzips the compressed file into Safehouse first. Then Import File Activity can load the uncompressed file into the DE."
        },
        {
          "id": 256,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "Developer is configuring a File Drop Automation and wants to use a Filename Pattern to allow for timestamps. The file name will always start with the month and day. Which configuration? (S3 Q35)",
          "options": [
            {
              "label": "A",
              "text": "%%MMMMdd%%"
            },
            {
              "label": "B",
              "text": "Begins With operator"
            },
            {
              "label": "C",
              "text": "%%Year%%%%Month%%%%Day%%"
            },
            {
              "label": "D",
              "text": "Exact Match with filename pattern"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Begins With operator",
          "explanation": "Use the Begins With operator in File Drop trigger configuration when the filename always starts with a known pattern."
        },
        {
          "id": 108,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "NTO is using REST API to send emails to customers after a purchase. Which considerations should be taken regarding the token used in the API Call? (S2 Q44)",
          "options": [
            {
              "label": "A",
              "text": "Make a token API call and re-use the token until the token expires"
            },
            {
              "label": "B",
              "text": "Make a token API call before each triggered send API call"
            },
            {
              "label": "C",
              "text": "Make a token API call and re-use the token for that subscriber"
            },
            {
              "label": "D",
              "text": "Use a permanent API key instead"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Make a token API call and re-use the token until the token expires",
          "explanation": "Reuse the token until it expires (~20 min). One token per call hits rate limits and adds latency to every send."
        },
        {
          "id": 157,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Which application utilizes the REST API? (S2 Q93 - Mobile Connect version)",
          "options": [
            {
              "label": "A",
              "text": "Classic Content"
            },
            {
              "label": "B",
              "text": "Mobile Connect"
            },
            {
              "label": "C",
              "text": "Automation Studio"
            },
            {
              "label": "D",
              "text": "Email Studio (lists)"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Mobile Connect",
          "explanation": "Mobile Connect uses the REST API for sending SMS messages. Classic Content, Automation Studio, and Email Studio list operations use SOAP API."
        },
        {
          "id": 176,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer builds an integration using the Marketing Cloud API. Which configuration should be used for the API integration component in an Installed Package? (S2 Q112)",
          "options": [
            {
              "label": "A",
              "text": "Select the minimum required scope for the integration"
            },
            {
              "label": "B",
              "text": "Select the Require Secret for Web Server Flow option"
            },
            {
              "label": "C",
              "text": "Select the Admin-approved users are pre-authorized option under Permitted Users"
            },
            {
              "label": "D",
              "text": "Grant all available scopes for maximum compatibility"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Select the minimum required scope for the integration",
          "explanation": "Least privilege principle: grant only the minimum required permissions for the specific integration. Overprivileging creates security risk."
        },
        {
          "id": 229,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer is working on cross-channel campaign functions for the email team. They are reviewing available APIs for the different Marketing Cloud applications. Which application utilizes the REST API? (S3 Q8)",
          "options": [
            {
              "label": "A",
              "text": "Classic Content"
            },
            {
              "label": "B",
              "text": "Content Builder"
            },
            {
              "label": "C",
              "text": "Automation Studio"
            },
            {
              "label": "D",
              "text": "Email Studio (legacy lists)"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Content Builder",
          "explanation": "Content Builder uses REST API (/asset/v1/). Classic Content and Automation Studio use SOAP API. REST is for modern SFMC features."
        },
        {
          "id": 259,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer already successfully set up authentication with a client ID and client secret. When the REST call for a triggered send is made, a 401 Unauthorized error is returned. What should be checked first? (S3 Q38)",
          "options": [
            {
              "label": "A",
              "text": "The email interaction has been published"
            },
            {
              "label": "B",
              "text": "The send permissions have been granted for the client ID and client secret within Installed Packages"
            },
            {
              "label": "C",
              "text": "The automation permissions have been granted for the client ID and client secret within Installed Packages"
            },
            {
              "label": "D",
              "text": "The OAuth token has not expired"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "The send permissions have been granted for the client ID and client secret within Installed Packages",
          "explanation": "The existing token lacks the specific send permission scope. Check the Installed Package component has send permissions granted."
        }
      ]
    },
    {
      "set_number": 14,
      "set_name": "Practice Set 14",
      "question_count": 13,
      "domains_covered": {
        "Data Management": 2,
        "AMPscript": 7,
        "Security": 1,
        "SSJS": 1,
        "SQL & Data Views": 3
      },
      "questions": [
        {
          "id": 35,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "Developer configures a File Drop Automation where file name always starts with month and day (e.g. MAY15). Which configuration is correct?",
          "options": [
            {
              "label": "A",
              "text": "%%Year%%%%Month%%%%Day%%"
            },
            {
              "label": "B",
              "text": "Begins With operator"
            },
            {
              "label": "C",
              "text": "%%MMMdd%%"
            },
            {
              "label": "D",
              "text": "Exact Match with filename pattern"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Begins With operator",
          "explanation": "Use the Begins With operator in File Drop trigger configuration when the filename always starts with a known pattern."
        },
        {
          "id": 12,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "A CloudPage has IF/ELSIF checking Length(@point). The value of @value when favFood=Tacos?",
          "options": [
            {
              "label": "A",
              "text": "1"
            },
            {
              "label": "B",
              "text": "4"
            },
            {
              "label": "C",
              "text": "5"
            },
            {
              "label": "D",
              "text": "3"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "4",
          "explanation": "Tacos has 5 characters. The ELSIF chain first matching condition (Length > 1) sets @value = 4."
        },
        {
          "id": 177,
          "domain_code": "J",
          "domain": "SSJS",
          "question": "Developer wants to expand functionality of existing AMPscript code using SSJS. Which SSJS statement would retrieve the value of the AMPscript variable named subkey? (S2 Q113)",
          "options": [
            {
              "label": "A",
              "text": "Var.Get(\"subkey\");"
            },
            {
              "label": "B",
              "text": "Var.Retrieve(\"@subkey\");"
            },
            {
              "label": "C",
              "text": "Variable.GetValue(\"@subkey\");"
            },
            {
              "label": "D",
              "text": "Platform.Var.Get(\"@subkey\");"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Variable.GetValue(\"@subkey\");",
          "explanation": "Variable.GetValue('@variableName') is the correct SSJS method to read an AMPscript variable. Must include the @ prefix."
        },
        {
          "id": 170,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "Developer configures automation to import files from SFTP. First step is File Import Activity referencing a substitution string for the matching file. Which substitution string represents the file name? (S2 Q106)",
          "options": [
            {
              "label": "A",
              "text": "%%FILENAME_FROM_IMPORT%%"
            },
            {
              "label": "B",
              "text": "%%FILENAME_FROM_TRIGGER%%"
            },
            {
              "label": "C",
              "text": "%%FILENAME%%"
            },
            {
              "label": "D",
              "text": "%%FILE_NAME%%"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "%%FILENAME_FROM_TRIGGER%%",
          "explanation": "%%FILENAME_FROM_TRIGGER%% is the correct substitution string representing the name of the file that triggered the File Drop automation."
        },
        {
          "id": 60,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer wants to configure performance tracking of content dynamically created via AMPscript in an email. Which step?",
          "options": [
            {
              "label": "A",
              "text": "Add a unique impression identifier in the HTML tags within the generated content"
            },
            {
              "label": "B",
              "text": "Configure a reference content block in Content Builder"
            },
            {
              "label": "C",
              "text": "Enable impression tracking and utilize AMPscript impression function"
            },
            {
              "label": "D",
              "text": "Use ContentBlockByKey with tracking parameters"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Enable impression tracking and utilize AMPscript impression function",
          "explanation": "Enable impression tracking in the send definition AND use BeginImpressionRegion/EndImpressionRegion AMPscript functions around dynamic content."
        },
        {
          "id": 87,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "A field value returned from a data extension lookup contains a tab-delimited list of values. Which AMPscript function could easily determine if a specific text string exists anywhere in the list? (S2)",
          "options": [
            {
              "label": "A",
              "text": "IndexOf"
            },
            {
              "label": "B",
              "text": "BuildRowSetFromString"
            },
            {
              "label": "C",
              "text": "Substring"
            },
            {
              "label": "D",
              "text": "Contains"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "IndexOf",
          "explanation": "IndexOf(string, searchString) returns position (0 if not found). Directly answers does it exist without iteration."
        },
        {
          "id": 98,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer wants to use the RaiseError AMPscript function when a subscriber does not have the necessary data to build an Email. Which outcome is possible? (S2 Q34)",
          "options": [
            {
              "label": "A",
              "text": "The whole send is cancelled"
            },
            {
              "label": "B",
              "text": "An error message is sent to the From Address used in the email"
            },
            {
              "label": "C",
              "text": "The send is retried"
            },
            {
              "label": "D",
              "text": "The subscriber is logged to an error DE"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "The whole send is cancelled",
          "explanation": "RaiseError can skip one subscriber (skipLine=true) or cancel the entire send (skipLine=false). No retry or error email features."
        },
        {
          "id": 190,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "NTO Enterprise 2.0 has profile attributes including AGE under Profile Manager. How would a developer retrieve subscribers over 30 years of age? (S2 Q126)",
          "options": [
            {
              "label": "A",
              "text": "Create a query that references the _EnterpriseAttribute data view"
            },
            {
              "label": "B",
              "text": "Create a query that references the _Subscribers data view"
            },
            {
              "label": "C",
              "text": "The data cannot be retrieved with a query"
            },
            {
              "label": "D",
              "text": "Create a filter using profile attributes"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Create a query that references the _EnterpriseAttribute data view",
          "explanation": "_EnterpriseAttribute data view contains custom profile attributes including Age. Query this view to filter by age."
        },
        {
          "id": 213,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "An automation in the US child BU queries all records in New York from a Shared DE named MemberData. The query reports: MemberData is not a known data extension. What would cause this error? (S2 Q149)",
          "options": [
            {
              "label": "A",
              "text": "Incorrect syntax; Query Activities are written in SOQL"
            },
            {
              "label": "B",
              "text": "Query should check for a US value of True"
            },
            {
              "label": "C",
              "text": "MemberData should be prefixed with ENT."
            },
            {
              "label": "D",
              "text": "Child BU needs write access to the shared DE"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "MemberData should be prefixed with ENT.",
          "explanation": "Shared DEs from the parent/enterprise BU require the ENT. prefix in SQL: FROM ent.MemberData. Without it, SFMC only searches the current BU."
        },
        {
          "id": 263,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "A data extension contains two fields which are being populated by a query activity. A third field has recently been added to the data extension. Which SELECT statement would be optimal for returning all of the columns in the DE? (S3 Q42)",
          "options": [
            {
              "label": "A",
              "text": "SELECT *, field1, field2, field3"
            },
            {
              "label": "B",
              "text": "SELECT field1, field2, field3"
            },
            {
              "label": "C",
              "text": "SELECT *"
            },
            {
              "label": "D",
              "text": "SELECT ALL"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "SELECT field1, field2, field3",
          "explanation": "Always specify exact field names. SELECT * with JOIN is NOT PERMITTED in SFMC. Named fields are explicit and safe."
        },
        {
          "id": 183,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "A marketer sends email with dynamic content in conditionals. Which AMPscript function should be used to track the different versions of the content within the email? (S2 Q119)",
          "options": [
            {
              "label": "A",
              "text": "BeginImpressionRegion"
            },
            {
              "label": "B",
              "text": "ContentAreaByName"
            },
            {
              "label": "C",
              "text": "ContentBlockByName"
            },
            {
              "label": "D",
              "text": "ImpressionRegion"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "BeginImpressionRegion",
          "explanation": "BeginImpressionRegion('regionName') / EndImpressionRegion('regionName') creates named tracking regions for performance measurement of dynamic content."
        },
        {
          "id": 215,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Which AMPscript function returns the result of interpreted code within a code block? (S2 Q151 - alternate options)",
          "options": [
            {
              "label": "A",
              "text": "Output"
            },
            {
              "label": "B",
              "text": "TreatAsContentArea"
            },
            {
              "label": "C",
              "text": "RenderContent"
            },
            {
              "label": "D",
              "text": "Interpret"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Output",
          "explanation": "Output() renders interpreted AMPscript code results inline. TreatAsContentArea is not a valid function name in SFMC AMPscript."
        },
        {
          "id": 255,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer wants to use the RaiseError AMPscript function when a subscriber does not have the necessary data to build an email. Which outcome is possible? (S3 Q34)",
          "options": [
            {
              "label": "A",
              "text": "The whole send is cancelled"
            },
            {
              "label": "B",
              "text": "An error message is sent to the From Address used in the email"
            },
            {
              "label": "C",
              "text": "The send is retried"
            },
            {
              "label": "D",
              "text": "The email is not sent to a particular subscriber only"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "The whole send is cancelled",
          "explanation": "RaiseError can skip one subscriber (skipLine=true) or cancel the entire send (skipLine=false). No retry or error email features."
        }
      ]
    },
    {
      "set_number": 15,
      "set_name": "Practice Set 15",
      "question_count": 14,
      "domains_covered": {
        "SSJS": 2,
        "API Integration": 7,
        "AMPscript": 1,
        "Security": 1,
        "Data Modeling": 3
      },
      "questions": [
        {
          "id": 37,
          "domain_code": "J",
          "domain": "SSJS",
          "question": "Developer new to SFMC designs a landing page using SSJS. Which feature can be leveraged in server-side code?",
          "options": [
            {
              "label": "A",
              "text": "Direct modification of the DOM"
            },
            {
              "label": "B",
              "text": "External Libraries to extend functionality"
            },
            {
              "label": "C",
              "text": "Include Try/Catch blocks within the code"
            },
            {
              "label": "D",
              "text": "Access the browser's localStorage"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Include Try/Catch blocks within the code",
          "explanation": "SSJS (ECMAScript 3) runs server-side on SFMC servers. No DOM access. No external libraries. Full Try/Catch support available."
        },
        {
          "id": 34,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer wants to review available properties for the DataExtensionField SOAP API object. Where to find?",
          "options": [
            {
              "label": "A",
              "text": "Open the Object Inspector in the Salesforce Developer Console"
            },
            {
              "label": "B",
              "text": "Developer Center at https://developer.salesforce.com"
            },
            {
              "label": "C",
              "text": "Contact Support and request the information"
            },
            {
              "label": "D",
              "text": "Search the SFMC Setup menu"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Developer Center at https://developer.salesforce.com",
          "explanation": "All SFMC API documentation including SOAP object properties is at developer.salesforce.com/docs/marketing/marketing-cloud."
        },
        {
          "id": 23,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Write AMPscript IIF to show Upgrade to premier now when subscriber tier @level is NOT premier:",
          "options": [
            {
              "label": "A",
              "text": "%%=IIF(@level=='premier','You are a premier member!','Upgrade to premier now!')=%%"
            },
            {
              "label": "B",
              "text": "%%=IIF(@level='premier','You are a premier member!','Upgrade to premier now!')=%%"
            },
            {
              "label": "C",
              "text": "%%=IF(@level IS 'premier','Upgrade to premier now!','You are a premier member!')=%%"
            },
            {
              "label": "D",
              "text": "%%=IIF(@level!='premier','Upgrade to premier now!','You are a premier member!')=%%"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "%%=IIF(@level=='premier','You are a premier member!','Upgrade to premier now!')=%%",
          "explanation": "IIF uses == for comparison. Syntax: IIF(condition, true_value, false_value). IF...IS is not valid IIF syntax."
        },
        {
          "id": 178,
          "domain_code": "E",
          "domain": "Security",
          "question": "NTO wants to use PII data to personalize email communications but does not want to store PII data in Marketing Cloud. Which feature? (S2 Q114)",
          "options": [
            {
              "label": "A",
              "text": "External Objects"
            },
            {
              "label": "B",
              "text": "Tokenized Sending"
            },
            {
              "label": "C",
              "text": "Salesforce Shield"
            },
            {
              "label": "D",
              "text": "Field-Level Encryption"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Tokenized Sending",
          "explanation": "Tokenized Sending keeps PII on your external system. SFMC stores only tokens. At send time, SFMC calls your Token Resolve API to get the actual value."
        },
        {
          "id": 236,
          "domain_code": "J",
          "domain": "SSJS",
          "question": "Developer wants to design a custom subscription center in CloudPages and handle unexpected errors gracefully to ensure best user experience. Which feature? (S3 Q15)",
          "options": [
            {
              "label": "A",
              "text": "Using RaiseError AMPscript function when an error occurs"
            },
            {
              "label": "B",
              "text": "Wrapping the code in an AMPscript HandleError block"
            },
            {
              "label": "C",
              "text": "Wrapping the code in a Server-Side JavaScript Try/Catch block"
            },
            {
              "label": "D",
              "text": "Using Platform.Function.HandleError"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Wrapping the code in a Server-Side JavaScript Try/Catch block",
          "explanation": "SSJS Try/Catch blocks provide graceful handling of unexpected runtime errors on CloudPages. AMPscript HandleError block does not exist."
        },
        {
          "id": 65,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer implements custom profile center using LogUnsubEvent. Which parameter ties the event to the appropriate send?",
          "options": [
            {
              "label": "A",
              "text": "SubscriberKey"
            },
            {
              "label": "B",
              "text": "JobID"
            },
            {
              "label": "C",
              "text": "ListID"
            },
            {
              "label": "D",
              "text": "BatchID"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "JobID",
          "explanation": "JobID links the unsubscribe event to the specific email job/send that prompted it."
        },
        {
          "id": 75,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer is working on cross-channel campaign functions. Which application utilizes the REST API? (S2)",
          "options": [
            {
              "label": "A",
              "text": "Automation Studio"
            },
            {
              "label": "B",
              "text": "Classic Content"
            },
            {
              "label": "C",
              "text": "Content Builder"
            },
            {
              "label": "D",
              "text": "Email Studio"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Content Builder",
          "explanation": "Content Builder uses REST API (/asset/v1/). Automation Studio and Classic Content use SOAP API. REST is for modern features."
        },
        {
          "id": 86,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer wants to inject a Contact into a journey using API. What method and route would be used? (S2)",
          "options": [
            {
              "label": "A",
              "text": "POST /contacts/v1/contacts"
            },
            {
              "label": "B",
              "text": "POST /interaction/v1/events"
            },
            {
              "label": "C",
              "text": "PUT /hub/v1/dataevents/key:{key}/rows/{primaryKeys}"
            },
            {
              "label": "D",
              "text": "GET /interaction/v1/interactions"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "POST /interaction/v1/events",
          "explanation": "POST /interaction/v1/events with ContactKey, EventDefinitionKey, and Data payload injects contacts into Journey Builder API Event Entry."
        },
        {
          "id": 211,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "Developer initiated a batch delete of over two million Contacts in Contact Builder. Which factor should be considered? (S2 Q147)",
          "options": [
            {
              "label": "A",
              "text": "The deletion process supersedes other automated account activities"
            },
            {
              "label": "B",
              "text": "To more quickly remove contact information, use the suppression period length of 14"
            },
            {
              "label": "C",
              "text": "Up to one million records can be deleted in each batch"
            },
            {
              "label": "D",
              "text": "Use parallel batch requests to speed up deletion"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Up to one million records can be deleted in each batch",
          "explanation": "Contact Delete has a maximum batch size of 1 million contacts per request. Volumes over 1 million require multiple separate batch delete requests."
        },
        {
          "id": 253,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "Developer wants to create a Synchronized DE containing Lead data from Sales Cloud. Only records containing a phone number. Which field could be used to select a subset of records in the synchronization configuration? (S3 Q32)",
          "options": [
            {
              "label": "A",
              "text": "ContactType"
            },
            {
              "label": "B",
              "text": "Valid Phone"
            },
            {
              "label": "C",
              "text": "PhoneExists"
            },
            {
              "label": "D",
              "text": "MobilePhone"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "ContactType",
          "explanation": "Synchronization configuration filters only work on Text type fields. ContactType (Text) is filterable; Boolean and Formula Boolean fields are not."
        },
        {
          "id": 284,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "A doctor's office creates Populations for staff, patients, and vendors. What is the maximum number of Populations that should be created to ensure performance? (S3 Q63)",
          "options": [
            {
              "label": "A",
              "text": "Three"
            },
            {
              "label": "B",
              "text": "One"
            },
            {
              "label": "C",
              "text": "Unlimited"
            },
            {
              "label": "D",
              "text": "Five"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Three",
          "explanation": "Hard limit: 3 Populations per SFMC account. More than 3 causes significant performance degradation system-wide."
        },
        {
          "id": 182,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer uses messageDefinitionSends REST API endpoint to send a triggered send email. Gets 202 success response. How to validate if email was actually sent? (S2 Q118)",
          "options": [
            {
              "label": "A",
              "text": "Confirm the record was successfully inserted into the associated Triggered Send DE"
            },
            {
              "label": "B",
              "text": "Use the messageDefinitionSends/key:{key}/deliveryRecords REST endpoint with GET method"
            },
            {
              "label": "C",
              "text": "Use the validateEmail REST resource with POST method"
            },
            {
              "label": "D",
              "text": "Check the Send Log DE for the record"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Use the messageDefinitionSends/key:{key}/deliveryRecords REST endpoint with GET method",
          "explanation": "202 means accepted/queued, not yet delivered. Use GET /messageDefinitionSends/key:{key}/deliveryRecords to verify actual delivery status."
        },
        {
          "id": 232,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer is implementing a custom profile center and using the LogUnsubEvent request. Which required parameter in the Job Context section of the call will successfully record an UnSubEvent? (S3 Q11)",
          "options": [
            {
              "label": "A",
              "text": "JobID, ListID, and BatchID"
            },
            {
              "label": "B",
              "text": "JobID, ListID, SubscriberID"
            },
            {
              "label": "C",
              "text": "JobID, BatchID, SubscriberID"
            },
            {
              "label": "D",
              "text": "JobID and SubscriberKey only"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "JobID, ListID, and BatchID",
          "explanation": "Job Context requires three fields: JobID (which email job), ListID (which subscriber list), and BatchID (which batch). Together they identify the specific send."
        },
        {
          "id": 265,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "NTO is using REST API to send emails to customers after a purchase. Which considerations should be taken regarding the token used in the API Call? (S3 Q44)",
          "options": [
            {
              "label": "A",
              "text": "Make a token API call and re-use the token until the token expires"
            },
            {
              "label": "B",
              "text": "Make a token API call before each triggered send API call"
            },
            {
              "label": "C",
              "text": "Make a token API call and re-use the token for that subscriber"
            },
            {
              "label": "D",
              "text": "Use a permanent API key instead"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Make a token API call and re-use the token until the token expires",
          "explanation": "Reuse the token until it expires (~20 min). One token per call hits rate limits and adds latency to every send."
        }
      ]
    },
    {
      "set_number": 16,
      "set_name": "Practice Set 16",
      "question_count": 14,
      "domains_covered": {
        "Security": 2,
        "SQL & Data Views": 4,
        "API Integration": 1,
        "AMPscript": 7
      },
      "questions": [
        {
          "id": 36,
          "domain_code": "E",
          "domain": "Security",
          "question": "NTO doesn't mind data visible in clear text within SFMC, but wants the underlying database files encrypted at rest if physical media is stolen. Which encryption method?",
          "options": [
            {
              "label": "A",
              "text": "Transparent Data Encryption"
            },
            {
              "label": "B",
              "text": "Encrypted Data Sending"
            },
            {
              "label": "C",
              "text": "Field-Level Encryption"
            },
            {
              "label": "D",
              "text": "Salesforce Shield"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Transparent Data Encryption",
          "explanation": "TDE encrypts database files at the OS/disk level. Transparent to SFMC app — data still visible within platform. Protects against physical media theft."
        },
        {
          "id": 11,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Fields SMTPBounceReason and SMTPCode can exceed 4000-character DE field limits. Store only first 4000 chars using which SQL function?",
          "options": [
            {
              "label": "A",
              "text": "RIGHT"
            },
            {
              "label": "B",
              "text": "LEFT"
            },
            {
              "label": "C",
              "text": "FIRST"
            },
            {
              "label": "D",
              "text": "SUBSTRING(field,0,4000)"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "LEFT",
          "explanation": "LEFT(field, 4000) returns the first 4000 characters. RIGHT gives the last 4000. FIRST is not a T-SQL function."
        },
        {
          "id": 40,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer switches from legacy endpoint www.exacttargetapis.com to Tenant Specific Endpoints (TSEs). What is the benefit?",
          "options": [
            {
              "label": "A",
              "text": "A longer lasting OAuth token"
            },
            {
              "label": "B",
              "text": "Improved API performance"
            },
            {
              "label": "C",
              "text": "API calls will no longer fail"
            },
            {
              "label": "D",
              "text": "Rate limits are automatically removed"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Improved API performance",
          "explanation": "TSEs route requests directly to your tenant specific infrastructure, improving performance by bypassing the shared routing layer."
        },
        {
          "id": 31,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "NTO wants to exclude sending email at send time to those with a record on Exclude DE (primary key: SubscriberKey). Write the Exclusion Script:",
          "options": [
            {
              "label": "A",
              "text": "RowCount(LookupRows('Exclude','SubscriberKey',_SubscriberKey)) > 0"
            },
            {
              "label": "B",
              "text": "RowCount(LookupRows('Exclude','SubscriberKey',_SubscriberKey)) > 1"
            },
            {
              "label": "C",
              "text": "Lookup('Exclude','SubscriberKey','EmailAddress',emailaddr) == emailaddr"
            },
            {
              "label": "D",
              "text": "LookupRows('Exclude','SubscriberKey',@email) > 0"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "RowCount(LookupRows('Exclude','SubscriberKey',_SubscriberKey)) > 0",
          "explanation": "Threshold must be > 0 (not > 1). Use personalization string _SubscriberKey (no @ prefix). > 1 misses subscribers with exactly one record."
        },
        {
          "id": 274,
          "domain_code": "E",
          "domain": "Security",
          "question": "Developer needs to configure a process that can store encrypted data from Marketing Cloud as a file on an external server. What steps? (S3 Q53)",
          "options": [
            {
              "label": "A",
              "text": "Shield Platform Encryption is required for encrypted data export"
            },
            {
              "label": "B",
              "text": "Create PGP Key > Data Extract > File Transfer with PGP checked"
            },
            {
              "label": "C",
              "text": "Data Extract > File Transfer with Marketing Cloud Public Key"
            },
            {
              "label": "D",
              "text": "Use SFTP SSL - no additional setup needed"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Create PGP Key > Data Extract > File Transfer with PGP checked",
          "explanation": "Create PGP key in Key Management, run Data Extract to Safehouse, then File Transfer with PGP encryption enabled to move to external SFTP."
        },
        {
          "id": 106,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "A data extension contains two fields being populated by a query activity. A third field has recently been added to the data extension. Which SELECT statement would be optimal for returning all of the columns? (S2 Q42)",
          "options": [
            {
              "label": "A",
              "text": "SELECT *, field1, field2, field3"
            },
            {
              "label": "B",
              "text": "SELECT field1, field2, field3"
            },
            {
              "label": "C",
              "text": "SELECT *"
            },
            {
              "label": "D",
              "text": "SELECT ALL"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "SELECT field1, field2, field3",
          "explanation": "Always specify exact field names. SELECT * with JOIN is NOT PERMITTED in SFMC. Named fields are explicit and safe."
        },
        {
          "id": 126,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer wants to populate a DE with the date of the most recent click for each subscriber. Which query? (S2 Q62)",
          "options": [
            {
              "label": "A",
              "text": "SELECT c.Subscriberkey, MAX(c.eventDate) As eventDate FROM Click GROUP BY c.Subscriberkey"
            },
            {
              "label": "B",
              "text": "SELECT c.Subscriberkey, eventDate FROM Click WHERE IsUnique = 1"
            },
            {
              "label": "C",
              "text": "SELECT c.subscriberkey, MIN(c.eventDate) AS eventDate FROM Click GROUP BY Subscriberkey"
            },
            {
              "label": "D",
              "text": "SELECT c.subscriberkey, LAST(c.eventDate) FROM Click GROUP BY Subscriberkey"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "SELECT c.Subscriberkey, MAX(c.eventDate) As eventDate FROM Click GROUP BY c.Subscriberkey",
          "explanation": "MAX(eventDate) returns the most recent date. MIN returns oldest. IsUnique=1 gets first click only. LAST() is not valid T-SQL."
        },
        {
          "id": 159,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "How should a developer optimize a query activity if it is currently timing out? (S2 Q95)",
          "options": [
            {
              "label": "A",
              "text": "Use intermediate tables to stage data"
            },
            {
              "label": "B",
              "text": "Use SELECT * to include all fields"
            },
            {
              "label": "C",
              "text": "Use intrinsic functions in the WHERE clause"
            },
            {
              "label": "D",
              "text": "Move all activities to the same automation step"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Use intermediate tables to stage data",
          "explanation": "Break the complex query into smaller steps using intermediate staging DEs. Each query must complete within SFMC 30-minute auto-kill limit."
        },
        {
          "id": 112,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer writes AMPscript to check if a DE record exists and uses InsertDE() if the record doesn't yet exist. Why would the developer receive an error stating the application cannot insert a duplicate value for the primary key? (S2 Q48)",
          "options": [
            {
              "label": "A",
              "text": "The InsertDE function cannot be used at send time"
            },
            {
              "label": "B",
              "text": "The InsertDE function comes AFTER the system added the row as part of the email send"
            },
            {
              "label": "C",
              "text": "The InsertDE function cannot be used with name and value pairs"
            },
            {
              "label": "D",
              "text": "InsertDE requires a transaction block"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "The InsertDE function comes AFTER the system added the row as part of the email send",
          "explanation": "At send time SFMC automatically creates a row in the sendable DE first. InsertDE() then finds it already exists. Use UpsertDE() instead."
        },
        {
          "id": 139,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer needs AMPscript to ensure expiration date on a coupon is the last day of the month. What produces the desired result? (S2 Q75)",
          "options": [
            {
              "label": "A",
              "text": "Find the first day of next month and subtract one day"
            },
            {
              "label": "B",
              "text": "Add 30 days using DateAdd to Now"
            },
            {
              "label": "C",
              "text": "Use the date format string for last day of month within FormatDate"
            },
            {
              "label": "D",
              "text": "Add one month using DateAdd to Now"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Find the first day of next month and subtract one day",
          "explanation": "No last day of month function exists. Find first day of NEXT month then subtract 1 day. This handles months with varying day counts correctly."
        },
        {
          "id": 153,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Which AMPscript function returns the result of interpreted code within a code block and includes the result in the rendered content, where the code block is located? (S2 Q89)",
          "options": [
            {
              "label": "A",
              "text": "Output"
            },
            {
              "label": "B",
              "text": "TreatAs"
            },
            {
              "label": "C",
              "text": "ContentArea"
            },
            {
              "label": "D",
              "text": "Render"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Output",
          "explanation": "Output() renders the result of interpreted AMPscript code inline at the location where the code block appears."
        },
        {
          "id": 193,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "In what order is AMPscript evaluated before an email is sent? (S2 Q129)",
          "options": [
            {
              "label": "A",
              "text": "Text Body, HTML Body, Subject Line"
            },
            {
              "label": "B",
              "text": "Subject Line, HTML Body, Text Body"
            },
            {
              "label": "C",
              "text": "HTML Body, Text Body, Subject Line"
            },
            {
              "label": "D",
              "text": "HTML Body, Subject Line, Text Body"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "HTML Body, Text Body, Subject Line",
          "explanation": "AMPscript processing order: HTML Body first, Text Body second, Subject Line LAST. Variables set in HTML body are available in the subject line."
        },
        {
          "id": 222,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer is troubleshooting the cause of incomplete results in the link tracking data for an email send. How should the RedirectTo AMPscript function be described as it relates to link tracking? (S3 Q1)",
          "options": [
            {
              "label": "A",
              "text": "It ensures static link href values are recorded in tracking"
            },
            {
              "label": "B",
              "text": "It ensures link href values containing HTML bookmarks or anchors are recorded in tracking"
            },
            {
              "label": "C",
              "text": "It ensures link href values containing AMPscript variables are recorded in tracking"
            },
            {
              "label": "D",
              "text": "It prevents tracking on sensitive links"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "It ensures link href values containing AMPscript variables are recorded in tracking",
          "explanation": "RedirectTo() is required for href values that contain AMPscript variables. Without it, SFMC cannot track clicks on dynamically built URLs."
        },
        {
          "id": 257,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer wants to configure performance tracking of content dynamically created via AMPscript in an email. Which step should be performed to achieve this objective? (S3 Q36)",
          "options": [
            {
              "label": "A",
              "text": "Configure a reference content block in Content Builder"
            },
            {
              "label": "B",
              "text": "Add a unique impression identifier in the HTML tags within the generated content"
            },
            {
              "label": "C",
              "text": "Enable impression tracking and utilize AMPscript impression function"
            },
            {
              "label": "D",
              "text": "Use ContentBlockByKey with tracking parameters"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Enable impression tracking and utilize AMPscript impression function",
          "explanation": "Enable impression tracking in the send definition AND use BeginImpressionRegion/EndImpressionRegion AMPscript functions around dynamic content."
        }
      ]
    },
    {
      "set_number": 17,
      "set_name": "Practice Set 17",
      "question_count": 13,
      "domains_covered": {
        "Email Studio": 1,
        "Data Modeling": 4,
        "SQL & Data Views": 1,
        "API Integration": 7,
        "AMPscript": 1
      },
      "questions": [
        {
          "id": 123,
          "domain_code": "T",
          "domain": "Email Studio",
          "question": "Developer is notified the View Email As Web Page (VAWP) link displays the message The system is temporarily unavailable. What could be a possible cause? (S2 Q59)",
          "options": [
            {
              "label": "A",
              "text": "The data in the data extensions used for the send was overwritten"
            },
            {
              "label": "B",
              "text": "The data extension used for the send was moved to another folder"
            },
            {
              "label": "C",
              "text": "The email used for the send was deleted, updated, or moved"
            },
            {
              "label": "D",
              "text": "The tracking URLs have expired"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "The email used for the send was deleted, updated, or moved",
          "explanation": "VAWP links depend on the email asset remaining intact at its original location. If deleted or moved, the page cannot render."
        },
        {
          "id": 22,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "Developer wants to expedite Contact Delete of roughly 10 million subscribers. How?",
          "options": [
            {
              "label": "A",
              "text": "Change the Suppression value to a larger value"
            },
            {
              "label": "B",
              "text": "Delete any unnecessary Sendable Data Extensions"
            },
            {
              "label": "C",
              "text": "Manually delete subscribers in All Contacts"
            },
            {
              "label": "D",
              "text": "Use parallel API calls"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Delete any unnecessary Sendable Data Extensions",
          "explanation": "Fewer Sendable DEs reduces cleanup work per contact. Larger suppression period actually slows the process."
        },
        {
          "id": 33,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer experiences timeouts when testing a SQL Query Activity in Automation Studio. How to optimize?",
          "options": [
            {
              "label": "A",
              "text": "Use intermediate tables to break queries into smaller parts"
            },
            {
              "label": "B",
              "text": "Ensure all SQL Query Activities are in the same step in the automation"
            },
            {
              "label": "C",
              "text": "Limit joins to the INNER JOIN within all SQL Query Activities"
            },
            {
              "label": "D",
              "text": "Remove all WHERE clauses"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Use intermediate tables to break queries into smaller parts",
          "explanation": "Break complex queries into smaller steps using intermediate staging DEs. Each query must complete within SFMC 30-minute auto-kill limit."
        },
        {
          "id": 51,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Company gets Unable to queue Triggered Send - no valid subscribers via REST. SOAP provides more detail. Which element gives actionable detail?",
          "options": [
            {
              "label": "A",
              "text": "ErrorDescription"
            },
            {
              "label": "B",
              "text": "OverallStatus"
            },
            {
              "label": "C",
              "text": "ErrorCode"
            },
            {
              "label": "D",
              "text": "RequestID"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "ErrorDescription",
          "explanation": "ErrorDescription provides the human-readable detail - which required DE field is missing from the payload."
        },
        {
          "id": 47,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Why would a developer use LookupRows instead of the Lookup AMPscript function?",
          "options": [
            {
              "label": "A",
              "text": "To return a complete rowset from the data extension"
            },
            {
              "label": "B",
              "text": "To access a data extension, as Lookup only targets lists"
            },
            {
              "label": "C",
              "text": "To see how many rows are in a data extension"
            },
            {
              "label": "D",
              "text": "To improve performance on large data extensions"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "To return a complete rowset from the data extension",
          "explanation": "LookupRows returns ALL matching rows as a RowSet. Lookup returns ONE field value from the FIRST matching row. Both access DEs."
        },
        {
          "id": 120,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "NTO uses a numeric identifier for Subscriber Key. Customer data is stored in a DE with the Subscriber Key set as a Primary Key. Which step is required when creating relationships for this DE in Data Designer? (S2 Q56)",
          "options": [
            {
              "label": "A",
              "text": "Set Subscriber Key as a text data type before linking the data extension to Contact Key"
            },
            {
              "label": "B",
              "text": "Use a one-to-one cardinality when creating the relationship"
            },
            {
              "label": "C",
              "text": "Link the Contact Key to the Subscriber's email address when creating the relationship"
            },
            {
              "label": "D",
              "text": "Convert the Contact Key to numeric format to match"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Set Subscriber Key as a text data type before linking the data extension to Contact Key",
          "explanation": "Contact Key is stored as text in SFMC. Numeric Subscriber Key must be converted to text data type before the relationship can be created."
        },
        {
          "id": 161,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "Developer wants to create a data model in Contact Builder. Which application will be able to use this newly-created data model for segmentation? (S2 Q97)",
          "options": [
            {
              "label": "A",
              "text": "Email Studio"
            },
            {
              "label": "B",
              "text": "Journey Builder"
            },
            {
              "label": "C",
              "text": "Automation Studio"
            },
            {
              "label": "D",
              "text": "Mobile Studio"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Journey Builder",
          "explanation": "Journey Builder uses the Contact Builder data model for segmentation, targeting, and personalization within journeys."
        },
        {
          "id": 113,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer is implementing a custom profile center and using the LogUnsubEvent request. Which parameter is required for the event to be tied to the appropriate send? (S2 Q49)",
          "options": [
            {
              "label": "A",
              "text": "SubscriberKey"
            },
            {
              "label": "B",
              "text": "JobID"
            },
            {
              "label": "C",
              "text": "ListID"
            },
            {
              "label": "D",
              "text": "BatchID"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "JobID",
          "explanation": "JobID links the unsubscribe event to the specific email job/send that prompted it."
        },
        {
          "id": 131,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "How long are Marketing Cloud v2 access tokens valid? (S2 Q67 - 4 options)",
          "options": [
            {
              "label": "A",
              "text": "Access tokens expire after 20 minutes"
            },
            {
              "label": "B",
              "text": "Access tokens expire after 24 hours"
            },
            {
              "label": "C",
              "text": "Each API call requires a new access token"
            },
            {
              "label": "D",
              "text": "REST calls do not require an access token"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Access tokens expire after 20 minutes",
          "explanation": "OAuth v2 tokens expire after approximately 20 minutes. Store token and expiry time, reuse until expiry, then request a new one."
        },
        {
          "id": 158,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer receives Error Code 5 when performing a SOAP API call: Cannot Perform Post on objects of type SentEvent. What could be the issue? (S2 Q94)",
          "options": [
            {
              "label": "A",
              "text": "SOAP does not support POST; use REST"
            },
            {
              "label": "B",
              "text": "SentEvent is not able to be updated using SOAP"
            },
            {
              "label": "C",
              "text": "The authentication token has expired"
            },
            {
              "label": "D",
              "text": "The endpoint URL is incorrect for SentEvent"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "SentEvent is not able to be updated using SOAP",
          "explanation": "Error Code 5 = Cannot perform [method] on [object type]. SentEvent (and OpenEvent, ClickEvent, BounceEvent) are READ-ONLY tracking objects - Retrieve method only."
        },
        {
          "id": 186,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer uses the REST Authorization Service to obtain an OAuth access token. How to include the token in the API request? (S2 Q122)",
          "options": [
            {
              "label": "A",
              "text": "Include as a query parameter ?access_token=YOUR_ACCESS_TOKEN"
            },
            {
              "label": "B",
              "text": "Include the header Authorization: Bearer YOUR_ACCESS_TOKEN"
            },
            {
              "label": "C",
              "text": "Include the header Authorization: Basic YOUR_ACCESS_TOKEN"
            },
            {
              "label": "D",
              "text": "Include in the request body as access_token field"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Include the header Authorization: Bearer YOUR_ACCESS_TOKEN",
          "explanation": "REST API calls require Authorization: Bearer {access_token} in the request header. Query parameters expose the token in URLs and server logs."
        },
        {
          "id": 234,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer wants to review the available properties for using the DataExtension Field SOAP API object. Where could the developer find this information? (S3 Q13)",
          "options": [
            {
              "label": "A",
              "text": "Open the Object Inspector in the Salesforce Developer Console"
            },
            {
              "label": "B",
              "text": "Developer Center at https://developer.salesforce.com"
            },
            {
              "label": "C",
              "text": "Contact Support and request the information"
            },
            {
              "label": "D",
              "text": "Search the SFMC Help documentation"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Developer Center at https://developer.salesforce.com",
          "explanation": "All SFMC API documentation, including SOAP object property definitions, is at developer.salesforce.com/docs/marketing/marketing-cloud."
        },
        {
          "id": 270,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer is implementing a custom profile center and using the LogUnsubEvent request. Which parameter is required for the event to be tied to the appropriate send? (S3 Q49)",
          "options": [
            {
              "label": "A",
              "text": "SubscriberKey"
            },
            {
              "label": "B",
              "text": "JobID"
            },
            {
              "label": "C",
              "text": "ListID"
            },
            {
              "label": "D",
              "text": "BatchID"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "JobID",
          "explanation": "JobID links the unsubscribe event to the specific email job/send that prompted it."
        }
      ]
    },
    {
      "set_number": 18,
      "set_name": "Practice Set 18",
      "question_count": 14,
      "domains_covered": {
        "AMPscript": 4,
        "Data Management": 4,
        "Data Modeling": 1,
        "SQL & Data Views": 4,
        "API Integration": 1
      },
      "questions": [
        {
          "id": 4,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Personalize email with FirstName from Customers DE (different from sending DE). Both use CustomerKey. Which AMPscript syntax?",
          "options": [
            {
              "label": "A",
              "text": "%%=Lookup('Customers','FirstName','CustomerKey',CustomerKey)=%%"
            },
            {
              "label": "B",
              "text": "%%=Lookup('Customers','FirstName','ContactID',CustomerKey)=%%"
            },
            {
              "label": "C",
              "text": "%%=Lookup('Customers','FirstName','CustomerKey','CustomerKey')=%%"
            },
            {
              "label": "D",
              "text": "%%=Lookup('NewSubscribers','FirstName','CustomerKey',CustomerKey)=%%"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "%%=Lookup('Customers','FirstName','CustomerKey',CustomerKey)=%%",
          "explanation": "Correct DE name, correct return field, correct search field, CustomerKey as variable not string literal."
        },
        {
          "id": 56,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "Developer needs to configure an Email Send Logging DE for a new business unit. Which option?",
          "options": [
            {
              "label": "A",
              "text": "Salesforce Support should create the DE"
            },
            {
              "label": "B",
              "text": "Create from a copy of an existing Send Log in another BU"
            },
            {
              "label": "C",
              "text": "Create using the SendLog Data Extension Template"
            },
            {
              "label": "D",
              "text": "Create as a standard DE with custom fields manually added"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Create using the SendLog Data Extension Template",
          "explanation": "Use the SendLog Data Extension Template which pre-configures all required system fields (SubscriberKey, EmailAddress, JobID, BatchID, ListID, etc.)."
        },
        {
          "id": 50,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "Developer performs Contact Delete on records in a DE in Contact Builder. Which scenario causes subscriber records to REMAIN in the DE?",
          "options": [
            {
              "label": "A",
              "text": "Contact Delete process does not delete rows from data extensions"
            },
            {
              "label": "B",
              "text": "Non-sendable data extension with SubscriberKey field"
            },
            {
              "label": "C",
              "text": "Sendable data extension with SubscriberKey field"
            },
            {
              "label": "D",
              "text": "The suppression period must expire first"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Non-sendable data extension with SubscriberKey field",
          "explanation": "Contact Delete removes rows from SENDABLE DEs only. Non-sendable DEs (reference tables, lookup data) are completely untouched."
        },
        {
          "id": 81,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer wants to populate a DE with the date of the most recent click for each subscriber. Which query? (S2 version)",
          "options": [
            {
              "label": "A",
              "text": "SELECT c.Subscriberkey, MAX(c.eventDate) As eventDate FROM Click GROUP BY c.Subscriberkey"
            },
            {
              "label": "B",
              "text": "SELECT c.Subscriberkey, .eventDate FROM Click WHERE .IsUnique = 1"
            },
            {
              "label": "C",
              "text": "SELECT c.subscriberkey, MIN(c.eventDate) AS eventDate FROM Click GROUP BY Subscriberkey"
            },
            {
              "label": "D",
              "text": "SELECT c.subscriberkey, LAST(c.eventDate) FROM Click"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "SELECT c.Subscriberkey, MAX(c.eventDate) As eventDate FROM Click GROUP BY c.Subscriberkey",
          "explanation": "MAX(eventDate) returns the most recent date. MIN returns oldest. IsUnique=1 gets first click only. LAST() is not valid T-SQL."
        },
        {
          "id": 57,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Which aspect should a developer consider before creating a Server-to-Server Installed Package and associated API Integration?",
          "options": [
            {
              "label": "A",
              "text": "Using an Installed Package, APIs have access to resources in all Business Units"
            },
            {
              "label": "B",
              "text": "Scope will be granted based on the User who is creating the Installed Package"
            },
            {
              "label": "C",
              "text": "Scope must be specifically granted when creating an API Integration component inside an Installed Package"
            },
            {
              "label": "D",
              "text": "The package automatically inherits admin permissions"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Scope must be specifically granted when creating an API Integration component inside an Installed Package",
          "explanation": "Scope must be explicitly configured when creating the API Integration component. It does NOT automatically inherit from the user role."
        },
        {
          "id": 198,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "NTO uses a Send Log and sends more than one million emails per day. They want to execute daily reports without impacting send performance. Which set of best practices? (S2 Q134)",
          "options": [
            {
              "label": "A",
              "text": "Copy new Send Log records to an Archive data extension, then run reports from the Archive data extension"
            },
            {
              "label": "B",
              "text": "Copy new Send Log records to an Archive data extension, then run reports from the Send Log data extension"
            },
            {
              "label": "C",
              "text": "Add a data retention policy to the Send Log, then run reports from the _Opens data view"
            },
            {
              "label": "D",
              "text": "Run reports directly from the Send Log DE during off-peak hours"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Copy new Send Log records to an Archive data extension, then run reports from the Archive data extension",
          "explanation": "Copy Send Log records to Archive DE, run reports from Archive. This protects the active Send Log from reporting queries that could slow sends."
        },
        {
          "id": 231,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "Marketing director at NTO wants to analyze the Send, Click, and Open Data Views. Which activities should the developer build to generate the data before transferring it to the SFTP? (S3 Q10)",
          "options": [
            {
              "label": "A",
              "text": "Query Activity > Data Extension Extract"
            },
            {
              "label": "B",
              "text": "Filter Activity > Data Extension Extract"
            },
            {
              "label": "C",
              "text": "Query Activity > Tracking Extract"
            },
            {
              "label": "D",
              "text": "Tracking Extract > File Transfer"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Query Activity > Data Extension Extract",
          "explanation": "Query Activity extracts data from system data views into a target DE. Data Extension Extract then packages it as a CSV file for transfer to SFTP."
        },
        {
          "id": 267,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "Developer needs to configure an Email Send Logging DE for a new business unit. Which option should be used? (S3 Q46)",
          "options": [
            {
              "label": "A",
              "text": "Create from a copy of an existing Send Log in another business unit"
            },
            {
              "label": "B",
              "text": "Create using the SendLog Data Extension Template"
            },
            {
              "label": "C",
              "text": "Salesforce Support should create the data extension"
            },
            {
              "label": "D",
              "text": "Create as a standard DE with custom fields"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Create using the SendLog Data Extension Template",
          "explanation": "Use the SendLog Data Extension Template which pre-configures all required system fields."
        },
        {
          "id": 191,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer wants to compile data from an HTML form for CSV export. The source DE may contain line breaks within the Comments field. Which SQL functions change each line break to a single space? (S2 Q127)",
          "options": [
            {
              "label": "A",
              "text": "REPLICATE and NCHAR"
            },
            {
              "label": "B",
              "text": "LTRIM and RTRIM"
            },
            {
              "label": "C",
              "text": "REPLACE and CHAR"
            },
            {
              "label": "D",
              "text": "CONVERT and CHAR"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "REPLACE and CHAR",
          "explanation": "REPLACE(Comments, CHAR(10), ' ') or REPLACE(Comments, CHAR(13), ' ') replaces line break characters with spaces."
        },
        {
          "id": 240,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer is querying data from the Bounce data view and the fields SMTPBounceReason and SMTPCode exceed the 4000-character limits. Decided to store only the first 4000 characters. Which SQL function? (S3 Q19)",
          "options": [
            {
              "label": "A",
              "text": "RIGHT"
            },
            {
              "label": "B",
              "text": "LEFT"
            },
            {
              "label": "C",
              "text": "FIRST"
            },
            {
              "label": "D",
              "text": "SUBSTRING(field,0,4000)"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "LEFT",
          "explanation": "LEFT(columnName, 4000) returns the first 4000 characters from the beginning of the string. RIGHT gives the last 4000. FIRST is not a T-SQL function."
        },
        {
          "id": 276,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Customer data has been imported into a staging DE and needs to be normalized. A text field named birthday contains date values in various formats. Which SQL keywords could be used to write the query? (S3 Q55)",
          "options": [
            {
              "label": "A",
              "text": "WHERE, ISDATE, CONVERT CAST"
            },
            {
              "label": "B",
              "text": "UPDATE, ISDATE, CONVERT CAST"
            },
            {
              "label": "C",
              "text": "CASE, ISDATE, CAST"
            },
            {
              "label": "D",
              "text": "SELECT, ISDATE, TRY_CONVERT"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "CASE, ISDATE, CAST",
          "explanation": "CASE for conditional per-row logic. ISDATE() to validate. CAST() to convert valid ones. Pattern: CASE WHEN ISDATE(birthday)=1 THEN CAST(birthday AS date)."
        },
        {
          "id": 194,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer wants to trigger an SMS message to a subscriber using a form published on CloudPages. How should the SMS be triggered once the subscriber submits the form? (S2 Q130)",
          "options": [
            {
              "label": "A",
              "text": "requestToken and messageContact REST API objects"
            },
            {
              "label": "B",
              "text": "InsertData AMPscript function to add the subscriber to a MobileConnect list"
            },
            {
              "label": "C",
              "text": "CreateSmsConversation AMPscript function"
            },
            {
              "label": "D",
              "text": "UpsertDE to a MobileConnect subscriber list then trigger"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "CreateSmsConversation AMPscript function",
          "explanation": "CreateSmsConversation() is the AMPscript function specifically for triggering an SMS message from a CloudPage upon form submission."
        },
        {
          "id": 223,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer wants to set a variable to use a field from a Sendable Data Extension. Which option could be used in an AMPscript block? (S3 Q2)",
          "options": [
            {
              "label": "A",
              "text": "SET @firstName = \"First Name\""
            },
            {
              "label": "B",
              "text": "SET @firstName = %%First Name%%"
            },
            {
              "label": "C",
              "text": "SET @firstName = AttributeValue(\"First Name\")"
            },
            {
              "label": "D",
              "text": "SET @firstName = [First Name]"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "SET @firstName = AttributeValue(\"First Name\")",
          "explanation": "AttributeValue('FieldName') is the correct function to read a field from the sendable DE at send time. Other options don't correctly retrieve the actual field value."
        },
        {
          "id": 258,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "How should a developer write an Exclusion Script to exclude sending an email at send time when comparing against a Boolean field in the Sendable DE? (S3 Q37)",
          "options": [
            {
              "label": "A",
              "text": "%%=Lookup('Excluded','SendBool','_SubscriberKey',_SubscriberKey)=%%"
            },
            {
              "label": "B",
              "text": "%%=Lookup('Excluded','SendBool','SubscriberKey',_SubscriberKey)=%%"
            },
            {
              "label": "C",
              "text": "%%SendBool%% < 1"
            },
            {
              "label": "D",
              "text": "SendBool==1"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "%%=Lookup('Excluded','SendBool','SubscriberKey',_SubscriberKey)=%%",
          "explanation": "The DE field name is SubscriberKey (without underscore). The 4th parameter uses personalization string _SubscriberKey. Option A incorrectly uses _SubscriberKey as the field name."
        }
      ]
    },
    {
      "set_number": 19,
      "set_name": "Practice Set 19",
      "question_count": 14,
      "domains_covered": {
        "API Integration": 4,
        "SSJS": 1,
        "Data Management": 1,
        "Data Modeling": 3,
        "SQL & Data Views": 1,
        "AMPscript": 4
      },
      "questions": [
        {
          "id": 24,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer wants to retrieve a row of data from a DE using the SOAP API. Which API Object?",
          "options": [
            {
              "label": "A",
              "text": "DataExtension"
            },
            {
              "label": "B",
              "text": "Row"
            },
            {
              "label": "C",
              "text": "DataExtensionObject"
            },
            {
              "label": "D",
              "text": "DataRow"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "DataExtensionObject",
          "explanation": "DataExtensionObject is for DE row operations (Create, Retrieve, Update, Delete). DataExtension manages DE structure/schema."
        },
        {
          "id": 76,
          "domain_code": "J",
          "domain": "SSJS",
          "question": "Developer wants to build out a series of CloudPages that will interact with several REST APIs. Which Marketing Cloud supported scripting tool should be used? (S2)",
          "options": [
            {
              "label": "A",
              "text": "SSJS"
            },
            {
              "label": "B",
              "text": "GTL"
            },
            {
              "label": "C",
              "text": "AMPscript"
            },
            {
              "label": "D",
              "text": "Python"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "SSJS",
          "explanation": "SSJS (Server-Side JavaScript) is the correct tool for CloudPages that need to interact with REST APIs. AMPscript cannot make REST calls natively."
        },
        {
          "id": 110,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "Developer needs to configure an Email Send Logging DE for a new business unit. Which option should be used? (S2 Q46)",
          "options": [
            {
              "label": "A",
              "text": "Create from a copy of an existing Send Log in another business unit"
            },
            {
              "label": "B",
              "text": "Create using the SendLog Data Extension Template"
            },
            {
              "label": "C",
              "text": "Salesforce Support should create the data extension"
            },
            {
              "label": "D",
              "text": "Create as a standard DE with custom fields manually added"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Create using the SendLog Data Extension Template",
          "explanation": "Use the SendLog Data Extension Template which pre-configures all required system fields."
        },
        {
          "id": 73,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "NTO uses a numeric identifier for Subscriber Key. Customer data is stored in a DE with the Subscriber Key set as a Primary Key. Step required when creating relationships for this DE in Data Designer? (S2)",
          "options": [
            {
              "label": "A",
              "text": "Set Subscriber Key as a text data type before linking the data extension to Contact Key"
            },
            {
              "label": "B",
              "text": "Link the Contact Key to the Subscriber's email address when creating the Relationship"
            },
            {
              "label": "C",
              "text": "Use a one-to-one cardinality when creating the relationship"
            },
            {
              "label": "D",
              "text": "Convert the Contact Key to numeric format to match"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Set Subscriber Key as a text data type before linking the data extension to Contact Key",
          "explanation": "Contact Key is stored as text in SFMC. Numeric Subscriber Key must be converted to text data type before the relationship can be created."
        },
        {
          "id": 90,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "Developer is writing a query to select unique subscribers who opened any emails sent since the beginning of the previous day. Which query provides that result? (S2 Q26)",
          "options": [
            {
              "label": "A",
              "text": "SELECT DISTINCT o.SubscriberKey FROM Open o INNER JOIN Job j on j.JobID = o.JobID WHERE j.PickupTime>=CONVERT(date,GETDATE()-1)"
            },
            {
              "label": "B",
              "text": "SELECT DISTINCT o.SubscriberKey FROM Open o WHERE o.SendDate>=CONVERT(date,GETDATE()-1)"
            },
            {
              "label": "C",
              "text": "SELECT DISTINCT o.SubscriberKey FROM Open o INNER JOIN Job j ON j.JobID = o.JobID WHERE o.OpenDate>=CONVERT(date,GETDATE()-1)"
            },
            {
              "label": "D",
              "text": "SELECT DISTINCT o.SubscriberKey FROM Open o WHERE o.IsUnique=1"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "SELECT DISTINCT o.SubscriberKey FROM Open o INNER JOIN Job j on j.JobID = o.JobID WHERE j.PickupTime>=CONVERT(date,GETDATE()-1)",
          "explanation": "Join _Open to _Job. Filter on j.PickupTime (job start time) to get emails deployed since the previous day start."
        },
        {
          "id": 67,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer wants to use the RaiseError AMPscript function when a subscriber does not have the necessary data to build an email. Which outcome is possible? (S2)",
          "options": [
            {
              "label": "A",
              "text": "The whole send is cancelled"
            },
            {
              "label": "B",
              "text": "The send is retried"
            },
            {
              "label": "C",
              "text": "An error message is sent to the From Address used in the email"
            },
            {
              "label": "D",
              "text": "The subscriber is logged to an error DE"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "The whole send is cancelled",
          "explanation": "RaiseError can skip one subscriber (skipLine=true) or cancel the entire send (skipLine=false). No retry or error email features."
        },
        {
          "id": 91,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer wants to include an AMPscript IIF statement: if subscriber tier is not premier then display heading encouraging them to upgrade. Tier value set as @level. How? (S2 Q27)",
          "options": [
            {
              "label": "A",
              "text": "%%=IIF(@level = 'premier', 'You are a premier member!', 'Upgrade to premier Now!')=%%"
            },
            {
              "label": "B",
              "text": "%%=IF(@level IS 'premier', 'Upgrade to premier now!', 'You are a premier Member!')%%"
            },
            {
              "label": "C",
              "text": "%%=IIF(@level == 'premier', 'You are a premier member!', 'Upgrade to Premier now!')=%%"
            },
            {
              "label": "D",
              "text": "%%=IIF(@level!='premier','Upgrade to premier now!','You are a premier member!')=%%"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "%%=IIF(@level = 'premier', 'You are a premier member!', 'Upgrade to premier Now!')=%%",
          "explanation": "IIF uses = (or ==) for comparison. This version correctly uses = with proper IIF syntax. IF...IS is not valid IIF syntax."
        },
        {
          "id": 100,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer wants to configure performance tracking of the content dynamically created via AMPscript in an email. Which step should be performed? (S2 Q36)",
          "options": [
            {
              "label": "A",
              "text": "Configure a reference content block in Content Builder"
            },
            {
              "label": "B",
              "text": "Add a unique impression identifier in the HTML tags within the generated content"
            },
            {
              "label": "C",
              "text": "Enable impression tracking and utilize AMPscript impression function"
            },
            {
              "label": "D",
              "text": "Use ContentBlockByKey with tracking parameters"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Enable impression tracking and utilize AMPscript impression function",
          "explanation": "Enable impression tracking in the send definition AND use BeginImpressionRegion/EndImpressionRegion AMPscript functions around dynamic content."
        },
        {
          "id": 216,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "NTO wants to determine the best identifier for subscribers across all channels. What should be recommended? (S2 Q152)",
          "options": [
            {
              "label": "A",
              "text": "Subscriber ID"
            },
            {
              "label": "B",
              "text": "Contact Key"
            },
            {
              "label": "C",
              "text": "Email Address"
            },
            {
              "label": "D",
              "text": "Mobile Number"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Contact Key",
          "explanation": "Contact Key is the universal identifier in SFMC that links contacts across all channels, data extensions, and journey activities."
        },
        {
          "id": 268,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "Developer deletes a batch of records in a data extension in Contact Builder. Which scenario would cause subscriber records to REMAIN in the data extension? (S3 Q47)",
          "options": [
            {
              "label": "A",
              "text": "Sendable data extension with SubscriberKey field"
            },
            {
              "label": "B",
              "text": "Non-sendable data extension with SubscriberKey field"
            },
            {
              "label": "C",
              "text": "Contact Delete process does not delete rows from data extensions"
            },
            {
              "label": "D",
              "text": "The suppression period must end first"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Non-sendable data extension with SubscriberKey field",
          "explanation": "Contact Delete removes rows ONLY from Sendable DEs. Non-sendable DEs (reference tables, lookup data) are completely untouched."
        },
        {
          "id": 154,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "What AMPscript logic should be used to determine the background color of each table row (alternating white and red) within a loop? (S2 Q90)",
          "options": [
            {
              "label": "A",
              "text": "IF SUBSTRING(DIVIDE(@numerator,2),1) = 1 THEN SET @color = 'Red' ELSE SET @color = 'White' ENDIF"
            },
            {
              "label": "B",
              "text": "IF @numerator/2 = 1 THEN SET @color = 'Red' ELSE SET @color = 'White' ENDIF"
            },
            {
              "label": "C",
              "text": "IF MOD(@numerator,2) = 1 THEN SET @color = 'Red' ELSE SET @color = 'White' ENDIF"
            },
            {
              "label": "D",
              "text": "IF @numerator MOD 2 = 1 THEN SET @color = 'Red' ELSE SET @color = 'White' ENDIF"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "IF MOD(@numerator,2) = 1 THEN SET @color = 'Red' ELSE SET @color = 'White' ENDIF",
          "explanation": "MOD(@numerator, 2) returns remainder: 1 for odd (Red), 0 for even (White). DIVIDE returns decimals. MOD is the correct arithmetic function for this."
        },
        {
          "id": 192,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Which application utilizes the REST API? (S2 Q128 - alternate)",
          "options": [
            {
              "label": "A",
              "text": "Mobile Connect"
            },
            {
              "label": "B",
              "text": "Automation Studio"
            },
            {
              "label": "C",
              "text": "Classic Content"
            },
            {
              "label": "D",
              "text": "Email Studio"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Mobile Connect",
          "explanation": "Mobile Connect uses the REST API for sending SMS messages. Classic Content, Automation Studio, and Email Studio list operations use SOAP API."
        },
        {
          "id": 235,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "A company needs to retrieve a large number of rows from a data extension via the API. Which solution would optimize the performance? (S3 Q14)",
          "options": [
            {
              "label": "A",
              "text": "Use the AMPscript API functions on a CloudPage"
            },
            {
              "label": "B",
              "text": "Use a SimpleFilterPart to retrieve small sets of relevant data"
            },
            {
              "label": "C",
              "text": "Use the REST API instead of the SOAP API"
            },
            {
              "label": "D",
              "text": "Use the DataExtension SOAP object instead"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Use a SimpleFilterPart to retrieve small sets of relevant data",
          "explanation": "SimpleFilterPart reduces data returned per request, optimizing performance for large DE retrieval. Use ContinueRequest for pagination."
        },
        {
          "id": 281,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer is using the legacy endpoint www.exacttargetapis.com and has been asked to switch to Tenant Specific Endpoints (TSEs). What is a benefit of switching to TSEs? (S3 Q60)",
          "options": [
            {
              "label": "A",
              "text": "Improved API performance"
            },
            {
              "label": "B",
              "text": "API calls will no longer fail"
            },
            {
              "label": "C",
              "text": "A longer lasting OAuth token"
            },
            {
              "label": "D",
              "text": "Rate limits are automatically removed"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Improved API performance",
          "explanation": "TSEs route requests directly to your tenant specific infrastructure, improving performance by bypassing the shared routing layer."
        }
      ]
    },
    {
      "set_number": 20,
      "set_name": "Practice Set 20",
      "question_count": 14,
      "domains_covered": {
        "SQL & Data Views": 1,
        "Security": 1,
        "SSJS": 1,
        "Data Management": 1,
        "Data Modeling": 1,
        "API Integration": 4,
        "AMPscript": 5
      },
      "questions": [
        {
          "id": 6,
          "domain_code": "S",
          "domain": "SQL & Data Views",
          "question": "NTO puts TEST at the start of test email names. Which query returns subscribers sent those emails?",
          "options": [
            {
              "label": "A",
              "text": "SELECT * FROM _Job INNER JOIN _Sent on JobID=JobID WHERE EmailName LIKE 'TEST%'"
            },
            {
              "label": "B",
              "text": "SELECT * FROM _Job J INNER JOIN _Sent S ON J.JobID=S.JobID WHERE J.EmailName LIKE 'TEST%'"
            },
            {
              "label": "C",
              "text": "SELECT * FROM _Job J INNER JOIN _Sent S on J.JobID=S.JobID WHERE J.EmailName='TEST%'"
            },
            {
              "label": "D",
              "text": "SELECT SubscriberKey FROM _Sent WHERE EmailName LIKE 'TEST%'"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "SELECT * FROM _Job J INNER JOIN _Sent S ON J.JobID=S.JobID WHERE J.EmailName LIKE 'TEST%'",
          "explanation": "LIKE for wildcard matching. = 'TEST%' is an exact match. Table aliases required to avoid JOIN ambiguity."
        },
        {
          "id": 107,
          "domain_code": "E",
          "domain": "Security",
          "question": "Developer needs to create a fully-branded CloudPage which includes images hosted in Content Builder. Developer wants to secure the page and its elements using the SSL protocol. What is the minimum number of SSL certificates required? (S2 Q43)",
          "options": [
            {
              "label": "A",
              "text": "One"
            },
            {
              "label": "B",
              "text": "Two"
            },
            {
              "label": "C",
              "text": "Three"
            },
            {
              "label": "D",
              "text": "Four"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Two",
          "explanation": "Content SSL for the CloudPage domain + CDN/Portfolio SSL for images = minimum 2 certificates required."
        },
        {
          "id": 109,
          "domain_code": "J",
          "domain": "SSJS",
          "question": "Developer who is new to Marketing Cloud needs to design a landing page and chooses to use Server-Side JavaScript (SSJS). Which feature can the developer leverage in their Server-Side code? (S2 Q45)",
          "options": [
            {
              "label": "A",
              "text": "Include Try/Catch blocks within the code"
            },
            {
              "label": "B",
              "text": "External Libraries to extend functionality"
            },
            {
              "label": "C",
              "text": "Direct modification of the DOM"
            },
            {
              "label": "D",
              "text": "Access the browser's localStorage"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Include Try/Catch blocks within the code",
          "explanation": "SSJS (ECMAScript 3) runs server-side on SFMC servers. No DOM access. No external libraries. Full Try/Catch support available."
        },
        {
          "id": 156,
          "domain_code": "M",
          "domain": "Data Management",
          "question": "Developer wants to extract tracking data from Marketing Cloud to an FTP site. A marketer created a Data Extract Activity in the user interface. Which option would be available to extract the data? (S2 Q92)",
          "options": [
            {
              "label": "A",
              "text": "REST API"
            },
            {
              "label": "B",
              "text": "Journey Builder"
            },
            {
              "label": "C",
              "text": "Automation Studio"
            },
            {
              "label": "D",
              "text": "Content Builder"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Automation Studio",
          "explanation": "Data Extract Activities are configured and executed through Automation Studio as part of an automation workflow."
        },
        {
          "id": 111,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "Developer deletes a batch of records in a DE in Contact Builder using Contact Delete. Which scenario would cause subscriber records to REMAIN in the data extension? (S2 Q47)",
          "options": [
            {
              "label": "A",
              "text": "Sendable data extension with SubscriberKey field"
            },
            {
              "label": "B",
              "text": "Non-sendable data extension with SubscriberKey field"
            },
            {
              "label": "C",
              "text": "Contact Delete process does not delete rows from data extensions"
            },
            {
              "label": "D",
              "text": "The suppression period must expire first"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Non-sendable data extension with SubscriberKey field",
          "explanation": "Contact Delete removes rows from SENDABLE DEs only. Non-sendable DEs (reference tables, lookup data) are completely untouched."
        },
        {
          "id": 66,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer is making an API REST call to trigger an email Send. How long are Marketing Cloud v2 access tokens valid? (S2)",
          "options": [
            {
              "label": "A",
              "text": "Each API call requires a new access token"
            },
            {
              "label": "B",
              "text": "Access tokens expire after 20 minutes"
            },
            {
              "label": "C",
              "text": "Access tokens expire after 24 hours"
            },
            {
              "label": "D",
              "text": "REST calls do not require an access token"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Access tokens expire after 20 minutes",
          "explanation": "OAuth v2 tokens expire after approximately 20 minutes. Reuse the token until expiry, then request a new one."
        },
        {
          "id": 77,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "NTO is using REST API to send emails to customers after a purchase. Which considerations should be taken regarding the token used in the API Call? (S2)",
          "options": [
            {
              "label": "A",
              "text": "Make a token API call and re-use the token for that subscriber"
            },
            {
              "label": "B",
              "text": "Make a token API call and re-use the token until the token expires"
            },
            {
              "label": "C",
              "text": "Make a token API call before each triggered send API call"
            },
            {
              "label": "D",
              "text": "Use a permanent API key instead"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Make a token API call and re-use the token until the token expires",
          "explanation": "Reuse the token until it expires (~20 min). One token per call hits rate limits and adds latency to every send."
        },
        {
          "id": 92,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer wants to upload a base64-encoded file to Content Builder using an API Installed Package but receives an Insufficient Privileges error. What should be checked? (S2 Q28)",
          "options": [
            {
              "label": "A",
              "text": "Validate client ID and client secret are correct"
            },
            {
              "label": "B",
              "text": "Confirm the Component's Channel options are available"
            },
            {
              "label": "C",
              "text": "Confirm the REST Base URI uses the correct subdomain"
            },
            {
              "label": "D",
              "text": "Check the API rate limit quota"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Confirm the Component's Channel options are available",
          "explanation": "The Installed Package Component must have Content Builder channel access enabled for this upload operation."
        },
        {
          "id": 115,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Which AMPscript function group could most negatively impact send processing? (S2 Q51)",
          "options": [
            {
              "label": "A",
              "text": "Date Time"
            },
            {
              "label": "B",
              "text": "String functions"
            },
            {
              "label": "C",
              "text": "Data extension functions"
            },
            {
              "label": "D",
              "text": "Utility functions"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "Data extension functions",
          "explanation": "Data extension functions execute database queries for EVERY subscriber during the send. String and date functions run in-memory and are fast."
        },
        {
          "id": 141,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "Developer wants to create a JavaScript Web Token using a key from Key Management. Which function? (S2 Q77)",
          "options": [
            {
              "label": "A",
              "text": "ContentBlockByKey()"
            },
            {
              "label": "B",
              "text": "GetJWTByKeyName()"
            },
            {
              "label": "C",
              "text": "RegExMatch()"
            },
            {
              "label": "D",
              "text": "GetJWT()"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "GetJWTByKeyName()",
          "explanation": "GetJWTByKeyName('keyName') creates a JWT using a key stored in SFMC Key Management, identified by the key name."
        },
        {
          "id": 162,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "NTO wants to trigger a receipt email via the SOAP API when a customer makes a purchase. When using AMPscript API functions, which SOAP object is required to successfully create a TriggeredSend object? (S2 Q98)",
          "options": [
            {
              "label": "A",
              "text": "Contact"
            },
            {
              "label": "B",
              "text": "Attribute"
            },
            {
              "label": "C",
              "text": "TriggeredSendDefinition"
            },
            {
              "label": "D",
              "text": "EmailAddress"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "TriggeredSendDefinition",
          "explanation": "TriggeredSend object requires a TriggeredSendDefinition object reference containing the email definition, sender profile, and delivery profile settings."
        },
        {
          "id": 196,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "What is the purpose of the IF statement that checks RowCount(@rows) > 0 and uses Row/Field to display an image, with ELSE displaying a default image? (S2 Q132 first)",
          "options": [
            {
              "label": "A",
              "text": "To handle when there are multiple records in the DE for the subscriber"
            },
            {
              "label": "B",
              "text": "To handle when images are broken"
            },
            {
              "label": "C",
              "text": "To handle when no row is returned by the LookupRows function"
            },
            {
              "label": "D",
              "text": "To validate that the image URL is accessible"
            }
          ],
          "correct_index": 2,
          "correct_answer_label": "C",
          "correct_answer_text": "To handle when no row is returned by the LookupRows function",
          "explanation": "RowCount(@rows) > 0 checks if LookupRows returned any results. ELSE branch ensures a default image renders when no matching rows exist."
        },
        {
          "id": 224,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "A field value returned from a data extension lookup contains a tab-delimited list of values. Which AMPscript function could easily determine if a specific text string exists anywhere in the list? (S3 Q3)",
          "options": [
            {
              "label": "A",
              "text": "BuildRowSetFromString"
            },
            {
              "label": "B",
              "text": "IndexOf"
            },
            {
              "label": "C",
              "text": "Substring"
            },
            {
              "label": "D",
              "text": "Contains"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "IndexOf",
          "explanation": "IndexOf(string, searchString) returns position (0 if not found), directly determining existence without iteration."
        },
        {
          "id": 260,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "A sendable DE with a text field named Balance contains the value '$6.96' for a particular record. An IF statement compares Balance > 6.00. Why would this IF statement yield unintended results? (S3 Q39)",
          "options": [
            {
              "label": "A",
              "text": "Double quotes should be used instead of single quotes"
            },
            {
              "label": "B",
              "text": "The operands are not the same data type"
            },
            {
              "label": "C",
              "text": "The comparison should use the < operator"
            },
            {
              "label": "D",
              "text": "AMPscript cannot compare text fields"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "The operands are not the same data type",
          "explanation": "Balance is TEXT ('$6.96') and 6.00 is a numeric value. Comparing different data types gives unpredictable results in AMPscript."
        }
      ]
    },
    {
      "set_number": 21,
      "set_name": "Multi-Select Questions",
      "question_count": 6,
      "multi_select": true,
      "description": "Select ALL correct answers before submitting. These questions require 2 or 3 correct selections.",
      "domains_covered": {
        "API Integration": 2,
        "Data Modeling": 2,
        "AMPscript": 1,
        "Security": 1
      },
      "questions": [
        {
          "id": 133,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Developer uses REST API to write to a DE every 5 minutes but data loss occurs. (Choose 3) Best practices apply? (S2 Q69)",
          "options": [
            {
              "label": "A",
              "text": "Use Username and Password authentication instead of OAuth"
            },
            {
              "label": "B",
              "text": "On Not Authorized errors request a new Access Token and attempt the call again"
            },
            {
              "label": "C",
              "text": "On Server errors request a new Access Token before each request"
            },
            {
              "label": "D",
              "text": "On Server errors ensure the Server is available and attempt the call again"
            },
            {
              "label": "E",
              "text": "Store the expiry of the access token to ensure a new token is requested if the old one is invalid"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "On Not Authorized errors request a new Access Token and attempt the call again",
          "explanation": "On 401 Unauthorized: refresh the OAuth token and retry (B). On 5xx Server errors: confirm server is available and retry (D) — do NOT get a new token. Always store token expiry to proactively manage the lifecycle (E). Username/Password auth (A) is wrong — OAuth is correct. Getting a new token on every server error (C) is wasteful and incorrect.",
          "multi_select": true,
          "choose": 3,
          "correct_labels": [
            "B",
            "D",
            "E"
          ],
          "correct_indices": [
            1,
            3,
            4
          ]
        },
        {
          "id": 132,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "A marketer is planning a weekly promotional send. (Choose 2) Which two types of data extensions can be sent to? (S2 Q68)",
          "options": [
            {
              "label": "A",
              "text": "Synchronized Data Extension"
            },
            {
              "label": "B",
              "text": "Sendable Data Extension"
            },
            {
              "label": "C",
              "text": "Salesforce Data Extension"
            },
            {
              "label": "D",
              "text": "Send Log Data Extension"
            }
          ],
          "correct_index": 1,
          "correct_answer_label": "B",
          "correct_answer_text": "Sendable Data Extension",
          "explanation": "Sendable DEs (B) and Salesforce Data Extensions (C) can both be used as email send targets. Synchronized DEs (A) are read-only CRM mirrors — cannot send to them directly. Send Log DEs (D) are write-only tracking logs — not send targets.",
          "multi_select": true,
          "choose": 2,
          "correct_labels": [
            "B",
            "C"
          ],
          "correct_indices": [
            1,
            2
          ]
        },
        {
          "id": 134,
          "domain_code": "A",
          "domain": "AMPscript",
          "question": "(Choose 2) Which two AMPscript HTTP functions allow an OAuth token to be passed in a header? (S2 Q70)",
          "options": [
            {
              "label": "A",
              "text": "HTTPPost2"
            },
            {
              "label": "B",
              "text": "HTTPPost"
            },
            {
              "label": "C",
              "text": "HTTPGet"
            },
            {
              "label": "D",
              "text": "HTTPGet2"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "HTTPPost2",
          "explanation": "HTTPPost2 (A) supports custom headers via headerName/headerValue parameters — allowing Authorization: Bearer token. HTTPGet (C) also accepts header parameters. HTTPPost (B) is basic with no custom header support. HTTPGet2 (D) does not exist in AMPscript.",
          "multi_select": true,
          "choose": 2,
          "correct_labels": [
            "A",
            "C"
          ],
          "correct_indices": [
            0,
            2
          ]
        },
        {
          "id": 130,
          "domain_code": "P",
          "domain": "API Integration",
          "question": "Company needs to retrieve a large number of rows from a DE via the API. (Choose 2) Which two solutions optimize performance? (S2 Q66)",
          "options": [
            {
              "label": "A",
              "text": "Use the ContinueRequest feature"
            },
            {
              "label": "B",
              "text": "Use a SimpleFilterPart to retrieve small sets of relevant data"
            },
            {
              "label": "C",
              "text": "Use the AMPscript API functions on a CloudPage"
            },
            {
              "label": "D",
              "text": "Use the REST API instead of the SOAP API"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Use the ContinueRequest feature",
          "explanation": "ContinueRequest (A) enables pagination through large SOAP result sets. SimpleFilterPart (B) reduces data returned per request by applying search criteria. Together they are the two optimizations for large DE retrieval via SOAP API. AMPscript on a CloudPage (C) is not an API optimization. Switching to REST (D) does not solve the large-volume problem.",
          "multi_select": true,
          "choose": 2,
          "correct_labels": [
            "A",
            "B"
          ],
          "correct_indices": [
            0,
            1
          ]
        },
        {
          "id": 148,
          "domain_code": "E",
          "domain": "Security",
          "question": "(Choose 2) Which two file encryption options are supported when importing data files to Marketing Cloud? (S2 Q84)",
          "options": [
            {
              "label": "A",
              "text": "PGP encryption"
            },
            {
              "label": "B",
              "text": "RSA encryption"
            },
            {
              "label": "C",
              "text": "GPG encryption"
            },
            {
              "label": "D",
              "text": "AES encryption"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "PGP encryption",
          "explanation": "PGP (A) and GPG (C) are the two supported file-level encryption formats for SFMC import/export. RSA (B) is an algorithm but not a supported import file format. AES (D) is used internally by SFMC for FLE but is not a supported import file format.",
          "multi_select": true,
          "choose": 2,
          "correct_labels": [
            "A",
            "C"
          ],
          "correct_indices": [
            0,
            2
          ]
        },
        {
          "id": 146,
          "domain_code": "D",
          "domain": "Data Modeling",
          "question": "(Choose 3) Which three factors should be considered when preparing data to be used in Contact Builder? (S2 Q82)",
          "options": [
            {
              "label": "A",
              "text": "Verifying data addresses marketing needs"
            },
            {
              "label": "B",
              "text": "Verifying each DE has the required Email Address field populated"
            },
            {
              "label": "C",
              "text": "Verifying all DEs have a sendable value"
            },
            {
              "label": "D",
              "text": "Assigning data relationships and primary keys across all channels"
            },
            {
              "label": "E",
              "text": "Normalizing data to reduce redundancy"
            }
          ],
          "correct_index": 0,
          "correct_answer_label": "A",
          "correct_answer_text": "Verifying data addresses marketing needs",
          "explanation": "The three key Contact Builder data preparation factors: data must address marketing needs (A), proper data relationships and primary keys must be defined across all channels (D), and data should be normalized to reduce redundancy (E). Option B (Email Address field) only applies to sendable DEs. Option C (sendable value) is a send requirement, not a data model requirement.",
          "multi_select": true,
          "choose": 3,
          "correct_labels": [
            "A",
            "D",
            "E"
          ],
          "correct_indices": [
            0,
            3,
            4
          ]
        }
      ]
    }
  ]
}