Troubleshooting¶
Symptoms in the order they tend to come up, with the check that settles each one quickly.
Email¶
Nothing sends at all¶
Work down this list; it is almost always the first item.
- Is From Email set? Club Management → Settings → Email defaults. The plugin refuses to send until it has one, and it must be an address your provider will send as.
- Is logging-only mode still on? Same screen. In logging-only mode every email is recorded in the Email Log and redirected to a single test address. The log will look busy and healthy while no parent has received anything.
- Does a test send work? Settings → Send test email. Save the settings first — the test uses what is stored, not what is on screen.
- Is WP-Cron running? Bulk sends are queued and drained in the background. On a site with
DISABLE_WP_CRONset and no real cron job, mail queues and never leaves.
Bulk sends queue but never arrive¶
The queue is drained by a scheduled job. If the site has WP-Cron disabled without a system cron replacing it, nothing drains it.
# What is scheduled, and when it is next due
wp cron event list | grep cpm
# Force the queue to drain now
wp cron event run cpm_process_email_queue
The right fix is a real cron job hitting wp-cron.php every few minutes. Processed queue rows are
pruned after three days, so an old backlog will not be sitting there to inspect.
Emails send but bounce¶
Club Management → Settings → Email Log records every send, and — if you are on Elastic Email with the feedback webhook configured — every bounce and spam complaint reported afterwards. A bounced address also raises an Undelivered warning against the season registration rows it affects, which is how you tell "the parent is ignoring us" apart from "we have the wrong address".
If bounces never appear, the webhook is not wired up: paste the URL from Settings → Email sending into Elastic Email under Settings → Notifications, and enable Bounce/Error and Complaints.
A parent says they never got their season link¶
In order of likelihood: the address on the guardian record is wrong (check the Email Log for a
bounce), the mail is in their spam folder, or they have it and did not recognise it. Rather than
resending blind, point them at the page carrying [cpm_registration_request] — they can request a
fresh link themselves, by email address or by the child's FA Number and date of birth.
Access¶
A team secretary cannot see their squad¶
The link between a squad and its secretary is the email address, not a WordPress role. Three things all have to be true:
- The person has a WordPress account on the site.
- That account's email exactly matches the Team secretary field on the squad.
- They are signed in as that account.
The address is stored lower-cased and compared that way, so capitalisation is not the problem — a different address is. Check the squad's detail page, and check the account's email under Users.
A club admin cannot see Payments or Settings¶
Club admins are granted on Club Management → Settings → Club Admins, and the account has to exist first. Any WordPress administrator is a club admin automatically; anyone else needs adding explicitly. Team secretaries never see Seasons, Settings, Payments, Guardians, Import or the club-wide email screens — that is by design, not a permissions fault.
Players and importing¶
The import did not place a child in a squad¶
Squad placement comes from the date-of-birth range on each squad. A child whose date of birth falls outside every range, or inside two, cannot be placed automatically. Fix the ranges on Club Management → Squads and the placement follows.
The import created a second copy of a player¶
Players are keyed on FA Number, so a re-import updates the existing record. A duplicate means the two rows carry different FA Numbers — usually because one was added by hand before the FA report caught up, or the child appears in the report twice with a corrected number.
Club Management → Find duplicates surfaces likely pairs and merges them. Merge before payment history accumulates against both records.
A child left the club and keeps reappearing¶
Mark them as having left the club on their player page rather than deleting them. A delete only lasts until the next FA report import puts them back.
Payments¶
A player is stuck at "awaiting bank"¶
That status means the guardian has done their part and GoCardless has not yet confirmed. It resolves on its own — unless the plugin is not hearing from GoCardless at all, which looks identical.
Check Club Management → Payments → Settings: the GoCardless webhook URL shown there
(/wp-json/cpm/v1/gc-webhook) has to be registered in the GoCardless dashboard, and the site has
to be reachable over HTTPS from the public internet. If every player is stuck rather than one, the
webhook is the cause.
The plugin keeps a searchable log of every webhook event it has received. An empty log confirms it.
A setup link was sent and nothing happened¶
Payments → Who has not set up lists exactly this, and can chase them. Bear in mind a setup link goes to the payment contact on the player's guardians — if that is set to a guardian who does not deal with the money, the link is arriving at the wrong parent. Check it on the guardian record.
The figures do not match GoCardless¶
The Payments screens include a reconciliation view for exactly this. Offline payments recorded in the plugin will never appear in GoCardless, which accounts for most differences.
Public pages¶
The registration page shows the request form instead¶
That is the intended fallback: someone reached the page without a valid link, or their 24-hour self-service link has expired. It exists so a parent hits a way forward rather than a dead end.
The sign-up form emails nobody¶
Three addresses are involved, configured on Club Management → Edit Emails: the club secretary, the matching squad's secretary, and a fallback for a child matching no squad. The fallback is disabled by leaving its address blank — which is easy to do accidentally and then wonder why out-of-range sign-ups are silent.
A shortcode renders as text¶
The shortcode is on a page WordPress is not running shortcodes on — usually a block or template that outputs raw content. Put it in an ordinary paragraph or a shortcode block on a normal page.
English FA¶
A sync imports nothing¶
The Test source panel on the team's screen names which of the three stages failed: fetching
the URL, finding the match table in the returned HTML, or reading rows out of it. Only thefa.com
is fetched — the URL field causes your server to make a request, so the host is checked against an
allowlist first.
Full-Time page URLs and Code Snippet URLs both work; see English FA for how to get either.
Fixtures stopped updating¶
Syncing is a scheduled job. Same check as the email queue:
Club Mailer¶
The connect button is missing from a member's profile¶
Members are only offered a provider the site admin has configured. Fill in the Entra or Google credentials on Settings → Club Mailer and the button appears.
The provider rejects the redirect URI¶
Both causes are environmental rather than plugin faults:
- Pretty permalinks are off. The redirect URI is a clean, query-free URL. Set Settings → Permalinks to anything but "Plain".
- The site is on
http://. Entra and Google both refuse a non-HTTPS redirect URI for a web app; barelocalhostis the only exception.
The settings screen prints the exact URI each provider needs pasted into it. Paste it, do not retype it.
Still stuck¶
The User guide covers every screen in detail, and most screens explain their own edge cases in place — the payments section in particular spends a lot of words on states that look wrong and are not.