save_post only saves meta data on second save

Did you try removing the IF statements and use save_post hook instead of save_post_listing to see if an IF statement is blocking the wp_set_post_terms?

Also try wp_set_object_terms instead of wp_set_post_terms.

Furthermore, if you can make sure it has to do with the
if(get_post_meta($post_id, 'wpcf-proprty_online', true) == 'y') statement, then this post_meta has not been updated before you are execusting this function. So why not update it within this function to make sure the value == ‘n’ or ‘y’.

update_post_meta( $post_id, 'wpcf-proprty_online', $_POST['the_name_of_yr_field'] );