Skip to content

feat(support): ask for a license on the 30th day of use - #3922

Merged
datlechin merged 2 commits into
mainfrom
feat/support-ask
Oct 30, 2026
Merged

datlechin merged 2 commits into
mainfrom
feat/support-ask

Conversation

@datlechin

@datlechin datlechin commented Oct 30, 2026 •

Copy link
Copy Markdown
Member

Summary

  • Days of use (UsageDayCounter): the app counts the distinct local days it is in use, on becoming active and when the date turns while it is active. The count stays in this Mac's defaults and is never sent.
  • The ask (SupportAskSchedule, SupportAskCoordinator, SupportAskView): on the 30th day of use without a license, a sheet on the window in use asks once. Buy a License opens the pricing page with ref=app-ask; I Use It Personally quiets it for a year; Not Now, Esc, or closing the window, for 90 days. It never shows with a license, in the first five minutes after launch, while any query runs, over another sheet or modal, or on a window other than a connection, data file or welcome window. The schedule is pure, and the coordinator looks again only when a window becomes key, the app becomes active, or the launch quiet period ends, so nothing polls.
  • Support window: the text now says the app is free at work too, and asks anyone who uses it for work to buy a license, as a request and not a condition.
  • New strings are in the catalog and translated for fr, ko, tr, vi, zh-Hans and zh-Hant through Xcode's export and import. The catalog diff is large because the localization script writes it the way Xcode does, which reorders keys the last hand merge left out of order.
  • m16/accounts touches the same Support views: after this merges, its merge of main changes LicenseManager.shared.supportAudience to FeatureAccess.shared.supportAudience in SupportAskCoordinator.shared.
  • Monetization roadmap tasks R1.1 to R1.3 (tablepro-cloud docs/monetization-roadmap.md).
  • Docs: TableProApp/docs pull request to follow.

Screenshots

The ask on the welcome window, on the 30th day of use. A debug build with the quiet period shortened, so the sheet appears without a five-minute wait.

Light Dark
The license ask in light mode The license ask in dark mode

Test plan

  • UsageDayCounterTests: one count per local day, local midnight rather than UTC, the count survives a new counter.
  • SupportAskScheduleTests: nothing before day 30, never with a license, 90 days after any answer but personal use, a year after it, the launch quiet period and a running query hold the ask.
  • SupportAskCoordinatorTests: the ask shows on day 30 past the quiet period, waits on day 29, during the quiet period and a running query, never with a license or on a utility window, shows on a suffixed connection window, buying opens ref=app-ask and holds 90 days, personal use holds a year, one ask at a time.
  • SupportLinksTests covers the new app-ask referrer.
  • 26 cases pass with verify.sh test; lint is clean.

@datlechin
datlechin enabled auto-merge (squash) October 30, 2026 18:33
@datlechin
datlechin merged commit f257334 into main Oct 30, 2026
8 checks passed
@datlechin
datlechin deleted the feat/support-ask branch October 31, 2026 06:13
datlechin added a commit that referenced this pull request Oct 31, 2026
Brings main's 46 commits, among them the license ask (#3922), the first-query
mark (#3886) and the trademark policy (#3887).

- AppDelegate: the ask starts after the Team Library sync; main's periodic
  license validation stays out, since accounts replace it.
- MainContentCoordinator+History: Telemetry.queryExecuted() stays; the
  heartbeat marker #3886 restored is gone with MacAnalyticsProvider.
- SupportLinks: the referrer moved to Core/Services on this branch; the ask's
  case (app-ask) joins it there.
- SupportAskCoordinator.shared reads FeatureAccess for the license.
- FirstQueryAnalyticsTests checks Telemetry's first-query mark.
- Localizable.xcstrings: merged key by key; no key changed on both sides.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant