PHP

Charymeld Adverts Platform

A production-ready classified advertising platform built with Laravel 11, supporting a full three-sided marketplace: advertisers post and promote listings, publishers monetise their sites by embedding ad zones, and an admin team moderates everything through a real-time dashboard.

The platform covers the complete ad lifecycle — submission, admin approval or rejection, payment via Paystack and Flutterwave dual gateway, plan selection across Regular, Featured, and Premium tiers, automatic expiration tracking, impression/click/conversion analytics, and PDF/CSV campaign reporting. A custom-built publisher ad network lets third-party site owners create embeddable ad zones, earn configurable commissions, and request payouts — backed by a fraud detection layer that blocks click fraud, payment manipulation, and bot traffic.

Beyond advertising, the platform ships a full social layer: user profiles, follow system, community groups, direct messaging, group chat, a social feed, and video hosting — all driven by real-time WebSockets via Laravel Reverb and Pusher. An AI-powered assistant chatbot with four switchable personalities handles user queries, guides advertisers step-by-step through ad posting, and escalates to a live admin support agent when needed. Security is multi-layered: Google Authenticator 2FA, KYC/NIN identity verification with admin approval, bot detection across 150+ signature patterns, geographic anomaly detection, IP blacklisting, and payment velocity checks.


Charymeld Adverts Platform screenshot

Key Features

57 features built into this project

Dual payment gateway — Paystack and Flutterwave with webhook-triggered automatic plan activation
Three ad plan tiers: Regular
Featured
and Premium with automatic expiration tracking
Admin moderation panel: approve/reject adverts
manage users
view all transactions
moderate blog comments
Publisher ad network: embeddable JavaScript ad zones with real-time impression/click/conversion tracking
Publisher earnings dashboard with configurable commission rates
payout requests
and CSV export
AI-powered chatbot with 4 switchable personalities (helpful
professional
friendly
casual) and FAQ knowledge base
Chatbot-to-live-agent escalation via real-time WebSocket support chat channel
Real-time direct messaging and group chat powered by Laravel Reverb WebSockets and Pusher
Social networking layer: user profiles
follow system
community groups
social feed
and video hosting with FFmpeg
Campaign analytics dashboard with CTR
ROI
impression count
click count
and conversion metrics
PDF and CSV export for individual and all-campaign performance reports
Fraud detection engine: 150+ bot patterns
click velocity (10 clicks/min/IP)
payment velocity
geographic anomaly
Google Authenticator two-factor authentication (TOTP) with QR code setup and backup recovery codes
KYC/NIN identity verification with document upload and admin approval workflow
OAuth social login: Google
Facebook
and Twitter/X
Full-text instant search via Meilisearch and Laravel Scout across adverts
blogs
and categories
Blog system with nested comments
category filtering
and RSS/Atom feeds
SEO-optimised: friendly slugs
Open Graph meta
structured data
auto-generated sitemap.xml
Progressive Web App (PWA) with offline support and service worker caching
Newsletter subscription with double opt-in email verification
Referral system with per-referral commission tracking
Multi-language localisation with translation file support
Google Analytics 4
Meta Pixel
Hotjar
and Twitter Pixel integration
Hourly automated fraud monitoring via scheduled Artisan console commands

Challenges & Solutions

Technical problems encountered during development and how each was resolved.

1

Building a dual payment gateway that felt seamless to users required a unified payment controller with separate webhook handlers for Paystack and Flutterwave. The hardest part was reliable plan activation — if a user paid but the browser callback failed, their ad would stay unpublished indefinitely. I solved this by making plan activation driven entirely by server-side webhooks, not front-end callbacks, so every confirmed charge triggers activation regardless of what happens on the client.

2

The publisher ad network introduced a serious click fraud problem: automated scripts were inflating impression and click counts to inflate publisher earnings. I built a FraudDetectionService that checks click velocity per IP per ad per minute, matches user-agent strings against 150+ blocked bot signatures, and flags geographic anomalies where the same account makes payments from different countries within an hour. Legitimate search engine crawlers (Googlebot, Bingbot, DuckDuckGo) are whitelisted explicitly so SEO crawling continues unaffected.

3

The AI chatbot had to serve two very different needs simultaneously — guiding new advertisers step-by-step through ad posting, and handling real support questions — without becoming confusing. I built a keyword and intent detection layer that routes each message to either the structured FAQ knowledge base, the step-by-step ad guide generator, or an escalation trigger that opens a live WebSocket support channel to an online admin agent when the AI cannot resolve the issue. Four switchable personalities let users adjust the interaction tone to their preference.

4

Supporting real-time direct messaging, group chat, live admin notifications, and ad impression tracking simultaneously required careful WebSocket channel design. I used Laravel Reverb as the primary WebSocket server with Pusher as a cloud fallback, organised channels by conversation ID and group ID to avoid cross-talk, and routed all impression and click events through a dedicated AdTrackingService that writes batched daily stat aggregates — avoiding per-request database writes on high-traffic ad zones.