Offer an optional seven-day cloud trial without a card - #4529
Offer an optional seven-day cloud trial without a card#4529benjaminshafii wants to merge 12 commits into
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub. 4 Skipped Deployments
|
|
|
||
| test("an optional seven-day cloud trial explains model access, starts without a card, and ends without a subscription", async ({ world, user, probe, evidence, step }) => { | ||
| const trial = async () => { | ||
| const result = await probe.api(world.den.admin, "/v1/billing/web-trial"); |
There was a problem hiding this comment.
Cloud trial email exposes the customer organization name
The new trial email renders the recipient organization's actual name, identifying the customer in outbound content.
Evidence
sendDueCloudTrialNotifications()selects the organization name while resolving trial recipients inee/apps/den-api/src/cloud-trial-notifications.ts:42-48.- The notification worker passes that customer-controlled value as
organizationNameto thecloudTrialemail inee/apps/den-api/src/cloud-trial-notifications.ts:54-60. - The new email template renders
organizationNamein customer-facing content atpackages/email/src/templates/cloud-trial.tsx:17andpackages/email/src/templates/cloud-trial.tsx:21.
Also found at 1 additional location
packages/email/src/templates/cloud-trial.tsx:16-21
Identified by Warden · confidentiality-review · 5MC-FF8
| return { | ||
| status: covered ? "ineligible" : trial ? (trial.expires_at.getTime() > Date.now() ? "active" : "expired") : eligible ? "eligible" : "ineligible", | ||
| startedAt: trial?.started_at.toISOString() ?? null, | ||
| expiresAt: trial?.expires_at.toISOString() ?? null, |
There was a problem hiding this comment.
Trial access can make published desktop clients reject the billing response
When this trial is active, Den reports accessSource: "trial" on the existing web-billing surface, but already-published desktop clients only accept subscription and complimentary, so their access check returns null instead of granting cloud access.
Evidence
- The new trial record is loaded by
loadOpenWorkWebBillingSummary()and passed toresolveOpenWorkWebAccess(). - Active trials therefore produce
accessSource: "trial"on/v1/billing/web. - The published desktop parser in
apps/app/src/app/lib/den.tsrejects any access source other thansubscription,complimentary, ornull; the same diff's parser update cannot protect already-published builds. - Ship a desktop release that accepts
trialbefore deploying the Den-side trial access behavior; split the Den change until that release is available.
Also found at 4 additional locations
ee/apps/den-api/src/openwork-web-access.ts:1-1ee/apps/den-api/src/openwork-web-access.ts:61-61ee/apps/den-api/src/routes/org/billing.ts:165-165ee/apps/den-api/src/stripe-billing.ts:941
Identified by Warden · desktop-den-sync-review · MQK-H9Q
What a person sees when the trial endsActual screenshots from the passing browser journey on
The screenshots use an isolated workspace and development email outbox. Billing is deliberately unconfigured in this fixture, so the billing setup notice is not a production checkout claim. No real email or payment was sent.
|
Test evidence — a-seven-day-cloud-trial-starts-without-a-card-provisions-the-first-task-once-and — ✅ passedSHA 09ec4c8 · engine v1 ✅ passed · 10 expectations passed · 0 failed · 0 pending verdict passed · 0 user observations · 0 probes · steps 0/0 ℹ️ ASSERTION — 1. New trials stay unavailable before compatible-client rolloutWith Web enabled but the trial rollout disabled, no offer is eligible, a start returns trial_unavailable, and no trial row is created.
ℹ️ ASSERTION — 2. Paid access is checked before provisioningA valid write token in an organization without Web access was denied; zero worker rows and zero provider creates.
ℹ️ ASSERTION — 3. Only an administrator can start a single seven-day trial without a card or subscriptionA member was denied before writes; four concurrent administrator requests shared one persisted seven-day window, created no subscription or runtime, and exposed the same status to members.
ℹ️ ASSERTION — 4. A trial cannot be multiplied across organizations and another team's member cannot start itThe same starter received trial_unavailable in a second organization, a member outside that organization was denied, and its trial table remained empty while the first trial retained its original dates.
ℹ️ ASSERTION — 5. Only a valid write-scoped create can allocate a workspaceRead-only create, invalid input, read, and send allocated no workers and made no provider creates.
ℹ️ ASSERTION — 6. Concurrent first requests share one provisioning attemptSix MCP create calls returned retryable provisioning with no submitted session; one worker row and one Daytona HTTP create were observed, before any browser endpoint was called.
ℹ️ ASSERTION — 7. Retry runs the first task without browser setup, and the browser reuses its workspaceThe real provisioner observed healthy HTTP, persisted ready state, and the MCP retry created one native session with the original prompt. A subsequent browser request reused that ready workspace without another sandbox.
ℹ️ ASSERTION — 8. Members get distinct workspacesA second member's first call created a different worker and sandbox without creating a session on the first member's runtime.
ℹ️ ASSERTION — 9. The trial warns its owner, expires once, and blocks new work without renewing or chargingAged real trial timestamps produced one ending and one expired email, durable sent markers prevented repeats, repeating start retained the expired window, and existing runtime counts stayed unchanged after access denial. No subscription was created.
ℹ️ ASSERTION — 10. An explicit paid upgrade restores access after trial expiry, and canceled paid access still blocks workThe seeded paid entitlement reused the existing runtime for one new session; canceling it denied further work without another sandbox or session.
Test run created 2026-09-05T20:21:21.638Z · Source: Test evidence — an-optional-seven-day-cloud-trial-explains-model-access-starts-without-a-card-an — ✅ passedSHA 09ec4c8 · engine v1 ⏳ 0/5 screenshots passed · 5 pending · 4 assertions · 4 expectations passed · 0 failed · 5 pending
[world] den(daytona) · [seed] api GET /v1/me/orgs · web(signed in) ⏳ PENDING — 1. The optional cloud trial clearly offers seven days without a card or automatic charges, explains that model access is separate, and provides a way to skip
ℹ️ ASSERTION — 2. Reviewing and skipping the cloud offer does not start a trial or create a subscriptionThe visible offer explained the no-card terms and separate model access; after Do this later, the real trial endpoint remained eligible with no dates and billing remained locked with no subscription.
⏳ PENDING — 3. The active trial shows when cloud access ends and a clear Open OpenWork Web action, without implying model credits or a paid subscription
ℹ️ ASSERTION — 4. The visible start action creates one seven-day trial that survives reload without a paid subscription{"started":{"status":"active","startedAt":"2026-09-05T20:20:23.394Z","expiresAt":"2026-09-12T20:20:23.394Z"},"hasAccess":true,"subscription":null}
⏳ PENDING — 5. The actual trial reminder email has a readable monochrome OpenWork design, explains when cloud access pauses, reassures that saved work remains, and makes any paid upgrade optional
ℹ️ ASSERTION — 6. The owner is notified before expiry while cloud access remains availableThe persisted trial entered its final day; the real notification worker sent the owner an email and Web still reported active access without a subscription.
⏳ PENDING — 7. The expired trial explains that cloud access has ended and that upgrading is an explicit choice, with no automatic charge and retained work explained
⏳ PENDING — 8. The actual expired-trial email clearly says cloud access has paused, saved work is retained, no payment is taken automatically, and offers a calm way to review cloud access
ℹ️ ASSERTION — 9. Trial expiry appears in the app and sends its owner a notification while access stops and no subscription is createdThe real persisted trial expired; the screen offered View paid plan, the development outbox captured its owner notification, and billing stayed locked with subscription null after viewing the plan.
Test run created 2026-09-05T20:16:57.772Z · Source: |



Adds an optional seven-day OpenWork Cloud trial from onboarding and the Web page. Starting requires no card and creates no subscription. Model-provider setup and charges remain separate. Active trials show the exact end date and an optional paid-plan action; expiry retains saved work and blocks new cloud requests without automatic charges.
New trials are off by default behind
DEN_OPENWORK_CLOUD_TRIAL_ENABLED. Enable only after releasing compatible desktop clients that acceptaccessSource: "trial"; disabling the flag later prevents new starts while honoring existing trial dates. The generated SDK now includes the trial routes and access source, fixing the failing generation check.The trial is durable and one-time per workspace and starting account. Admin-only starts are safe to retry concurrently. The server sends polished reminder and expired-trial emails with the actual end date, retained-work reassurance, and a workspace return action. The returning Web view explains what remains available and makes upgrading optional. Paid or complimentary access suppresses outdated trial notices.
Verification on
09ec4c88084d1d83fa379427ead864f2fac08ccf:env -u DATABASE_HOST -u DATABASE_USERNAME -u DATABASE_PASSWORD DB_MODE=mysql pnpm evals:pr specs/remote-session-first-use.test.ts.env -u DATABASE_HOST -u DATABASE_USERNAME -u DATABASE_PASSWORD OPENWORK_EVAL_REF=feat/cloud-week-trial pnpm evals:e2e cloud-week-trial.Current PR verdict: Incomplete only because automated visual judging/publishing requires the expired Infisical login to be refreshed. Both final-head runtime journeys pass; Actual email and returning-Web screenshots are attached for review. The PR stays draft until the five automated visual judgments and their generated evidence are published.
Apply migration
0092before deployment and follow the rollout order indocs/cloud/free-trial.md. Expiry does not forcibly cancel already-running tasks. Email delivery can repeat after a crash between sending and persisting its marker. The browser fixture has paid billing disabled and makes no live Stripe charge. This PR is independent of the signup redesign; retain the optionalCloudTrialCardwhen combining onboarding changes.