This is a bit tricky because the start of the program is easy to detect (the firmware checks each program to see if the current time matches any program start time), but the end of the program is not being tracked. Several programs can run at the same time, and you can also manually run a zone (that counts as a program as well called Manual Program). As the result, the only thing we can detect is when the program queue goes from non-empty to empty, which indicates the firmware went from being busy to idle. There are solutions to track the completion of a program but I am not sure if it’s worth the effort to add additional code to do so.
One possible work-around is to create a dummy zone (a zone that’s not physically connected) as an indicator. Let’s say if you have a total 10 zones, you can use the 11th zone as a dummy zone. Schedule that zone in a program for something like 5 seconds. That zone will be the last zone to run, so when it runs, (assuming you have the ‘Station Run’ event enabled in IFTTT), you will receive a notification signaling the end of the program. The downside of this approach is that you will receive notification for every station run, which you may or may not want, since you really only care about notification of the last (dummy) zone.