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

Technology Stack

ComponentTechnology
CMSWordPress (custom child theme: c2p-child)
FrontendBootstrap 5, jQuery, Font Awesome, custom CSS/JS
Payment GatewayDimePay (JMD, hosted checkout) + Dime for WooCommerce plugin (WooCommerce is only installed to support this plugin)
Email DeliveryWP Mail SMTP (ElasticMail)
MessagingSB Chat plugin
Custom FieldsAdvanced Custom Fields (ACF)
CachingW3 Total Cache
SecurityWordfence, Sucuri Scanner, hCaptcha, Two-Factor Authentication
SEOYoast SEO (wordpress-seo)
AnalyticsMonsterInsights (Google Analytics)
BackupsBackuply
Policy ManagementC2P Policy Manager
FormsCognito Forms (bank details form, etc.)
Social SharingAddToAny
CommunityBuddyPress
File StorageWasabi S3 via Leopard Offload Media, WordPress Media Library
HostingBluehost
DatabaseWordPress MySQL with 35+ custom tables (wp_c2p_ and wp_ prefix)
Important: The main theme functions file is 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

📊 Analytics Tracking — Five New Dimensions

📄 Monthly Reports — Deeper Insights

📱 Provider Profile — WhatsApp Field

🐛 Critical Fixes

🎨 UI / Responsiveness Improvements

🗄️ Data Model Additions

📖 Project Memory Notes

Auto-memory records stored for future reference:

🚀 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:

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:

WidgetPositionContent
🚀 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:

Status card shows: reports stored, earliest/latest month, eligible provider count, next scheduled cron run.

Quick Start & Access

Admin Login

AccessURL
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.

RoleWordPress Role SlugDescription
AdministratoradministratorFull WordPress admin access, manage all settings, users, and content
Service Providerservice_providerProfessional offering services. Custom dashboard at /provider-dashboard/
Service Seekerservice_seekerCustomer looking for services. Custom dashboard at /seeker-dashboard/

Role Assignment

What Each Role Can Do

Service Provider — Capabilities

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):

FeatureFreeSilverGoldPlatinum
Basic Profile & Search Listing
Enhanced Profile
Photo Limit5153050
Storage Limit (MB)5102030
Instant Booking
Shop (product listing)5 items15 itemsUnlimited
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
Service Seeker — Capabilities

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
Administrator — Capabilities

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:

Role Overlap — Shared Features

FeatureProviderSeekerAdminLogged Out
View homepage & public content
Browse/search providers
View provider profiles
Submit contact form
BuddyPress messaging
Notifications
Upload profile image
Post/respond to jobsBid on jobsPost jobs
Leave reviews
Manage own business profile
Subscribe to paid plans
WordPress admin access

All Page URLs

Authentication

URLPurpose
/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=XBrowse providers by service
/locations/?parish_id=XBrowse providers by location
/industries/?industry_id=XBrowse 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

Fill Form Account Created (Pending) Auto-Login Redirect to /pricing/ Choose Plan Admin Reviews Approved/Rejected

Registration Fields

FieldRequiredNotes
Contact NameYesMinimum 2 characters
EmailYesMust be unique across users and providers
Phone NumberYesCountry-specific validation (Jamaica = 10 digits)
Country CodeYes30+ countries supported
PasswordYes8+ chars, must contain uppercase, lowercase, number, special char
Primary IndustryYesDropdown from wp_c2p_industries
Primary ServiceNoDependent dropdown based on industry
Business NameNo
Business AddressNoTextarea
Business DescriptionNoTextarea
Services OfferedNoTextarea
Website URLNoValidated URL format
Terms AgreementYesCheckbox
Marketing ConsentNoCheckbox
After registration, the provider is auto-logged in and redirected to the Pricing page to choose a subscription plan. Their account status is pending until admin approves them.

Approval Process

StatusMeaningVisibility
PendingAwaiting admin review (default)Can access dashboard, NOT visible in search
ApprovedAdmin approvedFull public profile, visible in search
RejectedAdmin rejected applicationAccount disabled, not visible

How to Approve/Reject a Provider

  1. Go to Service Providers → All Providers
  2. Filter by Approval Status: Pending to see new applications
  3. Click the Approve or Reject link on the provider's row
  4. 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:

TabPurposePlan Required
DashboardSummary stats, quick actionsFree
ListingEdit business profile, hours, servicesFree
Photo GalleryUpload and manage photosFree
ShopManage products/services for saleSilver+
ReviewsView customer reviews, respondFree
Quote InsightsAnalytics on quote requestsFree
AnalyticsDetailed dashboard analyticsGold+
Browse JobsLinks to /jobs/ pageFree
My BidsView submitted bidsSilver+
Auto-BiddingSet up automatic bidding rulesPlatinum
Job MatchingGet matched to relevant jobsPlatinum
Quote RequestsView incoming quote requestsFree
Active JobsJobs provider is working onFree
BookingsInstant booking requestsSilver+
MessagesSB Chat messaging systemFree
SubscriptionPlan management & renewalFree
BankingBank account for paymentsFree
Account SettingsProfile & password managementFree

Admin Management

Provider admin pages are located at WordPress Admin → Service Providers:

PagePurpose
All ProvidersList, search, filter, approve/reject, bulk actions
Add ProviderManually create a provider account
Edit ProviderEdit provider details, approval status
Provider PhotosManage provider photo galleries
Photo ManagementGlobal photo moderation (pending/approved)
Industries/ServicesManage industry and service categories
BadgesManage provider badges/certifications
Photo LimitsConfigure upload limits per plan
Import/ExportBulk import/export provider data
SettingsGeneral provider system settings
Shop ItemsManage provider shop items
Featured ProvidersManage homepage and explore page featured providers (Gold/Platinum only)
How to Manually Create a Provider
  1. Go to Service Providers → Add New
  2. Fill in required fields: Contact Name, Email, Industry
  3. Password: either enter one manually (8+ chars, must include uppercase, lowercase, number, special char) or check Auto-generate
  4. Check Send Welcome Email to email the credentials to the provider
  5. Set plan details (plan name, billing period, status, expiry date) if needed
  6. Click Save Provider

This creates both a WordPress user (role: service_provider) and a wp_c2p_providers record.

How to Change a Provider's Plan
  1. Go to Service Providers → All Providers
  2. Click Edit on the provider
  3. Scroll to the Plan section
  4. Change: Plan Name (Free/Silver/Gold/Platinum), Billing Period (monthly/annual), Plan Status (active/cancelled/expired), Plan Expires (date), Last Payment Date
  5. Click Save
Manual plan changes update local database only. They do NOT trigger DimePay API calls. If the user has an active DimePay subscription, it must be cancelled separately in the DimePay dashboard.
How to Delete a Provider
Warning: Deleting is permanent and cascading. It removes: reviews, shop items, photos, bids, bookings, job matching records, auto-bid settings, the provider record, AND the WordPress user account.
  1. Go to Service Providers → All Providers
  2. 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

FeatureDetails
Photo CategoriesGeneral, Logo, Portfolio, Team, Facility, Certificates, Before/After, Equipment, Media, Other
Allowed FormatsJPG, JPEG, PNG, WebP
Max File Size5 MB per photo
Auto-CompressionEnabled (quality: 85%)
ModerationAll uploads go to Pending → Admin approves or rejects
StorageWordPress Media Library → offloaded to Wasabi S3 via Leopard plugin
Photo Limits by Plan
PlanMax Photos
Free5
Silver15
Gold30
Platinum50

Photo limits are configured per plan. To change them:

  1. Go to Pricing → Plan Features
  2. Edit photo_limit (max number of photos) and storage_limit_mb (max total storage) for each plan
How to Moderate Provider Photos
  1. Go to Service Providers → Photo Management
  2. At the top, 4 statistics cards show: Total Photos, Pending Review (yellow), Approved (green), Total Size (blue)
  3. 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
  4. Click Filter (or Clear to reset)
  5. 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
  6. 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
Rejected photos can be re-approved later by clicking Approve on the rejected photo.
How Providers Upload Photos (Dashboard)

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:

  1. File is validated (format, size, quota check)
  2. Auto-compressed to 85% quality if applicable
  3. Uploaded to WordPress Media Library (then offloaded to Wasabi S3 by Leopard)
  4. Status set to Pending — awaits admin approval
  5. Admin sees it in the Photo Management pending queue
The provider's avatar/logo is separate from the gallery. It's uploaded via the clickable avatar on the dashboard sidebar and stored as the provider's 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.

