
August 16, 2026
11 min read
Table of Contents
By Kokil Thapa | Last reviewed: August 2026
Building a Nepal classified ads site demands more than a generic directory script; it requires a custom architecture capable of handling thousands of daily listings, bilingual content, and local payment gateways like eSewa and Khalti. In my experience shipping platforms like Ajako Deal, success depends on treating search performance and trust verification as foundational engineering constraints rather than afterthoughts. This guide covers the specific technical decisions needed for building a Nepal classified ads site that scales reliably on local infrastructure.
Before writing code, understand that the Nepali market operates differently from Western counterparts. Users expect WhatsApp-based communication, cash-on-delivery options alongside digital payments, and interfaces that work seamlessly on low-end Android devices. If you are evaluating whether to build custom or adapt an existing CMS, reading about no-code vs custom development for Nepali startups will help clarify the trade-offs between speed-to-market and long-term scalability. For most serious classified ventures, custom Laravel development remains the only viable path for handling complex vendor roles and programmatic SEO at scale.
What is the best tech stack for building a Nepal classified ads site?
For a production-grade classifieds platform in 2026, Laravel 12 running on PHP 8.4 is the industry standard for this region. It provides the necessary ecosystem for authentication, queue management, and API development without the overhead of decoupled frontend frameworks. While React or Next.js are popular globally, they often introduce unnecessary complexity for Nepal-focused projects where server-side rendering via Blade and Livewire delivers better Core Web Vitals on slower connections.
Your database choice matters significantly. MySQL 8.4 LTS offers superior JSON support and full-text indexing compared to older versions, which is critical when storing flexible listing attributes (e.g., vehicle specs vs. real estate amenities). PostgreSQL 17 is a valid alternative if you anticipate heavy geospatial queries using PostGIS, but for most Nepali classifieds, MySQL’s simpler operational overhead wins. Pair this with Redis 7.4 for session storage and queue drivers—never use the database driver for queues in production.
Why Livewire over SPA frameworks?
In Nepal, network latency can spike unpredictably. Single Page Applications (SPAs) often suffer from large initial bundle downloads that frustrate users on 3G networks. Livewire allows you to build dynamic, reactive interfaces (like cascading category filters or image upload previews) while keeping the initial payload minimal. The server renders HTML, and only small DOM diffs travel over the wire. This approach consistently outperforms SPAs in Lighthouse scores for Nepali hosting environments.
How do you structure the database for multi-category listings?
The single biggest architectural mistake in classifieds is creating separate tables for each category (cars, houses, jobs). This makes unified search and filtering nearly impossible. Instead, use an Entity-Attribute-Value (EAV) hybrid or, preferably in 2026, a JSON column strategy within a unified listings table.
<?php
// Migration: create_listings_table.php
Schema::create('listings', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
$table->foreignId('category_id')->constrained();
$table->string('title');
$table->text('description');
$table->decimal('price', 12, 2)->nullable();
$table->enum('condition', ['new', 'used', 'refurbished'])->nullable();
// Flexible attributes stored as JSON
$table->json('metadata')->nullable();
// Geo-hierarchy for Nepal
$table->unsignedBigInteger('province_id');
$table->unsignedBigInteger('district_id');
$table->unsignedBigInteger('municipality_id')->nullable();
$table->enum('status', ['draft', 'pending', 'active', 'expired', 'sold']);
$table->timestamp('expires_at')->nullable();
$table->timestamps();
// Indexes for common filters
$table->index(['category_id', 'status', 'district_id']);
$table->index('price');
}); The metadata JSON column stores category-specific fields. A car listing might contain {"make": "Toyota", "model": "Corolla", "year": 2018, "mileage": 45000}, while a rental listing contains {"bedrooms": 2, "floor": 3, "parking": true}. MySQL 8.4 allows you to create functional indexes on specific JSON keys, enabling fast filtering without schema bloat.
Location hierarchy deserves special attention. Nepal’s administrative divisions (Province → District → Municipality/Ward) change occasionally. Store these in normalized tables, not as strings. This enables efficient faceted navigation ("Show all cars in Kaski") and prevents duplicate entries like "Kathmandu", "ktm", and "KTM City". When building database-driven websites in Nepal, always seed your location table from official government datasets to maintain accuracy.
How do you implement fast search and filtering for thousands of ads?
MySQL full-text search degrades rapidly past 100,000 rows with complex filters. For a classifieds site, you need a dedicated search engine. Meilisearch has become the preferred choice over Elasticsearch for Laravel projects in 2026 due to its lower memory footprint and simpler configuration—critical when hosting on budget VPS providers common in Kathmandu.
- Install and configure Scout: Use
laravel/scoutwith the Meilisearch driver. DefinetoSearchableArray()on your Listing model to flatten JSON metadata into searchable attributes. - Configure filterable attributes: In your Meilisearch settings, explicitly mark
district_id,category_id,price, and key metadata fields as filterable. By default, Meilisearch only allows filtering on configured attributes. - Synonyms for Nepali language: Add synonym rules for common variations: "bike" ↔ "motorcycle" ↔ "motorbike", "flat" ↔ "apartment" ↔ "room". Include Nepali transliterations if your audience searches in Romanized Nepali.
- Queue synchronization: Never sync to Meilisearch synchronously during HTTP requests. Dispatch
MakeSearchablejobs to your Redis queue to prevent blocking user submissions.
// app/Models/Listing.php
public function toSearchableArray(): array
{
return [
'id' => $this->id,
'title' => $this->title,
'description' => $this->description,
'price' => $this->price,
'category_id' => $this->category_id,
'district_id' => $this->district_id,
'condition' => $this->condition,
// Flatten JSON for filtering
'make' => $this->metadata['make'] ?? null,
'year' => $this->metadata['year'] ?? null,
'created_at' => $this->created_at->timestamp,
];
} A common mistake is syncing every attribute. Only index what users actually filter or search by. Storing full base64 images or lengthy HTML descriptions in Meilisearch wastes RAM and slows indexing. Keep the search index lean; fetch full details from MySQL when displaying results.
How do you integrate eSewa and Khalti payments securely?
Monetizing a classifieds site typically involves featured listings, bump-ups, or membership fees. You must integrate both eSewa and Khalti, as market share is split. Never store raw API secrets in your database or commit them to Git. Use Laravel’s environment configuration and encrypted secrets for production.
| Feature | eSewa EPAY v2 | Khalti Payment Gateway |
|---|---|---|
| Integration Method | HMAC-SHA256 Signature | Bearer Token + Verification API |
| Test Environment | uat.esewa.com.np | a.khalti.com |
| Webhook Support | No (Requires Success/Failure URL) | Yes (Server-to-Server) |
| Refund API | Manual / Limited | Programmatic Refunds Available |
| Best For | Mass Market, Rural Users | Urban Youth, Tech-Savvy Users |
Implement a unified PaymentGateway interface with concrete adapters for each provider. This abstraction lets you swap providers or add new ones (like IME Pay or ConnectIPS) without rewriting business logic. Always verify payment responses server-side. Client-side success callbacks are trivially spoofable. For eSewa, validate the HMAC signature against your secret key. For Khalti, call their verification endpoint with the transaction PIN before granting any premium features.
Handle idempotency rigorously. Network retries or impatient users clicking "Pay Again" can trigger duplicate charges. Store a unique transaction_uuid for every payment attempt. Before processing any webhook or success callback, check if that UUID has already been fulfilled. If yes, return success without re-activating the listing. For detailed implementation patterns, refer to guides on Laravel Khalti and eSewa Nepal payment integration that cover edge cases like timeout handling and partial refunds.
What technical SEO strategies are essential for classifieds?
Classifieds sites live or die by organic traffic. Programmatic SEO is non-negotiable. Every category-district combination should have a dedicated, indexable landing page: /cars/kathmandu, /rentals/pokhara, /jobs/biratnagar. These pages must contain unique introductory text, breadcrumb navigation, and structured data—not just a list of links.
- Schema Markup: Implement
Product,Offer, andBreadcrumbListschema on every listing. Google uses this to display price, availability, and ratings directly in search results. Validate with Rich Results Test before deploying. - Canonical URLs: Classifieds generate massive duplicate content through sorting (
?sort=price_asc), pagination, and filter combinations. Self-canonicalize only the primary filtered view. Applynoindexto thin parameterized URLs that offer no unique value. - Expired Listing Handling: Never delete expired listings immediately. Return a 410 Gone status for permanently removed items, or redirect to the parent category if a close match exists. Soft-deleting preserves link equity from external backlinks.
- Image Optimization: User-uploaded photos are often 5MB+ originals. Process all uploads through Laravel’s intervention/image library: resize to max 1200px width, convert to WebP, strip EXIF data. Serve responsive sizes via
srcset. Slow image loads kill conversion rates on Nepali mobile networks.
Internal linking architecture determines crawl efficiency. Link from high-authority category pages to newer listings. Use automated "Related Listings" sections based on category and district to create contextual internal links. Avoid orphaned pages; every active listing should be reachable within three clicks from the homepage. When planning your content strategy, reviewing on-page SEO checklist for Nepal ensures you address locale-specific factors like Nepali language hreflang tags and local business schema.
How do you handle moderation and spam prevention?
Nepal classifieds attract significant spam: fake job postings, phishing links, and prohibited goods. Automated moderation is mandatory at scale. Implement a multi-layer defense:
- Rate Limiting: Restrict new users to 3 listings per 24 hours. Increase limits gradually as accounts age and verify phone numbers. Use Laravel’s built-in rate limiter middleware keyed by IP and user ID.
- Content Filtering: Maintain a blocklist of prohibited keywords (drugs, weapons, adult content). Scan titles and descriptions before publication. Flag matches for manual review instead of auto-rejecting to reduce false positives.
- Phone Verification: Require SMS OTP verification for posting. Integrate with local SMS providers like Sparrow SMS or Aakash SMS. Verified users receive higher trust scores and visibility boosts.
- Image Hashing: Compute perceptual hashes (pHash) of uploaded images. Compare against known spam/scam image databases. Duplicate images across multiple accounts signal coordinated abuse.
Moderation workflows need admin tooling. Build a dashboard where moderators can quickly approve, reject, or request edits. Log every moderation action with timestamps and operator IDs for audit trails. Provide clear rejection reasons to users—vague "policy violation" messages generate support tickets and frustration. Transparency builds community trust, which is the ultimate moat for any classifieds platform in Nepal.
Conclusion
Building a Nepal classified ads site successfully requires balancing modern engineering practices with local market realities. Choose Laravel 12 and MySQL 8.4 for reliability, integrate Meilisearch for performance, and treat eSewa/Khalti verification as a security-critical path. Invest heavily in programmatic SEO and spam prevention from day one—these determine whether your platform gains traction or fades into obscurity. Focus on solving real user problems: fast loading on slow networks, trustworthy transactions, and intuitive navigation across Nepal’s diverse geography.
If you are planning a classifieds or marketplace project and need expert guidance on architecture, payment integration, or technical SEO, contact me to discuss your requirements. I have helped multiple Nepali businesses launch scalable platforms that handle real transaction volume and compete effectively in this space.

