Cara Membuat Template OKR di Google Sheets
Buat template OKR multi-tab di Google Sheets dengan skor KR berbobot, rollup otomatis, dan tautan ke model keuangan. Panduan langkah demi langkah untuk tim keuangan.
Buat template OKR multi-tab di Google Sheets yang menghitung skor key result berbobot, merangkumnya menjadi nilai di level objective, dan terhubung langsung ke tab asumsi keuangan Anda - sehingga ketika target ARR Rp 275 miliar bergeser, skor OKR pun otomatis diperbarui. Ini bukan sekadar checklist lampu lalu lintas. Ini adalah model terstruktur: tab Config untuk pengaturan periode dan bobot, tab KR_Detail untuk mencatat progres, tab Rollup yang merangkum berdasarkan pemilik dan objective, serta tab Dashboard untuk laporan direksi. Tujuh langkah untuk sampai ke sana.
Yang Anda Perlukan
- Akun Google Sheets dengan akses edit ke workbook
- Familiar dengan referensi multi-tab dan named ranges
- Model tiga laporan keuangan atau tab asumsi yang sudah berfungsi (opsional, tapi disarankan untuk Langkah 6)
- Data OKR minimal satu kuartal untuk mengisi model awal
- Pemahaman dasar Apps Script (Langkah 2 menggunakan satu fungsi singkat yang bisa langsung disalin)
Panduan Langkah demi Langkah
Rancang Struktur Tab Template OKR
Sebelum menyentuh satu sel pun, tentukan terlebih dahulu arsitektur tab. Template OKR yang dirancang dengan baik memisahkan input dari kalkulasi dan output - prinsip yang sama yang membuat model keuangan bisa diaudit.
- Config** - pengaturan periode, bobot, ambang batas, daftar pemilik
- KR_Detail** - satu baris per key result, semua input progres ada di sini
- Rollup** - skor objective berbasis SUMPRODUCT dan ringkasan per pemilik
- Dashboard** - tampilan siap-direksi, bersumber sepenuhnya dari Rollup dan Config
- Fin_Link** - jembatan opsional ke tab Assumptions di model keuangan Anda
Pro Tip
Beri nama tab tanpa spasi. "KR_Detail" lebih bersih saat diimpor dibandingkan "KR Detail" ketika Anda menulis SUMIFS lintas-tab pada pukul 11 malam sebelum laporan direksi.Buat Tab Config
Config adalah panel kontrol utama. Setiap asumsi yang mungkin berubah - periode, ambang batas skor, skema bobot - ada di sini dan tidak di tempat lain.
Siapkan named ranges berikut di Config (Formulas > Named ranges):
cfg_period→ label periode OKR saat ini, misalnya "Q3 2026" (sel B2)cfg_ontrack_threshold→ skor berbobot minimum untuk menampilkan hijau, misalnya 0,70 (sel B4)cfg_owners→ daftar tervalidasi nama pemilik untuk dropdown di KR_Detail (B8:B20)cfg_weight_sum_check→ formula validasi:=SUMIF(KR_Detail!E:E,"*",KR_Detail!F:F)untuk mendeteksi bobot yang jumlahnya tidak sama dengan 1,0 per objective
Pro Tip
Tetapkan fungsi ini sebagai trigger onOpen jika Anda menarik data aktual dari sumber yang terhubung (HubSpot, Salesforce). Timestamp memberi tahu reviewer kapan data terakhir ditarik.Buat Tab KR Detail (Mesin Template OKR Anda)
Di sinilah model ini hidup. KR_Detail memiliki satu baris per key result, dengan kolom untuk objective yang dituju, pemilik, target, aktual, bobot dalam objective-nya, dan skor yang dihitung.
Siapkan kolom A sampai H:
| Kolom | Header | Catatan |
|---|---|---|
| A | Objective_ID | Kode singkat, misalnya "OBJ-1" |
| B | KR_ID | misalnya "KR-1.2" |
| C | Owner | Dropdown bersumber dari cfg_owners |
| D | KR_Description | Teks bebas |
| E | Target | Angka atau % |
| F | Actual | Angka atau % - satu-satunya kolom input |
| G | Weight | Harus berjumlah 1,0 per Objective_ID |
| H | KR_Score | Formula: =IFERROR(MIN(F2/E2,1)*G2, 0) |
Cap MIN(...,1) ini disengaja. NRR 112% terhadap target 100% mendapat kredit bobot penuh, tetapi tidak menggelembungkan skor objective induk di atas 1,0. Jika tim Anda ingin memberi penghargaan atas performa stretch, ubah cap menjadi 1,2 dan dokumentasikan di Config.
- Kunci kolom H (Format > Protect range) agar tidak ada yang menimpa formula dengan angka hardcoded
- Tambahkan conditional formatting pada kolom F: merah jika
F < E*cfg_ontrack_threshold, hijau jikaF >= E - Gunakan data validation pada kolom C untuk membatasi ke cfg_owners - menangkap typo yang merusak SUMIFS di tab Rollup
Pro Tip
Tambahkan kolom "Confidence" (I) dengan dropdown 1-3. Tidak mempengaruhi skor, tapi memberi direksi sinyal forward-looking yang tidak bisa ditangkap oleh formula.Hubungkan Formula Skor Berbobot
Dengan KR_Detail yang sudah terstruktur, formula skor di kolom H cukup mudah. Skor di level objective lebih menarik - diperlukan SUMPRODUCT pada rentang yang difilter.
Di Rollup!C2 (dengan asumsi A2 berisi Objective_ID), formula skor objective adalah:
=SUMPRODUCT(
(KR_Detail!$A$2:$A$200=A2)* // filter ke objective ini
KR_Detail!$H$2:$H$200 // jumlahkan skor KR berbobot
)
Ini menghasilkan angka antara 0 dan 1. Skor 0,46 berarti objective berjalan pada 46% dari target - di bawah ambang batas 0,70 yang Anda tetapkan di Config, sehingga tampil merah di Dashboard.
Untuk skor di level perusahaan, beri bobot pada objective itu sendiri. Tambahkan kolom Obj_Weight di Rollup dan hitung:
=SUMPRODUCT(Rollup!$B$2:$B$10, Rollup!$C$2:$C$10)
Di mana kolom B adalah bobot objective dan kolom C adalah skor di atas. Jika Anda memiliki 4 objective dengan bobot 30/30/20/20, rata-rata skor 0,8 pada dua objective 30% dan 0,5 pada objective 20% menghasilkan skor perusahaan (0,8*0,3 + 0,8*0,3 + 0,5*0,2 + 0,5*0,2) = 0,68 - satu poin di bawah on-track.
Pro Tip
Jalankan pengecekan jumlah bobot di Config. JikaSUMIF(Rollup!B:B,"*",Rollup!B:B) tidak mengembalikan 1,0, skor perusahaan tidak bermakna. Tandai dengan sel yang berubah merah saat tidak cocok.Buat Rollup Berdasarkan Pemilik dan Periode
Tab Rollup melakukan dua hal: merangkum berdasarkan objective (Langkah 4) dan mengiris berdasarkan pemilik untuk percakapan tentang performa.
Ringkasan pemilik di Rollup (kolom E sampai G):
// Rata-rata skor berbobot untuk semua KR yang dimiliki seseorang
=IFERROR(
AVERAGEIF(KR_Detail!$C$2:$C$200, E2, KR_Detail!$H$2:$H$200),
0
)
Untuk perbandingan antar periode, tambahkan tab KR_Detail kedua bernama KR_Detail_Prior dengan struktur yang sama. Formula delta di Rollup:
=SUMPRODUCT(
(KR_Detail!$A$2:$A$200=A2)*KR_Detail!$H$2:$H$200
) -
SUMPRODUCT(
(KR_Detail_Prior!$A$2:$A$200=A2)*KR_Detail_Prior!$H$2:$H$200
)
Delta positif berarti objective membaik dibandingkan kuartal sebelumnya. Ini langsung masuk ke narasi laporan direksi tanpa kalkulasi manual apa pun.
- Proteksi seluruh tab Rollup dari pengeditan (semua formula, tidak ada input)
- Tambahkan baris di bagian bawah untuk skor gabungan di level perusahaan
- Urutkan objective berdasarkan skor secara ascending agar area bermasalah langsung terlihat
Hubungkan Template OKR ke Asumsi Keuangan
Ini adalah langkah yang dilewatkan sebagian besar template OKR, dan itulah mengapa review OKR dan review keuangan selalu berlangsung di rapat terpisah. Hubungkan keduanya.
Jika model keuangan Anda memiliki tab Assumptions dengan target ARR, ambang batas gross margin, dan headcount, referensikan langsung di KR_Detail alih-alih hardcoding:
// KR_Detail E2: target ARR untuk key result "Tumbuhkan ARR ke Rp 275 miliar"
='Assumptions'!$B$12
// KR_Detail F2: aktual ARR dari tab aktual
=SUMIFS('P&L'!$C:$C,'P&L'!$B:$B,">="&Assumptions!$B$3,'P&L'!$A:$A,"ARR")
Sekarang ketika CFO menaikkan target ARR dari Rp 275 miliar ke Rp 315 miliar di Assumptions, skor OKR untuk KR tersebut otomatis dihitung ulang. Target gross margin 72% dan aktual 70,1% yang tampil hijau kuartal lalu akan tampil kuning kuartal ini jika target naik.
Target yang sebaiknya dihubungkan langsung dari asumsi model keuangan:
- Target ARR / NRR (dari proyeksi pendapatan)
- Target gross margin (dari P&L)
- Target headcount (dari rencana tenaga kerja)
- Ambang batas burn rate atau EBITDA (dari model arus kas)
Pro Tip
Gunakan pembungkus IFERROR pada semua referensi lintas-tab. Jika seseorang mengganti nama tab Assumptions, Anda ingin pesan "#REF error - periksa nama tab Assumptions" muncul segera, bukan diam-diam mengembalikan nol dan merusak skor OKR Anda.Buat Tab Dashboard OKR
Tab Dashboard adalah output read-only. Setiap sel menarik dari Rollup atau Config. Tidak ada yang mengetik di sini.
Strukturkan dalam tiga zona:
Zona 1 - Baris header (baris 1-3): Label periode dari =Config!B2, skor perusahaan dari komposit Rollup, indikator RAG menggunakan =IF(Rollup!composite>=cfg_ontrack_threshold,"ON TRACK","AT RISK").
Zona 2 - Tabel ringkasan objective (baris 5-15): Satu baris per objective, menarik dari Rollup:
=IFERROR(
VLOOKUP(A6, Rollup!$A:$C, 3, FALSE),
"-"
)
Zona 3 - Heat map pemilik (baris 17-30): Nama pemilik melintang di kolom, objective menurun di baris, nilai sel dari irisan pemilik di Rollup. Warna via conditional formatting: >=0,70 hijau, 0,50-0,69 kuning, <0,50 merah.
Untuk laporan direksi kuartalan, hanya tab ini yang dibagikan. Kunci tab tersebut, sembunyikan formula bar untuk pengguna direksi menggunakan protected ranges, dan beri nama file [NamaPerusahaan]_OKR_[Kuartal]_DIREKSI.xlsx sebelum diekspor ke PDF.
Pro Tip
Tambahkan sel "Terakhir Diperbarui" yang merujuk ke Config!B3 (timestamp dari Apps Script di Langkah 2). Anggota direksi akan bertanya kapan data diambil. Sekarang Anda tidak perlu menjawabnya secara lisan.Kesimpulan
Sekarang Anda memiliki model OKR 5-tab di mana skor KR dihitung dari data aktual, dirangkum menjadi nilai objective berbobot, dan terhubung langsung ke target keuangan di tab asumsi Anda. Ketika Q3 berakhir dan data aktual masuk, Anda memperbarui kolom F di KR_Detail dan semua angka di hilirnya ikut diperbarui - Rollup, Dashboard, laporan direksi.
Titik lemah di sebagian besar template OKR bukan pada formula skor, melainkan pada siklus refresh data yang masih manual. Ketika data aktual tersimpan di HubSpot, Salesforce, atau data warehouse dan seseorang harus menyalin-tempelnya ke KR_Detail setiap bulan, model pun mulai melenceng. ModelMonkey dapat menarik data aktual tersebut langsung ke KR_Detail dari sumber yang terhubung, sehingga refresh menjadi satu perintah, bukan satu ritual. Coba ModelMonkey gratis 14 hari - bekerja di Google Sheets maupun Excel.
Pertanyaan Umum
Bagaimana cara memberi bobot pada key result dalam satu objective?
Beri bobot berdasarkan kepentingan strategis, bukan distribusi merata. Jika satu objective memiliki 3 KR dan salah satunya adalah milestone biner (diluncurkan/tidak diluncurkan) sementara yang lain adalah metrik berkelanjutan, KR biner tersebut mungkin lebih layak mendapat bobot lebih rendah - misalnya 0,20 - karena tidak bisa menangkap progres parsial. Titik awal yang umum: 0,40 / 0,40 / 0,20 untuk objective dengan 3 KR, disesuaikan berdasarkan outcome mana yang paling dibutuhkan bisnis dalam periode tersebut.
Berapa ambang batas skor yang tepat untuk "on track"?
Google dan literatur OKR sama-sama merujuk pada 0,7 sebagai ambang batas on-track standar - dengan asumsi bahwa secara konsisten mencapai 1,0 berarti target terlalu rendah. Dalam praktiknya, sebagian besar tim FP&A menggunakan 0,65-0,75 tergantung seberapa agresif budaya penetapan targetnya. Tetapkan sekali di Config (`cfg_ontrack_threshold`) dan terapkan secara konsisten. Mengubah ambang batas di tengah kuartal agar angka terlihat lebih baik adalah padanan spreadsheet dari menyesuaikan definisi EBITDA setelah fakta terjadi.
Bagaimana cara menangani KR kualitatif yang tidak bisa diukur dengan angka?
Tetapkan skala rating 1-5 dan normalisasikan ke 0-1 dalam formula: `=(F2-1)/4`. Rating 3 dari 5 menghasilkan skor 0,50, rating 5 menghasilkan 1,0. Dokumentasikan rubrik penilaian dalam komentar pada sel KR_Description agar skor tidak subjektif dari kuartal ke kuartal. KR kualitatif jarang melampaui 20-30% dari total bobot satu objective.
Apakah template OKR ini bisa menangani objective bertingkat (OKR di dalam OKR)?
Bisa, dengan lapisan tambahan di tab Rollup. Tambahkan kolom "Parent_Objective_ID", lalu jalankan SUMPRODUCT tingkat kedua yang memperlakukan skor objective anak sebagai input dengan cara yang sama seperti skor KR mengisi skor objective. Dalam praktiknya, pelapisan di luar 2 tingkat (perusahaan > tim) menciptakan overhead pemeliharaan yang melebihi presisinya. Sebagian besar tim lebih terlayani dengan menjaga model tetap datar dan menggunakan irisan Owner di Rollup untuk melihat performa di level tim.
Bagaimana cara mencegah formula drift ketika ada KR baru ditambahkan di tengah kuartal?
Gunakan rentang terbuka di setiap formula SUMPRODUCT dan SUMIFS - `$A$2:$A$200` bukan `$A$2:$A$15`. Menambahkan baris di KR_Detail kemudian tidak memerlukan pembaruan pada setiap formula di hilirnya. Tetapkan aturan data validation pada KR_Detail yang memblokir baris kosong di kolom A sampai G, sehingga baris yang hanya terisi sebagian tidak diam-diam berkontribusi nol pada kalkulasi Rollup.