リンクインフラの移行はリスクが高い作業です。これまでに印刷し、メールフッターに埋め込み、QR コードに刻印したすべてのショートリンクが依存関係になっています。雑な移行をすると、誰かが気づくまでの数週間、受信トラフィックの相当な割合を 404 にしてしまいます。
このガイドでは Bitly から Elido への移行を説明します。すでに切り替えを決めていることを前提としています - 通常は EU データ居住地、よりクリーンな無料プランの体験、ホワイトラベルの再販、または Premium プラン不要の API アクセス(2026年5月時点で年間契約月$199/月払い月$300)が理由です。まだ評価中なら、/compare/vs-bitly の比較ページが適切な出発点です。
実際に移行が必要なもの#
3つのものを移動します。ワイアレベルではそれ以外は重要ではありません。
- アクティブなショートリンク。 スラッグ、遷移先、オプションのタグとフォルダー、カスタムドメイン(あれば)。
- カスタムドメインの DNS。 Bitly のエッジを指す CNAME レコードを Elido のものに変更。
- クリック履歴。 Bitly の集計カウンター - 生のイベントではありません(エクスポート不可)。
それ以外すべて - Bitly Sights ダッシュボード、ブランデッド QR コード、ディープリンク設定 - は Elido での新規セットアップであり、移行ではありません。これらをポートしようとせず、新しいスタックで一から再構築してください。
ステップ1:インベントリ#
Bitly はプランによって過去データのエクスポートを制限しています。ダッシュボードの CSV エクスポートは約1万件のリンクまで機能しますが、それを超えるとタイムアウトするかページネーションが不安定になります。より大きなインベントリには、API を直接呼び出してください:
curl -H "Authorization: Bearer $BITLY_TOKEN" \
"https://api-ssl.bitly.com/v4/groups/$GROUP_GUID/bitlinks?size=100"
各レスポンスの pagination.next URL でページネーションします。ページサイズ100が最大です。エクスポートが止まった場合に再開できるよう、結果を JSONL(1行1リンク)として保持してください。
各行から必要なもの:
link- 完全なショート URL(https://bit.ly/abcまたはhttps://yourdomain.com/abc)long_url- 遷移先tags、archived、created_atlink_clicks(ライフタイム合計)- Bitly から取得できる唯一のクリック履歴
保持する理由がない限り、アーカイブされたリンクはフィルタリングしてください。ほとんどのチームはインベントリの30〜50%が古いキャンペーンや一時的な共有などで死んでいることを発見し、移行はそれらを削除する適切なタイミングです。
ステップ2:Elido での事前プロビジョニング#
DNS に触れる前に、同じカスタムドメインとスラッグで Elido にすべてのリンクを予約してください。
大きなインベントリの場合、リンクごとの作成ではなく links.bulkCreate を使用してください。Elido ワークスペース ID と数値ドメイン ID(まず workspaceDomains.list(workspaceId) でドメインを検索)が必要です:
import { ElidoApi } from "@elido/sdk";
const api = new ElidoApi({ apiKey: process.env.ELIDO_API_KEY! });
// インポートループの前に、カスタムドメインの数値 ID を一度解決する
const { items: domains } = await api.workspaceDomains.list(WORKSPACE_ID);
const domain = domains.find((d) => d.hostname === "links.yourbrand.com");
if (!domain) throw new Error("Domain not registered in workspace");
// JSONL を100件のチャンクにバッチ(バルクエンドポイントの最大値)
async function migrateChunk(rows: BitlyRow[]) {
return api.links.bulkCreate(
WORKSPACE_ID,
{
domain_id: domain.id,
links: rows.map((row) => ({
slug: row.slug,
destination_url: row.long_url,
tags: [
...row.tags,
`bitly-migrated`, // analytics でフィルタリング用のタグ
],
title: row.title ?? undefined,
})),
},
{ idempotencyKey: `mig-batch-${rows[0].slug}` },
);
}
links.bulkCreate エンドポイント(POST /v1/workspaces/{workspace_id}/links/bulk)は1回の呼び出しで最大100リンクを受け入れ、アイテムごとの成功/失敗ステータスを返すため、一部の失敗でバッチ全体が中断されません。単一リンクのインポートには、links.create(workspaceId, input, { idempotencyKey }) が同じ domain_id / slug / destination_url / tags フィールドとオプションのべき等性キーを受け入れるため、部分的なスクリプトを安全に再開できます。
スクリプトを実行する前に知っておくべきこと:
- ドメイン登録が先。 リクエストボディの
domain_idは、ワークスペースにすでに登録されているドメインを参照しなければなりません。インポートを開始する前にカスタムドメインフローでドメインを登録および確認してください。ドメインはまだライブである必要はありません - DNS を切り替える前に Elido で登録できます。 - プランの制限。 Elido はプランごとにワークスペースレベルのリンク制限を適用します。10万件のリンクインベントリを事前プロビジョニングするには Business プランが必要です。
- レート制限。 バルク作成は個別作成と同じワークスペースレベルのレート制限の対象です。100リンクごとにバッチして適度な並行性で行えば、5万件のリンクの移行に約10分かかります。監査ログにきれいなインポートブロックが表示されるよう、1つのランナーからシリアルまたは軽い並行処理で実行してください。
ステップ3:カスタムドメインの切り替え#
これがカットオーバーです。これまでのすべては可逆的です。これ以降はライブです。
カットオーバーウィンドウの少なくとも24時間前に、既存の Bitly CNAME の TTL を下げてください:
links.yourbrand.com. 300 IN CNAME cname.bitly.com.
TTL が何年も86400だった場合、「TTL を下げる」というのは5分のタスクではなく24時間の待機です。それを計画に組み込んでください。
変更ウィンドウが開いたら、ターゲットを切り替えます:
links.yourbrand.com. 300 IN CNAME edge.elido.me.
Elido のエッジは自動オンデマンド TLS を実行しています。DNS 伝播後の最初のリクエストが Let's Encrypt の発行をトリガーします - その単一リクエストに通常1〜3秒のレイテンシーがあり、その後証明書がキャッシュされ、以降のリクエストは EU リージョンのエッジから一桁ミリ秒で提供されます。証明書は自動的にプロビジョニングされます。手動の証明書リクエストステップはありません。
カットオーバーが完了したと宣言する前に、いくつかのネットワークから dig で確認してください。DNS 伝播は不均一です。ラップトップからのみ確認することは、1つのリゾルバーしか確認していないことを意味します。
ステップ4:クリック履歴の照合#
Bitly は生のクリックイベントをエクスポートしません。「履歴をインポートする」ための時間を確保しないでください - それは不可能であり、それを約束するツールは集計値を読んでイベントと呼んでいます。
得られるのは Bitly API エクスポートからのリンクごとの link_clicks カウンターです。Elido リンクインベントリと結合できる場所に保存してください - Metabase データセットの別の列、またはインラインで必要な場合はタグ。Elido はカットオーバー時にゼロからカウントを開始します。
レポートレイヤーの式は:total_clicks = elido_clicks + bitly_lifetime_clicks です。analytics API は /v1/analytics/workspaces/{workspace_id}/timeseries で Elido のクリックデータを公開しています。Bitly のベースラインを保存していれば、20行の Metabase または Hex クエリで2つの数値を繋ぎ合わせられます。
月別の地域別内訳やリファラーのトレンドなどの詳細な過去 analytics が必要な場合、それらは戻ってきません。これ以降は Elido の生イベントログで問いを再構築してください。移行はハードカットオフです。
2週目に牙を剥く5つの落とし穴#
1. 静的アセットにハードコードされた bit.ly リンク。 PDF、印刷物、ウェルカムメールの埋め込みスニペット。これらは Bitly のドメインを指しており、カスタムドメインではありません。Bitly アカウントを維持している限り機能し続けますが、キャンセルした瞬間に壊れます。リダイレクトのみの墓場として無料の Bitly アカウントを生かし続けるか、損失を受け入れて少なくとも1年間はキャンセルしないかのどちらかです。
2. CDN の二重リダイレクト。 Cloudflare をプロキシモード(オレンジ雲)でドメインの前に置いている場合、Elido への SSL ハンドシェイクが Cloudflare の Universal SSL と競合する可能性があります。Cloudflare SSL を「Full (Strict)」に設定し、古い Bitly ターゲットを参照する Page Rules を削除してください。またはカットオーバーウィンドウ中に一時的にレコードをグレー雲にしてください。
3. エクスポートでの UTM の切り詰め。 Bitly はダッシュボードに短縮された遷移先 URL を表示することがありますが、正規の完全な URL を保存しています。CSV エクスポートには通常完全な URL があります。ダッシュボードビューにはない可能性があります。API を呼び出すのではなくダッシュボードをスクレイピングすると、UTM が失われます。常に API 経由で行ってください。
4. 読み取り側での Bitly API レート制限。 Bitly API は大量のアカウントに対して GET /bitlinks を積極的にスロットリングします。100万件のリンクを順次読み取ることは数日かかる可能性があります。並行してページネーションしてください(4〜8の並行ページネーター)が、429 に注意し、発火したらバックオフしてください。
5. Bitly のアカウントレベル vs グループレベルのスコープ。 Bitly グループはワークスペースではありません。単一の Bitly アカウントが複数のグループを所有でき、それぞれに独自のカスタムドメイン設定があります。チームが何年にもわたって異なるグループの下にドメインを追加している場合、エクスポートはデフォルトのグループだけでなくすべてのグループを列挙する必要があります。グループを見逃すと、そのドメインは移行されません。
コンプライアンス:ほとんどのチームが実際に移行する理由#
移行は通常、機能ではなくコンプライアンスが動機です。パターン:
- DPO が Bitly を米国ベースのサブプロセッサーとしてフラグを立て、監査でデータプライバシーフレームワークへの依存が却下される。
- 調達がサブプロセッサーリストを要求し、Bitly のリストが20以上のベンダーに及ぶ。
- BAA が Premium プラン(月払い月$300、年間契約月$199、2026年5月時点 - 現在の料金を確認)で医療隣接の顧客に必要となり、プランのジャンプがトリガーになる。
Elido はデフォルトで EU ホストです - クリックイベントは EU リージョンを経由し、米国東部とアジア太平洋はオプトインの Business+ 地域として利用可能です。サブプロセッサーリストは5ベンダーで /legal/subprocessors に公開されています。ISO 27001 は現在有効です。SOC 2 Type II は監査中です。BAA は Business+ で利用可能です。デフォルト設定では Schrems II は懸念事項ではありません。ワークスペースが明示的に非 EU 地域にピン留めしない限り、データは EEA を離れません。
コンプライアンスが動機である場合、移行計画にはサイドバイサイドのデータフロー図を含めるべきです:クリックイベントが以前どこにいたか、今どこにいるか。その図が次の評価で監査人が求めるものです。
代替としてのセルフホスト#
セキュリティ姿勢がすべての SaaS ショートナーを排除するチーム - 金融サービス、政府、医療 - には、Elido は Apache 2.0 Helm チャートを提供しています。当社の EU リージョンで実行しているのと同じバイナリで、VPC にデプロイし、暗号化のために BYO KMS を使用し、サードパーティのサブプロセッサーはありません。移行はステップ3(DNS)が edge.elido.me ではなくクラスター内のイングレスを指す点を除いて同じです。
セルフホストのランブックでは Helm インストール、シークレットのブートストラップ、認証レイヤーの配線を説明しています。既存の k8s クラスターへの新規デプロイには半日の予算を見込んでください。
移行後の開発者ワークフロー#
Elido に移行後、API は週に数件以上のリンクを作成するチームの主要なサーフェスです。OpenAPI 3.1 仕様は /help にあります。@elido/sdk パッケージは TypeScript で API をカバーし、Go SDK は packages/sdk-go に含まれています。
エージェント駆動のワークフローには、オープンソースの MCP サーバーが Elido を Claude、Cursor、または任意の MCP 対応クライアントに接続します:
{
"mcpServers": {
"elido": {
"command": "npx",
"args": ["-y", "@elido/mcp-server"],
"env": { "ELIDO_API_KEY": "elido_pk_..." }
}
}
}
デフォルトでは読み取り専用です - エージェントは書き込みなしで analytics を照会したりリンクを検索したりできます。書き込みスコープの付与は意図的なワークスペースごとの設定です。
カットオーバー前の最終チェックリスト#
- Bitly API トークンがデフォルトだけでなくすべてのグループへのアクセス権を持っている
- インベントリが JSONL としてエクスポートされ、アーカイブリンクがフィルタリングされ、カウントが Bitly ダッシュボードと照合されている
- すべてのスラッグが正しいカスタムドメインで Elido に事前プロビジョニングされており、スクリプトがドライランで100%成功を返した
- DNS に触れる前に Elido ワークスペースでカスタムドメインが登録および確認されている
- 既存の Bitly CNAME の DNS TTL がカットオーバーの少なくとも24時間前に300秒に下げられている
- Cloudflare プロキシモードと SSL 設定が Elido エッジと互換性があることが確認されている
- カットオーバー時点で Bitly のライフタイムクリック数が記録されてレポート用に保存されている
- エンドツーエンドの確認のために少なくとも1つのリバーステストリンクが印刷されてスキャンされている
- Bitly アカウントがハードコードされた
bit.lyリンクへの保険として、カットオーバー後90日間アクティブにスケジュールされている
正しく行えば、ユーザー側の変化は見えません。間違えると、自分のせいではないと気づいていない誰かからの「なぜ bit.ly が壊れているのか?」というチケットを2週間処理することになります。
技術的な作業は簡単です。規律はステージングにあります。
ブログ関連記事#
Elidoを試す
URLを貼り付けて短縮リンクを取得
登録不要。リンクは30日間有効。永久に保存するには登録してください。
Free、登録不要 · 1日あたり2件