Default

The file_path parameter is required. Let me fix that.

const { Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell,
        Header, Footer, AlignmentType, LevelFormat, HeadingLevel,
        BorderStyle, WidthType, ShadingType, PageNumber, PageBreak } = require('docx');
const fs = require('fs');

const border = { style: BorderStyle.SINGLE, size: 1, color: "CCCCCC" };
const borders = { top: border, bottom: border, left: border, right: border };

function cell(text, width, bold = false, fill = null) {
    return new TableCell({
        borders, width: { size: width, type: WidthType.DXA },
        shading: fill ? { fill, type: ShadingType.CLEAR } : undefined,
        margins: { top: 80, bottom: 80, left: 120, right: 120 },
        children: [new Paragraph({ children: [new TextRun({ text, bold, font: "Arial", size: 20 })] })]
    });
}
function headerCell(text, width) { return cell(text, width, true, "D5E8F0"); }
function highlightCell(text, width) { return cell(text, width, true, "E8F5E9"); }
function warnCell(text, width) { return cell(text, width, true, "FFF3E0"); }

function bullet(text) {
    return new Paragraph({ numbering: { reference: "bullets", level: 0 }, children: [new TextRun(text)] });
}
function bb(text) {
    return new Paragraph({ numbering: { reference: "bullets", level: 0 }, children: [new TextRun({ text, bold: true })] });
}

