Growth problem Marketing counted raw leads, Sales counted sign-ups. The CRM had no API, so no one could see which spend produced students.
My role Paid media, content direction, budget allocation, funnel design, AI and automation, working with the CEO and both managers.
Lever / rationale Align qualification and revenue definitions before optimizing channel spend. Make each stage visible to Marketing and Sales.
Revenue and return | Aug 2 - Oct 11, 2026 3.31B VND New revenue from marketing leads paid + organic | 39 new contracts
18% Share of new revenue from paid ads the rest from organic sources
2.81× Paid ROAS paid-ads revenue ÷ marketing cost
Source: the company KPI dashboard I built, full period Aug 2 - Oct 11, 2026. Organic covers leads from sources without ad spend, such as Zalo and call-in, handled by the marketing team.
Running Meta Ads: problems and fixes Meta was the main paid channel, so the day-to-day account work mattered as much as the funnel. Four problems I hit and what I changed:
01 Lead quality Problem Forms and Messenger brought plenty of leads, but too few were real prospects, so cost per lead looked fine while cost per qualified lead did not.
Fix Optimised for MQLs instead of raw leads: added qualifying questions, and let the AI intake classify every chat before it reached Sales.
02 Tracking signal Problem Meta only saw the top of the funnel, so delivery optimised toward people who enquire rather than people who sign.
Fix Rebuilt website tracking in GTM (GA4 events for forms, Zalo, hotline and Messenger; Google Ads conversions with enhanced conversions; gclid passed into Messenger links), then set up the Conversions API to send MQL, SQL and new-sign events from the CRM back to Meta, so both platforms learn from qualified outcomes.
03 Creative fatigue Problem CPM and cost per lead crept up as the same creatives ran for too long.
Fix Built a creative testing routine and rotated content on a schedule, retiring ads as fatigue showed in the numbers.
04 Account structure and budget Problem Fragmented campaigns and frequent edits kept resetting the learning phase and spread budget too thin.
Fix Consolidated into fewer campaigns with CBO / Advantage+ and set rules for when and how much to scale budget.
Meta Ads | Aug 2 - Oct 11, 2026
216 MQLs
99 SQLs
15 New contracts
1.04B VND New revenue
2.71× ROAS
Meta row of the source comparison in the company KPI dashboard (Marketing tab), same period as the totals above.
Metric moved | Aug-Sep 2026 201% New-revenue target, September August 113% | company KPI
25.8% SQL → new sign target 12%
43.1% MQL → SQL target 40%
107 → 153 MQLs, Aug → Sep +43%
−27.5% Cost per MQL, Aug → Sep 918K → 666K VND incl. VAT
6.4M CAC per new contract, VND target 8.1M | incl. VAT
−28.8% CAC / new contract, Aug → Sep 8.9M → 6.4M VND | excludes upgrade / cross-selling
1,100+ Leads captured by AI intake 6 sources, one view
MQL → SQL reached 43.1% against a 40% target, down from 72.0% in August. MQLs grew 43% (107 → 153), so the rate settled back to a normal level while staying above target.
September 2026 vs August 2026, full calendar months. All sources, paid + organic. Revenue is company-wide; these are period-level results across teams.
Company dashboard | selected reporting views These screenshots show dashboard views with their own selected filters. Figures inside them may use a different reporting window from the Aug 2 - Oct 11 results above; use the dated KPI notes for period-to-period comparisons.
View full image ↗ Daily revenue with drill-down filters Compare daily revenue by date, source, paid vs organic, and contract type.
View full image ↗ Marketing attribution by source Review spend, MQL, SQL, sign-ups, revenue, and ROAS across sources.
View full image ↗ Lead follow-up and drop-off Spot lead volumes, overdue follow-ups, and where conversations stall.
View full image ↗ Sales tracker: stage, source and owner CRM-synced records give Sales one searchable view of each lead’s status.
View full image ↗ Executive overview in Looker Studio New, renewal and trial revenue, marketing cost, and daily revenue trends in one report.
View full image ↗ KPI plan vs actual Track monthly targets and actuals week by week.
View full image ↗ Paid ads performance Monitor spend, impressions, CTR, CPC, conversions, and cost per lead.
View full image ↗ Revenue by source and funnel stage Break revenue down by channel, contract type, and funnel stage.
The funnel I redesigned Raw lead Any enquiry: Messenger, Zalo, form, call MQL Parent with a child at an international or bilingual school, phone left SQL Fits tuition and study format, agrees to a trial Trial Paid trial lesson New sign Signed contract, revenue booked The dashboard counts gross leads from Meta + Zalo; other sources enter MQL directly. These are stage totals, not a single-cohort funnel. Some customers sign without a trial.
The system behind the company dashboard 01 | SOURCES Meta & Google Ads Messenger, IG, Zalo (Pancake, POSCake) Website forms dotB CRM exports Student & contract list 02 | AUTOMATION n8n workflows, 16 syncs a day AI reads every chat, qualifies the MQL and briefs Sales De-duplicates leads across channels 03 | DATA LAYER Google Sheets “Customer 360” One row per customer, Lead → Sign Spend, revenue, CAC by source 04 | OUTPUT Apps Script web dashboard for the whole company Lark cards for Sales follow-up Built on free tiers, without a dev team.
How I built it View full image ↗ Conversion tracking in Google Tag Manager GTM workspace showing GA4 event, Google Ads conversion and Meta Pixel tags and their triggers.
View full image ↗ Dashboard web app in Google Apps Script I wrote the dashboard myself as an Apps Script web app (HTML, CSS and JavaScript, ~7,800 lines) on top of the Google Sheets data layer.
View full image ↗ n8n | daily reporting pipeline Scheduled workflow that reads ads, CRM and student data, rebuilds the funnel, cost and KPI fact tables in Google Sheets and pushes fresh numbers to the dashboard on a schedule through the day.
View full image ↗ n8n | lead bot and handoff to Sales Messenger, Instagram and Zalo chats arrive via Pancake; the bot checks the phone number, AI qualifies the lead, removes duplicates and sends it to Sales in Lark automatically.
What I built / ran Funnel & KPIs Defined each stage with the CEO, Marketing Manager and Sales Manager, and broke company KPIs down for four marketing roles.
Budget & media Moved budget toward Google Search by programme and rebuilt tracking in GTM: GA4 events for forms, Zalo, hotline and Messenger; Google Ads conversions with enhanced conversions and lead values by landing page; gclid passed into Messenger links; MQL, SQL and new-sign events sent from the CRM to Meta via Conversions API.
Content Set a branding + performance content plan for parents of international-school students.
AI & automation Messenger AI asks for school and grade before the phone number; qualified leads reach Sales in minutes with a summary. A live free-slot tracker covers 48 teachers.
Tools | Meta Ads | Google Search | GA4 | GTM | Google Ads conversions | Enhanced conversions | Conversions API | n8n | dotB | Pancake/POSCake | Google Sheets | Apps Script | Lark