📘 HubSpot CMS 組み込み構築 教科書
Chapter 10 — Final Chapter

保守・運用・引き継ぎ設計

納品はゴールではなくスタートです。本章では、クライアントが長期にわたってサイトを安定運用できるよう、保守体制の設計・引き継ぎドキュメントの作り方・運用を見据えたコーディング規約・HubSpotアップデートへの対応まで体系的に解説します。

🎯 対象レベル:全レベル(必読)
⏱ 読了目安:60分
🔗 前章:第9章 開発環境・CLI・デプロイワークフロー

この章の内容

  1. 納品後の保守体制を設計する
  2. クライアントへの引き継ぎドキュメント設計
  3. 運用を見据えたモジュール・テンプレート設計
  4. コーディング規約とコメント規約
  5. HubSpot アップデートへの対応と定期メンテナンス
  6. よくある運用トラブルと解決策
  7. パフォーマンスの定期モニタリング
  8. 長期運用チェックリスト
  9. 教科書のまとめ:HubSpot CMS 開発者として
Section 10-1

納品後の保守体制を設計する

多くのプロジェクトで「納品したら終わり」という認識のまま運用フェーズに入り、 後から混乱が生じます。保守体制は納品前に設計し、クライアントと合意するものです。

保守フェーズの役割分担を明確にする

HubSpot サイトの運用には、技術的な保守とコンテンツ運用の2つの軸があります。 誰が何を担当するかを最初に整理します。

⚙️ エンジニア担当

  • テンプレート・モジュールの改修
  • 新規モジュールの開発
  • CLI によるデプロイ
  • パフォーマンス改善
  • HubSpotアップデート対応
  • セキュリティ確認

📣 マーケター担当

  • ブログ記事・ページの作成・編集
  • CTAの設定・変更
  • フォームの作成・編集
  • HubDB レコードの管理
  • ワークフローの設定
  • レポート確認

🔑 クライアント担当

  • コンテンツ承認・公開判断
  • 保守依頼の窓口
  • HubSpot プラン管理
  • ユーザー権限管理
  • 請求・契約管理

保守契約の種類と内容定義

契約種別主な内容目安工数/月
スポット保守 依頼ベース。発生した改修・追加開発を都度見積もり対応する。 案件ごと
ライト保守 月次のパフォーマンス確認・軽微な修正対応(1〜2時間/月程度) 2〜4h/月
スタンダード保守 軽微な改修・新モジュール開発1件程度・月次レポート提出含む 8〜16h/月
フル保守 コンテンツ更新代行含む・SEO施策・A/Bテスト・機能追加開発 20h〜/月

保守依頼フローの設計

1

依頼受付(Slack / メール / チケット)

窓口を1つに統一する。「デザインを直したい」等の曖昧な依頼は具体的な要件ヒアリングを行う。スクリーンショット・URLを必ず添付してもらうルールを作る。

2

影響範囲の確認・工数見積もり

変更が他のページ・モジュールに影響しないか確認する。契約内工数で対応可能かを判断し、超過する場合は追加見積もりを提示する。

3

開発ポータルで実装・確認依頼

本番には直接触れず、必ず開発ポータルで実装してからクライアントに確認URLを共有する。

4

クライアント承認

口頭ではなく書面(メール・Slack)で承認をもらうことを原則とする。「問題ありません」の一言でもOK。

5

本番デプロイ・確認・報告

git tag を打ち、本番デプロイ後に対象ページを確認。作業完了をクライアントに報告してチケットをクローズ。


Section 10-2

クライアントへの引き継ぎドキュメント設計

引き継ぎドキュメントはマーケター・コンテンツ担当者が自走できるようにするためのものです。 エンジニア視点で書くと「難しすぎる」ドキュメントになります。 読む相手に合わせて内容を設計することが重要です。

引き継ぎドキュメントの構成

📄 クライアント向け 引き継ぎドキュメント 目次構成

① サイト概要・基本情報

  • HubSpot ポータルIDとログインURL
  • 本番URL・ステージングURL
  • ご利用プランと含まれる機能
  • 契約更新日・請求先情報の確認方法
  • 技術担当者の連絡先(エンジニア)

② 日常的な操作ガイド

  • ブログ記事を新規作成・公開する手順
  • 既存ページのテキスト・画像を編集する手順
  • HubDB にレコードを追加・編集する手順
  • フォームの内容を変更する手順
  • ファイルマネージャーに画像をアップロードする手順

③ カスタムモジュールの使い方

  • モジュール一覧と各モジュールの用途説明
  • よく使うモジュールのフィールド設定ガイド
  • 画像の推奨サイズ・ファイル形式
  • 「やってはいけないこと」の明示(壊れる操作)