const doc = new Document({
    styles: {
        default: { document: { run: { font: "Arial", size: 22 } } },
        paragraphStyles: [
            { id: "Heading1", name: "Heading 1", basedOn: "Normal", next: "Normal", quickFormat: true,
              run: { size: 36, bold: true, font: "Arial", color: "1F4E79" },
              paragraph: { spacing: { before: 300, after: 200 }, outlineLevel: 0 } },
            { id: "Heading2", name: "Heading 2", basedOn: "Normal", next: "Normal", quickFormat: true,
              run: { size: 28, bold: true, font: "Arial", color: "2E75B6" },
              paragraph: { spacing: { before: 240, after: 120 }, outlineLevel: 1 } },
            { id: "Heading3", name: "Heading 3", basedOn: "Normal", next: "Normal", quickFormat: true,
              run: { size: 24, bold: true, font: "Arial", color: "333333" },
              paragraph: { spacing: { before: 180, after: 80 }, outlineLevel: 2 } },
        ]
    },
    numbering: {
        config: [
            { reference: "bullets",
              levels: [{ level: 0, format: LevelFormat.BULLET, text: "\u2022", alignment: AlignmentType.LEFT,
                style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] },
            { reference: "numbers",
              levels: [{ level: 0, format: LevelFormat.DECIMAL, text: "%1.", alignment: AlignmentType.LEFT,
                style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] },
        ]
    },
    sections: [{
        properties: { page: { size: { width: 12240, height: 15840 }, margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 } } },
        headers: { default: new Header({ children: [new Paragraph({ alignment: AlignmentType.RIGHT,
            children: [new TextRun({ text: "Proposal Strategi Meta Ads - Rolina", font: "Arial", size: 18, color: "666666" })] })] }) },
        footers: { default: new Footer({ children: [new Paragraph({ alignment: AlignmentType.CENTER,
            children: [new TextRun({ text: "Page ", font: "Arial", size: 18 }), new TextRun({ children: [PageNumber.CURRENT], font: "Arial", size: 18 })] })] }) },
        children: [
            new Paragraph({ spacing: { before: 2000 } }),
            new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: "PROPOSAL STRATEGI", font: "Arial", size: 56, bold: true, color: "1F4E79" })] }),
            new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: "Meta Ads & Analisis Kompetitor", font: "Arial", size: 44, color: "2E75B6" })] }),
            new Paragraph({ spacing: { before: 400 } }),
            new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: "ROLINA VISA SERVICES", font: "Arial", size: 36, bold: true, color: "333333" })] }),
            new Paragraph({ spacing: { before: 800 } }),
            new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: "Disusun oleh: Eko", font: "Arial", size: 22, color: "666666" })] }),
            new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: "31 Mei 2026", font: "Arial", size: 22, color: "999999" })] }),
            new Paragraph({ children: [new PageBreak()] }),

            new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("Ringkasan Eksekutif")] }),
            new Paragraph({ spacing: { before: 100 } }),
            new Paragraph({ children: [new TextRun("Dokumen ini berisi: perbandingan layanan Rolina vs 4 kompetitor utama, strategi funnel Meta Ads 3 tahap (TOFU-MOFU-BOFU), 3 opsi budget iklan (Rp 3-15 juta/bulan), dan estimasi jasa pengelolaan iklan.")] }),
            new Paragraph({ spacing: { before: 150 } }),
            bb("ROLINA UNGGUL: 20+ tahun pengalaman (kompetitor 5-12 tahun)"),
            bb("ROLINA UNGGUL: 7 jenis visa (kompetitor hanya 3-5)"),
            bullet("~510 iklan Meta Ads dari kompetitor - market sangat aktif"),
            bullet("Russian market paling banyak demand namun Rolina belum multi-bahasa"),
            bullet("Estimasi 30-90 leads/bulan tergantung budget iklan"),

            new Paragraph({ children: [new PageBreak()] }),

            new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("1. Profil Rolina Visa Services")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [3000, 6360],
                rows: [
                    new TableRow({ children: [headerCell("Detail", 3000), headerCell("Informasi", 6360)] }),
                    new TableRow({ children: [cell("Website", 3000), cell("rolinavisaservices.com", 6360)] }),
                    new TableRow({ children: [cell("Berdiri", 3000), cell("2012 - 20+ tahun pengalaman", 6360)] }),
                    new TableRow({ children: [cell("Lokasi", 3000), cell("Bali", 6360)] }),
                    new TableRow({ children: [cell("Telp/WA", 3000), cell("+62 361 487121 / +62 895 0900 6600", 6360)] }),
                    new TableRow({ children: [cell("Sosmed", 3000), cell("FB + IG (@rolinavisaservicesofficial)", 6360)] }),
                ]
            }),
            new Paragraph({ spacing: { before: 150 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("Layanan Rolina")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [2500, 6860],
                rows: [
                    new TableRow({ children: [headerCell("Layanan", 2500), headerCell("Deskripsi", 6860)] }),
                    new TableRow({ children: [cell("Tourist Visa", 2500), cell("Visa kunjungan wisata untuk WNA", 6860)] }),
                    new TableRow({ children: [cell("Working Visa", 2500), cell("Visa kerja / KITAS untuk tenaga kerja asing", 6860)] }),
                    new TableRow({ children: [cell("Study Visa", 2500), cell("Visa pelajar untuk mahasiswa asing", 6860)] }),
                    new TableRow({ children: [cell("Family Visa", 2500), cell("Visa penyatuan keluarga", 6860)] }),
                    new TableRow({ children: [cell("Immigrate Visa", 2500), cell("Visa imigrasi / business / investasi", 6860)] }),
                    new TableRow({ children: [cell("Diplomatic Visa", 2500), cell("Visa diplomatik untuk pejabat & VIP", 6860)] }),
                    new TableRow({ children: [cell("Transit Visa", 2500), cell("Visa transit singkat", 6860)] }),
                    new TableRow({ children: [cell("Tour Packages", 2500), cell("Paket wisata Bali (via Svaha Tour)", 6860)] }),
                ]
            }),

            new Paragraph({ children: [new PageBreak()] }),

            new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("2. Perbandingan Layanan vs Kompetitor")] }),
            new Paragraph({ spacing: { before: 100 } }),
            new Paragraph({ children: [new TextRun("Ditemukan ~510 iklan Meta Ads. Perbandingan Rolina vs 4 kompetitor:")] }),
            new Paragraph({ spacing: { before: 150 } }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [2000, 1600, 2000, 1900, 1860],
                rows: [
                    new TableRow({ children: [headerCell("Layanan", 2000), headerCell("ROLINA", 1600), headerCell("Bahalap Uras", 2000), headerCell("Peak", 1900), headerCell("eVisa Bali", 1860)] }),
                    new TableRow({ children: [cell("Tourist Visa", 2000), highlightCell("YES", 1600), cell("YES", 2000), cell("YES", 1900), cell("YES", 1860)] }),
                    new TableRow({ children: [cell("Working/KITAS", 2000), highlightCell("YES", 1600), cell("YES", 2000), cell("YES", 1900), cell("YES", 1860)] }),
                    new TableRow({ children: [cell("Study Visa", 2000), highlightCell("YES - UNIK", 1600), cell("NO", 2000), cell("NO", 1900), cell("NO", 1860)] }),
                    new TableRow({ children: [cell("Family Visa", 2000), highlightCell("YES - UNIK", 1600), cell("NO", 2000), cell("NO", 1900), cell("NO", 1860)] }),
                    new TableRow({ children: [cell("Diplomatic Visa", 2000), highlightCell("YES - UNIK", 1600), cell("NO", 2000), cell("NO", 1900), cell("NO", 1860)] }),
                    new TableRow({ children: [cell("Transit Visa", 2000), highlightCell("YES - UNIK", 1600), cell("NO", 2000), cell("NO", 1900), cell("NO", 1860)] }),
                    new TableRow({ children: [cell("Business/Invest", 2000), highlightCell("YES", 1600), cell("YES", 2000), cell("YES", 1900), cell("NO", 1860)] }),
                    new TableRow({ children: [cell("Tour Packages", 2000), highlightCell("YES - UNIK", 1600), cell("NO", 2000), cell("NO", 1900), cell("NO", 1860)] }),
                ]
            }),

            new Paragraph({ spacing: { before: 200 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("SWOT Rolina")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [4680, 4680],
                rows: [
                    new TableRow({ children: [headerCell("STRENGTHS", 4680), headerCell("WEAKNESSES", 4680)] }),
                    new TableRow({ children: [
                        cell("20+ tahun pengalaman\n7 jenis visa (terlengkap)\nTour packages cross-sell\nReal-time tracking\nKantor fisik Bali"),
                        cell("Belum multi-language\nPricing tidak di website\nHalaman layanan belum detail\nBelum Digital Nomad Visa\nRetirement Community kosong")])
                    }]),
                    new TableRow({ children: [headerCell("OPPORTUNITIES", 4680), headerCell("THREATS", 4680)] }),
                    new TableRow({ children: [
                        cell("Russian market besar\nDigital Nomad Visa trend\nVideo ads - belum ramai\nFamily/Study = niche unik\nBrand First in Bali"),
                        cell("Kompetitor agresif Meta Ads\nVISALF 30K+ customers\nMulti-bahasa competitor\neVOA dari pemerintah\nPerubahan regulasi")])
                    }]),
                ]
            }),

            new Paragraph({ children: [new PageBreak()] }),

            new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("3. Strategi Funnel Meta Ads")] }),
            new Paragraph({ spacing: { before: 100 } }),
            new Paragraph({ children: [new TextRun("Strategi 3 tahap: TOFU (awareness) -> MOFU (consideration) -> BOFU (conversion).")] }),

            new Paragraph({ spacing: { before: 200 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("3.1 TOFU - Top of Funnel (30% Budget)")] }),
            new Paragraph({ children: [new TextRun({ text: "Objective: Brand Awareness / Reach", bold: true })] }),
            bullet("Target: Interest Bali travel, tourism, expat. Countries: RU, UK, US, AU, DE, FR, NL. Age 25-55"),
            bullet("Exclude: People already in Indonesia"),
            bullet("Video 15-30s: Bali beauty footage + logo Rolina + 'First Visa Service in Bali Since 2012'"),
            bullet("Image Carousel: 'What You Need to Know About Bali' (5-7 slide edukasi ringan)"),
            bullet("Video: 'Meet the Rolina Team' - humanize the brand"),

            new Paragraph({ spacing: { before: 200 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("3.2 MOFU - Middle of Funnel (40% Budget)")] }),
            new Paragraph({ children: [new TextRun({ text: "Objective: Traffic / Engagement / Video Views", bold: true })] }),
            bullet("Target: People who engaged with TOFU. Lookalike 1-3% from existing customers. Website visitors last 30 days"),
            bullet("Video: 'Indonesia Visa Types Explained in 60 Seconds' - jelaskan semua jenis visa dengan cepat"),
            bullet("Infographic: 'Get Your Visa in 3 Simple Steps' - Konsultasi -> Dokumen -> Approved"),
            bullet("Testimonial Video: 'What Our Clients Say'"),
            bullet("Carousel: 'Why Choose Rolina?' - 20+ years, 7 visa types, tracking"),

            new Paragraph({ spacing: { before: 200 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("3.3 BOFU - Bottom of Funnel (30% Budget)")] }),
            new Paragraph({ children: [new TextRun({ text: "Objective: Conversion / Messages", bold: true })] }),
            bullet("Target: Website visitors 30-90 days. 50%+ video viewers. People who clicked 'Learn More'"),
            bullet("WhatsApp CTA: 'Chat Our Visa Expert Now' - langsung ke WA +62 895 0900 6600"),
            bullet("Offer Ad: 'Free Visa Consultation - Limited Slots' - urgency + free value"),
            bullet("Promo Ad: 'Visa Processing - Special Rate This Month'"),
            bullet("Social Proof: 'Join 1,000+ Happy Travelers'"),

            new Paragraph({ spacing: { before: 200 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("3.4 Content Calendar Bulan Pertama")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [1200, 1800, 2500, 3860],
                rows: [
                    new TableRow({ children: [headerCell("Minggu", 1200), headerCell("Funnel", 1800), headerCell("Tema", 2500), headerCell("Format", 3860)] }),
                    new TableRow({ children: [cell("1", 1200), cell("TOFU", 1800), cell("Welcome to Bali", 2500), cell("Video 30s: Bali footage + logo Rolina", 3860)] }),
                    new TableRow({ children: [cell("2", 1200), cell("TOFU+MOFU", 1800), cell("Why Bali + How to", 2500), cell("Carousel + Video: visa types 60s", 3860)] }),
                    new TableRow({ children: [cell("3", 1200), cell("MOFU", 1800), cell("Trust Building", 2500), cell("Testimonial video + Infographic 3 steps", 3860)] }),
                    new TableRow({ children: [cell("4", 1200), cell("BOFU", 1800), cell("Conversion", 2500), cell("WhatsApp CTA + Limited Offer promo", 3860)] }),
                ]
            }),

            new Paragraph({ children: [new PageBreak()] }),

            new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("4. Budget Iklan (Ad Spend)")] }),
            new Paragraph({ spacing: { before: 100 } }),
            new Paragraph({ children: [new TextRun("Tiga opsi budget dengan estimasi reach, klik, dan leads. Kurs: ~Rp 16.500/USD.")] }),
            new Paragraph({ spacing: { before: 150 } }),

            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("Paket A - Starter")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [2800, 6560],
                rows: [
                    new TableRow({ children: [headerCell("Item", 2800), headerCell("Detail", 6560)] }),
                    new TableRow({ children: [cell("Budget Harian", 2800), cell("$6-10/hari (~Rp 100-165 rb)", 6560)] }),
                    new TableRow({ children: [cell("Budget Bulanan", 2800), cell("Rp 3-5 juta", 6560)] }),
                    new TableRow({ children: [cell("Alokasi Funnel", 2800), cell("TOFU 40% | MOFU 35% | BOFU 25%", 6560)] }),
                    new TableRow({ children: [cell("Estimasi Reach", 2800), cell("30.000 - 50.000 orang/bulan", 6560)] }),
                    new TableRow({ children: [cell("Estimasi Leads", 2800), cell("15 - 30 leads/bulan", 6560)] }),
                ]
            }),

            new Paragraph({ spacing: { before: 250 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("Paket B - Growth (REKOMENDASI)")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [2800, 6560],
                rows: [
                    new TableRow({ children: [headerCell("Item", 2800), headerCell("Detail", 6560)] }),
                    new TableRow({ children: [cell("Budget Harian", 2800), highlightCell("$12-18/hari (~Rp 200-300 rb)", 6560)] }),
                    new TableRow({ children: [cell("Budget Bulanan", 2800), highlightCell("Rp 6-9 juta", 6560)] }),
                    new TableRow({ children: [cell("Alokasi Funnel", 2800), cell("TOFU 30% | MOFU 40% | BOFU 30%", 6560)] }),
                    new TableRow({ children: [cell("Estimasi Reach", 2800), cell("60.000 - 100.000 orang/bulan", 6560)] }),
                    new TableRow({ children: [cell("Estimasi Leads", 2800), cell("30 - 60 leads/bulan", 6560)] }),
                ]
            }),

            new Paragraph({ spacing: { before: 250 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("Paket C - Aggressive")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [2800, 6560],
                rows: [
                    new TableRow({ children: [headerCell("Item", 2800), headerCell("Detail", 6560)] }),
                    new TableRow({ children: [cell("Budget Harian", 2800), cell("$25-30/hari (~Rp 400-500 rb)", 6560)] }),
                    new TableRow({ children: [cell("Budget Bulanan", 2800), cell("Rp 12-15 juta", 6560)] }),
                    new TableRow({ children: [cell("Alokasi Funnel", 2800), cell("TOFU 20% | MOFU 30% | BOFU 50%", 6560)] }),
                    new TableRow({ children: [cell("Estimasi Reach", 2800), cell("100.000 - 180.000 orang/bulan", 6560)] }),
                    new TableRow({ children: [cell("Estimasi Leads", 2800), cell("50 - 90 leads/bulan", 6560)] }),
                ]
            }),

            new Paragraph({ spacing: { before: 250 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("Ringkasan Perbandingan")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [2200, 2400, 2480, 2280],
                rows: [
                    new TableRow({ children: [headerCell("", 2200), headerCell("Starter", 2400), headerCell("Growth", 2480), headerCell("Aggressive", 2280)] }),
                    new TableRow({ children: [cell("Budget/bln", 2200), cell("Rp 3-5 jt", 2400), highlightCell("Rp 6-9 jt", 2480), cell("Rp 12-15 jt", 2280)] }),
                    new TableRow({ children: [cell("Reach", 2200), cell("30K-50K", 2400), highlightCell("60K-100K", 2480), cell("100K-180K", 2280)] }),
                    new TableRow({ children: [cell("Leads", 2200), cell("15-30", 2400), highlightCell("30-60", 2480), cell("50-90", 2280)] }),
                    new TableRow({ children: [cell("Cocok", 2200), cell("Testing", 2400), highlightCell("Scale-up", 2480), cell("Cepat scale", 2280)] }),
                ]
            }),

            new Paragraph({ children: [new PageBreak()] }),

            new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("5. Estimasi Jasa Advertiser")] }),
            new Paragraph({ spacing: { before: 100 } }),
            new Paragraph({ children: [new TextRun("Biaya jasa pengelolaan Meta Ads (setup, manajemen, optimasi, reporting). Tidak termasuk ad spend.")] }),

            new Paragraph({ spacing: { before: 150 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("5.1 Lingkup Pekerjaan")] }),
            bullet("Account setup: Business Manager, Pixel, Conversion API, audience setup"),
            bullet("Creative strategy: konsep konten, copywriting, brief visual"),
            bullet("Campaign management: setup, monitoring, optimasi harian"),
            bullet("A/B testing: audience, creative, placement"),
            bullet("Monthly reporting: performance metrics, insights, rekomendasi"),
            bullet("Komunikasi WA/email: koordinasi konten & update"),

            new Paragraph({ spacing: { before: 200 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("5.2 Opsi Biaya Jasa")] }),
            new Paragraph({ spacing: { before: 100 } }),

            new Paragraph({ heading: HeadingLevel.HEADING_3, children: [new TextRun("Opsi A - Monthly Retainer (Recommended)")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [2800, 6560],
                rows: [
                    new TableRow({ children: [headerCell("Paket", 2800), headerCell("Biaya & Detail", 6560)] }),
                    new TableRow({ children: [cell("Basic", 2800), cell("Rp 4.000.000/bulan - 1 campaign, 2-3 ad sets, basic reporting", 6560)] }),
                    new TableRow({ children: [cell("Standard", 2800), highlightCell("Rp 6.000.000/bulan - 2-3 campaigns, A/B testing, weekly reporting, creative assist", 6560)] }),
                    new TableRow({ children: [cell("Premium", 2800), cell("Rp 8.000.000/bulan - Full funnel, custom audiences, landing page opt., detailed analytics", 6560)] }),
                ]
            }),

            new Paragraph({ spacing: { before: 150 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_3, children: [new TextRun("Opsi B - Project Based")] }),
            bullet("Setup fee (one-time): Rp 3.000.000"),
            bullet("Monthly management: Rp 3.000.000/bulan"),

            new Paragraph({ spacing: { before: 150 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_3, children: [new TextRun("Opsi C - Performance Based")] }),
            bullet("Base fee: Rp 2.500.000/bulan + 10% dari total leads yang masuk via WA/Call"),
            bullet("Cocok jika ingin sharing risk - semakin banyak leads, semakin besar fee"),

            new Paragraph({ spacing: { before: 200 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("5.3 Estimasi Total Biaya (Ad Spend + Jasa)")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [2200, 2200, 2500, 2460],
                rows: [
                    new TableRow({ children: [headerCell("Kombinasi", 2200), headerCell("Ad Spend", 2200), headerCell("Jasa (Retainer)", 2500), headerCell("Total/Bulan", 2460)] }),
                    new TableRow({ children: [cell("Starter + Basic", 2200), cell("Rp 3-5 jt", 2200), cell("Rp 4 jt", 2500), cell("Rp 7-9 jt", 2460)] }),
                    new TableRow({ children: [cell("Growth + Standard", 2200), cell("Rp 6-9 jt", 2200), cell("Rp 6 jt", 2500), highlightCell("Rp 12-15 jt", 2460)] }),
                    new TableRow({ children: [cell("Aggressive + Premium", 2200), cell("Rp 12-15 jt", 2200), cell("Rp 8 jt", 2500), cell("Rp 20-23 jt", 2460)] }),
                ]
            }),

            new Paragraph({ spacing: { before: 250 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("6. Rekomendasi untuk Rolina")] }),
            new Paragraph({ spacing: { before: 100 } }),
            bullet("Segera tambahkan multi-language content - minimal Russian & English di website"),
            bullet("Buat halaman detail per layanan visa (bukan hanya list)"),
            bullet("Tampilkan pricing di website - transparansi meningkatkan trust"),
            bullet("Fokuskan iklan ke Study Visa & Family Visa - ini niche unik yang tidak dimiliki kompetitor"),
            bullet("Gunakan WhatsApp sebagai main CTA - terbukti paling efektif dari kompetitor"),
            bullet("Manfaatkan angle 'First & Most Experienced in Bali - 20+ Years' di semua iklan"),

            new Paragraph({ spacing: { before: 400 } }),
            new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: "==========================================", font: "Arial", size: 20, color: "CCCCCC" })] }),
            new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: "Disusun 31 Mei 2026 - Data dari Meta Ads Library & Website Kompetitor", font: "Arial", size: 18, color: "999999", italics: true })] }),
        ]
    }]
});

