Triggering a Notification 24 hours before an expense BOT runs

In the app users have expenses that trigger an the same day each month that the row was initially added by the user

I am trying to add a notification to user of an automatic expense new row 24hrs in advance

I use a virtual column in the expense table called “Day of Month To Trigger BOT” it has an app formula expression DAY([DATE])

The BOT that triggers the Notification has a condition

[Day of Month to trigger Bot]=DAY(TODAY()-24)

The BOT works when I test it and it triggers the notification But not automatically, Im not seeing the issue as that is the same expression for the condition that initially triggers the expense on specific days

Hi Jack,

Please try an expression of

[Day of Month to trigger Bot]=DAY(TODAY())+1

Explanation: DAY([Date]) gives the date part in number. So for example if the date is 06/26/2021 ( mm/dd/yyyy) , the column [Day of Month to trigger Bot] containing DAY([Date]) will return 26

Now, today is 06/25/2026 which means DAY(TODAY()) will return 25 and DAY(TODAY())+1 will return 26. So a daily bot will fire every month on the date of 25 for the record having a date of 06/26/2021 in the [Date] column

Two separate things are going on here, and the second one is the actual reason it works on manual test but not on schedule.

**1. The date math is off.** `TODAY()-24` subtracts **24 days**, not 24 hours (date arithmetic in AppSheet is in days), so `DAY(TODAY()-24)` is meaningless for “one day ahead.” @Suvrutt’s `DAY(TODAY())+1` fixes the intent, but it breaks at month boundaries: on the 31st it returns 32 (matches nothing), and it won’t fire the day-before for the 1st of next month. The robust way is to compare against tomorrow’s actual day-of-month rather than doing arithmetic on the number:

```

[Day of Month to trigger Bot] = DAY(TODAY() + 1)

```

`TODAY() + 1` is a real date (tomorrow), and `DAY()` of it correctly rolls over — on Jan 31 it gives 1 (Feb 1), end of month gives 1, etc. That alone is more correct than `DAY(TODAY())+1`.

**2. The real bug: your condition references a *virtual column*.** This is almost certainly why it fires on manual test but not on the schedule. A scheduled bot does **not** sync/recompute virtual columns the way an interactive session does — when the scheduler runs, `[Day of Month to trigger Bot]` (an app-formula virtual column = `DAY([DATE])`) may be stale or unevaluated, so the condition silently fails to match. Manual testing recomputes it, which is why it looks like it works.

Fix: don’t reference the virtual column in the scheduled bot’s condition. Inline the real expression against the physical date column instead:

```

DAY([DATE]) = DAY(TODAY() + 1)

```

That uses only the physical `[DATE]` column, which is always available to the scheduler. (Even better long-term: make “Day of Month” a *physical* column populated by an initial-value/app-formula and stored, so it’s reliably present for scheduled runs.)

**Also check the scheduler itself:** confirm the bot’s event is a **Scheduled** trigger set to run **daily** (not “For each row in a table” unless that’s intended), that the schedule is **enabled**, and that the app has been **deployed** — scheduled bots only run reliably on deployed apps, not in the editor/preview. A daily scheduled bot + the physical-column condition above should fire the 24-hour-ahead notification automatically.

That is a very good explanation

[Day of Month to trigger Bot]=DAY(TODAY())-1

for the Notification works automatically to trigger the Notification that an expense will run the next day successfully.

See below that the Monthly expense triggered on Day 22

the Notification triggered on Day 21