#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Artikel StudioSoft (seri properti mendalam #2):
  1. analitik-digital-bisnis-properti — analitik: GA4, Search Console, dashboard 6 angka
  2. data-marketing-bisnis-properti   — data marketing: pakai ulang lead, segmentasi, retargeting
Jalankan: python3 ss_artikel_properti_analitik_data.py [--apply]
"""
import base64, html, json, re, sys, time, urllib.request, urllib.error
from datetime import datetime, timedelta, timezone

S = "https://studiosoft.id"
AUTH = base64.b64encode(b"bambangbot:q26r RePo BVy6 pwU2 F3z7 ouyl").decode()
WIB = timezone(timedelta(hours=7))

CTA = """<style>
.ss-cta-wa{display:inline-flex;align-items:center;gap:10px;background-color:#6878d6;color:#ffffff !important;
font-family:'Open Sans',sans-serif;font-weight:600;font-size:17px;padding:15px 30px;border-radius:8px;
text-decoration:none !important;line-height:1.2;box-shadow:0 2px 8px rgba(104,120,214,.35)}
.ss-cta-wa:hover{background-color:#4d61d6;color:#ffffff !important}
</style>
<p style="text-align:center;margin:34px 0 6px">
<a class="ss-cta-wa" href="https://wa.me/6281935000624?text=Halo%20StudioSoft%2C%20saya%20ingin%20konsultasi%20gratis%20untuk%20bisnis%20saya" target="_blank" rel="noopener" role="button">WhatsApp: Konsultasi Gratis</a>
</p>
<p style="text-align:center;font-size:14px;color:#5b5b6b;margin:0 0 26px">Dibalas langsung oleh tim StudioSoft, tanpa biaya dan tanpa komitmen.</p>"""


def schema(faq):
    data = {"@context": "https://schema.org", "@type": "FAQPage",
            "mainEntity": [{"@type": "Question", "name": q,
                            "acceptedAnswer": {"@type": "Answer", "text": a}} for q, a in faq]}
    return '<script type="application/ld+json">' + json.dumps(data, ensure_ascii=False) + "</script>"


A1 = {
    "judul": "Analitik untuk Bisnis Properti: Enam Angka yang Layak Dipantau",
    "slug": "analitik-digital-bisnis-properti",
    "fokus": "analitik properti",
    "seo_title": "Analitik Properti: GA4, Search Console, 6 Angka",
    "meta": ("Analitik untuk bisnis properti: event yang harus dicatat, cara membaca GA4 dan Search "
             "Console, serta enam angka mingguan yang menentukan keputusan anggaran."),
    "kategori": [330, 26],
    "label": "ANALITIK PROPERTI",
    "isi": """<p>Banyak bisnis properti sudah memasang Google Analytics, tapi tidak pernah membuka laporannya karena isinya terlalu banyak. Masalahnya bukan alatnya, tapi tidak ada kesepakatan soal angka apa yang dianggap penting. Untuk sektor properti, jumlah kunjungan hampir tidak berguna; yang berguna adalah berapa percakapan yang masuk, dari mana asalnya, dan berapa biaya untuk mendapatkannya.</p>

<h2>Mulai dari event, bukan dari laporan</h2>
<p>Sebelum membaca laporan apa pun, pastikan lima kejadian ini tercatat di website Anda. Klik tombol WhatsApp, klik nomor telepon, pengiriman formulir, klik tombol minta brosur atau denah, dan klik lihat simulasi cicilan. Kalau lima hal ini tidak tercatat, laporan apa pun hanya akan menampilkan jumlah kunjungan yang tidak bisa dipakai mengambil keputusan.</p>
<p>Di Google Analytics 4, lima kejadian itu ditandai sebagai konversi. Setelah ditandai, semua laporan bisa diurutkan berdasar kejadian yang benar-benar berhubungan dengan calon pembeli.</p>

<h2>GA4: tiga laporan yang cukup untuk memulai</h2>
<p>Pertama, laporan akuisisi yang membandingkan kanal: pencarian organik, iklan berbayar, media sosial, dan rujukan. Kedua, laporan halaman pendaratan, untuk melihat halaman unit mana yang menghasilkan percakapan dan mana yang banyak dikunjungi tetapi tidak menghasilkan apa-apa. Ketiga, laporan konversi per kanal, yang menjawab pertanyaan paling sering muncul: sebenarnya iklan atau konten organik yang mendatangkan prospek bulan ini.</p>

<h2>Search Console: bagian yang paling sering dilewatkan</h2>
<p>Search Console memberi satu hal yang tidak dimiliki alat lain: kata kunci yang benar-benar diketik orang sebelum menemukan Anda. Untuk bisnis properti, perhatikan permintaan pencarian yang memuat nama daerah, nama proyek, atau atribut seperti jumlah kamar. Tiga hal yang layak dilihat tiap bulan: kata kunci dengan tayangan tinggi tetapi rasio klik rendah (biasanya judul halaman perlu diperbaiki), halaman yang mulai turun posisinya, dan permintaan pencarian baru yang belum punya halaman sama sekali.</p>
<p>Perhatikan juga laporan negara dan kota. Kalau sebagian besar tayangan datang dari luar kota yang Anda layani, berarti halaman Anda masih terlalu umum.</p>

<h2>Enam angka mingguan yang cukup untuk rapat</h2>
<ul>
<li><strong>Percakapan masuk.</strong> Jumlah WhatsApp dan telepon yang tercatat minggu ini.</li>
<li><strong>Sumber percakapan.</strong> Kanal mana yang menyumbang, dihitung dengan penanda tautan atau pertanyaan kualifikasi.</li>
<li><strong>Kunjungan lokasi.</strong> Berapa percakapan yang berlanjut jadi survei atau kunjungan rumah contoh.</li>
<li><strong>Penawaran dan transaksi.</strong> Berapa yang sampai negosiasi dan berapa yang jadi.</li>
<li><strong>Biaya per prospek per kanal.</strong> Angka ini yang menentukan ke mana anggaran digeser bulan depan.</li>
<li><strong>Waktu balas pertama.</strong> Rata-rata berapa lama Anda menjawab percakapan baru. Sering kali perbaikan paling murah dan paling berdampak ada di angka ini.</li>
</ul>

<h2>Masalah atribusi di bisnis properti</h2>
<p>Orang melihat iklan di media sosial, lalu beberapa pekan kemudian mencari nama proyek di Google, baru menghubungi. Kalau Anda hanya memakai model klik terakhir, seluruh kredit jatuh ke pencarian organik dan media sosial tampak tidak berguna. Cara sederhana menanganinya: tanyakan di awal percakapan bagaimana calon pembeli mengetahui Anda, catat jawabannya, dan bandingkan dengan data penanda tautan. Dua sumber itu jarang cocok sepenuhnya, dan perbedaan itulah yang perlu dibaca, bukan diabaikan.</p>

<h2>Menghubungkan data iklan ke data prospek</h2>
<p>Kelola semua prospek di satu tempat, walau hanya berupa lembar kerja. Kolom minimum: tanggal masuk, sumber, area yang diinginkan, rentang anggaran, tahap kesiapan, dan status terakhir. Dengan data ini, Anda bisa melihat mana kanal yang menghasilkan prospek yang benar-benar membeli, bukan hanya yang banyak bertanya.</p>

<h2>Yang sebaiknya tidak dijadikan patokan</h2>
<p>Rasio pentalan tidak berarti banyak untuk situs properti, karena orang memang keluar setelah melihat foto dan harga tanpa mengklik apa pun. Jumlah tayangan media sosial juga tidak menggambarkan minat, apalagi setelah iklan. Demikian pula jumlah pengikut, karena yang menentukan pendapatan adalah berapa percakapan berkualitas yang terjadi.</p>

<h2>Laporan bulanan yang layak dibaca pemilik bisnis</h2>
<p>Laporan yang berguna menjawab empat pertanyaan saja: berapa percakapan masuk bulan ini, kanal mana yang paling efisien, halaman atau konten mana yang paling banyak menghasilkan, dan apa yang akan diubah bulan depan. Kalau laporan Anda berupa tangkapan layar berisi grafik tanpa kesimpulan, itu tanda laporannya dibuat untuk formalitas, bukan untuk mengambil keputusan.</p>

<h2>Yang kami kerjakan</h2>
<p>Kami memasang pelacakan konversi WhatsApp, telepon, dan formulir, menyambungkan Search Console dan akun iklan, lalu menyusun satu dashboard ringkas yang bisa dibaca tanpa latar belakang teknis. Dasarnya ada di <a href="https://studiosoft.id/digital-marketing-bisnis-properti/">panduan digital marketing bisnis properti</a> dan <a href="https://studiosoft.id/seo-untuk-bisnis-properti/">SEO untuk bisnis properti</a>.</p>

<h2>Pertanyaan yang sering muncul</h2>
<h3>Kami tidak punya website, apa yang bisa diukur?</h3><p>Untuk sementara cukup catat percakapan yang masuk beserta sumbernya, lalu ukur waktu balas pertama. Begitu website dibangun, pelacakan konversi bisa dipasang sejak hari pertama sehingga riwayatnya tidak hilang.</p>
<h3>Apakah perlu alat berbayar?</h3><p>Tidak untuk memulai. GA4, Search Console, dan satu lembar kerja sudah cukup untuk mengambil keputusan anggaran. Alat berbayar menjadi berguna ketika percakapan yang masuk sudah terlalu banyak untuk dirapikan secara manual.</p>
<h3>Siapa yang sebaiknya membaca laporan ini?</h3><p>Satu orang yang bertanggung jawab atas penjualan dan satu orang yang mengurus pemasaran. Kalau laporan hanya dibaca vendor, isinya cenderung berhenti sebagai dokumen tanpa tindak lanjut.</p>
<h3>Seberapa sering laporan perlu dibuat?</h3><p>Mingguan untuk enam angka yang di atas, bulanan untuk keputusan anggaran. Laporan mingguan tidak perlu panjang, satu halaman sudah cukup asal angkanya konsisten.</p>
<h3>Bagaimana kalau datanya kosong karena iklan baru mulai?</h3><p>Catat sejak hari pertama walau angkanya nol. Dua pekan pertama biasanya belum layak disimpulkan, jadi gunakan waktu itu untuk memeriksa apakah pelacakannya benar-benar bekerja.</p>""",
}

A2 = {
    "judul": "Data Marketing untuk Bisnis Properti: Memakai Ulang Data yang Sudah Dimiliki",
    "slug": "data-marketing-bisnis-properti",
    "fokus": "data marketing properti",
    "seo_title": "Data Marketing Properti: Segmentasi & Retargeting",
    "meta": ("Data marketing untuk bisnis properti: memakai ulang daftar lead lama, segmentasi berdasarkan "
             "lokasi dan anggaran, retargeting pengunjung unit, dan aturan main datanya."),
    "kategori": [330, 26],
    "label": "DATA MARKETING",
    "isi": """<p>Sebagian besar bisnis properti sudah memiliki aset data yang tidak pernah dipakai lagi: nomor WhatsApp calon pembeli dari dua tahun lalu, daftar pengunjung pameran, komentar di media sosial, dan orang-orang yang pernah melihat unit tertentu di website. Nilai daftar ini tinggi karena mereka sudah mengenal Anda. Yang mahal justru mencari orang baru setiap bulan.</p>
<p>Data marketing untuk properti bukan soal alat yang rumit. Ini soal memutuskan siapa yang layak dihubungi lagi, dengan penawaran apa, lewat kanal mana, dan kapan.</p>

<h2>Data apa saja yang biasanya sudah ada</h2>
<ul>
<li><strong>Percakapan WhatsApp dan telepon.</strong> Catatan siapa yang pernah bertanya, unit mana, dan apa jawabannya.</li>
<li><strong>Kontak pengunjung pameran, open house, dan rumah contoh.</strong> Biasanya tercatat di buku atau ponsel petugas.</li>
<li><strong>Pengunjung website.</strong> Orang yang melihat halaman unit tertentu bisa dikelompokkan lewat alat iklan selama pelacakan aktif.</li>
<li><strong>Interaksi media sosial.</strong> Orang yang pernah mengirim DM atau menyimpan postingan unit adalah calon yang relatif hangat.</li>
<li><strong>Kolaborasi agen.</strong> Daftar pembeli yang dicari agen mitra sering berisi kebutuhan yang belum terpenuhi stok Anda.</li>
</ul>

<h2>Segmentasi: tiga pertanyaan yang paling menentukan</h2>
<p>Untuk properti, segmen yang berguna dibentuk dari tiga variabel: lokasi yang diinginkan, rentang anggaran, dan tahap kesiapan. Seseorang yang mencari rumah tiga kamar di area tertentu dengan anggaran tertentu dan berencana pindah tahun depan butuh perlakuan berbeda dari orang yang baru mengumpulkan referensi.</p>
<p>Tahap kesiapan biasanya paling sering dilewatkan. Pertanyaan sederhana "rencananya beli kapan?" cukup untuk memisahkan daftar jadi tiga: siap dalam tiga bulan, mempertimbangkan enam sampai dua belas bulan, dan baru mencari informasi. Dua daftar pertama yang paling layak dikejar, sementara daftar ketiga cocok diberi konten edukasi berkala.</p>

<h2>Retargeting: memanfaatkan pengunjung yang sudah pernah melihat</h2>
<p>Pengunjung yang pernah membuka halaman unit adalah audiens dengan niat paling jelas. Iklan ulang ke kelompok ini jauh lebih murah daripada iklan ke orang yang belum pernah mengenal Anda, dan hasilnya lebih mudah diukur. Tiga kelompok yang layak dibentuk: pengunjung halaman unit tertentu, pengunjung halaman simulasi cicilan, dan orang yang pernah menonton separuh video tur.</p>
<p>Untuk daftar kontak yang sudah ada, kanal seperti WhatsApp dan email sering lebih efektif daripada iklan, asal isinya relevan. Kabar yang layak dikirim: unit baru di area yang mereka cari, penurunan harga, perubahan skema pembayaran, atau tahap pembangunan yang sudah selesai.</p>

<h2>Memasarkan ulang tanpa menjadi mengganggu</h2>
<p>Aturan sederhananya: kirim hanya kalau ada sesuatu yang benar-benar baru dan cocok dengan kebutuhan yang pernah mereka sebutkan. Empat sampai enam kali setahun biasanya cukup untuk daftar lama. Menyapa ulang orang yang pernah bertanya dengan satu unit yang tepat akan terasa berguna; mengirim pengumuman ke seluruh daftar setiap pekan akan terasa mengganggu dan membuat nomor Anda diblokir.</p>

<h2>Menjaga kualitas data</h2>
<p>Data yang tidak dirawat cepat jadi beban. Empat kebiasaan yang membantu: tandai prospek yang sudah membeli atau sudah tidak berminat, perbarui nomor yang tidak aktif, catat sumber setiap kontak pada saat masuk, dan jangan pernah membeli basis data dari pihak ketiga. Daftar yang dibeli biasanya tidak relevan, melanggar aturan perlindungan data pribadi, dan merusak reputasi pengiriman pesan Anda.</p>

<h2>Menghubungkan data iklan dengan hasil penjualan</h2>
<p>Supaya keputusan anggaran bisa dipertanggungjawabkan, dua data ini perlu bertemu: data iklan dari platform dan data prospek dari sisi penjualan. Cara paling praktis adalah menambahkan penanda tautan pada setiap iklan dan konten, lalu mencatatnya di satu lembar kerja saat prospek masuk. Setelah sebulan, Anda akan tahu kelompok audiens mana yang menghasilkan pembeli, bukan hanya yang menghasilkan pertanyaan.</p>

<h2>Menghormati batas dan izin</h2>
<p>Kumpulkan data dengan persetujuan, jelaskan untuk apa dipakai, dan sediakan cara berhenti dihubungi. Untuk sektor properti yang sering bekerja sama dengan lembaga keuangan, data calon pembeli umumnya juga terikat pada ketentuan perlindungan data pribadi. Menjaga hal ini bukan hanya soal kepatuhan, tapi juga soal kepercayaan, dan kepercayaan adalah modal utama di bisnis dengan transaksi besar.</p>

<h2>Yang kami kerjakan</h2>
<p>Kami merapikan daftar kontak yang sudah ada, memasang pelacakan supaya pengunjung halaman unit bisa dikelompokkan, menyusun alur tindak lanjut bersama tim penjualan, dan mengukur hasilnya per kelompok. Konteks lengkapnya ada di <a href="https://studiosoft.id/digital-marketing-bisnis-properti/">panduan digital marketing bisnis properti</a>, dengan bagian pengukuran di <a href="https://studiosoft.id/analitik-digital-bisnis-properti/">analitik untuk bisnis properti</a>.</p>

<h2>Pertanyaan yang sering muncul</h2>
<h3>Daftar lead lama masih berguna?</h3><p>Umumnya masih, terutama yang pernah menanyakan unit spesifik. Mulai dari yang paling baru, sapa dengan penawaran yang relevan, dan jangan mengirim kabar ke seluruh daftar sekaligus.</p>
<h3>Berapa lama data prospek layak disimpan?</h3><p>Selama masih relevan dan sesuai persetujuan yang diberikan. Sebagai kebiasaan kerja, pisahkan daftar yang aktif dalam dua belas bulan terakhir, dan bersihkan sisanya setiap tahun dengan pemberitahuan yang sopan.</p>
<h3>Apakah boleh membeli daftar nomor calon pembeli?</h3><p>Tidak kami sarankan. Kualitasnya rendah, penerimanya tidak mengenal Anda, dan risikonya dari sisi kepatuhan perlindungan data pribadi cukup besar untuk bisnis properti yang bekerja dengan lembaga keuangan.</p>
<h3>Apa segmen paling menguntungkan untuk properti?</h3><p>Biasanya bukan segmen pembeli pertama, melainkan orang yang sedang pindah rumah karena alasan mendesak seperti pindah kerja, penambahan anggota keluarga, atau sekolah anak. Mereka punya tenggat, dan tenggat adalah pemicu keputusan paling kuat.</p>
<h3>Kalau tim penjualan tidak mencatat data, bagaimana?</h3><p>Mulai dari satu kolom saja: sumber kontak. Satu kolom itu biasanya cukup untuk mulai membandingkan kanal, dan begitu tim melihat gunanya, kolom berikutnya menambah dirinya sendiri.</p>""",
}

ARTIKEL = [A1, A2]


def api(path, method="GET", data=None):
    h = {"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0"}
    body = json.dumps(data).encode() if data is not None else None
    if data is not None:
        h["Content-Type"] = "application/json"
    r = urllib.request.Request(S + path, data=body, headers=h, method=method)
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=180) as x:
                return x.status, json.loads(x.read())
        except urllib.error.HTTPError as e:
            return e.code, e.read().decode()[:300]
        except Exception:
            time.sleep(5)
    return 0, "gagal"


def jumlah_kata(h):
    return len([w for w in re.split(r"\s+", html.unescape(re.sub(r"<[^>]+>", " ", h))) if w])


for a in ARTIKEL:
    a["kata"] = jumlah_kata(a["isi"])
    print(f"  {a['slug']:<40} {a['kata']} kata")

if "--apply" not in sys.argv:
    print("\n(dry run — pakai --apply untuk tayang)")
    sys.exit(0)

now = datetime.now(WIB).replace(microsecond=0)
for i, a in enumerate(ARTIKEL):
    tayang = now + timedelta(minutes=2 * i)
    faq = [(html.unescape(re.sub(r"<[^>]+>", "", m.group(1))),
            html.unescape(re.sub(r"<[^>]+>", "", m.group(2))))
           for m in re.finditer(r"<h3>(.*?)</h3><p>(.*?)</p>", a["isi"], re.S)]
    isi = a["isi"] + "\n" + schema(faq) + "\n" + CTA
    payload = {"title": a["judul"], "slug": a["slug"], "content": isi, "status": "publish",
               "date": tayang.strftime("%Y-%m-%dT%H:%M:%S"), "categories": a["kategori"],
               "meta": {"_yoast_wpseo_focuskw": a["fokus"], "_yoast_wpseo_title": a["seo_title"],
                        "_yoast_wpseo_metadesc": a["meta"]}}
    st, p = api("/wp-json/wp/v2/posts", "POST", payload)
    if st not in (200, 201):
        print("   GAGAL:", st, str(p)[:250]); continue
    pid = p["id"]
    st, cek = api(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=status,date,slug,link,meta,content")
    raw = cek.get("content", {}).get("raw", "")
    print(f"   #{pid} {cek.get('status')} {cek.get('date')} {cek.get('link')} | meta="
          f"{[k for k in ('_yoast_wpseo_focuskw','_yoast_wpseo_metadesc') if cek.get('meta',{}).get(k)]} "
          f"| FAQ={'ya' if 'FAQPage' in raw else 'TIDAK'} | CTA={'ya' if 'ss-cta-wa' in raw else 'TIDAK'} "
          f"| kata={jumlah_kata(raw)}")
