OpenClawのcronジョブを設定すると、毎日のレポート送信・Slack通知・データ取得などをClaude Codeが完全自動で実行します。
- 要点1: jobs.jsonにcron式・スキル名・配信先を記述するだけで定期実行が完成する
- 要点2: GA4レポート・Googleカレンダー通知・SEOレポートなど業務直結の自動化が即実現できる
- 要点3: Slack通知の不配信・同時実行クラッシュは設定変更で解消できる
対象: OpenClawを導入済みで、毎日の定期タスクを自動化したい経営者・業務担当者
今日やること: jobs.jsonに最初のcronジョブを1つ追加し、テスト実行で動作を確認する
この記事の目次
OpenClawのcronジョブを設定することで、毎日の定型業務をClaude Codeが自動で処理します。GA4のアクセスレポートを毎朝Slackに送信したり、Googleカレンダーから今日の予定を取り出してDM通知したりと、「毎日手作業でやっていたこと」を完全に自動化できます。
「設定が難しそう」と思われがちですが、実際にはjobs.jsonというファイルにジョブの設定を書くだけで動きます。この記事では、実際に構築・運用した複数のcronジョブ事例をもとに、設定方法からトラブル対処まで一気通貫で解説します。
OpenClawのcronジョブとは?まず全体像を把握する
OpenClawのcronジョブとは、「決まった時刻にClaude Codeに特定の指示を出して自動実行させる仕組み」です。macOSやLinuxに標準搭載されているシステムのcrontabとは異なり、OpenClawのcronはClaude AIによるタスク実行に特化しています。
cronジョブが解決する「毎日の手作業」問題
ビジネスの現場では、毎日繰り返す定型業務が積み重なっています。
- GA4やSearch Consoleのデータを手動で確認してレポート作成
- Googleカレンダーを開いて今日のミーティングを確認
- 問い合わせメールをチェックして重要なものを抽出
- 競合サイトの更新状況を確認
これらはすべて、OpenClawのcronジョブで自動化できます。Claude Codeがスキルや外部APIを駆使してタスクを処理し、結果をSlackに自動送信します。1つのジョブを設定するのに必要な時間はおよそ5〜10分です。
OpenClawにおけるcronジョブの動作原理
OpenClawのcronジョブは以下の流れで動作します。
- Gatewayプロセスがjobs.jsonを定期的に読み込み、実行タイミングを監視する
- 設定時刻になると、GatewayがClaude CLIプロセスを起動する
- Claude CLIが指定されたスキルや指示を実行する
- 実行結果をSlackなどの配信先に送信する
設定ファイルは ~/.openclaw/cron/jobs.json に保存されます。OpenClawゲートウェイを再起動してもこのファイルは消えないため、一度設定すれば毎日自動で動き続けます。
なお、OpenClawとは、Anthropic社のClaude CodeをSlack等のメッセージングツールから常時利用できるようにするエージェントフレームワークです。Claude Codeをインストールした環境にOpenClawを導入し、ゲートウェイプロセスを立ち上げることで利用できます。(OpenClawのセットアップ方法はこちら →)
cronジョブの設定ファイル(jobs.json)の構造を理解する
jobs.jsonはOpenClawのcronジョブを管理するJSONファイルです。このファイルを編集することでジョブの追加・変更・削除ができます。
最小構成のjobs.jsonサンプル
以下は最もシンプルなcronジョブの設定例です。
{ "jobs": [ { "id": "daily-report", "enabled": true, "schedule": { "cron": "0 9 * * *" }, "task": { "prompt": "ga4-seo-reportスキルを実行してください", "skillFile": "~/.claude/skills/ga4-seo-report/SKILL.md", "model": "sonnet" }, "delivery": { "mode": "none", "channel": "slack", "to": "channel:C0AG7FSSP1A" }, "sessionTarget": "isolated", "timeout": 300 } ]}
各フィールドの意味を確認しておきましょう。
| フィールド | 説明 |
|---|---|
id |
ジョブを識別する一意のID(英数字・ハイフン) |
enabled |
trueで有効、falseで一時停止 |
schedule.cron |
cron式でスケジュールを指定 |
task.prompt |
Claude Codeへの指示文 |
task.skillFile |
実行するスキルファイルのパス(任意) |
task.model |
使用するモデル(sonnet/haiku等) |
delivery.mode |
none推奨(詳細は後述) |
delivery.to |
配信先チャンネルまたはユーザー |
sessionTarget |
isolated(独立セッション)推奨 |
timeout |
タイムアウト秒数(デフォルト300秒) |
スケジュール形式3種類の使い分け
OpenClawは3つのスケジュール形式に対応しています。
① cron式(標準cron)
"schedule": { "cron": "0 9 * * *" }
「毎日9:00に実行」などの繰り返しスケジュールに使います。分 時 日 月 曜日 の順に記述します。
| cron式 | 意味 |
|---|---|
0 9 * * * |
毎日9:00 |
30 7 * * 1-5 |
平日7:30 |
0 9 * * 1 |
毎週月曜9:00 |
45 9 * * * |
毎日9:45 |
② every(間隔指定)
"schedule": { "every": "1h" }
「1時間ごと」など一定間隔で繰り返す場合に使います。1h、30m、7d などの形式で指定します。
③ at(一回限り)
"schedule": { "at": "2026-04-01T09:00:00+09:00" }
特定の日時に一度だけ実行する場合に使います。キャンペーン開始日の通知などに活用できます。
セッション設定(isolated推奨)とdelivery設定
sessionTarget: "isolated" は、毎回クリーンな状態でClaude Codeを起動する設定です。前回の会話履歴が混入せず、ジョブが安定して動作するため、ほぼすべてのcronジョブにisolatedを使うことをおすすめします。
delivery.mode は "none" を推奨します。"announce" という配信モードも存在しますが、特定の条件でSlack通知が届かないバグが確認されています。代わりに、スキルやプロンプト内でClaude Codeが直接Slack APIを呼び出す方式のほうが確実です(詳細は後述)。
\ Claude Codeの導入、何から始めればいいかわかります /
法人向けClaude Code個別指導の無料相談はこちら実践:3種類のcronジョブを設定してみる
実際に構築した3つのcronジョブ事例を紹介します。それぞれ openclaw cron add コマンドで追加するか、jobs.jsonを直接編集することで設定できます。
事例1 — 毎日9:45にGA4レポートをSlackに自動送信
あるメディアサイトの運営で、毎日のGA4アクセスデータをSlackに自動報告するcronジョブを設定しました。設定後は毎朝9:45に前日の流入数・PV・エンゲージ率がSlackに届きます。
{ "id": "ga4-seo-report", "enabled": true, "schedule": { "cron": "45 9 * * *" }, "task": { "prompt": "ga4-seo-reportスキルを実行して、結果をSlackの#seoチャンネルに投稿してください", "skillFile": "~/.claude/skills/ga4-seo-report/SKILL.md", "model": "sonnet" }, "delivery": { "mode": "none" }, "sessionTarget": "isolated", "timeout": 600}
ポイントは timeout を600秒(10分)に延長している点です。GA4のAPIデータ取得とレポート生成には時間がかかるため、デフォルトの300秒では途中でタイムアウトしてしまう場合があります。
事例2 — 毎朝7:30にGoogleカレンダーの今日の予定をDM通知
gogcli(Google Workspace CLI)を使って今日のGoogleカレンダー予定を取得し、Slack DMで通知するジョブです。毎朝PC起動前に予定一覧が届くため、準備漏れを防げます。
{ "id": "daily-calendar-notify", "enabled": true, "schedule": { "cron": "30 7 * * *" }, "task": { "prompt": "gogcliで今日のGoogleカレンダーの予定を取得して、時間・予定名・場所をSlack DMで送信してください。予定がない場合は「今日の予定はありません」と送信してください", "model": "haiku" }, "delivery": { "mode": "none" }, "sessionTarget": "isolated", "timeout": 120}
このジョブは model: "haiku" を使用しています。カレンダー取得・整形・DM送信という単純なタスクにsonnetを使うとコスト過多になるため、軽量モデルで十分です。
事例3 — Search Consoleのデータをもとに毎週月曜にSEO改善提案
毎週月曜の朝にSearch ConsoleのデータとGA4データを取得して、リライト優先度の高い記事リストをSlackに送信するジョブです。週次で改善アクションを自動提案してくれます。
{ "id": "weekly-seo-report", "enabled": true, "schedule": { "cron": "0 8 * * 1" }, "task": { "prompt": "seo-improvementスキルを実行して、今週改善すべき記事TOP5をSlackの#seoチャンネルに投稿してください", "skillFile": "~/.claude/skills/seo-improvement/SKILL.md", "model": "sonnet" }, "delivery": { "mode": "none" }, "sessionTarget": "isolated", "timeout": 900}
Claude Codeの導入や活用方法について、個別にご相談いただけます。「どのcronジョブから設定すればいいか」「自社の定型業務をどう自動化するか」といった段階から対応しています。
cronジョブのSlack通知が届かないときの対処法
OpenClawのcronジョブで最もよく遭遇するトラブルが「ジョブは実行されているのにSlackに通知が届かない」問題です。
announce配信のバグとchannel/user_not_foundエラー
OpenClawのcron配信には delivery.mode: "announce" というモードがあります。これはジョブ完了時に自動的にSlackへ配信する便利な機能ですが、環境によっては channel_not_found または user_not_found というエラーが発生し、通知が届きません。
jobs.jsonの lastDeliveryStatus フィールドで確認できます。
"lastDeliveryStatus": "not-delivered","lastDeliveryError": "channel_not_found"
このエラーは、OpenClawゲートウェイのSlack連携設定とjobs.jsonの配信先設定の間に不整合が生じることで発生します。
delivery.mode: noneに変更してエージェント内でSlack APIを直接呼び出す
確実に機能する回避策として、delivery.mode: "none" に変更し、プロンプト内でClaude Codeが直接Slack APIを呼び出す方式をおすすめします。
{ "task": { "prompt": "ga4-seo-reportスキルを実行して、結果を以下のcurlコマンドでSlackに送信してください。\ncurl -X POST -H 'Authorization: Bearer $SLACK_BOT_TOKEN' -H 'Content-type: application/json' --data '{\"channel\":\"C0AG7FSSP1A\",\"text\":\"[レポート内容]\"}' https://slack.com/api/chat.postMessage" }, "delivery": { "mode": "none" }}
または、スキルファイル内にSlack API呼び出しを組み込むことで、プロンプトをシンプルに保てます。
ポイントOpenClawのSlackトークンは
~/.openclaw/openclaw.jsonに保存されています。スキルやプロンプトから参照する場合は、セキュリティに注意してください。macOS Keychainに保存してsecurity find-generic-passwordで取得する方式が安全です。
\ 業務自動化のお悩み、プロが30分で整理します /
法人向けClaude Code個別指導の無料相談はこちらcronジョブが同時に実行されると失敗する問題を解決する
複数のcronジョブを同時間帯に集中させると、ジョブが無応答のままタイムアウトすることがあります。
同時実行クラッシュが起きるメカニズム
OpenClawのcronジョブとSlack経由の手動操作は、裏側で同じClaude CLI(/Users/riku/.local/bin/claude)とAnthropic APIを共有しています。レーン(cron用・Slack対話用)は設計上分離されていますが、最終的に呼び出されるAPIは同一です。
複数のジョブが同時に動くと、APIリクエストが集中してレートリミットに達し、CLIが応答を返さないまま強制終了されます。
以下は実際に発生したタイムアウトの比較です。
| ジョブ | 通常の実行時間 | 集中時の挙動 |
|---|---|---|
| daily-calendar-notify | 約15秒 | 120秒でタイムアウト(上限で強制終了) |
| ga4-seo-report | 約87秒 | 1200秒でタイムアウト(応答なし) |
| seo-improvement | 約46秒 | 1200秒でタイムアウト(応答なし) |
スケジュール分散で解決する具体的な設定例
解決策は単純です。ジョブのスケジュールを30分以上分散させることです。
修正前(全部9:00集中)
9:00 - daily-calendar-notify9:00 - ga4-seo-report9:00 - seo-improvement
修正後(30分間隔で分散)
7:00 - ai-coaching-check(軽量タスク)7:30 - daily-calendar-notify8:00 - info-hub-update8:30 - info-hub-status9:30 - seo-improvement9:45 - ga4-seo-report
openclaw cron edit コマンドでスケジュールを変更できます。
openclaw cron edit daily-calendar-notify --cron "30 7 * * *"
また、朝のcron実行時間帯(7:00〜10:00頃)はSlackからの連続的な手動操作を控えると、さらに安定して動作します。
cronジョブの動作確認・デバッグ方法
設定後は必ず動作確認を行いましょう。
nextRunAtMsを使ったテスト実行
ジョブを今すぐテスト実行したい場合、jobs.jsonの nextRunAtMs フィールドを現在時刻+30秒のタイムスタンプ(ミリ秒)に設定します。OpenClawゲートウェイが次のポーリングタイミングで検知し、即座に実行が始まります。
# 現在時刻+30秒のミリ秒タイムスタンプを取得echo $(($(date +%s) * 1000 + 30000))
取得したタイムスタンプをjobs.jsonの対象ジョブに追記します。
"nextRunAtMs": 1774350030000
ログファイルで実行結果を確認する方法
実行結果は以下のログファイルに記録されます。
# 実行ログ(当日分)cat ~/.openclaw/logs/gateway.log# または日付付きのログファイルcat /tmp/openclaw/openclaw-$(date +%Y-%m-%d).log
ログ内の以下のフィールドでジョブの状態を確認できます。
| フィールド | 内容 |
|---|---|
lastRunStatus |
ok(成功)またはtimeout(タイムアウト) |
lastRunAt |
前回の実行時刻(ISO8601形式) |
lastDeliveryStatus |
delivered(配信成功)またはnot-delivered |
runningAtMs |
現在実行中の場合はタイムスタンプが入る |
openclaw cron listで現在のジョブ状態を確認
CLIコマンドで全ジョブの状態を一覧表示できます。
openclaw cron list
各ジョブの有効・無効状態、前回の実行結果、次回実行予定時刻がテーブル形式で確認できます。
\ AI活用の「次の一手」を一緒に考えませんか /
法人向けClaude Code個別指導の無料相談はこちらよくある質問
Q. OpenClawのcronジョブはどこに保存されますか?
~/.openclaw/cron/jobs.json に保存されます。このファイルはゲートウェイが起動時に読み込み、メモリ上で管理します。ゲートウェイを再起動してもファイルは消えないため、設定は永続的に有効です。
Q. cronジョブを一時停止・削除するにはどうすればいいですか?
一時停止は enabled: false に変更します。削除はjobs.jsonから該当ジョブのオブジェクトを削除するか、以下のコマンドを使用します。
# 一時停止openclaw cron disable [ジョブID]# 再開openclaw cron enable [ジョブID]# 削除openclaw cron remove [ジョブID]
Q. cronジョブが実行されているのにSlackに通知が来ない場合はどうすればいいですか?
jobs.jsonの lastDeliveryStatus が not-delivered になっている場合は、前述の通りdelivery.modeを "none" に変更し、スキルやプロンプト内でSlack APIを直接呼び出す方式に切り替えてください。
Q. OpenClawのcronとシステムのcrontabはどう違いますか?
システムのcrontabは「特定のコマンドをスケジュール実行する」仕組みですが、OpenClawのcronは「Claude Codeに自然言語で指示を出してAIタスクをスケジュール実行する」仕組みです。AIならではの柔軟な判断・文章生成・API連携が自動で行われる点が最大の違いです。
まとめ
OpenClawのcronジョブを使うと、Claude Codeが毎日の定型業務を自動化します。
~/.openclaw/cron/jobs.jsonに設定を書くだけで定期実行が完成する- GA4レポート・カレンダー通知・SEOレポートなど業務直結の自動化が即実現できる
- Slack通知の不配信はdelivery.modeを
noneにしてエージェント内でAPI直接呼び出しに変更 - 複数ジョブの同時実行クラッシュはスケジュールを30分以上分散させて解決
最初の一歩として、まずGA4やGoogle Calendarなど毎日チェックしているツールのレポートを1つcronジョブ化してみてください。一度動き始めると、「手動で確認していた毎日の作業」が完全に不要になります。
Claude Codeの導入・活用をサポートします
株式会社Nexaでは、Claude Codeを活用した業務自動化の個別指導・企業研修を提供しています。OpenClawのセットアップからcronジョブの設計まで、非エンジニアの方でも3ヶ月で業務自動化を実現できるプログラムです。「何から始めればいいかわからない」という段階からご支援いたします。





