ノーコードのワークフローアクションでは「あと一歩」届かない処理がある——複雑な計算ロジック・外部 API との通信・複数プロパティを組み合わせた条件判定・HubSpot の標準アクションにない独自ビジネスルール。本章では カスタムコードアクションの仕組み・JavaScript と Python(Beta)の使い方・実務で頻出の10パターンのコードサンプル・セキュリティとエラーハンドリング・本番運用のベストプラクティスを体系的に解説する。
カスタムコードアクション(Custom Code Action)はワークフローの中に JavaScript または Python のコードブロックを埋め込み、HubSpot のサーバーレス環境(AWS Lambda 相当)上で実行させる機能だ。外部サーバーを用意せず、HubSpot ポータルのワークフロー UI 上でコードを書くだけで高度な処理が実現できる。
| 比較項目 | JavaScript(Node.js) | Python(Beta) |
|---|---|---|
| 提供状況 | ✓ GA(正式リリース・安定) | △ Beta(2025年〜、本番利用は要注意) |
| Node / Python バージョン | Node.js 18.x | Python 3.9 |
| 標準ライブラリ | Node.js 標準モジュール(https, crypto など) | Python 標準ライブラリ + requests, pandas, numpy |
| 向いている用途 | API 連携・JSON 操作・文字列処理・非同期処理 | データ変換・統計計算・pandas を使ったデータ加工 |
| 推奨ユーザー | フロントエンドエンジニア・RevOps 全般 | データエンジニア・アナリスト・Python 経験者 |
| タイムアウト上限 | 20秒 | 30秒 |
| secrets(環境変数) | ✓ 対応 | ✓ 対応 |
Python サポートはまだ Beta のため、本番の重要なワークフローには JavaScript を推奨する。大量の数値データを pandas で加工したい・機械学習モデルと連携したいといった特定ニーズがある場合のみ Python を選択し、それ以外は JavaScript で統一するとトラブルシューティングが容易になる。
カスタムコードアクションの JavaScript には決まった構造がある。入力(inputFields)からプロパティ値を受け取り、処理を行い、出力(outputFields)に書き戻すという3ステップだ。まずこの基本パターンを完全に理解することが出発点になる。
コードを書く前に、ワークフローエディター上で「Input Fields(入力)」と「Output Fields(出力)」を事前に宣言する必要がある。Input Fields ではどのプロパティをコードに渡すかを選択し、Output Fields では「コードが返す変数名」と「書き込み先の HubSpot プロパティ」をマッピングする。
| 設定項目 | 場所 | 設定内容 | 注意点 |
|---|---|---|---|
| Input Fields | コードエディター左パネル「Inputs」 | コードに渡したいプロパティを選択(例:email, company, custom_score) | 宣言していないプロパティは event.inputFields で取得できない |
| Output Fields | コードエディター左パネル「Outputs」 | 変数名(例:total_score)と書き込み先プロパティ(例:カスタムプロパティ「total_score」)をマッピング | コード内の outputFields のキー名と Output 宣言の変数名を完全一致させること |
| Secrets(環境変数) | Settings → Private App / Secrets | API キー等の機密情報を「シークレット名」で登録し、コード内で process.env.シークレット名 で参照 | コード内に API キーを直書きしない。GitHub に push した瞬間に漏洩する。 |
2025年から提供が始まった Python サポートは、データエンジニアやアナリストにとって大きな追加だ。pandas・numpy・requests などのライブラリがプリインストールされており、CSV データの変換やデータフレームを使った集計がワークフロー内で直接実行できる。
以下に、実際の HubSpot 運用で最もよく使われるカスタムコードアクションのパターンをまとめる。各パターンはそのままコピーして使える実用的なサンプルだ。
カスタムコードアクションは強力だが、エラーが発生したときにワークフロー全体が止まる・機密情報が漏洩する・実行コストが爆発するといったリスクも伴う。本番環境への展開前に以下のベストプラクティスを必ず確認する。
| ルール | 悪い例(NG) | 良い例(OK) |
|---|---|---|
| API キーの管理 | コード内に直書き: const key = "sk-abc123..." |
Secrets に登録して参照: process.env.OPENAI_KEY |
| HubSpot API トークン | ハードコード or 広権限の Private App Token を使う | 必要なスコープのみを持つ専用 Private App Token を作成して Secrets に保存 |
| エラーログの内容 | console.log(apiKey) でシークレット情報をログに出力 | ログには変数名やエラーメッセージのみ出力。シークレット値は絶対にログに出さない |
| 外部通信先 | ユーザー入力値をそのまま URL に組み込む(SSRF のリスク) | 通信先 URL はハードコードまたは許可リストと照合してから使用 |
① テストは必ずサンドボックスで行う——本番ポータルでいきなりコードを実行するのは厳禁。HubSpot のサンドボックス(Developer Sandbox)でまず動作確認してから本番に適用する。
② WF 名・コードにコメントをつける——「誰が・いつ・なぜこのロジックを書いたか」をコメントで残す。3ヶ月後に自分でも忘れる。他の管理者が引き継いだときに解読不能になる。
③ 実行ログを定期的に確認する——ワークフローの「実行履歴」からカスタムコードアクションの成功・失敗・エラーメッセージを確認できる。月次でエラー率を確認し、エラー率 1% 超えたら原因調査する。
④ 実行回数の上限(10万回/月)に注意する——Professional プランはカスタムコードアクションの実行が月10万回まで。大量のレコードに一括適用する際は事前に件数を確認する。残り回数は「設定 → 使用状況」で確認できる。
① Input / Output Fields を UI で宣言したか / ② すべての入力値に null チェック・デフォルト値を設定したか / ③ API キー等の機密情報を Secrets に登録して process.env で参照しているか / ④ try-catch でエラーをハンドリングしているか / ⑤ サンドボックスでテスト実行して意図どおりの結果が得られたか / ⑥ 本番適用する前にワークフローの「テストコンタクト」機能で1件だけ試したか——この6項目を全部クリアしてから本番展開する。
標準アクションでは対応できない複雑な計算・外部 API 通信・複数プロパティの条件分岐をコードで実装できる。ただし「まず標準アクションで実現できないか」を確認してから使う。メンテナンスコストが高いため乱用は避ける。
JavaScript は安定して本番利用できる。Python は pandas を使った数値計算が必要なケースに限定して使う。Beta 機能のため重要なワークフローでの Python 利用はリスクを理解した上で判断する。両者ともタイムアウト・メモリ制限を把握しておく。
コードに API キーをハードコードすることは最大のセキュリティリスク。コードはワークフロー管理者全員が閲覧できる。すべての機密情報は Secrets に登録して process.env.XXX で参照する。これは「推奨事項」ではなく「絶対ルール」。
HubSpot には空欄プロパティのレコードが必ず存在する。null/undefined のまま処理すると TypeError が発生してワークフロー全体が止まる。全入力値のデフォルト値設定と、外部 API 呼び出しの try-catch を怠らないこと。
カスタムコードアクションのバグは、バルク適用した瞬間に数万件のレコードに誤った値を書き込む可能性がある。必ずサンドボックスで動作確認し、本番では1件→10件→100件と段階的に拡大して動作を確認してから全件に適用する。
Professional プランの月間実行上限(10万回)は意外に早く消費する。「すべてのコンタクト作成時にコードを実行する」設計だと、月1万件の新規流入だけで10万回に近づく。必要最低限のトリガー条件を絞り込んで、コードアクションの起動頻度を最小化する。