0

I have an automation with several activities across 7 steps. This automation is used to update subscriber statuses in our publication lists. We use a vendor for enterprise preferences which syncs with our preferences in Marketing Cloud. The error occurs when there's no update to one of the publication lists.

Example

The automation has the following: query, extract, transfer and import to Newsletters, Products, Events, and Surveys. If the Events file transfer doesn't contain any records, the import fails, causing the rest of the automation to stop. I'd like to use the Verification activity to skip any imports that will fail but finish those that contain records.

My workaround is to build an automation for each of the publication lists, seems like unnecessary load on the system, and we're billed per automation.

  • When you say the file transfer doesn't contain any records do you mean the file doesn't exist on the FTP or the file is there but it is empty? If there is an empty file but has the DE headers it shouldn't error on import, it will just say 0 Records imported and you can use the verification on the destination DE – Finan Nazazi Mar 5 at 10:59
  • @Finan - This is not true by default - you would need SFMC to 'turn on' the option to allow empty imports. By default import activities in SFMC will fail or error if the file is empty. – Gortonington Mar 5 at 14:10
  • Finan - The file does exist on the FTP, but it is empty causing the import to fail and ultimately stopping the remaining imports from running. Gortonington - Good to know this is an option, thank you both! – Kyle Szabo Mar 5 at 16:55
1

There is no 'skip a step' built in option in SFMC.

You could have SFMC 'turn on' the option to allow empty imports without error, but that comes along with its own risks. It also won't solve if you have any other activities that would need to be skipped outside import activity.

Other then that, you would would likely need to create multiple file drop automations (one for each file) where the first step is your validation step, so that it will only stop that single import, not all the following ones as well.

If your automation is taking data from one place in SFMC (perhaps filled by API) and then pushing this data into other Data Extensions, I would instead handle this via Query where possible. If it is going from DE to list, then you would need to be 'creative' to handle empty imports.

This would require a Script Activity. The SA would contain SSJS that would verify there is data inside the DE you are exporting. If empty, do nothing. If rowcount > 0 then run API to begin import.

Below is a sample SOAP envelope of the call to run an import definition: (taken from documentation)

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
   <soap:Header>
      <wsa:Action>Perform</wsa:Action>
      <wsa:MessageID>urn:uuid:30ffce73-2bdc-422a-b3da-1e71e3f15270</wsa:MessageID>
      <wsa:ReplyTo>
         <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
      </wsa:ReplyTo>
      <wsa:To>https://YOUR_SUBDOMAIN.soap.marketingcloudapis.com/Service.asmx</wsa:To>
      <wsse:Security soap:mustUnderstand="1">
         <wsse:UsernameToken wsu:Id="SecurityToken-4c1eed3b-75ee-4d19-8712-731028aaad77">
            <wsse:Username>USERNAME</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
            <wsse:Nonce>R2f0uhYWm7whOu2Bjg7lvQ==</wsse:Nonce>
            <wsu:Created>2008-09-17T20:58:36Z</wsu:Created>
         </wsse:UsernameToken>
      </wsse:Security>
   </soap:Header>
   <soap:Body>
      <PerformRequestMsg xmlns="http://exacttarget.com/wsdl/partnerAPI">
         <Action>start</Action>
         <Definitions>
            <Definition xsi:type="ImportDefinition">
               <ObjectID xsi:nil="true"/>
               <CustomerKey>2043</CustomerKey>
            </Definition>
         </Definitions>
      </PerformRequestMsg>
   </soap:Body>
</soap:Envelope>

Which you could run via SSJS API functions, or (my recommendation) via WSProxy

Sample WSProxy: (This is sample only, so may need to make some changes - most likely in the props var)

var prox = new Script.Util.WSProxy();
var action = "Start";
var props = {
  Definition: {
    CustomerKey: 2043
  }
};
var opts = {};
var data = prox.performItem("ImportDefinition", props, action, opts);
  • @Gortonigton - Thank you for this detailed answer. I like this idea a lot, although I don't have any experience with API's, I will definitely explore this as an option and report back with the results. For an immediate fix, I used union to add an email address into each of the active and unsubscribed data extensions to ensure at least 1 record will always exist. The last two steps in the automation are the import activities, active then unsubscribed. The 'utility' email address added will always be unsubscribed. – Kyle Szabo Mar 5 at 21:10

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.