Packer.toBuffer(doc).then(buffer => {
    fs.writeFileSync("/app/working/workspaces/default/Proposal_Rolina_Meta_Ads.docx", buffer);
    console.log("Document created: Proposal_Rolina_Meta_Ads.docx");
});

const { Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell,
        Header, Footer, AlignmentType, LevelFormat, HeadingLevel,
        BorderStyle, WidthType, ShadingType, PageNumber, PageBreak } = require('docx');
const fs = require('fs');

const border = { style: BorderStyle.SINGLE, size: 1, color: "CCCCCC" };
const borders = { top: border, bottom: border, left: border, right: border };

function cell(text, width, bold = false, fill = null) {
    return new TableCell({
        borders, width: { size: width, type: WidthType.DXA },
        shading: fill ? { fill, type: ShadingType.CLEAR } : undefined,
        margins: { top: 80, bottom: 80, left: 120, right: 120 },
        children: [new Paragraph({ children: [new TextRun({ text, bold, font: "Arial", size: 20 })] })]
    });
}
function headerCell(text, width) { return cell(text, width, true, "D5E8F0"); }
function highlightCell(text, width) { return cell(text, width, true, "E8F5E9"); }
function warnCell(text, width) { return cell(text, width, true, "FFF3E0"); }

function bullet(text) {
    return new Paragraph({ numbering: { reference: "bullets", level: 0 }, children: [new TextRun(text)] });
}
function bb(text) {
    return new Paragraph({ numbering: { reference: "bullets", level: 0 }, children: [new TextRun({ text, bold: true })] });
}

