Outcome page for buyers: Retail Fax & Bulk Fax Broadcasting. This brief is the engineering slice—how the system is structured and what we own in delivery.
What this engagement covers
Identity & tenancy
AuthController login, Socialite Google/LinkedIn, registration + email verification, role.check middleware, menus/roles permissions, 403 on unauthorized routes.
Campaign plane
CampaignController add/store/delete; fax_file storage; schedule vs immediate send; admin soft/permanent delete; customer create + reorder.
Lists & files
Lead/DNC CSV upload with field mapping; starred / recent / recovery / deleted file states; fax documents tied to campaigns.
Commercial & retail
Stripe PaymentController top-ups; balance updates; DID request & call-forward tables for customers; reseller/customer user management.
Auth (web · auth.check · role.check)
→ Dashboard metrics by user_type
→ Campaigns (scoped queries)
→ Files / Leads / DNC
→ Payments (customers)
→ Reports + Reorder
→ Profile / DID
→ Role permissions (admin)
→ SSO token exchange (optional)
Core data model (representative)
- users — credentials, user_type, balance, verify_contact, created_by, profile fields.
- campaign + fax_file — campaign metadata and document blobs/paths.
- leads · dnc_list — list rows with status flags (active / starred / recovery / soft-delete).
- payments · stripe_payment · customers — wallet commercial path.
- roles · menus — permission assignment JSON / menu IDs.
- request_did · did_call_forward · countries — retail DID flow.
- sso_login — token/session IP tracking across integrated fax products.
Campaign engineering notes
- Three-step UI with Ajax
store—keeps large file + list selection responsive. - Cost display against
users.balancebefore schedule/send. - Reseller: read-only campaign visibility for owned customers; Admin: soft delete + permanent delete from deleted tab.
- Reorder reuses campaign.edit → store for completed jobs.
Auth & social login
Laravel Socialite drivers for Google and LinkedIn (login/{driver}, callback). createOrUpdateInfo upserts the User model; email/password path uses postLogin. Gmail OTP-style recovery and profile password update with email notification fit the same identity plane.
Stripe wallets
Customers only: /payments history, /payments/new form (amount, billing fields), PaymentIntent path, then balance update on success. Admin/Reseller see payments UI without top-up requirements.
SSO across fax products
When retail fax, email-fax and dialer siblings share identity: Bearer token validation against users, session recorded in sso_login with IP/device metadata. Routes such as /ssologin and /ssologinweb are scoped per product estate.
Proof
- YouTube — B2B Cloud Fax Broadcasting
- Demo page with chapters
- Solution landing (buyer outcome)
- Fax broadcasting article
Technology
- Application: Laravel · PHP · Blade/Vue-ready APIs
- Auth: Laravel Socialite · role middleware · OTP recovery
- Payments: Stripe PHP (Customer · PaymentIntent)
- Data: MySQL/PostgreSQL-class relational schema for campaigns, lists, payments
- Ops: Queue-friendly campaign jobs · file storage · audit-friendly soft deletes
Related: SaaS & Multi-Tenant · Full-Stack Product Engineering · Custom CRM/ERP.
Engineering questions
Start here
Outcome vs engineering.
Solution (buyer) → Working demo → SaaS multi-tenant → Contact →