HELP
操作ガイド
契約書の送信から署名までの手順、トラブル時の対処法を解説します。
送信者向け
ログイン後、ダッシュボードを開く
ダッシュボードには「新しい契約書を送る」「テンプレートから作成」「設定」のクイックアクションが並びます。 今月の送信数や締結件数も一目で確認できます。
PDF をアップロードして受領者を入力
「新しい契約書を送る」から PDF をアップロードします。複数の署名者・共有先(cc)も追加できます。 取引情報(取引年月日・金額・相手方)は電子帳簿保存法の検索要件用です(任意)。
(任意)下書き保存してフィールド配置
「下書き保存して PDF にフィールドを配置」を選ぶと、PDF プレビュー上に印鑑・テキストフィールドをドラッグ&ドロップで配置できます。 各受領者は色分け表示されます。
内容確認 → 送信
送信前確認画面で内容と PDF プレビューを確認し、「この内容で送信」を押すと、 各受領者にメールが届きます。
締結後、署名済 PDF と締結証明書を受け取る
全員が署名すると、署名済 PDF(B-LTA 署名)と締結証明書 PDF(印影サマリ付き)が メール添付で全員に送付されます。ダッシュボードからもダウンロードできます。
受領者向け(無アカウントで OK)
メールのリンクをクリック
送信者から届いた「契約書への署名依頼」メールの「契約書を確認する」ボタンを開きます。
署名者の確認 → 印鑑・テキスト入力
STEP 1 で送信者・契約書名・自分の情報を確認し、STEP 2 で配置されているフィールドに 印鑑(テキスト or 画像)やテキストを入力します。一度作った印影は次回からも呼び出せます。
「すべて入力完了 — 署名する」ボタンで完了
全フィールドが埋まると署名ボタンが活性化します。クリック後、自分の署名が記録され、 他の署名者の進捗もリアルタイムで表示されます。
(任意)別の担当者に転送
送信者が「署名転送を許可」している場合、STEP 1 から別の担当者に署名リンクを 転送できます。転送は 1 回限りです。
トラブル時の対処
メールが届きません
迷惑メールフォルダをご確認ください。それでも届かない場合は送信者に契約書詳細ページから「招待メール再送」を依頼してください。
PDF がアップロードできません(特殊な形式エラー)
Mac のプレビューや一部スキャナで作成された PDF はサーバー側で自動修復を試みますが、構造が壊れている場合は失敗します。Adobe Acrobat または Office アプリから PDF 出力し直してアップロードしてください。
間違った宛先に送ってしまった
契約書詳細ページから「契約書をキャンセル」または受領者の「編集」でメールアドレスを変更できます。署名済みの受領者がいる場合はキャンセル不可なので、転送機能で対応してください。
署名期限はありますか
送信から 10 日で自動的に期限切れとなります。3 日前から受領者にリマインダーメールが自動送信され、送信者は契約書詳細ページから「リマインダーを今すぐ送る」も可能です。
外部システム連携
ムスビサインは契約締結・キャンセル・期限切れを Webhook で外部システムに通知できます。 CRM・Slack・Zapier・社内システムなどとの連携に使えます。
- 設定方法:/settings/webhooks
- HTTPS のみ。HMAC SHA-256 で署名(
X-Musubisign-Signatureヘッダ)。 - 瞬断対策で 3 回までの内部リトライ(500ms → 1s → 2s)。
- 受信側の疎通確認は「テスト送信」ボタンで可能。
受信側の署名検証例
Node.js (Express)
import crypto from "node:crypto";
import express from "express";
const app = express();
const SECRET = process.env.MUSUBISIGN_SECRET; // /settings/webhooks 作成時に取得
app.post("/webhook/musubisign",
express.raw({ type: "application/json" }),
(req, res) => {
const signature = req.header("x-musubisign-signature") || "";
const expected = "sha256=" +
crypto.createHmac("sha256", SECRET).update(req.body).digest("hex");
if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
return res.status(401).send("invalid signature");
}
const event = JSON.parse(req.body.toString("utf8"));
console.log("[musubisign]", event.event, event.data);
res.json({ ok: true });
});Python (FastAPI)
import hmac, hashlib, os
from fastapi import FastAPI, Request, HTTPException
app = FastAPI()
SECRET = os.environ["MUSUBISIGN_SECRET"]
@app.post("/webhook/musubisign")
async def webhook(req: Request):
body = await req.body()
sig = req.headers.get("x-musubisign-signature", "")
expected = "sha256=" + hmac.new(SECRET.encode(), body, hashlib.sha256).hexdigest()
if not hmac.compare_digest(sig, expected):
raise HTTPException(401, "invalid signature")
event = await req.json()
print("[musubisign]", event["event"], event["data"])
return {"ok": True}受信側のサンプル実装。timingSafeEqual / compare_digest を使い タイミング攻撃を防ぐのがポイントです。
Slack に流す(Cloud Functions 例)
Webhook を受信して Slack の Incoming Webhook に転送する Cloud Functions の最小例。 署名検証 + Slack 通知をひとつにまとめています。
import crypto from "node:crypto";
import functions from "@google-cloud/functions-framework";
const SECRET = process.env.MUSUBISIGN_SECRET;
const SLACK_WEBHOOK = process.env.SLACK_WEBHOOK_URL;
functions.http("musubisignWebhook", async (req, res) => {
const expected = "sha256=" +
crypto.createHmac("sha256", SECRET).update(req.rawBody).digest("hex");
if (!crypto.timingSafeEqual(
Buffer.from(req.header("x-musubisign-signature") || ""),
Buffer.from(expected),
)) return res.status(401).send("invalid signature");
const { event, data } = req.body;
const text =
event === "contract.completed"
? `✅ 締結完了: ${data.title}`
: event === "contract.cancelled"
? `⚠️ キャンセル: ${data.title}`
: event === "contract.expired"
? `⏰ 期限切れ: ${data.title}`
: `📩 ${event}: ${data.title || ""}`;
await fetch(SLACK_WEBHOOK, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ text }),
});
res.json({ ok: true });
});Cloud Functions の URL を /settings/webhooks に登録すれば、契約のイベントが Slack に流れます。