const doc = new Document({
    styles: {
        default: { document: { run: { font: "Arial", size: 22 } } },
        paragraphStyles: [
            { id: "Heading1", name: "Heading 1", basedOn: "Normal", next: "Normal", quickFormat: true,
              run: { size: 36, bold: true, font: "Arial", color: "1F4E79" },
              paragraph: { spacing: { before: 300, after: 200 }, outlineLevel: 0 } },
            { id: "Heading2", name: "Heading 2", basedOn: "Normal", next: "Normal", quickFormat: true,
              run: { size: 28, bold: true, font: "Arial", color: "2E75B6" },
              paragraph: { spacing: { before: 240, after: 120 }, outlineLevel: 1 } },
            { id: "Heading3", name: "Heading 3", basedOn: "Normal", next: "Normal", quickFormat: true,
              run: { size: 24, bold: true, font: "Arial", color: "333333" },
              paragraph: { spacing: { before: 180, after: 80 }, outlineLevel: 2 } },
        ]
    },
    numbering: {
        config: [
            { reference: "bullets",
              levels: [{ level: 0, format: LevelFormat.BULLET, text: "\u2022", alignment: AlignmentType.LEFT,
                style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] },
            { reference: "numbers",
              levels: [{ level: 0, format: LevelFormat.DECIMAL, text: "%1.", alignment: AlignmentType.LEFT,
                style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] },
        ]
    },
    sections: [{
        properties: { page: { size: { width: 12240, height: 15840 }, margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 } } },
        headers: { default: new Header({ children: [new Paragraph({ alignment: AlignmentType.RIGHT,
            children: [new TextRun({ text: "Proposal Strategi Meta Ads - Rolina", font: "Arial", size: 18, color: "666666" })] })] }) },
        footers: { default: new Footer({ children: [new Paragraph({ alignment: AlignmentType.CENTER,
            children: [new TextRun({ text: "Page ", font: "Arial", size: 18 }), new TextRun({ children: [PageNumber.CURRENT], font: "Arial", size: 18 })] })] }) },
        children: [
            new Paragraph({ spacing: { before: 2000 } }),
            new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: "PROPOSAL STRATEGI", font: "Arial", size: 56, bold: true, color: "1F4E79" })] }),
            new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: "Meta Ads & Analisis Kompetitor", font: "Arial", size: 44, color: "2E75B6" })] }),
            new Paragraph({ spacing: { before: 400 } }),
            new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: "ROLINA VISA SERVICES", font: "Arial", size: 36, bold: true, color: "333333" })] }),
            new Paragraph({ spacing: { before: 800 } }),
            new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: "Disusun oleh: Eko", font: "Arial", size: 22, color: "666666" })] }),
            new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: "31 Mei 2026", font: "Arial", size: 22, color: "999999" })] }),
            new Paragraph({ children: [new PageBreak()] }),

            new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("Ringkasan Eksekutif")] }),
            new Paragraph({ spacing: { before: 100 } }),
            new Paragraph({ children: [new TextRun("Dokumen ini berisi: perbandingan layanan Rolina vs 4 kompetitor utama, strategi funnel Meta Ads 3 tahap (TOFU-MOFU-BOFU), 3 opsi budget iklan (Rp 3-15 juta/bulan), dan estimasi jasa pengelolaan iklan.")] }),
            new Paragraph({ spacing: { before: 150 } }),
            bb("ROLINA UNGGUL: 20+ tahun pengalaman (kompetitor 5-12 tahun)"),
            bb("ROLINA UNGGUL: 7 jenis visa (kompetitor hanya 3-5)"),
            bullet("~510 iklan Meta Ads dari kompetitor - market sangat aktif"),
            bullet("Russian market paling banyak demand namun Rolina belum multi-bahasa"),
            bullet("Estimasi 30-90 leads/bulan tergantung budget iklan"),

            new Paragraph({ children: [new PageBreak()] }),

            new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("1. Profil Rolina Visa Services")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [3000, 6360],
                rows: [
                    new TableRow({ children: [headerCell("Detail", 3000), headerCell("Informasi", 6360)] }),
                    new TableRow({ children: [cell("Website", 3000), cell("rolinavisaservices.com", 6360)] }),
                    new TableRow({ children: [cell("Berdiri", 3000), cell("2012 - 20+ tahun pengalaman", 6360)] }),
                    new TableRow({ children: [cell("Lokasi", 3000), cell("Bali", 6360)] }),
                    new TableRow({ children: [cell("Telp/WA", 3000), cell("+62 361 487121 / +62 895 0900 6600", 6360)] }),
                    new TableRow({ children: [cell("Sosmed", 3000), cell("FB + IG (@rolinavisaservicesofficial)", 6360)] }),
                ]
            }),
            new Paragraph({ spacing: { before: 150 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("Layanan Rolina")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [2500, 6860],
                rows: [
                    new TableRow({ children: [headerCell("Layanan", 2500), headerCell("Deskripsi", 6860)] }),
                    new TableRow({ children: [cell("Tourist Visa", 2500), cell("Visa kunjungan wisata untuk WNA", 6860)] }),
                    new TableRow({ children: [cell("Working Visa", 2500), cell("Visa kerja / KITAS untuk tenaga kerja asing", 6860)] }),
                    new TableRow({ children: [cell("Study Visa", 2500), cell("Visa pelajar untuk mahasiswa asing", 6860)] }),
                    new TableRow({ children: [cell("Family Visa", 2500), cell("Visa penyatuan keluarga", 6860)] }),
                    new TableRow({ children: [cell("Immigrate Visa", 2500), cell("Visa imigrasi / business / investasi", 6860)] }),
                    new TableRow({ children: [cell("Diplomatic Visa", 2500), cell("Visa diplomatik untuk pejabat & VIP", 6860)] }),
                    new TableRow({ children: [cell("Transit Visa", 2500), cell("Visa transit singkat", 6860)] }),
                    new TableRow({ children: [cell("Tour Packages", 2500), cell("Paket wisata Bali (via Svaha Tour)", 6860)] }),
                ]
            }),

            new Paragraph({ children: [new PageBreak()] }),

            new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("2. Perbandingan Layanan vs Kompetitor")] }),
            new Paragraph({ spacing: { before: 100 } }),
            new Paragraph({ children: [new TextRun("Ditemukan ~510 iklan Meta Ads. Perbandingan Rolina vs 4 kompetitor:")] }),
            new Paragraph({ spacing: { before: 150 } }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [2000, 1600, 2000, 1900, 1860],
                rows: [
                    new TableRow({ children: [headerCell("Layanan", 2000), headerCell("ROLINA", 1600), headerCell("Bahalap Uras", 2000), headerCell("Peak", 1900), headerCell("eVisa Bali", 1860)] }),
                    new TableRow({ children: [cell("Tourist Visa", 2000), highlightCell("YES", 1600), cell("YES", 2000), cell("YES", 1900), cell("YES", 1860)] }),
                    new TableRow({ children: [cell("Working/KITAS", 2000), highlightCell("YES", 1600), cell("YES", 2000), cell("YES", 1900), cell("YES", 1860)] }),
                    new TableRow({ children: [cell("Study Visa", 2000), highlightCell("YES - UNIK", 1600), cell("NO", 2000), cell("NO", 1900), cell("NO", 1860)] }),
                    new TableRow({ children: [cell("Family Visa", 2000), highlightCell("YES - UNIK", 1600), cell("NO", 2000), cell("NO", 1900), cell("NO", 1860)] }),
                    new TableRow({ children: [cell("Diplomatic Visa", 2000), highlightCell("YES - UNIK", 1600), cell("NO", 2000), cell("NO", 1900), cell("NO", 1860)] }),
                    new TableRow({ children: [cell("Transit Visa", 2000), highlightCell("YES - UNIK", 1600), cell("NO", 2000), cell("NO", 1900), cell("NO", 1860)] }),
                    new TableRow({ children: [cell("Business/Invest", 2000), highlightCell("YES", 1600), cell("YES", 2000), cell("YES", 1900), cell("NO", 1860)] }),
                    new TableRow({ children: [cell("Tour Packages", 2000), highlightCell("YES - UNIK", 1600), cell("NO", 2000), cell("NO", 1900), cell("NO", 1860)] }),
                ]
            }),

            new Paragraph({ spacing: { before: 200 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("SWOT Rolina")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [4680, 4680],
                rows: [
                    new TableRow({ children: [headerCell("STRENGTHS", 4680), headerCell("WEAKNESSES", 4680)] }),
                    new TableRow({ children: [
                        cell("20+ tahun pengalaman\n7 jenis visa (terlengkap)\nTour packages cross-sell\nReal-time tracking\nKantor fisik Bali"),
                        cell("Belum multi-language\nPricing tidak di website\nHalaman layanan belum detail\nBelum Digital Nomad Visa\nRetirement Community kosong")])
                    }]),
                    new TableRow({ children: [headerCell("OPPORTUNITIES", 4680), headerCell("THREATS", 4680)] }),
                    new TableRow({ children: [
                        cell("Russian market besar\nDigital Nomad Visa trend\nVideo ads - belum ramai\nFamily/Study = niche unik\nBrand First in Bali"),
                        cell("Kompetitor agresif Meta Ads\nVISALF 30K+ customers\nMulti-bahasa competitor\neVOA dari pemerintah\nPerubahan regulasi")])
                    }]),
                ]
            }),

            new Paragraph({ children: [new PageBreak()] }),

            new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("3. Strategi Funnel Meta Ads")] }),
            new Paragraph({ spacing: { before: 100 } }),
            new Paragraph({ children: [new TextRun("Strategi 3 tahap: TOFU (awareness) -> MOFU (consideration) -> BOFU (conversion).")] }),

            new Paragraph({ spacing: { before: 200 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("3.1 TOFU - Top of Funnel (30% Budget)")] }),
            new Paragraph({ children: [new TextRun({ text: "Objective: Brand Awareness / Reach", bold: true })] }),
            bullet("Target: Interest Bali travel, tourism, expat. Countries: RU, UK, US, AU, DE, FR, NL. Age 25-55"),
            bullet("Exclude: People already in Indonesia"),
            bullet("Video 15-30s: Bali beauty footage + logo Rolina + 'First Visa Service in Bali Since 2012'"),
            bullet("Image Carousel: 'What You Need to Know About Bali' (5-7 slide edukasi ringan)"),
            bullet("Video: 'Meet the Rolina Team' - humanize the brand"),

            new Paragraph({ spacing: { before: 200 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("3.2 MOFU - Middle of Funnel (40% Budget)")] }),
            new Paragraph({ children: [new TextRun({ text: "Objective: Traffic / Engagement / Video Views", bold: true })] }),
            bullet("Target: People who engaged with TOFU. Lookalike 1-3% from existing customers. Website visitors last 30 days"),
            bullet("Video: 'Indonesia Visa Types Explained in 60 Seconds' - jelaskan semua jenis visa dengan cepat"),
            bullet("Infographic: 'Get Your Visa in 3 Simple Steps' - Konsultasi -> Dokumen -> Approved"),
            bullet("Testimonial Video: 'What Our Clients Say'"),
            bullet("Carousel: 'Why Choose Rolina?' - 20+ years, 7 visa types, tracking"),

            new Paragraph({ spacing: { before: 200 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("3.3 BOFU - Bottom of Funnel (30% Budget)")] }),
            new Paragraph({ children: [new TextRun({ text: "Objective: Conversion / Messages", bold: true })] }),
            bullet("Target: Website visitors 30-90 days. 50%+ video viewers. People who clicked 'Learn More'"),
            bullet("WhatsApp CTA: 'Chat Our Visa Expert Now' - langsung ke WA +62 895 0900 6600"),
            bullet("Offer Ad: 'Free Visa Consultation - Limited Slots' - urgency + free value"),
            bullet("Promo Ad: 'Visa Processing - Special Rate This Month'"),
            bullet("Social Proof: 'Join 1,000+ Happy Travelers'"),

            new Paragraph({ spacing: { before: 200 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("3.4 Content Calendar Bulan Pertama")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [1200, 1800, 2500, 3860],
                rows: [
                    new TableRow({ children: [headerCell("Minggu", 1200), headerCell("Funnel", 1800), headerCell("Tema", 2500), headerCell("Format", 3860)] }),
                    new TableRow({ children: [cell("1", 1200), cell("TOFU", 1800), cell("Welcome to Bali", 2500), cell("Video 30s: Bali footage + logo Rolina", 3860)] }),
                    new TableRow({ children: [cell("2", 1200), cell("TOFU+MOFU", 1800), cell("Why Bali + How to", 2500), cell("Carousel + Video: visa types 60s", 3860)] }),
                    new TableRow({ children: [cell("3", 1200), cell("MOFU", 1800), cell("Trust Building", 2500), cell("Testimonial video + Infographic 3 steps", 3860)] }),
                    new TableRow({ children: [cell("4", 1200), cell("BOFU", 1800), cell("Conversion", 2500), cell("WhatsApp CTA + Limited Offer promo", 3860)] }),
                ]
            }),

            new Paragraph({ children: [new PageBreak()] }),

            new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("4. Budget Iklan (Ad Spend)")] }),
            new Paragraph({ spacing: { before: 100 } }),
            new Paragraph({ children: [new TextRun("Tiga opsi budget dengan estimasi reach, klik, dan leads. Kurs: ~Rp 16.500/USD.")] }),
            new Paragraph({ spacing: { before: 150 } }),

            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("Paket A - Starter")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [2800, 6560],
                rows: [
                    new TableRow({ children: [headerCell("Item", 2800), headerCell("Detail", 6560)] }),
                    new TableRow({ children: [cell("Budget Harian", 2800), cell("$6-10/hari (~Rp 100-165 rb)", 6560)] }),
                    new TableRow({ children: [cell("Budget Bulanan", 2800), cell("Rp 3-5 juta", 6560)] }),
                    new TableRow({ children: [cell("Alokasi Funnel", 2800), cell("TOFU 40% | MOFU 35% | BOFU 25%", 6560)] }),
                    new TableRow({ children: [cell("Estimasi Reach", 2800), cell("30.000 - 50.000 orang/bulan", 6560)] }),
                    new TableRow({ children: [cell("Estimasi Leads", 2800), cell("15 - 30 leads/bulan", 6560)] }),
                ]
            }),

            new Paragraph({ spacing: { before: 250 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("Paket B - Growth (REKOMENDASI)")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [2800, 6560],
                rows: [
                    new TableRow({ children: [headerCell("Item", 2800), headerCell("Detail", 6560)] }),
                    new TableRow({ children: [cell("Budget Harian", 2800), highlightCell("$12-18/hari (~Rp 200-300 rb)", 6560)] }),
                    new TableRow({ children: [cell("Budget Bulanan", 2800), highlightCell("Rp 6-9 juta", 6560)] }),
                    new TableRow({ children: [cell("Alokasi Funnel", 2800), cell("TOFU 30% | MOFU 40% | BOFU 30%", 6560)] }),
                    new TableRow({ children: [cell("Estimasi Reach", 2800), cell("60.000 - 100.000 orang/bulan", 6560)] }),
                    new TableRow({ children: [cell("Estimasi Leads", 2800), cell("30 - 60 leads/bulan", 6560)] }),
                ]
            }),

            new Paragraph({ spacing: { before: 250 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("Paket C - Aggressive")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [2800, 6560],
                rows: [
                    new TableRow({ children: [headerCell("Item", 2800), headerCell("Detail", 6560)] }),
                    new TableRow({ children: [cell("Budget Harian", 2800), cell("$25-30/hari (~Rp 400-500 rb)", 6560)] }),
                    new TableRow({ children: [cell("Budget Bulanan", 2800), cell("Rp 12-15 juta", 6560)] }),
                    new TableRow({ children: [cell("Alokasi Funnel", 2800), cell("TOFU 20% | MOFU 30% | BOFU 50%", 6560)] }),
                    new TableRow({ children: [cell("Estimasi Reach", 2800), cell("100.000 - 180.000 orang/bulan", 6560)] }),
                    new TableRow({ children: [cell("Estimasi Leads", 2800), cell("50 - 90 leads/bulan", 6560)] }),
                ]
            }),

            new Paragraph({ spacing: { before: 250 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("Ringkasan Perbandingan")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [2200, 2400, 2480, 2280],
                rows: [
                    new TableRow({ children: [headerCell("", 2200), headerCell("Starter", 2400), headerCell("Growth", 2480), headerCell("Aggressive", 2280)] }),
                    new TableRow({ children: [cell("Budget/bln", 2200), cell("Rp 3-5 jt", 2400), highlightCell("Rp 6-9 jt", 2480), cell("Rp 12-15 jt", 2280)] }),
                    new TableRow({ children: [cell("Reach", 2200), cell("30K-50K", 2400), highlightCell("60K-100K", 2480), cell("100K-180K", 2280)] }),
                    new TableRow({ children: [cell("Leads", 2200), cell("15-30", 2400), highlightCell("30-60", 2480), cell("50-90", 2280)] }),
                    new TableRow({ children: [cell("Cocok", 2200), cell("Testing", 2400), highlightCell("Scale-up", 2480), cell("Cepat scale", 2280)] }),
                ]
            }),

            new Paragraph({ children: [new PageBreak()] }),

            new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("5. Estimasi Jasa Advertiser")] }),
            new Paragraph({ spacing: { before: 100 } }),
            new Paragraph({ children: [new TextRun("Biaya jasa pengelolaan Meta Ads (setup, manajemen, optimasi, reporting). Tidak termasuk ad spend.")] }),

            new Paragraph({ spacing: { before: 150 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("5.1 Lingkup Pekerjaan")] }),
            bullet("Account setup: Business Manager, Pixel, Conversion API, audience setup"),
            bullet("Creative strategy: konsep konten, copywriting, brief visual"),
            bullet("Campaign management: setup, monitoring, optimasi harian"),
            bullet("A/B testing: audience, creative, placement"),
            bullet("Monthly reporting: performance metrics, insights, rekomendasi"),
            bullet("Komunikasi WA/email: koordinasi konten & update"),

            new Paragraph({ spacing: { before: 200 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("5.2 Opsi Biaya Jasa")] }),
            new Paragraph({ spacing: { before: 100 } }),

            new Paragraph({ heading: HeadingLevel.HEADING_3, children: [new TextRun("Opsi A - Monthly Retainer (Recommended)")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [2800, 6560],
                rows: [
                    new TableRow({ children: [headerCell("Paket", 2800), headerCell("Biaya & Detail", 6560)] }),
                    new TableRow({ children: [cell("Basic", 2800), cell("Rp 4.000.000/bulan - 1 campaign, 2-3 ad sets, basic reporting", 6560)] }),
                    new TableRow({ children: [cell("Standard", 2800), highlightCell("Rp 6.000.000/bulan - 2-3 campaigns, A/B testing, weekly reporting, creative assist", 6560)] }),
                    new TableRow({ children: [cell("Premium", 2800), cell("Rp 8.000.000/bulan - Full funnel, custom audiences, landing page opt., detailed analytics", 6560)] }),
                ]
            }),

            new Paragraph({ spacing: { before: 150 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_3, children: [new TextRun("Opsi B - Project Based")] }),
            bullet("Setup fee (one-time): Rp 3.000.000"),
            bullet("Monthly management: Rp 3.000.000/bulan"),

            new Paragraph({ spacing: { before: 150 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_3, children: [new TextRun("Opsi C - Performance Based")] }),
            bullet("Base fee: Rp 2.500.000/bulan + 10% dari total leads yang masuk via WA/Call"),
            bullet("Cocok jika ingin sharing risk - semakin banyak leads, semakin besar fee"),

            new Paragraph({ spacing: { before: 200 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_2, children: [new TextRun("5.3 Estimasi Total Biaya (Ad Spend + Jasa)")] }),
            new Table({
                width: { size: 9360, type: WidthType.DXA }, columnWidths: [2200, 2200, 2500, 2460],
                rows: [
                    new TableRow({ children: [headerCell("Kombinasi", 2200), headerCell("Ad Spend", 2200), headerCell("Jasa (Retainer)", 2500), headerCell("Total/Bulan", 2460)] }),
                    new TableRow({ children: [cell("Starter + Basic", 2200), cell("Rp 3-5 jt", 2200), cell("Rp 4 jt", 2500), cell("Rp 7-9 jt", 2460)] }),
                    new TableRow({ children: [cell("Growth + Standard", 2200), cell("Rp 6-9 jt", 2200), cell("Rp 6 jt", 2500), highlightCell("Rp 12-15 jt", 2460)] }),
                    new TableRow({ children: [cell("Aggressive + Premium", 2200), cell("Rp 12-15 jt", 2200), cell("Rp 8 jt", 2500), cell("Rp 20-23 jt", 2460)] }),
                ]
            }),

            new Paragraph({ spacing: { before: 250 } }),
            new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("6. Rekomendasi untuk Rolina")] }),
            new Paragraph({ spacing: { before: 100 } }),
            bullet("Segera tambahkan multi-language content - minimal Russian & English di website"),
            bullet("Buat halaman detail per layanan visa (bukan hanya list)"),
            bullet("Tampilkan pricing di website - transparansi meningkatkan trust"),
            bullet("Fokuskan iklan ke Study Visa & Family Visa - ini niche unik yang tidak dimiliki kompetitor"),
            bullet("Gunakan WhatsApp sebagai main CTA - terbukti paling efektif dari kompetitor"),
            bullet("Manfaatkan angle 'First & Most Experienced in Bali - 20+ Years' di semua iklan"),

            new Paragraph({ spacing: { before: 400 } }),
            new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: "==========================================", font: "Arial", size: 20, color: "CCCCCC" })] }),
            new Paragraph({ alignment: AlignmentType.CENTER, children: [new TextRun({ text: "Disusun 31 Mei 2026 - Data dari Meta Ads Library & Website Kompetitor", font: "Arial", size: 18, color: "999999", italics: true })] }),
        ]
    }]
});

