diff --git a/CHANGELOG.md b/CHANGELOG.md
index e3cd89d49144..79b071abf871 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,13 @@
# Changelog
All notable changes to this project will be documented in this file.
-## [1.3] - Unreleased
+## Unreleased
+
+### Fixed
+- Fix weekly report time range plausible/analytics#951
+
+
+## [1.3] - 2021-04-14
### Added
- Stats API [currently in beta] plausible/analytics#679
diff --git a/lib/plausible_web/templates/email/weekly_report.html.eex b/lib/plausible_web/templates/email/weekly_report.html.eex
index be6ae610b37d..aa4e3bf2a511 100644
--- a/lib/plausible_web/templates/email/weekly_report.html.eex
+++ b/lib/plausible_web/templates/email/weekly_report.html.eex
@@ -223,7 +223,7 @@ body {
-
<%= PlausibleWeb.StatsView.large_number_format(@unique_visitors) %>
+
<%= PlausibleWeb.StatsView.large_number_format(@unique_visitors) %>
diff --git a/lib/workers/send_email_report.ex b/lib/workers/send_email_report.ex
index 72ee4465c3a0..3621fe1f79d3 100644
--- a/lib/workers/send_email_report.ex
+++ b/lib/workers/send_email_report.ex
@@ -7,7 +7,9 @@ defmodule Plausible.Workers.SendEmailReport do
@impl Oban.Worker
def perform(%{"interval" => "weekly", "site_id" => site_id}, _job) do
site = Repo.get(Plausible.Site, site_id) |> Repo.preload(:weekly_report)
- query = Query.from(site.timezone, %{"period" => "7d"})
+ today = Timex.now(site.timezone) |> DateTime.to_date()
+ date = Timex.shift(today, weeks: -1) |> Timex.end_of_week() |> Date.to_iso8601()
+ query = Query.from(site.timezone, %{"period" => "7d", "date" => date})
for email <- site.weekly_report.recipients do
unsubscribe_link =
diff --git a/test/workers/send_email_report_test.exs b/test/workers/send_email_report_test.exs
index 21c1b5c8ef33..6d13b82a0ac0 100644
--- a/test/workers/send_email_report_test.exs
+++ b/test/workers/send_email_report_test.exs
@@ -1,7 +1,9 @@
defmodule Plausible.Workers.SendEmailReportTest do
+ import Plausible.TestUtils
use Plausible.DataCase
use Bamboo.Test
alias Plausible.Workers.SendEmailReport
+ alias Timex.Timezone
defp perform(args) do
SendEmailReport.new(args) |> Oban.insert!()
@@ -25,6 +27,43 @@ defmodule Plausible.Workers.SendEmailReportTest do
to: [nil: "user2@email.com"]
)
end
+
+ test "calculates timezone correctly" do
+ site = insert(:site, timezone: "US/Eastern")
+ insert(:weekly_report, site: site, recipients: ["user@email.com"])
+
+ now = Timex.now(site.timezone)
+ last_monday = Timex.shift(now, weeks: -1) |> Timex.beginning_of_week()
+ last_sunday = Timex.shift(now, weeks: -1) |> Timex.end_of_week()
+ sunday_before_last = Timex.shift(last_monday, minutes: -1)
+ this_monday = Timex.beginning_of_week(now)
+
+ create_pageviews([
+ # Sunday before last, not counted
+ %{domain: site.domain, timestamp: Timezone.convert(sunday_before_last, "UTC")},
+ # Sunday before last, not counted
+ %{domain: site.domain, timestamp: Timezone.convert(sunday_before_last, "UTC")},
+ # Last monday, counted
+ %{domain: site.domain, timestamp: Timezone.convert(last_monday, "UTC")},
+ # Last sunday, counted
+ %{domain: site.domain, timestamp: Timezone.convert(last_sunday, "UTC")},
+ # This monday, not counted
+ %{domain: site.domain, timestamp: Timezone.convert(this_monday, "UTC")},
+ # This monday, not counted
+ %{domain: site.domain, timestamp: Timezone.convert(this_monday, "UTC")}
+ ])
+
+ perform(%{"site_id" => site.id, "interval" => "weekly"})
+
+ assert_delivered_email_matches(%{
+ to: [nil: "user@email.com"],
+ html_body: html_body
+ })
+
+ # Should find 2 visiors
+ assert html_body =~
+ ~s(2)
+ end
end
describe "monthly_reports" do