wilcot.co Book a call

Case 02 / Bangkok property

The real inventory lived in a spreadsheet

A Bangkok agency was running its real inventory out of a Google Sheet, 123 properties and 500 reserved reference codes, while its WordPress site showed six or seven property pages and quietly lost leads between the admin and the agents meant to work them. I rebuilt all of it in eight weeks: a custom site, a custom CRM, and a database that decides who sees what.

DLVX / Case no. 02 In production
01 The public site, rebuilt Next.js 15 on Vercel. 35 routes, search across 48 BTS and MRT stations, an interactive Bangkok map, 18 long form guides.
02 A custom CRM behind it 14 dashboard routes. Leads, a deals kanban, a viewings calendar, agent admin and a commission leaderboard.
03 The photo pipeline Every upload auto rotated, resized, converted to WebP and watermarked server side. iPhone HEIC transcoded automatically.
04 Permissions in the database 41 row level security policies. An agent sees their own leads because Postgres says so, not because the interface hides them.
05 Measurement built into the forms First and last touch attribution on every enquiry, including a medium for buyers arriving from an AI assistant.
06 Her own AI operator Picky. Scoped to the owner, on her own cloud and her own Telegram, with live database and deploy control.
Before
  • WordPress, a bought theme, a page builder, 8 plugins
  • 6 to 7 live property pages, 123 properties in a sheet
  • Ownership stored in one column, so leads vanished
  • A documented defect list that kept growing
After
  • Next.js and Postgres, 35 routes, 483 listings live
  • One CRM holding leads, deals, viewings and agents
  • 41 RLS policies decide who sees what
  • Homepage first byte measured at 43ms warm
The rebuild
  • 19 June: stopped patching, preview live that night
  • 23 June: serving the real domain, old URLs redirected
What it cost 200,000 THB flat, four installments. She owns the site, the CRM and the database outright on final payment.
The system Google search 237 pages earning impressions Bangkok map 48 stations, districts Guides + calculator 18 long form pages The CRM Source attached on arrival agents + web Routed to one agent 41 RLS policies Deals pipeline prospect to won Viewings calendar 49 booked Photo pipeline watermark, WebP, HEIC 5,239 stored Owner Leaderboard, revenue view, not a spreadsheet Agents Upload from phone

Under the surface

The parts that decide whether it holds

01 Photos, handled server side Auto rotated, capped at 2400px, re encoded to WebP at quality 90, and stamped with the agency logo at 22% of image width, on upload. Listings copied off the site carry her mark, unless the watermark is deliberately turned off for that property. The un watermarked original of every image is kept in a private bucket, so anything can be reprocessed later without asking anyone to re upload.
02 iPhone photos actually work Agents shoot on iPhones, which means HEIC, which no browser renders. The upload path sniffs the file brand and transcodes to JPEG before anything else happens. The agent just uploads from their phone and it works.
03 The original defect, fixed properly In the old system, ownership of a record lived in one column, so a lead the admin created never appeared on the agent's dashboard. I reproduced it live as both roles on 28 May. The fix was not a UI change: 41 row level security policies now live on the database, 31 on tables and 10 on storage.
04 A trigger that keeps commission honest Reassigning a lead moves its linked deal to the new agent. Pulling a won lead back into the pipeline stops its commission counting. That one drift path is closed at the database.
05 Builds that refuse to ship a regression A pre deploy script fails the build if the dashboard and public station filters ever diverge again, or if a station exists in the database but not in the picker. I wrote it after MRT only listings became unfindable. A second script refuses to deploy from the wrong checkout, after a bad deploy once wiped live fields.
06 Proof, not promises Playwright scripts log into the live dashboard and capture screenshots at desktop and mobile. 234 of them across 26 dated QA sessions. That is how every client fix was signed off. An in app feedback button on every page carried 70 reports through open, reviewing and resolved.
propickproperty.com
Pro Pick Property site, rebuilt by DLVX
The rebuilt propickproperty.com. 483 listings live on public search, confirmed three ways: page text, sitemap and database.
Measured, not claimed

Homepage first byte: 43ms warm, 319ms on a cold first hit

530 URLs in the sitemap