Packer.toBuffer(doc).then(buffer => {
    fs.writeFileSync("/app/working/workspaces/default/Proposal_Rolina_Meta_Ads.docx", buffer);
    console.log("Document created: Proposal_Rolina_Meta_Ads.docx");
});


system

Wrote 25378 bytes to /app/working/workspaces/default/generate_rolina_report.js.


Default

cd /app/working/workspaces/default && node generate_rolina_report.js

cd /app/working/workspaces/default && node generate_rolina_report.js


system

Command failed with exit code 1.
[stderr]
/app/working/workspaces/default/generate_rolina_report.js:140
                        cell("Belum multi-language\nPricing tidak di website\nHalaman layanan belum detail\nBelum Digital Nomad Visa\nRetirement Community kosong")])
                                                                                ^

SyntaxError: Unexpected token ')'
    at wrapSafe (node:internal/modules/cjs/loader:1740:18)
    at Module._compile (node:internal/modules/cjs/loader:1783:20)
    at Object..js (node:internal/modules/cjs/loader:1940:10)
    at Module.load (node:internal/modules/cjs/loader:1530:32)
    at Module._load (node:internal/modules/cjs/loader:1332:12)
    at wrapModuleLoad (node:internal/modules/cjs/loader:255:19)
    at Module.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:154:5)
    at node:internal/main/run_main_module:33:47