How to Add a New Industry
  1. Go to Service Providers → Industries & Services
  2. Make sure the Industries tab is selected
  3. Fill in the form fields:
    FieldRequiredDescription
    NameYesThe display name (e.g. "Plumbing")
    SlugNoURL-friendly version. Auto-generated from the name if left blank (e.g. "plumbing")
    DescriptionNoBrief description of the industry (textarea, 3 rows)
    Icon TypeNoChoose from dropdown — see icon guide below
    Icon Name/URLNoThe icon identifier — depends on icon type selected
  4. Click Add Industry
  5. The new industry appears in the table below the form
How to Edit an Existing Industry
  1. Go to Service Providers → Industries & Services (Industries tab)
  2. Find the industry in the table and click the Edit button
  3. The form above will populate with the industry's current values
  4. Make your changes to any fields
  5. Click Update Industry
To cancel editing and go back to adding a new industry, click the Cancel Edit button or reload the page.
How to Delete an Industry
  1. Find the industry in the table and click the Delete link
  2. Confirm the deletion in the browser dialog
Warning: Deleting an industry does NOT automatically delete its services. Orphaned services may need to be reassigned or deleted separately.
How to Upload an Industry Photo
  1. Find the industry in the table and click the Upload Photo button
  2. A modal dialog will appear with the industry name in the title
  3. Click Choose File and select an image (JPG, PNG, or WebP — max 5 MB)
  4. Optionally enter Alt Text for accessibility
  5. Click Upload Photo
  6. 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.

How to Add a New Service
  1. Go to Service Providers → Industries & Services
  2. Click the Services tab
  3. Fill in the form fields:
    FieldRequiredDescription
    Parent IndustryYesSelect the industry this service belongs to from the dropdown
    NameYesThe display name (e.g. "Pipe Repair")
    SlugNoURL-friendly version. Auto-generated from name if blank
    Icon TypeNoChoose from dropdown — see icon guide below
    Icon Name/URLNoThe icon identifier — depends on icon type selected
  4. Click Add Service
The Parent Industry dropdown is populated from all existing industries. If the industry you need doesn't appear, add it first on the Industries tab.
How to Edit or Delete a Service

Edit:

  1. On the Services tab, find the service in the table and click Edit
  2. The form populates with the service's current values (including its parent industry)
  3. Make changes and click Update Service
  4. You can change the parent industry to move a service from one industry to another

Delete:

  1. Click Delete next to the service and confirm
How to Upload a Service Photo
  1. On the Services tab, find the service and click Upload Photo
  2. A modal dialog appears — choose an image file (JPG, PNG, or WebP — max 5 MB)
  3. Optionally enter Alt Text
  4. Click Upload Photo

To remove a service photo, click Delete Photo next to the current photo.

Icon Guide — How to Choose Icons for Industries & Services

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)

  1. Go to fonts.google.com/icons
  2. Search for what you need (e.g. search "pet", "home", "car")
  3. Click the icon you like
  4. Copy just the icon name shown (e.g. pets, plumbing, electrical_services)
  5. In the admin form, select "Material Symbols (Outlined)" from the Icon Type dropdown
  6. Paste the icon name into the "Icon name or URL" field
Icon Type in DropdownWhat 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

  1. Go to fontawesome.com/search (free icons only)
  2. Search for what you need (e.g. search "bone", "car", "house")
  3. Click the icon you like
  4. You need to copy the full class name including the style prefix — for example fa-solid fa-bone
  5. In the admin form, select "FontAwesome" from the Icon Type dropdown
  6. 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

