How to have a Zap delay during non-business hours

How to have a Zap delay during non-business hours
Userlevel 5

Hi there, this is Erin Oz from the Zapier Support Team with a workflow idea to share. 

A common workflow I see is users wanting to add a delay step and run on the following weekday. Date/time fields in Zapier can use relative information (like “Friday at 7pm”), but they’re not able to interpret this type of input: 


(view larger)


This user would like to add a Delay Until step that will delay their Zap actions until the next weekday. One way would be to use Paths that filter on specific outcomes, but that might get tedious, since they’ll have to build a separate Path for the same set of actions. 

Using a Formatter Step and a Lookup Table will give us the following weekday, which we can then pull into the Delay Until step!   

1. Create a Formatter step using the Date/Time Event and select “Format” from the Transform dropdown:


(view larger)

Type {{zap_meta_human_now}} into the Input value. The {{zap_meta_human_now}} inserts the current date into the Input.

You should see this pill pop up after typing the value:


(view larger)


In the “To Format” field, you’ll want to type “ddd” as a custom format. This will output a three-letter abbreviation for the day of the week! 


(view larger)

2. Next, create a Formatter by Zapier step, select "Utilities", and select "Lookup Table" as the Transform value.

Map the output of the previous Formatter step as the Lookup Key:


(view larger)


In the Lookup Table, type the three-letter abbreviation for days of the week on the left hand side as the keys, and for the values type the following business day - for example, next to the key Mon, I've typed the value Tuesday. That way, when the Zap runs on a Monday, it will return the day "Tuesday" to add to your Delay Until step. 

For Friday and Saturday, I’ve added the value Monday, as Monday is the next weekday following those days. (I've also added a fallback value of Monday in case there is an issue when the Zap runs.)

When testing this step, you should see the following business day - in this case, since our Formatter step returned initially Tue, our Formatter step test returns Wednesday:



(view larger)


3. Now we can map that output of the Formatter step into the Date/Time Delayed Until field of our Delay step with "at 8am" typed after the mapped data, like this:



(view larger)

This way, each time the Zap runs, the steps following the Delay Until step will be delayed until the following weekday. 

​Does this make sense? Please let me know if you have any questions or need additional clarity on any of these steps. :sunglasses:


11 replies

Userlevel 1

Hi @erinoz - great post! Going through your instructions and stuck on this step:

“In the “To Format” field, you’ll want to type “ddd” as a custom format. This will output a three-letter abbreviation for the day of the week! “

Here’s what I’m seeing.

Looks like there’s no way to just display the day without the timestamp? Could you share what I’m entering wrong here? Thanks!


Userlevel 7
Badge +11

Hi @darynakulya!

You’re SUPER close :)

You’ll want to click on the part that’s highlighted in this image:

click custom then you can type “ddd”

Can you give that a shot to see if it helps you out?

Userlevel 1


I would say that the interface makes this step not completely intuitive. You have to click “Custom” which then produces a dropdown menu. Logically, I would think my input needs to go into the new search box that appeared and be given the opportunity to just add whatever format I typed if it wasn’t one of the prescribed options.

But, that’s not how it works. You have to click back above the “Custom” tab back into the original text box to type “ddd” and then click away.

Perhaps a solution to this is adding another tab for “manual” inputs or when a user types a non-suggested option into the search box, give them the option to add it.

For example: [ 🔍   ddd (add) ]


That might not have been their issue, but I did find that to be a hurdle at first wondering why it wouldn’t take my format.





Userlevel 5

Thanks for pointing that out @darynakulya and @desmoe  - I’ve added a gif that will hopefully help make entering the “ddd” piece more clear! 

Userlevel 1


Thank you for this write up. It is great!

Question - Wouldn't we want the fallback value for the lookup table to be Monday instead of Mon as we need to pass the full weekday name to the delay step? 

Userlevel 5

 Excellent catch @mweiner - you’re correct! I will update the screenshot with the full “Monday” value instead of “Mon”. 


Question - Wouldn't we want the fallback value for the lookup table to be Monday instead of Mon as we need to pass the full weekday name to the delay step? 



Userlevel 4
Badge +1

Ah, I love this post! If you are looking for a more granular approach to when a delay should happen during business hours, I wrote up a post about this here:



Hope that helps 🙂

Userlevel 7
Badge +9

This is cool! I created something like this at my old company because people don’t like working on the weekend I guess ...Madness!

Userlevel 1

Great post! Quick question.. if there is not fallback value, and a match does not occur, will the zap continue? I want my zap to trigger only on Weekdays, not delay until the next business day. So if my lookup table only contains:

Sun - Monday

Sat - Monday

Will this still work or is there a step I’m missing? 

Userlevel 1

What im testing now. Using only two step I can set up hours, days of the week, holidays and timezone.

from datetime import datetime, timedelta, date, time

#Timezone configuration

#business_hours configuration
business_hours = {
# monday = 0, tuesday = 1, ...
"weekdays": [0, 1, 2, 3, 4],
"from": time(hour=9),
"to": time(hour=17)

#holidays configuration (year, months, day)
#Exemples holidays = [date(2022, 12, 25), date(2022, 12, 24)]
holidays = []

def is_in_open_hours(dt):
return dt.weekday() in business_hours["weekdays"] \
and not in holidays \
and business_hours["from"].hour <= dt.time().hour < business_hours["to"].hour

def get_next_open_datetime(dt):
while True:
dt = dt + timedelta(days=1)
if dt.weekday() in business_hours["weekdays"] and not in holidays:
dt = datetime.combine(, business_hours["from"])
return dt

def delay_time (dt):
if is_in_open_hours(dt):
return (dt)
return get_next_open_datetime(dt)

dt_test =
delay_time_var = str(delay_time (dt_test))
#dt_test = datetime(2022, 10, 7, 20)
#dt_test =

return {
'delay_time_var': delay_time_var




hi @erinoz It seems you can input e.g. Wednesday at 8am into the delay until field.. Is it possible to get an overview of the type of inputs it will understand. 

I want to build a Weekdays after 5 pm but before 8 am and Weekends 24/7