# PEND01013 — Setup tracking & marketing / Tâches dev

**Client :** We Are Pendulum PTE LTD — **Plateforme :** Shopify — **Statut site :** pas encore en ligne
**Devis :** PEND01013 du 16-06-2026

> Chaque tâche est autonome : contexte → prérequis → étapes → **DoD** (definition of done, vérifiable).
> Les tâches marquées 🔒 sont bloquées tant que le site n'est pas live.

---

## T0 — Prérequis & accès (bloquant pour tout le reste)

**Objectif :** aucune tâche ne démarre sans ces accès. À faire valider par Pendulum avant tout.

- [ ] Shopify : accès staff avec droits **Apps + Sales channels + Settings + Theme**
- [ ] Compte Google : accès **Admin** sur la propriété GA4 existante, GSC, GTM, Google Ads, Merchant Center (idéalement tout sous une même Organisation / MCC)
- [ ] Meta : accès **Business Manager** (rôle Admin sur le BM, pas juste la Page), Page FB + compte IG connectés
- [ ] Accès DNS du domaine (enregistrement TXT pour vérification GSC + Meta domain verification)
- [ ] Confirmer la **date de mise en ligne** et le marché cible (UE ? → impacte le consentement, voir T7)

**DoD :** liste d'accès cochée, un doc `access-matrix.md` listant compte / rôle / propriétaire.

---

## T1 — Google Analytics 4

**Contexte :** la propriété est créée, rien d'autre. Tout le reste est à faire.

**⚠️ Décision d'architecture à prendre en premier (source unique de vérité) :**
soit le tracking passe par le **canal natif Google & YouTube de Shopify**, soit par **GTM**.
**Ne pas activer les deux** → sinon double comptage des `purchase` et CA faux dans Ads.
Recommandation : natif pour la base ecommerce, GTM uniquement pour ce que le natif ne couvre pas (voir T3).

**Étapes**