Important: For FontAwesome, you must include the style prefix (e.g. 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.

How to Add a New Badge
  1. Go to Service Providers → Badges
  2. Fill in the form fields:
    FieldRequiredDescription
    Badge NameYesDisplay name (e.g. "Verified Professional")
    SlugNoAuto-generated from the name (e.g. "verified-professional")
    DescriptionNoBrief description of what this badge means (textarea, 3 rows)
    Icon TypeNoChoose from: Material Symbols (Outlined/Rounded/Sharp), FontAwesome (Solid), or Image URL
    Icon Name/URLNoThe icon identifier (see Icon System Guide above)
    ColorNoBadge colour — uses a colour picker. Default: #007cba (blue)
    Sort OrderNoNumber controlling display order (lower numbers appear first). Default: 0
  3. Click Add Badge
  4. The new badge appears in the table below, marked as Active by default
How to Edit an Existing Badge
  1. Go to Service Providers → Badges
  2. Find the badge in the table and click the Edit button
  3. The form above populates with the badge's current values (name, slug, description, icon, colour, sort order)
  4. Make your changes
  5. Click Update Badge
How to Activate/Deactivate a Badge
  1. Find the badge in the table
  2. Click the Deactivate link (or Activate if currently inactive)
  3. Deactivated badges will no longer appear in search filters or on provider profiles
Deactivating a badge does not remove it from providers who already have it — it just hides it from display. Re-activating it makes it visible again.
How to Delete a Badge
  1. Find the badge in the table and click the Delete link
  2. Confirm the deletion in the browser dialog
Warning: Deleting a badge permanently removes it. Consider deactivating instead if you may need it again later.

Location Management

Locations use a 4-tier hierarchy. Each level has its own admin page under the Locations menu in WordPress admin.

Country (e.g. Jamaica)
    └— 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.

How to Add a Country
  1. Go to Locations → Countries
  2. Fill in the form:
    FieldRequiredDescription
    Country NameYesFull name (e.g. "Jamaica")
    Country CodeYesISO 2-letter code (e.g. "JM")
    Phone CodeNoInternational dialling code (e.g. "+1-876")
    StatusNoActive or Inactive
  3. Click Add Country
How to Add an Administrative Division (Parish)
  1. Go to Locations → Admin Divisions
  2. Fill in the form:
    FieldRequiredDescription
    Parent CountryYesSelect from dropdown of existing countries
    Division NameYesName of the parish/state/province (e.g. "St. Andrew")
    StatusNoActive or Inactive
  3. Click Add Division
In Jamaica, administrative divisions correspond to parishes. In other countries, these might be states, provinces, or regions.
How to Add a Community
  1. Go to Locations → Communities
  2. Fill in the form:
    FieldRequiredDescription
    Parent DivisionYesSelect from dropdown of existing administrative divisions
    Community NameYesName of the town/city/village (e.g. "Papine", "Half Way Tree")
  3. Click Add Community
How to Add a Neighbourhood
  1. Go to Locations → Neighbourhoods
  2. Fill in the form:
    FieldRequiredDescription
    Parent CommunityYesSelect from dropdown of existing communities
    Neighbourhood NameYesName of the residential area (e.g. "Hope Flats", "Seivright Gardens")
  3. Click Add Neighbourhood
How to Edit or Delete Locations

Edit:

  1. Go to the appropriate location level page (Countries, Admin Divisions, Communities, or Neighbourhoods)
  2. Find the entry in the table and click Edit
  3. Update the fields and click Save

Delete:

  1. Click Delete next to the entry and confirm
Warning: Deleting a location at a higher level (e.g. a parish) does not automatically remove the communities and neighbourhoods beneath it. Delete or reassign child locations first to avoid orphaned data.
The Locations → Dashboard page shows summary statistics (total countries, divisions, communities, and neighbourhoods) to help you monitor the data.

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.

How Shop Items Work — Full Interaction Flow

Step 1: Provider Adds a Shop Item

  1. The provider goes to their dashboard and opens the Shop section
  2. 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
  3. The provider clicks Save
  4. The item is created with status Pending — it is not visible to customers until approved by an admin
  5. 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

  1. Admin receives the notification email and clicks the link, or goes to Service Providers → Shop Items → Pending tab
  2. 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 TypeWhat Happens When the Customer Clicks
CallOpens the phone dialer with the provider’s number
EmailOpens the email client with the provider’s email
ContactScrolls to the provider’s contact section on their profile
Visit LinkOpens the external URL (with a confirmation dialog first)
View MoreOpens a modal with the full item description and details
ExploreOpens a modal with the full item description and details
Important: There is no payment processing, checkout, or order system for shop items. The shop is purely a catalog — all transactions happen directly between the customer and provider outside the platform.

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

Provider adds item Pending (admin notified) Admin approves or rejects
  • 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
How to Add a Shop Item (Admin)
  1. Go to Service Providers → Shop Items
  2. Click Add New Item — a modal form appears
  3. Fill in the fields:
    FieldRequiredDescription
    ProviderYesSelect the provider from the dropdown (shows Business Name + ID)
    TitleYesItem name (e.g. "Basic Plumbing Checkup")
    DescriptionNoBrief description of the item (textarea, 3 rows)
    PriceNoNumeric price (e.g. 99.99)
    Price DisplayNoCustom text shown instead of/alongside price (e.g. "From $99", "Contact for pricing")
    ImageNoClick Browse to open WordPress media library. Preview appears after selection
    PhoneNoContact phone for this item
    EmailNoContact email for this item
    External LinkNoURL to external product/service page
    CTA TypeNoButton type: contact, call, email, visit_link, view_more, or explore
    CTA TextNoCustom button text (e.g. "Get Quote", "Learn More")
  4. 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
  5. Click Save
How to Approve/Reject Shop Items

When providers submit shop items (or when Auto-Approve is unchecked), items go into Pending status. The admin receives an email notification.

  1. Go to Service Providers → Shop Items
  2. Click the Pending tab to see items awaiting review
  3. 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
Rejected items can be re-approved later. The rejection reason is stored and visible to admins.
How to Edit or Delete Shop Items

Edit:

  1. Find the item in any tab (All, Pending, Approved, Rejected)
  2. Click Edit — the modal form appears with current values
  3. Update any fields, including changing the Status (pending/approved/rejected)
  4. Click Save

Delete:

  1. 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.

Shop Item Limits by Plan
PlanShop Items
FreeNot available
Silver5 items
Gold15 items
PlatinumUnlimited

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

FieldRequired
First NameYes
Last NameYes
EmailYes (used as username)
PasswordYes (min 6 chars)
LocationYes
PhoneNo
Company NameNo
IndustryNo
Specific AreaNo

Seeker Dashboard

Accessed at /seeker-dashboard/ with 8 tabs:

TabPurpose
OverviewQuick stats (quotes, jobs, messages, reviews)
Quote RequestsAll submitted quote requests with filters
Compare QuotesSide-by-side comparison, shortlisting, rating
MessagesConversations with providers (SB Chat)
ReviewsReviews submitted by seeker
PaymentsPayment history and status
JobsPosted jobs, bid counts, bid management
Saved ProvidersFavorite providers with notes

Admin Management

WordPress Admin → Service Seekers:

How to Create a Seeker Account
  1. Go to Service Seekers → Add New
  2. Fill in: First Name, Last Name, Email (required), Location (required)
  3. Password: enter manually (min 6 chars) or leave blank for auto-generated
  4. Check Send Welcome Email to email credentials
  5. Click Save

Seekers are immediately active (no approval workflow like providers).

How to Suspend or Delete a Seeker

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.

Delete is permanent — removes both the seeker record and their WordPress user account.
How to Export Seeker Data

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 ProfileYesYesYesYes
Photos5153050
Storage5MB10MB20MB30MB
Search ListingYesYesPriorityPremium
MessagingYesYesYesYes
Shop Items-515Unlimited
Instant Booking-YesYesYes
Bidding System--YesYes
Analytics-BasicFullFull + Live
Featured on Explore--YesYes
Featured on Homepage---Yes
Auto-Bidding---Yes
Job Matching---Yes

Subscription Statuses

StatusMeaning
activeCurrently active and auto-renewing
cancelledUser cancelled; retains access until expiry date
expiredPast expiration; downgraded to Free
past_duePayment failed; in retry cycle
grace_periodExpired but still has access (7-day grace)

Plan Data Storage

Plan information is stored in WordPress user meta:

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.

How to Change Plan Prices
  1. Go to Pricing (top-level menu)
  2. Each plan has: Name, Monthly Price, Annual Price, Description, Features list (one per line), Excluded Features, Button text
  3. Edit the fields and click Save Changes
  4. To mark a plan as recommended: check the Popular checkbox (adds a "Popular" badge)
  5. To mark a plan as free: check the Free checkbox (hides price and shows "Free")
The first 4 plans (Free, Silver, Gold, Platinum) cannot be deleted, only edited. Additional plans can be added or removed.
How to Edit Feature Access per Plan
  1. Go to Pricing → Plan Features
  2. Configure which features are available at each plan tier
  3. This controls: photo limits, storage limits, shop items, bidding access, analytics access, etc.
Weekly Billing Test Mode (Developer Tool)

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:

  1. Open page-pricing.php
  2. 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
  3. Find the JavaScript comment block labelled "WEEKLY BILLING TEST MODE JS" (in the script section at the bottom) and uncomment the code inside it
  4. A yellow banner with a "Switch to Weekly Billing" button will appear on the pricing page
Important: This should never be enabled in production. Weekly billing is for testing purposes only — ensure it is commented out before deploying to the live site.

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:

Grace Period

When a subscription expires, the provider enters a 7-day grace period (configurable) during which they retain full access:

Admin Subscription Health Dashboard

Access via Service Providers → Sub Health. This page shows:

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.

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

PositionPage
Above Professional SolutionsHome Page
Above Browse by LocationHome Page
Above FooterHome Page
Above Filters & ResultsExplore Services
Above FooterExplore Services
Above FooterProvider Profile
Above FooterShop Discovery
Above FooterCustomer Reviews
Above FooterPricing
Above Latest Insights / Above Categories / Above FooterBlog
Above Perspective Tabs / Above FooterHow It Works

Ad Types

Width Options

Managing Ads

  1. Go to Page Ads → Dashboard — see all positions with their status
  2. Click “Manage Ads” next to a position
  3. Click “Add New Ad” — fill in ad type, image/video, overlay text, link, width
  4. Toggle individual ads or entire positions active/inactive

Provider Dashboard Features

Response Templates

Providers can save frequently used quote responses as templates:

File Attachments in Quote Responses

Providers can attach files when responding to quote requests:

Profile Visibility Toggle

Providers can temporarily hide their profile from search results:

Keyword Suggestions

The profile section shows clickable keyword suggestions below the keywords input:

Search Analytics

Providers (Silver+ plans) can view their search performance:

Quote Insights & Feedback

When seekers decline a provider’s quote, they can leave feedback. Providers see this as aggregated analytics:

Booking Features

Shop Item Management

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).

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):

Payments (DimePay)

Payment Flow

User clicks Subscribe AJAX: Create payment record Call DimePay API Redirect to DimePay User pays Webhook received Account upgraded

DimePay Configuration

Settings are stored in c2p_payment_settings option. Configured at Admin → Payment Settings.

SettingDescription
Sandbox ModeToggle between sandbox and live API
Client KeySandbox / Live API client key
Signing SecretSandbox / Live signing secret
Webhook SecretFor verifying webhook signatures
Default CurrencyJMD (Jamaican Dollar) by default
Grace Period DaysDays 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.

How to Enable Admin Payment Notifications
  1. Go to Pricing → Payments → Settings tab
  2. Scroll to the Behavior Settings section
  3. Check the “Admin Payment Notifications” checkbox — “Send admin email notifications for payments, renewals, cancellations, and failures”
  4. 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.
  5. 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
Note: Refund request notifications are always sent to the admin email regardless of whether this checkbox is enabled.
Other Behavior Settings on This Page
SettingDescription
Auto-upgrade UsersAutomatically upgrade provider accounts when payment is confirmed (e.g. Free → Silver after payment)
Confirmation EmailSend email confirmation to the user (seeker or provider) after a successful payment
Failed Payment EmailSend email notification to the user when a subscription payment fails
Admin Payment NotificationsSend admin email for payments, renewals, cancellations, and failures
Admin Notification EmailWhich email address receives admin notifications. Defaults to WordPress admin email if empty.
Default CurrencyCurrency 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.

How to Change the Platform Fee
  1. Go to Pricing → Payments → Settings tab
  2. Scroll to the “Platform Fee (%)” field in the Behavior Settings section
  3. Enter the desired percentage (default is 10%, adjustable from 0% to 100% in 0.5% increments)
  4. 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:

Grace Period & Dunning

When a subscription expires, the Dunning Manager handles a 7-day grace period:

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

