Im getting a 500 - error on my code and can't figure out whats causing it. Im trying to build a custom preference center (cloud page) that updates corresponding contact point consent records in salesforce. The first record is updating, but then the error throws. Ive looked at the payload and am trying to log to a DE with errors but it looks like the loop is terminating before the second iteration. Full code below:
%%[ /* Retrieve subscriberKey and consent information */ SET @subscriberKey = RequestParameter("subscriberKey") IF NOT EMPTY(@subscriberKey) THEN OUTPUT(CONCAT("<p>Subscriber Key: ", @subscriberKey, "</p>")) /* Retrieve the Contact details */ SET @row = RetrieveSalesforceObjects("Contact", "Email, FirstName, IndividualId", "Id", "=", @subscriberKey) IF ROWCOUNT(@row) > 0 THEN SET @firstName = FIELD(ROW(@row, 1), "FirstName") SET @IndividualId = FIELD(ROW(@row, 1), "IndividualId") OUTPUT(CONCAT("<p>Individual ID: ", @IndividualId, "</p>")) ELSE OUTPUT("<p>No Contact records found.</p>") ENDIF /* Retrieve Contact Point Email records */ SET @row2 = RetrieveSalesforceObjects("ContactPointEmail", "ID", "ParentId", "=", @IndividualId, "IsPrimary", "=", "true") IF ROWCOUNT(@row2) > 0 THEN SET @contactPointEmailId = FIELD(ROW(@row2, 1), "ID") OUTPUT(CONCAT("<p>Contact Point Email ID: ", @contactPointEmailId, "</p>")) /* Retrieve Consent Records */ SET @row3 = RetrieveSalesforceObjects("ContactPointConsent", "ID, PrivacyConsentStatus, DataUsePurposeID", "ContactPointId", "=", @contactPointEmailId) OUTPUT(CONCAT("<p>Number of Consent Records Retrieved: ", ROWCOUNT(@row3), "</p>")) ELSE OUTPUT("<p>No Contact Point Email records found.</p>") ENDIF ELSE OUTPUT("<p>Subscriber Key is empty.</p>") ENDIF ]%%<!-- Dynamic Greeting --><h2> %%=v(@firstName)=%%, view and update your preferences below: </h2><!-- Start the form --><form id="myform" action="%%=RequestParameter('PAGEURL')=%%" method="post"><input type="hidden" name="submitted" value="true" /><input type="hidden" name="subscriberKey" value="%%=v(@subscriberKey)=%%" /><input type="hidden" name="contactPointEmailId" value="%%=v(@contactPointEmailId)=%%" /><!-- Consent Management Records --> %%[ IF ROWCOUNT(@row3) > 0 THEN FOR @i = 1 TO ROWCOUNT(@row3) DO SET @privacyConsentStatus = FIELD(ROW(@row3, @i), "PrivacyConsentStatus") SET @dataUsePurposeID = FIELD(ROW(@row3, @i), "DataUsePurposeID") SET @consentID = FIELD(ROW(@row3, @i), "ID") /* Retrieve Data Use Purpose details */ SET @row4 = RetrieveSalesforceObjects("DataUsePurpose", "Name, Description", "Id", "=", @dataUsePurposeID) IF ROWCOUNT(@row4) > 0 THEN SET @consentName = FIELD(ROW(@row4, 1), "Name") SET @description = FIELD(ROW(@row4, 1), "Description") OUTPUT(CONCAT("<p>Iteration ", @i, " - Consent ID: ", @consentID, " - PrivacyConsentStatus: ", @privacyConsentStatus, "</p>")) ]%%<div class="form-group checkbox-label"><label class="custom-checkbox"><input type="checkbox" name="status_%%=v(@i)=%%" value="OptIn" %%[IF @privacyConsentStatus == "OptIn" THEN]%% checked %%[ENDIF]%% /><span class="checkmark"></span></label><div class="checkbox-content"><span style="font-size: 18px; font-weight: bold;">%%=v(@consentName)=%%</span><p style="font-size: 14px; color: #555;">%%=v(@description)=%%</p></div></div> %%[ ENDIF NEXT @i ELSE OUTPUT("<p>No consent records found.</p>") ENDIF ]%%<!-- Submit Button --><div class="form-group" style="text-align: center;"><input type="submit" value="Update Preferences" /></div></form> %%[ IF RequestParameter("submitted") == "true" THEN SET @rowCount = ROWCOUNT(@row3) SET @logDE = "ConsentUpdateLogs" FOR @i = 1 TO @rowCount DO SET @consentID = FIELD(ROW(@row3, @i), "ID") SET @iterationNumber = @i SET @errorMessage = "No error" SET @updateStatus = "Not executed" /* Additional logging for debugging */ SET @privacyConsentStatus = FIELD(ROW(@row3, @i), "PrivacyConsentStatus") SET @dataUsePurposeID = FIELD(ROW(@row3, @i), "DataUsePurposeID") OUTPUT(CONCAT("<p>Iteration ", @iterationNumber, " - Retrieved PrivacyConsentStatus: ", @privacyConsentStatus, ", DataUsePurposeID: ", @dataUsePurposeID, "</p>")) IF NOT EMPTY(@consentID) THEN SET @checkboxValue = RequestParameter(CONCAT("status_", @i)) /* Log before update */ SET @logStatusBefore = UpsertDE(@logDE, 1, "IterationNumber", @iterationNumber,"ConsentID", @consentID,"CheckboxValue", @checkboxValue,"UpdateStatus", "Before Update" ) IF NOT EMPTY(@checkboxValue) THEN TRY IF @checkboxValue == "OptIn" THEN SET @updateStatus = UpdateSingleSalesforceObject("ContactPointConsent", @consentID, "PrivacyConsentStatus", "OptIn") ELSE SET @updateStatus = UpdateSingleSalesforceObject("ContactPointConsent", @consentID, "PrivacyConsentStatus", "OptOut") ENDIF IF EMPTY(@updateStatus) OR @updateStatus == "false" THEN SET @errorMessage = "Update failed or returned an empty response." SET @updateStatus = "false" ELSE SET @updateStatus = "Success" ENDIF CATCH @caughtError SET @updateStatus = "false" SET @errorMessage = CONCAT("Caught Error during update of Consent ID: ", @consentID, ". Error: ", @caughtError) ENDTRY ELSE SET @updateStatus = "false" SET @errorMessage = CONCAT("Checkbox value is empty for iteration: ", @iterationNumber) ENDIF /* Log the result of the update */ SET @logStatusAfter = UpsertDE(@logDE, 1, "IterationNumber", @iterationNumber,"ConsentID", @consentID,"UpdateStatus", @updateStatus,"CheckboxValue", @checkboxValue,"ErrorMessage", @errorMessage ) /* Output to page for debugging */ OUTPUT(CONCAT("<p>Iteration ", @iterationNumber, " - Consent ID: ", @consentID, " - Status: ", @updateStatus, " - Error: ", @errorMessage, "</p>")) ELSE /* Log if ConsentID is empty */ SET @errorMessage = CONCAT("Consent ID is empty for iteration: ", @i) SET @logStatusEmpty = UpsertDE(@logDE, 1, "IterationNumber", @i,"ConsentID", "N/A","UpdateStatus", "false","CheckboxValue", "N/A","ErrorMessage", @errorMessage ) OUTPUT(CONCAT("<p>", @errorMessage, "</p>")) ENDIF /* Log each iteration completion */ OUTPUT(CONCAT("<p>Completed iteration ", @i, "</p>")) NEXT @i ENDIF ]%%