ムスビサイン

HELP

操作ガイド

契約書の送信から署名までの手順、トラブル時の対処法を解説します。

送信者向け

1

ログイン後、ダッシュボードを開く

ダッシュボードには「新しい契約書を送る」「テンプレートから作成」「設定」のクイックアクションが並びます。 今月の送信数や締結件数も一目で確認できます。

2

PDF をアップロードして受領者を入力

「新しい契約書を送る」から PDF をアップロードします。複数の署名者・共有先(cc)も追加できます。 取引情報(取引年月日・金額・相手方)は電子帳簿保存法の検索要件用です(任意)。

3

(任意)下書き保存してフィールド配置

「下書き保存して PDF にフィールドを配置」を選ぶと、PDF プレビュー上に印鑑・テキストフィールドをドラッグ&ドロップで配置できます。 各受領者は色分け表示されます。

4

内容確認 → 送信

送信前確認画面で内容と PDF プレビューを確認し、「この内容で送信」を押すと、 各受領者にメールが届きます。

5

締結後、署名済 PDF と締結証明書を受け取る

全員が署名すると、署名済 PDF(B-LTA 署名)と締結証明書 PDF(印影サマリ付き)が メール添付で全員に送付されます。ダッシュボードからもダウンロードできます。

受領者向け(無アカウントで OK)

1

メールのリンクをクリック

送信者から届いた「契約書への署名依頼」メールの「契約書を確認する」ボタンを開きます。

2

署名者の確認 → 印鑑・テキスト入力

STEP 1 で送信者・契約書名・自分の情報を確認し、STEP 2 で配置されているフィールドに 印鑑(テキスト or 画像)やテキストを入力します。一度作った印影は次回からも呼び出せます。

3

「すべて入力完了 — 署名する」ボタンで完了

全フィールドが埋まると署名ボタンが活性化します。クリック後、自分の署名が記録され、 他の署名者の進捗もリアルタイムで表示されます。

4

(任意)別の担当者に転送

送信者が「署名転送を許可」している場合、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 に流れます。

さらに詳しい質問は FAQ もしくは お問い合わせ へ。