How to View & Manage Payments
  1. Go to Pricing → Payments
  2. The Recent Payments tab shows all transactions with: User, Plan, Amount, Status, Date
  3. Mark Complete: Click on a pending payment to manually mark it as completed (upgrades the user's account)
  4. Refund: Click Refund on a completed payment — this sends a refund request to DimePay's API and, upon success, downgrades the user locally
  5. Export: Click the CSV export button for payment records
How to Configure DimePay (C2P Settings)

The custom C2P payment integration is configured at:

  1. Go to Pricing → Payments → Settings tab
  2. Toggle Sandbox Mode for testing vs live payments
  3. Enter the Client Key and Signing Secret (separate fields for sandbox and live)
  4. Set the Webhook Secret for signature verification
  5. Configure success/failure/cancel redirect URLs
  6. 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.

Where to Find & Manage the DimePay Settings

There are two ways to get to the DimePay settings:

Option 1 — Shortcut (quickest):

  1. In the left sidebar, go to Payments (directly below Products)
  2. Find Dime Payment in the list and click Manage

Option 2 — Through Settings:

  1. Go to WooCommerce → Settings → Payments tab
  2. 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:

WooCommerce Plugin Settings
SettingDescription
Enable/DisableToggle the payment method on/off at checkout
EnvironmentProduction (live payments) or Development (sandbox/testing). Switch to Development for testing with test cards.
API URLThe 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 ToMerchant (you absorb fees), Customer (fees added to order total), or Split 50/50
Debug ModeWhen enabled, logs all API requests and responses to wp-content/debug.log for troubleshooting
What You Need from the DimePay Portal

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.
Important: The DimePay portal has separate sandbox and production credentials. Make sure you use the correct set based on your environment setting. Never use production keys in a development/staging environment.
Video Guide — Switching DimePay from Sandbox to Production

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.

WooCommerce Plugin Features
  • 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
Two Payment Systems — How They Work Together

All payments on the website are processed through DimePay. The payment system has two parts:

PartPurposeWhere to Find It
DimePay WooCommerce PluginThis 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 SystemThis 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.

Important: If you change the DimePay Client Key or switch from sandbox to production in the WooCommerce plugin settings, it affects all payments on the site since the C2P system reads from those same settings.
How to Check Webhook Logs

Go to Pricing → Payments → Webhook Log tab. This shows all incoming webhook events from DimePay. Useful for debugging payment issues.

Stuck payments: The reconciler cron runs twice daily to check pending payments. Payments pending for 30+ minutes are queried against DimePay's API. Payments older than 7 days are auto-expired.

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

2. Providers submit bids

3. Seeker clicks “Accept Bid”

4. Seeker is redirected to DimePay payment page

5. Payment result

6. After successful payment, the following happens automatically:

7. If payment fails

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:

A disclaimer on the form reads: “Your verified account information will be used for this request. The details below are for the person the service is being requested for, if different from yourself.”

What happens immediately:

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:

3. Provider Responds with a Quote

The provider fills in:

Before submitting, the provider sees an escrow notice (customizable from admin settings): “When a client pays for your service, the funds are held securely by Connect To Pros. After you complete the work and the client confirms, your payout (minus X% processing fee) will be released to your bank account. Ensure your banking details are up to date.”

What happens:

4. Provider Edits Their Quote (Optional)

While the status is still “Responded”, the provider can edit:

5. Provider Declines the Request (Alternative)

The provider can decline with a predefined reason:

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:

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 ItemExample
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:

  1. 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.”
  2. 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.”
  3. Auto-decline notice: “Once accepted, other pending quotes for this service will be automatically declined.”

The seeker has two options:

8a. Accept & Pay Now

If payment completes:

If seeker cancels at payment page:

8b. Accept & Pay Later

9. What Happens If the Seeker Doesn’t Pay

Automatic reminders and timeout apply:

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.

11. After Payment — Booking Lifecycle

Once payment completes, a booking is created and visible in both dashboards:

Provider sees:

Seeker sees:

12. During the Work

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:

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:

15. Disputes

Either party can raise a dispute during an active booking. Admin manages disputes with:

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

EventProviderSeekerAdmin
Quote request submittedYesYes
Provider responds with quoteYes
Provider declines (with reason + optional referral)Yes
Provider edits their quoteYes
Seeker edits their requestYes
Seeker accepts (Pay Now or Pay Later)YesYes
Payment completedYesYes
Payment reminder (3 days)Yes
Payment final reminder (7 days)Yes
Quote auto-reverted (14 days)YesYes
Provider withdrawsYes
Booking progress updateYes
Provider marks work completeYes
Payout processedYes
New review submittedYesYes
Dispute raisedYes
Dispute resolvedYesYes

Pay Offline Option

A 4th payment option allowing seekers to handle payment directly with the provider, outside the platform.

How It Works

  1. Seeker clicks “Complete Transaction Offline” in the accept quote modal
  2. A disclaimer modal appears — seeker must read and check “I understand and accept these terms” before proceeding
  3. Quote status changes to Accepted Offline
  4. Provider receives email: “Client wants to pay offline — please confirm”
  5. Provider clicks Agree or Decline in their dashboard
  6. If agreed → booking created with payment_method = offline, no fees charged
  7. If declined → quote reverts to Responded, seeker notified to choose another option

Key Differences from Online Payment

FeatureOnline (Pay Now/Later)Offline
Service Fee10% added to seekerNone
Processing Fee3% from provider payoutNone
Payment ProtectionYes — funds held in escrowNo — direct between parties
Dispute ResolutionFull — refund/payout via adminLimited — mediation only
Auto-CompletionYes — after configurable daysNo — reminders only
ReviewsYesYes

Admin Settings

Go to Pricing → Payments → Settings tab:

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

  1. Seeker clicks “Escrow Service” in the accept quote modal (only visible when quote meets minimum threshold)
  2. Seeker defines milestones (minimum 3) — each with a title, description, and amount that must sum to the quote total
  3. Provider receives the proposal and can Accept, Counter (propose different milestones), or Reject
  4. Negotiation continues until both parties agree on milestones
  5. Seeker pays the full amount upfront (quote + service fee) — funds held by Connect To Pros
  6. Provider completes work milestone by milestone, clicking “Mark Done” after each
  7. Seeker confirms each milestone is satisfactory
  8. 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:

Admin Management

Go to Pricing → Escrow to manage escrow agreements:

Admin Settings

Go to Pricing → Payments → Settings tab:

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

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)

DayAction
Completion dateEmail to seeker: “Has your work been completed?”
+1 dayReminder: “Please confirm the work is complete”
+3 daysSecond reminder to seeker
+7 daysFinal warning: “If you don’t respond within 3 days, the work will be auto-confirmed and payment released”
+10 daysAuto-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

DayAction
Completion dateEmail to seeker: “Has your provider completed the work?”
+3 daysReminder: “Please confirm work completion and rate your provider”
+7 daysFinal 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:

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:

Processing Fee by Plan

The 3% processing fee only applies to Free plan providers. Silver, Gold, and Platinum plan providers pay 0% processing fee — this is a subscription benefit.
PlanProcessing Fee
Free3% (configurable)
Silver0%
Gold0%
Platinum0%

The payout breakdown in the provider dashboard shows “Processing Fee: $0.00 (Paid plan benefit)” for subscribers.

Fee Structure

FeeWho PaysDefaultConfigurable
Service FeeSeeker (added on top of quote)10%Yes
Processing FeeProvider (deducted from payout)3%Yes
Payment Processor FeeSeeker (added at checkout by DimePay)VariesSet by payment gateway

Example on a $1,000 quote:

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:

MessageWhere It Appears
Provider Payment Protection MessageProvider’s respond modal, provider emails, provider bookings
Seeker Payment Protection MessageSeeker’s accept modal, seeker emails, seeker bookings
Payment Processor Fee NoticeSeeker’s accept modal (before Pay Now button)
Offline DisclaimerOffline payment confirmation modal (seeker must accept before proceeding)
Escrow DescriptionEscrow Service proposal modal (explains how milestone payments work)

Available placeholders: {processing_fee_percent}, {service_fee_percent} — automatically populate with current configured percentages.

Note: The term “Payment Protection” is used throughout the platform for the standard escrow-style payment holding. The “Escrow Service” is a separate, milestone-based feature for large projects. Internal code references may still use “escrow” for backward compatibility, but all user-facing text shows “Payment Protection”.

Payment Statuses in Payment History

StatusMeaning
PendingPayment started but not yet completed
CompletedPayment went through successfully
FailedPayment was declined by the bank/card
CancelledSeeker cancelled at the payment page
Refund RequestedA refund has been requested

Jobs & Bidding System

Job Posting

Service seekers post jobs that providers can bid on.

FieldRequiredNotes
Job TitleYes
Job DescriptionYesFull project details
Budget MinYesDecimal
Budget MaxYesMust be greater than min
Job TypeNoOne-off, Ongoing, Part-time
TimelineNoUrgent, Within 1 week, Within 1 month, Flexible
RequirementsNoTextarea
Skills RequiredNoComma-separated
LocationNo
Deadline DateNoBidding 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

