Yes you are correct, File Transfer activity does not trigger a file drop automation. This is because the file is not being dropped (defined as being added to the FTP from an outside source) but is instead being transferred (moved around internally on the FTP).
What I would do in your situation is either combine the two automations into a single one, or add a step to the end of your first automation that triggers your second automation.
- Combine the two automations - Basically after you run the File Transfer activity I would then add the import from your second Automation and any other activities.
- Insert a script to trigger your second automation - Using a Script Activity I would use SSJS to make a SOAP API call to start your second automation (I believe you will need to change it from File Drop to Scheduled, but don't actually need to set a schedule).
Example SOAP call to start an automation:
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<PerformRequestMsg xmlns="http://exacttarget.com/wsdl/partnerAPI">
<Action>start</Action>
<Definitions>
<Definition xsi:type="Automation">
<ObjectID>29fa9fff-774a-458d-a1f4-c50f99587664</ObjectID>
</Definition>
</Definitions>
</PerformRequestMsg>
</s:Body>
and here is a great sample of the full SSJS script from @AdamSpriggs blog:
<script runat="server">
Platform.Load("Core","1.1.1");
var automationCustomerKey = "CUSTOMERKEY-OF-AUTOMATION"
var rr = Platform.Function.CreateObject("RetrieveRequest");
Platform.Function.SetObjectProperty(rr, "ObjectType", "Automation");
Platform.Function.AddObjectArrayItem(rr, "Properties", "ProgramID");
Platform.Function.AddObjectArrayItem(rr, "Properties", "CustomerKey");
Platform.Function.AddObjectArrayItem(rr, "Properties", "Status");
var sfp = Platform.Function.CreateObject("SimpleFilterPart");
Platform.Function.SetObjectProperty(sfp, "Property", "CustomerKey");
Platform.Function.SetObjectProperty(sfp, "SimpleOperator", "equals");
Platform.Function.AddObjectArrayItem(sfp, "Value", automationCustomerKey);
Platform.Function.SetObjectProperty(rr, "Filter", sfp);
var retrieveStatus = [0,0,0];
var automationResultSet = Platform.Function.InvokeRetrieve(rr, retrieveStatus);
var ObjectID = automationResultSet[0]["ObjectID"];
var Status = automationResultSet[0]["Status"];
if (ObjectID != "null") {
/*
Code Status
-1 Error
0 BuildingError
1 Building
2 Ready
3 Running
4 Paused
5 Stopped
6 Scheduled
7 Awaiting Trigger
8 InactiveTrigger
*/
if (Status == 2) {
var obj = Platform.Function.CreateObject("Automation");
Platform.Function.SetObjectProperty(obj, "ObjectID", ObjectID);
var po = Platform.Function.CreateObject("PerformOptions");
var performResult = [0,0,0];
var performStatus = Platform.Function.InvokePerform(obj, "start", performResult, po);
} else {
// already running
}
} else {
// automation not found
}
</script>
Best Answer
Short answer, it is not possible. The listener for this is only viable on SFMC Import folder and those subdirectories below it.
Now, it is possible to 'fake' this, but it requires your 3rd party system to drop the main file on your external FTP and then drop an empty or small file to SFMC SFTP folder when that file is finished being uploaded.
To elaborate:
Another option if your system can send API calls is to:
Have a 'scheduled' automation set up with the import activity but do not schedule it.
You then have your external system shoot over an Automation Studio API call to start the automation once the file has finished uploading to the FTP.
Both of these are a bit much and require a good amount of extra work. Unless it is necessary to store this file elsewhere, I would adjust the process to drop it to SFMC instead.