Internal reference for junior/senior developers and SEO/digital marketers. Not linked publicly, not indexed.
TCB Shopz (The Coins Bureau Shopz, tcbshopz.com) is a PHP/HTML5/CSS3/JavaScript website with no framework dependency, running on standard Apache/Linux hosting. It connects the USA and Cameroon through personal shopping (Shop-For-Me), two-way shipping, gift delivery, and gift card exchange. See Project Transmission Document_ TCB Shopz Website Development.md for the full historical build log (V1–V8), and all_forms_to_crm.md for the original Zoho CRM integration brief this build follows.
Forms POST via AJAX to process_*.php handlers, which send email through Brevo, log leads into Zoho CRM, and redirect the browser (client-side, via JSON redirect field) to thank-you.php.
| Path | Purpose |
|---|---|
includes/header.php / includes/footer.php | Global layout, nav, meta tags, JSON-LD, analytics, WhatsApp/Tawk.to widgets — the ones actually used by every page. |
header.php / footer.php / main.js (root) | Legacy/unused — not included by any page. Safe to delete once confirmed; kept for now to avoid unrelated churn. |
assets/css/style.css + style.min.css | Site-wide styling. No build/minify tool in this repo — the two files must be kept identical (copy one over the other) after any CSS change, since includes/header.php loads style.min.css. |
assets/js/main.js + main.min.js | Mobile nav toggle, hero slider, AJAX form handling. Same "keep both in sync" rule as CSS. |
assets/js/whatsapp-button.js + assets/css/whatsapp-button.css | Floating WhatsApp button + pre-chat lead-capture modal. |
includes/zoho-config.php | Zoho CRM credentials. Never commit real secrets to a public repo. Blocked from direct web access by includes/.htaccess. |
includes/zoho-client.php | ZohoCRM class: token refresh/cache, createLead(), testConnection(). |
includes/brevo-api.php | BrevoEmailService class for transactional email. |
includes/geolocation.php | GeolocationService — IPgeolocation.io wrapper, used for lead context and fraud signals. |
includes/b2-storage.php | Backblaze B2 client for career résumé uploads. |
process_contact.php / process_order.php / process_career.php / process_whatsapp_lead.php | Form handlers. All follow the same pattern: sanitize → validate → send Brevo email → push Zoho lead (non-blocking) → return JSON with redirect. |
thank-you.php | Shared success page for all form types (?type=contact|order|career). noindex. Has a hidden test panel at ?debug=1. |
check_server.php | PHP/server environment compatibility check. |
diagnostics.php | Integration config/connectivity checker — never prints live secrets, only masked previews. |
robots.txt / llms.txt / sitemap.xml | Crawler and AI-agent access files. See §8. |
.htaccess (root) / includes/.htaccess | Security headers, gzip/caching, blocks .bak/.log downloads, denies all direct access to /includes/. |
include 'includes/header.php' and ends with include 'includes/footer.php' — set $pageTitle / $pageDesc (and optionally $pageNoIndex = true;) before the header include.includes/header.php / includes/footer.php — never the root-level duplicates..min. counterpart (no build tool exists here).php -S localhost:8000 from the project root.ZohoCRM::createLead() requires "trigger":["workflow"] in the payload to fire CRM workflow emails — do not strip it.includes/zoho_token.json (gitignore this), refreshed 5 minutes before expiry.$pageTitle/$pageDesc feed the <title>, meta description, Open Graph, and Twitter Card tags automatically — edit those two variables, not the head markup.llms.txt is the AI-answer-engine equivalent of a meta description for the whole site — update it whenever pricing or service structure changes.sitemap.xml and, if customer-facing, to includes/header.php nav + includes/footer.php links.| Service | Used For | Config Location |
|---|---|---|
| Brevo (SMTP API) | Order/contact/WhatsApp-lead transactional email | includes/brevo-api.php |
| Zoho CRM (API v8) | Lead capture from all three sources (contact, order, WhatsApp) | includes/zoho-config.php |
| IPgeolocation.io | Approximate location on lead submissions | includes/geolocation.php |
| Backblaze B2 (S3-compatible) | Career résumé storage | includes/b2-storage.php |
| Google reCAPTCHA v2 | Spam protection on all forms | Inline site key in each form page |
| Google Analytics (gtag) | Traffic analytics | includes/header.php (loads on every page) |
| Tawk.to | Live chat widget, pinned bottom-left | includes/footer.php |
Run diagnostics.php any time to see which of the above are configured, and check_server.php to verify the PHP/hosting environment itself.
Full step-by-step is in all_forms_to_crm.md; summary below.
ZohoCRM.modules.leads.ALL,ZohoCRM.modules.deals.ALL,ZohoCRM.settings.READ1000.) — it is single-use and expires fast.curl -X POST "https://accounts.zoho.com/oauth/v2/token" \ -d "grant_type=authorization_code" \ -d "client_id=1000.IR6C6WKA5T16NNMJXTNY9D4RP7SCZL" \ -d "client_secret=<client secret>" \ -d "code=PASTE_GRANT_CODE_HERE"
refresh_token into includes/zoho-config.php. This is the only credential the site needs long-term — it does not expire unless revoked.TODO As of this build, includes/zoho-config.php ships with client_id/client_secret filled in but an empty refresh_token — the CRM push is currently a safe no-op (logged, never breaks the visitor flow) until someone with Zoho console access completes the steps above. Two different Client IDs were found across project docs during this build (...R7SCZL in all_forms_to_crm.md vs ...KPEG in self_client_CRM+ZOHO.json) — the guide's ID was used; confirm this is the intended one before generating the grant code.
The floating WhatsApp button (assets/js/whatsapp-button.js) is bottom-right, green, pulsing/bouncing to draw attention. Clicking it opens a modal asking for name, WhatsApp number, and email (optional) before handing the visitor off to wa.me. On submit:
fetch(..., {keepalive: true}) POST fires to process_whatsapp_lead.php — fire-and-forget, survives the page navigation.process_whatsapp_lead.php emails contact@tcbshopz.com + thecoinsbureau@icloud.com via Brevo, and pushes a Lead to Zoho CRM with Lead_Source = "Website - WhatsApp Button".window.open() immediately sends the visitor to wa.me/237670931202 with a pre-filled, personalized message.The handler is designed to always respond success even if Brevo/Zoho fail — a backend hiccup must never block someone from reaching WhatsApp.
Tawk.to live chat is pinned bottom-left via Tawk_API.customStyle in includes/footer.php, specifically so it never overlaps the WhatsApp button.
| Tool | What It Checks |
|---|---|
check_server.php | PHP version, cURL/OpenSSL/JSON extensions, upload limits, required files present |
diagnostics.php | Which integrations are configured (masked, no secrets shown) + a live Zoho token-refresh test |
thank-you.php?debug=1 | Confirms which form type actually redirected here, plus a manual end-to-end checklist |
This build's automated verification covered UI/JS behavior only (modal open/validate, form submit → redirect) via browser automation against a local php -S server — it did not make live calls to Brevo/Zoho with real secrets. Run the manual checklist on thank-you.php?debug=1 against a live/staging deployment before considering the CRM/email pipeline fully verified.
Every page sets $pageTitle and $pageDesc before including includes/header.php, which auto-generates: <title>, meta description, canonical URL, Open Graph tags, Twitter Card tags, and a sitewide LocalBusiness JSON-LD block. Content pages use a single <h1>, <h2> for major sections, <h3>/<h4> for sub-points, and comparison tables (.pricing-table / .table-responsive) where structured data helps both users and AI summarizers.
| File | Purpose |
|---|---|
robots.txt | Explicitly allows major search bots and AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, CCBot, etc.); disallows /includes/, form processors, and dev-only tools. |
llms.txt | Machine-readable site summary in the emerging llms.txt convention — key facts, page index, and citation notes for AI answer engines. |
sitemap.xml | All customer-facing pages, referenced from robots.txt. |
Primary service/landing pages target ~800–1200 words of unique content with a full heading hierarchy and at least one data table where relevant (pricing, comparisons, process steps). Utility pages (privacy, terms) prioritize completeness and clarity over word count. thank-you.php, diagnostics.php, and check_server.php are intentionally noindex — they're conversion/dev tooling, not search-facing content.
| Token | Value | Swatch |
|---|---|---|
--primary-blue | #0F4C81 | |
--primary-gold | #D4AF37 | |
--secondary-blue | #0A365C | |
| WhatsApp green | #25D366 (hover #1EBE5D) |
Logo: https://tcb-media.s3.us-east-1.amazonaws.com/images/TCBSHOPZ/the_coin_bureau_shopz_logo.png (rectangular, transparent background). Used at ~54px height in the header and ~44px in the footer with a filter: brightness(0) invert(1) applied so the transparent-background mark reads clearly on the dark footer gradient. A local copy also lives in /logo/ for design reference — the live site pulls from the S3 URL directly, consistent with how every other site image is served.
.mobile-menu-btn) appears under 768px and toggles a slide-down .nav-links.active panel — previously the nav had no way to reopen on mobile at all.assets/js/main.js) with dot indicators and prev/next arrows — previously only one static slide existed despite the "slider" markup..form-row-2 / .two-col-grid, which collapse to one column under 768px (previously inline grid-template-columns: 1fr 1fr could not be responsively overridden).img { max-width: 100%; height: auto; } and .table-responsive { overflow-x: auto; } prevent wide tables/images from breaking mobile layout.| Item | Status | Notes |
|---|---|---|
Zoho refresh_token | TODO | Generate per §5 and paste into includes/zoho-config.php. CRM push is a safe no-op until then. |
| US phone/WhatsApp number | Unverified | The flyer's "+1 555 971-6317" is not a valid US number format (555 is a fictional exchange code). Left as "coming soon" sitewide until a real number is confirmed. |
| ZIP code | Resolved | Confirmed 20708 (site value) over the flyer's 20707. |
wp-config.php.bak | Security | Leftover WordPress DB credentials file found in project root, unrelated to this site. Blocked via root .htaccess during this build; recommend deleting it outright. |
Legacy root header.php/footer.php/main.js | Cleanup | Unused duplicates of the real includes/ versions. Not referenced anywhere; safe to delete after confirming with the team. |
services.php | Fixed | Was linked from nav/footer on every page but did not exist (404). Created during this build. |
| CSS/JS "minified" files | Process gap | No build tool exists in this repo — style.min.css/main.min.js are plain copies of their source files, not actually minified. Fine functionally; consider adding a real build step later. |