# アクセス解析をみてページを改善する
## 概要・目的
このドキュメントは、GA4(Google Analytics 4)の検索流入データを元に、以下の2種類のページに「Substack有料購読への誘導リンク」を追加し、コンバージョン率(CTR)を改善するための**完全な手順書**です。
- **Obsidian Publish記事**(publish.obsidian.md/goryugo/…): **完全自動化**(1コマンドでPublishまで完結)
- **Substack記事**(knowledgestuck.substack.com): **ローカルファイル編集まで自動、反映は手動**(ノートを開いてブラウザの編集画面も開く)
この手順を繰り返すことで、「検索で人が来ているのにSubstackに誘導できていない記事」を段階的に改善し、有料購読者を増やしていく。
---
## 前提条件・使用するツール
### 必須ツール
- **Obsidian CLI** (`obsidian` コマンド) — Obsidianアプリがバックグラウンドで起動していること
- **Antigravity MCP: google-analytics** — GA4データへのアクセス
- **curl + python3** — Substack APIからpost IDを取得するため
- **macOS `open` コマンド** — デフォルトブラウザでURLを開くため
### GA4プロパティID(2026年3月時点)
| プロパティ名 | ID | 用途 |
|:--|:--|:--|
| **Obsidian Publish** | `411479937` | 記事の検索流入分析の主力。ごりゅご.comの公開記事 |
| **Substack (ks)** | `523521453` | Substackの記事アクセス、goryugo.comリファラル確認 |
| goryugo.com(Astro) | `312468636` | 参考程度。Publish側に流入が集中しているため副次的 |
> **注意**: Publish側は `publish.obsidian.md/goryugo/...` というURLで公開されているが、GA4上の表示はパスのみ(例: `/20220204/obsidian_zettelkasten/`)として記録される。記事のパスはYAMLの `permalink` と一致する。
---
## フェーズ1:GA4で改善対象記事を特定する
### 1-1. 検索流入上位記事のランキングを取得する
GA4 MCPの `run_report` ツールを使用する。
```
プロパティID: 411479937(Obsidian Publish)
日付範囲: 30daysAgo → today
ディメンション: pagePath, pageTitle
メトリクス: sessions
ディメンションフィルター: sessionSourceMedium = "google / organic"(完全一致)
並び順: sessions 降順
リミット: 20
```
**具体的なフィルター設定(JSON):**
```json
{
"filter": {
"field_name": "sessionSourceMedium",
"string_filter": {
"match_type": 1,
"value": "google / organic",
"case_sensitive": false
}
}
}
```
**結果例(2026年3月時点・30日間):**
```
1位: /20220204/obsidian_zettelkasten/ 197セッション
2位: /20210309/anki-english/ 183セッション
3位: /2017/06/15/to_centrair/ 166セッション
4位: /20150818/varnish/ 159セッション
5位: /20150806/babyfence_diy/ 142セッション
6位: /20221015/obsidian_booknote/ 142セッション
7位: /20200106/hhkb-hybrid-pearing/ 129セッション
```
### 1-2. 7日間・1日のランキングも確認する(トレンドの把握)
短期間では季節性のある記事(旅行系など)が上がってくる。30日ランキングとの差異から「今まさにホットな記事」を把握できる。
```
日付範囲: 7daysAgo → today(または yesterday → today)
他の条件は同じ
```
---
## フェーズ2:現状のコンバージョン率を評価する
### 2-1. 各記事のクリック率(CTR)を計測する
対象記事から外部リンクへのクリックを計測する。特にSubstack(knowledgestuck.substack.com)へのクリックを把握する。
```
プロパティID: 411479937
日付範囲: [前14日間] と [後14日間] の2期間比較
ディメンション: pagePath, linkUrl, dateRange
メトリクス: eventCount
ディメンションフィルター: AND条件
- pagePath = 対象記事のパス(完全一致)
- eventName = "click"(完全一致)
```
**計算式:**
```
CTR = Substackへのクリック数 ÷ セッション数 × 100 (%)
```
### 2-2. 優先する記事のスコアリング基準
以下の順で優先度を判断する:
1. **セッション数が多い**(検索で人が来ている)
2. **SubstackへのCTRが低い**(現在0%が最優先)
3. **記事テーマがSubstackの有料コンテンツに近い**(Obsidian / 知識管理 / 英語学習など)
4. **最近改善していない**(後述の判断方法参照)
### 2-3. Web一般論との比較
ブログ内のCTA(行動喚起リンク)の平均CTRは約2%(HubSpot等の調査)。
- **0%**: 改善なし → 最優先
- **1%未満**: 改善の余地あり
- **2%以上**: 一般的に良好水準
**2026年3月の実測値:**
| 記事 | セッション | CTR | 状態 |
|:--|:--|:--|:--|
| Anki英語学習 | 95 / 14日 | **2.1%** | 改善済み(成功モデル) |
| HHKB ペアリング | 65 / 14日 | **0%** | 未改善 |
| Zettelkasten管理 | 96 / 14日 | **0%** | 未改善 |
---
## フェーズ3:挿入するリンク先を選定する
### 3-1. 選定の基準(重要)
**「セッション数が多い記事」ではなく、以下の2軸で選ぶ:**
1. **記事テーマとの近さ** — 読んでいる記事の内容を「もう一段深く」できるSubstack記事
2. **エンゲージメント時間(滞在時間)が長い** — 実際に読まれているSubstack記事
### 3-2. Substackのエンゲージメント時間を取得する方法
```
プロパティID: 523521453(Substack)
日付範囲: 30daysAgo → today
ディメンション: pagePathPlusQueryString
メトリクス: sessions, userEngagementDuration(秒)
ディメンションフィルター: sessionSource = "goryugo.com"(含む)
並び順: userEngagementDuration 降順
```
これにより「goryugo.comから来た読者がどのSubstack記事を最も長く読んでいるか」が分かる。
**2026年3月の結果(goryugo.comリファラル、30日間・滞在時間順):**
```
/p/15obsidian: 平均97秒、18セッション
/p/obsidian002: 平均130秒、16セッション
/p/spaced-repetitionanki: 平均303秒(5分超)、10セッション ← 読書メモと完全一致
/p/obsidian001: 平均198秒、21セッション
/p/6cb: 平均234秒、2セッション
```
### 3-3. 記事別の最適リンク先一覧(2026年3月実施分)
| Publish記事 | 誘導先Substack記事 | 選定理由 |
|:--|:--|:--|
| Zettelkasten管理 | [RINKシステムとその運用例](https://knowledgestuck.substack.com/p/obv9) | Zettelkastenの進化版そのもの。内容直結 |
| HHKB ペアリング | [Spaced Repetitionでノートを育てる](https://knowledgestuck.substack.com/p/ks030) | 「良い道具で書く→ノートを育てる」の論理展開 |
| Obsidian 読書メモ | [Spaced Repetitionで見直し仕組みを実現](https://knowledgestuck.substack.com/p/spaced-repetitionanki) | 読書メモの「振り返り」に完全直結、滞在時間5分超 |
### 3-4. リンク先Substack記事のURLをローカルファイルから確認する方法
```bash
obsidian property:read path="Astro/ks/記事フォルダ/記事名.md" name="url"
obsidian property:read path="Astro/ks/記事フォルダ/記事名.md" name="title"
```
または関連記事を検索してから確認:
```bash
obsidian search query="キーワード" path="Astro/ks" format=json limit=5
```
---
## フェーズ4:Obsidian Publish記事の改善(完全自動)
Obsidian Publish記事の改善は**ローカルファイル編集→Publish→ブラウザ確認まで完全自動**で行える。
### 4-1. 対象ローカルファイルの特定
**方法A: URLパスがわかっている場合(obsidian searchを使う)**
```bash
obsidian search query="[URLパスのキーワード]" format=json
```
例:`/20220204/obsidian_zettelkasten/` の場合
```bash
obsidian search query="obsidian_zettelkasten" format=json
```
出力例:
```json
["Astro/Publish/ri.RINKシステム⛓️/ObsidianでZettelkasten(ツェッテルカステン)を使うときのノートの管理方法.md"]
```
**方法B: YAMLの `permalink` プロパティから逆引きする**
Obsidian CLIの `property:read` を使ってYAMLのurlやpermalinkを確認できるが、全ファイルを一括検索するには `grep` が高速:
```bash
grep -rl "permalink: /20220204/obsidian_zettelkasten/" \
"/Users/goryugo/Library/Mobile Documents/iCloud~md~obsidian/Documents/Obsidian_local/Astro" \
--include="*.md"
```
### 4-2. YAMLと本文の構造確認
```bash
obsidian read path="[相対パス]"
```
または
```bash
# 先頭20行だけ確認(YAMLフロントマターの確認のため)
# ファイルを直接view_fileツールで確認する
```
**Publish記事の典型的なYAML構造:**
```yaml
---
title: 記事タイトル
id: '34562'
categories:
- - カテゴリ名
permalink: /20220204/obsidian_zettelkasten/
date: 2022-02-04T06:00:00
---
```
`permalink` の値がObsidian PublishのURLパスに対応する。
### 4-3. calloutブロックの作成と挿入
**挿入位置**: YAMLフロントマター(`---`で囲まれた部分)の直後、最初の本文の**前**
**calloutのフォーマット:**
```markdown
> [!note] **📅 2026年追記:[この記事を深める文脈]たい方へ**
> [この記事の内容]を、**[Substackで提供しているもの]**をKnowledge Stackで公開しています。
>
> → [リンクテキスト(Knowledge Stack)](https://knowledgestuck.substack.com/p/SLUG)
>
> *無料購読でお試しいただけます。*
```
**calloutの種類の使い分け:**
- `[!note]` — 知識・情報系の記事(Zettelkasten、読書メモなど)
- `[!tip]` — ツール・ガジェット系の記事(HHKB など)
- `[!important]` — 緊急性や重要性が高い場合
**文言の作り方のポイント(重要!):**
1. **リンク先がセミナー案内等ではないことを確認する**(間違えると完全に逆効果)
2. タイトルと内容が一致しているか確認
3. 「AI×Obsidian」など汎用的すぎる説明ではなく、**記事テーマに具体的に合わせた文言**を使う
4. 「最新の実験・手法は毎週更新中」は入れてもよいが、実際に更新頻度が高い場合のみ
**実施例(Zettelkasten記事):**
```markdown
> [!note] **📅 2026年追記:Zettelkastenをさらに進化させたい方へ**
> この記事のZettelkastenの考え方を発展させ、**Obsidianのリンク構造を活かした独自の知識管理システム「RINKシステム」**の実践と運用例をKnowledge Stackで公開しています。
>
> → [現状のRINKシステムとその運用例(Knowledge Stack)](https://knowledgestuck.substack.com/p/obv9)
>
> *無料購読でお試しいただけます。*
```
**実施例(読書メモ記事):**
```markdown
> [!note] **📅 追記:読書メモを「忘れない仕組み」で活かしたい方へ**
> この記事で紹介した読書メモを、**Spaced Repetitionプラグインを使って定期的に見直す仕組み**をKnowledge Stackで詳しく解説しています。読書メモの「死蔵」を防ぐ実践的な方法です。
>
> → [Spaced Repetitionプラグインで「Ankiっぽい」ノート見直しの仕組みを実現(Knowledge Stack)](https://knowledgestuck.substack.com/p/spaced-repetitionanki)
>
> *無料購読でお試しいただけます。*
```
### 4-4. ファイルへの追記(コマンドで実施)
**`replace_file_content` ツールを使用して挿入:**
YAMLの `---` 直後の最初の本文行を `TargetContent` として指定し、callout + 本文を `ReplacementContent` に入れる。
```
TargetContent: "最初の本文行(例:jMatsuzakiさんが...)"
ReplacementContent:
> [!note] **📅 2026年追記:...**
> ...
>
> → [リンクテキスト](URL)
>
> *無料購読でお試しいただけます。*
最初の本文行(元のテキスト)
```
### 4-5. Obsidianでノートを開く
```bash
obsidian open path="[相対パス]"
```
例:
```bash
obsidian open path="Astro/Publish/ri.RINKシステム⛓️/ObsidianでZettelkasten(ツェッテルカステン)を使うときのノートの管理方法.md"
```
### 4-6. Obsidian Publishに公開する(自動化の核心)
```bash
obsidian publish:add path="[相対パス]"
```
例:
```bash
obsidian publish:add path="Astro/Publish/ri.RINKシステム⛓️/ObsidianでZettelkasten(ツェッテルカステン)を使うときのノートの管理方法.md"
```
**複数ファイルを一括でPublishする場合:**
```bash
obsidian publish:add path="ファイル1.md" && obsidian publish:add path="ファイル2.md" && obsidian publish:add path="ファイル3.md"
```
成功すると `Published: ファイルパス` と表示される。
### 4-7. 公開後の確認(オプション)
ブラウザでURLを開いてcalloutが正しく表示されているか確認する。
`obsidian publish:open path="[ファイルパス]"` でPublishの公開ページを開くこともできる。
---
## フェーズ5:Substack記事の改善(ローカルまで自動、反映は手動)
Substackは `obsidian publish:add` のような自動公開コマンドがないため、以下の分担になる:
- **Antigravity担当**: ローカルファイルを編集 → Obsidianで開く → ブラウザでSubstack編集画面を開く
- **ユーザー担当**: Substack編集画面で内容を手動反映(貼り付けまたは直接編集)
### 5-1. ローカルファイルの特定方法
**方法A: SubstackのURLのslugからgrepで検索**
Substack記事のURL(例: `https://knowledgestuck.substack.com/p/obsidian-bases-b15`)のslug部分を使ってgrep:
```bash
# Astro/ks 以下を対象にURL文字列で検索
grep -rl "/p/obsidian-bases-b15" \
"/Users/goryugo/Library/Mobile Documents/iCloud~md~obsidian/Documents/Obsidian_local/Astro" \
--include="*.md" -l | head -5
```
**方法B: obsidian searchで記事タイトルキーワードを検索**
```bash
obsidian search query="Obsidian Bases タスク管理" path="Astro/ks" format=json limit=5
```
**方法C: YAMLのurlプロパティを確認**
見つかったファイルのURLプロパティが正しいか確認:
```bash
obsidian property:read path="Astro/ks/250910_Obsidian_Basesを使ったタスク管理の実例.md" name="url"
```
出力例:`https://knowledgestuck.substack.com/p/obsidian-bases-b15`
### 5-2. ローカルファイルの内容確認
```bash
obsidian read path="[相対パス]"
```
または長いファイルは `view_file` ツールで直接確認する。
**Substack記事のローカルファイルの典型的な構造(`Astro/ks/` 以下):**
```yaml
---
title: 記事タイトル
description: "記事の要約"
author: goryugo
url: https://knowledgestuck.substack.com/p/SLUG
date_published: 2025-09-10
---
本文...
## 無料でここまで再現できる
...(無料で試せる内容)
## 続きを使う
...(有料会員向けCTA)
→ [有料会員登録](https://knowledgestuck.substack.com/subscribe)
```
### 5-3. 改善内容の設計
Substack記事への改善は主に以下の2箇所:
**① 有料特典の案内の直前(関連記事の内部リンク追加)**
読者が「無料部分を読み終えた」タイミングで、深い学びに誘導する。
```markdown
**このシステムをさらに発展させた実践例も公開しています。**
- [関連記事タイトル1](URL) — ひとことの補足
- [関連記事タイトル2](URL) — ひとことの補足
```
**② 末尾のCTA見出しと文言の改善**
| 修正前(受動的) | 修正後(能動的) |
|:--|:--|
| `## 続きを使う` | `## この設定ファイルを今すぐ試す` |
| `続きをご利用ください。→ [有料会員登録]` | `ダウンロードして読み込むだけで同じ環境が再現できます。→ [有料会員登録でファイルを受け取る]` |
### 5-4. ローカルファイルを編集する
`multi_replace_file_content` または `replace_file_content` ツールを使用する。
**注意:** Substack記事はObsidianのcallout記法(`>[!note]`)が使えない。通常のMarkdown記法(太字、リンク等)を使う。
### 5-5. Obsidianノートとデフォルトブラウザを同時に開く(必須)
AIがローカルファイルの編集を終えたら、ユーザーが「ローカルファイルからコピーして、Substackの編集画面にペーストする」という作業をスムーズに行えるよう、**必ず「Obsidianのノート」と「Substackのブラウザ画面」の両方をセットで開くこと。**
```bash
# Obsidianで該当ノートを開く
obsidian open path="Astro/ks/250910_Obsidian_Basesを使ったタスク管理の実例.md"
# デフォルトブラウザでSubstackの公開ページを開く
open "https://knowledgestuck.substack.com/p/<SLUG>"
```
※公開URLを開いて、画面上部の「Edit」メニューからユーザーが手動で編集画面に入る形式が現在最も確実です。(ID検索からの遷移コマンドは廃止されました)
---
## 成功モデル:Anki記事の追記パターン
Anki記事(`/20210309/anki-english/`)は1〜2週前に改善を実施済みで、以下の形式が成功しています。
**実際に追記された内容(末尾):**
```html
Ankiなどを使った勉強の仕方、Obsidianなどの知識を整理するツールに関する無料のニュースレター(メルマガ)を始めました。
気になる方は是非登録してみてください(気に入らなかったら1クリックで解除できます)
<iframe src="https://knowledgestuck.substack.com/embed" ...></iframe>
```
**成果(2週間前後の比較):**
- セッション数: ほぼ同等(95 vs 93)
- クリック数: **3回 → 12回(4倍)**
- CTR: **3.2% → 12.6%**
---
## 注意事項・やってはいけないこと
### ❌ リンク先記事の内容を確認しないで設定する
最初の実施時に犯した失敗:`antigravity2` というSlugのSubstack記事が「セミナー案内」の内容だったにもかかわらず、「AIとObsidianを組み合わせた〜」という文言でリンクしてしまった。記事の内容とcalloutの文言が完全に乖離しており、読者の信頼を損なう。
**対策:** リンク先を設定する前に必ず以下を確認する:
1. `obsidian property:read path="..." name="title"` でタイトルを確認
2. 必要に応じて `obsidian read path="..."` で本文を確認
3. SubstackのURL(`https://knowledgestuck.substack.com/p/SLUG`)をブラウザで開いて実際の内容を見る
### ❌ アクセス数だけで誘導先記事を選ぶ
アクセス数が多くても、**読まれていない(滞在時間が短い)**記事に誘導しても効果が薄い。必ず「内容の近さ × 滞在時間の長さ」の両面で判断する。
### ❌ Substackの改善を `obsidian publish:add` しようとする
SubstackはObsidian Publishとは別システム。 `publish:add` はObsidian Publish専用。Substackは手動反映が必要。
### ⚠️ browser_subagentでSubstack編集画面を開かない
ログイン状態が引き継がれず、編集が困難になる。必ず `open "URL"` コマンドでデフォルトブラウザに開く。
---
## 今後の課題
### 「最近改善済みの記事をスキップする」判断方法(未解決)
現在は手動で判断しているが、以下の方法が考えられる:
**案1: YAMLにメタデータを追加する**
改善実施時に `last_cta_updated: 2026-03-02` などのプロパティを追記し、Obsidian CLIで読み取る:
```bash
obsidian property:read path="..." name="last_cta_updated"
```
**案2: calloutの有無をgrepで確認する**
```bash
grep -l "Knowledge Stack" "対象ファイルパス"
```
callout中の固定文言("Knowledge Stack" や "無料購読でお試し" など)が含まれていれば改善済みとみなす。
**案3: GA4でCTRを計算して閾値以下の記事だけ対象にする**
CTR 2%以上の記事はスキップ、未満の記事のみ改善対象とする(毎回GA4で計測して判断)。
---
## 実行チェックリスト
### Obsidian Publish記事の改善(1記事あたり)
- [ ] GA4で対象記事のパスを特定(30日・7日セッション数を確認)
- [ ] `obsidian search` でローカルファイルを特定
- [ ] `obsidian read` で本文構造を確認(callout挿入位置を確認)
- [ ] 誘導先Substack記事を選定(内容一致 × 滞在時間でGA4確認)
- [ ] 誘導先記事のタイトルとURLを `obsidian property:read` で確認
- [ ] callout文言を作成(文言とリンク先の内容が一致していることを確認!)
- [ ] `replace_file_content` でcalloutを挿入
- [ ] `obsidian open path="..."` でノートを開く
- [ ] `obsidian publish:add path="..."` でPublish
- [ ] ブラウザで公開ページを開いてcalloutの表示を確認
### Substack記事の改善(1記事あたり)
- [ ] GA4で対象記事の `/p/SLUG` を特定(セッション数 × 滞在時間を確認)
- [ ] `grep -rl "/p/SLUG" Astro/ --include="*.md"` でローカルファイルを特定
- [ ] `obsidian property:read ... name="url"` でURLを確認
- [ ] `obsidian read` で本文構造を確認(改善箇所を特定)
- [ ] 関連Substack記事リンクと改善CTAを設計
- [ ] `multi_replace_file_content` で編集
- [ ] `obsidian open path="..."` でノートを開く
- [ ] `curl ... | python3 ...` でpost IDを取得
- [ ] `open "https://knowledgestuck.substack.com/publish/post/{ID}"` でデフォルトブラウザに編集画面を開く
- [ ] (ユーザー) Substack編集画面で手動反映
---
## コマンドリファレンス一覧
```bash
# ファイル検索
obsidian search query="キーワード" format=json
obsidian search query="キーワード" path="Astro/ks" format=json limit=5
grep -rl "/p/SLUG" "/Users/goryugo/Library/Mobile Documents/iCloud~md~obsidian/Documents/Obsidian_local/Astro" --include="*.md" -l
# YAMLプロパティ取得
obsidian property:read path="相対パス" name="url"
obsidian property:read path="相対パス" name="title"
# 本文読み取り
obsidian read path="相対パス"
# Obsidianで開く
obsidian open path="相対パス"
# Obsidian Publishに公開
obsidian publish:add path="相対パス"
# Substack Post ID取得
curl -s "https://knowledgestuck.substack.com/api/v1/posts/SLUG" \
| python3 -c "import sys, json; d=json.load(sys.stdin); print(d.get('id'))"
# Substack編集画面をデフォルトブラウザで開く
open "https://knowledgestuck.substack.com/publish/post/{ID}"
```