read.markets/app/templates/terms.html
Giorgio Gilestro a07fd144ea stripe: per-cadence cooling-off + manage-subscription button
Bundles three related pieces that came out of the operator's first
end-to-end test of the paid flow:

1. Manage subscription button on /settings (paid users with a real
   Stripe sub — i.e. not credit-granted access). POSTs to the existing
   /api/stripe/portal endpoint; Stripe-hosted customer portal handles
   card updates, cancellation, monthly↔annual switch, invoice history.
   Replaces the stale "Paid features unlock with Paddle (D.3) or
   invite credits" hint for free users with a live link to /pricing.

2. Per-cadence cooling-off treatment:

   - **Annual £70**: 14-day free trial via
     subscription_data.trial_period_days=14. No money moves during
     the trial, so the CCR 2013 14-day refund question doesn't arise
     (nothing paid = nothing to refund). Card is still required at
     checkout so Stripe can charge on day 15.

   - **Monthly £7**: bills immediately. A 14-day trial there would
     give away ~50% of cycle one. Instead, /pricing now carries a
     required tick-box above the Subscribe buttons (subscribe stays
     disabled until checked) — by ticking, the user expressly
     consents to begin performance immediately and acknowledges that
     this extinguishes their statutory 14-day right under Reg 36
     CCR 2013. Consent collected on our own page (not via Stripe's
     account-wide consent_collection.terms_of_service) so each
     product can keep its own Terms URL as we add more.

3. T&C §6 clause 1 split into 1a (annual / trial substitute) +
   1b (monthly / Reg 36 waiver via on-page tick-box). Clause 2
   (post-cooling-off cancellation) unchanged.

Settings page shows "Free trial — N days remaining" while the
sub is in `trialing` status, falling back to "Paid subscription
active." once it transitions to active. Countdown is computed
server-side from User.stripe_trial_end_at (new column, migration
0020) populated by the subscription.created/updated webhook from
the Stripe trial_end timestamp; cleared on the trialing→active
transition and on revoke.

Drive-by: fixed a structlog kwarg-name collision on
`log.warning(..., event=event_type, ...)` in both polar_webhook.py
and stripe_billing.py — `event` is structlog's positional event
name and "got multiple values" crashed the user-not-found log
path. Renamed to `event_type=` everywhere it appeared. Caught by
the new trialing-stores-trial-end test.

Tests
- 4 new in test_stripe_billing.py covering monthly (no trial, no
  consent_collection), annual (trial, no consent), trialing stores
  trial_end, trialing→active clears trial_end.
- 1 existing test renamed + reworked for the consent split.
- Full suite: 224 passed, 5 skipped.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 20:06:19 +02:00

282 lines
12 KiB
HTML

