Introduction
Connect To Pros is a Caribbean-focused service marketplace platform built on WordPress. It connects Service Seekers (customers looking for services) with qualified Service Providers (professionals offering services).
Platform Highlights
- Two user roles: Service Providers and Service Seekers, each with dedicated dashboards
- Subscription tiers: Free, Silver, Gold, Platinum with feature gating
- Payment processing via DimePay gateway (JMD currency)
- Job posting & bidding system with auto-bidding for premium providers
- Instant booking system for Silver+ providers
- Quote request system with comparison, feedback, and analytics
- Real-time messaging via SB Chat plugin with admin broadcast messaging
- 40+ automated email notifications with branded HTML templates, all managed from one admin page
- Provider search & discovery with location, industry, service, and badge filters
- Analytics dashboard with event tracking, KPI cards, charts, and CSV export
- Just for You sponsored ads module with configurable hero, rows, and multiple ad types
- Featured providers management for homepage and explore page
- Admin panel for managing providers, seekers, payments, notifications, analytics, and content
Technology Stack
| Component | Technology |
|---|---|
| CMS | WordPress (custom child theme: c2p-child) |
| Frontend | Bootstrap 5, jQuery, Font Awesome, custom CSS/JS |
| Payment Gateway | DimePay (JMD, hosted checkout) + Dime for WooCommerce plugin (WooCommerce is only installed to support this plugin) |
| Email Delivery | WP Mail SMTP (ElasticMail) |
| Messaging | SB Chat plugin |
| Custom Fields | Advanced Custom Fields (ACF) |
| Caching | W3 Total Cache |
| Security | Wordfence, Sucuri Scanner, hCaptcha, Two-Factor Authentication |
| SEO | Yoast SEO (wordpress-seo) |
| Analytics | MonsterInsights (Google Analytics) |
| Backups | Backuply |
| Policy Management | C2P Policy Manager |
| Forms | Cognito Forms (bank details form, etc.) |
| Social Sharing | AddToAny |
| Community | BuddyPress |
| File Storage | Wasabi S3 via Leopard Offload Media, WordPress Media Library |
| Hosting | Bluehost |
| Database | WordPress MySQL with 35+ custom tables (wp_c2p_ and wp_ prefix) |
functions.php. Additional logic is organized into separate include files in /inc/.
⭐ What's New — April 2026
Substantial platform upgrades shipped during the April 2026 cycle. Most changes live on the provider analytics, monthly reports, and admin navigation surfaces. The following is a condensed changelog; each feature is documented in detail in its own section (linked).
🚀 Admin Navigation Hub
- C2P Settings → Dashboard — new full-page admin hub with clickable counter tiles (pending providers, active bookings, pending payouts…) and a grouped card grid linking to every major admin area. See Admin Dashboard Hub.
- WP Home Dashboard widgets — three new widgets on
/wp-admin/index.php: Overview, Needs Your Attention, Recent Activity. Forced to the top of their columns so admins see them on login.
📊 Analytics Tracking — Five New Dimensions
- Contact Click Tracking now surfaced in reports — phone, email, WhatsApp, website clicks counted per-provider with 5-minute IP dedup. Stored in
wp_c2p_contact_clicks. - Search Appearance Tracking across every search surface —
/explore-services/(both initial render and AJAX paginate),/provider-search/, WP search (?s=), homepage Featured Providers, all shortcode surfaces. Stored inwp_c2p_search_appearances. - Profile Tab Engagement Tracking — new table
wp_c2p_profile_tab_viewscaptures intentional tab clicks (About / Services / Reviews / Photos / Shop). About defaults to views (every landing) while other tabs show explicit clicks. - Geographic + Device Tracking on profile views — country, region, city resolved via ip-api.com at track time (never stores raw IPs, 7-day per-visitor cache). Device (mobile / tablet / desktop) + browser parsed from User-Agent. New columns on
wp_c2p_profile_views. - Month-over-Month Comparison — full metric table (Search / Views / Contacts / Quotes / Accepted / Bookings / Reviews / Rating / Earnings) with actual month labels and % change badges. Rendered on live analytics (Gold/Platinum), in every monthly report accordion, and in the monthly email.
📄 Monthly Reports — Deeper Insights
- Tier 1 Insights added to every monthly report: 5-stage Conversion Funnel (Search → Views → Quote Requests → Accepted → Bookings Completed), Response Time Benchmark (vs industry peers, percentile rank), Top 3 Rejection Reasons, Top Search Terms.
- Contact Channels breakdown — per-month counts for Phone / Email / WhatsApp / Website with ratios.
- Geographic + Device Breakdown per month — same data as real-time analytics but scoped to the report's month.
- CSV Export — every report tab has a "Download CSV" button per month plus a "Download All as CSV" button for multi-month export. 31 columns covering every metric. UTF-8 BOM for Excel compatibility.
- Admin tooling at
C2P Settings → Monthly Reports: Backfill Last N Months, Refresh Reports with Latest Insights, Generate Current Month (Partial), Generate & Email Last Month Now.
📱 Provider Profile — WhatsApp Field
- WhatsApp Number field added to provider profile editor with a "Same as phone number" checkbox (pre-ticked by default, JS-synced).
- Public WhatsApp button rendered next to Call/Email CTAs. Opens
wa.me/NUMBER?text=Hi%20...with a pre-filled message. Digits-only normalization handles any input format. - Closes the previously-broken WhatsApp click-tracking loop — tracker existed but nothing was tracking because no button was rendered.
- Schema:
whatsapp_number VARCHAR(32)onwp_c2p_providers, auto-migrated.
🐛 Critical Fixes
- Provider profile Bootstrap data-api restored — root cause: missing
global $wpdb;inadd_chat_modal()caused a PHP fatal duringwp_footer(), which preventedwp_print_footer_scripts()from running → Bootstrap bundle never loaded → dropdowns/tabs/modals all silently broke. Fix: one-lineglobal $wpdb;declaration in the method. - Dispute popup-blocker fix (4 locations) — replaced the
window.open()-inside-AJAX-callback anti-pattern with the pre-open pattern (open blank tab synchronously on click, navigate it to the form URL after AJAX returns). Fixed in SS job dispute, SS booking dispute, SP job dispute, SP booking dispute. - Search appearance gap closed — the tracker existed but was only called from the AJAX pagination endpoint, missing every initial page load. Added to server-side initial render of
/explore-services/,/provider-search/, WP search, homepage featured, and every shortcode that renders providers. - Services Offered textarea redesign — replaced the misleading
wp_editor()(which rendered as a plain textarea with a "Use formatting tools" hint that didn't exist) with a proper<textarea>, placeholder showing example format, and clear helper text explaining where the list appears (public profile, search results, quote request form). - Card-header white-on-white text — global CSS rule
.card-header { color: white; }was hiding titles on any card usingbg-whiteoverride. Added targeted override forbg-white/bg-light/bg-transparent/bg-bodythat restores dark text.
🎨 UI / Responsiveness Improvements
- Analytics stat grid reorganized to 3-per-row (
col-lg-4 col-md-6) with the three profile-view cards (All-Time / 30 Days / 7 Days) grouped together. - Profile edit form header now uses
flex-wrap gap-3so the "View Public Profile" + "Update Profile" buttons don't touch on narrow viewports. - Quote Insights "Recent Feedback" converted from a cluttered table to a card list — anonymous feedback now visually intentional (badge) rather than looking like missing data.
- Contact Interactions card on analytics now has clear section labels ("All-Time by Channel" vs "Recent Activity (All Channels Combined)") to explain the two time scopes in one card.
- "Where Your Views Come From" referrer card now full-width (
col-12) for better readability. - Feedback btn-group ("Would hire again?") added
flex-wrap gap-2so buttons don't squish on phones.
🗄️ Data Model Additions
- New table:
wp_c2p_profile_tab_views— tab click tracking - New columns on
wp_c2p_profile_views:country_code,country_name,region_name,city,device_type,browser - New column on
wp_c2p_providers:whatsapp_number - Expanded JSON schema in
wp_c2p_monthly_reports.report_data— MoM, contact clicks, search data, geo/device, rejection reasons, top search terms
📖 Project Memory Notes
Auto-memory records stored for future reference:
- provider_id column convention —
wp_quote_requests.provider_idandwp_saved_providers.provider_idstore WP user_id (wp_users.ID), NOTwp_c2p_providers.id. Schema column comments were stale and have been corrected to reflect the real convention. - Quote Comparison 2.0 Roadmap — per-quote rating, private notes, and "Add quotes to comparison" picker modal all have complete backend (DB columns, methods, AJAX handlers) but no UI in 1.0. Marked with
ROADMAP 2.0 —comments throughout the codebase. Do NOT delete these AJAX registrations during dead-code audits.
🚀 Admin Dashboard & Navigation Hub
Two new surfaces give admins one-click access to every key area of the platform.
1. Full Admin Dashboard Page
Location: /wp-admin/admin.php?page=c2p-dashboard (or: WP Admin sidebar → C2P Settings → Dashboard)
File: /admin/c2p-admin-dashboard.php
Contains:
- 6 clickable counter tiles (colored left-border cards): Pending Providers, Active Providers, Seekers, Pending Quotes, Active Bookings, Pending Payouts. Each links to the filtered admin area for that metric.
- Grouped navigation card grid — 5 sections (People / Plans & Billing / Reports & Analytics / Communication / System) with a card for every admin page. Hover shows description.
- External Links footer — quick-launch buttons to Provider Dashboard, Seeker Dashboard, Explore Services, Home (all open in new tabs).
Counters are live-computed on each page load — no caching. Single source of truth for the card list is c2p_admin_dashboard_cards().
2. WP Home Dashboard Widgets
Location: /wp-admin/index.php (the default WordPress admin landing page)
Three widgets are force-pushed to the top of their respective columns:
| Widget | Position | Content |
|---|---|---|
| 🚀 Connect to Pros — Overview | Main column, top | 3 counter tiles + grouped nav grid + "Open Full C2P Dashboard" button |
| ⚠️ C2P — Needs Your Attention | Side column, top | Linked list of pending actions: provider approvals, payouts, open disputes, quotes unanswered >24h. "All clear!" empty state. |
| 📋 C2P — Recent Activity | Main column | Last 12 events: new provider signups, quote requests, bookings, reviews. Natural time-ago labels ("2 hours ago"). |
Visibility: widgets are admin-only (manage_options capability). Gracefully degrade when optional tables (e.g. wp_c2p_disputes) don't exist.
If a widget is missing: Screen Options (top-right of WP Dashboard) → tick the widget checkbox. WordPress hides newly-registered widgets from users who've saved a custom dashboard layout.
3. Monthly Reports Admin Page
Location: /wp-admin/admin.php?page=c2p-monthly-reports
File: /admin/monthly-reports-admin.php
Four operational tools for managing the monthly report pipeline:
- Backfill Reports — runs
c2p_backfill_monthly_reports()for the last N months (up to 12). Idempotent — skips months that already have reports. No emails sent. - Refresh Reports with Latest Insights — deletes the last N months of rows and regenerates them. Use after the data model is upgraded (e.g. new fields added to
c2p_gather_monthly_report_data()). No emails sent. - Generate Current Month (Partial) — runs the gatherer for the current month month-to-date. Row is overwritten on the 1st by the real cron run. Useful for verifying new tracking without waiting 2 weeks.
- Generate Last Month's Report Now — runs the exact same code the cron runs on the 1st, including emails. ⚠️ Sends real emails to every eligible provider.
Status card shows: reports stored, earliest/latest month, eligible provider count, next scheduled cron run.
Quick Start & Access
Admin Login
| Access | URL |
|---|---|
| WordPress Admin | /wp-admin/ |
| Provider Admin | /wp-admin/admin.php?page=service-provider |
| Seeker Admin | /wp-admin/admin.php?page=service-seekers |
| Notification Manager | /wp-admin/admin.php?page=notification-manager |
| Payment Settings | /wp-admin/admin.php?page=c2p-payment-settings |
| Pricing Admin | /wp-admin/admin.php?page=c2p-pricing |
| Analytics Dashboard | /wp-admin/admin.php?page=c2p-analytics |
| Admin Messaging | /wp-admin/admin.php?page=c2p-admin-messaging |
| Featured Providers | /wp-admin/admin.php?page=featured-providers |
| Just for You (Ads) | /wp-admin/admin.php?page=jfy-dashboard |
| ElasticMail Test | /wp-admin/admin.php?page=elasticmail-test |
| DB Migration | /wp-admin/tools.php?page=c2p-db-migration |
Key User Roles
The platform has three user roles. Plans (Free/Silver/Gold/Platinum) are NOT separate roles — they are stored as user meta (c2p_plan_name) on the service_provider role and control feature access via the Feature Manager.
| Role | WordPress Role Slug | Description |
|---|---|---|
| Administrator | administrator | Full WordPress admin access, manage all settings, users, and content |
| Service Provider | service_provider | Professional offering services. Custom dashboard at /provider-dashboard/ |
| Service Seeker | service_seeker | Customer looking for services. Custom dashboard at /seeker-dashboard/ |
Role Assignment
- Service Provider: Role set on registration at
/service-provider-registration/. Default plan is Free with 12-month expiration. Account starts withapproval_status: pending(admin must approve). - Service Seeker: Role set on registration at
/service-seeker-registration/. No plan/billing system — all features available immediately. - Administrator: Standard WordPress admin role. Can access everything both roles can do plus all admin management pages.
What Each Role Can Do
Dashboard: /provider-dashboard/ with 18 tabs (Overview, Profile, Photos, Reviews, Bids, Active Jobs, Messages, Settings, etc.)
All Providers Can:
- View and edit their business profile (name, bio, services, areas, contact info)
- Upload and manage service photos (limit depends on plan)
- Appear in search/explore results
- Receive and respond to quote requests
- View and respond to reviews left by seekers
- Send and receive messages (via BuddyPress)
- Manage account settings and password
- View their public profile page at
/provider/{user_id}/
Plan-Gated Features (controlled by Feature Manager):
| Feature | Free | Silver | Gold | Platinum |
|---|---|---|---|---|
| Basic Profile & Search Listing | ✓ | ✓ | ✓ | ✓ |
| Enhanced Profile | — | ✓ | ✓ | ✓ |
| Photo Limit | 5 | 15 | 30 | 50 |
| Storage Limit (MB) | 5 | 10 | 20 | 30 |
| Instant Booking | — | ✓ | ✓ | ✓ |
| Shop (product listing) | — | 5 items | 15 items | Unlimited |
| Priority Search Placement | — | — | ✓ | ✓ |
| Bidding System | — | — | ✓ | ✓ |
| Analytics Dashboard | — | — | ✓ | ✓ |
| Sponsored Ads | — | — | ✓ | ✓ |
| Featured on Explore Services | — | — | ✓ | ✓ |
| Premium Placement (top results) | — | — | — | ✓ |
| Featured on Homepage | — | — | — | ✓ |
| Auto Bidding | — | — | — | ✓ |
| Job Matching | — | — | — | ✓ |
| Live Reports | — | — | — | ✓ |
| Video Ads | — | — | — | ✓ |
Dashboard: /seeker-dashboard/ (Overview, Browse Services, My Quote Requests, Reviews)
What Seekers Can Do:
- Browse and search service providers (explore services, by industry, location, service)
- View provider profiles, photos, reviews, and shop items
- Post job requests and quote requests
- Receive quotes/bids from providers and accept or reject them
- Leave reviews for providers
- Send and receive messages (via BuddyPress)
- Upload a profile image
- Manage account settings and password
What Seekers Cannot Do:
- Access the WordPress admin dashboard (
/wp-admin/) - Create, edit, or delete posts or pages
- Access the provider dashboard or any provider-specific features
- View other seekers' profiles or requests (private to each user)
- Manage services, industries, or provider settings
- View payment/billing management
Administrators have full access to everything, including:
WordPress Admin Menu Items:
- Service Providers — All Providers (list/edit/approve/reject/delete), Add New, Import/Export, Settings, Reviews, Industries & Services, Badges, Shop Items
- Service Seekers — All Seekers (list/edit/delete)
- Pricing — Plan configuration, Payments (view/refund/mark complete), Payment Settings (DimePay keys, sandbox toggle), Webhook Log
- Analytics — Dashboard, Tracking
- Locations — Parish management
- Photos — Photo management
- Ad Carousel — Manage carousel ads
- Staff/Team — Team management
- BuddyPress — Full messaging/social access
- WooCommerce — Products, Orders, Settings (including DimePay gateway at Payments → Dime Payment → Manage)
Admin-Only Actions:
- Approve/reject provider registrations
- Manually change a provider's plan (Free/Silver/Gold/Platinum)
- Process refunds (calls DimePay API)
- Mark pending payments as complete
- Manage industries, services, and badges
- Configure DimePay API keys and sandbox/production mode
- View site-wide analytics and statistics
- Access both provider and seeker dashboards
What No Front-End Role Can Do
Neither Service Providers nor Service Seekers can:
- Access
/wp-admin/(redirected to their respective dashboard or login) - Create, edit, or publish posts/pages
- Manage other users, plugins, or themes
- View or change site settings
- Access WooCommerce admin
- View server logs or database
Role Overlap — Shared Features
| Feature | Provider | Seeker | Admin | Logged Out |
|---|---|---|---|---|
| View homepage & public content | ✓ | ✓ | ✓ | ✓ |
| Browse/search providers | ✓ | ✓ | ✓ | ✓ |
| View provider profiles | ✓ | ✓ | ✓ | ✓ |
| Submit contact form | ✓ | ✓ | ✓ | ✓ |
| BuddyPress messaging | ✓ | ✓ | ✓ | — |
| Notifications | ✓ | ✓ | ✓ | — |
| Upload profile image | ✓ | ✓ | ✓ | — |
| Post/respond to jobs | Bid on jobs | Post jobs | ✓ | — |
| Leave reviews | — | ✓ | ✓ | — |
| Manage own business profile | ✓ | — | ✓ | — |
| Subscribe to paid plans | ✓ | — | — | — |
| WordPress admin access | — | — | ✓ | — |
All Page URLs
Authentication
| URL | Purpose |
|---|---|
/login/ | Role selection (Provider or Seeker login) |
/login-provider/ | Service Provider login form |
/login-seeker/ | Service Seeker login form |
/forgot-password/ | Password reset form (also handles expired passwords with ?expired=1) |
Registration
/service-provider-registration/ | Provider account creation |
/service-seeker-registration/ | Seeker account creation |
Dashboards
/provider-dashboard/ | Service Provider dashboard (18 tabs) |
/seeker-dashboard/ | Service Seeker dashboard (8 tabs) |
Service Discovery
/explore-services/ | Main search & filter page for finding providers |
/provider/[ID]/ | Individual provider profile page |
/services/?service_id=X | Browse providers by service |
/locations/?parish_id=X | Browse providers by location |
/industries/?industry_id=X | Browse providers by industry |
Jobs & Quotes
/jobs/ | Job postings listing |
/job-posting/ | Create/edit a job posting |
/bid-management/ | Manage bids on jobs |
/quote-request/ | Submit a quote request |
Payments
/pricing/ | Subscription plans page |
/payment-result/ | Payment result (success/fail/cancel handler) |
/payment-failed/ | Payment failure page |
/payment-cancelled/ | Payment cancelled page |
/dimepay-webhook/ | DimePay webhook endpoint (not user-facing) |
Content
/ | Homepage |
/about/ | About page (ACF-powered) |
/contact/ | Contact form |
/blog-articles/ | Blog homepage |
/blog-articles/all-articles/ | All articles with filters |
/how-it-works/ | How the platform works (3-tab guide for seekers, providers, visitors) |
/help-center/ | Help center with FAQ and support form (login required) |
/customer-reviews/ | All customer reviews with rating filters and sorting |
/just-for-you/ | Sponsored ads / featured listings |
Service Provider System
Service providers are professionals who offer services on the platform. They register, get approved by admin, choose a subscription plan, and manage their business through a comprehensive dashboard.
Registration Flow
Registration Fields
| Field | Required | Notes |
|---|---|---|
| Contact Name | Yes | Minimum 2 characters |
| Yes | Must be unique across users and providers | |
| Phone Number | Yes | Country-specific validation (Jamaica = 10 digits) |
| Country Code | Yes | 30+ countries supported |
| Password | Yes | 8+ chars, must contain uppercase, lowercase, number, special char |
| Primary Industry | Yes | Dropdown from wp_c2p_industries |
| Primary Service | No | Dependent dropdown based on industry |
| Business Name | No | |
| Business Address | No | Textarea |
| Business Description | No | Textarea |
| Services Offered | No | Textarea |
| Website URL | No | Validated URL format |
| Terms Agreement | Yes | Checkbox |
| Marketing Consent | No | Checkbox |
pending until admin approves them.
Approval Process
| Status | Meaning | Visibility |
|---|---|---|
| Pending | Awaiting admin review (default) | Can access dashboard, NOT visible in search |
| Approved | Admin approved | Full public profile, visible in search |
| Rejected | Admin rejected application | Account disabled, not visible |
How to Approve/Reject a Provider
- Go to Service Providers → All Providers
- Filter by Approval Status: Pending to see new applications
- Click the Approve or Reject link on the provider's row
- The provider receives an email notification automatically
You can also use bulk actions: select multiple providers with checkboxes, then choose Approve/Reject from the Bulk Actions dropdown.
Provider Dashboard
The provider dashboard is accessed at /provider-dashboard/ and includes 18 tabs:
| Tab | Purpose | Plan Required |
|---|---|---|
| Dashboard | Summary stats, quick actions | Free |
| Listing | Edit business profile, hours, services | Free |
| Photo Gallery | Upload and manage photos | Free |
| Shop | Manage products/services for sale | Silver+ |
| Reviews | View customer reviews, respond | Free |
| Quote Insights | Analytics on quote requests | Free |
| Analytics | Detailed dashboard analytics | Gold+ |
| Browse Jobs | Links to /jobs/ page | Free |
| My Bids | View submitted bids | Silver+ |
| Auto-Bidding | Set up automatic bidding rules | Platinum |
| Job Matching | Get matched to relevant jobs | Platinum |
| Quote Requests | View incoming quote requests | Free |
| Active Jobs | Jobs provider is working on | Free |
| Bookings | Instant booking requests | Silver+ |
| Messages | SB Chat messaging system | Free |
| Subscription | Plan management & renewal | Free |
| Banking | Bank account for payments | Free |
| Account Settings | Profile & password management | Free |
Admin Management
Provider admin pages are located at WordPress Admin → Service Providers:
| Page | Purpose |
|---|---|
| All Providers | List, search, filter, approve/reject, bulk actions |
| Add Provider | Manually create a provider account |
| Edit Provider | Edit provider details, approval status |
| Provider Photos | Manage provider photo galleries |
| Photo Management | Global photo moderation (pending/approved) |
| Industries/Services | Manage industry and service categories |
| Badges | Manage provider badges/certifications |
| Photo Limits | Configure upload limits per plan |
| Import/Export | Bulk import/export provider data |
| Settings | General provider system settings |
| Shop Items | Manage provider shop items |
| Featured Providers | Manage homepage and explore page featured providers (Gold/Platinum only) |
- Go to Service Providers → Add New
- Fill in required fields: Contact Name, Email, Industry
- Password: either enter one manually (8+ chars, must include uppercase, lowercase, number, special char) or check Auto-generate
- Check Send Welcome Email to email the credentials to the provider
- Set plan details (plan name, billing period, status, expiry date) if needed
- Click Save Provider
This creates both a WordPress user (role: service_provider) and a wp_c2p_providers record.
- Go to Service Providers → All Providers
- Click Edit on the provider
- Scroll to the Plan section
- Change: Plan Name (Free/Silver/Gold/Platinum), Billing Period (monthly/annual), Plan Status (active/cancelled/expired), Plan Expires (date), Last Payment Date
- Click Save
- Go to Service Providers → All Providers
- Click Delete on the provider's row, or select multiple and use Bulk Actions → Delete
Photo Management
Providers can upload photos to showcase their work. All photos go through a moderation workflow and are stored in the WordPress Media Library (offloaded to Wasabi S3 via Leopard plugin).
Overview
| Feature | Details |
|---|---|
| Photo Categories | General, Logo, Portfolio, Team, Facility, Certificates, Before/After, Equipment, Media, Other |
| Allowed Formats | JPG, JPEG, PNG, WebP |
| Max File Size | 5 MB per photo |
| Auto-Compression | Enabled (quality: 85%) |
| Moderation | All uploads go to Pending → Admin approves or rejects |
| Storage | WordPress Media Library → offloaded to Wasabi S3 via Leopard plugin |
| Plan | Max Photos |
|---|---|
| Free | 5 |
| Silver | 15 |
| Gold | 30 |
| Platinum | 50 |
Photo limits are configured per plan. To change them:
- Go to Pricing → Plan Features
- Edit
photo_limit(max number of photos) andstorage_limit_mb(max total storage) for each plan
- Go to Service Providers → Photo Management
- At the top, 4 statistics cards show: Total Photos, Pending Review (yellow), Approved (green), Total Size (blue)
- Use the filter bar to narrow results:
- Status: All, Pending, Approved, Rejected
- Provider: All or a specific provider
- Category: All or a specific photo category
- Click Filter (or Clear to reset)
- Photos appear in a 4-column grid. Each card shows:
- Thumbnail image, status badge (colour-coded), featured badge (if applicable)
- Title, provider name, category, file size, upload date
- Action buttons per photo:
- Approve — makes the photo visible on the provider's profile
- Reject — opens a modal requiring a rejection reason (mandatory). The reason is stored for admin reference
- View — opens the full-size photo in a modal with all details
On the provider dashboard, there is a Photo Gallery section that shows:
- Upload widget — drag-and-drop or click to select files
- Photo stats — photos uploaded (with progress bar), storage used, remaining quota
- Manage Photos button — links to full photo management page
When a provider uploads a photo:
- File is validated (format, size, quota check)
- Auto-compressed to 85% quality if applicable
- Uploaded to WordPress Media Library (then offloaded to Wasabi S3 by Leopard)
- Status set to Pending — awaits admin approval
- Admin sees it in the Photo Management pending queue
logo field.Industries & Services
Industries are the top-level categories (e.g. "Plumbing", "Electrical"). Services are sub-categories under each industry (e.g. "Pipe Repair" under "Plumbing"). The admin page uses a tabbed interface — click the Industries or Services tab at the top to switch between them.
- Go to Service Providers → Industries & Services
- Make sure the Industries tab is selected
- Fill in the form fields:
Field Required Description Name Yes The display name (e.g. "Plumbing") Slug No URL-friendly version. Auto-generated from the name if left blank (e.g. "plumbing") Description No Brief description of the industry (textarea, 3 rows) Icon Type No Choose from dropdown — see icon guide below Icon Name/URL No The icon identifier — depends on icon type selected - Click Add Industry
- The new industry appears in the table below the form
- Go to Service Providers → Industries & Services (Industries tab)
- Find the industry in the table and click the Edit button
- The form above will populate with the industry's current values
- Make your changes to any fields
- Click Update Industry
- Find the industry in the table and click the Delete link
- Confirm the deletion in the browser dialog
- Find the industry in the table and click the Upload Photo button
- A modal dialog will appear with the industry name in the title
- Click Choose File and select an image (JPG, PNG, or WebP — max 5 MB)
- Optionally enter Alt Text for accessibility
- Click Upload Photo
- The photo is uploaded to the WordPress Media Library and linked to the industry
To remove a photo, click the Delete Photo link next to the industry's current photo.
- Go to Service Providers → Industries & Services
- Click the Services tab
- Fill in the form fields:
Field Required Description Parent Industry Yes Select the industry this service belongs to from the dropdown Name Yes The display name (e.g. "Pipe Repair") Slug No URL-friendly version. Auto-generated from name if blank Icon Type No Choose from dropdown — see icon guide below Icon Name/URL No The icon identifier — depends on icon type selected - Click Add Service
Edit:
- On the Services tab, find the service in the table and click Edit
- The form populates with the service's current values (including its parent industry)
- Make changes and click Update Service
- You can change the parent industry to move a service from one industry to another
Delete:
- Click Delete next to the service and confirm
- On the Services tab, find the service and click Upload Photo
- A modal dialog appears — choose an image file (JPG, PNG, or WebP — max 5 MB)
- Optionally enter Alt Text
- Click Upload Photo
To remove a service photo, click Delete Photo next to the current photo.
When adding or editing an industry or service, you can assign an icon. The system supports Google Material Icons and FontAwesome icons. Here's how to use each one:
Google Material Icons (Recommended — easiest)
- Go to fonts.google.com/icons
- Search for what you need (e.g. search "pet", "home", "car")
- Click the icon you like
- Copy just the icon name shown (e.g.
pets,plumbing,electrical_services) - In the admin form, select "Material Symbols (Outlined)" from the Icon Type dropdown
- Paste the icon name into the "Icon name or URL" field
| Icon Type in Dropdown | What It Looks Like |
|---|---|
| Material Symbols (Outlined) | Clean outline style — this is the default, use this one |
| Material Symbols (Rounded) | Same icons but with rounded corners |
| Material Symbols (Sharp) | Same icons but with sharp corners |
Examples: pets, plumbing, electrical_services, cleaning_services, home_repair_service, construction
FontAwesome Icons
- Go to fontawesome.com/search (free icons only)
- Search for what you need (e.g. search "bone", "car", "house")
- Click the icon you like
- You need to copy the full class name including the style prefix — for example
fa-solid fa-bone - In the admin form, select "FontAwesome" from the Icon Type dropdown
- Paste the full class name into the "Icon name or URL" field
Examples: fa-solid fa-bone, fa-solid fa-wrench, fa-solid fa-hammer, fa-solid fa-paintbrush
fa-solid) before the icon name. Just entering bone will not work — it must be fa-solid fa-bone.Image URL (Custom Image)
If neither icon library has what you need, you can paste a full URL to any image (PNG, SVG, etc.) into the icon field instead. Select "Image URL" from the dropdown.
A live preview appears next to the field as you type, so you can check the icon looks correct before saving.
Video Guide — How to Add Icons
Watch this short video to see how to select and add icons to industries and services:
Badges
Badges are labels that can be assigned to providers (e.g. "Verified", "Top Rated", "Eco-Friendly"). They appear on provider profiles and as filter options in search results.
- Go to Service Providers → Badges
- Fill in the form fields:
Field Required Description Badge Name Yes Display name (e.g. "Verified Professional") Slug No Auto-generated from the name (e.g. "verified-professional") Description No Brief description of what this badge means (textarea, 3 rows) Icon Type No Choose from: Material Symbols (Outlined/Rounded/Sharp), FontAwesome (Solid), or Image URL Icon Name/URL No The icon identifier (see Icon System Guide above) Color No Badge colour — uses a colour picker. Default: #007cba (blue) Sort Order No Number controlling display order (lower numbers appear first). Default: 0 - Click Add Badge
- The new badge appears in the table below, marked as Active by default
- Go to Service Providers → Badges
- Find the badge in the table and click the Edit button
- The form above populates with the badge's current values (name, slug, description, icon, colour, sort order)
- Make your changes
- Click Update Badge
- Find the badge in the table
- Click the Deactivate link (or Activate if currently inactive)
- Deactivated badges will no longer appear in search filters or on provider profiles
- Find the badge in the table and click the Delete link
- Confirm the deletion in the browser dialog
Location Management
Locations use a 4-tier hierarchy. Each level has its own admin page under the Locations menu in WordPress admin.
└— Administrative Division / Parish (e.g. St. Andrew, Clarendon)
└— Community / Town (e.g. Papine, Half Way Tree)
└— Neighbourhood (e.g. Hope Flats, Seivright Gardens)
Locations are used in: provider registration, seeker registration, search filters, and provider profiles.
- Go to Locations → Countries
- Fill in the form:
Field Required Description Country Name Yes Full name (e.g. "Jamaica") Country Code Yes ISO 2-letter code (e.g. "JM") Phone Code No International dialling code (e.g. "+1-876") Status No Active or Inactive - Click Add Country
- Go to Locations → Admin Divisions
- Fill in the form:
Field Required Description Parent Country Yes Select from dropdown of existing countries Division Name Yes Name of the parish/state/province (e.g. "St. Andrew") Status No Active or Inactive - Click Add Division
- Go to Locations → Communities
- Fill in the form:
Field Required Description Parent Division Yes Select from dropdown of existing administrative divisions Community Name Yes Name of the town/city/village (e.g. "Papine", "Half Way Tree") - Click Add Community
- Go to Locations → Neighbourhoods
- Fill in the form:
Field Required Description Parent Community Yes Select from dropdown of existing communities Neighbourhood Name Yes Name of the residential area (e.g. "Hope Flats", "Seivright Gardens") - Click Add Neighbourhood
Edit:
- Go to the appropriate location level page (Countries, Admin Divisions, Communities, or Neighbourhoods)
- Find the entry in the table and click Edit
- Update the fields and click Save
Delete:
- Click Delete next to the entry and confirm
Shop Items
Providers on Silver+ plans can list shop items (products or services with pricing) on their profile. This is a catalog/showcase feature only — there is no checkout, no payment processing, and no orders. Customers contact the provider directly via the call-to-action button on each item.
Step 1: Provider Adds a Shop Item
- The provider goes to their dashboard and opens the Shop section
- They click “Add Item” and fill in the form:
- Title (required) — the item name
- Description — brief description of the product or service
- Price — a fixed price, custom text (e.g. “From $99”), or “Contact for pricing”
- Image — a product/service photo
- Phone number (optional) — contact phone override specific to this item
- Email (optional) — contact email override specific to this item
- External link (optional) — URL to an external product/service page
- CTA button type — determines what the customer’s button does: Call, Email, Contact, Visit Link, View More, or Explore
- CTA button text — custom label for the button (e.g. “Get Quote”, “Learn More”)
- Active/Inactive toggle — whether the item should be visible once approved
- The provider clicks Save
- The item is created with status Pending — it is not visible to customers until approved by an admin
- The provider sees a message: “Item added successfully. It will be visible after admin approval.”
Step 2: Email Notifications
- To admin (admin@connecttopros.com): An email is sent immediately with the subject “New Shop Item Pending Approval: [Item Title]”, including the provider name, provider email, and a link to the admin review page
- To provider (on approval): Email with subject “Shop Item Approved: [Item Title]” — confirms the item is now live on their profile
- To provider (on rejection): Email with subject “Shop Item Rejected: [Item Title]” — includes the rejection reason and a link to edit and resubmit
Step 3: Admin Reviews the Item
- Admin receives the notification email and clicks the link, or goes to Service Providers → Shop Items → Pending tab
- Admin reviews the item and either:
- Approves — the item becomes visible on the provider’s profile and on the Shop Discovery page. The provider receives an approval email.
- Rejects — admin enters a reason (required). The provider receives a rejection email with the reason and can edit and resubmit from their dashboard.
- Edits — admin can modify the item before approving (change title, price, description, etc.)
Step 4: Customer/Seeker Interaction
Customers can discover shop items in two places:
- Shop Discovery page (
/shop/) — shows all approved items across all providers, with search, filters (industry, location, price range), and sorting - Provider profile → Shop tab — shows that specific provider’s approved items in a grid layout (3 columns desktop, 2 tablet, 1 mobile)
When a customer views an item, they see the title, description, price, and image. They interact via the CTA button, which does one of the following depending on how the provider configured it:
| CTA Type | What Happens When the Customer Clicks |
|---|---|
| Call | Opens the phone dialer with the provider’s number |
| Opens the email client with the provider’s email | |
| Contact | Scrolls to the provider’s contact section on their profile |
| Visit Link | Opens the external URL (with a confirmation dialog first) |
| View More | Opens a modal with the full item description and details |
| Explore | Opens a modal with the full item description and details |
Step 5: Provider Manages Their Items
From the provider dashboard Shop section, providers can:
- Edit existing items (title, price, description, image, CTA, etc.)
- Delete items they no longer want to list
- Reorder items via drag-and-drop to control display order on their profile
- Deactivate items (toggle active/inactive) without deleting them
Status Flow
- Approved: Item is visible to customers on the provider’s profile and Shop Discovery page
- Rejected: Provider receives the reason and can edit and resubmit → goes back to Pending
- Go to Service Providers → Shop Items
- Click Add New Item — a modal form appears
- Fill in the fields:
Field Required Description Provider Yes Select the provider from the dropdown (shows Business Name + ID) Title Yes Item name (e.g. "Basic Plumbing Checkup") Description No Brief description of the item (textarea, 3 rows) Price No Numeric price (e.g. 99.99) Price Display No Custom text shown instead of/alongside price (e.g. "From $99", "Contact for pricing") Image No Click Browse to open WordPress media library. Preview appears after selection Phone No Contact phone for this item Email No Contact email for this item External Link No URL to external product/service page CTA Type No Button type: contact, call, email, visit_link, view_more, or explore CTA Text No Custom button text (e.g. "Get Quote", "Learn More") - Options:
- Active — Whether the item is visible on the provider's profile
- Auto-Approve — Skip the pending review stage and set status to approved immediately
- Click Save
When providers submit shop items (or when Auto-Approve is unchecked), items go into Pending status. The admin receives an email notification.
- Go to Service Providers → Shop Items
- Click the Pending tab to see items awaiting review
- For each item:
- Click Approve to make it live on the provider's profile. The provider receives an approval email.
- Click Reject to open the rejection modal — enter a reason (required) and confirm. The provider receives a rejection email with the reason.
- Click Edit to modify the item before approving
Edit:
- Find the item in any tab (All, Pending, Approved, Rejected)
- Click Edit — the modal form appears with current values
- Update any fields, including changing the Status (pending/approved/rejected)
- Click Save
Delete:
- Click Delete next to the item and confirm
Filter & Search: Use the provider dropdown or search field to find specific items. Search matches item title and business name.
| Plan | Shop Items |
|---|---|
| Free | Not available |
| Silver | 5 items |
| Gold | 15 items |
| Platinum | Unlimited |
Items are stored in the wp_c2p_provider_shop_items database table.
Service Seeker System
Service seekers are customers who register to find and hire service providers.
Registration
| Field | Required |
|---|---|
| First Name | Yes |
| Last Name | Yes |
| Yes (used as username) | |
| Password | Yes (min 6 chars) |
| Location | Yes |
| Phone | No |
| Company Name | No |
| Industry | No |
| Specific Area | No |
Seeker Dashboard
Accessed at /seeker-dashboard/ with 8 tabs:
| Tab | Purpose |
|---|---|
| Overview | Quick stats (quotes, jobs, messages, reviews) |
| Quote Requests | All submitted quote requests with filters |
| Compare Quotes | Side-by-side comparison, shortlisting, rating |
| Messages | Conversations with providers (SB Chat) |
| Reviews | Reviews submitted by seeker |
| Payments | Payment history and status |
| Jobs | Posted jobs, bid counts, bid management |
| Saved Providers | Favorite providers with notes |
Admin Management
WordPress Admin → Service Seekers:
- Seekers List: View all seekers, bulk activate/deactivate/suspend/delete, export CSV
- Add New Seeker: Manually create seeker accounts
- Edit Seeker: Modify details, view activity stats (jobs posted, quotes, payments)
- Settings: Default status, auto-approve, field requirements, email toggles, activity limits
- Go to Service Seekers → Add New
- Fill in: First Name, Last Name, Email (required), Location (required)
- Password: enter manually (min 6 chars) or leave blank for auto-generated
- Check Send Welcome Email to email credentials
- Click Save
Seekers are immediately active (no approval workflow like providers).
Suspend: Go to Service Seekers → All Seekers, click Edit, change Status to Suspended, and Save.
Bulk actions: Select seekers with checkboxes, choose Activate/Suspend/Delete from dropdown.
On the All Seekers page, click the Export CSV button. The file is UTF-8 with BOM for Excel compatibility.
Subscriptions & Plans
Plan Tiers
| Feature | Free | Silver | Gold | Platinum |
|---|---|---|---|---|
| Basic Profile | Yes | Yes | Yes | Yes |
| Photos | 5 | 15 | 30 | 50 |
| Storage | 5MB | 10MB | 20MB | 30MB |
| Search Listing | Yes | Yes | Priority | Premium |
| Messaging | Yes | Yes | Yes | Yes |
| Shop Items | - | 5 | 15 | Unlimited |
| Instant Booking | - | Yes | Yes | Yes |
| Bidding System | - | - | Yes | Yes |
| Analytics | - | Basic | Full | Full + Live |
| Featured on Explore | - | - | Yes | Yes |
| Featured on Homepage | - | - | - | Yes |
| Auto-Bidding | - | - | - | Yes |
| Job Matching | - | - | - | Yes |
Subscription Statuses
| Status | Meaning |
|---|---|
active | Currently active and auto-renewing |
cancelled | User cancelled; retains access until expiry date |
expired | Past expiration; downgraded to Free |
past_due | Payment failed; in retry cycle |
grace_period | Expired but still has access (7-day grace) |
Plan Data Storage
Plan information is stored in WordPress user meta:
c2p_plan_name— Plan name (Free, Silver, Gold, Platinum)c2p_plan_status— active, cancelled, expired, past_due, grace_periodc2p_plan_expires— Expiration date (YYYY-MM-DD HH:MM:SS)c2p_billing_period— monthly or annualc2p_last_payment_date— Last successful payment
Feature Access Check
// Check if a provider can access a specific feature
c2p_can_access_feature($provider_id, 'bidding_system'); // returns true/false
c2p_can_access_feature($provider_id, 'analytics_dashboard');
c2p_can_access_feature($provider_id, 'shop_enabled');
Pricing Configuration
Plan prices are managed via WordPress Admin → Pricing. Stored in the c2p_pricing_data option. Annual pricing defaults to 10x monthly if not explicitly set.
- Go to Pricing (top-level menu)
- Each plan has: Name, Monthly Price, Annual Price, Description, Features list (one per line), Excluded Features, Button text
- Edit the fields and click Save Changes
- To mark a plan as recommended: check the Popular checkbox (adds a "Popular" badge)
- To mark a plan as free: check the Free checkbox (hides price and shows "Free")
- Go to Pricing → Plan Features
- Configure which features are available at each plan tier
- This controls: photo limits, storage limits, shop items, bidding access, analytics access, etc.
The pricing page includes a commented-out test mode feature that adds a banner allowing testers to switch subscription plans to weekly billing intervals. This is useful for testing the full subscription lifecycle without waiting a month.
File: page-pricing.php
To re-enable for testing:
- Open
page-pricing.php - Find the HTML comment block labelled "WEEKLY BILLING TEST MODE" (near the top of the file) and uncomment the
<div class="container">block inside it - Find the JavaScript comment block labelled "WEEKLY BILLING TEST MODE JS" (in the script section at the bottom) and uncomment the code inside it
- A yellow banner with a "Switch to Weekly Billing" button will appear on the pricing page
Subscription Health & Expiration Management
The system automatically manages subscription expirations through a multi-stage process:
Pre-Expiry Warnings
Automated emails are sent to providers before their subscription expires:
- 30 days before: Early renewal reminder
- 7 days before: Upcoming expiry warning
- 3 days before: Urgent renewal reminder
- 1 day before: Final warning
Grace Period
When a subscription expires, the provider enters a 7-day grace period (configurable) during which they retain full access:
- Day 0: Grace period starts — provider receives email explaining they have 7 days to renew
- Day 3: Reminder email sent
- Day 6: Final warning — “1 day left to renew”
- Day 7: Grace period ends — the following happens automatically:
- Plan status set to
expired - Shop items exceeding Free tier limits are automatically deactivated (not deleted)
- Admin receives email notification of the expiration
- Plan status set to
Admin Subscription Health Dashboard
Access via Service Providers → Sub Health. This page shows:
- In Grace Period: Providers whose subscriptions have expired and are in the grace window, showing days remaining
- Expiring Within 7 Days: Providers about to expire, with warning history showing which reminders were sent
- Expiring in 8-30 Days: Providers coming up for renewal
- Recently Expired: Providers who have been downgraded after grace period ended
- Filterable by plan type
- Menu badge shows count of providers expiring within 7 days or in grace period
Admin Daily Digest Email
A daily email is sent to the admin summarising providers in grace period, expiring within 30 days, and recently expired.
Review Moderation
Access via Service Providers → Review Moderation.
- When a seeker submits a review, the admin receives an email notification: “New Review Submitted — [Provider Name]” with rating, excerpt, and a link to the review moderation page
- The menu item shows a badge with the count of reviews submitted in the last 48 hours
- Providers can flag suspicious reviews from their dashboard — the admin sees flagged reviews in a dedicated tab with options to dismiss or take action
- Providers can write a public response to any review (visible to all users)
Page Ads System
Access via Page Ads in the admin sidebar.
This system allows you to place ad banners at predefined positions across the website. Ads are managed entirely from the WordPress admin.
Available Ad Positions
| Position | Page |
|---|---|
| Above Professional Solutions | Home Page |
| Above Browse by Location | Home Page |
| Above Footer | Home Page |
| Above Filters & Results | Explore Services |
| Above Footer | Explore Services |
| Above Footer | Provider Profile |
| Above Footer | Shop Discovery |
| Above Footer | Customer Reviews |
| Above Footer | Pricing |
| Above Latest Insights / Above Categories / Above Footer | Blog |
| Above Perspective Tabs / Above Footer | How It Works |
Ad Types
- Image: Simple image with optional click-through link
- Text Overlay: Text-only block with background colour
- Image + Text Overlay: Image with positioned text overlay and optional CTA button
- Video: Video with optional poster image
Width Options
- Full: Single banner spanning full width
- Half: Two side-by-side banners
- Third: Three banners in a row
Managing Ads
- Go to Page Ads → Dashboard — see all positions with their status
- Click “Manage Ads” next to a position
- Click “Add New Ad” — fill in ad type, image/video, overlay text, link, width
- Toggle individual ads or entire positions active/inactive
Provider Dashboard Features
Response Templates
Providers can save frequently used quote responses as templates:
- When responding to a quote, a “Use Template” dropdown pre-fills the response message
- After writing a response, a “Save as Template” checkbox saves it for future use
- Templates can be managed (renamed, deleted) from the template dropdown
File Attachments in Quote Responses
Providers can attach files when responding to quote requests:
- Accepted formats: PDF, images, documents
- Maximum file size: 5MB per file
- Seekers see download links in the quote detail view
Profile Visibility Toggle
Providers can temporarily hide their profile from search results:
- Found in the Profile section of the dashboard
- Toggle switch with warning text explaining the impact
- When hidden, the profile does not appear in Explore Services search results
- Existing bookings and conversations are not affected
Keyword Suggestions
The profile section shows clickable keyword suggestions below the keywords input:
- Admin can configure suggestions via Service Providers → Settings
- Providers click a suggestion to add it to their keywords
- Helps providers use terms that seekers actually search for
Search Analytics
Providers (Silver+ plans) can view their search performance:
- Profile Views: Total, 30-day, 7-day view counts with daily chart
- View Sources: Where views come from (Google, Facebook, Direct, Explore, etc.)
- Conversion Rate: Percentage of profile views that resulted in a quote request
Quote Insights & Feedback
When seekers decline a provider’s quote, they can leave feedback. Providers see this as aggregated analytics:
- Stats: Total feedback count, average vs market rate, would-hire-again percentage, top decline reason
- Why Clients Declined: Bar chart of decline reasons with percentages
- Price Perception: Distribution of Too High / Slightly High / Fair / Good Value ratings
- Recent Feedback: Table showing date, client (anonymous or named), service, quote amount, reason, would hire again
- Suggestions: Data-driven improvement suggestions based on feedback patterns
- Providers can follow up with non-anonymous feedback submitters via chat/email
Booking Features
- “I’m Here” Check-in: On the day of a confirmed booking, providers can click “I’m Here” to notify the seeker they’ve arrived
- Automated Reminders: Both provider and seeker receive reminders at 24 hours, 2 hours, and 1 hour before the booking
- Progress Updates: Providers can send progress updates during a booking, delivered via email and chat
Shop Item Management
- Resubmit: If a shop item is rejected by admin, providers can click “Resubmit” to send it back for review (status resets to Pending)
- Rejection Reason: Providers can see the admin’s rejection reason on rejected items
- Drag-to-Reorder: Providers can drag items to reorder how they appear on their profile
- Remaining Slots: Shows how many shop item slots remain on their current plan
- Approval Timeline: Shows estimated review time (configurable by admin)
Broadcast Messaging
Access via Messaging in the admin sidebar.
Admins can send broadcast messages to groups of users (all users, all providers, all seekers, specific plan tiers).
- Messages are sent via the SB Chat messaging system and optionally via email
- Broadcasting uses batched processing (50 users per batch) with a progress bar to prevent server timeouts
- A lock prevents accidental double-sends
- Broadcast messages appear in each user’s chat inbox
Admin Analytics Dashboard
Access via C2P Analytics in the admin sidebar.
The analytics dashboard provides a comprehensive overview of platform activity with configurable date ranges (7 days, 30 days, 90 days, 1 year):
- Total Users: Breakdown of seekers vs providers
- Active Providers: Count with pending approval indicator and plan distribution
- Quote Requests: Total with response rate
- Monthly Recurring Revenue: Based on active subscriptions with ARR calculation
- Profile Views: Tracked from the provider profile page
- Unique Visitors / Pages per Visit / Mobile Traffic: Site-wide analytics
- Top Providers by Engagement: Ranked by views + quotes + bookings
- Most Viewed Providers: Profile view leaderboard with percentage bars
- Top Booked Providers: Providers with the most bookings
- Top Categories: Industries ranked by provider count and bookings
- Top Parishes: Locations ranked by provider count and activity
- Quote Conversion Rate / Dispute Rate / Average Rating: Key performance metrics
- Payout Summary: Pending and completed payout totals
- Subscription Health: At-a-glance expiring/grace/expired counts
- User Growth & Plan Distribution: Charts showing growth over time
- Export: CSV export for Users, Pageviews, Quotes, Top Providers, and Search Terms reports
Payments (DimePay)
Payment Flow
DimePay Configuration
Settings are stored in c2p_payment_settings option. Configured at Admin → Payment Settings.
| Setting | Description |
|---|---|
| Sandbox Mode | Toggle between sandbox and live API |
| Client Key | Sandbox / Live API client key |
| Signing Secret | Sandbox / Live signing secret |
| Webhook Secret | For verifying webhook signatures |
| Default Currency | JMD (Jamaican Dollar) by default |
| Grace Period Days | Days of access after expiry (default: 7) |
Admin Payment Notifications
The admin can receive email notifications whenever a payment is made, renewed, cancelled, or fails. This is controlled from the Behavior Settings section on the Payment Settings page.
- Go to Pricing → Payments → Settings tab
- Scroll to the Behavior Settings section
- Check the “Admin Payment Notifications” checkbox — “Send admin email notifications for payments, renewals, cancellations, and failures”
- In the “Admin Notification Email” field, enter the email address that should receive these notifications (e.g.
payments@connecttopros.com). If left empty, the WordPress admin email is used. - Click Save Settings
Once enabled, the admin receives an email for:
- New payment received — when a seeker pays for a job bid or booking
- Subscription renewed — when a provider’s plan auto-renews
- Subscription cancelled — when a provider cancels their plan
- Payment failed — when a payment attempt is declined
| Setting | Description |
|---|---|
| Auto-upgrade Users | Automatically upgrade provider accounts when payment is confirmed (e.g. Free → Silver after payment) |
| Confirmation Email | Send email confirmation to the user (seeker or provider) after a successful payment |
| Failed Payment Email | Send email notification to the user when a subscription payment fails |
| Admin Payment Notifications | Send admin email for payments, renewals, cancellations, and failures |
| Admin Notification Email | Which email address receives admin notifications. Defaults to WordPress admin email if empty. |
| Default Currency | Currency used for all payments (default: JMD — Jamaican Dollar) |
Platform Fee
A configurable platform fee is deducted from every service payment (job bid or booking) before the provider payout. The seeker pays the full amount to DimePay; the fee is applied on the platform side when calculating the provider’s payout.
- Go to Pricing → Payments → Settings tab
- Scroll to the “Platform Fee (%)” field in the Behavior Settings section
- Enter the desired percentage (default is 10%, adjustable from 0% to 100% in 0.5% increments)
- Click Save Settings
Example: With a 10% fee on a $100 payment:
- The seeker pays $100 to DimePay
- The platform fee recorded is $10
- The provider payout is $90
The fee percentage is also displayed on the Pricing → Payouts page with a quick link to change it.
Webhook Endpoint
DimePay sends payment events to /dimepay-webhook/. The webhook handler processes these events:
payment.completed→ Upgrade user accountpayment.failed→ Mark failed, track retriessubscription.renewed→ Extend plan expirationsubscription.cancelled→ Mark subscription cancelled
Grace Period & Dunning
When a subscription expires, the Dunning Manager handles a 7-day grace period:
- Pre-expiry: Warning emails at 7 days, 3 days, and 1 day before expiry
- Day 0: Grace period starts, user retains paid plan access
- Day 3: Grace period reminder email
- Day 6: Final warning email
- Day 7: Account downgraded to Free plan
Payment Reconciliation
A twice-daily cron job checks for "stuck" pending payments (30+ minutes old). It queries DimePay's API and updates local records accordingly. Payments older than 7 days are auto-expired.
Admin Payment Actions
- Go to Pricing → Payments
- The Recent Payments tab shows all transactions with: User, Plan, Amount, Status, Date
- Mark Complete: Click on a pending payment to manually mark it as completed (upgrades the user's account)
- Refund: Click Refund on a completed payment — this sends a refund request to DimePay's API and, upon success, downgrades the user locally
- Export: Click the CSV export button for payment records
The custom C2P payment integration is configured at:
- Go to Pricing → Payments → Settings tab
- Toggle Sandbox Mode for testing vs live payments
- Enter the Client Key and Signing Secret (separate fields for sandbox and live)
- Set the Webhook Secret for signature verification
- Configure success/failure/cancel redirect URLs
- Click Save Settings
Use the Setup Guide tab for step-by-step DimePay configuration instructions.
DimePay WooCommerce Plugin
In addition to the custom C2P payment integration (used for plan subscriptions), the site also uses the Dime Pay for WooCommerce plugin for processing WooCommerce cart/checkout payments. This is a separate plugin installed from the WordPress plugin repository.
There are two ways to get to the DimePay settings:
Option 1 — Shortcut (quickest):
- In the left sidebar, go to Payments (directly below Products)
- Find Dime Payment in the list and click Manage
Option 2 — Through Settings:
- Go to WooCommerce → Settings → Payments tab
- Find Dime Payment in the list and click Manage
Video Guide — How to Access and Manage DimePay Settings
Watch this video to see how to navigate to the DimePay settings and what each option does:
| Setting | Description |
|---|---|
| Enable/Disable | Toggle the payment method on/off at checkout |
| Environment | Production (live payments) or Development (sandbox/testing). Switch to Development for testing with test cards. |
| API URL | The DimePay API endpoint URL. Provided by DimePay when you sign up. |
| Client Key (Secret Key) | Your API key from the DimePay merchant portal. This authenticates all API requests (payments, refunds, fee lookups). |
| Pass Fees To | Merchant (you absorb fees), Customer (fees added to order total), or Split 50/50 |
| Debug Mode | When enabled, logs all API requests and responses to wp-content/debug.log for troubleshooting |
To configure the plugin (either WooCommerce or C2P), you need the following from your DimePay merchant dashboard at dimepay.net:
- Client Key / Secret Key — Found in your DimePay merchant account settings. This is the primary authentication credential for all API calls.
- Signing Secret — Used by the C2P integration to sign JWT payloads. Found in the same merchant settings area.
- Webhook Secret — Used to verify incoming webhook signatures (HMAC-SHA256). Set this up in the DimePay dashboard under webhook configuration.
- API URL — The base URL for API requests. DimePay provides separate URLs for sandbox and production environments.
This video shows how to change the DimePay environment from sandbox (testing) to production (live payments). Remember: when switching to production, you will also need to update the Client Key with your production key from the DimePay portal — the sandbox and production keys are different.
- Hosted Checkout: Customers are redirected to DimePay's secure hosted payment page, then returned after payment
- Fee Pass-Through: Optionally pass DimePay processing fees to the customer (adds a line item to the WooCommerce cart). Configurable as merchant-pays, customer-pays, or 50/50 split.
- Refunds: Refunds can be processed from both WooCommerce order screens and the C2P admin payment manager. The refund request is sent to DimePay's API automatically.
- WooCommerce Blocks Support: Works with the new WooCommerce block-based checkout (shows Visa/MasterCard icons)
- Classic Checkout Support: Also works with the legacy/classic WooCommerce checkout
- Webhook Callback: DimePay sends a callback to the site after payment to confirm the transaction status
All payments on the website are processed through DimePay. The payment system has two parts:
| Part | Purpose | Where to Find It |
|---|---|---|
| DimePay WooCommerce Plugin | This is where you manage your DimePay credentials (Client Key, API URL, sandbox/production). It is only used to store the settings — it does not power any shop or cart. | WooCommerce → Settings → Payments → Dime Payment → Manage |
| C2P Payment System | This is what actually processes payments on the site — plan subscriptions (Silver/Gold/Platinum), monthly and annual billing, add-on purchases. It reads the DimePay credentials from the WooCommerce plugin automatically. | Pricing → Payments → Settings |
In short: You enter your DimePay keys in one place (WooCommerce → Settings → Payments → Dime Payment → Manage), and the C2P payment system picks them up automatically from there.
Go to Pricing → Payments → Webhook Log tab. This shows all incoming webhook events from DimePay. Useful for debugging payment issues.
How Service Payments Work — Step by Step
This section explains the complete payment process that seekers go through when paying providers for jobs (bids) and bookings (quotes).
Job Bid Payment Flow
1. Seeker posts a job
- The job is listed as Open on both dashboards
- Providers can see it and submit bids
2. Providers submit bids
- Each bid includes: price, delivery time, and a proposal
- The seeker sees all bids under their job on the dashboard
3. Seeker clicks “Accept Bid”
- A confirmation message appears: “Are you sure you want to accept this bid? This will reject all other bids for this job.”
- The seeker confirms
4. Seeker is redirected to DimePay payment page
- If the bid amount is $0, payment is skipped and the bid is accepted immediately
5. Payment result
- Success page: Shows a green checkmark, the amount paid, a reference ID, and a “Go to Dashboard” button
- Failed page: Shows a red X with common reasons (insufficient funds, card declined, etc.) and a “Try Again” button
- Cancelled page: Shows a message that no charges were made, with a “Back to Home” button
6. After successful payment, the following happens automatically:
- The job status changes to In Progress (blue badge)
- The accepted bid shows Accepted (green badge)
- All other bids are set to Declined (red badge)
- The job’s payment status is set to “Paid”
- A chat channel is created between the seeker and provider, with an auto-generated first message to the provider: “BID ACCEPTED! Your bid for [job title] has been accepted…”
- Email to the winning provider: Your bid has been accepted — includes job title, bid amount, delivery time, seeker name, and a link to the job
- Email to the seeker: Confirmation of acceptance with provider details
- Emails to all declined providers: Their bid was not selected, encouraging them to bid on other jobs
7. If payment fails
- The bid stays as Pending — nothing changes
- The job remains Open
- A “Retry” button appears in the seeker’s Payment History tab
Complete Quote Request & Payment Process
1. Seeker Submits a Quote Request
The seeker visits a provider’s profile page and fills out the quote request form:
- Contact Name (optional — if requesting on behalf of someone else)
- Contact Email (optional)
- Contact Phone (optional)
- Service Needed (selected from the provider’s service list)
- Budget Range (dropdown)
- Project Timeline (Immediate, 1-2 weeks, 1 month, 2-3 months, etc.)
- Project Details (description of what they need)
What happens immediately:
- A quote request record is created with status Pending
- The seeker’s verified account identity is used as the official contact — the “on behalf of” fields (contact name, email, phone) are stored separately and displayed alongside the verified identity
- A chat conversation is created between the seeker and provider
- Email to provider: “New Quote Request Received”
- Email to seeker: “Quote Request Confirmation”
- The quote appears in both the seeker’s and provider’s dashboards
2. Provider Reviews the Request
In the provider’s dashboard, the Quote Requests tab shows all incoming requests with an “Active” filter showing Pending, Responded, and Awaiting Payment quotes.
The provider can:
- View Details — opens a popup showing:
- Client Information (verified account): name, email, phone, company, location
- Service requested for (if different): contact name, email, phone — shown in a separate highlighted section
- Request details: service type, description, budget range, timeline
- Respond — submit a quote
- Decline — reject the request with a reason
3. Provider Responds with a Quote
The provider fills in:
- Quote Amount — the price for the service (required)
- Require Deposit (toggle) — optionally require the seeker to pay a deposit upfront
- Deposit Amount — if deposit is required, the amount due before work begins
- Response Message — introduction, approach, relevant details (required)
What happens:
- Quote status changes from Pending → Responded
- Email to seeker: “Quote Response from [Provider Name]” with the quoted amount and message
4. Provider Edits Their Quote (Optional)
While the status is still “Responded”, the provider can edit:
- Quote amount, response message, deposit requirement
- An edit counter tracks how many times the quote was updated
- Email to seeker: “Quote Updated by [Provider Name]” — shows what changed (e.g., “was $500, now $750”)
- Seeker sees an Edited badge on the quote
5. Provider Declines the Request (Alternative)
The provider can decline with a predefined reason:
- Currently fully booked / Outside service area / Scope mismatch / Budget too low / Timeline issue / Other
- Optional additional message and optional provider referral — suggesting another provider on the platform
- Email to seeker: includes decline reason and, if applicable, “[Provider] recommends you try [Suggested Provider]” with a profile link
6. Seeker Edits Their Request (Optional)
While status is still “Pending” (before provider responds), the seeker can update project details, budget range, and timeline. The provider receives an email notification.
7. Seeker Declines the Quote
If the seeker doesn’t want to proceed, they decline with feedback:
- Predefined reasons: price too high, found better price, timeline, slow response, lack of detail, reviews concern, experience, communication, different direction, project cancelled, other
- Price feedback (Too High / Slightly High / Fair / Good Value)
- Would hire in future (Yes/No)
- Anonymous toggle — if unchecked, provider sees the seeker’s name
The provider sees this feedback in their Quote Insights dashboard as aggregated analytics.
8. Seeker Accepts the Quote
When the seeker clicks “Accept”, a confirmation popup shows:
| Line Item | Example |
|---|---|
| Quote Amount | $1,000 |
| Service Fee (10%) | $100 |
| Total to Pay | $1,100 |
If the provider required a deposit: Deposit Due Now: $330 (deposit $300 + service fee on deposit) — Balance After Completion: $770
Three notices are shown before the payment buttons:
- Escrow Protection (customizable): “Your payment is held securely by Connect To Pros. Funds are only released to the provider once you confirm the work is complete. If there’s a dispute, our team will review and resolve it.”
- Payment Processor Fee Notice (customizable): “Please note: The payment processor may charge an additional processing fee which will be calculated and displayed at checkout. This fee is charged by the payment gateway and is separate from the Connect To Pros service fee.”
- Auto-decline notice: “Once accepted, other pending quotes for this service will be automatically declined.”
The seeker has two options:
8a. Accept & Pay Now
- The seeker is redirected to the secure DimePay payment page
- The amount charged includes the Connect To Pros service fee
- The payment processor may add its own processing fee at checkout
If payment completes:
- A booking is automatically created with status Confirmed
- Payment is held in escrow by Connect To Pros
- Email to provider: includes escrow explanation, processing fee disclosure, and banking form reminder
- Email to seeker: booking confirmation with escrow protection notice
- All other pending/responded quotes from this seeker are automatically declined
If seeker cancels at payment page:
- No charges are made
- Quote stays in Awaiting Payment — seeker can click “Pay Now” again from their dashboard
8b. Accept & Pay Later
- Quote status changes to Awaiting Payment and the timestamp is recorded
- Email to provider: “Quote Accepted — Awaiting Payment”
- Email to seeker: “Quote Accepted — Payment Pending” with a link to complete payment
- A “Pay Now” button appears in the seeker’s dashboard
9. What Happens If the Seeker Doesn’t Pay
Automatic reminders and timeout apply:
- Day 3: Seeker receives reminder email: “Reminder: Complete Your Payment”
- Day 7: Final reminder: “Final Reminder: Payment Due — if not completed within 7 more days, the quote will be automatically reverted”
- Day 14: Quote is automatically reverted from “Awaiting Payment” back to “Responded”
- Both parties receive notification emails
- Any pending payment records are cancelled
- The provider’s quote and response are preserved — the seeker can accept and pay again later
The provider can also see a “Day X of 14” counter in their quote detail view.
10. Provider Withdraws from Awaiting Payment (Optional)
If the provider no longer wants to wait, they can click “Withdraw” on any quote in “Awaiting Payment” status at any time with a reason.
- Quote status changes to Withdrawn
- Any pending payments are cancelled
- Email to seeker: “Provider has withdrawn from this quote — [reason]”
- The provider cannot undo a withdrawal — the seeker would need to submit a new request
11. After Payment — Booking Lifecycle
Once payment completes, a booking is created and visible in both dashboards:
Provider sees:
- Booking with status Confirmed
- Badge: “Payment Held in Escrow” (or “Deposit in Escrow” if deposit)
- Escrow breakdown: amount held, balance due if deposit, processing fee
- Banking form warning if they haven’t submitted their banking details
- Actions: Start, Send Update, Mark Work Done, Cancel, Raise Dispute
Seeker sees:
- Booking with escrow protection notice
- Deposit information if applicable: “Deposit Paid: $330 — Remaining: $770 due on completion”
- Actions: Cancel, Raise Dispute
12. During the Work
- Start — status changes to In Progress
- Send Progress Updates — sent to seeker via email + chat message
- “I’m Here” Check-in — on booking day, notifies the seeker the provider has arrived
- Mark Work Done — seeker notified to confirm completion
Automated booking reminders are sent at 24 hours, 2 hours, and 1 hour before the booking.
13. Work Completion & Payout
When the provider marks work as done:
- Seeker receives notification to confirm completion
- If seeker confirms, a payout is queued
- If seeker doesn’t respond within 7 days, the system automatically confirms
Payout calculation (example on $1,000 quote):
| Quote Amount | $1,000 |
| Provider Processing Fee (3%) | -$30 |
| Provider Receives | $970 |
The admin processes payouts from the admin dashboard. The provider receives an email: “Payment Sent — $970” with the bank reference number.
14. Deposit Bookings — Balance Payment
If a deposit was required and only the deposit was paid:
- Booking shows: “Deposit Paid: $330 — Balance Due: $770”
- After work is completed and seeker confirms, the remaining balance is due
- Seeker can complete balance payment from their dashboard
15. Disputes
Either party can raise a dispute during an active booking. Admin manages disputes with:
- Full dispute details and booking history
- Internal admin notes (stored in audit trail)
- Resolve for seeker (process refund via DimePay) or provider (queue payout)
- Both parties receive email notification of resolution
Quote Status Flow
Pending → Responded → Awaiting Payment → Accepted → Booking → Completed → Payout
↓ ↓ ↓ ↓
Declined Declined Withdrawn (provider) Disputed
(provider) Reverted (14-day timeout)
Seeker can edit: while Pending (before provider responds)
Provider can edit: while Responded (before seeker accepts)
Provider can withdraw: while Awaiting Payment (anytime)
System auto-reverts: after 14 days in Awaiting Payment with no payment
Reminders sent: at 3 days and 7 days of non-payment
Notifications Summary
| Event | Provider | Seeker | Admin |
|---|---|---|---|
| Quote request submitted | Yes | Yes | — |
| Provider responds with quote | — | Yes | — |
| Provider declines (with reason + optional referral) | — | Yes | — |
| Provider edits their quote | — | Yes | — |
| Seeker edits their request | Yes | — | — |
| Seeker accepts (Pay Now or Pay Later) | Yes | Yes | — |
| Payment completed | Yes | Yes | — |
| Payment reminder (3 days) | — | Yes | — |
| Payment final reminder (7 days) | — | Yes | — |
| Quote auto-reverted (14 days) | Yes | Yes | — |
| Provider withdraws | — | Yes | — |
| Booking progress update | — | Yes | — |
| Provider marks work complete | — | Yes | — |
| Payout processed | Yes | — | — |
| New review submitted | Yes | — | Yes |
| Dispute raised | — | — | Yes |
| Dispute resolved | Yes | Yes | — |
Pay Offline Option
A 4th payment option allowing seekers to handle payment directly with the provider, outside the platform.
How It Works
- Seeker clicks “Complete Transaction Offline” in the accept quote modal
- A disclaimer modal appears — seeker must read and check “I understand and accept these terms” before proceeding
- Quote status changes to Accepted Offline
- Provider receives email: “Client wants to pay offline — please confirm”
- Provider clicks Agree or Decline in their dashboard
- If agreed → booking created with
payment_method = offline, no fees charged - If declined → quote reverts to Responded, seeker notified to choose another option
Key Differences from Online Payment
| Feature | Online (Pay Now/Later) | Offline |
|---|---|---|
| Service Fee | 10% added to seeker | None |
| Processing Fee | 3% from provider payout | None |
| Payment Protection | Yes — funds held in escrow | No — direct between parties |
| Dispute Resolution | Full — refund/payout via admin | Limited — mediation only |
| Auto-Completion | Yes — after configurable days | No — reminders only |
| Reviews | Yes | Yes |
Admin Settings
Go to Pricing → Payments → Settings tab:
- Enable Offline Payments — toggle to show/hide the offline button
- Offline Disclaimer — editable text shown to seekers before they confirm offline payment
Escrow Service (Milestone-Based Payments)
For large projects (minimum $100,000 JMD by default), seekers can use the Escrow Service for milestone-based payments.
How It Works
- Seeker clicks “Escrow Service” in the accept quote modal (only visible when quote meets minimum threshold)
- Seeker defines milestones (minimum 3) — each with a title, description, and amount that must sum to the quote total
- Provider receives the proposal and can Accept, Counter (propose different milestones), or Reject
- Negotiation continues until both parties agree on milestones
- Seeker pays the full amount upfront (quote + service fee) — funds held by Connect To Pros
- Provider completes work milestone by milestone, clicking “Mark Done” after each
- Seeker confirms each milestone is satisfactory
- Admin manually releases each milestone payment to the provider
Provider Dashboard — Milestone Tracking
In the Bookings tab, escrow bookings display a milestone tracker table showing:
- Milestone number, title, description, amount
- Status with icons: Pending, Marked Done (awaiting client), Client Confirmed (awaiting release), Payment Released, Completed
- “Done” button for each pending milestone
- Payout reference after admin releases
Admin Management
Go to Pricing → Escrow to manage escrow agreements:
- Stats: Active escrows, Pending releases, Total value, Completed
- For each milestone with status “Seeker Confirmed”: Release Payment button
- Full negotiation history and audit trail
Admin Settings
Go to Pricing → Payments → Settings tab:
- Enable Escrow Service — toggle on/off
- Minimum Amount — quote must be at least this amount (default: $100,000 JMD)
- Minimum Milestones — minimum number required (default: 3)
- Escrow Description — editable text explaining how escrow works
Estimated Completion Date
When a provider responds to any quote, they must specify an estimated completion date. This date drives the automated follow-up system.
Key Features
- Required on every quote response (all payment types: Pay Now, Pay Later, Escrow, Offline)
- Displayed in both seeker and provider dashboards
- Provider can extend the date with a reason — seeker is notified via email
- Warning shown after 2+ extensions: “You've extended the completion date multiple times”
- Drives the auto-completion and reminder system (see below)
Auto-Completion & Follow-up System
Automated emails and auto-completion based on the estimated completion date or when the provider marks work as done.
Timeline for Online Payments (Pay Now / Pay Later)
| Day | Action |
|---|---|
| Completion date | Email to seeker: “Has your work been completed?” |
| +1 day | Reminder: “Please confirm the work is complete” |
| +3 days | Second reminder to seeker |
| +7 days | Final warning: “If you don’t respond within 3 days, the work will be auto-confirmed and payment released” |
| +10 days | Auto-complete → booking marked complete, payout queued to provider, seeker receives “Leave a review” email |
Timeline for Escrow Milestones
The same timeline applies per milestone after the provider marks each milestone as done. Admin still manually releases the payment after auto-confirm.
Timeline for Offline Payments
| Day | Action |
|---|---|
| Completion date | Email to seeker: “Has your provider completed the work?” |
| +3 days | Reminder: “Please confirm work completion and rate your provider” |
| +7 days | Final reminder |
| No auto-completion for offline bookings — booking stays open until manually confirmed | |
Review Reminders
After any booking is completed (manual or auto), the seeker receives review reminder emails:
- +3 days after completion: first reminder
- +7 days after completion: final reminder
- No further nudges after that
Provider “Mark Work Done” Override
The provider can mark work done before the estimated completion date. This immediately starts the confirmation/auto-complete timer — the completion date no longer matters.
Admin Settings
Go to Pricing → Payments → Settings tab:
- Auto-Complete After (days) — days before auto-completing and releasing payout (default: 10)
- Completion Reminder Days — comma-separated days for reminders (default: 1,3,7)
- Review Reminder Days — comma-separated days for review nudges (default: 3,7)
Processing Fee by Plan
| Plan | Processing Fee |
|---|---|
| Free | 3% (configurable) |
| Silver | 0% |
| Gold | 0% |
| Platinum | 0% |
The payout breakdown in the provider dashboard shows “Processing Fee: $0.00 (Paid plan benefit)” for subscribers.
Fee Structure
| Fee | Who Pays | Default | Configurable |
|---|---|---|---|
| Service Fee | Seeker (added on top of quote) | 10% | Yes |
| Processing Fee | Provider (deducted from payout) | 3% | Yes |
| Payment Processor Fee | Seeker (added at checkout by DimePay) | Varies | Set by payment gateway |
Example on a $1,000 quote:
- Seeker pays: $1,000 + $100 (10% service fee) = $1,100 (+ DimePay processing fee at checkout)
- Provider receives: $1,000 - $30 (3% processing fee) = $970
- Platform earns: $100 (service fee) + $30 (processing fee) = $130
To change fee percentages: Go to Pricing → Payments → Settings tab → update the Service Fee (%) and Processing Fee (%) values → click Save Settings.
Admin-Configurable Messages
The following messages can be edited from the admin Pricing → Payments → Settings page:
| Message | Where It Appears |
|---|---|
| Provider Payment Protection Message | Provider’s respond modal, provider emails, provider bookings |
| Seeker Payment Protection Message | Seeker’s accept modal, seeker emails, seeker bookings |
| Payment Processor Fee Notice | Seeker’s accept modal (before Pay Now button) |
| Offline Disclaimer | Offline payment confirmation modal (seeker must accept before proceeding) |
| Escrow Description | Escrow Service proposal modal (explains how milestone payments work) |
Available placeholders: {processing_fee_percent}, {service_fee_percent} — automatically populate with current configured percentages.
Payment Statuses in Payment History
| Status | Meaning |
|---|---|
| Pending | Payment started but not yet completed |
| Completed | Payment went through successfully |
| Failed | Payment was declined by the bank/card |
| Cancelled | Seeker cancelled at the payment page |
| Refund Requested | A refund has been requested |
Jobs & Bidding System
Job Posting
Service seekers post jobs that providers can bid on.
| Field | Required | Notes |
|---|---|---|
| Job Title | Yes | |
| Job Description | Yes | Full project details |
| Budget Min | Yes | Decimal |
| Budget Max | Yes | Must be greater than min |
| Job Type | No | One-off, Ongoing, Part-time |
| Timeline | No | Urgent, Within 1 week, Within 1 month, Flexible |
| Requirements | No | Textarea |
| Skills Required | No | Comma-separated |
| Location | No | |
| Deadline Date | No | Bidding deadline |
After job is posted: Job matching runs to find relevant providers. Auto-bidding processes any provider auto-bid rules. Email notifications are sent.
Job Statuses
| Status | Meaning |
|---|---|
open | Accepting bids from providers |
in_progress | Bid accepted, work underway |
completed | Work finished and confirmed |
cancelled | Job cancelled by seeker |
Bidding System
Providers submit bids on open jobs. Seekers view and accept/decline bids.
Bid Lifecycle
- Each provider can only submit one bid per job (unique constraint)
- When a bid is accepted, all other pending bids are auto-declined
- Auto-declined providers receive email notifications
- Providers can withdraw their bid before a decision is made
Auto-Bidding Platinum
Platinum providers can set up automatic bidding rules:
- Budget range filter (min/max)
- Keyword matching
- Minimum rating requirement
- Auto-bids logged in
wp_auto_bid_logtable
Instant Booking System Silver+
The instant booking system allows seekers to book a provider's services directly without going through quotes or bids.
Booking Flow
Booking Details
| Field | Description |
|---|---|
| Service Type | Type of service requested |
| Booking Date | Requested date for the service |
| Booking Time | Requested time slot |
| Location | Service location |
| Notes | Additional notes from seeker |
Email Notifications
- Booking Confirmation (Provider): Provider receives details of new booking request
- Booking Confirmation (Seeker): Seeker receives booking confirmation with provider details
- Status Change: Seeker notified when provider accepts/declines
- Reminders: Both seeker and provider receive reminder emails before the booking date
Booking Reminders (Cron)
A daily cron job scans upcoming bookings and sends reminder emails to both parties before the booking date.
Dashboard Access
- Provider: "Bookings" tab in provider dashboard (Silver+ plans only)
- Database: Stored in
wp_instant_bookingstable
Quote System
Quote Requests
Seekers can request quotes directly from providers.
| Field | Required |
|---|---|
| Provider (who to request from) | Yes |
| Service Type | Yes |
| Project Description | Yes |
| Budget Range | No |
| Timeline | No |
Quote Statuses
| Status | Meaning |
|---|---|
pending | Awaiting provider response |
responded | Provider submitted their quote/price |
accepted | Seeker accepted the quote |
declined | Seeker declined the quote |
completed | Service completed |
Quote Comparison
Seekers can shortlist and compare quotes side-by-side. Features include:
- Shortlisting: Mark quotes for comparison
- Internal Rating: Rate quotes 1-5 stars (private to seeker)
- Notes: Add internal notes to each quote
- Save Comparisons: Save comparison sets for later
- Score Calculation: Automatic scoring based on provider rating, price, timeline, and quality
Quote Feedback
When a seeker declines a quote, they can submit feedback with:
- Reason category (predefined options)
- Price feedback
- Service feedback
- General feedback
Providers can view aggregated insights from their Quote Insights dashboard tab, including rejection reason breakdown, price comparison data, and acceptance rate trends.
Messaging System
The platform uses the SB Chat WordPress plugin for real-time messaging, with an additional Admin Messaging interface for broadcast and individual messages from admin.
SB Chat (User-to-User)
- Database tables:
wp_sb_chat_conversationandwp_sb_chat_messages - Provider access: Provider Dashboard → Messages tab
- Seeker access: Seeker Dashboard → Messages tab
- Email notification: When a new message is received, an email is sent to the recipient with a preview
Admin Messaging
Admins can send messages to users via WordPress Admin → Messaging. Messages appear in the user's existing Messages tab (uses the same SB Chat tables).
Individual Messages
- Search for users by name or email (AJAX autocomplete with debounce)
- Select one or more recipients via user chips
- Compose and send — each recipient gets their own conversation
- Email notification sent to recipient with message preview
Broadcast Messages
- Select a target group: All Users, Service Providers Only, Service Seekers Only, or Admins Only
- Preview count of recipients before sending
- Creates individual conversations per recipient (not a group chat)
- 30-second cooldown between broadcasts to prevent double-sends
Conversations Viewer
- Split-pane layout: conversation list on left, messages on right
- View admin's chat history with any user
- Reply to existing conversations inline
How to Send Messages
- Go to WordPress Admin → Messaging
- In the Compose section, select Individual mode
- Start typing a user's name or email in the search box
- Click the user to add them as a recipient (add multiple if needed)
- Type your message
- Click Send Message
- In the Compose section, select Broadcast mode
- Choose a group: All Users, Service Providers Only, Service Seekers Only, or Admins Only
- The recipient count updates automatically
- Type your message
- Click Send Broadcast
Each recipient gets their own conversation. There is a 30-second cooldown between broadcasts.
- Scroll to the Conversations section on the same page
- Click a conversation on the left panel to view messages
- Type a reply in the text box and click Send
Reviews & Ratings
- Seekers can submit reviews after a job is marked as completed
- Reviews include a star rating (1-5) and text review
- Reviews are stored in
wp_c2p_provider_reviews - Providers see reviews on their Reviews dashboard tab and public profile
- Email notifications sent to: reviewer (confirmation) and provider (new review)
Search & Discovery
The main search page is /explore-services/. It provides comprehensive filtering:
Available Filters
| Filter | Description |
|---|---|
| Keyword Search | Searches contact name, business name, description, services offered, keywords |
| Parish/Location | Dropdown from wp_c2p_parishes |
| Industry | Dropdown from wp_c2p_industries |
| Service | Dropdown from wp_c2p_services (depends on industry) |
| Minimum Rating | 0-5 stars filter |
| Price Range | Min/max price |
| Badges | Checkboxes for provider badges |
| Registered Only | Show only registered businesses |
approval_status = 'approved' appear in search results. Pending and rejected providers are excluded.
Search Results Display
Each result card shows: provider logo, name, specialty tags, star rating, review count, business description (2-line preview), and action buttons (View Profile, Message, Quote Request).
Homepage Discovery
The homepage provides multiple ways to discover providers:
- Hero Search: Quick keyword search redirecting to Explore Services
- Browse by Service: Grid of top services with provider counts
- Browse by Location: Parish buttons with provider counts
- Browse by Industry: Industry category cards
- Featured Providers: Premium provider showcase (based on plan)
Saved Providers
Seekers can save favorite providers for future reference.
- Toggle Save: Add/remove from favorites via button
- Add Notes: Internal notes visible only to seeker
- Mark Preferred: Flag providers after successful jobs
- View History: See completed jobs with saved providers
- Dashboard Tab: "Saved Providers" tab with "All" and "Preferred" filters
Just for You (Sponsored Ads)
A fully custom advertising module that allows admins to create and manage sponsored content displayed on the /just-for-you/ page. Accessible from the main navbar "Just for You" button.
Admin Management
Go to WordPress Admin → Just For You. The admin has 4 sub-pages:
| Page | Purpose |
|---|---|
| Dashboard | Overview stats: active rows, total ads, hero status |
| Hero | Configure the top hero banner (image or video) |
| Rows | Create/edit layout rows that contain ads (name, sort order, active toggle) |
| Ads | Create/edit individual ads within rows |
Hero Banner
- Image hero: Full-width banner image
- Video hero: Autoplay muted looping video with optional poster image
Ad Types
| Type | Description |
|---|---|
| Image | Simple image ad |
| Text Overlay | Colored box with title, text, and CTA button |
| Image + Text Overlay | Background image with positioned overlay (9-point grid positioning) |
| Video | HTML5 video with optional poster |
Ad Layout
- Width options: Full (12 cols), Half (6 cols), Third (4 cols)
- Ads are grouped into rows and rendered in a Bootstrap grid
- Smart centering: single half-width or 1-2 third-width ads are auto-centered
- Each ad can optionally wrap in a clickable link with target control
Database Tables
wp_c2p_just_for_you_hero— Hero banner configurationwp_c2p_just_for_you_rows— Layout rowswp_c2p_just_for_you_ads— Individual ad records
How-To: Managing Just for You Content
- Go to Just For You → Hero
- Select the hero type using the radio buttons:
- Image: Click Upload to open the WordPress media library and select a banner image. Recommended size: 1920×1080px or 1920×800px
- Video: Enter the Video URL (MP4 recommended). Optionally upload a Poster Image (shown before the video plays)
- Check Active to display the hero on the page
- Click Save
- Go to Just For You → Rows
- Fill in the form:
Field Required Description Row Name No Descriptive label (e.g. "Featured Services", "Popular Picks"). Used for admin reference only Sort Order No Number controlling display order (lower = appears first). Default: 0 Active No Checkbox — uncheck to hide the row and all its ads. Default: checked - Click Add Row
Edit:
- On the Rows page, click Edit next to the row
- Update the name, sort order, or active status
- Click Update Row
Delete:
- Click Delete next to the row and confirm
- Go to Just For You → Ads
- Select the Row this ad belongs to (dropdown of all existing rows)
- Choose an Ad Type (radio buttons):
Ad Type What You Need Image Only Upload an image. Optionally make it clickable Text Overlay Coloured box with title, body text, and optional CTA button. No image needed Image + Text Overlay Background image with text positioned over it (9-point positioning) Video MP4 video URL and optional poster image - Choose a Width (radio buttons):
- Full Width — 1 ad per row (recommended image: 1920×800px)
- Half Width — 2 ads side-by-side (recommended image: 960×540px)
- Third Width — 3 ads side-by-side (recommended image: 640×400px)
- Fill in the fields that appear based on your ad type:
- Image fields: Image URL (use Upload button), Alt Text
- Video fields: Video URL (MP4), Poster Image URL
- Overlay fields: Title, Body Text, Button Text, Button URL, Position (9-point grid: top/center/bottom × left/center/right), Background Colour, Text Colour
- Optionally set a Link URL to make the entire ad clickable (choose Same Window or New Tab)
- Set Sort Order (lower = appears first within the row)
- Check Active
- Click Add Ad
Edit:
- On the Ads page, find the ad in its row group and click Edit
- The form populates with the ad's current values
- You can change the ad type — irrelevant fields are automatically hidden
- Click Update Ad
Delete:
- Click Delete next to the ad and confirm
Analytics System
A comprehensive analytics system that tracks user behavior across the platform and provides admin dashboards with KPIs, charts, and export capabilities.
Admin Dashboard
Access at WordPress Admin → Analytics. Features:
- Period selector: 7 Days, 30 Days, 90 Days, 1 Year
- KPI cards: Total Users, Active Providers, Quote Requests, Monthly Recurring Revenue (MRR)
- Engagement metrics: Page Views, Unique Visitors, Pages/Visit, Mobile Traffic %
- Charts: Time series (Users/Pageviews/Quotes), Plan Distribution doughnut, Traffic by Page bar chart
- Top lists: Top Providers (by weighted score), Top Search Terms
- CSV export: Users, Pageviews, Quotes, Top Providers, Search Terms
Event Tracking
The analytics tracker automatically records these events:
| Category | Events Tracked |
|---|---|
| Page Views | All page types categorized (homepage, search, dashboards, profiles, pricing, etc.) |
| User Events | Logins, registrations (with role and source) |
| Provider Events | Profile views (with viewer info) |
| Quote Events | Quote requests (with budget), quote responses (with response time) |
| Bid Events | Bids submitted (with amount, auto-bid flag) |
| Booking Events | Bookings created (with service type, value) |
| Subscription Events | Created, cancelled (with reason), upgraded (from/to plan), renewed |
| Search Events | Search queries (with filters: industry, service, location, rating, price) |
| Message Events | Messages sent (with conversation ID, sender type) |
| Review Events | Reviews submitted (with rating) |
Frontend Tracking
- A JavaScript tracker (
frontend-tracking.js) is loaded on all public pages - Tracks client-side events: page views, searches, provider views, contact clicks, save actions
- Rate limited: 60 events per minute per IP
- Bot detection: filters out Googlebot, Bingbot, crawlers, and social bots
- Session tracking: UUID-based cookies with 30-day expiry
- Admin users are excluded from tracking by default
Conversion Funnel
The dashboard includes a 4-stage conversion funnel:
Data Retention
A daily cron job cleans up analytics events older than 365 days. Data is cached for 5 minutes to reduce database load.
How to Use Analytics
- Go to WordPress Admin → Analytics
- Use the period selector buttons (7 Days, 30 Days, 90 Days, 1 Year) to change the time range
- Review KPI cards: Users, Providers, Quote Requests, MRR
- Toggle between chart types using the buttons above the main chart (Users / Pageviews / Quotes)
- On the Analytics dashboard, click the Export dropdown button
- Choose a report type: Users, Pageviews, Quotes, Top Providers, or Search Terms
- A CSV file will download automatically
🆕 Provider-Side Analytics (April 2026)
Location: /provider-dashboard/?section=analytics
Each Service Provider has their own analytics page — a substantially different view from the admin-wide dashboard above. Two tabs:
- Real-Time Analytics — live stats scoped to their own profile (gated by
basic_analyticsfor Silver+,analytics_dashboardfor Gold+) - Monthly Reports — archive of auto-generated monthly reports (gated by
performance_reportsfor Silver+)
What's on the Real-Time tab
- Top stat cards: Profile Views (All-Time / 30 Days / 7 Days), Search Appearances, Direct Contacts, Avg Search Position, Earnings, Reviews — all with month-over-month change badges
- Contact Interactions card — All-Time totals per channel (Phone / Email / WhatsApp / Website) + combined period totals (Today / This Week / This Month)
- Search Visibility card — period counts + top search terms that found the provider
- Business Metrics card — Quote Requests, Bids, Bookings, Reviews, Avg Rating
- Activity Breakdown + Performance Summary (Gold/Platinum only) — pie chart + progress bars for Bid Success Rate, Booking Completion, Quote Response Rate
- Month-over-Month Comparison table (Gold/Platinum only) — last complete month vs the month before, all 10 metrics with % change
- Where Your Views Come From — referrer source breakdown (Google / Facebook / Direct / Other)
- Profile Tab Engagement — clicks per tab (About shows views since it's the default; other tabs show explicit clicks)
- Geographic + Device Breakdown — country/city bars + mobile/tablet/desktop split + browser mix
What's on the Monthly Reports tab
- Info banner explaining reports generate on the 1st + "Download All as CSV" button
- Accordion of past months — each expands to show:
- Metric grid (7+ cards)
- Conversion Funnel (5 stages)
- Contact Channels card
- Response Time benchmark
- Top rejection reasons
- Top search terms
- Geographic + Device breakdown (for that month)
- Month-over-Month Comparison table
- Footer with "Download CSV" button per month
🆕 Contact Click Tracking
When a seeker clicks any of the contact CTAs on a provider's public profile, the click is recorded in wp_c2p_contact_clicks.
- Tracked channels: phone (
tel:links), email (mailto:), WhatsApp (wa.me/whatsapp://), website (outbound link to provider's URL) - Dedup: same IP + same provider + same click_type within 5 minutes counts once
- Bot filter: known crawlers excluded via
c2p_is_bot_user_agent() - Self-click guard: provider's own clicks on their own profile ignored
- JS: selector-based click listeners in
service-provider/templates/provider-profile.php
🆕 Search Appearance Tracking
Tracks every time a provider appears in search results across the entire site. Stored in wp_c2p_search_appearances.
Coverage — all surfaces that render providers now track:
| Surface | Tag / Query |
|---|---|
| Explore Services (initial load) | real ?search= term |
| Explore Services (AJAX pagination/filter) | real query |
| Legacy Provider Search | real query |
WordPress search (?s=) | real query |
| Homepage Featured Providers | homepage_featured |
[c2p_featured_providers] shortcode | shortcode_featured_providers |
[c2p_providers_by_industry] shortcode | shortcode_providers_by_industry |
[c2p_all_providers] shortcode target | frontend_list |
| Providers list template | providers_list |
Dedup: 1-minute IP-based window prevents refresh-spam. Programmatic tags (homepage_*, shortcode_*, frontend_*) are filtered out of the "Top searches" report — only real search queries surface to providers.
🆕 Profile Tab Engagement Tracking
Stored in wp_c2p_profile_tab_views — records intentional clicks on the provider profile tabs (About / Services / Reviews / Photos / Shop).
- Hooks Bootstrap's
shown.bs.tabevent — fires only when a tab actually changes, so the default "About" landing isn't counted as a click - About semantics: count is
profile_views(everyone lands there) + explicit return-clicks tracked separately as an engagement signal - Other tabs: count is explicit clicks only
- Dedup: same IP + same tab within 60 seconds counts once
- Bot filter + nonce-free (fire-and-forget for anonymous visitors)
🆕 Geographic + Device/Browser Tracking
On every new profile view, the tracker resolves geographic and device metadata at track time and stores it with the view row.
Columns added to wp_c2p_profile_views: country_code, country_name, region_name, city, device_type, browser.
Geo resolution pipeline (see c2p_geo_resolve_ip() in functions.php):
- Read raw IP from proxy-aware headers (HTTP_CLIENT_IP → HTTP_X_FORWARDED_FOR → REMOTE_ADDR). Used in-memory only, never persisted.
- Skip private / reserved ranges (localhost, LAN, etc.) to save API quota
- Check transient cache keyed by hashed IP (never the raw IP) — 7-day TTL
- On cache miss: call
http://ip-api.com/json/with a 2-second timeout - Store country/region/city in the profile_views row; cache for 7 days
- On failure: 30-minute negative cache, view row inserted without geo (NULL columns)
Device/Browser parsing (see c2p_parse_user_agent()):
- Device types:
mobile/tablet/desktop - Browsers: Chrome / Firefox / Safari / Edge / Opera / Samsung Internet / Internet Explorer / Other
- Regex-based, no external library, handles ~99% of real traffic
user_agent string — this runs automatically on init after deploy (batched 500 rows per request, gated by c2p_profile_views_ua_backfilled option).
🆕 Month-over-Month Comparison (MoM)
A full comparison table with actual month labels (e.g. "March 2026 vs February 2026") and per-metric change %. Shared renderer: c2p_render_mom_table_html($mom, $style) where $style is 'card' (dashboard) or 'email'.
Metrics compared: Search Appearances, Profile Views, Direct Contacts, Quote Requests, Quotes Accepted, Bookings Received, Bookings Completed, Reviews, Avg Rating, Earnings.
Appears on:
- Live Real-Time Analytics tab (last complete month vs month before) — gated by
analytics_dashboard - Every monthly report accordion (that report's month vs the previous month)
- Monthly email (auto-appended to the body)
Featured Providers Admin
Manage which providers appear in the "Featured" sections on the homepage and explore services page. Only Gold and Platinum plan providers are eligible.
Admin Page
Access at WordPress Admin → Service Providers → Featured Providers.
- Stats bar: Featured on Front Page count, Featured on Explore count, Eligible (not featured) count, Total Gold/Platinum count
- Front Page Featured: Manage providers shown in the homepage "Featured Providers" section
- Explore Services Featured: Manage providers highlighted on the explore/search page
- Add to Featured: Browse all eligible Gold/Platinum providers and add them to either section
How to Feature a Provider
- Go to Service Providers → Featured Providers
- Scroll to the Add to Featured section (shows all eligible Gold/Platinum providers)
- Click Front to feature on homepage, or Explore to feature on the explore page
- The provider immediately appears in the featured section
Video Guide — How to Feature a Provider
Watch this video to see how to add a provider to the Front Page or Explore Services featured sections:
- In the "Currently Featured" sections, click the Remove button next to the provider
You can also feature a provider directly from the Edit Provider screen in the admin. This is also how you override the plan restriction — for example, if you want to feature a provider who is on a Free or Silver plan (normally only Gold and Platinum are eligible).
Watch this video to see how:
Email Notifications
The notification manager system sends 40+ automated email notifications. Every email from the platform goes through the centralized notification manager. All use branded HTML templates with the Connect To Pros logo, consistent styling, and customizable content.
Managing Notifications
Go to WordPress Admin → Notifications. The admin page has tabbed sections:
- Service Provider tab — 21 provider notification types
- Service Seeker tab — 11 seeker notification types
- Payment & Subscription tab — 11 payment-related emails
- Booking System tab — 3 booking notification types
- Contact & General tab — 2 contact form emails
- WordPress Default tab — Core WP email overrides
- Email Settings tab — From Name, From Email, Admin Email, Test Email
- Test Email tab — Send test emails
Each notification type has:
- Enable/Disable toggle to control sending
- Subject line with placeholder support
- HTML message template with placeholder support
- Preview button to see rendered email
- Reset button to restore default template
Provider Notifications (21)
| Notification | Recipient | Trigger |
|---|---|---|
| Registration Confirmation | Provider | Account created |
| Admin Notification | Admin | New provider registers |
| Approval | Provider | Admin approves account |
| Rejection | Provider | Admin rejects account |
| Pending | Provider | Status set to pending |
| Bid Submitted | Provider | Provider submits bid |
| Bid Accepted | Provider | Seeker accepts bid |
| Bid Rejected | Provider | Seeker rejects bid |
| Chat Message | Provider | New message received |
| Job Cancelled | Provider | Seeker cancels job (all bidding providers notified) |
| Quote Accepted | Provider | Seeker accepts quote |
| Quote Declined | Provider | Seeker declines quote |
| Auto-Bid Submitted | Provider | Auto-bid rule matched a new job |
| Job Matching | Provider | New job matches provider's criteria |
| Quote Request Received | Provider | Seeker requests a quote from provider |
| Job Update | Provider | Seeker updates job details after bids |
| Admin Provider Welcome | Provider | Admin creates provider account manually |
| Booking Reminder | Provider | Upcoming booking reminder (cron) |
| Job Deadline Reminder | Provider | Job bidding deadline approaching (cron) |
| Quote Request Reminder | Provider | Pending quote needs response (cron) |
| Monthly Performance Report | Provider | Monthly summary of profile views, quotes, bids, reviews (cron) |
Seeker Notifications (11)
| Notification | Recipient | Trigger |
|---|---|---|
| Registration Welcome | Seeker | Account created |
| Job Posted Confirmation | Seeker | Job submitted |
| New Bid Received | Seeker | Provider bids on seeker's job |
| Bid Accepted Confirmation | Seeker | Seeker accepts a bid |
| Bid Rejected Confirmation | Seeker | Seeker rejects a bid |
| Quote Request Confirmation | Seeker | Quote request submitted |
| Job Completed | Seeker | Provider marks job completed |
| Review Confirmation | Seeker | Review submitted successfully |
| Auto-Account Welcome | Seeker | Account auto-created when seeker contacts provider from profile page |
| Admin Password Change | Seeker | Admin changes seeker's password |
| Booking Reminder | Seeker | Upcoming booking reminder (cron) |
Booking Notifications (3)
| Notification | Recipient | Trigger |
|---|---|---|
| Booking Confirmation (Provider) | Provider | New booking request received |
| Booking Confirmation (Seeker) | Seeker | Booking confirmed with provider details |
| Booking Status Change | Seeker | Provider accepts, declines, or updates booking |
Payment & Subscription Notifications (11)
| Email Type | Trigger |
|---|---|
| Payment Confirmation | Payment completed, account upgraded |
| Payment Failed | Payment attempt failed |
| Subscription Cancelled | User cancels subscription |
| Subscription Expired | Plan expired, downgraded to Free |
| Subscription Renewed | Auto-renewal successful |
| Expiring Soon | Warning at 7/3/1 days before expiry |
| Grace Period | Entered grace period after expiry |
| Grace Period Final | Final warning before downgrade |
| Password Expiry Warning | Password expiring in 30 or 7 days |
| Payment Receipt | Detailed receipt with transaction ID and amount |
| Plan Upgrade Confirmation | User upgraded plan tier |
Contact & General Notifications (2)
| Email Type | Recipient | Trigger |
|---|---|---|
| Contact Form → Admin | Admin | User submits contact form (includes all form fields) |
| Contact Form → User Confirmation | User | Confirmation that contact form was received |
Notification Admin Settings
Global Email Settings
| Setting | Default |
|---|---|
| From Name | Connect To Pros |
| From Email | noreply@[your-domain] |
| Admin Notification Email | WordPress admin email |
| Test Email Address | WordPress admin email |
Email Placeholders
80+ placeholders are available for use in email templates. Organized by category:
| Placeholder | Value |
|---|---|
{contact_name} | Provider's name |
{business_name} | Provider's business name |
{first_name} | Seeker's first name |
{provider_name} | Provider's display name |
{seeker_name} | Seeker's display name |
{email} | User's email address |
{site_name} | Website name |
{site_url} | Website URL |
{login_url} | Login page link |
{dashboard_url} | User's dashboard link |
{reset_url} | Password reset link |
{pricing_url} | Pricing page link |
{job_title} | Job posting title |
{job_url} | Link to job posting |
{bid_amount} | Bid price |
{service_type} | Type of service |
{match_score} | Job matching score |
{deadline_date} | Bid deadline |
{booking_id} | Booking reference number |
{booking_date} | Booking date |
{booking_time} | Booking time |
{location} | Service location |
{notes} | Booking notes |
{status_text} | Booking status text |
{confirmation_message} | Provider's confirmation message |
{cancellation_policy} | Cancellation policy text |
{amount} | Payment amount |
{transaction_id} | Transaction reference |
{plan_name} | Subscription plan name |
{expires_date} | Expiration date |
{date} | Transaction date |
{month_year} | Report month/year |
{profile_views} | Total profile views |
{quote_requests} | Quotes received |
{bids_placed} | Bids placed |
{bids_accepted} | Bids accepted |
{jobs_completed} | Jobs completed |
{reviews_received} | Reviews received |
{avg_rating} | Average rating |
{inquiry_type} | Contact form inquiry type |
{message} | User's message content |
{contact_phone} | Contact phone number |
{submitted_at} | Submission timestamp |
{customer_name} | Customer/seeker name |
{customer_email} | Customer email |
{customer_phone} | Customer phone |
{service_description} | Service description |
{details} | Project details |
{budget} | Budget range |
How to Manage Notifications
- Go to WordPress Admin → Notifications
- Click the appropriate tab (Service Provider, Service Seeker, etc.)
- Find the notification type you want to edit
- Edit the Subject field (supports placeholders like
{contact_name}) - Edit the Message textarea (HTML is supported — the template uses branded HTML with logo and styling)
- Click Preview to see how the email will look
- Click Save Settings at the bottom of the tab
- Go to Notifications and find the notification type
- Uncheck the Enable checkbox for that notification
- Click Save Settings
The template is preserved but emails will not be sent. Re-enable at any time.
- Go to Notifications → Email Settings tab
- Enter a Test Email Address
- Click the Test Email tab
- Choose a notification type from the dropdown
- Click Send Test Email
- Check the inbox for the test email with sample placeholder data
- Find the notification type on its tab
- Click the Reset button next to the message textarea
- The original branded HTML template will be restored
- Click Save Settings
- Go to Notifications → Email Settings tab
- Edit From Name (default: "Connect To Pros") and From Email
- Set the Admin Notification Email (receives admin-targeted emails like new registrations)
- Click Save Settings
Email Delivery (ElasticMail SMTP)
All emails are sent through ElasticMail SMTP, configured in the theme.
SMTP Settings
| Setting | Default Value |
|---|---|
| Host | smtp.elasticemail.com |
| Port | 587 (TLS) |
| Security | TLS |
| Username | admin@connecttopros.com |
| From Email | admin@connecttopros.com |
| From Name | Connect to Pros |
How to Test Email Delivery
- The quickest way to test is via Notifications → Test Email tab
- Enter a test email address and send a test notification
- Check the inbox for the branded HTML email
- If it fails, check the PHP
error_log— all SMTP operations are logged in detail
- ElasticMail intercepts ALL wp_mail() calls via the
pre_wp_mailfilter — no emails go through WordPress's default PHPMailer - Uses raw sockets (not PHPMailer) — WP mail plugins like WP Mail SMTP are bypassed
- SMTP settings are hardcoded in
elasticmail-integration.phpand seeded toc2p_smtp_settingsoption on first load — there is no admin UI to change them - To change SMTP credentials, edit
elasticmail-integration.phpor update thec2p_smtp_settingsoption directly in the database
Contact Form
The contact page at /contact/ includes a form with:
| Field | Required |
|---|---|
| First Name | Yes |
| Last Name | Yes |
| Yes | |
| Phone | No |
| Inquiry Type | Yes (General, Support, Becoming a Pro, Billing, Partnership, Feedback, Other) |
| Message | Yes |
| Consent Checkbox | Yes |
What Happens on Submission
- Form data validated and saved to
wp_contact_submissionstable - Admin receives branded HTML email with full contact details and Reply-To header
- User receives confirmation email acknowledging receipt
- Submission tracked with status (new/resolved) and admin notes
How to Manage the Contact Page
- Go to Contact Form → Settings
- Edit: phone number, email address, location, business hours, response time, appointment note
- Edit social media URLs: Facebook, Twitter, Instagram, LinkedIn, YouTube
- Edit quick help links: FAQ URL, Pricing URL, Blog URL, Support URL
- Toggle visibility for any section (show/hide phone, email, social media, business hours, etc.)
- Customize section titles and icons
- Click Save Settings
All settings are stored as post_meta on the Contact page.
- Go to Contact Form → All Submissions
- Stats bar shows: Total Submissions, New, This Month
- Filter by status: New, In Progress, Completed, Spam
- Click View to see full submission details in a modal
- Click Edit to change status (New/In Progress/Completed/Spam) and add admin notes
Homepage
The homepage (front-page.php) has 8 sections:
- Hero Section — Headline, subtitle, search box. Customizable via WordPress Customizer (
c2p_hero_title,c2p_hero_subtitle,c2p_hero_image). Search redirects to/explore-services/. - Services Carousel — Dynamic slides. Customizable title and description via Customizer.
- Browse by Services — Grid of 6 service cards with provider counts.
- Browse by Location — 14 parish buttons with provider counts.
- Featured Providers — 6 premium providers with plan badges (Platinum, Gold, Silver).
- Browse by Industry — 9 industry category cards.
- Top Navigation Bar — Language selector, seeker/provider dropdown menus, user menu.
- Main Navbar — Logo, primary menu, "Just for You" button.
is_featured_front flag in the wp_c2p_providers table and the provider's plan tier.
How to Edit the Homepage
- Go to Appearance → Customize → Home Page Content
- Edit
c2p_hero_title,c2p_hero_subtitle, andc2p_hero_image - Click Publish to save
- Go to WordPress Admin → C2P Carousel Manager
- Each slide has: title, subtitle, button text, button URL, image
- To add a slide: fill in the "Add New Slide" form and click Add Slide
- To reorder: change the Sort Order number (lower = first)
- To hide a slide: uncheck Active
- To delete: click Delete next to the slide
The Services Button (text and URL) is configured at the bottom of this same page.
All section headings (Browse by Services, Browse by Location, etc.) are editable via:
- Go to Appearance → Customize → Home Page Content
- Each section has: subtitle, title, and description fields
- Click Publish to save
front-page.php:
- Number of items: Services (6), Locations (14), Industries (9), Featured Providers (6) are hardcoded
- Browse by Services/Location/Industry cards: Auto-generated from database (showing top items by provider count)
- Static fallback cards: 6 hardcoded service cards (Plumbing, Electrical, etc.) shown if database has no results
Blog System
Blog Homepage (/blog-articles/)
- Featured posts section (uses
featured_articlemeta or sticky posts) - Category browsing with custom icons
- Recent posts grid (6 most recent, excluding featured)
- Newsletter signup form (AJAX submission)
All Articles (/blog-articles/all-articles/)
- Advanced filtering: category, year, month, search, sort
- Sort options: Latest, A-Z, Most Popular
- 12 articles per page with pagination
- Shows category badge and estimated reading time
Single Post
- Article header with date, reading time, author
- Author bio section
- Related articles sidebar (3 from same category)
- Newsletter signup widget
- "More Insights" section with 3 recent posts
How to Manage Blog Content
Blog posts use the standard WordPress Posts → All Posts editor. No special plugin required.
- Go to Posts → Edit Post
- Scroll down to Custom Fields (if not visible, enable via Screen Options at the top of the page)
- Add a custom field: Name =
featured_article, Value =yes - Click Update
Up to 3 featured posts appear in the blog homepage hero section. Priority: featured_article meta → sticky posts → latest.
Category icons appear on the blog homepage alongside each category name. The current categories and their icons are:
| Category | Icon |
|---|---|
| Service Providers | People icon |
| Service Seekers | Lightbulb icon |
| Industry Trends | Chart icon |
| Tips & Tricks | Magic wand icon |
| News | Newspaper icon |
| Guides | Book icon |
| Any new category | Folder icon (default) |
To change or add category icons, a developer will need to update the icon mappings in the blog template code.
When uploading images for blog posts, use the following recommended sizes for the best results:
| Image Type | Recommended Size | Notes |
|---|---|---|
| Featured Image | 1920 × 900 pixels (minimum) | This is the large header image that appears at the top of each article. It displays full-width on desktop and is cropped from the top, so keep important content in the upper portion of the image. On desktop, the visible height is 750px. |
| Blog Card Thumbnail | 800 × 533 pixels (3:2 ratio) | Automatically generated from your featured image. This is what appears on the blog listing page and "More Insights" sections. |
| In-Article Images | 1200 pixels wide (max) | Images within the article body. They will scale down to fit the content column. Keep file sizes under 500KB for fast loading. |
How to set a Featured Image:
- Go to Posts → Edit Post
- In the right sidebar, look for the Featured Image panel
- Click Set featured image and upload or select an image from the Media Library
- Click Update to save
The newsletter signup form appears in two places:
- Blog listing page — in the sidebar area
- Individual article pages — in the right sidebar
The newsletter is powered by Elastic Email, an external email marketing service. When visitors enter their email address and subscribe, they are added to your Elastic Email contact list automatically.
Managing Your Newsletter Subscribers
- Log in to your Elastic Email account at elasticemail.com
- Go to Contacts to view, export, or manage your subscriber list
- Use Campaigns to send newsletters or promotional emails to your subscribers
- Subscribers can unsubscribe at any time using the link in your emails
What You Can Customise
- Form appearance: The form design is managed from your Elastic Email account under Forms. You can change colours, text, and fields there.
- Welcome emails: Set up automated welcome emails in Elastic Email under Automations
- Contact lists: Organise subscribers into different lists for targeted campaigns
About Page
The About page is fully customizable via Advanced Custom Fields (ACF). Edit it from the WordPress page editor for the About page.
Customizable Sections
- Page Header: Title and subtitle
- Mission & Vision: Story content, feature items with icons, image carousel with captions
- Stats Section: 4 animated counters (Verified Professionals, Projects Completed, Average Rating, Caribbean Islands)
- Blog Widget: Optional section showing recent posts (enable/disable, category filter, columns 2-4)
- Custom Widget: HTML/shortcode section
- Call-to-Action: Two buttons with customizable text and URLs
- Go to Pages → About → Edit
- Scroll below the main editor to the ACF fields section
- Edit any field: titles, subtitles, story content (WYSIWYG editor), feature items (icon + title + description), image carousel (3 images with titles and descriptions), stats counters (4 animated counters with icon, number, label)
- Blog Widget and Custom Widget sections can be enabled/disabled
- CTA buttons have customizable text and URLs
- Click Update to save
acf-about-page.php, not the ACF GUI.
How It Works Page
The page at /how-it-works/ explains the platform using a tabbed interface for three different audiences.
Three Tabs
| Tab | Audience | Content |
|---|---|---|
| Looking for a Pro | Service Seekers | 6-step guide: Create Account → Search & Compare → Request Quote → Chat → Hire → Leave Review. CTA: Sign Up Free |
| I'm a Service Provider | Providers | 6-step guide: Register → Get Approved → Choose Plan → Receive Requests → Showcase Work → Build Reputation. CTAs: Register + View Plans |
| Just Browsing | Visitors | 4 feature cards: Browse Providers, Read Reviews, Compare Pricing, Find Local. CTAs: Sign Up + Register |
FAQ Section
Accordion with 5 questions covering: signup cost, requesting quotes, provider vetting, coverage areas (Jamaica), and messaging before hiring.
Help Center
The page at /help-center/ provides a knowledge base for logged-in users. Requires login (seekers, providers, or admins).
Features
- Personalized greeting: "Hi [FirstName], how can we help you today?"
- Quick links: Find Providers, Post a Job, View Plans, Contact Support
Help Article Categories (5 categories, 5 articles each)
| Category | Topics |
|---|---|
| Getting Started | Account creation, profile setup, finding providers, posting jobs, understanding ratings |
| Quotes & Jobs | Requesting quotes, bidding process, accepting/declining, managing postings, marking complete |
| Payments & Billing | Subscription plans, how payments work, updating payment, cancellation, refunds |
| Account & Settings | Password changes, profile updates, notifications, photos, account deletion |
| Safety & Trust | How reviews work, leaving reviews, reporting, verification, community guidelines |
Contact Support
Embedded Cognito Forms support ticket form at the bottom of the page.
Dispute System
The dispute system allows service seekers and providers to raise and resolve disputes related to jobs or instant bookings. Disputes are managed through a combination of automated tracking and a Cognito Forms submission form.
How Disputes Work
- A dispute is raised: Either the service seeker or provider clicks the "Respond to Dispute" or "File a Dispute" button from their dashboard. This opens a pre-filled form on Cognito Forms.
- Form submission: The form captures the dispute type (job or booking), the reference ID, who submitted it, and their role (seeker or provider). This information is automatically pre-filled from the link — the user just needs to add their description of the issue.
- Admin review: Submitted disputes appear in the admin area under Dispute Management. The admin can view all open, in-progress, and resolved/closed disputes.
- Resolution: Once resolved, disputes move to the "Resolved / Closed" tab. The associated job or booking status is updated accordingly.
Dispute Management (Admin)
Access the dispute management panel from Admin Dashboard → Dispute Management.
The dispute management page shows disputes in three tabs:
- All Disputes: Every dispute across all statuses
- Jobs: Disputes related to job postings
- Bookings: Disputes related to instant bookings
- Resolved / Closed: Disputes that have been resolved or where the associated job/booking was cancelled due to a dispute
Each dispute card shows the reference ID, dispute type, parties involved, current status, and the date it was raised.
The dispute submission form is hosted on Cognito Forms and is linked to your ConnectToPros Cognito account.
What You Can Customise
- Form fields: Log in to cognitoforms.com and edit the "Dispute Submission and Resolution Form" to add, remove, or modify fields
- Email notifications: Configure who receives notifications when a dispute is submitted (under the form's Submission settings in Cognito Forms)
- Confirmation messages: Change the message users see after submitting a dispute
When a job or booking is cancelled due to a dispute, the system records this automatically. The admin can identify dispute-related cancellations in the Resolved / Closed tab.
Users can also submit disputes independently through the Help Center page, which provides a separate channel for reporting issues.
Customer Reviews Page
Public page at /customer-reviews/ displaying all approved reviews across all providers.
Features
- Header: Overall average rating (stars + numeric) and total review count
- Rating filter: Pill buttons for All, 5-star, 4-star, 3-star, 2-star, 1-star (each with count badges)
- Sort options: Most Recent, Highest Rated, Lowest Rated
- Review cards: 3-column grid with star rating, review text (with "Read more" toggle), reviewer name, date, and provider link with avatar
- Pagination: 12 reviews per page, preserves filter/sort in URL params
Data comes from wp_c2p_provider_reviews joined with wp_c2p_providers.
Review System
Service seekers can leave star ratings and written reviews for providers after completing a job or booking. Reviews appear on the provider’s public profile, the Customer Reviews page, and in the provider’s dashboard.
How Seekers Leave Reviews
A “Leave Review” button appears automatically on the seeker dashboard once a job or booking is marked as completed. Seekers can review from two places:
- My Jobs tab: If the job status is “Completed” and a provider was assigned, the review button appears in the Actions column
- Bookings tab: If the booking status is “Completed”, the review button appears in the Actions column
Once a review has been submitted, the button is replaced with a green “Reviewed” badge. Each job or booking can only be reviewed once.
- The seeker clicks “Leave Review” — a modal pops up asking for a 1–5 star rating and a written review
- On submit, the system verifies:
- The seeker is logged in and owns the job/booking
- The job or booking is genuinely “completed”
- No duplicate review exists for this job/booking
- The review is saved to the database with status “Approved” (immediately visible)
- The provider’s average rating and review count are automatically recalculated
- An email notification is sent to the provider with the rating, reviewer name, and review text
- A confirmation email is sent to the seeker
- The page reloads and the review button is replaced with the “Reviewed” badge
Providers can view all their reviews in the Reviews tab of their dashboard at /provider-dashboard/.
- Each review card shows the star rating, reviewer name, date, and review text
- Providers can write a public response to any review — this appears below the review on their public profile
- Providers cannot edit or delete reviews left by seekers
- Provider public profile (
/provider/{id}/) — shows all approved reviews with star ratings - Customer Reviews page (
/customer-reviews/) — aggregated view of all reviews across all providers, with rating filters and sorting - Explore Services — provider cards display the average star rating and review count
- Provider dashboard — providers see their reviews and can respond
Reviews are stored in the wp_c2p_provider_reviews database table. There is currently no dedicated admin panel for reviews — they are managed directly through the database if needed.
What you can do:
- Reviews are auto-approved on submission — no moderation queue
- To remove an inappropriate review, delete the row from
wp_c2p_provider_reviews(the provider’s rating will update automatically on the next review submission) - Provider responses are stored in the same table (
provider_responseandprovider_response_atcolumns)
wp_c2p_providers table (the rating and review_count columns). This happens automatically when a new review is submitted but not when a review is deleted manually.
Policies (C2P Policy Manager Plugin)
The platform includes a custom C2P Policy Manager plugin for managing Terms of Service, Privacy Policy, and other legal documents.
- Go to Policy Mgmt → All Policies
- Click Add New to create a new policy
- Each policy has: Title, Slug (URL), Content (WYSIWYG editor), Status (Draft/Published), Sort Order
- Drag and drop to reorder policies on the list page
- Published policies are accessible at
/policies/{slug}/
Password Expiry System
Passwords expire after 12 months. The system includes automatic warnings and forced reset on login.
How It Works
- Every password change is tracked in user meta (
c2p_password_last_changed) - A daily cron job checks all providers and seekers for upcoming expiry
- 30 days before: Warning email sent
- 7 days before: Urgent warning email sent
- On login with expired password: User is redirected to
/forgot-password/?expired=1 - After resetting password, warning flags are cleared and the cycle restarts
Password Change Tracking
Password changes are tracked in these scenarios:
- New user registration — initial date set
- Password reset via email link
- Password change from dashboard Account Settings
- Admin changing password in user edit page
Security Notes
- CSRF Protection: All forms use WordPress nonce tokens
- Input Sanitization:
sanitize_text_field(),sanitize_email(),sanitize_textarea_field() - SQL Injection Prevention: All queries use
$wpdb->prepare() - XSS Prevention: Output escaped with
esc_html(),esc_url(),esc_attr() - Webhook Verification: DimePay webhooks verified via HMAC-SHA256 signature
- Admin Capability Checks: All admin endpoints check
current_user_can('manage_options') - Role-based Access: Dashboard content restricted by user role
- Password Requirements: 8+ chars, uppercase, lowercase, number, special char (providers)
- Password Expiry: 12-month forced rotation with email warnings
File Structure
/c2p-child/
├── /admin/ # Admin pages and templates
│ ├── /analytics/ # Analytics system
│ │ ├── analytics-dashboard.php # Admin dashboard with KPI cards, charts
│ │ ├── analytics-dashboard.js # Dashboard interactivity + Chart.js
│ │ ├── class-analytics-tracker.php # Event tracking (page views, user actions)
│ │ ├── class-analytics-reporter.php # Metrics, reports, CSV export
│ │ └── frontend-tracking.js # Client-side event tracking
│ ├── admin-messaging.php # Admin broadcast/individual messaging
│ ├── featured-providers-admin.php # Featured providers management
│ ├── payment-manager.php # Payment configuration
│ └── templates/pricing-admin-template.php
├── /inc/ # Core includes (loaded by functions.php)
│ ├── class-config.php # Theme configuration
│ ├── class-feature-manager.php # Subscription-based feature access
│ ├── class-provider-data.php # Unified database access layer
│ ├── class-db-migration.php # Database migration tools
│ ├── admin-migration-page.php # Migration admin UI
│ ├── class-dimepay-gateway.php # DimePay payment gateway
│ ├── class-dimepay-checkout.php # Checkout flow
│ ├── class-subscription-manager.php # Subscription management
│ ├── class-dunning-manager.php # Grace periods & expiry warnings
│ ├── class-payment-emailer.php # Payment-related emails
│ ├── class-payment-reconciler.php # Pending payment reconciliation
│ ├── class-payment-result-pages.php # Payment result/success/fail pages
│ ├── class-invoice-generator.php # Invoice generation
│ ├── class-plan-audit-log.php # Plan change audit logging
│ ├── class-plan-change-handler.php # Subscription plan change handler
│ ├── class-webhook-logger.php # Webhook logging
│ ├── asset-optimization.php # CSS/JS loading optimization
│ ├── dashboard-customization.php # WP dashboard customization
│ ├── dashboard-photo-integration.php # Photo widget integration
│ ├── widgets.php # Custom widgets
│ ├── provider-redirects.php # URL redirect handling
│ ├── quote-comparison-ajax.php # Quote comparison AJAX
│ ├── saved-providers-ajax.php # Saved providers AJAX
│ └── quote-feedback-ajax.php # Quote feedback AJAX
├── /js/ # JavaScript files
│ ├── scripts.js # Main theme JS
│ ├── explore-services.js # Search & filter JS
│ ├── checkout.js # Payment checkout JS
│ ├── subscription.js # Subscription selection JS
│ ├── bootstrap-dropdowns.js # Bootstrap dropdown enhancements
│ ├── mobile-menu.js # Mobile navigation
│ └── just-for-you-admin.js # Just for You admin JS
├── /css/
│ ├── styles001.css # Main stylesheet (70KB)
│ └── just-for-you.css # Sponsored ads styles
├── /service-provider/
│ ├── /admin/pages/ # 12 admin pages (incl. shop-items)
│ ├── /templates/ # Provider templates
│ │ ├── /dashboard/ # 18 dashboard tab templates
│ │ ├── provider-dashboard.php # Main dashboard template
│ │ ├── provider-profile.php # Public profile (5 tabs: About, Services, Photos, Reviews, Shop)
│ │ ├── provider-profile-*.php # Profile tab partials
│ │ └── providers-list.php # Search results
│ ├── service-provider.php # Core provider class
│ ├── relevanssi-integration.php # Relevanssi search integration
│ ├── enhanced-filters.php # Advanced search filters
│ ├── photo-integration.php # Photo upload system
│ └── price-range-helper.php # Price range display helper
├── /service-seeker/
│ ├── /admin/pages/ # Seeker admin pages
│ │ ├── add-seeker.php # Manually create seeker
│ │ └── edit-seeker.php # Edit seeker details
│ └── /includes/ # Seeker classes
│ ├── class-quote-comparison.php
│ ├── class-saved-providers.php
│ └── class-quote-feedback.php
├── /just-for-you/ # Sponsored listings module
│ ├── class-just-for-you-db.php # Database layer (hero, rows, ads)
│ ├── just-for-you-admin-pages.php # Admin CRUD pages
│ └── just-for-you-ajax.php # Media upload & preview AJAX
├── /location/
│ └── class-location-db.php # Location/parish database helpers
├── /handover-guide/ # This documentation
│ └── index.html
├── functions.php # Main theme functions (~10K+ lines)
├── notification-manager.php # Notification system (~6.8K lines, 40+ email types)
├── elasticmail-integration.php # SMTP email delivery
├── front-page.php # Homepage
├── header.php # Site header
├── footer.php # Site footer
├── page-*.php # 25 page templates
├── style.css # Theme stylesheet
└── CLAUDE.md # Developer instructions
functions.php. For better organization, new features should go in separate files in /inc/ where possible.
Database Tables
Provider Tables (wp_c2p_ prefix)
| Table | Purpose |
|---|---|
wp_c2p_providers | Provider profiles (business info, services, ratings, approval status). Includes whatsapp_number (April 2026). |
wp_c2p_industries | Industry categories (Plumbing, Electrical, etc.) |
wp_c2p_services | Service sub-categories (within industries) |
wp_c2p_badges | Provider badges/certifications |
wp_c2p_parishes | Parishes (administrative divisions) |
wp_c2p_communities | Communities within parishes |
wp_c2p_neighbourhoods | Neighbourhoods |
wp_c2p_provider_reviews | Customer reviews and ratings |
wp_c2p_provider_shop_items | Provider shop items/products |
wp_c2p_id_mapping | Old external DB ID to new WP ID mapping |
Service Seeker & Job Tables (wp_ prefix)
wp_service_seekers | Seeker profiles |
wp_job_postings | Job listings |
wp_job_bids | Bids on jobs |
wp_quote_requests | Quote request submissions |
wp_quote_feedback | Feedback on declined quotes |
wp_quote_comparisons | Saved quote comparison sets |
wp_saved_providers | Seeker's favorite providers |
wp_service_payments | Legacy payment records |
Payment Tables
wp_c2p_payments | All payment transactions (DimePay) |
wp_c2p_subscriptions | Subscription records |
Booking & Job Feature Tables
wp_instant_bookings | Instant booking requests (Silver+ feature) |
wp_auto_bid_settings | Auto-bid configuration (Platinum) |
wp_auto_bid_log | Auto-bid activity log |
wp_job_matching_settings | Job matching preferences (Platinum) |
wp_job_matches | Job match results |
Communication Tables
wp_sb_chat_conversation | Chat conversations (SB Chat plugin) |
wp_sb_chat_messages | Chat messages (SB Chat plugin) |
wp_contact_submissions | Contact form submissions |
Analytics Tables
wp_c2p_analytics_events | Analytics event tracking (page views, actions, conversions) |
wp_c2p_analytics_daily | Aggregated daily analytics |
wp_c2p_profile_views | Per-provider profile view log. Now includes country_code, country_name, region_name, city, device_type, browser (April 2026) |
wp_c2p_contact_clicks | Phone/Email/WhatsApp/Website contact CTA clicks. 5-min IP dedup. |
wp_c2p_search_appearances | Every time a provider appears in a search result surface. 1-min IP dedup, tracks query, industry, parish, position. |
wp_c2p_profile_tab_views | 🆕 April 2026 — intentional tab clicks on provider profile tabs (About / Services / Reviews / Photos / Shop). Fires on shown.bs.tab, 60-sec IP dedup. |
wp_c2p_monthly_reports | Monthly performance report archive. JSON report_data column now includes: MoM comparison, contact clicks breakdown, search data, geo/device, rejection reasons, top search terms, response time benchmark. |
Just for You (Ads) Tables
wp_c2p_just_for_you_hero | Hero banner configuration (image or video) |
wp_c2p_just_for_you_rows | Layout rows that contain ads |
wp_c2p_just_for_you_ads | Individual ad records (image, text overlay, video) |
Other Tables
wp_provider_photos | Provider photo gallery |
wp_newsletter_subscribers | Blog newsletter subscribers |
Key User Meta
| Meta Key | Purpose |
|---|---|
c2p_plan_name | Current plan: Free, Silver, Gold, Platinum |
c2p_plan_status | active, cancelled, expired, past_due, grace_period |
c2p_plan_expires | Expiration datetime |
c2p_billing_period | monthly or annual |
c2p_last_payment_date | Last successful payment |
c2p_password_last_changed | Password change tracking (12-month expiry) |
c2p_password_expiry_warned_30d | 30-day warning sent flag |
c2p_password_expiry_warned_7d | 7-day warning sent flag |
c2p_grace_period_start | Grace period start timestamp |
c2p_dunning_emails_sent | Tracking which dunning emails sent |
CSS & JavaScript
CSS
The main stylesheet is /css/styles001.css (70KB). Key CSS variables:
--primary: #009cde /* Brand blue */
--primary-dark: #047caf
--secondary: #003780
--secondary-light: #64D9CA
JavaScript Files
| File | Purpose |
|---|---|
/js/scripts.js (39KB) | Main theme JS (animations, interactions) |
/js/explore-services.js (8KB) | Live search and filter functionality |
/js/checkout.js (8KB) | DimePay checkout flow |
/js/subscription.js (3KB) | Subscription plan selection |
/js/bootstrap-dropdowns.js (13KB) | Bootstrap dropdown enhancements |
/js/mobile-menu.js (3KB) | Mobile navigation |
Asset Optimization
The theme uses conditional loading to improve performance:
- Font Awesome loaded only on pages that need it
- jQuery loaded conditionally
- WordPress emoji and oEmbed scripts removed
- Custom scripts loaded only on relevant pages
Key Helper Functions
Provider Data Access
// Get provider data access layer instance
c2p_provider_data()
// Get provider by WordPress user ID
c2p_provider_data()->get_provider_by_user_id($user_id)
// Get provider by ID
c2p_provider_data()->get_provider_by_id($provider_id)
// Search providers with filters
c2p_provider_data()->search_providers([
'industry_id' => 1,
'parish_id' => 2,
'search' => 'plumber',
'limit' => 20
])
// Get lookup data
c2p_provider_data()->get_industries()
c2p_provider_data()->get_services_by_industry($id)
c2p_provider_data()->get_parishes()
Feature & Subscription
// Check feature access (returns true/false)
c2p_can_access_feature($provider_id, 'bidding_system')
c2p_can_access_feature($provider_id, 'shop_enabled')
// Get plan info
c2p_get_user_plan($user_id)
c2p_get_provider_plan($provider_id)
// Check subscription
c2p_user_has_active_subscription($user_id)
User Role Helpers
// Check if user is a seeker
c2p_is_service_seeker($user_id)
// Get current logged-in seeker
c2p_get_current_seeker()
// Get provider URL
c2p_get_provider_url($provider_id, $wp_user_id)
Homepage Data
c2p_get_services_with_providers(6) // Top services
c2p_get_parishes_with_providers(14) // Parishes
c2p_get_featured_homepage_providers(6) // Featured providers
c2p_get_industries_with_providers(9) // Industries
c2p_get_carousel_slides() // Homepage carousel
Media Storage (Wasabi + Leopard)
All media files (provider photos, images, etc.) are offloaded from the web server to Wasabi S3-compatible cloud storage using the Leopard – WordPress Offload Media plugin.
How It Works
- A photo is uploaded to WordPress (via admin, provider dashboard, or media library)
- WordPress stores it locally in
/wp-content/uploads/ - Leopard automatically copies the file to the Wasabi S3 bucket
- Leopard rewrites the URL so the image is served from Wasabi instead of the local server
- This reduces server storage and bandwidth usage
Plugin: Leopard – WordPress Offload Media
| Setting | Value |
|---|---|
| Plugin | Leopard – WordPress Offload Media v4.0.5 (by Nouthemes) |
| Storage Provider | Wasabi S3 |
| Admin Location | WordPress Admin → Leopard Offload Media |
| Settings Option Key | leopard_offload_media_settings |
- Go to WordPress Admin → Leopard Offload Media
- Available settings pages:
- Storage Settings — Configure the storage provider (Wasabi), access key, secret key, region, endpoint
- Bucket Settings — Select or create the S3 bucket
- Assets — Configure CSS/JS asset offloading (if enabled)
- URL Rewriting — Configure how media URLs are rewritten to point to cloud storage
- CORS — Cross-origin settings for the bucket
- Advanced — Advanced offloading options
- Copy Data / Sync — Sync existing media to/from cloud storage
- Import/Export — Export or import plugin settings
- System Status — View connection status and diagnostics
- Product License — Manage the plugin license key
- Go to Leopard Offload Media → System Status
- Verify the connection status shows as connected
- Upload a test image via Media → Add New
- After upload, check the image URL — it should point to Wasabi (e.g.
https://c2pro-wp.s3.us-east-1.wasabisys.com/...) instead of the local server
- Go to Leopard Offload Media → Storage Settings
- Update the Access Key, Secret Key, Region, and Endpoint as needed
- Click Save and verify the connection
- The provider photo manager (
provider-photo-manager.php) integrates directly with Leopard for provider photo uploads - If Leopard is deactivated, uploads still work but files stay on the local server only
- Leopard supports multiple cloud providers (Amazon S3, Google Cloud, DigitalOcean Spaces, Cloudflare R2, etc.) but is currently configured for Wasabi
- The plugin requires a valid license key to function. Check Product License if offloading stops working
Backups (Backuply)
Site backups are managed by the Backuply plugin (v1.5.2 by Softaculous). It supports scheduled and manual backups of both files and the database.
- Go to WordPress Admin → Backuply
- The dashboard shows backup history, status, and quick-action buttons
- Go to Backuply in the WordPress admin
- Click Backup Now (or equivalent button)
- Select what to back up: Files, Database, or Both
- The backup runs in the background. Check progress on the Backuply dashboard
- Completed backups are stored in
/wp-content/backuply/(or a configured remote location)
- Go to Backuply → Settings (or the scheduling section)
- Configure the backup schedule:
- Available intervals: every 30 min, hourly, every 2 hours, daily, weekly, monthly
- Choose what to include: files, database, or both
- Optionally configure a remote backup location (cloud storage) for off-site backups
- Save the schedule
wp-cron.php).- Go to Backuply and find the backup you want to restore
- Click Restore
- Follow the prompts to confirm the restoration
Files and directories can be excluded from backups to reduce size and time:
- Configured via
backuply_excludesoption in the database - Common exclusions: cache directories, log files, temporary uploads
- Edit exclusions in Backuply → Settings
Caching & "Why Don't I See My Changes?"
Caching is when the website saves a copy of a page so it loads faster next time. This is great for speed, but it means that after you make a change (update a page, change a setting, etc.), you might still see the old version for a while. This section explains how to fix that.
Caching Plugins Installed
| Plugin | Status | Where to Find It | What It Does |
|---|---|---|---|
| W3 Total Cache | Installed & Active | WP Admin → Performance | Speeds up the site by saving copies of pages, images, and files so they load faster for visitors |
| Jetpack | Installed, cache features disabled | WP Admin → Jetpack → Settings | Has speed/performance features available but they are currently turned off |
How to Clear the Website Cache (W3 Total Cache)
If you've made a change and it's not showing up, clearing the cache should be your second step (after a hard refresh — see below). There are two ways:
Option 1 — From the admin bar (quickest):
- While logged in as an admin, look at the black bar at the top of any page
- Hover over "Performance"
- Click "Purge All Caches"
Option 2 — From the dashboard:
- Go to WP Admin → Performance → Dashboard
- Click the "empty all caches" button
Video Guide — How to Purge the Cache
Watch this short video to see how to clear the cache using W3 Total Cache:
How to Hard Refresh Your Browser
Your browser saves copies of pages you visit to load them faster. A hard refresh forces your browser to throw away the saved copy and download a fresh version. This is the first thing to try when a page looks outdated.
| Browser | Windows | Mac |
|---|---|---|
| Chrome / Edge / Brave | Ctrl + Shift + R | Cmd + Shift + R |
| Firefox | Ctrl + Shift + R | Cmd + Shift + R |
| Safari | — | Cmd + Option + R |
If a hard refresh doesn't work, clear your entire browser cache:
- Chrome / Edge: Press
Ctrl + Shift + Delete(Windows) orCmd + Shift + Delete(Mac) - Tick "Cached images and files" (you can leave cookies and history unchecked)
- Set time range to "All time"
- Click "Clear data"
Firefox: Ctrl + Shift + Delete → tick "Cache" → click Clear Now
Safari: Safari menu → Settings → Privacy → Manage Website Data → Remove All
Step-by-Step: "I Made a Change But Don't See It"
Follow these steps in order. Most issues are solved by step 1 or 2.
- Hard refresh the page —
Ctrl + Shift + R(Windows) orCmd + Shift + R(Mac). This fixes most issues. - Clear the W3 Total Cache — admin bar → Performance → Purge All Caches. Then hard refresh again.
- Try an incognito / private window — open the page in a private browsing window. If the change shows there, it's your browser cache — clear it fully (see above).
- Clear your full browser cache —
Ctrl + Shift + Delete→ clear cached images and files. - Wait 5–10 minutes — some server-side caches expire automatically. If steps 1–4 didn't help, wait a few minutes and try again.
- Contact your developer — if the change still isn't showing after all the above, there may be a deeper technical issue (server cache, file not saved correctly, etc.).
Jetpack has speed and performance features (image optimization, lazy loading, etc.) but they are currently turned off. If you want to enable them:
- Go to WP Admin → Jetpack → Settings
- Look for the Performance section
- Toggle on the features you want
This section is for developers/technical staff only.
| Cache Layer | What It Caches | How to Clear |
|---|---|---|
| W3 Total Cache | Page cache, database queries, object cache, minified CSS/JS | WP Admin → Performance → Dashboard → "empty all caches" |
| PHP OPcache | Compiled PHP files — automatically detects file changes in most cases | Restart the web server, or ask your hosting provider to clear OPcache |
| WordPress Transients | Temporary database-stored data (e.g. schema cache). Expires automatically (1 hour). | Wait for expiry, or delete via database: transient rows in wp_options |
| Leopard Bucket Cache | S3/Wasabi file listings for media offloading | WP Admin → Leopard plugin settings |
Troubleshooting
Email Issues
| Problem | Solution |
|---|---|
| Emails not sending | Check SMTP credentials at Admin → Tools → ElasticMail Test. Verify connection and send test email. |
| Emails in spam | Check SPF/DKIM DNS records for domain. Verify From address is approved in ElasticMail. |
| Notification not triggering | Check if notification is enabled in Admin → Notifications. Verify subject/message not empty. |
| Placeholder not replaced | Check placeholder spelling (case-sensitive with braces). Preview email to test. |
Payment Issues
| Problem | Solution |
|---|---|
| Payment stuck "pending" | Reconciler runs 2x daily. Or manually mark complete in admin. Check webhook logs. |
| User not upgraded after payment | Check error logs. Manually run c2p_upgrade_user_account() if needed. |
| DimePay API errors | Verify API keys in Payment Settings. Test connection from admin. |
| Double charging | Ensure webhook_secret is set for signature verification. |
Provider Issues
| Problem | Solution |
|---|---|
| Provider not in search | Check approval_status is 'approved' in wp_c2p_providers. |
| Dashboard tab locked | Check provider's plan. Premium tabs require Silver+ plans. |
| Photos not uploading | Check photo limits for plan. Verify file type (images only, <5MB). |
Seeker Issues
| Problem | Solution |
|---|---|
| Jobs not appearing | Check wp_job_postings status field is 'open'. |
| Quotes not showing | Verify seeker_id matches wp_users.ID. |
| Messages not loading | Verify SB Chat plugin is active and tables exist. |
General
| Problem | Solution |
|---|---|
| Password expired redirect loop | Check c2p_password_last_changed user meta. Update to current date. |
| Grace period not working | Verify dunning manager is loaded and cron is scheduled. |
| Functions not available | Ensure code is in functions.php or an include file loaded by it in /inc/. |
Connect To Pros — Complete Handover Guide
Last updated: February 2026 (v2.1 — added detailed how-tos for Badges, Industries/Services, Locations, Shop Items, Photo Management, Wasabi/Leopard media storage, Backuply backups, and Caching)