StatusMeaning
openAccepting bids from providers
in_progressBid accepted, work underway
completedWork finished and confirmed
cancelledJob cancelled by seeker

Bidding System

Providers submit bids on open jobs. Seekers view and accept/decline bids.

Bid Lifecycle

Provider submits bid Status: pending Seeker reviews Accepted / Declined

Auto-Bidding Platinum

Platinum providers can set up automatic bidding rules:

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

Seeker requests booking Provider notified Provider confirms/declines Seeker notified Booking completed

Booking Details

FieldDescription
Service TypeType of service requested
Booking DateRequested date for the service
Booking TimeRequested time slot
LocationService location
NotesAdditional notes from seeker

Email Notifications

Booking Reminders (Cron)

A daily cron job scans upcoming bookings and sends reminder emails to both parties before the booking date.

Dashboard Access

Quote System

Quote Requests

Seekers can request quotes directly from providers.

FieldRequired
Provider (who to request from)Yes
Service TypeYes
Project DescriptionYes
Budget RangeNo
TimelineNo

Quote Statuses

StatusMeaning
pendingAwaiting provider response
respondedProvider submitted their quote/price
acceptedSeeker accepted the quote
declinedSeeker declined the quote
completedService completed

Quote Comparison

Seekers can shortlist and compare quotes side-by-side. Features include:

Quote Feedback

When a seeker declines a quote, they can submit feedback with:

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)

Chat notifications are immediate (per-message), not batched. Each new message triggers an email to the recipient with a 100-character preview and a link to the conversation.

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

Broadcast Messages

Conversations Viewer

How to Send Messages

How to Send an Individual Message
  1. Go to WordPress Admin → Messaging
  2. In the Compose section, select Individual mode
  3. Start typing a user's name or email in the search box
  4. Click the user to add them as a recipient (add multiple if needed)
  5. Type your message
  6. Click Send Message
How to Send a Broadcast Message
  1. In the Compose section, select Broadcast mode
  2. Choose a group: All Users, Service Providers Only, Service Seekers Only, or Admins Only
  3. The recipient count updates automatically
  4. Type your message
  5. Click Send Broadcast

Each recipient gets their own conversation. There is a 30-second cooldown between broadcasts.

How to View & Reply to Conversations
  1. Scroll to the Conversations section on the same page
  2. Click a conversation on the left panel to view messages
  3. Type a reply in the text box and click Send
Note: Admin messages appear in the user's Messages tab as regular chat messages from the admin account. Users can reply normally.

Reviews & Ratings

Search & Discovery

The main search page is /explore-services/. It provides comprehensive filtering:

Available Filters

FilterDescription
Keyword SearchSearches contact name, business name, description, services offered, keywords
Parish/LocationDropdown from wp_c2p_parishes
IndustryDropdown from wp_c2p_industries
ServiceDropdown from wp_c2p_services (depends on industry)
Minimum Rating0-5 stars filter
Price RangeMin/max price
BadgesCheckboxes for provider badges
Registered OnlyShow only registered businesses
Only providers with 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:

Saved Providers

Seekers can save favorite providers for future reference.

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:

PagePurpose
DashboardOverview stats: active rows, total ads, hero status
HeroConfigure the top hero banner (image or video)
RowsCreate/edit layout rows that contain ads (name, sort order, active toggle)
AdsCreate/edit individual ads within rows

Hero Banner

Ad Types

TypeDescription
ImageSimple image ad
Text OverlayColored box with title, text, and CTA button
Image + Text OverlayBackground image with positioned overlay (9-point grid positioning)
VideoHTML5 video with optional poster

Ad Layout

Database Tables

How-To: Managing Just for You Content

How to Configure the Hero Banner
  1. Go to Just For You → Hero
  2. 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)
  3. Check Active to display the hero on the page
  4. Click Save
Only one hero record exists — saving always updates the existing one. Uncheck Active to hide the hero without deleting it.
How to Create a Layout Row
  1. Go to Just For You → Rows
  2. Fill in the form:
    FieldRequiredDescription
    Row NameNoDescriptive label (e.g. "Featured Services", "Popular Picks"). Used for admin reference only
    Sort OrderNoNumber controlling display order (lower = appears first). Default: 0
    ActiveNoCheckbox — uncheck to hide the row and all its ads. Default: checked
  3. Click Add Row
Important: You must create at least one row before you can add ads. Deleting a row also deletes all its ads.
How to Edit or Delete a Row

Edit:

  1. On the Rows page, click Edit next to the row
  2. Update the name, sort order, or active status
  3. Click Update Row

Delete:

  1. Click Delete next to the row and confirm
Warning: Deleting a row permanently removes ALL ads inside it. This cannot be undone.
How to Add an Ad
  1. Go to Just For You → Ads
  2. Select the Row this ad belongs to (dropdown of all existing rows)
  3. Choose an Ad Type (radio buttons):
    Ad TypeWhat You Need
    Image OnlyUpload an image. Optionally make it clickable
    Text OverlayColoured box with title, body text, and optional CTA button. No image needed
    Image + Text OverlayBackground image with text positioned over it (9-point positioning)
    VideoMP4 video URL and optional poster image
  4. 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)
  5. 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
  6. Optionally set a Link URL to make the entire ad clickable (choose Same Window or New Tab)
  7. Set Sort Order (lower = appears first within the row)
  8. Check Active
  9. Click Add Ad
How to Edit or Delete an Ad

Edit:

  1. On the Ads page, find the ad in its row group and click Edit
  2. The form populates with the ad's current values
  3. You can change the ad type — irrelevant fields are automatically hidden
  4. Click Update Ad

Delete:

  1. Click Delete next to the ad and confirm
No scheduling: Ads are either active or inactive. There is no date-based scheduling. To temporarily hide content, uncheck the Active checkbox on the ad or its row.

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:

Event Tracking

The analytics tracker automatically records these events:

CategoryEvents Tracked
Page ViewsAll page types categorized (homepage, search, dashboards, profiles, pricing, etc.)
User EventsLogins, registrations (with role and source)
Provider EventsProfile views (with viewer info)
Quote EventsQuote requests (with budget), quote responses (with response time)
Bid EventsBids submitted (with amount, auto-bid flag)
Booking EventsBookings created (with service type, value)
Subscription EventsCreated, cancelled (with reason), upgraded (from/to plan), renewed
Search EventsSearch queries (with filters: industry, service, location, rating, price)
Message EventsMessages sent (with conversation ID, sender type)
Review EventsReviews submitted (with rating)

Frontend Tracking

Conversion Funnel

The dashboard includes a 4-stage conversion funnel:

Homepage Visit Search Provider Profile View Quote Request

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

How to View Reports
  1. Go to WordPress Admin → Analytics
  2. Use the period selector buttons (7 Days, 30 Days, 90 Days, 1 Year) to change the time range
  3. Review KPI cards: Users, Providers, Quote Requests, MRR
  4. Toggle between chart types using the buttons above the main chart (Users / Pageviews / Quotes)
How to Export Data
  1. On the Analytics dashboard, click the Export dropdown button
  2. Choose a report type: Users, Pageviews, Quotes, Top Providers, or Search Terms
  3. 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:

What's on the Real-Time tab

What's on the Monthly Reports tab

🆕 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.

🆕 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:

SurfaceTag / Query
Explore Services (initial load)real ?search= term
Explore Services (AJAX pagination/filter)real query
Legacy Provider Searchreal query
WordPress search (?s=)real query
Homepage Featured Providershomepage_featured
[c2p_featured_providers] shortcodeshortcode_featured_providers
[c2p_providers_by_industry] shortcodeshortcode_providers_by_industry
[c2p_all_providers] shortcode targetfrontend_list
Providers list templateproviders_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).

🆕 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):

  1. Read raw IP from proxy-aware headers (HTTP_CLIENT_IP → HTTP_X_FORWARDED_FOR → REMOTE_ADDR). Used in-memory only, never persisted.
  2. Skip private / reserved ranges (localhost, LAN, etc.) to save API quota
  3. Check transient cache keyed by hashed IP (never the raw IP) — 7-day TTL
  4. On cache miss: call http://ip-api.com/json/ with a 2-second timeout
  5. Store country/region/city in the profile_views row; cache for 7 days
  6. On failure: 30-minute negative cache, view row inserted without geo (NULL columns)

Device/Browser parsing (see c2p_parse_user_agent()):

