はじめに
Upworkで案件に応募するには、提案文(プロポーザル)ごとに Connects というポイントを消費します。案件によって必要なConnects数は違い、人気の案件やクライアントがブーストした案件では多めに要求されることもあります。
副業やフリーランスを始めたばかりのエンジニアがやりがちなのが、「とりあえず応募しておこう」とConnectsを使い続け、気づけば残高がなくなっているパターンです。筆者のまわりでも「1か月で何十件も応募したのに面談ゼロ」という話をよく聞きます。
この記事では、Connectsを**広告費や入札手数料と同じ「コスト」**として扱い、応募するかどうかを数字で判断する方法を紹介します。最後に、判定を手早くするための小さなJavaScriptも載せています。
注意:Connectsの価格、必要数、手数料率などはUpwork側で変わることがあります。本記事の数値はすべて例です。実際の値は必ず自分のアカウントとUpworkのヘルプで確認してください。
1. まずはConnectsをお金に換算する
Connectsは「ポイント」なので、つい軽く使ってしまいます。最初にやるべきことは、1回の応募がいくらなのかを円やドルで見える化することです。
たとえば、Connectsをまとめ買いしたときの価格から1Connectあたりの単価を出し、案件の必要数を掛ければ、その応募のコストになります。
応募コスト = 必要Connects数 × 1Connectあたりの単価
これだけで「この応募はランチ1回分」「これはランチ3回分」といった感覚がつかめるようになります。
2. 期待値で考える
応募すべきかどうかは、ざっくり言えば次の式で判断できます。
期待値 = 受注確率 × 手取り利益 − 応募コスト
- 受注確率:自分のこれまでの実績から見積もります。最初は分からないので、10件応募して1件返信があれば「返信率10%」、そこから受注に至る割合を掛けて推定します。
- 手取り利益:案件の予算からプラットフォーム手数料を引き、さらに作業時間を考えた「実質的な利益」です。
たとえば、予算が十分にあって自分のスキルにぴったり合う案件なら、必要Connectsが多めでも期待値はプラスになりやすいです。逆に、予算が極端に低い・内容があいまいな案件は、Connectsが少なくても期待値はマイナスになりがちです。
3. 数字の前にチェックすべき「本物の案件かどうか」
期待値の計算に入る前に、そもそも応募する価値がある案件かを確認します。Digital Dialogueの記事「Upwork Connects: when a job is worth the cost」では、Web開発者向けに次のような観点が挙げられていて、筆者もほぼ同じチェックをしています。
- 作るものを具体的に言えるか(LP 1枚、5ページのサイト、フォームのバグ修正など)
- 技術スタックが自分の普段の開発と合っているか
- 予算が自分の価格に近いか、または予算に合わせた小さな範囲を提案できるか
- 素材(ロゴ・文章・画像など)がそろっているか
- クライアントがUpwork上で発注しようとしているか(メールやTelegramへの誘導、無償サンプルの要求がないか)
最初の4つが「はい」で、5つ目に怪しい点がなければ応募候補です。どれかが欠けているなら、Connectsを使う前に閉じるのが基本です。
4. 判定スクリプト
毎回頭の中で計算するのは面倒なので、筆者は小さなスクリプトで判定しています。ブラウザのコンソールやNode.jsでそのまま動きます。
// connects-check.js
const config = {
pricePerConnect: 0.15, // 例:1Connectあたりの単価(USD)。自分の購入価格に置き換える
feeRate: 0.10, // 例:手数料率。自分のアカウントの表示に置き換える
hourlyFloor: 15, // 自分が受けてもよい最低時給(USD)
};
function evaluateJob({ connects, budget, hours, winRate, checks }) {
const cost = connects * config.pricePerConnect;
const net = budget * (1 - config.feeRate);
const effectiveHourly = net / hours;
const expectedValue = winRate * net - cost;
const failedChecks = Object.entries(checks)
.filter(([, ok]) => !ok)
.map(([name]) => name);
let verdict = "応募する";
if (failedChecks.length > 0) verdict = "見送り(案件の条件に問題あり)";
else if (effectiveHourly < config.hourlyFloor) verdict = "見送り(時給が低すぎる)";
else if (expectedValue <= 0) verdict = "見送り(期待値がマイナス)";
return {
応募コスト: `$${cost.toFixed(2)}`,
手取り: `$${net.toFixed(2)}`,
実質時給: `$${effectiveHourly.toFixed(1)}`,
期待値: `$${expectedValue.toFixed(2)}`,
NG項目: failedChecks,
判定: verdict,
};
}
console.table(evaluateJob({
connects: 16,
budget: 400,
hours: 20,
winRate: 0.05,
checks: {
成果物が具体的: true,
スタックが合う: true,
予算が妥当: true,
素材がある: true,
Upwork上で完結: true,
},
}));
ポイントは、金額の計算より先に「NG項目」で落とすことです。どれだけ予算が大きくても、Upwork外での支払いを求めてくる案件や、無償で作業させようとする案件は期待値以前の問題です。
5. 週ごとの「Connects予算」を決める
スクリプトがあっても、案件一覧を眺め続けていると「これも応募しておこうかな」という気持ちになります。そこで、週ごとの上限を先に決めておきます。
- 1週間で読む案件:10件
- そのうち応募するのは:2〜3件
- 上限に達したら、その週はもう応募しない
疲れてくると判断が甘くなり、条件の悪い案件にも「はい」と言いがちです。上限はそれを防ぐための仕組みです。
6. 記録をつけて「受注確率」を育てる
期待値の計算で一番あいまいなのが受注確率です。これは記録をつけることでしか精度が上がりません。筆者はスプレッドシートに次の列を作っています。
| 日付 | 案件の種類 | 予算 | 使ったConnects | 返信 | 面談 | 受注 |
|---|
数週間たつと、「LP案件は返信率が高い」「予算が極端に低い案件は返信がほぼない」といった傾向が見えてきます。その数字をスクリプトの winRate に反映させれば、判断がどんどん現実に近づきます。
7. ブーストと招待の扱い
- ブースト:追加のConnectsで提案を目立たせる機能です。「失っても困らない額か」で判断し、迷うなら使いません。ブーストしても、クライアントの要件に触れていない提案文が良くなるわけではありません。
- 招待:クライアントから招待された場合、応募にConnectsが必要かどうかはケースによって異なります。ボタンを押す前に必ず確認しましょう。
まとめ
- Connectsは「ポイント」ではなく「入札コスト」としてお金に換算する
- 期待値 = 受注確率 × 手取り − 応募コスト で考える
- 金額の計算より先に、案件そのものの条件で足切りする
- 週ごとの上限を決めて、疲れた状態で応募しない
- 記録をつけて受注確率を自分のデータで更新する
Connectsを節約すること自体が目的ではありません。限られた応募を、本当に勝てる案件に集中させるための考え方です。「とりあえず応募」をやめるだけで、提案文1件あたりにかけられる時間が増え、結果的に返信率も上がるはずです。
Abid Ali:パキスタンを拠点に活動するフルスタックWeb開発者・フリーランス。フリーランス向けの実践ガイドを「Digital Dialogue」で書いています。
