Medical Procurement Operations Guide
Clinical equipment guide in Morocco compliant with AMMPS and Law 84-12.
Back to resources1. Google Search Console
### Setup 1. Go to https://search.google.com/search-console 2. Prefer a Domain property for `mediunit.ma` so `https://mediunit.ma`, `https://www.mediunit.ma`, and future protocol/host variants are visible in one place. The current production API workflow uses `sc-domain:mediunit.ma`. 3. If a URL-prefix property is still needed, add `https://mediunit.ma/` and choose URL prefix verification. 4. For URL-prefix meta-tag verification, copy the meta tag verification code (just the `content` value, e.g. `abc123xyz`). 5. Set `NEXT_PUBLIC_GSC_VERIFICATION=abc123xyz` in the storefront Worker build/deploy environment. 6. Redeploy the frontend. 7. Click "Verify" in Search Console. ### App status - The frontend already supports the Search Console meta-tag path through `NEXT_PUBLIC_GSC_VERIFICATION`. - If the value is missing at storefront build/deploy time, the tag is not emitted on the live site. - The April 2026 `Not found (404)` examples for legacy product/category slugs were fixed on 2026-04-30 by canonical slug redirects and sitemap regeneration. ### Post-verification - Submit sitemap: `https://mediunit.ma/sitemap.xml` - Check "Coverage" report for crawl errors - Monitor "Performance" for impressions and clicks - Review "Enhancements" for structured data (Product, FAQ, BreadcrumbList) - Check "Mobile Usability" for mobile issues ### Programmatic API access If you want to inspect Search Console data from the repo: 1. In Google Cloud, enable the Search Console API for the project that will own the credentials. 2. Choose one auth path: - Service account: Give the service-account email access to the Search Console property in Search Console > Settings > Users and permissions. - Installed-app OAuth client: Use the Google account that already has Search Console access, then complete the local OAuth consent flow. 3. Keep the credentials outside the repo when possible, then export one of: - `GOOGLE_SERVICE_ACCOUNT_KEY_PATH=/absolute/path/to/key.json` - `GOOGLE_SERVICE_ACCOUNT_KEY_JSON='{"type":"service_account",...}'` - `GSC_OAUTH_CLIENT_SECRET_PATH=/absolute/path/to/client_secret.json` 4. For installed-app OAuth, run once to get a cached refresh token: - `npm run gsc -- oauth-start --client-secret-path /absolute/path/to/client_secret.json --redirect-uri http://127.0.0.1:53682/oauth2callback --scope https://www.googleapis.com/auth/webmasters` - Complete consent in the browser, then run: - `npm run gsc -- oauth-exchange --client-secret-path /absolute/path/to/client_secret.json --redirect-url 'http://127.0.0.1:53682/oauth2callback?code=...'` - The helper caches OAuth state and tokens under ignored `scratch/google-search-console/` by default with owner-only file permissions. 5. Use the local helper: - `npm run gsc -- sites` - `npm run gsc -- site --site-url sc-domain:mediunit.ma` - `npm run gsc -- sitemaps --site-url sc-domain:mediunit.ma` - `npm run gsc -- inspect --site-url sc-domain:mediunit.ma --inspection-url https://mediunit.ma/fr/` - `npm run gsc -- analytics --site-url sc-domain:mediunit.ma --start-date 2026-03-16 --end-date 2026-04-15 --dimensions page --row-limit 25` Use the `submit-sitemap` command only when the credentials have write access: - `npm run gsc -- submit-sitemap --site-url sc-domain:mediunit.ma --feedpath https://mediunit.ma/sitemap.xml` Search Console caveat: - The public API can submit sitemaps and inspect indexed URL state, but it cannot press the Search Console UI's "Request indexing" or "Validate fix" buttons. Use sitemap submission for broad recrawl signals, and use the UI for manual validation workflows when Google exposes them only in the product.
2. Google Analytics (GA4)
### Setup 1. Go to https://analytics.google.com 2. Create a new GA4 property for mediunit.ma 3. Copy the Measurement ID (e.g. `G-XXXXXXXXXX`) 4. Set `NEXT_PUBLIC_GA_MEASUREMENT_ID=G-XXXXXXXXXX` in the storefront Worker build/deploy environment 5. Redeploy the frontend ### How it works - Analytics only loads after the user accepts the cookie consent banner - The consent banner stores the choice in localStorage (`mediunit-cookie-consent`) - If the user rejects cookies, no analytics script is loaded - The GA4 script uses `anonymize_ip: true` for GDPR compliance - Client-side route changes are tracked after the initial page load, so pageviews continue to be recorded across App Router navigation
3. Google OAuth (one-click sign-in)
### Setup 1. Go to https://console.cloud.google.com/apis/credentials 2. Create a dedicated OAuth 2.0 Client ID for storefront login (`Web application`) 3. Add authorized JavaScript origins: - `https://mediunit.ma` - `https://mediunit-frontend.pages.dev` if preview login testing is needed - `http://localhost:3000` (for local dev) 4. Copy the Client ID (e.g. `123456789.apps.googleusercontent.com`) 5. Set in the storefront Worker build/deploy environment: - `NEXT_PUBLIC_GOOGLE_CLIENT_ID=123456789.apps.googleusercontent.com` 6. Set in Cloudflare Workers (backend) secrets: - `npx wrangler secret put GOOGLE_OAUTH_CLIENT_ID` - Paste the same Client ID 7. Redeploy both frontend and backend ### How it works - Login page shows "Continue with Google" button - User clicks, Google verifies identity, returns a JWT credential - Frontend sends the credential to `/api/v1/auth/google` - Backend verifies the Google ID token with Google, then checks issuer, audience, verified email, and expiry - If user exists: logs them in with a session cookie - If new user: creates account with `pending` verification, notifies admin - New Google users still need admin verification before they can access the dashboard ### Important note - Do not reuse the Gmail mailer OAuth client unless it is also configured with the storefront JavaScript origins above. - The login client only needs the public Client ID in the app; no client secret is used by the browser sign-in button flow.
4. Google Merchant Center
### Account setup 1. Go to https://merchants.google.com 2. Create a Merchant Center account for "MediUnit" 3. Verify and claim `mediunit.ma` (should be automatic if Search Console is verified) ### Feed configuration 1. Go to Products > Feeds > Add feed 2. Feed name: "MediUnit B2B Catalog - FR" 3. Type: "Scheduled fetch" 4. File URL: `https://mediunit.ma/api/v1/merchant-feed.xml?lang=fr` 5. Fetch schedule: Daily at 03:00 UTC 6. File format: RSS/XML ### App status - The live feed endpoint already exists at `https://mediunit.ma/api/v1/merchant-feed.xml?lang=fr` - Product pages already emit shipping and return structured data that matches the storefront policies ### Shipping settings 1. Go to Settings > Shipping and returns 2. Add shipping service for Morocco: - Service name: "Livraison Standard" - Country: Morocco (MA) - Currency: MAD - Delivery time: 1-3 business days - Free shipping threshold: 1500 MAD - Standard rate: 50 MAD 3. Add return policy: - Return window: 7 days - Return method: by mail - Return shipping: free ### Diagnostics - After the first feed fetch, review the "Diagnostics" tab - Fix any product data quality issues flagged by Google - Monitor "Item issues" weekly for the first month
5. GTIN Enrichment
### Current state Use `docs/reports/latest-merchant-readiness.json` as the live source of truth for Merchant feed identifier coverage. As of the latest checked-in report generated on 2026-04-25: - `1149` products are present in the catalog - `1123` products are present in the Merchant feed - `1148` products have a valid GTIN - `1` product does not have a GTIN yet - `1` product currently relies on brand+MPN fallback - `26` products are excluded from the feed by policy review These numbers are expected to change as catalog migrations and supplier-backed enrichment land. Re-run `npm run audit:merchant` after feed-affecting deployments instead of trusting a hard-coded count in this document. ### What to do GTIN enrichment now falls into two buckets: - Private-label / internal references: These should keep brand+MPN fallback until MediUnit owns verified GS1 identifiers for them. - Third-party supplier references: These should only receive GTINs that are confirmed by the manufacturer, supplier packaging, or an official vendor catalog. To get valid GTINs: **Option A: Register with GS1 Morocco** 1. Contact GS1 Morocco: https://www.gs1ma.org 2. Register for a company prefix (annual fee ~2000-5000 MAD) 3. With the prefix, generate valid EAN-13 barcodes for each product 4. Update product records in D1 with `UPDATE product SET gtin = ? WHERE sku = ?` **Option B: Use manufacturer GTINs** For products sourced from named manufacturers, request GTINs from the supplier. These would be the actual EAN/UPC codes printed on the packaging. **Option C: Keep brand+MPN fallback** Google Merchant Center accepts brand+MPN as an alternative identifier. This is valid and the feed already includes it correctly. The feed will work, but products with real GTINs get better placement in Shopping results. ### Products missing GTIN Do not maintain a hand-written list here anymore. Instead: 1. Run `npm run audit:merchant` 2. Open `docs/reports/latest-merchant-readiness.json` 3. Review `missingGtin`, `invalidGtin`, and `brandMpnFallback` This avoids the document drifting out of sync with the real catalog.
Bouskoura Stock • ICE Proforma Quote < 24h • AMMPS Certified
Configure this clinical technical suite in 2 minutes
Get recommended biomedical equipment packages, monthly bank leasing estimates in MAD, and 30-day consumable forecasts.
Mode Professionnel & Établissement de Santé : Affichage des repères en MAD HT. Émission de facture Proforma avec ICE/RC/IF sous 2h (compatible crédit bancaire, leasing médical 36–60 mois et appels d'offres), bordereau de traçabilité des lots et certificats CE MDR + AMMPSP inclus.
Facture Proforma avec ICE & Dossier Technique AMMPSP
Recevez sous 2 heures votre facture proforma normalisée avec ICE, TVA 20%, délai et garantie pour votre comptabilité, dossier de crédit leasing ou commission d'appel d'offres.
Assistance Technique & Certificats CE / AMMPSP
Besoin d'une validation technique, d'une vidéo du matériel en stock à Casablanca ou des certificats officiels ministère de la Santé ? Échangez directement avec un ingénieur.
Stock Immédiat & Expédition 24/48h Maroc
Livraison nationale depuis Bouskoura (Casablanca, Rabat, Marrakech, Fès, Tanger, Agadir). Tarifs dégressifs grossistes pour revendeurs, ou dossier conforme CNSS/CNOPS pour particuliers.
Ask a clinical or technical specification question
Trained on verified Moroccan SKUs, exact prices in MAD, Bouskoura stock levels, and AMMPSP compliance.
Frequently Asked Questions
What are the delivery lead times and compliance documents provided in Morocco for: Medical Procurement Operations Guide?▼
24h delivery to Casablanca/Rabat and 48h nationwide from our Bouskoura warehouse. Every B2B or B2C order includes an ICE-compliant invoice, CE certificates, and AMMPS registration (Law 84-12).
Abdelrhafar Naouri
Clinical Director & Medical Sourcing Expert
With over 15 years of experience managing clinical facilities and medical equipment sourcing in Morocco, Abdelrhafar Naouri guides healthcare professionals in securing regulatory-compliant medical supplies under Ministry of Health (DMP) standards.
Actions
Next step
Move from content to execution: open a structured quote, browse brands, or activate the client portal to centralize orders and documents.