④ タグ・URL設計ルール

  • ブログタグの命名規則(type: / cat: / status:)
  • URLスラッグの命名ルール(英数字・ハイフン)
  • ページタイトル・メタdescriptionの書き方ガイド

⑤ よくある質問(FAQ)

  • 画像が表示されない場合の対処法
  • ページが404になった場合の対処法
  • フォームが送信されない場合の確認箇所
  • 保守依頼の連絡方法と対応目安時間

モジュール別操作ガイドのテンプレート

モジュールが多い場合、すべてを1枚のドキュメントに書くと読みにくくなります。 モジュール1つにつき1ページのスタイルで、 Notionや社内Wikiに整理するのが最も使われやすい形式です。

モジュール操作ガイドのページ構成テンプレート(Notion等向け)
# ヒーローバナー モジュール操作ガイド

## このモジュールは何ですか?
ページ最上部に大きな画像とキャッチコピーを表示するバナーです。
トップページ・サービスページ等に配置されています。

## フィールドの説明

| フィールド名 | 内容 | 注意点 |
|-------------|------|--------|
| 見出し | バナーのメインテキスト | 最大30文字推奨 |
| サブ見出し | 見出し下の補足テキスト | 省略可 |
| 背景画像 | バナー全体の背景画像 | 推奨サイズ: 1440x640px |
| CTAボタンのテキスト | ボタンに表示する文言 | 最大15文字推奨 |
| CTAボタンのリンク | ボタンのリンク先URL | 外部リンクは別タブで開く |

## 推奨画像サイズ
- 幅:1440px 以上
- 高さ:640px 〜 800px
- ファイル形式:JPG(写真)/ PNG(透過あり)
- ファイルサイズ:2MB以下に圧縮推奨

## やってはいけないこと
⚠️ 縦長の画像(1:1 以下の比率)は使わないでください。
   PC表示でレイアウトが崩れる場合があります。
⚠️ テキスト入りの画像を背景に使うと、
   モバイルで読めなくなる場合があります。
💡 動画マニュアルが最も効果的

テキストドキュメントと合わせて、Loomやスクリーンレコーダーで操作動画を録画して渡すと クライアントの自走率が劇的に上がります。 「ブログ記事を新規作成して公開するまでの5分動画」1本あるだけで、 同じ質問が何度も来なくなります。 特に HubDB の操作・フォームの変更・モジュールの追加方法は動画で伝えると効果大です。


Section 10-3

運用を見据えたモジュール・テンプレート設計

「動くコード」と「運用しやすいコード」は異なります。 開発時の1時間の工夫が、クライアントの運用で何十時間もの迷いを省きます。

マーケターが触れる範囲とエンジニアが触れる範囲の分離

設計の原則具体的な実装
フィールドで制御できることはフィールドにする 色・テキスト・リンク・画像はすべて fields.json のフィールドで管理。コードを触らなくても変更できるようにする。
デフォルト値を必ず設定する すべてのフィールドに意味のある default 値を設定する。未設定でも「それなりに見える」状態を保つ。
フィールドラベルを日本語にする label を英語のまま放置しない。「bg_color」より「背景色」の方がマーケターが迷わない。
help_text で入力ガイドを添える 画像フィールドには「推奨サイズ: 1440x640px」、テキストフィールドには「最大〇文字推奨」等を help_text に記載する。
壊れやすい操作を choice で制限する レイアウト切り替えを自由入力ではなく choice フィールドで選択式にする。想定外の値の入力を防ぐ。

運用しやすい fields.json の書き方

fields.json — 運用しやすいフィールド設計の実例
[
  {
    "type": "text",
    "name": "heading",
    "label": "見出し",
    "required": true,
    "default": "見出しテキストを入力してください",
    "help_text": "最大 30 文字推奨。長すぎるとスマホで折り返します。"
  },
  {
    "type": "image",
    "name": "bg_image",
    "label": "背景画像",
    "help_text": "推奨サイズ: 1440×640px。JPG形式・2MB以下に圧縮してください。",
    "default": {
      "src": "",
      "alt": "",
      "width": 1440,
      "height": 640
    }
  },
  {
    "type": "choice",
    "name": "layout",
    "label": "レイアウト",
    "help_text": "テキストの配置位置を選択してください。",
    "choices": [
      ["center", "中央(デフォルト)"],
      ["left",   "左寄せ"],
      ["right",  "右寄せ"]
    ],
    "default": "center",
    "display": "radio"
  },
  {
    // STYLE タブのフィールドは「上級者向け」として
    // 通常の編集画面から切り離す
    "type": "color",
    "name": "overlay_color",
    "label": "オーバーレイカラー",
    "tab": "STYLE",
    "help_text": "背景画像の上に重ねる色。透明度も設定できます。",
    "default": { "color": "#000000", "opacity": 40 }
  }
]

