← Tous les manuels · Portail
↗ Ouvrir l'app

MANUAL — rp-capture

Rôle

Pilote d'auto-hébergement des pages de capture Resident Paraguay. Sert les pages de capture sur notre infra (à terme sur go.resident-paraguay.fr en gardant les mêmes URLs), avec tracking détaillé + relais des leads dans systeme.io (contact + tags + campagne) pour que les séquences email systeme.io continuent de tourner.

Contexte projet : workspace/RP-migration-SPEC.md (spec complète), workspace/RP-migration-pages-backlog.md, workspace/RP-systemeio-audit-2026-09-09.md.

Stack / run

  • - Python + Flask (servi par waitress). Modelé sur apps/formation-plan-b/app.py.
  • - Port local : 8110 (PORT env).
  • - Lancement : PORT=8110 python3 app.py
  • - Service systemd : rp-capture.service (à créer au déploiement).
  • - URL de test prévue : rp-capture.panelbay.com (avant bascule DNS de go.).
  • Endpoints

  • - GET /<slug> : sert une page de capture (slugs définis dans PAGES, ex. procedure).
  • - GET /confirmation : page de remerciement (étape suivante).
  • - POST /api/track : beacon vue de page (JSON : page, session_id, utm_*, referer).
  • - POST /api/subscribe : soumission formulaire → log lead + relais systeme.io + renvoie {ok, redirect}.
  • - GET /stats : vues, opt-ins, taux de conversion, opt-ins par source (JSON).
  • - GET /healthz.
  • Relais systeme.io (compte RP)

  • - API REST https://api.systeme.io/api, header X-API-Key = SYSTEMEIO_API_KEY (lu depuis /root/aios/.env, source unique).
  • - Flux : POST /contacts (email + fields) → si existe, GET /contacts?email= → POST /contacts/{id}/tags par tag → tentative POST /contacts/{id}/campaign-subscriptions.
  • - Config par page dans PAGES (app.py). Page procedure : tags FR (968798) + Formation gratuite PY (970208), campagne CAMPAGNE LEAD MAGNET (1056351), étape suivante /confirmation.
  • - Note : l'abonnement campagne via API est best-effort. Si systeme.io ne l'expose pas, on crée une automatisation systeme.io « tag → campagne » et on s'appuie dessus (le tag est posé par l'API).
  • Tracking (SQLite)

  • - data/capture.db : table events (vues) + leads (chaque inscription avec source/UTM, appareil, IP, id contact systeme.io, statut relais). Aucun lead perdu même si le relais échoue (statut loggé).
  • Sécurité

  • - Honeypot anti-bot (champ caché website).
  • - Aucun secret en dur ; clé lue depuis /root/aios/.env.
  • À faire (prochaines étapes)

  • - Déployer sur rp-capture.panelbay.com (expose-webapp : systemd + nginx + DNS + SSL).
  • - Test opt-in réel (crée 1 contact test dans systeme.io RP à supprimer ensuite).
  • - Ajouter les autres pages (voir SPEC) + le tracking rétention VSL (lecteur + battements).
  • - Bascule finale : DNS de go.resident-paraguay.fr vers notre serveur + proxy des pages non migrées vers systeme.io.
  • CHANGELOG

  • - 2026-09-22 : page de capture bolivie ajoutée (layout leadmagnet, champs prénom + email uniquement, tag systeme.io Bolivie id 2189266, pas de campagne, étape suivante /bolivie-merci). But : inscription pour être tenu au courant des infos Bolivie. Page merci bolivie-merci (kind=thankyou avec body personnalisé, nouveau champ optionnel supporté par next.html). Tag Bolivie créé côté systeme.io RP. Testé de bout en bout : opt-in réel -> contact 444553671 (email de test matt.bouthors+bolivietest@gmail.com) créé avec tag Bolivie, relais ok(tags=1).
  • - 2026-09-22 : domaine dédié https://bolivie.panelbay.com (expose-webapp, Cloudflare DNS + Let's Encrypt, proxy vers port 8110). Astuce nginx dans /etc/nginx/sites-enabled/bolivie.panelbay.com.conf : un bloc location = / proxy_pass vers http://127.0.0.1:8110/bolivie sert la page Bolivie à la RACINE (le reste des chemins, /bolivie-merci /api/* /static/*, passe par le location / normal). Si on relance expose.py (--force) ou unexpose, RE-AJOUTER ce bloc location = /. rp-capture.panelbay.com/bolivie reste valide aussi.
  • - 2026-09-19 : création du pilote (page /procedure fidèle à l'originale + /confirmation, backend tracking + relais systeme.io). Testé en local (page OK, tracking OK).
  • - 2026-09-19 : test écriture systeme.io validé (contact 444189388 créé avec tags FR + Formation gratuite PY via un opt-in de test). Constat : l'API systeme.io n'expose PAS l'abonnement campagne (404) ; à câbler via une automatisation « tag → campagne » au moment du cutover (pas avant, sinon double abonnement car l'ancien tunnel /procedure tourne encore).
  • - 2026-09-19 : déployé via expose-webapp (service systemd rp-capture.service port 8110 + nginx + Cloudflare DNS + SSL). URL de test : https://rp-capture.panelbay.com/procedure. Racine / = 404 (normal, l'app sert /procedure). Bascule DNS de go.resident-paraguay.fr = étape ultérieure.
  • - 2026-09-19 : moteur générique (config PAGES + 2 layouts leadmagnet/vsl) + templates capture.html / next.html. 10 pages de capture configurées (procedure, expatriation, expatriation1, immobilier, immobilier-paraguay, budget-paraguay, residencefiscale, residence-fiscale, planb, plan-b) avec copy cloné de systeme.io + tags/campagne + étape suivante. Toutes répondent 200. PLACEHOLDERS à remplacer par les vrais assets Matt : images hero, vidéos VSL (.videobox), liens Telegram (pages next.html kind=telegram). Champs par page : leadmagnet = prénom+email (procedure = +pays+WhatsApp) ; vsl = prénom+email+WhatsApp.
  • - 2026-09-19 : logo RP officiel (Drive "Logos Resident Paraguay", version bleue) intégré en en-tête (static/logo-blue.png + logo-white.png dispo pour footer). Lien Telegram https://t.me/mattparaguay câblé sur les pages merci (kind=telegram). Champs pays/tel : liste + drapeaux + défaut France.
  • - 2026-09-19 : vidéos VSL récupérées via API systeme.io (get_files + lecture des pages live go.resident-paraguay.fr) et câblées dans NEXT_PAGES. VSL fiscale (/video-residence-fiscale + /video-residence-fiscale-54294d09) = MP4 servi direct depuis le CDN systeme.io (CloudFront, pas de réhébergement). Plan B (/video-planb) = iframe YouTube RCAly1_fosc. next.html rend maintenant un vrai lecteur (video mp4 ou iframe YouTube selon video_mp4/video_yt). Bouton "RÉSERVER UN APPEL"/"CONSULTATION GRATUITE" pointe vers iClosed (ICLOSED_URL = https://app.iclosed.io/e/paraguay/residence), rendu si cta_url présent.