Thinkers Academy
A course business needed enrolment payments and accurate conversion data — on shared PHP hosting, in Bengali, where ad-blockers and iOS routinely destroy browser-side tracking.
- Role
- Sole engineer
- Stack
- React · TypeScript · Vite
- Status
- Live

A React front end with a PHP API, SSLCommerz checkout, a dual-role admin panel, and server-side Meta Conversions API tracking deduplicated against the browser Pixel.
Browser-side tracking loses the sales it reports
A Meta Pixel fires from the browser, so an ad-blocker, a privacy setting or a closed tab silently deletes the conversion. The business then optimises its ad spend against data that under-counts exactly the customers who did buy.
Two signals, one event
The purchase fires twice: once from the browser Pixel and once server-side from the payment success handler via the Conversions API. Both carry a generated event_id, which is what lets Meta recognise them as the same purchase instead of counting it twice.
PHP, because the client's hosting is PHP
The client already had shared Hostinger hosting. Choosing a stack that needed a Node process would have meant moving them to infrastructure they did not want to pay for or maintain. A small PHP API behind a React build runs on what they already have.
A JSON file instead of a database
Settings live in a JSON file with a fallback to defaults, not in MySQL. For a handful of configuration values edited occasionally by two people, a database would have added a dependency and a backup obligation for no benefit. It would be the wrong call the moment concurrent edits mattered.
What I would change
That settings file was originally served directly by the web server, because the SPA rewrite only applies to paths which do not resolve to a real file. Anything in a public directory is public unless something explicitly says otherwise — the deny rules now say so, and that assumption is the thing I check first on every project since.
- React
- TypeScript
- Vite
- Tailwind CSS
- shadcn/ui
- PHP
- SSLCommerz
- Meta Conversions API