Success Story
Ravina Square — The Audit Found a Site Advertising a Product That Did Not Exist
A property developer about to spend on ads with no tracking, no product page, and a homepage quoting unit sizes the building does not have. Engineering, competitive intelligence, and the outbound list, in one pass.
Challenge: Ravina Developments was preparing to run paid acquisition for a commercial mall in a saturated catchment. The business had no ad account, no pixel, no product page, and no competitive picture. Ten rival developers were already advertising in the same postcode, all leading with the same payment-ladder hook.
Solution: Built the full acquisition stack. Meta Pixel plus Conversions API with browser and server events deduplicated on a shared event ID, a bilingual RTL product page carrying the real 70-unit schedule, a teardown of every live competitor ad in the catchment, bilingual creative, and a tiered outbound list built from public advertiser data.
Result: The stack shipped and went live. The more valuable finding came from the audit: the site was advertising unit sizes that do not exist, a delivery date already in the past, and a price the owner deliberately does not publish.
Tech Stack
The Story
The brief was to connect a Meta ads account and help with targeting. The first API call answered the actual question: the business had zero ad accounts, zero pixels, and a Facebook page with three followers. There was nothing to analyse. Everything downstream of that assumption had to change before any work was worth doing.
So the first deliverable was a competitive picture rather than code. The Meta Ad Library is public and needs no permissions, so I swept every advertiser running in the catchment and read what they actually say. Ten direct competitors, and the pattern was immediate: every single one leads with the down payment and the instalment term before mentioning the building. Two to thirty-five percent down, three to twelve years. Nobody leads with the property. That one observation reframed the entire brief.
The second finding was the one that mattered commercially. The live homepage advertised units from 15 to 45 square metres. The brochure lists 17 to 52, and the largest unit in the building is a single 52 square metre ground-floor space. It promised delivery in a year that had already passed, on a project still at excavation. It implied prices increase at construction milestones, for a developer who had deliberately decided not to publish a price at all. And the static head still carried the previous project name in five places, so every share card and every pre-JavaScript crawl showed the wrong brand. Paid traffic was about to land on a page describing a different building.
The tracking work is where the engineering went. Browser pixel and Conversions API both fire, sharing one event ID so Meta collapses the pair rather than counting a conversion twice. Server events run inside waitUntil, after the response has already been returned, so a tracking failure cannot add latency to the lead form or turn a saved lead into an error message. Phone numbers are normalised before hashing, which sounds trivial until you notice the site defaults to Arabic and JavaScript treats Arabic-Indic digits as non-numeric: without folding them first, every Arabic-entered phone number silently hashes to nothing and matches nobody. Gulf numbers now return null instead of being coerced into Egyptian ones, because a fabricated number still hashes, still transmits a real person's data, and still matches zero people.
The audit also found a conversion event firing from thirty-five different URLs. Every unknown path and all thirty-four project slugs in the sitemap rendered the homepage, and the homepage fired a "viewed this project" event. Any audience built on that signal would have been mostly people who scrolled past a banner. It is now scoped to the two URLs where it means something.
The product page replaced a route that silently fell through to the homepage. It carries all seventy units across four floors as real tables with captions, row headers and sticky column headers, correct in right-to-left because Arabic is the default locale. The unit schedule does the qualifying work a price normally does: publishing a 17 to 52 square metre range means anyone hunting two hundred square metres self-selects out before they ever message the sales team.
One measurement is worth recording because it would never have shown up in review. The reveal animation uses an IntersectionObserver at a fifteen percent threshold, and a tall element can never reach that threshold if the viewport is shorter than fifteen percent of its height. All four unit tables in one wrapper is 3,610 pixels, which needs a 542 pixel viewport. A 320 by 568 phone with the browser toolbars gives about 480. The entire seventy-unit schedule would have rendered at zero opacity on small phones, with no error and nothing in CI to catch it. Measured in a headless browser, then split into one reveal per floor table.
Finally, the outbound list. Seventy-two prospects merged from the client's own market research and the live ad sweep: thirty brokers already selling in the catchment, and forty-two businesses currently paying rent inside it and running their own Meta ads, which is a reliable signal of both budget and a working phone. Split into brokers, who are being sold a way to earn, and occupiers, who are being sold their own next branch. Those are different conversations and the same script fails both.
Worth stating plainly: there is no campaign performance data in this case study. At the time of writing no money has been spent. What shipped is the stack and the intelligence to aim it, plus a set of live copy corrections the client would otherwise have paid for in wasted clicks.
How We Delivered
Our Delivery Process
See how our senior engineering pod delivered production-ready results
Conversion Tracking That Counts Once
- Browser pixel and Conversions API both fire, sharing one event ID so Meta deduplicates the pair instead of double-counting every conversion and halving the reported cost per result
- Server events dispatch inside waitUntil, after the response is returned, so Meta latency never reaches the lead form and a tracking failure cannot turn a saved lead into a "could not send" error
- Explicit response-status checks on the Meta call, because a rejected event returns an HTTP error response rather than throwing, so a plain try/catch reports success forever
The Details That Fail Silently
- Arabic-Indic and Persian digits folded to ASCII before hashing: the site defaults to Arabic and JavaScript's digit class is ASCII-only, so an Arabic-entered phone number would otherwise hash to an empty string and match nobody
- Non-Egyptian numbers return null rather than being coerced, because a fabricated number still hashes and still transmits a real person's contact detail for zero matching value
- The public tracking endpoint allowlists event names server-side; without it any visitor could inject arbitrary events into the advertiser's permanent dataset
Competitive Intelligence From Public Data
- Every live advertiser in the catchment read from the public ad library: payment terms, delivery claims, unit sizes, and the hook each one leads with
- Found the market's universal pattern (everyone opens on the down payment) and the gap nobody occupies (not one competitor advertises outdoor space, which the client has on eighteen of twenty-three ground units)
- Seventy-two prospects tiered by fit, split into brokers and occupiers, with contact numbers each business publishes in its own advertising
What The Audit Caught
- Live homepage advertising 15 to 45 square metre units for a building whose real range is 17 to 52, with a single 52 square metre largest unit
- A delivery year already in the past, on a project still at excavation, and an implied price for a developer who had decided not to publish one
- The previous project name still in five places in the static head, so every social share card and every pre-JavaScript crawl showed the wrong brand, and a robots.txt pointing the sitemap at example.com
Final Outcomes
Results
Working on something similar?
Book a 15-minute call. We'll tell you honestly if we're the right fit.
Book a 15-min Call