Privacy note: raw IPs are never stored. Only the SHA-256 hash (existing behavior) and the derived geo fields (country, region, city) are persisted. Pre-existing rows from before this feature shipped show as "Unknown" in the aggregations — can't backfill geo since raw IPs were never saved. Device + browser CAN be backfilled from the stored 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:

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:

Each notification type has:

Provider Notifications (21)

NotificationRecipientTrigger
Registration ConfirmationProviderAccount created
Admin NotificationAdminNew provider registers
ApprovalProviderAdmin approves account
RejectionProviderAdmin rejects account
PendingProviderStatus set to pending
Bid SubmittedProviderProvider submits bid
Bid AcceptedProviderSeeker accepts bid
Bid RejectedProviderSeeker rejects bid
Chat MessageProviderNew message received
Job CancelledProviderSeeker cancels job (all bidding providers notified)
Quote AcceptedProviderSeeker accepts quote
Quote DeclinedProviderSeeker declines quote
Auto-Bid SubmittedProviderAuto-bid rule matched a new job
Job MatchingProviderNew job matches provider's criteria
Quote Request ReceivedProviderSeeker requests a quote from provider
Job UpdateProviderSeeker updates job details after bids
Admin Provider WelcomeProviderAdmin creates provider account manually
Booking ReminderProviderUpcoming booking reminder (cron)
Job Deadline ReminderProviderJob bidding deadline approaching (cron)
Quote Request ReminderProviderPending quote needs response (cron)
Monthly Performance ReportProviderMonthly summary of profile views, quotes, bids, reviews (cron)

Seeker Notifications (11)

NotificationRecipientTrigger
Registration WelcomeSeekerAccount created
Job Posted ConfirmationSeekerJob submitted
New Bid ReceivedSeekerProvider bids on seeker's job
Bid Accepted ConfirmationSeekerSeeker accepts a bid
Bid Rejected ConfirmationSeekerSeeker rejects a bid
Quote Request ConfirmationSeekerQuote request submitted
Job CompletedSeekerProvider marks job completed
Review ConfirmationSeekerReview submitted successfully
Auto-Account WelcomeSeekerAccount auto-created when seeker contacts provider from profile page
Admin Password ChangeSeekerAdmin changes seeker's password
Booking ReminderSeekerUpcoming booking reminder (cron)

Booking Notifications (3)

NotificationRecipientTrigger
Booking Confirmation (Provider)ProviderNew booking request received
Booking Confirmation (Seeker)SeekerBooking confirmed with provider details
Booking Status ChangeSeekerProvider accepts, declines, or updates booking

Payment & Subscription Notifications (11)

Email TypeTrigger
Payment ConfirmationPayment completed, account upgraded
Payment FailedPayment attempt failed
Subscription CancelledUser cancels subscription
Subscription ExpiredPlan expired, downgraded to Free
Subscription RenewedAuto-renewal successful
Expiring SoonWarning at 7/3/1 days before expiry
Grace PeriodEntered grace period after expiry
Grace Period FinalFinal warning before downgrade
Password Expiry WarningPassword expiring in 30 or 7 days
Payment ReceiptDetailed receipt with transaction ID and amount
Plan Upgrade ConfirmationUser upgraded plan tier

Contact & General Notifications (2)

Email TypeRecipientTrigger
Contact Form → AdminAdminUser submits contact form (includes all form fields)
Contact Form → User ConfirmationUserConfirmation that contact form was received

Notification Admin Settings

Global Email Settings

SettingDefault
From NameConnect To Pros
From Emailnoreply@[your-domain]
Admin Notification EmailWordPress admin email
Test Email AddressWordPress admin email

Email Placeholders

80+ placeholders are available for use in email templates. Organized by category:

