Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
5aa24f4
Add a 7-day no-card free trial for new organizations
ejsmith Oct 22, 2026
34a8b47
Address review feedback on the free trial
ejsmith Oct 22, 2026
0a31a3c
Keep the Free plan banner from breaking when limits are missing
ejsmith Oct 22, 2026
3e67fd7
Only say a trial ended when the organization never subscribed
ejsmith Oct 22, 2026
4cf4254
Serialize organization creation and track the creating user
ejsmith Oct 22, 2026
6614a3a
Find owned organizations by creator and publish invite responses
ejsmith Oct 22, 2026
fa0c62a
Don't cap ownership checks at one page of organizations
ejsmith Oct 22, 2026
beb2f77
Page plan stats and remove an organization whose creator save fails
ejsmith Oct 22, 2026
4610ad5
Send trial reminders to every member before marking them sent
ejsmith Oct 22, 2026
6664a4f
Serialize downgrades to Free per owner
ejsmith Oct 22, 2026
4862be2
Backfill organization creators instead of deriving ownership
ejsmith Oct 22, 2026
33ba4a1
Keep the billing price when an admin applies a trial
ejsmith Oct 22, 2026
deb3d55
Don't fail Exie requests when the shared trial cost update fails
ejsmith Oct 22, 2026
b2d8051
Only let admins put free or trial organizations on a trial
ejsmith Oct 22, 2026
c9e65b1
Take the billing lock for admin plan changes
ejsmith Oct 22, 2026
a77766f
Make the free trial 14 days
ejsmith Oct 23, 2026
6f684ee
Replace the permanent trial and Free banners with timely notices
ejsmith Oct 23, 2026
e640f5b
Keep notice dismissals reliable
ejsmith Oct 23, 2026
13b0dae
Reject Exie requests that start past the shared trial cost limit
ejsmith Oct 23, 2026
e616766
Hold the owner lock as long as the billing lock
ejsmith Oct 23, 2026
b6854a5
Fix email verification request
niemyjski Nov 3, 2026
ce61af1
Tighten trial eligibility and keep paid invites unchanged
ejsmith Nov 4, 2026
39956c6
Address trial review feedback
ejsmith Nov 7, 2026
9a04d17
Harden trial admission and preserve concurrent migration updates
niemyjski Nov 8, 2026
9219513
Spell out organization in the trial Storybook comment
niemyjski Nov 8, 2026
67e3b5c
Preserve extended trials when expiration cache is stale
niemyjski Nov 10, 2026
646607b
Make trial claims atomic and apply PR async style
niemyjski Nov 11, 2026
20df517
Protect trial history with a dedicated HMAC secret
niemyjski Nov 11, 2026
4051340
Address trial review feedback using existing form and test patterns
niemyjski Nov 11, 2026
96c0926
Separate trial frontend test setup actions and assertions
niemyjski Nov 11, 2026
a9d1e12
Let a mailbox trial again after 12 months and show what a downgrade l…
ejsmith Nov 11, 2026
a6c0495
Preserve trial uniqueness on renewal and show conversion losses
niemyjski Nov 12, 2026
7ae3a4e
Align trial unit tests with fixture and arrange conventions
niemyjski Nov 12, 2026
b4ed058
Address trial limits, expiry recovery, and review feedback
niemyjski Nov 12, 2026
98185ea
Keep paging awaits outside conditional statements
niemyjski Nov 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions build/EmailTemplatePreviews.cs
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,11 @@ EmailLink[] GetActionLinks(string stackId) =>
"[Engineering] Payment failed! Update billing information to avoid service interruption!",
"Engineering",
$"{appUrl}/organization/organization-1/billing")),
new("organization-trial-ending", "Trial ending", new OrganizationTrialEndingEmail(
"[Engineering] Your free trial ends soon",
"Engineering",
"Friday, October 30, 2026",
$"{appUrl}/organization/organization-1/upgrade")),
new("project-daily-summary", "Daily summary", new ProjectDailySummaryEmail(
"[Storefront API] Summary for August 24, 2026",
"Storefront API",
Expand Down
3 changes: 2 additions & 1 deletion docs/privacy.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ We collect the e-mail addresses of those who communicate with us via e-mail or t
## Data storage

* Exceptionless uses third party vendors and hosting partners to provide the necessary hardware, software, networking, storage, and related technology required to run Exceptionless. Although Exceptionless owns the code, databases, and all rights to the Exceptionless application, you retain all rights to your data.
* You can delete your personal data at any time by visiting the my account page and clicking the delete account button.
* You can delete your account data at any time by visiting the my account page and clicking the delete account button. Account deletion does not automatically remove the separate trial eligibility record described below.
* To limit repeated free trials, we keep a separate trial eligibility record containing only a keyed, one-way identifier of your email address and the trial claim date. This record does not contain your email address, user ID, or organization ID. It expires after 365 days, including when you delete your account, and is removed through routine cleanup. After it expires, your mailbox can be eligible for another trial.

## Disclosure

Expand Down
57 changes: 57 additions & 0 deletions k8s/exceptionless/templates/jobs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -789,6 +789,63 @@ spec:
{{- include "exceptionless.otel-env" . | indent 16 }}
restartPolicy: OnFailure

---
apiVersion: batch/v1
kind: CronJob
metadata:
name: {{ template "exceptionless.fullname" . }}-jobs-trial-expiration
labels:
app: {{ template "exceptionless.name" . }}
component: {{ template "exceptionless.fullname" . }}-jobs-trial-expiration
tier: {{ template "exceptionless.fullname" . }}-job
chart: {{ template "exceptionless.chart" . }}
release: {{ .Release.Name }}
heritage: {{ .Release.Service }}
spec:
schedule: "15 * * * *" # hourly
concurrencyPolicy: Forbid
jobTemplate:
spec:
template:
spec:
containers:
- name: {{ template "exceptionless.name" . }}-jobs-trial-expiration
image: "{{ .Values.jobs.image.repository }}:{{ .Values.version }}"
imagePullPolicy: {{ .Values.jobs.image.pullPolicy }}
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 10
resources:
requests:
memory: 75Mi
cpu: 50m
limits:
memory: 250Mi
cpu: 400m
args: [TrialExpiration]
envFrom:
- configMapRef:
name: {{ template "exceptionless.fullname" . }}-config
env:
- name: HOST_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: K8S_POD_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.podIP
- name: K8S_POD_UID
valueFrom:
fieldRef:
fieldPath: metadata.uid
{{- include "exceptionless.otel-env" . | indent 16 }}
restartPolicy: OnFailure

---
apiVersion: apps/v1
kind: Deployment
Expand Down
Loading
Loading