Node.js v25.6.0


Default

There's a syntax error. The issue is at line 140 where there's an extra closing bracket. Let me fix it.

cell("Belum multi-language\nPricing tidak di website\nHalaman layanan belum detail\nBelum Digital Nomad Visa\nRetirement Community kosong"])

cell("Belum multi-language\nPricing tidak di website\nHalaman layanan belum detail\nBelum Digital Nomad Visa\nRetirement Community kosong", 4680)] }),

cell("Belum multi-language\nPricing tidak di website\nHalaman layanan belum detail\nBelum Digital Nomad Visa\nRetirement Community kosong"])

cell("Belum multi-language\nPricing tidak di website\nHalaman layanan belum detail\nBelum Digital Nomad Visa\nRetirement Community kosong", 4680)] }),


system

Error: The text to replace was not found in /app/working/workspaces/default/generate_rolina_report.js.


Default

Let me read the file around line 140 to see exactly what's there.


system

                width: { size: 9360, type: WidthType.DXA }, columnWidths: [4680, 4680],
                rows: [
                    new TableRow({ children: [headerCell("STRENGTHS", 4680), headerCell("WEAKNESSES", 4680)] }),
                    new TableRow({ children: [
                        cell("20+ tahun pengalaman\n7 jenis visa (terlengkap)\nTour packages cross-sell\nReal-time tracking\nKantor fisik Bali"),
                        cell("Belum multi-language\nPricing tidak di website\nHalaman layanan belum detail\nBelum Digital Nomad Visa\nRetirement Community kosong")])
                    }]),
                    new TableRow({ children: [headerCell("OPPORTUNITIES", 4680), headerCell("THREATS", 4680)] }),
                    new TableRow({ children: [
                        cell("Russian market besar\nDigital Nomad Visa trend\nVideo ads - belum ramai\nFamily/Study = niche unik\nBrand First in Bali"),
                        cell("Kompetitor agresif Meta Ads\nVISALF 30K+ customers\nMulti-bahasa competitor\neVOA dari pemerintah\nPerubahan regulasi")])
                    }]),
                ]
            }),

            new Paragraph({ children: [new PageBreak()] }),

            new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("3. Strategi Funnel Meta Ads")] }),
            new Paragraph({ spacing: { before: 100 } }),
            new Paragraph({ children: [new TextRun("Strategi 3 tahap: TOFU (awareness) -> MOFU (consideration) -> BOFU (conversion).")] }),