- [ ] Configurer le flux de données Web (domaine final, pas l'URL `.myshopify.com`)
- [ ] Enhanced measurement : garder scroll / outbound / site search, **désactiver** ce qui ferait doublon avec les events ecommerce
- [ ] Brancher la collecte selon la décision ci-dessus
- [ ] Events ecommerce avec paramètres complets : `view_item`, `add_to_cart`, `begin_checkout`, `purchase`
  - `purchase` doit contenir `transaction_id`, `value`, `currency`, `items[]` (item_id, item_name, price, quantity)
  - `transaction_id` = numéro de commande Shopify (obligatoire pour la déduplication)
- [ ] Marquer les key events (conversions) : `purchase`, `begin_checkout`, `add_to_cart`
- [ ] Filtre trafic interne (IP bureau + IP Pendulum), exclusion des domaines de référence de paiement (paypal.com, stripe, etc.)
- [ ] Rétention des données à 14 mois, currency de reporting alignée
- [ ] Lier GA4 ↔ GSC ↔ Google Ads ↔ Merchant Center

**DoD**

- DebugView : parcours complet (produit → panier → checkout → commande test) et **chaque event apparaît une seule fois**
- Le `purchase` de la commande test remonte avec le bon montant, la bonne devise et les bons items
- Rapport Temps réel alimenté, 0 event `(not set)` sur les paramètres ecommerce

---

## T2 — Google Search Console

**Étapes**

- [ ] Créer une propriété **Domaine** (vérification DNS TXT) plutôt qu'un préfixe d'URL → couvre www + https + sous-domaines
- [ ] **Avant lancement :** vérifier que le mot de passe boutique / `noindex` sera bien retiré au go-live
- [ ] Soumettre `https://<domaine>/sitemap.xml` (sitemap Shopify auto-généré)
- [ ] Vérifier `robots.txt` (Shopify permet un `robots.txt.liquid` custom si besoin)
- [ ] Lier GSC ↔ GA4
- [ ] Contrôler le domaine canonique (redirection www / non-www cohérente)

**DoD**

- Propriété vérifiée, sitemap au statut **Succès** avec un nombre d'URL découvertes cohérent avec le catalogue
- Inspection d'URL sur la home + 1 collection + 1 produit : « L'URL est disponible pour Google »
- 0 erreur bloquante dans Indexation des pages

---

## T3 — Google Tag Manager

**Contexte :** GTM sert de complément, pas de doublon (cf. décision T1).

**⚠️ Point technique Shopify :** `checkout.liquid` et les Additional Scripts sont dépréciés.
Le tracking sur checkout / thank-you page doit passer par **Settings → Customer events → Custom pixel** (Web Pixels API, sandboxé) — pas par une injection dans le thème.

**Étapes**

- [ ] Conteneur Web, snippet dans `theme.liquid` (`<head>` + `<body>`) pour les pages boutique
- [ ] Custom pixel pour les events checkout/purchase si le natif ne les couvre pas
- [ ] Variables dataLayer + déclencheurs propres (pas de All Pages en fourre-tout)
- [ ] Convention de nommage : `GA4 - Event - add_to_cart`, `Meta - Purchase`, etc.
- [ ] Consent Mode v2 si trafic UE (cf. T7)
- [ ] Environnements dev/prod, publication versionnée avec note de version

**DoD**

- Mode Preview : chaque tag se déclenche **une seule fois** sur son parcours
- Tag Assistant : 0 erreur, 0 tag « fired without required variable »
- Console navigateur : 0 erreur JS liée au conteneur
- Conteneur publié avec version nommée + description

---

## T4 — 🔒 Google Ads (post-launch)

**Contexte :** rien de vérifiable avant que le site soit live et qu'une commande réelle passe.

**⚠️ Choisir UNE source de conversion :** soit conversions importées depuis GA4, soit tag de conversion Ads (natif/GTM). **Pas les deux** sur le même event, sinon CA doublé et enchères faussées.

**Étapes**

- [ ] Lier Google Ads ↔ GA4 ↔ Merchant Center
- [ ] Créer l'action de conversion Purchase (valeur dynamique + devise)
- [ ] Enhanced conversions (via natif ou GTM selon l'archi retenue)
- [ ] Balise de remarketing + audiences : all visitors, viewers produit, abandon panier, acheteurs 30/90j
- [ ] Remarketing dynamique : vérifier que les `ecomm_prodid` / item IDs correspondent **exactement** aux IDs du flux Merchant Center
- [ ] Exclure le trafic interne, définir la fenêtre d'attribution

**DoD**

- Statut de l'action de conversion : **« Enregistrement des conversions »**
- Une commande test remonte dans Ads avec le bon montant, sans doublon vs GA4
- Diagnostic des balises : 0 erreur ; audiences en statut « Ouverte » et en cours de remplissage

---

## T5 — 🔒 Google Merchant Center (feed vérifiable après mise en ligne)

**Étapes**

- [ ] Créer / configurer le compte MC, revendiquer et vérifier l'URL du site
- [ ] Connecter le flux via le canal **Google & YouTube** de Shopify
- [ ] Renseigner livraison, retours, taxes, coordonnées business (obligatoire, cause fréquente de suspension)
- [ ] Qualité des données produit : `brand`, `gtin` (ou `identifier_exists: false` si pas de GTIN), `google_product_category`, `condition`, images conformes (pas de filigrane / texte promo)
- [ ] Vérifier la cohérence prix & disponibilité site ↔ flux (cause n°1 de désapprobation)
- [ ] Activer les fiches gratuites (free listings) + préparer le compte pour Shopping

**DoD**

- Flux synchronisé, **0 désapprobation**, produits en statut « Actif »
- Onglet Diagnostics vide côté erreurs ; warnings documentés et arbitrés avec Pendulum
- Compte non suspendu, prêt à recevoir une campagne Shopping/PMax

---

## T6 — Meta (Facebook / Instagram)

**Étapes**

- [ ] Connecter via le canal natif **Facebook & Instagram** de Shopify (pixel + **Conversions API** en une fois)
- [ ] Vérification du domaine dans Business Manager (DNS TXT) — prérequis Aggregated Event Measurement
- [ ] Configurer les 8 événements prioritaires (AEM), en mettant `Purchase` en priorité 1
- [ ] Events standards sur tout le funnel : `ViewContent`, `AddToCart`, `InitiateCheckout`, `Purchase`
- [ ] Déduplication pixel/CAPI : vérifier que `event_id` + `event_name` sont bien envoyés côté serveur et navigateur
- [ ] Catalogue produits synchronisé (pour les Advantage+ / DPA)
- [ ] Optimiser l'EMQ : email, téléphone, prénom/nom, ville, code postal, `fbp`/`fbc`, IP + user agent côté serveur

**DoD**

- Events Manager → Test Events : les 4 events remontent sur un parcours complet
- **0 event marqué comme dupliqué** dans l'onglet Diagnostics
- **EMQ ≥ 8/10** sur `Purchase` (à mesurer après 24–48 h de trafic réel, pas sur des events de test)
- Domaine vérifié, AEM configuré, catalogue sans erreur

---

## T7 — Transverse : consentement & conformité

À arbitrer avec Pendulum selon les marchés ciblés (UE/UK → obligatoire) :

- [ ] Bannière de consentement (Shopify Customer Privacy API ou CMP certifiée Google)
- [ ] Google Consent Mode v2 (`ad_storage`, `analytics_storage`, `ad_user_data`, `ad_personalization`)
- [ ] Contrôler que rien ne se déclenche avant consentement
- [ ] Politique de confidentialité mise à jour (mention GA4, Meta, Google Ads)

**DoD :** avant consentement → aucun cookie tiers ni requête analytics ; après refus → Consent Mode renvoie bien les pings « denied ».

---

## T8 — Livraison & passation

- [ ] Doc de recette : capture DebugView + Test Events + statuts des comptes
- [ ] Schéma d'architecture du tracking (qui envoie quoi, natif vs GTM)
- [ ] Transfert de propriété des comptes vers Pendulum (ou accès Admin garanti)
- [ ] Liste des points restés ouverts / dépendants du go-live

---

## Ordonnancement

| Phase           | Tâches                                                                      |
| --------------- | --------------------------------------------------------------------------- |
| Avant lancement | T0 → T1 → T2 → T3 → T6 → T7                                                 |
| Jour du go-live | Retrait du mot de passe boutique, contrôle indexation, commande test réelle |
| Après lancement | T4, T5 (validation flux), mesure EMQ réelle, T8                             |

## Points à faire trancher par Pendulum

1. **Natif vs GTM** comme source principale du tracking ecommerce (impact direct sur T1, T3, T4, T6)
2. Marchés ciblés → périmètre du consentement (T7)
3. Date de go-live ferme → planification des tâches 🔒
4. Propriété finale des comptes publicitaires (Elevaseo ou Pendulum)
