Appearance
Introduction
ExchangePro helps you run an online currency exchange business: customers choose send/receive currencies, see rates and fees, create an exchange request, upload proof of payment, and track status until an administrator approves or rejects the transaction.
Core concepts
Exchange (transaction)
An exchange is a single customer order identified by an exchange ID (e.g. FZIEHJXG0ZW6). It includes:
- Send and receive currency codes and amounts
- Exchange rate, fees, and totals
- Status workflow: pending → approved / cancelled / refunded
- Optional proof fields (text, file uploads) configured per currency
Currencies
Each currency defines:
- Display name and code (USD, EUR, BTC, etc.)
- Buy/sell rates (manual or synced from an external API)
- Min/max limits, fees, decimal precision
- Status (active/inactive)
- Linked form fields for proof submission
Currency prices (rate table)
The currency prices module stores market reference rates (often synced from ExchangeRate-API). Admins map these to operational buy/sell rates on currencies.
Proof fields
Currency form fields are dynamic inputs (text, email, file, image, select, etc.) shown when a user submits payment proof. Files are stored under the backend public/transaction-proofs/ directory.
Feature list
Public website
| Feature | Description |
|---|---|
| Home page editor | Hero, stats, rates, FAQ, testimonials, footer — editable from admin |
| Live rates showcase | Public API-driven rate display |
| Currency converter | Public converter using configured currencies |
| Blog | Categories, posts, SEO fields |
| Legal pages | Dynamic slugs (privacy, terms, etc.) |
| Contact form | Submissions in admin |
| Newsletter | Subscriber list + broadcast email |
| SEO | Meta, Open Graph, sitemap & robots settings |
| Custom CSS | Site-wide CSS from admin |
User dashboard (/dashboard)
| Feature | Route area |
|---|---|
| Overview stats | /dashboard |
| New exchange | /dashboard/exchange |
| Transactions & proof upload | /dashboard/transactions |
| Profile & password | /dashboard/profile |
| Support tickets | /dashboard/support |
| Notifications | /dashboard/notifications |
| Report bug / feature | /dashboard/report-feature |
Admin panel (/admin)
| Module | Purpose |
|---|---|
| Dashboard | Metrics, trends, recent activity |
| Exchanges | Approve, cancel, refund transactions |
| Currencies & prices | CRUD, rate sync, form fields |
| Users | Create, edit, ban users |
| Blog & categories | Content management |
| Legal pages | CMS for policy pages |
| Support tickets | Reply to users |
| Contact submissions | Inbox |
| Subscribers | List + email broadcast |
| IP blocking | Block abusive IPs |
| Report & feature requests | User feedback inbox |
| Settings | General, logo, system, SEO, home page, social login, custom CSS, sitemap, robots |
| System | Cache clear, server info, application meta |
Authentication
- Email/password sign-in and sign-up (Sanctum cookie session)
- Forgot / reset password (email link to frontend)
- Optional Google and Facebook OAuth
- Optional email verification (6-digit code)
- First registered user becomes admin when no admin exists (details)
System automation
- Hourly currency rate sync when enabled in admin (cron)
- Database queue driver available for async jobs (default config uses
database)
Technology stack
| Layer | Packages (main) |
|---|---|
| Backend | Laravel 13, Sanctum 4, Socialite, PHP 8.3+ |
| Frontend | Nuxt 4, Vue 3, Tailwind CSS 4, shadcn-vue, nuxt-auth-sanctum, TanStack Table, VeeValidate + Zod |
| Database | MySQL / MariaDB recommended; SQLite supported for local dev |
URLs in development
Default local setup (adjust to your machine):
| App | URL | Notes |
|---|---|---|
| Frontend | http://localhost:4000 | nuxt dev -p 4000 |
| Backend API | http://localhost:8000 or custom port | Must match API_URL in frontend .env |
| API prefix | /api/... | All JSON routes |
| Sanctum CSRF | /sanctum/csrf-cookie | Called before login |
Your frontend .env must set API_URL to the full origin of the Laravel app (no trailing slash), e.g. http://localhost:8000.