Calendly連携を高速化する

Core Web Vitalsを低下させずにCalendlyを埋め込みます

Arjen Karel
更新日 · 5 分で読めます
共有

Calendly連携を高速化する

Calendlyは優れたオンライン日程調整ツールです。仕事用のカレンダーと連携し、相手から直接予定を入れてもらえます。多くのクライアントが使っていますが、実によく機能しています。

Arjen Karel による最終確認: 2026年3月

Calendlyをウェブサイトに導入する

Calendlyをサイトに導入する方法は、基本的に3つあります。iframe、クリック可能なリンク、ボタンのいずれかを使う方法です。手順はシンプルです。埋め込みコードをクリックしてコピーし、サイトに貼り付けるだけです。これでページへの埋め込みは完了です。しかし、良いことばかりではありません。サイトの表示速度を低下させてしまっている可能性があるからです。

CalendlyはどのようにCore Web Vitalsを低下させるのか?

インライン埋め込みの場合、Calendlyはサイトにiframeを追加します。適切に実装していれば、iframeを使っても描画メトリクス(Largest Contentful Paint と First Contentful Paint)に大きな影響はありません。iframeはInteraction to Next Paintに多少影響しますが、大半のユースケースでは許容範囲内です。

Core Web Vitalsで「問題」が発生するのは、CalendlyをPopup widgetまたはPopup textで追加した場合です。提示されるコードに従うと、スタイルシート(https://assets.calendly.com/assets/external/widget.css)とスクリプト(https://assets.calendly.com/assets/external/widget.js)をサイトに追加することになります。

<!-- Calendly badge widget begin -->
<link
 href="https://assets.calendly.com/assets/external/widget.css"
 rel="stylesheet">
<script
  src="https://assets.calendly.com/assets/external/widget.js"
  type="text/javascript"
  async>
</script>
<a href="#"
   onclick="Calendly.initPopupWidget(
      {url: 'https://calendly.com/corewebvitals/pre-audit-meet'});
   return false;">
   Schedule time with me
</a>
<!-- Calendly badge widget end -->

その結果、Calendlyのスタイルシートによって370msもの遅延が発生します。DebugBearによるCalendlyの調査によると、ウィジェットのCSSは464KBに達し、その大部分をBase64で埋め込まれたフォントが占めています。ページのhead内にあるスタイルシートは、デフォルトでrender blockingになるためです。スタイルがなければブラウザは最終的なHTMLをどう描画すべきか判断できないため、これは当然の仕組みです。Core Web Vitalsを改善する上で、スタイルシートの最適化が極めて重要になるのはそのためです。

asyncスクリプトも初期リソースの競合を引き起こします。ただし非同期で処理されるため、スタイルシートに比べれば遅延はずっと小さく済みます。

解決策

解決策は、「Calendlyをrender blockingにしないこと」、そしておまけとして「読み込みタイミングを改善すること」にあります。これには簡単な方法と、少し手間はかかりますが、より優れた方法の2つがあります。さっそく見ていきましょう。

簡単な修正方法

最も手軽な方法は、「preloadのテクニック」を使ってスタイルシートをrender blockingにしないことです。以下のコードの太字で示した変更点をご覧ください。スタイルシートがpreloadされるようになります(preloadされたリソースは並行してダウンロードされます)。そしてスタイルシートの読み込みが完了すると、preloadリンクが通常のスタイルシートリンクへと切り替わります。これにより、render blockingを起こさずにスタイルシートを適用できます。

<!-- Calendly badge widget begin -->
<link
 href="https://assets.calendly.com/assets/external/widget.css"
 rel="preload"
 as="style"
 onload="this.rel='stylesheet';this.onload=null;"
>
<script
  src="https://assets.calendly.com/assets/external/widget.js"
  type="text/javascript"
  async>
</script>
<a href="#"
   onclick="Calendly.initPopupWidget(
      {url: 'https://calendly.com/corewebvitals/pre-audit-meet'});
   return false;">
   Schedule time with me