<<<TRUNCATED>>>
The output above was truncated.
The full content is saved to the file and contains 330 lines in total.
This excerpt starts at line 135 and covers the next 1515 bytes.
If the current content is not enough, call `read_file` with file_path=/app/working/workspaces/default/generate_rolina_report.js start_line=156 to read more.


Default

I see the issue. The `cell()` calls in the SWOT table are missing the width parameter. Let me fix them.

                        cell("20+ tahun pengalaman\n7 jenis visa (terlengkap)\nTour packages cross-sell\nReal-time tracking\nKantor fisik Bali"),
                        cell("Belum multi-language\nPricing tidak di website\nHalaman layanan belum detail\nBelum Digital Nomad Visa\nRetirement Community kosong")])
                    }]),
                    new TableRow({ children: [headerCell("OPPORTUNITIES", 4680), headerCell("THREATS", 4680)] }),
                    new TableRow({ children: [
                        cell("Russian market besar\nDigital Nomad Visa trend\nVideo ads - belum ramai\nFamily/Study = niche unik\nBrand First in Bali"),
                        cell("Kompetitor agresif Meta Ads\nVISALF 30K+ customers\nMulti-bahasa competitor\neVOA dari pemerintah\nPerubahan regulasi")])

                        cell("20+ tahun pengalaman\n7 jenis visa (terlengkap)\nTour packages cross-sell\nReal-time tracking\nKantor fisik Bali", 4680),
                        cell("Belum multi-language\nPricing tidak di website\nHalaman layanan belum detail\nBelum Digital Nomad Visa\nRetirement Community kosong", 4680)])
                    }]),
                    new TableRow({ children: [headerCell("OPPORTUNITIES", 4680), headerCell("THREATS", 4680)] }),
                    new TableRow({ children: [
                        cell("Russian market besar\nDigital Nomad Visa trend\nVideo ads - belum ramai\nFamily/Study = niche unik\nBrand First in Bali", 4680),
                        cell("Kompetitor agresif Meta Ads\nVISALF 30K+ customers\nMulti-bahasa competitor\neVOA dari pemerintah\nPerubahan regulasi", 4680)])

                        cell("20+ tahun pengalaman\n7 jenis visa (terlengkap)\nTour packages cross-sell\nReal-time tracking\nKantor fisik Bali"),
                        cell("Belum multi-language\nPricing tidak di website\nHalaman layanan belum detail\nBelum Digital Nomad Visa\nRetirement Community kosong")])
                    }]),
                    new TableRow({ children: [headerCell("OPPORTUNITIES", 4680), headerCell("THREATS", 4680)] }),
                    new TableRow({ children: [
                        cell("Russian market besar\nDigital Nomad Visa trend\nVideo ads - belum ramai\nFamily/Study = niche unik\nBrand First in Bali"),
                        cell("Kompetitor agresif Meta Ads\nVISALF 30K+ customers\nMulti-bahasa competitor\neVOA dari pemerintah\nPerubahan regulasi")])

                        cell("20+ tahun pengalaman\n7 jenis visa (terlengkap)\nTour packages cross-sell\nReal-time tracking\nKantor fisik Bali", 4680),
                        cell("Belum multi-language\nPricing tidak di website\nHalaman layanan belum detail\nBelum Digital Nomad Visa\nRetirement Community kosong", 4680)])
                    }]),
                    new TableRow({ children: [headerCell("OPPORTUNITIES", 4680), headerCell("THREATS", 4680)] }),
                    new TableRow({ children: [
                        cell("Russian market besar\nDigital Nomad Visa trend\nVideo ads - belum ramai\nFamily/Study = niche unik\nBrand First in Bali", 4680),
                        cell("Kompetitor agresif Meta Ads\nVISALF 30K+ customers\nMulti-bahasa competitor\neVOA dari pemerintah\nPerubahan regulasi", 4680)])


system

Successfully replaced text in /app/working/workspaces/default/generate_rolina_report.js.


Default

cd /app/working/workspaces/default && node generate_rolina_report.js


system

Command failed with exit code 1.
[stderr]
/app/working/workspaces/default/generate_rolina_report.js:140
                        cell("Belum multi-language\nPricing tidak di website\nHalaman layanan belum detail\nBelum Digital Nomad Visa\nRetirement Community kosong", 4680)])
                                                                                ^

SyntaxError: Unexpected token ')'
    at wrapSafe (node:internal/modules/cjs/loader:1740:18)
    at Module._compile (node:internal/modules/cjs/loader:1783:20)
    at Object..js (node:internal/modules/cjs/loader:1940:10)
    at Module.load (node:internal/modules/cjs/loader:1530:32)
    at Module._load (node:internal/modules/cjs/loader:1332:12)
    at wrapModuleLoad (node:internal/modules/cjs/loader:255:19)
    at Module.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:154:5)
    at node:internal/main/run_main_module:33:47

