← Back to Skills Marketplace
youpele52

Event Countdown Pro

by youpele52 · GitHub ↗ · v1.0.0 · MIT-0
cross-platform ✓ Security Clean
46
Downloads
0
Stars
0
Active Installs
1
Versions
Install in OpenClaw
/install event-countdown-pro
Description
Set up a daily countdown reminder for a stock's next price-moving corporate event — earnings releases, AGMs, product launches, investor days, dividend dates,...
README (SKILL.md)

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:

Priority Source Data Examples
1 yfinance (Python script) Earnings dates, dividend dates 2026-07-30 (AAPL earnings)
2 Web search (agent) AGMs, product launches, investor days, FDA decisions, splits, M&A votes — any event likely to move the stock price 2026-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.

Company Ticker
NVIDIA NVDA
Apple AAPL
Tesla TSLA
Microsoft MSFT
Amazon AMZN
Google / Alphabet GOOGL
Meta / Facebook META
Pfizer PFE
Rheinmetall RHM.DE
SAP SAP.DE
ASML ASML.AS
Shell SHEL.L

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

Step 2 — Collect lead time and notification time

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

Question Default Options
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 \x3CTICKER>

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 \x3CCOMPANY> (\x3CTICKER>): 📊 Earnings Release — \x3CEARNINGS_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 = \x3CEARNINGS_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 \x3CDIVIDEND_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:

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

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

Event Type What it is Price impact
Earnings Release Quarterly financial results High — the #1 price mover
Product Launch / Keynote New product announcement (e.g. Apple WWDC, NVIDIA GTC, Tesla AI Day) High — can swing 5-10%
Investor Day Management presents strategy and long-term outlook to investors Medium-High — often moves on guidance updates
AGM (Annual General Meeting) Yearly shareholder gathering where leadership presents results and shareholders vote on key proposals Medium — can move if major votes or surprises
FDA / Regulatory Decision Drug approval, regulatory ruling (pharma, biotech, energy) Very High — binary events, can swing 20%+
Ex-Dividend Date Cutoff date to receive the next dividend payment Low-Medium — routine but relevant for income investors
Stock Split Share split (e.g. 10-for-1) Medium — often runs up into the split date
M&A Vote / Ruling Shareholder vote or regulatory approval on a merger Very High — can swing 15-30%
Analyst Day Company hosts analysts for deep dives Medium — similar to investor day

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

