End-to-end recovery: 4th break of the BSP contact form. Root cause was the Apr 16 mu-plugin writer (snippet #92). This playbook walks Robert through the surgical fix with every step in order, tells Hostinger exactly what to restore, and lists the 13 safe-to-delete snippets to clean up the churn stack.
bsp-form-move.php to /wp-content/mu-plugins/ AND dual-registers the [bsp_contact_form] shortcode โ conflicting with snippet #86. Each page load triggers the fatal when the shortcode fires./wp-content/mu-plugins/ entire folder via File Manager. This nukes both the bad file AND Hostinger's own hostinger-auto-update.php.bsp-form-move.php is present on disk (restored as part of backup). 500 persists.bsp-form-move.php file (only โ leave other mu-plugin files alone). Then purge LiteSpeed + Cloudflare.[bsp_contact_form] shortcode registration from snippet #86, and the mu-plugin persistence outlives the Code Snippets UI toggle. Every page containing [bsp_contact_form] (i.e. contact-us + coupons) triggered the fatal.
bsp-form-move.php from diskSnippet #92 already deleted โ. But the mu-plugin file it wrote is still on disk (Hostinger restored it as part of the folder backup). This file auto-loads before every request and triggers the 500.
Where: hPanel โ File Manager โ /public_html/wp-content/mu-plugins/
Delete ONLY: bsp-form-move.php
KEEP: hostinger-auto-update.php (Hostinger just restored this โ needed for managed updates) + any other Hostinger-managed file
Why this works now: snippet #92 is already deleted, so nothing will recreate the file after you remove it this time.
Both caches persist the 500 response for ~5 min. Without purge, you'll continue to see 500 even after the file is gone.
Open in incognito / with cache disabled:
https://www.callbrightside.com/contact-us/ โ expect 200 OK, form rendershttps://www.callbrightside.com/coupons/ โ expect 200 OKTest form submission. Confirm ST booking fires (snippet #82 should catch it).
If still 500 after purge: snippet #85 or #86 is the next suspect. Deactivate #85 first (JS-only mover, lowest functional impact). If still 500, carefully review #86 shortcode with Oxygen builder โ the page might need a different shortcode or direct [forminator_form id="290"].
Once the site is stable, clean the snippet churn. Select these 13 in wp-admin โ Code Snippets โ Bulk Actions โ Delete:
Log to Master History as bsp-apr17-contact-500-fix-complete (severity critical). Include:
bsp-form-move.php + 13 redundant snippetshostinger-auto-update.php/wp-content/mu-plugins/ without a delete path documentedCodify the rule in CLAUDE.md: "Code Snippets may never write to mu-plugins. If a filesystem write is needed, use wp-content/plugins/ with a proper activation/deactivation lifecycle."
| # | Snippet | Role |
|---|---|---|
| 5 | Nexus GCLID Bridge Proxy | Registers /wp-json/nexus/v1/gclid-bridge REST endpoint |
| 22 | BSP Google Ads Global Tag (AW-17179856077) | gtag.js config + Conversion Linker |
| 24 | BSP Booking & Contact Form Conversion Tracker | Fires ad conversion event on form submit |
| 25 | EC4L PII Bridge - Enhanced Conversions | Hashed PII for Google Enhanced Conversions |
| 39 | BSP GCLID Capture + Bridge Webhook | Captures ?gclid= + cookies + initial bridge ping |
| 49 | WP Rocket: Exclude GCLID Capture from Delay JS | Prevents WP Rocket lazy-load from breaking #39 |
| 53 | GCLID Bridge Sync - Nexus Pipeline | Form-submit โ VM bridge with GCLID + customer |
/wp-content/mu-plugins/. mu-plugins auto-load and persist beyond the UI toggle. If a filesystem write is needed, use a proper plugin at /wp-content/plugins/ with an activation + deactivation hook that cleans up.
bricks.callbrightside.com using the sewer-camera page component pattern, then retire snippets #55, #73, #82, #85, #86 entirely.