Node.js v25.6.0


Default

The issue is that I have `])] }` - three closing brackets. The `new TableRow({ children: [...] })` structure is:
- `new TableRow({ children: [ ... ] })` - one closing for TableRow
- `] }),` - close the children array and the TableRow object

Wait, let me look more carefully. The original structure was:
```
new TableRow({ children: [
    cell(...),
    cell(...)])
}])
```

The `])]` means:
- `)` closes cell
- `]` closes the children array of TableRow
- `]` closes... something else

Let me read the exact lines again.


system

                rows: [
                    new TableRow({ children: [headerCell("STRENGTHS", 4680), headerCell("WEAKNESSES", 4680)] }),
                    new TableRow({ children: [
                        cell("20+ tahun pengalaman\n7 jenis visa (terlengkap)\nTour packages cross-sell\nReal-time tracking\nKantor fisik Bali", 4680),
                        cell("Belum multi-language\nPricing tidak di website\nHalaman layanan belum detail\nBelum Digital Nomad Visa\nRetirement Community kosong", 4680)])
                    }]),
                    new TableRow({ children: [headerCell("OPPORTUNITIES", 4680), headerCell("THREATS", 4680)] }),
                    new TableRow({ children: [
                        cell("Russian market besar\nDigital Nomad Visa trend\nVideo ads - belum ramai\nFamily/Study = niche unik\nBrand First in Bali", 4680),
                        cell("Kompetitor agresif Meta Ads\nVISALF 30K+ customers\nMulti-bahasa competitor\neVOA dari pemerintah\nPerubahan regulasi", 4680)])
                    }]),
                ]<<<TRUNCATED>>>
The output above was truncated.
The full content is saved to the file and contains 330 lines in total.
This excerpt starts at line 136 and covers the next 1055 bytes.
If the current content is not enough, call `read_file` with file_path=/app/working/workspaces/default/generate_rolina_report.js start_line=148 to read more.


Default

I see the issue now. The `])]` has too many closing brackets. For the line:
```
cell("...", 4680)])
```

- `)` closes cell()
- `]` closes the children array
- `]` is EXTRA - this is the problem!

The structure should be:
```
new TableRow({ children: [
    cell(...),
    cell(...)
]})
```

So after the cell calls, we need `]` (close children array) and `})` (close TableRow).

Let me fix both SWOT rows.

                    new TableRow({ children: [
                        cell("20+ tahun pengalaman\n7 jenis visa (terlengkap)\nTour packages cross-sell\nReal-time tracking\nKantor fisik Bali", 4680),
                        cell("Belum multi-language\nPricing tidak di website\nHalaman layanan belum detail\nBelum Digital Nomad Visa\nRetirement Community kosong", 4680)
                    ]}),

                    new TableRow({ children: [
                        cell("20+ tahun pengalaman\n7 jenis visa (terlengkap)\nTour packages cross-sell\nReal-time tracking\nKantor fisik Bali", 4680),
                        cell("Belum multi-language\nPricing tidak di website\nHalaman layanan belum detail\nBelum Digital Nomad Visa\nRetirement Community kosong", 4680)])
                    }]),

                    new TableRow({ children: [
                        cell("20+ tahun pengalaman\n7 jenis visa (terlengkap)\nTour packages cross-sell\nReal-time tracking\nKantor fisik Bali", 4680),
                        cell("Belum multi-language\nPricing tidak di website\nHalaman layanan belum detail\nBelum Digital Nomad Visa\nRetirement Community kosong", 4680)
                    ]}),

                    new TableRow({ children: [
                        cell("20+ tahun pengalaman\n7 jenis visa (terlengkap)\nTour packages cross-sell\nReal-time tracking\nKantor fisik Bali", 4680),
                        cell("Belum multi-language\nPricing tidak di website\nHalaman layanan belum detail\nBelum Digital Nomad Visa\nRetirement Community kosong", 4680)])
                    }]),


system

Successfully replaced text in /app/working/workspaces/default/generate_rolina_report.js.


Default

Now let me also fix the second SWOT row.

                    new TableRow({ children: [
                        cell("Russian market besar\nDigital Nomad Visa trend\nVideo ads - belum ramai\nFamily/Study = niche unik\nBrand First in Bali", 4680),
                        cell("Kompetitor agresif Meta Ads\nVISALF 30K+ customers\nMulti-bahasa competitor\neVOA dari pemerintah\nPerubahan regulasi", 4680)
                    ]}),

                    new TableRow({ children: [
                        cell("Russian market besar\nDigital Nomad Visa trend\nVideo ads - belum ramai\nFamily/Study = niche unik\nBrand First in Bali", 4680),
                        cell("Kompetitor agresif Meta Ads\nVISALF 30K+ customers\nMulti-bahasa competitor\neVOA dari pemerintah\nPerubahan regulasi", 4680)])
                    }]),

                    new TableRow({ children: [
                        cell("Russian market besar\nDigital Nomad Visa trend\nVideo ads - belum ramai\nFamily/Study = niche unik\nBrand First in Bali", 4680),
                        cell("Kompetitor agresif Meta Ads\nVISALF 30K+ customers\nMulti-bahasa competitor\neVOA dari pemerintah\nPerubahan regulasi", 4680)
                    ]}),

                    new TableRow({ children: [
                        cell("Russian market besar\nDigital Nomad Visa trend\nVideo ads - belum ramai\nFamily/Study = niche unik\nBrand First in Bali", 4680),
                        cell("Kompetitor agresif Meta Ads\nVISALF 30K+ customers\nMulti-bahasa competitor\neVOA dari pemerintah\nPerubahan regulasi", 4680)])
                    }]),


system

Successfully replaced text in /app/working/workspaces/default/generate_rolina_report.js.


Default

cd /app/working/workspaces/default && node generate_rolina_report.js


system

Document created: Proposal_Rolina_Meta_Ads.docx
[stderr]
(node:5477) Warning: `--localstorage-file` was provided without a valid path
(Use `node --trace-warnings ...` to show where the warning was created)


Default

Document generated successfully. Let me send it to Mas Eko.

Berhasil! 🎉 Dokumen udah jadi, Mas Eko!


system

File sent successfully.


Default

Done! Let me summarize what's in the document for Mas Eko.

---

## 📄 **`Proposal_Rolina_Meta_Ads.docx`** — udah bisa di-download!

### Isi dokumen selengkapnya:

**1. Profil Rolina** — website, kontak, sosmed, layanan detail

**2. Perbandingan vs 4 Kompetitor**
- Tabel checkmark: 7 jenis visa Rolina vs kompetitor (cuma 3-5)
- SWOT analysis: Strengths, Weaknesses, Opportunities, Threats

**3. Strategi Funnel Meta Ads 3 Tahap**
- **TOFU (30%)** — Awareness: Video Bali + "First Visa Service Since 2012"
- **MOFU (40%)** — Consideration: Visa types explained, testimonial, infographic
- **BOFU (30%)** — Conversion: WhatsApp CTA, free consultation, promo
- Content calendar bulan pertama

**4. Budget Iklan — 3 Opsi**

| Paket | Budget/Bulan | Leads |
|-------|-------------|-------|
| Starter | Rp 3-5 jt | 15-30 |
| **Growth** ⭐ | **Rp 6-9 jt** | **30-60** |
| Aggressive | Rp 12-15 jt | 50-90 |

**5. Estimasi Jasa Mas Eko**
- **Standard Retainer: Rp 6 jt/bulan** (recommended)
- Basic: Rp 4 jt | Premium: Rp 8 jt
- Total: Ad Spend + Jasa = **~Rp 12-15 jt/bulan** (Growth + Standard)

**6. Rekomendasi** — multi-language, pricing transparency, focus Study/Family Visa

---

Ada yang mau diubah atau di-adjust lagi? 😊