Common Placeholders
PlaceholderValue
{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 & Bid Placeholders
{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 Placeholders
{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
Payment Placeholders
{amount}Payment amount
{transaction_id}Transaction reference
{plan_name}Subscription plan name
{expires_date}Expiration date
{date}Transaction date
Performance Report Placeholders
{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
Contact & Quote Request Placeholders
{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

How to Customize an Email Template
  1. Go to WordPress Admin → Notifications
  2. Click the appropriate tab (Service Provider, Service Seeker, etc.)
  3. Find the notification type you want to edit
  4. Edit the Subject field (supports placeholders like {contact_name})
  5. Edit the Message textarea (HTML is supported — the template uses branded HTML with logo and styling)
  6. Click Preview to see how the email will look
  7. Click Save Settings at the bottom of the tab
Tip: Use wysiwyghtml.com to visually edit HTML templates. Copy the template, edit visually, then paste back.
How to Disable a Notification
  1. Go to Notifications and find the notification type
  2. Uncheck the Enable checkbox for that notification
  3. Click Save Settings

The template is preserved but emails will not be sent. Re-enable at any time.

How to Test an Email
  1. Go to Notifications → Email Settings tab
  2. Enter a Test Email Address
  3. Click the Test Email tab
  4. Choose a notification type from the dropdown
  5. Click Send Test Email
  6. Check the inbox for the test email with sample placeholder data
How to Reset a Template to Default
  1. Find the notification type on its tab
  2. Click the Reset button next to the message textarea
  3. The original branded HTML template will be restored
  4. Click Save Settings
How to Change the From Name/Email
  1. Go to Notifications → Email Settings tab
  2. Edit From Name (default: "Connect To Pros") and From Email
  3. Set the Admin Notification Email (receives admin-targeted emails like new registrations)
  4. Click Save Settings

Email Delivery (ElasticMail SMTP)

All emails are sent through ElasticMail SMTP, configured in the theme.

SMTP Settings

SettingDefault Value
Hostsmtp.elasticemail.com
Port587 (TLS)
SecurityTLS
Usernameadmin@connecttopros.com
From Emailadmin@connecttopros.com
From NameConnect to Pros

How to Test Email Delivery

Test SMTP Connection
  1. The quickest way to test is via Notifications → Test Email tab
  2. Enter a test email address and send a test notification
  3. Check the inbox for the branded HTML email
  4. If it fails, check the PHP error_log — all SMTP operations are logged in detail
Important Technical Notes
  • ElasticMail intercepts ALL wp_mail() calls via the pre_wp_mail filter — 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.php and seeded to c2p_smtp_settings option on first load — there is no admin UI to change them
  • To change SMTP credentials, edit elasticmail-integration.php or update the c2p_smtp_settings option directly in the database
If emails go to spam: Verify that SPF and DKIM records are correctly configured for your domain in ElasticMail and your DNS settings.

Contact Form

The contact page at /contact/ includes a form with:

FieldRequired
First NameYes
Last NameYes
EmailYes
PhoneNo
Inquiry TypeYes (General, Support, Becoming a Pro, Billing, Partnership, Feedback, Other)
MessageYes
Consent CheckboxYes

What Happens on Submission

  1. Form data validated and saved to wp_contact_submissions table
  2. Admin receives branded HTML email with full contact details and Reply-To header
  3. User receives confirmation email acknowledging receipt
  4. Submission tracked with status (new/resolved) and admin notes

How to Manage the Contact Page

How to Edit Contact Page Content
  1. Go to Contact Form → Settings
  2. Edit: phone number, email address, location, business hours, response time, appointment note
  3. Edit social media URLs: Facebook, Twitter, Instagram, LinkedIn, YouTube
  4. Edit quick help links: FAQ URL, Pricing URL, Blog URL, Support URL
  5. Toggle visibility for any section (show/hide phone, email, social media, business hours, etc.)
  6. Customize section titles and icons
  7. Click Save Settings

All settings are stored as post_meta on the Contact page.

How to View Contact Form Submissions
  1. Go to Contact Form → All Submissions
  2. Stats bar shows: Total Submissions, New, This Month
  3. Filter by status: New, In Progress, Completed, Spam
  4. Click View to see full submission details in a modal
  5. Click Edit to change status (New/In Progress/Completed/Spam) and add admin notes

Homepage

The homepage (front-page.php) has 8 sections:

  1. Hero Section — Headline, subtitle, search box. Customizable via WordPress Customizer (c2p_hero_title, c2p_hero_subtitle, c2p_hero_image). Search redirects to /explore-services/.
  2. Services Carousel — Dynamic slides. Customizable title and description via Customizer.
  3. Browse by Services — Grid of 6 service cards with provider counts.
  4. Browse by Location — 14 parish buttons with provider counts.
  5. Featured Providers — 6 premium providers with plan badges (Platinum, Gold, Silver).
  6. Browse by Industry — 9 industry category cards.
  7. Top Navigation Bar — Language selector, seeker/provider dropdown menus, user menu.
  8. Main Navbar — Logo, primary menu, "Just for You" button.
Featured providers on the homepage are determined by the is_featured_front flag in the wp_c2p_providers table and the provider's plan tier.

How to Edit the Homepage

Change Hero Text & Image
  1. Go to Appearance → Customize → Home Page Content
  2. Edit c2p_hero_title, c2p_hero_subtitle, and c2p_hero_image
  3. Click Publish to save
Manage Carousel Slides
  1. Go to WordPress Admin → C2P Carousel Manager
  2. Each slide has: title, subtitle, button text, button URL, image
  3. To add a slide: fill in the "Add New Slide" form and click Add Slide
  4. To reorder: change the Sort Order number (lower = first)
  5. To hide a slide: uncheck Active
  6. To delete: click Delete next to the slide

The Services Button (text and URL) is configured at the bottom of this same page.

Edit Section Headings & Descriptions

All section headings (Browse by Services, Browse by Location, etc.) are editable via:

  1. Go to Appearance → Customize → Home Page Content
  2. Each section has: subtitle, title, and description fields
  3. Click Publish to save
What Requires Code Changes
The following are NOT editable from admin and require editing 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/)

All Articles (/blog-articles/all-articles/)

Single Post

How to Manage Blog Content

How to Create & Edit Blog Posts

Blog posts use the standard WordPress Posts → All Posts editor. No special plugin required.

How to Feature a Blog Post
  1. Go to Posts → Edit Post
  2. Scroll down to Custom Fields (if not visible, enable via Screen Options at the top of the page)
  3. Add a custom field: Name = featured_article, Value = yes
  4. Click Update

Up to 3 featured posts appear in the blog homepage hero section. Priority: featured_article meta → sticky posts → latest.

Blog Category Icons

Category icons appear on the blog homepage alongside each category name. The current categories and their icons are:

CategoryIcon
Service ProvidersPeople icon
Service SeekersLightbulb icon
Industry TrendsChart icon
Tips & TricksMagic wand icon
NewsNewspaper icon
GuidesBook icon
Any new categoryFolder icon (default)

To change or add category icons, a developer will need to update the icon mappings in the blog template code.

Recommended Image Sizes for Blog Posts

When uploading images for blog posts, use the following recommended sizes for the best results:

Image TypeRecommended SizeNotes
Featured Image1920 × 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 Thumbnail800 × 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 Images1200 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.
Tip: Always set a Featured Image for every blog post. Posts without a featured image will display a gradient placeholder instead, which is less visually appealing to readers.

How to set a Featured Image:

  1. Go to Posts → Edit Post
  2. In the right sidebar, look for the Featured Image panel
  3. Click Set featured image and upload or select an image from the Media Library
  4. Click Update to save
Newsletter Signup (Elastic Email)

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

  1. Log in to your Elastic Email account at elasticemail.com
  2. Go to Contacts to view, export, or manage your subscriber list
  3. Use Campaigns to send newsletters or promotional emails to your subscribers
  4. 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
Note: The form is embedded using a unique ID linked to your Elastic Email account. If you need to change which form is displayed or connect a different Elastic Email account, a developer will need to update the embed code.

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

How to Edit the About Page
  1. Go to Pages → About → Edit
  2. Scroll below the main editor to the ACF fields section
  3. 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)
  4. Blog Widget and Custom Widget sections can be enabled/disabled
  5. CTA buttons have customizable text and URLs
  6. Click Update to save
Requires ACF Pro plugin to be active. The field definitions are in 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

TabAudienceContent
Looking for a ProService Seekers6-step guide: Create Account → Search & Compare → Request Quote → Chat → Hire → Leave Review. CTA: Sign Up Free
I'm a Service ProviderProviders6-step guide: Register → Get Approved → Choose Plan → Receive Requests → Showcase Work → Build Reputation. CTAs: Register + View Plans
Just BrowsingVisitors4 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

Help Article Categories (5 categories, 5 articles each)

CategoryTopics
Getting StartedAccount creation, profile setup, finding providers, posting jobs, understanding ratings
Quotes & JobsRequesting quotes, bidding process, accepting/declining, managing postings, marking complete
Payments & BillingSubscription plans, how payments work, updating payment, cancellation, refunds
Account & SettingsPassword changes, profile updates, notifications, photos, account deletion
Safety & TrustHow 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

  1. 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.
  2. 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.
  3. Admin review: Submitted disputes appear in the admin area under Dispute Management. The admin can view all open, in-progress, and resolved/closed disputes.
  4. 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.

Viewing & Filtering Disputes

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.

Dispute Form (Cognito Forms)

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
Important: Do not rename or remove these fields in Cognito Forms, as they are pre-filled automatically from the platform: DisputeType, ReferenceID, Role, SubmittedBy. Changing these field names will break the pre-fill functionality and require a developer to update the integration.
How Disputes Are Linked to Jobs & Bookings

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

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:

Once a review has been submitted, the button is replaced with a green “Reviewed” badge. Each job or booking can only be reviewed once.

What Happens When a Review Is Submitted
  1. The seeker clicks “Leave Review” — a modal pops up asking for a 1–5 star rating and a written review
  2. 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
  3. The review is saved to the database with status “Approved” (immediately visible)
  4. The provider’s average rating and review count are automatically recalculated
  5. An email notification is sent to the provider with the rating, reviewer name, and review text
  6. A confirmation email is sent to the seeker
  7. The page reloads and the review button is replaced with the “Reviewed” badge
How Providers See and Respond to Reviews

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
Where Reviews Appear
  • 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
Admin: Managing Reviews

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_response and provider_response_at columns)
Important: If you manually delete a review, you should also recalculate the provider’s average rating in the 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.

How to Manage Policies
  1. Go to Policy Mgmt → All Policies
  2. Click Add New to create a new policy
  3. Each policy has: Title, Slug (URL), Content (WYSIWYG editor), Status (Draft/Published), Sort Order
  4. Drag and drop to reorder policies on the list page
  5. Published policies are accessible at /policies/{slug}/
Policies are managed by the C2P Policy Manager plugin (separate from the theme). The plugin must be active for the admin pages to appear.

Password Expiry System

Passwords expire after 12 months. The system includes automatic warnings and forced reset on login.

How It Works

  1. Every password change is tracked in user meta (c2p_password_last_changed)
  2. A daily cron job checks all providers and seekers for upcoming expiry
  3. 30 days before: Warning email sent
  4. 7 days before: Urgent warning email sent
  5. On login with expired password: User is redirected to /forgot-password/?expired=1
  6. After resetting password, warning flags are cleared and the cycle restarts

Password Change Tracking

Password changes are tracked in these scenarios:

Security Notes

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
Note: The main theme file is functions.php. For better organization, new features should go in separate files in /inc/ where possible.

Database Tables

Provider Tables (wp_c2p_ prefix)

TablePurpose
wp_c2p_providersProvider profiles (business info, services, ratings, approval status). Includes whatsapp_number (April 2026).
wp_c2p_industriesIndustry categories (Plumbing, Electrical, etc.)
wp_c2p_servicesService sub-categories (within industries)
wp_c2p_badgesProvider badges/certifications
wp_c2p_parishesParishes (administrative divisions)
wp_c2p_communitiesCommunities within parishes
wp_c2p_neighbourhoodsNeighbourhoods
wp_c2p_provider_reviewsCustomer reviews and ratings
wp_c2p_provider_shop_itemsProvider shop items/products
wp_c2p_id_mappingOld external DB ID to new WP ID mapping

Service Seeker & Job Tables (wp_ prefix)

wp_service_seekersSeeker profiles
wp_job_postingsJob listings
wp_job_bidsBids on jobs
wp_quote_requestsQuote request submissions
wp_quote_feedbackFeedback on declined quotes
wp_quote_comparisonsSaved quote comparison sets
wp_saved_providersSeeker's favorite providers
wp_service_paymentsLegacy payment records

Payment Tables

wp_c2p_paymentsAll payment transactions (DimePay)
wp_c2p_subscriptionsSubscription records

Booking & Job Feature Tables

wp_instant_bookingsInstant booking requests (Silver+ feature)
wp_auto_bid_settingsAuto-bid configuration (Platinum)
wp_auto_bid_logAuto-bid activity log
wp_job_matching_settingsJob matching preferences (Platinum)
wp_job_matchesJob match results

Communication Tables

wp_sb_chat_conversationChat conversations (SB Chat plugin)
wp_sb_chat_messagesChat messages (SB Chat plugin)
wp_contact_submissionsContact form submissions

Analytics Tables

wp_c2p_analytics_eventsAnalytics event tracking (page views, actions, conversions)
wp_c2p_analytics_dailyAggregated daily analytics
wp_c2p_profile_viewsPer-provider profile view log. Now includes country_code, country_name, region_name, city, device_type, browser (April 2026)
wp_c2p_contact_clicksPhone/Email/WhatsApp/Website contact CTA clicks. 5-min IP dedup.
wp_c2p_search_appearancesEvery 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_reportsMonthly 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_heroHero banner configuration (image or video)
wp_c2p_just_for_you_rowsLayout rows that contain ads
wp_c2p_just_for_you_adsIndividual ad records (image, text overlay, video)

Other Tables

wp_provider_photosProvider photo gallery
wp_newsletter_subscribersBlog newsletter subscribers

Key User Meta

Meta KeyPurpose
c2p_plan_nameCurrent plan: Free, Silver, Gold, Platinum
c2p_plan_statusactive, cancelled, expired, past_due, grace_period
c2p_plan_expiresExpiration datetime
c2p_billing_periodmonthly or annual
c2p_last_payment_dateLast successful payment
c2p_password_last_changedPassword change tracking (12-month expiry)
c2p_password_expiry_warned_30d30-day warning sent flag
c2p_password_expiry_warned_7d7-day warning sent flag
c2p_grace_period_startGrace period start timestamp
c2p_dunning_emails_sentTracking 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

FilePurpose
/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:

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

  1. A photo is uploaded to WordPress (via admin, provider dashboard, or media library)
  2. WordPress stores it locally in /wp-content/uploads/
  3. Leopard automatically copies the file to the Wasabi S3 bucket
  4. Leopard rewrites the URL so the image is served from Wasabi instead of the local server
  5. This reduces server storage and bandwidth usage

Plugin: Leopard – WordPress Offload Media

SettingValue
PluginLeopard – WordPress Offload Media v4.0.5 (by Nouthemes)
Storage ProviderWasabi S3
Admin LocationWordPress Admin → Leopard Offload Media
Settings Option Keyleopard_offload_media_settings
How to Access Leopard Settings
  1. Go to WordPress Admin → Leopard Offload Media
  2. 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
How to Verify Storage Is Working
  1. Go to Leopard Offload Media → System Status
  2. Verify the connection status shows as connected
  3. Upload a test image via Media → Add New
  4. 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
How to Change Wasabi Credentials
  1. Go to Leopard Offload Media → Storage Settings
  2. Update the Access Key, Secret Key, Region, and Endpoint as needed
  3. Click Save and verify the connection
Do not change the bucket name without migrating existing files first. Changing the bucket will break URLs for all previously uploaded media.
Important Notes
  • 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.

How to Access Backuply
  1. Go to WordPress Admin → Backuply
  2. The dashboard shows backup history, status, and quick-action buttons
How to Create a Manual Backup
  1. Go to Backuply in the WordPress admin
  2. Click Backup Now (or equivalent button)
  3. Select what to back up: Files, Database, or Both
  4. The backup runs in the background. Check progress on the Backuply dashboard
  5. Completed backups are stored in /wp-content/backuply/ (or a configured remote location)
How to Set Up Scheduled Backups
  1. Go to Backuply → Settings (or the scheduling section)
  2. Configure the backup schedule:
    • Available intervals: every 30 min, hourly, every 2 hours, daily, weekly, monthly
    • Choose what to include: files, database, or both
  3. Optionally configure a remote backup location (cloud storage) for off-site backups
  4. Save the schedule
Backuply uses WordPress Cron for scheduling. Ensure WP-Cron is running reliably (or use a server-level cron job pointing to wp-cron.php).
How to Restore from a Backup
  1. Go to Backuply and find the backup you want to restore
  2. Click Restore
  3. Follow the prompts to confirm the restoration
Warning: Restoring a backup will overwrite current files and/or database. Always create a fresh backup before restoring an older one.
Backup Exclusions

Files and directories can be excluded from backups to reduce size and time:

  • Configured via backuply_excludes option 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

PluginStatusWhere to Find ItWhat It Does
W3 Total CacheInstalled & ActiveWP Admin → PerformanceSpeeds up the site by saving copies of pages, images, and files so they load faster for visitors
JetpackInstalled, cache features disabledWP Admin → Jetpack → SettingsHas 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):

  1. While logged in as an admin, look at the black bar at the top of any page
  2. Hover over "Performance"
  3. Click "Purge All Caches"

Option 2 — From the dashboard:

  1. Go to WP Admin → Performance → Dashboard
  2. 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:

Important: If features like the provider dashboard, booking system, or search filters stop working properly after changing W3 Total Cache settings, clear all caches and contact your developer. Some pages need special settings to work correctly with caching.

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.

BrowserWindowsMac
Chrome / Edge / BraveCtrl + Shift + RCmd + Shift + R
FirefoxCtrl + Shift + RCmd + Shift + R
SafariCmd + Option + R
How to Fully Clear Browser Cache (all pages, not just the current one)

If a hard refresh doesn't work, clear your entire browser cache:

  1. Chrome / Edge: Press Ctrl + Shift + Delete (Windows) or Cmd + Shift + Delete (Mac)
  2. Tick "Cached images and files" (you can leave cookies and history unchecked)
  3. Set time range to "All time"
  4. 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.

  1. Hard refresh the pageCtrl + Shift + R (Windows) or Cmd + Shift + R (Mac). This fixes most issues.
  2. Clear the W3 Total Cache — admin bar → Performance → Purge All Caches. Then hard refresh again.
  3. 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).
  4. Clear your full browser cacheCtrl + Shift + Delete → clear cached images and files.
  5. Wait 5–10 minutes — some server-side caches expire automatically. If steps 1–4 didn't help, wait a few minutes and try again.
  6. 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.).
When to do this: After updating page content, changing theme/plugin settings, updating plugins, or any time a page looks "stale" or outdated.
Jetpack Performance Features (Currently Disabled)

Jetpack has speed and performance features (image optimization, lazy loading, etc.) but they are currently turned off. If you want to enable them:

  1. Go to WP Admin → Jetpack → Settings
  2. Look for the Performance section
  3. Toggle on the features you want
Warning: Running both W3 Total Cache and Jetpack's performance features at the same time can cause conflicts. If you enable Jetpack performance features and things break, turn them back off and clear the W3 Total Cache.
For Developers: Server-Side Cache Details

This section is for developers/technical staff only.

Cache LayerWhat It CachesHow to Clear
W3 Total CachePage cache, database queries, object cache, minified CSS/JSWP Admin → Performance → Dashboard → "empty all caches"
PHP OPcacheCompiled PHP files — automatically detects file changes in most casesRestart the web server, or ask your hosting provider to clear OPcache
WordPress TransientsTemporary 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 CacheS3/Wasabi file listings for media offloadingWP Admin → Leopard plugin settings

Troubleshooting

Email Issues

ProblemSolution
Emails not sendingCheck SMTP credentials at Admin → Tools → ElasticMail Test. Verify connection and send test email.
Emails in spamCheck SPF/DKIM DNS records for domain. Verify From address is approved in ElasticMail.
Notification not triggeringCheck if notification is enabled in Admin → Notifications. Verify subject/message not empty.
Placeholder not replacedCheck placeholder spelling (case-sensitive with braces). Preview email to test.

Payment Issues

ProblemSolution
Payment stuck "pending"Reconciler runs 2x daily. Or manually mark complete in admin. Check webhook logs.
User not upgraded after paymentCheck error logs. Manually run c2p_upgrade_user_account() if needed.
DimePay API errorsVerify API keys in Payment Settings. Test connection from admin.
Double chargingEnsure webhook_secret is set for signature verification.

Provider Issues

ProblemSolution
Provider not in searchCheck approval_status is 'approved' in wp_c2p_providers.
Dashboard tab lockedCheck provider's plan. Premium tabs require Silver+ plans.
Photos not uploadingCheck photo limits for plan. Verify file type (images only, <5MB).

Seeker Issues

ProblemSolution
Jobs not appearingCheck wp_job_postings status field is 'open'.
Quotes not showingVerify seeker_id matches wp_users.ID.
Messages not loadingVerify SB Chat plugin is active and tables exist.

General

ProblemSolution
Password expired redirect loopCheck c2p_password_last_changed user meta. Update to current date.
Grace period not workingVerify dunning manager is loaded and cron is scheduled.
Functions not availableEnsure 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)