I found the next price-moving event for \x3CCOMPANY> (\x3CTICKER>): 🗓 \x3CEVENT_TYPE> — \x3CEVENT_DATE> (source: \x3CSOURCE_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 \x3CCOMPANY> (\x3CTICKER>):

  1. 📊 Earnings Release — \x3CDATE1> (source: Yahoo Finance)
  2. 🎤 Investor Day — \x3CDATE2> (source: \x3CURL>)
  3. 🏛 AGM — \x3CDATE3> (source: \x3CURL>)

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 \x3CCOMPANY>. 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:\x3Cminute> \x3Chour> * * * (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 \x3CEVENT_TYPE> (e.g. "Earnings Release", "AGM", "Product Launch", "Investor Day") and the confirmed \x3CEVENT_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 \
  "\x3CTICKER> \x3CSHORT_EVENT_TYPE> Countdown - Daily \x3CHH:MM>" \
  "📊 \x3CTICKER> (\x3CCOMPANY>) \x3CEVENT_TYPE> Countdown. Event date: \x3CEVENT_DATE_ISO>.\
\
If today is on or after \x3CEVENT_DATE_ISO>:\
1. Say '🔔 \x3CCOMPANY> (\x3CTICKER>) — \x3CEVENT_TYPE> is TODAY! 🎯'\
2. Run: uv run /root/.openclaw/workspace/skills/stock-price-checker-pro/src/main.py \x3CTICKER>\
3. Run: uv run /root/.openclaw/workspace/skills/stock-fundamentals/src/main.py \x3CTICKER>\
4. Send a comprehensive event-day briefing with price, fundamentals, and a quick take.\
5. Cancel this reminder by running: uv run /root/.openclaw/workspace/skills/remind-me/src/main.py cancel name '\x3CTICKER> \x3CSHORT_EVENT_TYPE> Countdown - Daily \x3CHH:MM>'\
\
If today is before \x3CEVENT_DATE_ISO>:\
1. Compute days_remaining = days between today and \x3CEVENT_DATE_ISO>\
2. Say '🔔 \x3CCOMPANY> (\x3CTICKER>) — \x3CEVENT_TYPE> in {days_remaining} days. Briefing below.'\
3. Run: uv run /root/.openclaw/workspace/skills/stock-price-checker-pro/src/main.py \x3CTICKER>\
4. Run: uv run /root/.openclaw/workspace/skills/stock-fundamentals/src/main.py \x3CTICKER>\
5. Send a daily countdown briefing summarizing price, key fundamentals, and recent company news." \
  "cron:\x3CMINUTE> \x3CHOUR> * * *" \
  "\x3Cchannel>" \
  "\x3CchatId>" \
  "tz:\x3CIANA timezone>"

Template variables:

Variable Description Example
\x3CTICKER> Stock ticker NVDA
\x3CCOMPANY> Full company name NVIDIA Corporation
\x3CEVENT_TYPE> Human-readable event type Earnings Release, Product Launch, AGM
\x3CSHORT_EVENT_TYPE> Short label for cron name Earnings, Product-Launch, AGM
\x3CEVENT_DATE_ISO> Event date in YYYY-MM-DD 2026-06-15
\x3CMINUTE> \x3CHOUR> Time from Step 2 0 10 for 10:00 AM
\x3CHH:MM> Formatted time for cron name 10: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:\x3CIANA>) 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: 📊 \x3CTICKER> (\x3CCOMPANY>) 🗓 \x3CEVENT_TYPE>: \x3CEVENT_DATE_ISO> ⏰ Daily briefing at: \x3CHH:MM> \x3CTIMEZONE_LABEL> 🔁 Starting: \x3CREMINDER_START_DATE_ISO> (\x3CDAYS_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 \x3CTICKER>

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: \x3CSYMBOL>
Company: \x3CCOMPANY_NAME>
Next Earnings Date: \x3CYYYY-MM-DD>

Or an error:

Error: \x3Cmessage>

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.\
\
If today is on or after 2026-06-15:\
1. Say '🔔 NVIDIA Corporation (NVDA) — Earnings Release is TODAY! 🎯'\
2. Run: uv run /root/.openclaw/workspace/skills/stock-price-checker-pro/src/main.py NVDA\
3. Run: uv run /root/.openclaw/workspace/skills/stock-fundamentals/src/main.py NVDA\
4. Send a comprehensive event-day briefing with price, fundamentals, and a quick take.\
5. Cancel this reminder by running: uv run /root/.openclaw/workspace/skills/remind-me/src/main.py cancel name 'NVDA Earnings Countdown - Daily 10:00'\
\
If today is before 2026-06-15:\
1. Compute days_remaining = days between today and 2026-06-15\
2. Say '🔔 NVIDIA Corporation (NVDA) — Earnings Release in {days_remaining} days. Briefing below.'\
3. Run: uv run /root/.openclaw/workspace/skills/stock-price-checker-pro/src/main.py NVDA\
4. Run: uv run /root/.openclaw/workspace/skills/stock-fundamentals/src/main.py NVDA\
5. Send a daily countdown briefing summarizing price, key fundamentals, and recent company news." \
  "cron:0 10 * * *" \
  "telegram" \
  "\x3CchatId>" \
  "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.\
\
If today is on or after 2026-06-09:\
1. Say '🔔 Apple Inc. (AAPL) — Product Launch is TODAY! 🎯'\
2. Run: uv run /root/.openclaw/workspace/skills/stock-price-checker-pro/src/main.py AAPL\
3. Run: uv run /root/.openclaw/workspace/skills/stock-fundamentals/src/main.py AAPL\
4. Send a comprehensive event-day briefing with price, fundamentals, and a quick take.\
5. 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'\
\
If today is before 2026-06-09:\
1. Compute days_remaining = days between today and 2026-06-09\
2. Say '🔔 Apple Inc. (AAPL) — Product Launch in {days_remaining} days. Briefing below.'\
3. Run: uv run /root/.openclaw/workspace/skills/stock-price-checker-pro/src/main.py AAPL\
4. Run: uv run /root/.openclaw/workspace/skills/stock-fundamentals/src/main.py AAPL\
5. Send a daily countdown briefing summarizing price, key fundamentals, and recent company news." \
  "cron:0 9 * * *" \
  "telegram" \
  "\x3CchatId>" \
  "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.\
\
If today is on or after 2026-05-20:\
1. Say '🔔 Shell plc (SHEL.L) — AGM is TODAY! 🎯'\
2. Run: uv run /root/.openclaw/workspace/skills/stock-price-checker-pro/src/main.py SHEL.L\
3. Run: uv run /root/.openclaw/workspace/skills/stock-fundamentals/src/main.py SHEL.L\
4. Send a comprehensive event-day briefing with price, fundamentals, and a quick take.\
5. 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'\
\
If today is before 2026-05-20:\
1. Compute days_remaining = days between today and 2026-05-20\
2. Say '🔔 Shell plc (SHEL.L) — AGM in {days_remaining} days. Briefing below.'\
3. Run: uv run /root/.openclaw/workspace/skills/stock-price-checker-pro/src/main.py SHEL.L\
4. Run: uv run /root/.openclaw/workspace/skills/stock-fundamentals/src/main.py SHEL.L\
5. Send a daily countdown briefing summarizing price, key fundamentals, and recent company news." \
  "cron:0 9 * * *" \
  "telegram" \
  "\x3CchatId>" \
  "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

Market Format Example
US stocks Plain AAPL, NVDA
German stocks .DE suffix RHM.DE, SAP.DE
UK stocks .L suffix SHEL.L, BP.L
Dutch stocks .AS suffix ASML.AS
Japanese .T suffix 7203.T
Korean .KS suffix 005930.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.
Usage Guidance
Before installing, understand that this skill can create daily automated stock-event messages in the chat where you use it. Use it only in a channel where revealing tracked tickers, event dates, and financial monitoring interests is acceptable, and cancel the reminder if you no longer want recurring briefings.
Capability Assessment
Purpose & Capability
The files coherently support the stated purpose: resolve a stock ticker, fetch the next earnings date via yfinance, optionally use web search for other corporate events, and create a daily reminder that runs related stock briefing skills.
Instruction Scope
The workflow asks the user to confirm the event/date before scheduling and discloses delivery to the current chat, but it could be clearer that the recurring reminder will continue posting ticker/event briefings until canceled or event-day auto-cancel.
Install Mechanism
The artifact contains a markdown skill plus small Python scripts; it declares required bins uv and openclaw, and uv installs only the yfinance dependency from the inline script metadata.
Credentials
Network/data use is proportionate to stock-event lookup: Yahoo Finance/yfinance, web search for non-earnings events, and existing local OpenClaw/remind-me skills are used for the advertised financial reminder workflow.
Persistence & Privilege
The skill intentionally creates a recurring cron-style reminder in the current chat and includes ticker, company, event date, and briefing instructions; this persistence is disclosed and purpose-aligned, not hidden.
How to Use
  1. Make sure OpenClaw is installed (local or Docker)
  2. Run the install command in chat: /install event-countdown-pro
  3. After installation, invoke the skill by name or use /event-countdown-pro
  4. Provide required inputs per the skill's parameter spec and get structured output
Version History
v1.0.0
Renamed the skill from earnings-countdown to event-countdown-pro to reflect its expanded scope beyond earnings releases. The skill now discovers and creates countdown reminders for ANY price-moving corporate event, not just earnings and AGMs. - Set up daily reminders leading up to a stock’s next major corporate event (earnings, AGMs, product launches, etc.). - Automatically resolves company names to tickers and fetches the next impactful event using yfinance and web search. - Lets users pick lead time (1–2 weeks before event) and daily notification time (any timezone). - Automates daily updates with stock price and fundamentals until the event. - Conversationally confirms event choice and reminder schedule with the user.
Metadata
Slug event-countdown-pro
Version 1.0.0
License MIT-0
All-time Installs 0
Active Installs 0
Total Versions 1
Frequently Asked Questions

What is Event Countdown Pro?

Set up a daily countdown reminder for a stock's next price-moving corporate event — earnings releases, AGMs, product launches, investor days, dividend dates,... It is an AI Agent Skill for Claude Code / OpenClaw, with 46 downloads so far.

How do I install Event Countdown Pro?

Run "/install event-countdown-pro" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.

Is Event Countdown Pro free?

Yes, Event Countdown Pro is completely free, licensed under MIT-0. You can download, install and use it at no cost.

Which platforms does Event Countdown Pro support?

Event Countdown Pro is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).

Who created Event Countdown Pro?

It is built and maintained by youpele52 (@youpele52); the current version is v1.0.0.

💬 Comments