{% extends "public_base.html" %}
{% block title %}{{ BRAND_NAME }} &middot; Terms and Conditions{% endblock %}
{% block main %}
<section class="public-section">
<h1 class="public-section__head">Terms and Conditions</h1>
<p style="color: var(--muted); font-size: 13px;">
Last updated: 2026-05-26. {{ LEGAL_OPERATOR }} operates {{ BRAND_NAME }}
(the &ldquo;Service&rdquo;) from {{ OPERATOR_JURISDICTION }}.
</p>
</section>
<section class="public-section">
<h2 class="public-section__head">1. Acceptance</h2>
<p>
By creating an account or otherwise using the Service you agree to
these Terms and to the <a href="/privacy">Privacy notice</a> and
<a href="/disclaimer">Disclaimer</a>. If you do not agree, do not
use the Service.
</p>
</section>
<section class="public-section">
<h2 class="public-section__head">2. The Service</h2>
<p>
{{ BRAND_NAME }} provides a macro-strategy dashboard with curated
market data, news, and AI-generated commentary. Paid features include
portfolio import, AI portfolio analysis, and optional end-to-end
encrypted cloud sync of your portfolio. Feature lists, tiers, and
pricing are described on the <a href="/pricing">Pricing page</a> and
may change over time.
</p>
<p>
Nothing produced by the Service is investment advice. See the
<a href="/disclaimer">Disclaimer</a> for the full position.
</p>
</section>
<section class="public-section">
<h2 class="public-section__head">3. Accounts &amp; authentication</h2>
<ul>
<li>Accounts are tied to a working email address. Authentication is
by one-time codes sent to that address &mdash; no passwords.</li>
<li>You are responsible for the security of the email inbox you sign
up with. Anyone with access to that inbox can sign in.</li>
<li>One account per person. Do not share accounts or sign in on
behalf of someone else without their explicit permission.</li>
<li>You may delete your account at any time by writing to
<a href="mailto:{{ OPERATOR_EMAIL }}">{{ OPERATOR_EMAIL }}</a>.</li>
</ul>
</section>
<section class="public-section">
<h2 class="public-section__head">4. Acceptable use</h2>
<p>You agree not to:</p>
<ul>
<li>Use automated tools to scrape, mirror, or repackage the Service
or any of its data, including market data and AI-generated
commentary, without prior written permission.</li>
<li>Use the Service, or any of its output, to ingest, train, fine-tune
or evaluate any machine-learning model without prior written
permission.</li>
<li>Abuse the one-time-code (OTP) system, including by submitting
emails you do not control.</li>
<li>Attempt to bypass authentication, paid-tier gating, or rate
limits.</li>
<li>Use the Service in any way that could damage, disable,
overburden, or impair it.</li>
<li>Use the Service to harass, defame, or threaten any person.</li>
<li>Reverse engineer, decompile, or otherwise extract source code,
except where applicable law expressly permits it.</li>
<li>Use the Service in a way that is unlawful in your jurisdiction.</li>
</ul>
</section>
<section class="public-section">
<h2 class="public-section__head">5. Paid plans</h2>
<p>
If and when paid plans become available, you will be told the
applicable fees at point of sale. Paid features remain active for as
long as the subscription is current or any time-bounded credit
granted to your account is still valid. You can cancel a paid
subscription at any time; cancellation takes effect at the end of
the current billing period unless otherwise stated.
</p>
<p>
Where the law gives you a 14-day right to cancel a subscription
(Consumer Contracts (Information, Cancellation and Additional
Charges) Regulations 2013, UK), that right applies. By starting to
use a paid feature immediately on purchase you agree we may begin
supplying the service within the cancellation period, and you
acknowledge that you lose the right to cancel in respect of any
digital content already delivered.
</p>
</section>
<section class="public-section">
<h2 class="public-section__head">6. Refunds</h2>
<p>
<strong>14-day cooling-off period (UK / EU consumers).</strong>
The Consumer Contracts (Information, Cancellation and Additional
Charges) Regulations 2013 give consumers a 14-day right to cancel
digital service contracts. We honour this right in different ways
depending on your billing cadence.
</p>
<p>
<strong>1a. Annual subscriptions.</strong> Every new annual
subscription begins with a 14-day free trial. No payment is taken
during the trial; cancel any time before the trial ends and you
are not charged. This is offered as a substitute for, and is at
least as generous as, the statutory 14-day refund right. After
the trial ends and the first payment is taken, the rules in
paragraph 2 below apply.
</p>
<p>
<strong>1b. Monthly subscriptions.</strong> Monthly subscribers
receive immediate access to paid features at checkout and are
billed on day one. Before you can start a monthly subscription
you must tick a required consent box on the pricing page in
which you (i) agree to these Terms, (ii) give express consent to
begin performance immediately, and (iii) acknowledge that, under
Regulation 36 of the Consumer Contracts Regulations 2013, doing
so extinguishes your statutory 14-day right to cancel in respect
of digital content already delivered. The rules in paragraph 2
below apply from the first day.
</p>
<p>
<strong>Cancellation after the cooling-off window.</strong> You can
cancel a paid subscription at any time. Cancellation takes effect at
the end of the current billing period; we do not pro-rate refunds
for the unused portion of a period you have already started, unless
a separate paragraph below applies.
</p>
<p>
<strong>Termination by us without fault on your part.</strong> If we
terminate or materially reduce a paid feature for reasons that are
not a breach by you (including a service shutdown), we will refund
the unused portion of any prepaid fees on a pro-rata basis. The same
applies under clause 8 if we terminate for a breach you did not
cause, and under clause 11 if you close your account because you do
not accept a material change to these Terms.
</p>
<p>
<strong>Service faults.</strong> Nothing in this clause limits your
statutory rights as a UK consumer under Part 1 of the Consumer
Rights Act 2015. If a paid feature is not supplied with reasonable
care and skill, you may be entitled to a repeat performance or a
price reduction (which can be a full refund) under that Act.
</p>
<p>
<strong>How to request a refund.</strong> Email
<a href="mailto:{{ OPERATOR_EMAIL }}">{{ OPERATOR_EMAIL }}</a> from
the address tied to your account, with the order reference if you
have one. We aim to acknowledge within 5 working days. Refunds are
returned to the original payment method and typically arrive within
14 days of approval, subject to your bank&rsquo;s processing time.
</p>
<p>
Referral credits and any other non-cash credits applied to your
account are not refundable for cash.
</p>
</section>
<section class="public-section">
<h2 class="public-section__head">7. Service availability</h2>
<p>
The Service is provided on a best-effort basis. There is no service
level agreement: outages, data delays, and feature changes may occur
without notice. Scheduled and unscheduled downtime is possible.
</p>
</section>
<section class="public-section">
<h2 class="public-section__head">8. Content &amp; ownership</h2>
<p>
The Service&rsquo;s code, design, indicator selection, and prompts
are owned or licensed by {{ LEGAL_OPERATOR }}. To the extent any
copyright subsists in the AI-generated commentary under UK law, it
vests in or is licensed to {{ LEGAL_OPERATOR }}. Market data is
sourced from third parties (e.g. Yahoo Finance and public RSS
feeds); their respective rights apply. You may view, save, and
quote short excerpts for personal use; you may not republish or
redistribute substantial portions, or use the Service&rsquo;s
output to train machine-learning models, without prior written
permission.
</p>
<p>
Any portfolio you upload remains your data. The Service does not
persist your holdings as plaintext (see the
<a href="/privacy">Privacy notice</a>).
</p>
</section>
<section class="public-section">
<h2 class="public-section__head">9. Suspension &amp; termination</h2>
<p>
We may suspend or terminate access without notice for violation of
these Terms or for activity that risks the integrity, security, or
legality of the Service. You may stop using the Service at any time.
</p>
<p>
For paid subscribers, suspension for suspected breach will, where
reasonably practicable, be preceded by notice and an opportunity to
respond, unless immediate suspension is necessary to protect the
Service, its users, or any third party. If we terminate a paid
subscription for a breach you did not cause, we will refund the
unused portion of any prepaid fees on a pro-rata basis (see
clause 6).
</p>
</section>
<section class="public-section">
<h2 class="public-section__head">10. No warranty</h2>
<p>
The Service is provided &ldquo;as is&rdquo; and &ldquo;as
available&rdquo;, without warranties of any kind, express or implied,
including merchantability, fitness for a particular purpose, accuracy,
and non-infringement, to the maximum extent permitted by law.
</p>
</section>
<section class="public-section">
<h2 class="public-section__head">11. Limitation of liability</h2>
<p>
To the maximum extent permitted by law, {{ LEGAL_OPERATOR }} is not
liable for any indirect, incidental, special, consequential, or
punitive damages, or for any investment loss or missed gain, arising
from your use of the Service. Subject to the carve-outs below, the
total aggregate liability of {{ LEGAL_OPERATOR }} to you for any
claim is capped at the greater of (a) the fees you have paid in the
12 months immediately preceding the claim, or (b) GBP 50.
</p>
<p>
Nothing in these Terms limits or excludes liability that cannot
lawfully be limited or excluded, including (i) death or personal
injury caused by negligence, (ii) fraud or fraudulent
misrepresentation, (iii) for consumers, any statutory rights under
Part 1 of the Consumer Rights Act 2015 (including the right to
services performed with reasonable care and skill), and (iv) any
other liability that cannot be excluded under applicable mandatory
law in your country of residence.
</p>
<p>
If you are a consumer, the cap in the first paragraph of this
clause does not apply to claims for direct losses arising from a
breach of those statutory rights, which remain at the level the law
requires.
</p>
</section>
<section class="public-section">
<h2 class="public-section__head">12. Changes</h2>
<p>
These Terms may change. Material changes will be flagged in-app or
by email. Continued use after a change means you accept the updated
Terms. If you do not accept a material change, you may close your
account before the change takes effect; we will refund any prepaid
fees for the unused period.
</p>
</section>
<section class="public-section">
<h2 class="public-section__head">13. Governing law and jurisdiction</h2>
<p>
These Terms are governed by the laws of England and Wales. Subject
to any mandatory law of the consumer&rsquo;s country of residence,
the courts of England and Wales have <strong>non-exclusive</strong>
jurisdiction over any dispute. UK consumers may also bring
proceedings in the courts of the part of the United Kingdom in
which they are habitually resident.
</p>
</section>
<section class="public-section">
<h2 class="public-section__head">14. Contact</h2>
<p>
<a href="mailto:{{ OPERATOR_EMAIL }}">{{ OPERATOR_EMAIL }}</a>
</p>
</section>
{% endblock %}