</a>
<!-- Calendly badge widget end -->

より優れた修正方法

簡単な修正でも描画メトリクスは確実に改善しますが、Calendlyの読み込みタイミングには依然として不満が残ります。ページの読み込み開始から最初の100ms以内に予約ができなくて困ったユーザーなど、インターネットの歴史上ひとりもいません。それよりも、LCP要素やメニュー操作を処理する重要スクリプトなど、ページにとってより重要な要素を優先すべきです。これは、チャットウィジェットにも使っているfacadeパターンと同じアプローチです。

そこでこの知見を活かし、ページのHTML解析が完了したタイミングでスクリプトとスタイルの両方を読み込み始めます。このイベントがDOMContentLoadedです。このイベントが発火したタイミングを利用して、スタイルとスクリプトを非同期に読み込みます。両方の読み込みが完了したら、(コールバック関数内で)クリック時にポップアップを表示するリンクを生成します。スマートだと思いませんか? 同様の手法については、JavaScriptを遅延させる16の方法を参照してください。

このコードでは、ポップアップを開く前にscheduler.yield()を使ってmain threadへyieldしています。これにより、Calendlyの初期化中にブラウザがブロックされるのを防ぎ、インタラクションの応答性を保てます。

document.addEventListener('DOMContentLoaded', function () {

    var stylesheetPromise = new Promise(function (resolve, reject) {
        var stylesheet = document.createElement('link');
        stylesheet.rel = 'stylesheet';
        stylesheet.href = 'https://assets.calendly.com/assets/external/widget.css';
        stylesheet.onload = resolve;
        stylesheet.onerror = reject;
        document.head.appendChild(stylesheet);
    });

    var scriptPromise = new Promise(function (resolve, reject) {
        var script = document.createElement('script');
        script.src = 'https://assets.calendly.com/assets/external/widget.js';
        script.onload = resolve;
        script.onerror = reject;
        document.head.appendChild(script);
    });

    async function yieldToMainThread() {
        if ('scheduler' in window && 'yield' in window.scheduler) {
          return await window.scheduler.yield();
        }
        return new Promise((resolve) => {
          setTimeout(resolve, 0);
        });
      }

    Promise.all([stylesheetPromise, scriptPromise])
        .then(function () {
            const clickEl = document.getElementById('demo');
            clickEl.innerHTML = '<a>Book a Demo</a>';
            document.getElementById('demo').addEventListener('click', async function () {
                this.innerHTML = 'Loading...';
                await yieldToMainThread();
                Calendly.initPopupWidget({ url: 'https://calendly.com/corewebvitals/pre-audit-meet' }); return false;
            });
        })
        .catch(function (error) {
            console.error('Error loading resources:', error);
        });
});

デモ

以下のリンクをクリックしてデモをご確認ください(診断が必要な場合は、お気軽に予約してください)。

デモを予約する

About the author

Arjen Karel is a web performance consultant and the creator of CoreDash, a Real User Monitoring platform that tracks Core Web Vitals data across hundreds of sites. He also built the Core Web Vitals Visualizer Chrome extension. He has helped clients achieve passing Core Web Vitals scores on over 925,000 mobile URLs.

Arjen Karel

サイトをもっと速くしたいですか?

Arjenです。17年間、遅いサイトを直してきました。ご自身で解決できない問題があれば、URLをお送りください。一度お話ししましょう。

URLを送る
Arjen Karel
Arjen Karel, 2009年から活動するWebパフォーマンスコンサルタント

なぜ修正が効かないのか?

CDNがまだ古いHTMLを配信している、あるいは修正がデスクトップ用テンプレートにだけ入り、モバイルは別のテンプレートを使っている、ということがあります。URLと問題をお送りいただければ、候補の日時をご返信します。まずfield dataを確認し、1時間サイトを一緒に見て、1日以内に調査メモを書面でお送りします。€350(税別)。

URLを送る

修正を実装する開発者がいませんか? サイトのコピー上で私が作業します。