Earnings and Financial Release Countdown

Data & APIs

Set up a daily earnings countdown reminder for a stock. Resolves company name to ticker, fetches the next earnings date, 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 earnings. Triggers: earnings reminder, earnings countdown, notify me before earnings, remind me about earnings, earnings alert.

Install

openclaw skills install earnings-countdown

Skill: Earnings Countdown

When to use

  • User wants a daily reminder leading up to a company's next earnings release.
  • User says "notify me 1 week before NVIDIA earnings every day at 10 AM".
  • User says "set up an earnings countdown for Apple".
  • User says "remind me daily before Tesla's financial release".
  • User wants to track an upcoming earnings 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 earnings-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 orchestrates three sub-skills to create a proactive earnings countdown:

  1. Resolve company name → ticker (LLM agent maps it, same approach as stock-price-checker-pro)
  2. Fetch the next earnings date via the local Python script
  3. Create a daily cron reminder via remind-me that fires every day at the specified time, running stock-price-checker-pro + stock-fundamentals and delivering a countdown briefing

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
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 earnings?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

Always confirm before proceeding. Summarise:

Got it! Here's what I'll set up: 📊 Company: NVIDIA (NVDA) 📅 Lead time: 1 week before earnings ⏰ Time: 10:00 AM CET (Europe/Paris) 🔔 Delivery: Daily countdown briefing to this chat

Shall I go ahead?

Step 3 — Fetch the next earnings date

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

The command outputs:

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

If the output contains Error:, report the error to the user and stop.

Step 4 — Compute the reminder schedule

From the script output, compute:

  • reminder_start_date = Next Earnings 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 earnings date is close — reminders will start today at 10 AM CET.

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

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

⚠️ If the earnings date is today, say:

Earnings are 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 message tells the agent to:

  1. Check if today is on or after the earnings date
  2. If so: send a final "Earnings 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

Use the remind-me create command:

uv run /root/.openclaw/workspace/skills/remind-me/src/main.py create \
  "<TICKER> Earnings Countdown - Daily <HH:MM>" \
  "📊 <TICKER> (<COMPANY>) Earnings Countdown. Next earnings date: <EARNINGS_DATE_ISO>.\n\nIf today is on or after <EARNINGS_DATE_ISO>:\n1. Say '🔔 <COMPANY> (<TICKER>) earnings are 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 earnings-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> Earnings Countdown - Daily <HH:MM>'\n\nIf today is before <EARNINGS_DATE_ISO>:\n1. Compute days_remaining = days between today and <EARNINGS_DATE_ISO>\n2. Say '🔔 <COMPANY> (<TICKER>) earnings 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>"

⚠️ 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 earnings countdown is set up: 📊 <TICKER> (<COMPANY>) 📅 Earnings date: <EARNINGS_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

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

Examples

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

# European stocks
uv run /root/.openclaw/workspace/skills/earnings-countdown/src/main.py RHM.DE
uv run /root/.openclaw/workspace/skills/earnings-countdown/src/main.py SAP.DE
uv run /root/.openclaw/workspace/skills/earnings-countdown/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 — NVIDIA with 1 week lead time, 10 AM CET (all defaults)

User: "Set up an earnings 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. Confirm with user (include timezone line), user says yes
  4. Run script:
uv run /root/.openclaw/workspace/skills/earnings-countdown/src/main.py NVDA

Output:

Ticker: NVDA
Company: NVIDIA Corporation
Next Earnings Date: 2026-06-15
  1. Compute schedule:

    • earnings_date = 2026-06-15
    • reminder_start = 2026-06-08 (7 days before)
    • cron = cron:0 10 * * *
    • days_until_start = compute from today
  2. Create cron:

uv run /root/.openclaw/workspace/skills/remind-me/src/main.py create \
  "NVDA Earnings Countdown - Daily 10:00" \
  "📊 NVDA (NVIDIA Corporation) Earnings Countdown. Next earnings date: 2026-06-15.\n\nIf today is on or after 2026-06-15:\n1. Say '🔔 NVIDIA Corporation (NVDA) earnings are 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 earnings-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 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 completion.

Example — Apple with 2 weeks lead time, 9 AM New York time

User: "Notify me 2 weeks before Apple earnings every day at 9 AM New York time"

  1. Resolve ticker: Apple → AAPL
  2. Parse: lead_days=14, hour=9, minute=0, tz=America/New_York
  3. Confirm, user says yes
  4. Run script:
uv run /root/.openclaw/workspace/skills/earnings-countdown/src/main.py AAPL
  1. Compute: cron = cron:0 9 * * *, tz=America/New_York
  2. Create cron (same pattern as above, with AAPL details and America/New_York timezone)
  3. Confirm completion.

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.
  • The cron auto-cancels on earnings day after delivering the final briefing.
  • If no earnings date is found, the skill reports the error and stops — no cron is created.
  • Do NOT use the shell wrapper pattern — call uv run src/main.py directly as shown above.
  • Do NOT use web search or curl to fetch earnings dates — always use this script.