Event Countdown Pro

Other

Set up a daily countdown reminder for a stock's next price-moving corporate event — earnings releases, AGMs, product launches, investor days, dividend dates, FDA decisions, or any event likely to impact the stock price. Resolves company name to ticker, discovers the next significant event from yfinance and web search, and creates a daily cron reminder via remind-me that runs stock-price-checker-pro and stock-fundamentals every day starting 1–2 weeks before the event. Triggers: earnings reminder, earnings countdown, AGM reminder, AGM countdown, event countdown, corporate event reminder, product launch countdown, investor day reminder, notify me before earnings, remind me about earnings, earnings alert.

Install

openclaw skills install event-countdown-pro

Skill: Event Countdown

When to use

  • User wants a daily reminder leading up to a company's next price-moving event.
  • User says "set up a countdown for NVIDIA".
  • User says "notify me 1 week before Apple's next event every day at 10 AM".
  • User says "remind me daily before Tesla's financial release".
  • User says "set up an AGM countdown for Shell".
  • User says "notify me before Microsoft's product launch".
  • User wants to track an upcoming corporate event with daily price + fundamentals updates.

When NOT to use

  • User just wants the current stock price → use stock-price-checker-pro
  • User just wants fundamentals → use stock-fundamentals
  • User wants a generic reminder (not event-related) → use remind-me
  • User wants a full research report right now → use equity-research
  • User wants to check the earnings date without scheduling → use stock-price-checker-pro

Overview

This skill discovers the next price-moving corporate event for a stock and creates a daily countdown to it. It scans two data sources in priority order:

PrioritySourceDataExamples
1yfinance (Python script)Earnings dates, dividend dates2026-07-30 (AAPL earnings)
2Web search (agent)AGMs, product launches, investor days, FDA decisions, splits, M&A votes — any event likely to move the stock price2026-06-10 (NVIDIA GTC)

Once the event is found and confirmed, a daily cron fires at the specified time, running stock-price-checker-pro + stock-fundamentals every day leading up to the event.


Conversation Flow

Step 1 — Resolve the company name to a ticker

Map the user's company name to its ticker symbol. Use the same approach as stock-price-checker-pro: the LLM agent resolves common company names to their Yahoo Finance tickers.

CompanyTicker
NVIDIANVDA
AppleAAPL
TeslaTSLA
MicrosoftMSFT
AmazonAMZN
Google / AlphabetGOOGL
Meta / FacebookMETA
PfizerPFE
RheinmetallRHM.DE
SAPSAP.DE
ASMLASML.AS
ShellSHEL.L

If unsure, ask: "Just to confirm — that's the ticker <TICKER>, right?"

Step 2 — Collect lead time and notification time

Ask the user two questions. Apply defaults if they do not specify.

QuestionDefaultOptions
How many weeks before the event?1 week (7 days)1 or 2 weeks
At what time? (with timezone)10 AM CET (Europe/Paris)Any time in any timezone

Examples of user input and how to parse it:

  • "1 week, 9 AM New York time" → lead_days=7, hour=9, minute=0, tz=America/New_York
  • "2 weeks, 8 AM London" → lead_days=14, hour=8, minute=0, tz=Europe/London
  • "just use defaults" → lead_days=7, hour=10, minute=0, tz=Europe/Paris
  • (no lead time or time given) → apply defaults, confirm with user

Step 3 — Discover the next price-moving event

Scan sources in priority order. Stop as soon as a confirmed event is found.

3a — Check yfinance (earnings + dividends)

Run the local script to get the next earnings date:

uv run /root/.openclaw/workspace/skills/event-countdown-pro/src/main.py <TICKER>

The command outputs:

Ticker: NVDA
Company: NVIDIA Corporation
Next Earnings Date: 2026-06-15

If the output is valid (no Error:), present it to the user:

I found the next event for <COMPANY> (<TICKER>): 📊 Earnings Release — <EARNINGS_DATE> (source: Yahoo Finance)

Earnings releases are the most common price-moving events. Use this?

If user says yes → set event_type = "Earnings Release", event_date = <EARNINGS_DATE>, proceed to Step 4.

If user says no (or user specifically mentioned a different event type in their request), proceed to 3b.

Also check for upcoming dividend dates from the script output or from a quick yf.Ticker call. If a dividend ex-date is coming up sooner than earnings:

I also noticed an upcoming Ex-Dividend Date on <DIVIDEND_DATE>. Would you prefer to track that instead?

If the script returns an error (no earnings date found), proceed directly to 3b.

3b — Web search for other events

Search the web broadly for the company's upcoming events that could move the stock price. Use queries like:

  • "<COMPANY_NAME> upcoming events <CURRENT_YEAR>"
  • "<COMPANY_NAME> investor day <CURRENT_YEAR>"
  • "<COMPANY_NAME> product launch event <CURRENT_YEAR>"
  • "<COMPANY_NAME> AGM annual general meeting <CURRENT_YEAR>"
  • "<COMPANY_NAME> FDA decision date <CURRENT_YEAR>" (for pharma/biotech stocks)
  • "<COMPANY_NAME> shareholder vote <CURRENT_YEAR>"

Look for events in the near future. Event types to watch for:

Event TypeWhat it isPrice impact
Earnings ReleaseQuarterly financial resultsHigh — the #1 price mover
Product Launch / KeynoteNew product announcement (e.g. Apple WWDC, NVIDIA GTC, Tesla AI Day)High — can swing 5-10%
Investor DayManagement presents strategy and long-term outlook to investorsMedium-High — often moves on guidance updates
AGM (Annual General Meeting)Yearly shareholder gathering where leadership presents results and shareholders vote on key proposalsMedium — can move if major votes or surprises
FDA / Regulatory DecisionDrug approval, regulatory ruling (pharma, biotech, energy)Very High — binary events, can swing 20%+
Ex-Dividend DateCutoff date to receive the next dividend paymentLow-Medium — routine but relevant for income investors
Stock SplitShare split (e.g. 10-for-1)Medium — often runs up into the split date
M&A Vote / RulingShareholder vote or regulatory approval on a mergerVery High — can swing 15-30%
Analyst DayCompany hosts analysts for deep divesMedium — similar to investor day

Pick the most impactful, soonest event. Present it to the user:

I found the next price-moving event for <COMPANY> (<TICKER>): 🗓 <EVENT_TYPE> — <EVENT_DATE> (source: <SOURCE_URL>)

Is this the event you want to track? If not, I can search for others.

If multiple events are close together, list them and let the user pick:

I found multiple upcoming events for <COMPANY> (<TICKER>):

  1. 📊 Earnings Release<DATE1> (source: Yahoo Finance)
  2. 🎤 Investor Day<DATE2> (source: <URL>)
  3. 🏛 AGM<DATE3> (source: <URL>)

Which one should I set up the countdown for?

If the user confirms, set event_type and event_date.

If no event can be found at all, tell the user:

I couldn't find any upcoming price-moving events for <COMPANY>. Would you like to provide a date and event type manually? (Format: YYYY-MM-DD, Event Type)

If the user provides a manual date, confirm and proceed.

Step 4 — Compute the reminder schedule

  • reminder_start_date = event_datelead_days (7 or 14)
  • cron_expression = cron:<minute> <hour> * * * (daily at the specified time in the user's timezone)
    • e.g. 10 AM → cron:0 10 * * *
    • e.g. 9:30 AM → cron:30 9 * * *

⚠️ If reminder_start_date is today or in the past, start the daily reminders today (the cron will fire at the next occurrence of the specified time). Mention this to the user:

The event date is close — reminders will start today at 10 AM CET.

⚠️ If reminder_start_date is after the event date (the event is very soon), tell the user:

The event date is less than your chosen lead time away. Daily reminders may not be useful. Do you still want to proceed?

⚠️ If the event date is today, say:

The event is today! Would you like me to run a full briefing now instead of scheduling a reminder?

Step 5 — Create the daily cron reminder via remind-me

The cron message must contain clear instructions for the agent that fires it each day. The template uses the discovered <EVENT_TYPE> (e.g. "Earnings Release", "AGM", "Product Launch", "Investor Day") and the confirmed <EVENT_DATE>.

The message tells the agent to:

  1. Check if today is on or after the event date
  2. If so: send a final event-day message, run stock-price-checker-pro + stock-fundamentals, and cancel this reminder
  3. If not: compute days remaining, run stock-price-checker-pro + stock-fundamentals, and send a countdown briefing

Cron template (all event types)

uv run /root/.openclaw/workspace/skills/remind-me/src/main.py create \
  "<TICKER> <SHORT_EVENT_TYPE> Countdown - Daily <HH:MM>" \
  "📊 <TICKER> (<COMPANY>) <EVENT_TYPE> Countdown. Event date: <EVENT_DATE_ISO>.\n\nIf today is on or after <EVENT_DATE_ISO>:\n1. Say '🔔 <COMPANY> (<TICKER>) — <EVENT_TYPE> is TODAY! 🎯'\n2. Run: uv run /root/.openclaw/workspace/skills/stock-price-checker-pro/src/main.py <TICKER>\n3. Run: uv run /root/.openclaw/workspace/skills/stock-fundamentals/src/main.py <TICKER>\n4. Send a comprehensive event-day briefing with price, fundamentals, and a quick take.\n5. Cancel this reminder by running: uv run /root/.openclaw/workspace/skills/remind-me/src/main.py cancel name '<TICKER> <SHORT_EVENT_TYPE> Countdown - Daily <HH:MM>'\n\nIf today is before <EVENT_DATE_ISO>:\n1. Compute days_remaining = days between today and <EVENT_DATE_ISO>\n2. Say '🔔 <COMPANY> (<TICKER>) — <EVENT_TYPE> in {days_remaining} days. Briefing below.'\n3. Run: uv run /root/.openclaw/workspace/skills/stock-price-checker-pro/src/main.py <TICKER>\n4. Run: uv run /root/.openclaw/workspace/skills/stock-fundamentals/src/main.py <TICKER>\n5. Send a daily countdown briefing summarizing price, key fundamentals, and recent company news." \
  "cron:<MINUTE> <HOUR> * * *" \
  "<channel>" \
  "<chatId>" \
  "tz:<IANA timezone>"

Template variables:

VariableDescriptionExample
<TICKER>Stock tickerNVDA
<COMPANY>Full company nameNVIDIA Corporation
<EVENT_TYPE>Human-readable event typeEarnings Release, Product Launch, AGM
<SHORT_EVENT_TYPE>Short label for cron nameEarnings, Product-Launch, AGM
<EVENT_DATE_ISO>Event date in YYYY-MM-DD2026-06-15
<MINUTE> <HOUR>Time from Step 20 10 for 10:00 AM
<HH:MM>Formatted time for cron name10:00

⚠️ Critical: Channel, chatId, and timezone resolution follow the same rules as remind-me (see its SKILL.md). Auto-detect from session context. The timezone passed here (tz:<IANA>) must match the one resolved in Step 2.

Step 6 — Confirm completion

After the cron is created, report back:

✅ Done! Your event countdown is set up: 📊 <TICKER> (<COMPANY>) 🗓 <EVENT_TYPE>: <EVENT_DATE_ISO> ⏰ Daily briefing at: HH:MM <TIMEZONE_LABEL> 🔁 Starting: <REMINDER_START_DATE_ISO> (<DAYS_UNTIL_START> days from now) 📱 Delivered to: This chat


Commands

Fetch the next earnings date (yfinance)

uv run /root/.openclaw/workspace/skills/event-countdown-pro/src/main.py <TICKER>

Examples

# US stocks
uv run /root/.openclaw/workspace/skills/event-countdown-pro/src/main.py NVDA
uv run /root/.openclaw/workspace/skills/event-countdown-pro/src/main.py AAPL
uv run /root/.openclaw/workspace/skills/event-countdown-pro/src/main.py TSLA

# European stocks
uv run /root/.openclaw/workspace/skills/event-countdown-pro/src/main.py RHM.DE
uv run /root/.openclaw/workspace/skills/event-countdown-pro/src/main.py SAP.DE
uv run /root/.openclaw/workspace/skills/event-countdown-pro/src/main.py ASML.AS

Output

The script returns three lines:

Ticker: <SYMBOL>
Company: <COMPANY_NAME>
Next Earnings Date: <YYYY-MM-DD>

Or an error:

Error: <message>

Full Walkthrough

Example 1 — Earnings (NVIDIA, all defaults)

User: "Set up a countdown for NVIDIA"

  1. Resolve ticker: NVIDIA → NVDA

  2. Apply defaults: 1 week, 10 AM CET → lead_days=7, hour=10, minute=0, tz=Europe/Paris

  3. Discover event: Run script → earnings on 2026-06-15. Present to user, user confirms.

  4. Compute: event_date=2026-06-15, reminder_start=2026-06-08, cron=cron:0 10 * * *

  5. Create cron:

uv run /root/.openclaw/workspace/skills/remind-me/src/main.py create \
  "NVDA Earnings Countdown - Daily 10:00" \
  "📊 NVDA (NVIDIA Corporation) Earnings Release Countdown. Event date: 2026-06-15.\n\nIf today is on or after 2026-06-15:\n1. Say '🔔 NVIDIA Corporation (NVDA) — Earnings Release is TODAY! 🎯'\n2. Run: uv run /root/.openclaw/workspace/skills/stock-price-checker-pro/src/main.py NVDA\n3. Run: uv run /root/.openclaw/workspace/skills/stock-fundamentals/src/main.py NVDA\n4. Send a comprehensive event-day briefing with price, fundamentals, and a quick take.\n5. Cancel this reminder by running: uv run /root/.openclaw/workspace/skills/remind-me/src/main.py cancel name 'NVDA Earnings Countdown - Daily 10:00'\n\nIf today is before 2026-06-15:\n1. Compute days_remaining = days between today and 2026-06-15\n2. Say '🔔 NVIDIA Corporation (NVDA) — Earnings Release in {days_remaining} days. Briefing below.'\n3. Run: uv run /root/.openclaw/workspace/skills/stock-price-checker-pro/src/main.py NVDA\n4. Run: uv run /root/.openclaw/workspace/skills/stock-fundamentals/src/main.py NVDA\n5. Send a daily countdown briefing summarizing price, key fundamentals, and recent company news." \
  "cron:0 10 * * *" \
  "telegram" \
  "<chatId>" \
  "tz:Europe/Paris"
  1. Confirm.

Example 2 — Product Launch (Apple WWDC, 1 week, 9 AM New York)

User: "Set up a countdown for Apple's next event, 1 week before, 9 AM New York"

  1. Resolve ticker: Apple → AAPL

  2. Parse: lead_days=7, hour=9, minute=0, tz=America/New_York

  3. Discover event:

    • Run script → earnings on 2026-07-30 (still 2 months away)
    • User said "next event" not "earnings", so search web for other events
    • Web search finds Apple WWDC 2026 keynote on 2026-06-09
    • Present: "I found Apple WWDC 2026 Keynote on 2026-06-09" → user confirms
  4. Compute: event_date=2026-06-09, reminder_start=2026-06-02, cron=cron:0 9 * * *

  5. Create cron:

uv run /root/.openclaw/workspace/skills/remind-me/src/main.py create \
  "AAPL Product-Launch Countdown - Daily 09:00" \
  "📊 AAPL (Apple Inc.) Product Launch Countdown. Event date: 2026-06-09.\n\nIf today is on or after 2026-06-09:\n1. Say '🔔 Apple Inc. (AAPL) — Product Launch is TODAY! 🎯'\n2. Run: uv run /root/.openclaw/workspace/skills/stock-price-checker-pro/src/main.py AAPL\n3. Run: uv run /root/.openclaw/workspace/skills/stock-fundamentals/src/main.py AAPL\n4. Send a comprehensive event-day briefing with price, fundamentals, and a quick take.\n5. Cancel this reminder by running: uv run /root/.openclaw/workspace/skills/remind-me/src/main.py cancel name 'AAPL Product-Launch Countdown - Daily 09:00'\n\nIf today is before 2026-06-09:\n1. Compute days_remaining = days between today and 2026-06-09\n2. Say '🔔 Apple Inc. (AAPL) — Product Launch in {days_remaining} days. Briefing below.'\n3. Run: uv run /root/.openclaw/workspace/skills/stock-price-checker-pro/src/main.py AAPL\n4. Run: uv run /root/.openclaw/workspace/skills/stock-fundamentals/src/main.py AAPL\n5. Send a daily countdown briefing summarizing price, key fundamentals, and recent company news." \
  "cron:0 9 * * *" \
  "telegram" \
  "<chatId>" \
  "tz:America/New_York"
  1. Confirm.

Example 3 — AGM (Shell, 2 weeks, 9 AM London)

User: "Set up an AGM countdown for Shell, 2 weeks before, 9 AM London"

  1. Resolve ticker: Shell → SHEL.L

  2. Parse: lead_days=14, hour=9, minute=0, tz=Europe/London

  3. Discover event: User explicitly said AGM → skip yfinance, go straight to web search. Find Shell AGM on 2026-05-20. Confirm with user.

  4. Compute: event_date=2026-05-20, reminder_start=2026-05-06, cron=cron:0 9 * * *

  5. Create cron:

uv run /root/.openclaw/workspace/skills/remind-me/src/main.py create \
  "SHEL.L AGM Countdown - Daily 09:00" \
  "📊 SHEL.L (Shell plc) AGM Countdown. Event date: 2026-05-20.\n\nIf today is on or after 2026-05-20:\n1. Say '🔔 Shell plc (SHEL.L) — AGM is TODAY! 🎯'\n2. Run: uv run /root/.openclaw/workspace/skills/stock-price-checker-pro/src/main.py SHEL.L\n3. Run: uv run /root/.openclaw/workspace/skills/stock-fundamentals/src/main.py SHEL.L\n4. Send a comprehensive event-day briefing with price, fundamentals, and a quick take.\n5. Cancel this reminder by running: uv run /root/.openclaw/workspace/skills/remind-me/src/main.py cancel name 'SHEL.L AGM Countdown - Daily 09:00'\n\nIf today is before 2026-05-20:\n1. Compute days_remaining = days between today and 2026-05-20\n2. Say '🔔 Shell plc (SHEL.L) — AGM in {days_remaining} days. Briefing below.'\n3. Run: uv run /root/.openclaw/workspace/skills/stock-price-checker-pro/src/main.py SHEL.L\n4. Run: uv run /root/.openclaw/workspace/skills/stock-fundamentals/src/main.py SHEL.L\n5. Send a daily countdown briefing summarizing price, key fundamentals, and recent company news." \
  "cron:0 9 * * *" \
  "telegram" \
  "<chatId>" \
  "tz:Europe/London"
  1. Confirm.

Example 4 — Regulatory Decision (Pfizer FDA date)

User: "Set up a countdown for Pfizer's next FDA decision"

  1. Resolve ticker: Pfizer → PFE

  2. Apply defaults: 1 week, 10 AM CET

  3. Discover event: User said FDA → skip yfinance, search web for "Pfizer FDA decision date 2026". Find PDUFA date on 2026-07-15. Confirm.

  4. Compute: event_date=2026-07-15, reminder_start=2026-07-08, cron=cron:0 10 * * *

  5. Create cron using event_type="FDA Decision" and event_date="2026-07-15".

  6. Confirm.


Ticker Format Reference

MarketFormatExample
US stocksPlainAAPL, NVDA
German stocks.DE suffixRHM.DE, SAP.DE
UK stocks.L suffixSHEL.L, BP.L
Dutch stocks.AS suffixASML.AS
Japanese.T suffix7203.T
Korean.KS suffix005930.KS

Notes

  • uv run reads the inline # /// script dependency block in main.py and auto-installs yfinance in an isolated environment — no pip install or venv setup needed.
  • Company name → ticker resolution is done by the LLM agent, following the same pattern as stock-price-checker-pro.
  • Channel, chatId, and timezone are always auto-detected from session context — never ask the user for these.
  • Timezone resolution follows remind-me's 3-tier system (message → USER.md → ask user).
  • The daily cron message tells the agent to run stock-price-checker-pro and stock-fundamentals and synthesize a briefing — this applies to all event types.
  • The cron auto-cancels on the event day after delivering the final briefing.
  • For earnings dates: always use the Python script (yfinance). Do NOT use web search or curl.
  • For all other event types: the agent discovers the date via web search. Always confirm the date and source with the user before creating the cron.
  • If no event date can be found after exhausting both sources, tell the user and offer manual date entry.
  • Do NOT use the shell wrapper pattern — call uv run src/main.py directly as shown above.
  • Handles ALL price-moving corporate events — earnings, AGMs, product launches, investor days, FDA decisions, dividend dates, stock splits, M&A votes, and analyst days.