237 distinct pages earning impressions

llms.txt and a named AI crawler allowlist, both live

Database figures are a live read on 19 August 2026. Search Console runs to 17 August 2026. The before state comes from the 2026-05 defect record.

Live database 19 August 2026, Search Console to 17 August 2026

The numbers

557Properties in the CRM
5,239Photos processed and stored
483Listings live on public search
267Real leads, plus 87 in 30 days
49Viewings booked, 28 completed
1,081Agent activities logged
41Row level security policies
32,980Lines of code, 82 commits
43msHomepage first byte, warm
15.5xImpressions, June to Aug 1 to 17
237Pages earning impressions
4Days from decision to live domain

Search Console, last 90 days: 4,351 impressions, 114 clicks, average position 14.79. June to the first 17 days of August, impressions went 166 to 2,570 and average position 21.98 to 13.60. June was the launch month, so part of that curve is a new site indexing from near zero. The CRM also holds 12 won deals. Those are the agency's own sales result, recorded in the system I built. I am not going to claim I caused them, and the values are hers to share, not mine.

Search Console, read 21 Aug 2026

Organic search went from flat to actually moving

Last 28 days vs the 28 before
  • Impressions: 1,163 to 3,955, up 3.4x
  • Clicks: 39 to 79, up 2x
  • Average position: 15.9 to 13.5
Since launch
  • June, the launch month: 166 impressions, 16 clicks
  • 1 to 21 August: 3,415 impressions, 69 clicks
  • 154 pages and 169 distinct queries earning impressions in the last 28 days
What is actually pulling traffic
  • The brand name converts: "pro pick property," position 1.3, 44 impressions, 20 clicks
  • Everything else is the guides: "best area to live in bangkok for expats," "bangkok expat community," "the best neighborhoods for expats in bangkok," none of them brand terms, all landing on the 18 long form guide pages
Built for how search is changing 532 URLs in the sitemap, an llms.txt file and a named AI crawler allowlist, both live since launch. Infrastructure for AI search, not a guess about it.
Search Console, read 21 Aug 2026

1,163 to 3,955 impressions, last 28 days vs the prior 28

39 to 79 clicks, same comparison

154 pages, 169 queries earning impressions

Position and impression reads on the date shown, not a ranking promise. The 12 won deals recorded in the CRM are the agency's own sales result and hers to share, not counted here.

Picky, her own AI operator
  • Runs on her cloud instance and her Telegram, not my infrastructure
  • Live read and write on her database, verified
  • Deploy control on her Vercel project through a revocable token
  • Status, logs, redeploy and rollback all tested
  • Skill files for listings, photos and website code changes
The honest boundary
  • It is not a chat widget. There is no AI in the public product
  • It is a single user tool. Her, by her choice, not her staff
  • It was in her hands and she told me she would use it. Beyond that I will not claim more than I can show
Why no chatbot on the site A property buyer wants a filter and a phone number, not a conversation with a robot. I built for how the business actually runs, not for a demo.
Picky · what it was wired to

Live read and write on her database

Deploy, logs, redeploy and rollback on her Vercel project

Skill files for listings, photos and site code

Her instance, her Telegram, her token. I am listing what it was connected to, not showing output I cannot produce.

No retainer, no lock in

What it costs and what you own

200,000 THB flat, in four installments of 50,000. Ownership of the website and the CRM transfers to you on payment in full. The code is yours, the database is yours, the domain and hosting sit in your accounts. After that, 2,500 THB per hour when you want something. No retainer, no monthly platform fee for software you already own.

01 You own the code Not a licence, not a seat, not a builder account you rent forever. The repository transfers.
02 You own the database Your listings, your leads, your owner contacts. Exportable, in your own Supabase project.
03 Scope I keep honest SEO and marketing were never in scope on this build. The sitemap, schema, redirects, AI crawler allowlist and llms.txt are foundation shipped inside the build. What the search numbers do afterwards is a separate conversation.

Your listings, your leads, your agents, in one system you own outright, instead of a theme you rent and a spreadsheet you fear.

Wil

wilcot.co, Bangkok

Built June to August 2026

Send me your current site and I will tell you exactly what is broken underneath it.