テンプレートへのコメント設計

テンプレートファイルには、後から触れる人(将来の自分・引き継いだエンジニア)のために コメントを残します。「何をしているか」より「なぜこうしたか」を書くのが原則です。

templates/blog-post.html — 保守しやすいコメントの実例
{#
  =====================================================
  ブログ記事テンプレート (blog-post.html)
  =====================================================
  【用途】ブログ記事の詳細ページ
  【継承】layouts/base.html
  【DnD】なし(固定レイアウト)

  【更新履歴】
  2024-03-15  v1.2  コンテンツ種別別フォーム切り替えを追加
  2024-01-10  v1.1  前後記事ナビゲーションを追加
  2023-11-01  v1.0  初期リリース

  【注意点】
  - タグの命名規則は README.md の「タグ設計」を参照すること
  - フォームIDはこのファイル内の form_config 辞書で管理している
  - フォームを追加したい場合は form_config に追記すること
  =====================================================
#}
{% extends "./layouts/base.html" %}

{# ===== コンテンツ種別の判定 =====
   タグのプレフィックスで種別を判定する。
   詳細は第6章「タグ設計戦略」を参照。
   type: タグが複数付いている場合は最後に見つかった値が使われる(運用上1つのみ推奨)
===================================================== #}
{% set ns = namespace(content_type="blog") %}
{% for tag in content.tag_list %}
  {% if tag.slug starts_with "type:" %}
    {% set ns.content_type = tag.slug|replace("type:","") %}
  {% endif %}
{% endfor %}

{# ===== フォーム設定辞書 =====
   コンテンツ種別ごとのフォームIDとリダイレクト先を管理。
   新しい種別を追加する際はここに追記すれば OK。
   フォームIDはHubSpot管理画面のフォーム詳細URLで確認できる。
===================================================== #}
{% set form_config = {
  "blog"       : { "id": "BLOG_FORM_ID",       "redirect": "/thanks/contact"    },
  "seminar"    : { "id": "SEMINAR_FORM_ID",    "redirect": "/thanks/seminar"    },
  "whitepaper" : { "id": "WHITEPAPER_FORM_ID", "redirect": "/thanks/whitepaper" }
} %}

Section 10-4

コーディング規約とコメント規約

チームで開発・保守する場合、規約がないとコードの書き方がバラバラになり 保守コストが上がります。最小限でも明文化された規約が必要です。

HubSpot CMS 開発コーディング規約(推奨テンプレート)

CODING_RULES.md — コーディング規約ドキュメントのテンプレート
# HubSpot CMS コーディング規約

## ファイル・ディレクトリ命名規則
- ファイル名・ディレクトリ名:kebab-case(例: hero-banner, blog-post)
- モジュール名:kebab-case + .module(例: hero-banner.module)
- CSS クラス名:BEM(Block__Element--Modifier)
- HubL 変数名:snake_case(例: content_type, form_id)

## HubL 規約

### 変数定義
- ループ外で使う変数は冒頭でまとめて定義する
- 辞書(マップ)は set で定義してから参照する
- namespace(ns)は状態を持つループ処理でのみ使用する

### テンプレートコメント
- ファイル先頭:目的・更新履歴・注意事項を記載する(必須)
- 複雑なロジック:「なぜこうしたか」を書く(何をしているかは読めばわかる)
- TODO:「TODO: 」プレフィックスで検索しやすくする

### 存在チェックの原則
- image フィールド:{% if module.image.src %} でチェック
- link フィールド :{% if module.link.url %}  でチェック
- テキスト        :{% if module.text %}       でチェック
- 存在チェックなしで .src 等を参照してはいけない

## CSS 規約

### 命名規則(BEM)
.module-name {}              ← Block
.module-name__element {}     ← Element
.module-name--modifier {}    ← Modifier
.module-name__element--mod{} ← Element + Modifier

### レスポンシブ
- モバイルファースト(min-width でブレークポイントを上書き)
- ブレークポイントは CSS 変数で統一する
  --bp-sm: 480px;
  --bp-md: 768px;
  --bp-lg: 1024px;
  --bp-xl: 1280px;

### CSS変数の参照
- theme.json のカラー・フォントは必ず CSS 変数経由で参照する
- 直接値(#ff0000 等)はハードコードしない

## アクセシビリティ規約
- 全 img タグに alt 属性を設定する(装飾画像は alt="")
- インタラクティブ要素に aria-label を設定する
- カラーコントラスト比は WCAG AA(4.5:1)以上を維持する
- キーボード操作でフォーカスが視覚的に確認できること

## Git コミットメッセージ規約
feat:    新機能追加
fix:     バグ修正
style:   見た目の調整(機能変更なし)
refactor:リファクタリング
docs:    ドキュメントのみの変更
deploy:  本番デプロイ(バージョンタグと合わせて使用)

Section 10-5

HubSpot アップデートへの対応と定期メンテナンス

HubSpotは継続的にアップデートされるプラットフォームです。 機能追加・UI変更・非推奨化への対応を定期的に行うことで、 サイトの品質を長期維持できます。

定期メンテナンスの項目と頻度

項目頻度内容
CLI バージョン確認・更新 月1回 npm update -g @hubspot/cli で最新版に更新。変更履歴(CHANGELOG)を確認してBreaking Changeがないか確認する。
PageSpeed Insights 確認 月1回 代表的なページ(トップ・ブログ一覧・記事詳細)のスコアを記録。前月比で悪化していないか確認する。
Search Console 確認 週1回 カバレッジエラー・Core Web Vitals の問題ページを確認。新たなエラーがあれば即対応する。
HubSpot 製品アップデート確認 月1回 HubSpotの「製品アップデート」ページと開発者向けChangelog(developers.hubspot.com)を確認する。
リンク切れチェック 3ヶ月に1回 Screaming Frog 等のツールでサイト全体のリンク切れを確認する。
Personal Access Key の更新 150日ごと キーの期限(180日)切れ前に更新。GitHub Secrets も同時に更新する。
HubSpot テンプレートの非推奨確認 半年に1回 使用しているHubL機能が非推奨(deprecated)になっていないかHubSpot開発者ドキュメントで確認する。

HubSpot アップデートで影響を受けやすい箇所

ℹ️ HubSpot 開発者向け情報源

開発者ドキュメント: developers.hubspot.com/docs/cms
製品アップデート: www.hubspot.com/product-updates
開発者フォーラム: community.hubspot.com/t5/HubSpot-Developers
GitHub(HubSpot CLI): github.com/HubSpot/hubspot-cli/releases
HubSpot Developer Changelog: developers.hubspot.com/changelog


Section 10-6

よくある運用トラブルと解決策

トラブルシューティングガイド

症状原因の確認箇所解決策
ページが真っ白になった 直前のデプロイ内容・HubL の構文エラー hs lint でエラー確認 → 直前のgit tagをチェックアウトしてロールバック
モジュールが表示されない fields.json の構文エラー・required フィールドの未設定 HubSpotのページエディターでモジュールを選択してエラーメッセージを確認
CSS が反映されない ブラウザのキャッシュ・get_asset_url の使用有無 ハード再読み込み(Ctrl+Shift+R)でキャッシュをクリア。CLIで再アップロード。
フォームが送信できない フォームIDの正確性・ポータルIDの一致・広告ブロッカー 別ブラウザ・シークレットモードで確認。HubSpot管理画面でフォームのIDを再確認。
hs upload が失敗する 認証トークンの期限切れ・ネットワーク・ファイルパスの誤り hs auth で再認証。--portal フラグの指定を確認。
HubDB のデータが表示されない テーブルのPublished状態・クエリの条件・フィールド名の誤記 HubDB管理画面でテーブルが「Published」になっているか確認。クエリパラメータを単純化してデバッグ。
スマホでレイアウトが崩れた 画像の width/height 未指定・CSS の flexbox 設定 Chrome DevTools でレスポンシブモードに切り替えて要素を特定。aspect-ratio または width/height を明示する。
ページのOGP画像が古いまま SNSのキャッシュ Facebook: OGデバッガー(developers.facebook.com/tools/debug)でキャッシュをクリア。Twitter: Card Validator で確認。

HubL デバッグの基本テクニック

HubL — デバッグ用の出力パターン
{# ===== 変数の中身を確認する =====
   本番環境では必ず削除すること!
===================================================== #}

{# ① 変数の型と値を確認 #}
<pre>{{ module|pprint }}</pre>

{# ② ループカウンタの確認 #}
{% for item in module.items %}
  {# loop の状態を出力 #}
  <p>index:{{ loop.index }} / first:{{ loop.first }} / last:{{ loop.last }} / length:{{ loop.length }}</p>
{% endfor %}

{# ③ 条件分岐の確認(判定結果を出力)#}
<p>content_type: {{ ns.content_type }}</p>
<p>is_featured: {{ ns.is_featured }}</p>

{# ④ HubDB データの確認 #}
{% set rows = hubdb_table_rows("my_table") %}
<p>取得件数: {{ rows|length }}</p>
<pre>{{ rows|pprint }}</pre>

{# ⑤ request オブジェクトの確認(URLパラメータ等)#}
<pre>{{ request|pprint }}</pre>

Section 10-7

パフォーマンスの定期モニタリング

月次パフォーマンスレポートの構成

保守契約に含まれる場合、月次でクライアントにレポートを提出します。以下の項目を含めると信頼性が高まります。

📊 月次パフォーマンスレポート 記載項目

Core Web Vitals(PageSpeed Insights)

  • 対象URL(トップページ・ブログ一覧・記事詳細)
  • LCP / CLS / INP のスコアと前月比
  • 改善が必要な項目と対応予定

Search Console サマリー

  • カバレッジエラーの件数と種類
  • Core Web Vitals の「不良 URL」件数
  • 新たに発生したエラーと対応状況

GA4 サマリー(任意)

  • セッション数・コンバージョン数の前月比
  • 直帰率・平均エンゲージメント時間
  • フォーム送信数(コンバージョン)

実施した保守作業

  • 修正・改修の内容と対象ページ
  • デプロイ日時とバージョン
  • 次月対応予定の項目

Section 10-8

長期運用チェックリスト

🚀 納品時(引き継ぎ直前)
hubspot.config.yml が .gitignore に追加されている Personal Access Key が外部に漏れる経路を断つ。
本番ポータルへの watch が package.json に含まれていない dev スクリプトが開発ポータルを向いていることを再確認する。
引き継ぎドキュメントとモジュール操作ガイドを作成・共有した NotionまたはConfluenceへのリンクをクライアントに送付済み。
サンクスページに noindex が設定されている /thanks/* 系のページをSearch Consoleで確認する。
本番のGA4・GTMが正しく動作している Chrome DevTools の Network タブで gtag のリクエストを確認する。
git tag v1.0.0 を打ち、初回リリースのコミットを記録した 本番デプロイとセットでタグを付ける習慣をここから始める。
📅 月次メンテナンス
PageSpeed Insights でコアページを計測・記録した スプレッドシートで推移を記録すると劣化に気づきやすい。
Search Console でカバレッジエラーを確認した 新規エラーがある場合は原因を特定して対応する。
HubSpot 製品アップデートを確認した 使用している機能に関連するアップデートがないかチェックする。
@hubspot/cli の最新バージョンを確認した npm outdated -g @hubspot/cli で更新があれば適用する。
🗓️ 半年・年次メンテナンス
Personal Access Key を更新した(150日ごと) GitHub Secrets も同時に更新。カレンダーリマインダーを再設定する。
リンク切れチェックを実施した Screaming Frog 等でサイト全体の 404 リンクを確認する。
引き継ぎドキュメントのスクリーンショットを最新化した HubSpot の管理画面 UI が変わっていないか確認し、古い画像を差し替える。
使用中の HubL 関数が非推奨になっていないか確認した HubSpot 開発者ドキュメントの Deprecated 一覧を確認する。

Section 10-9

教科書のまとめ:HubSpot CMS 開発者として

📌 第10章のポイント

保守体制は納品前に設計する

役割分担・依頼フロー・契約内容を事前に合意しておく。曖昧なまま運用フェーズに入ると認識の食い違いが起きる。

引き継ぎドキュメントは読む人に合わせる

マーケター向けには「どう操作するか」を。エンジニア向けには「なぜこう設計したか」を。両者の視点を分けてドキュメントを書く。

運用しやすいコードは設計から決まる

help_text・日本語ラベル・choice による入力制限・デフォルト値。開発時の1時間の丁寧さがクライアントの何十時間かの迷いを防ぐ。

定期メンテナンスの習慣化

月次のPageSpeed・Search Console確認と、150日ごとのトークン更新。カレンダーに入れて「仕組みとして」対応する。

🎓

HubSpot CMS 組み込み構築 教科書 — 完

第0章の全体像から、HubL・テンプレート・モジュール・データ活用・フォーム・パフォーマンス・CLI・そして運用設計まで。
この教科書で学んだ技術と設計思想は、HubSpot CMS の案件に限らず、
「エンジニアとしてクライアントとどう向き合うか」という問いへの答えでもあります。

コードは手段です。クライアントのビジネスを前進させることが目的です。

現場で迷ったときは、この教科書を辞書として開いてください。

お疲れさまでした!

章一覧に戻る
← 章一覧へ