From 4babb403e8d0ab2e8dbbe7726c9876325b3b0125 Mon Sep 17 00:00:00 2001 From: louispaulb Date: Fri, 22 May 2026 09:30:38 -0400 Subject: [PATCH] feat(campaigns): "View in browser" web fallback for failed inbox renders MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GET /campaigns/:id/recipients/:i/view re-renders the campaign with the same vars the worker used at send time — same template, same per-row amount override, same language pick. Useful when the recipient's mail client butchers the layout: image-blocking, antique Outlook, niche third-party apps, accessibility tools. Templates: Mustache section {{#view_url}}…{{/view_url}} guards a tiny gray link above the header logo (11px, #94a3b8). The section collapses to nothing when view_url is empty, so: - the /view page itself doesn't show the link (you're already there) - wizard previews / test-sends don't show it (no real campaign id) worker passes view_url = HUB_PUBLIC_URL + /campaigns//recipients//view using the existing cfg.HUB_PUBLIC_URL setting (defaults msg.gigafibre.ca). Security: campaign-id is a 21-char nanoid (≈10²¹ space). Same level of exposure as the Giftbit shortlink itself. X-Robots-Tag: noindex on the response so the URLs don't end up on search engines. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.7 --- .../campaigns/templates/gift-email-en.html | 7 +++ .../campaigns/templates/gift-email-en.json | 2 +- .../campaigns/templates/gift-email-fr.html | 11 ++++ .../campaigns/templates/gift-email-fr.json | 2 +- services/targo-hub/lib/campaigns.js | 61 +++++++++++++++++++ .../targo-hub/templates/gift-email-en.html | 7 +++ .../targo-hub/templates/gift-email-en.json | 2 +- .../targo-hub/templates/gift-email-fr.html | 11 ++++ .../targo-hub/templates/gift-email-fr.json | 2 +- 9 files changed, 101 insertions(+), 4 deletions(-) diff --git a/scripts/campaigns/templates/gift-email-en.html b/scripts/campaigns/templates/gift-email-en.html index ba956d7..02e9db1 100644 --- a/scripts/campaigns/templates/gift-email-en.html +++ b/scripts/campaigns/templates/gift-email-en.html @@ -107,6 +107,13 @@ table, td { color: #1B2E24; } #u_body a { color: #00C853; text-decoration: under
+ + {{#view_url}} + + {{/view_url}} + diff --git a/scripts/campaigns/templates/gift-email-en.json b/scripts/campaigns/templates/gift-email-en.json index 960e6a7..1706418 100644 --- a/scripts/campaigns/templates/gift-email-en.json +++ b/scripts/campaigns/templates/gift-email-en.json @@ -20,7 +20,7 @@ "id": "HTML-1", "type": "html", "values": { - "html": "\n \n \n \n \n \n \n \n \n \n \n \n \n
\n Because great connections aren't just about fiber — they're about people too.\n
\n \n \n\n\n
\n
\n
\n \n \n\n
\n
\n
\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n
Because great connections aren't just about fiber — they're about people too.
\n \n \n \n \n \n \n \n
\n \n \n
\n \n \n \n
\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Hey {{firstname}},
\n \n \n \n \n \n \n Summer is here, and so is something special — for a limited time.\n Thank you for choosing local. Your support helps keep our community connected.
\n Because great connections aren't just about fiber — they're about people too.\n \n \n \n\n \n \n \n Because our customers trust us, we're now able to offer the fastest plans around, with speeds up to 3.5 Gbit/s.
\n Whether you're looking for more speed, want to beat another offer, or just need to optimize your gear, don't be shy! We're right next door — and we genuinely love lending a hand.\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ✅ Option 1
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🎁 {{amount}} to spend at hundreds of your favorite stores

\"Tim\"Walmart\"\"Home\"IGA\"\"Homeand more
\n \n \n \n \n \n \n \n ⚡ Instantly available on Giftbit — just click your {{amount}} to claim it!\n \n \n \n \n \n \n \n 🤝 You just need to keep your subscription for {{commitment_months}} months or more.\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🎁  {{amount}}\n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🪂 Cancellation before {{commitment_months}} months: only the prorated amount for the remaining months is refundable.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ⏭️ Option 2
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Do nothing. No changes to your current subscription.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🤝 Thanks for helping keep our local economy buzzing!
\n \n \n \n \n \n \n \n The TARGO Team\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n You're getting this email because you're a TARGO customer at {{description}}.
\n Got a question? Feel free to email us at\n support@targo.ca\n or call us at\n 514-448-0773.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n www.targo.ca\n  ·  1867 ch. de la rivière, Ste-Clotilde, QC
\n © {{year}} TARGO Communications · All rights reserved.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n\n\n \n \n \n\n\n\n\n \n \n \n \n \n \n ", + "html": "\n \n \n \n \n \n \n \n \n \n \n \n \n
\n Because great connections aren't just about fiber — they're about people too.\n
\n \n \n\n\n
\n
\n
\n \n \n\n
\n
\n
\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n
Because great connections aren't just about fiber — they're about people too.
\n \n \n \n {{#view_url}}\n \n {{/view_url}}\n\n \n \n \n \n \n
\n \n \n
\n \n \n \n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Hey {{firstname}},
\n \n \n \n \n \n \n Summer is here, and so is something special — for a limited time.\n Thank you for choosing local. Your support helps keep our community connected.
\n Because great connections aren't just about fiber — they're about people too.\n \n \n \n\n \n \n \n Because our customers trust us, we're now able to offer the fastest plans around, with speeds up to 3.5 Gbit/s.
\n Whether you're looking for more speed, want to beat another offer, or just need to optimize your gear, don't be shy! We're right next door — and we genuinely love lending a hand.\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ✅ Option 1
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🎁 {{amount}} to spend at hundreds of your favorite stores

\"Tim\"Walmart\"\"Home\"IGA\"\"Homeand more
\n \n \n \n \n \n \n \n ⚡ Instantly available on Giftbit — just click your {{amount}} to claim it!\n \n \n \n \n \n \n \n 🤝 You just need to keep your subscription for {{commitment_months}} months or more.\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🎁  {{amount}}\n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🪂 Cancellation before {{commitment_months}} months: only the prorated amount for the remaining months is refundable.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ⏭️ Option 2
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Do nothing. No changes to your current subscription.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🤝 Thanks for helping keep our local economy buzzing!
\n \n \n \n \n \n \n \n The TARGO Team\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n You're getting this email because you're a TARGO customer at {{description}}.
\n Got a question? Feel free to email us at\n support@targo.ca\n or call us at\n 514-448-0773.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n www.targo.ca\n  ·  1867 ch. de la rivière, Ste-Clotilde, QC
\n © {{year}} TARGO Communications · All rights reserved.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n\n\n \n \n \n\n\n\n\n \n \n \n \n \n \n ", "hideDesktop": false, "displayCondition": null, "containerPadding": "0px", diff --git a/scripts/campaigns/templates/gift-email-fr.html b/scripts/campaigns/templates/gift-email-fr.html index cfab143..1835aed 100644 --- a/scripts/campaigns/templates/gift-email-fr.html +++ b/scripts/campaigns/templates/gift-email-fr.html @@ -107,6 +107,17 @@ table, td { color: #1B2E24; } #u_body a { color: #00C853; text-decoration: under
+ + {{#view_url}} + + {{/view_url}} + diff --git a/scripts/campaigns/templates/gift-email-fr.json b/scripts/campaigns/templates/gift-email-fr.json index e274ff6..7ba76f9 100644 --- a/scripts/campaigns/templates/gift-email-fr.json +++ b/scripts/campaigns/templates/gift-email-fr.json @@ -20,7 +20,7 @@ "id": "HTML-1", "type": "html", "values": { - "html": "\n \n \n \n \n \n \n \n \n \n \n \n \n
\n Comme toi, on aime les connexions stables et les relations durables.\n
\n \n \n\n\n
\n
\n
\n \n \n\n
\n
\n
\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n
Comme toi, on aime les connexions stables et les relations durables.
\n \n \n \n \n \n \n \n
\n \n \n
\n \n \n \n
\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Bonjour {{firstname}},
\n \n \n \n \n \n \n Avec l'arrivée de l'été, voici un cadeau pour toi, disponible pour un temps limité. \n On veut te remercier pour ta loyauté envers l'achat local.
\n Comme toi, on aime les connexions stables et les relations durables.\n \n \n \n\n \n \n \n Grâce à la confiance de nos clients, on offre maintenant les forfaits à la plus haute vitesse dans le secteur, jusqu'à 3.5 Gbit/s.
\n Que tu souhaites plus de vitesse, battre une autre offre ou faire optimiser des équipements, n'hésite pas. On est juste à côté et on aime aider.\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ✅ Option 1
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🎁 {{amount}} chez des centaines de marques

\"Tim\"Walmart\"\"Home\"IGA\"\"Homeet plus
\n \n \n \n \n \n \n \n ⚡ Disponible instantanément sur Giftbit en cliquant sur ton montant\n \n \n \n \n \n \n \n 🤝 Condition : Maintenir l'abonnement {{commitment_months}} mois ou +\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🎁  {{amount}}\n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🪂 Annulation avant {{commitment_months}} mois : seulement à rembourser au prorata des mois restants.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ⏭️ Option 2
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Ne rien faire. Aucun changement à ton abonnement actuel.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🤝 Merci de faire rouler l'économie de notre région avec nous !
\n \n \n \n \n \n \n \n L'équipe TARGO\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Tu reçois ce courriel parce que tu es client(e) TARGO à {{description}}.
\n Une question ? N'hésite pas à nous écrire à\n support@targo.ca\n ou nous appeler au\n 514-448-0773.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n www.targo.ca\n  ·  1867 ch. de la rivière, Ste-Clotilde, QC
\n © {{year}} TARGO Communications · Tous droits réservés.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n\n\n \n \n \n\n\n\n\n \n \n \n \n \n \n ", + "html": "\n \n \n \n \n \n \n \n \n \n \n \n \n
\n Comme toi, on aime les connexions stables et les relations durables.\n
\n \n \n\n\n
\n
\n
\n \n \n\n
\n
\n
\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n
Comme toi, on aime les connexions stables et les relations durables.
\n \n \n \n {{#view_url}}\n \n {{/view_url}}\n\n \n \n \n \n \n
\n \n \n
\n \n \n \n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Bonjour {{firstname}},
\n \n \n \n \n \n \n Avec l'arrivée de l'été, voici un cadeau pour toi, disponible pour un temps limité. \n On veut te remercier pour ta loyauté envers l'achat local.
\n Comme toi, on aime les connexions stables et les relations durables.\n \n \n \n\n \n \n \n Grâce à la confiance de nos clients, on offre maintenant les forfaits à la plus haute vitesse dans le secteur, jusqu'à 3.5 Gbit/s.
\n Que tu souhaites plus de vitesse, battre une autre offre ou faire optimiser des équipements, n'hésite pas. On est juste à côté et on aime aider.\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ✅ Option 1
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🎁 {{amount}} chez des centaines de marques

\"Tim\"Walmart\"\"Home\"IGA\"\"Homeet plus
\n \n \n \n \n \n \n \n ⚡ Disponible instantanément sur Giftbit en cliquant sur ton montant\n \n \n \n \n \n \n \n 🤝 Condition : Maintenir l'abonnement {{commitment_months}} mois ou +\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🎁  {{amount}}\n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🪂 Annulation avant {{commitment_months}} mois : seulement à rembourser au prorata des mois restants.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ⏭️ Option 2
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Ne rien faire. Aucun changement à ton abonnement actuel.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🤝 Merci de faire rouler l'économie de notre région avec nous !
\n \n \n \n \n \n \n \n L'équipe TARGO\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Tu reçois ce courriel parce que tu es client(e) TARGO à {{description}}.
\n Une question ? N'hésite pas à nous écrire à\n support@targo.ca\n ou nous appeler au\n 514-448-0773.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n www.targo.ca\n  ·  1867 ch. de la rivière, Ste-Clotilde, QC
\n © {{year}} TARGO Communications · Tous droits réservés.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n\n\n \n \n \n\n\n\n\n \n \n \n \n \n \n ", "hideDesktop": false, "displayCondition": null, "containerPadding": "0px", diff --git a/services/targo-hub/lib/campaigns.js b/services/targo-hub/lib/campaigns.js index 0135857..6dd7f49 100644 --- a/services/targo-hub/lib/campaigns.js +++ b/services/targo-hub/lib/campaigns.js @@ -809,6 +809,12 @@ async function sendCampaignAsync (id) { const lang = (r.language || 'fr').toLowerCase().split('-')[0] const tplText = getTpl(lang) + // Web fallback ("View in browser") so recipients with rendering + // issues (image-blocking, antique Outlook, third-party mail apps) + // can open the campaign in any modern browser. The URL hits the + // /recipients/:row_index/view endpoint defined further down which + // re-renders the same template with this recipient's variables. + const viewUrl = `${cfg.HUB_PUBLIC_URL || 'https://msg.gigafibre.ca'}/campaigns/${encodeURIComponent(id)}/recipients/${i}/view` // Per-recipient amount override. Precedence: // 1. r.amount — explicit override typed in the manual-add dialog // 2. r.gift_value_cents → "$X" formatted (when CSV import set this) @@ -836,6 +842,7 @@ async function sendCampaignAsync (id) { expiry: p.expiry || '', commitment_months: p.commitment_months || '3', year: new Date().getFullYear(), + view_url: viewUrl, } const html = renderTemplate(tplText, vars) const toName = `${r.firstname || ''} ${r.lastname || ''}`.trim() @@ -1535,6 +1542,60 @@ async function handle (req, res, method, path) { // ── Per-campaign wildcard routes (MUST stay below the /templates and // /webhook fixed paths above, otherwise the wildcard captures them) ───── + // GET /campaigns/:id/recipients/:i/view — re-render the email for ONE + // recipient using the same variables the worker used at send time. Linked + // from the "Voir dans le navigateur / View in browser" line at the top of + // every campaign email so recipients with rendering issues (image-blocking + // clients, antique Outlook, niche third-party mail apps) can fall back to + // a fresh browser render. No auth needed — the campaign-id is 21-char + // nanoid (≈10²¹ space) and row_index alone is enough to reconcile. + const viewMatch = path.match(/^\/campaigns\/([^/]+)\/recipients\/(\d+)\/view$/) + if (viewMatch && method === 'GET') { + const c = loadCampaign(viewMatch[1]) + if (!c) return json(res, 404, { error: 'not found' }) + const i = parseInt(viewMatch[2], 10) + const r = (c.recipients || [])[i] + if (!r) return json(res, 404, { error: 'recipient not found' }) + const p = c.params || {} + const lang = (r.language || 'fr').toLowerCase().split('-')[0] + const tplPath = p.template_path || templateForLanguage(lang) + let tplText + try { tplText = fs.readFileSync(tplPath, 'utf8') } + catch { return json(res, 500, { error: 'template missing' }) } + let displayAmount = p.amount || '50 $' + if (r.amount) { + displayAmount = r.amount + } else if (r.gift_value_cents) { + const cents = Number(r.gift_value_cents) || 0 + displayAmount = cents % 100 === 0 + ? `${cents / 100} $` + : `${(cents / 100).toFixed(2)} $` + } + const vars = { + firstname: r.firstname || (lang === 'en' ? 'dear customer' : 'cher client'), + lastname: r.lastname || '', + email: r.email, + description: r.civic_address || '', + gift_url: r.gift_url, + amount: displayAmount, + expiry: p.expiry || '', + commitment_months: p.commitment_months || '3', + year: new Date().getFullYear(), + // Empty so the {{#view_url}} section block in the template collapses + // — we don't want the "view in browser" line to show up when the + // user is ALREADY viewing it in a browser. + view_url: '', + } + const html = renderTemplate(tplText, vars) + res.writeHead(200, { + 'Content-Type': 'text/html; charset=utf-8', + 'Cache-Control': 'no-store', + // Disallow indexing — these URLs aren't meant for search engines + 'X-Robots-Tag': 'noindex, nofollow', + }) + return res.end(html) + } + // GET /campaigns/:id/report.csv — per-recipient report download // Columns chosen for operational follow-up (resend, refund, support): // row, firstname, lastname, email, phone, language, customer_id, civic_address, diff --git a/services/targo-hub/templates/gift-email-en.html b/services/targo-hub/templates/gift-email-en.html index ba956d7..02e9db1 100644 --- a/services/targo-hub/templates/gift-email-en.html +++ b/services/targo-hub/templates/gift-email-en.html @@ -107,6 +107,13 @@ table, td { color: #1B2E24; } #u_body a { color: #00C853; text-decoration: under
+ + {{#view_url}} + + {{/view_url}} + diff --git a/services/targo-hub/templates/gift-email-en.json b/services/targo-hub/templates/gift-email-en.json index 960e6a7..1706418 100644 --- a/services/targo-hub/templates/gift-email-en.json +++ b/services/targo-hub/templates/gift-email-en.json @@ -20,7 +20,7 @@ "id": "HTML-1", "type": "html", "values": { - "html": "\n \n \n \n \n \n \n \n \n \n \n \n \n
\n Because great connections aren't just about fiber — they're about people too.\n
\n \n \n\n\n
\n
\n
\n \n \n\n
\n
\n
\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n
Because great connections aren't just about fiber — they're about people too.
\n \n \n \n \n \n \n \n
\n \n \n
\n \n \n \n
\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Hey {{firstname}},
\n \n \n \n \n \n \n Summer is here, and so is something special — for a limited time.\n Thank you for choosing local. Your support helps keep our community connected.
\n Because great connections aren't just about fiber — they're about people too.\n \n \n \n\n \n \n \n Because our customers trust us, we're now able to offer the fastest plans around, with speeds up to 3.5 Gbit/s.
\n Whether you're looking for more speed, want to beat another offer, or just need to optimize your gear, don't be shy! We're right next door — and we genuinely love lending a hand.\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ✅ Option 1
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🎁 {{amount}} to spend at hundreds of your favorite stores

\"Tim\"Walmart\"\"Home\"IGA\"\"Homeand more
\n \n \n \n \n \n \n \n ⚡ Instantly available on Giftbit — just click your {{amount}} to claim it!\n \n \n \n \n \n \n \n 🤝 You just need to keep your subscription for {{commitment_months}} months or more.\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🎁  {{amount}}\n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🪂 Cancellation before {{commitment_months}} months: only the prorated amount for the remaining months is refundable.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ⏭️ Option 2
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Do nothing. No changes to your current subscription.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🤝 Thanks for helping keep our local economy buzzing!
\n \n \n \n \n \n \n \n The TARGO Team\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n You're getting this email because you're a TARGO customer at {{description}}.
\n Got a question? Feel free to email us at\n support@targo.ca\n or call us at\n 514-448-0773.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n www.targo.ca\n  ·  1867 ch. de la rivière, Ste-Clotilde, QC
\n © {{year}} TARGO Communications · All rights reserved.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n\n\n \n \n \n\n\n\n\n \n \n \n \n \n \n ", + "html": "\n \n \n \n \n \n \n \n \n \n \n \n \n
\n Because great connections aren't just about fiber — they're about people too.\n
\n \n \n\n\n
\n
\n
\n \n \n\n
\n
\n
\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n
Because great connections aren't just about fiber — they're about people too.
\n \n \n \n {{#view_url}}\n \n {{/view_url}}\n\n \n \n \n \n \n
\n \n \n
\n \n \n \n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Hey {{firstname}},
\n \n \n \n \n \n \n Summer is here, and so is something special — for a limited time.\n Thank you for choosing local. Your support helps keep our community connected.
\n Because great connections aren't just about fiber — they're about people too.\n \n \n \n\n \n \n \n Because our customers trust us, we're now able to offer the fastest plans around, with speeds up to 3.5 Gbit/s.
\n Whether you're looking for more speed, want to beat another offer, or just need to optimize your gear, don't be shy! We're right next door — and we genuinely love lending a hand.\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ✅ Option 1
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🎁 {{amount}} to spend at hundreds of your favorite stores

\"Tim\"Walmart\"\"Home\"IGA\"\"Homeand more
\n \n \n \n \n \n \n \n ⚡ Instantly available on Giftbit — just click your {{amount}} to claim it!\n \n \n \n \n \n \n \n 🤝 You just need to keep your subscription for {{commitment_months}} months or more.\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🎁  {{amount}}\n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🪂 Cancellation before {{commitment_months}} months: only the prorated amount for the remaining months is refundable.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ⏭️ Option 2
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Do nothing. No changes to your current subscription.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🤝 Thanks for helping keep our local economy buzzing!
\n \n \n \n \n \n \n \n The TARGO Team\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n You're getting this email because you're a TARGO customer at {{description}}.
\n Got a question? Feel free to email us at\n support@targo.ca\n or call us at\n 514-448-0773.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n www.targo.ca\n  ·  1867 ch. de la rivière, Ste-Clotilde, QC
\n © {{year}} TARGO Communications · All rights reserved.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n\n\n \n \n \n\n\n\n\n \n \n \n \n \n \n ", "hideDesktop": false, "displayCondition": null, "containerPadding": "0px", diff --git a/services/targo-hub/templates/gift-email-fr.html b/services/targo-hub/templates/gift-email-fr.html index cfab143..1835aed 100644 --- a/services/targo-hub/templates/gift-email-fr.html +++ b/services/targo-hub/templates/gift-email-fr.html @@ -107,6 +107,17 @@ table, td { color: #1B2E24; } #u_body a { color: #00C853; text-decoration: under
+ + {{#view_url}} + + {{/view_url}} + diff --git a/services/targo-hub/templates/gift-email-fr.json b/services/targo-hub/templates/gift-email-fr.json index e274ff6..7ba76f9 100644 --- a/services/targo-hub/templates/gift-email-fr.json +++ b/services/targo-hub/templates/gift-email-fr.json @@ -20,7 +20,7 @@ "id": "HTML-1", "type": "html", "values": { - "html": "\n \n \n \n \n \n \n \n \n \n \n \n \n
\n Comme toi, on aime les connexions stables et les relations durables.\n
\n \n \n\n\n
\n
\n
\n \n \n\n
\n
\n
\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n
Comme toi, on aime les connexions stables et les relations durables.
\n \n \n \n \n \n \n \n
\n \n \n
\n \n \n \n
\n \n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Bonjour {{firstname}},
\n \n \n \n \n \n \n Avec l'arrivée de l'été, voici un cadeau pour toi, disponible pour un temps limité. \n On veut te remercier pour ta loyauté envers l'achat local.
\n Comme toi, on aime les connexions stables et les relations durables.\n \n \n \n\n \n \n \n Grâce à la confiance de nos clients, on offre maintenant les forfaits à la plus haute vitesse dans le secteur, jusqu'à 3.5 Gbit/s.
\n Que tu souhaites plus de vitesse, battre une autre offre ou faire optimiser des équipements, n'hésite pas. On est juste à côté et on aime aider.\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ✅ Option 1
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🎁 {{amount}} chez des centaines de marques

\"Tim\"Walmart\"\"Home\"IGA\"\"Homeet plus
\n \n \n \n \n \n \n \n ⚡ Disponible instantanément sur Giftbit en cliquant sur ton montant\n \n \n \n \n \n \n \n 🤝 Condition : Maintenir l'abonnement {{commitment_months}} mois ou +\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🎁  {{amount}}\n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🪂 Annulation avant {{commitment_months}} mois : seulement à rembourser au prorata des mois restants.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ⏭️ Option 2
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Ne rien faire. Aucun changement à ton abonnement actuel.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🤝 Merci de faire rouler l'économie de notre région avec nous !
\n \n \n \n \n \n \n \n L'équipe TARGO\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Tu reçois ce courriel parce que tu es client(e) TARGO à {{description}}.
\n Une question ? N'hésite pas à nous écrire à\n support@targo.ca\n ou nous appeler au\n 514-448-0773.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n www.targo.ca\n  ·  1867 ch. de la rivière, Ste-Clotilde, QC
\n © {{year}} TARGO Communications · Tous droits réservés.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n\n\n \n \n \n\n\n\n\n \n \n \n \n \n \n ", + "html": "\n \n \n \n \n \n \n \n \n \n \n \n \n
\n Comme toi, on aime les connexions stables et les relations durables.\n
\n \n \n\n\n
\n
\n
\n \n \n\n
\n
\n
\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n
Comme toi, on aime les connexions stables et les relations durables.
\n \n \n \n {{#view_url}}\n \n {{/view_url}}\n\n \n \n \n \n \n
\n \n \n
\n \n \n \n
\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Bonjour {{firstname}},
\n \n \n \n \n \n \n Avec l'arrivée de l'été, voici un cadeau pour toi, disponible pour un temps limité. \n On veut te remercier pour ta loyauté envers l'achat local.
\n Comme toi, on aime les connexions stables et les relations durables.\n \n \n \n\n \n \n \n Grâce à la confiance de nos clients, on offre maintenant les forfaits à la plus haute vitesse dans le secteur, jusqu'à 3.5 Gbit/s.
\n Que tu souhaites plus de vitesse, battre une autre offre ou faire optimiser des équipements, n'hésite pas. On est juste à côté et on aime aider.\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ✅ Option 1
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🎁 {{amount}} chez des centaines de marques

\"Tim\"Walmart\"\"Home\"IGA\"\"Homeet plus
\n \n \n \n \n \n \n \n ⚡ Disponible instantanément sur Giftbit en cliquant sur ton montant\n \n \n \n \n \n \n \n 🤝 Condition : Maintenir l'abonnement {{commitment_months}} mois ou +\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🎁  {{amount}}\n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🪂 Annulation avant {{commitment_months}} mois : seulement à rembourser au prorata des mois restants.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ⏭️ Option 2
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Ne rien faire. Aucun changement à ton abonnement actuel.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 🤝 Merci de faire rouler l'économie de notre région avec nous !
\n \n \n \n \n \n \n \n L'équipe TARGO\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n Tu reçois ce courriel parce que tu es client(e) TARGO à {{description}}.
\n Une question ? N'hésite pas à nous écrire à\n support@targo.ca\n ou nous appeler au\n 514-448-0773.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n www.targo.ca\n  ·  1867 ch. de la rivière, Ste-Clotilde, QC
\n © {{year}} TARGO Communications · Tous droits réservés.
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n\n\n \n \n\n\n \n \n \n\n\n\n\n \n \n \n \n \n \n ", "hideDesktop": false, "displayCondition": null, "containerPadding": "0px",