From d637feda6062b4e7e3a13692264bb8836cb80220 Mon Sep 17 00:00:00 2001 From: D-K-P <8297864+D-K-P@users.noreply.github.com> Date: Thu, 11 Jun 2026 13:08:33 +0100 Subject: [PATCH 1/9] feat(webapp): add hipaa contact form type sharing marketing plain labels --- apps/webapp/app/components/Feedback.tsx | 33 +++++++--- apps/webapp/app/routes/resources.feedback.ts | 65 +++++++++++++++----- apps/webapp/app/utils/plain.server.ts | 11 +++- 3 files changed, 86 insertions(+), 23 deletions(-) diff --git a/apps/webapp/app/components/Feedback.tsx b/apps/webapp/app/components/Feedback.tsx index ecfd4e88c9a..bc44f190943 100644 --- a/apps/webapp/app/components/Feedback.tsx +++ b/apps/webapp/app/components/Feedback.tsx @@ -1,10 +1,10 @@ import { conform, useForm } from "@conform-to/react"; import { parse } from "@conform-to/zod"; import { InformationCircleIcon, ArrowUpCircleIcon } from "@heroicons/react/20/solid"; -import { EnvelopeIcon } from "@heroicons/react/24/solid"; +import { EnvelopeIcon, ShieldCheckIcon } from "@heroicons/react/24/solid"; import { Form, useActionData, useLocation, useNavigation, useSearchParams } from "@remix-run/react"; import { type ReactNode, useEffect, useState } from "react"; -import { type FeedbackType, feedbackTypeLabel, schema } from "~/routes/resources.feedback"; +import { type FeedbackType, feedbackTypes, schema } from "~/routes/resources.feedback"; import { Button } from "./primitives/Buttons"; import { Dialog, DialogContent, DialogHeader, DialogTrigger } from "./primitives/Dialog"; import { Fieldset } from "./primitives/Fieldset"; @@ -84,9 +84,12 @@ export function Feedback({ button, defaultValue = "bug", onOpenChange }: Feedbac How can we help? We read every message and will respond as quickly as we can. - {!(type === "feature" || type === "help" || type === "concurrency") && ( -
- )} + {!( + type === "feature" || + type === "help" || + type === "concurrency" || + type === "hipaa" + ) &&
}
@@ -132,6 +135,20 @@ export function Feedback({ button, defaultValue = "bug", onOpenChange }: Feedbac )} + {type === "hipaa" && ( + + + We offer a signed Business Associate Agreement (BAA) as a paid add-on on Pro + and Enterprise plans. To help us get back to you quickly, please include your + company name, expected go-live date, and a brief description of the PHI + workload you plan to run. + + + )} diff --git a/apps/webapp/app/routes/resources.feedback.ts b/apps/webapp/app/routes/resources.feedback.ts index a6271c9d5ad..127f6a06df3 100644 --- a/apps/webapp/app/routes/resources.feedback.ts +++ b/apps/webapp/app/routes/resources.feedback.ts @@ -8,19 +8,55 @@ import { sendToPlain } from "~/utils/plain.server"; let client: PlainClient | undefined; -export const feedbackTypeLabel = { - bug: "Bug report", - feature: "Feature request", - help: "Help me out", - enterprise: "Enterprise enquiry", - feedback: "General feedback", - concurrency: "Increase my concurrency", - region: "Suggest a new region", -}; +export const feedbackTypes = { + bug: { + label: "Bug report", + labelTypeId: "lt_01HB920BTPFS36KH1JT9C36YVY", + threadTitle: "Contact form: Bug report", + }, + feature: { + label: "Feature request", + labelTypeId: "lt_01HB920BV8CJGYXVE15WWN6P07", + threadTitle: "Contact form: Feature request", + }, + help: { + label: "Help me out", + labelTypeId: undefined, + threadTitle: "Contact form: Help me out", + }, + enterprise: { + label: "Enterprise enquiry", + labelTypeId: "lt_01K7PF5EV2877EH4SZYB667FW4", + threadTitle: "Contact form: Enterprise enquiry", + }, + feedback: { + label: "General feedback", + labelTypeId: "lt_01HB920BT61HB7T776BCK4GC7X", + threadTitle: "Contact form: General feedback", + }, + concurrency: { + label: "Increase my concurrency", + labelTypeId: undefined, + threadTitle: "Contact form: Increase my concurrency", + }, + region: { + label: "Suggest a new region", + labelTypeId: undefined, + threadTitle: "Contact form: Suggest a new region", + }, + hipaa: { + label: "HIPAA BAA request", + labelTypeId: "lt_01KS54WBRYKE6DY369KPK2SS4W", + threadTitle: "Contact form: HIPAA BAA request", + }, +} as const satisfies Record< + string, + { label: string; labelTypeId?: string; threadTitle: string } +>; -export type FeedbackType = keyof typeof feedbackTypeLabel; +export type FeedbackType = keyof typeof feedbackTypes; -const feedbackTypeLiterals = Object.keys(feedbackTypeLabel).map((key) => z.literal(key)); +const feedbackTypeLiterals = Object.keys(feedbackTypes).map((key) => z.literal(key)); const feedbackType = z.union( [feedbackTypeLiterals[0], feedbackTypeLiterals[1], ...feedbackTypeLiterals.slice(2)], @@ -46,16 +82,17 @@ export async function action({ request }: ActionFunctionArgs) { return json(submission); } - const title = feedbackTypeLabel[submission.value.feedbackType as FeedbackType]; + const inquiry = feedbackTypes[submission.value.feedbackType as FeedbackType]; try { await sendToPlain({ userId: user.id, email: user.email, name: user.name ?? user.displayName ?? user.email, - title, + title: inquiry.threadTitle, + labelTypeIds: inquiry.labelTypeId ? [inquiry.labelTypeId] : undefined, components: [ uiComponent.text({ - text: `New ${title} reported by ${user.name} (${user.email})`, + text: `New ${inquiry.label} reported by ${user.name} (${user.email})`, }), uiComponent.divider({ spacingSize: "M" }), uiComponent.text({ diff --git a/apps/webapp/app/utils/plain.server.ts b/apps/webapp/app/utils/plain.server.ts index 4e8ce630731..ee205374e17 100644 --- a/apps/webapp/app/utils/plain.server.ts +++ b/apps/webapp/app/utils/plain.server.ts @@ -7,9 +7,17 @@ type Input = { name: string; title: string; components: ReturnType[]; + labelTypeIds?: string[]; }; -export async function sendToPlain({ userId, email, name, title, components }: Input) { +export async function sendToPlain({ + userId, + email, + name, + title, + components, + labelTypeIds, +}: Input) { if (!env.PLAIN_API_KEY) { return; } @@ -51,6 +59,7 @@ export async function sendToPlain({ userId, email, name, title, components }: In }, title: title, components: components, + labelTypeIds, }); if (createThreadRes.error) { From 533e0838256b0858fec5ec8a07d5a52a2ab9e0d4 Mon Sep 17 00:00:00 2001 From: D-K-P <8297864+D-K-P@users.noreply.github.com> Date: Thu, 11 Jun 2026 13:08:59 +0100 Subject: [PATCH 2/9] feat(webapp): hipaa add-on row and credits copy on plan-selection tiers --- .server-changes/hipaa-addon-pricing-cta.md | 6 + ...ces.orgs.$organizationSlug.select-plan.tsx | 217 +++++++++++------- 2 files changed, 146 insertions(+), 77 deletions(-) create mode 100644 .server-changes/hipaa-addon-pricing-cta.md diff --git a/.server-changes/hipaa-addon-pricing-cta.md b/.server-changes/hipaa-addon-pricing-cta.md new file mode 100644 index 00000000000..9603413fea8 --- /dev/null +++ b/.server-changes/hipaa-addon-pricing-cta.md @@ -0,0 +1,6 @@ +--- +area: webapp +type: feature +--- + +Add a HIPAA BAA add-on row to the Hobby, Pro, and Enterprise tiers on the in-app pricing/plan-selection cards. Each row opens the existing Feedback dialog pre-filled with a new `hipaa` feedback type. Restructure `feedbackTypes` to match the marketing contact form (label / labelTypeId / threadTitle), so every supported inquiry type tags its Plain thread with the same label ID used by the marketing form and uses a consistent "Contact form: …" thread title. Also reformat the included-compute line on each tier ("$X / month free credits" / "$X / month credits included") and move it from the `TierLimit` block into a `FeatureItem` with a `DefinitionTip`, matching the marketing pricing page. diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx index e5a9dce7429..1fccf215bab 100644 --- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx +++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx @@ -1,5 +1,4 @@ import { - ArrowUpRightIcon, CheckIcon, ExclamationTriangleIcon, ShieldCheckIcon, @@ -37,6 +36,7 @@ import { Header2 } from "~/components/primitives/Headers"; import { Paragraph } from "~/components/primitives/Paragraph"; import { Spinner } from "~/components/primitives/Spinner"; import { TextArea } from "~/components/primitives/TextArea"; +import { TextLink } from "~/components/primitives/TextLink"; import { SimpleTooltip } from "~/components/primitives/Tooltip"; import { prisma } from "~/db.server"; import { redirectWithErrorMessage } from "~/models/message.server"; @@ -237,6 +237,11 @@ const pricingDefinitions = { title: "Query period", content: "The maximum number of days a query can look back when analyzing your task data.", }, + hipaaBaa: { + title: "HIPAA BAA", + content: + "A signed Business Associate Agreement (BAA) is required to run tasks that process Protected Health Information (PHI) on Trigger.dev Cloud.", + }, }; type PricingPlansProps = { @@ -317,10 +322,7 @@ export function TierFree({
- - ${plan.limits.includedUsage / 100} free monthly usage - - {showGithubVerificationBadge && status === "approved" && ( + {showGithubVerificationBadge && status === "approved" && ( {status === "rejected" ? (
-
-
+
Your Trigger.dev account failed to be verified for the Free plan because your GitHub @@ -533,6 +534,16 @@ export function TierFree({ )}
    + + + ${plan.limits.includedUsage / 100} / month free credits + + Unlimited{" "} @@ -584,9 +595,6 @@ export function TierHobby({ return ( - - ${plan.limits.includedUsage / 100} usage included -
    @@ -652,6 +660,23 @@ export function TierHobby({ )}
      + + + This plan includes ${plan.tierPrice} of compute each month. After that's used, tasks + keep running and you're billed per our{" "} + + compute usage rates + + . + + } + > + ${plan.limits.includedUsage / 100} / month credits included + + Unlimited{" "} @@ -672,6 +697,16 @@ export function TierHobby({ + + + Request a BAA + + } + /> +
    ); @@ -701,9 +736,6 @@ export function TierPro({ return ( - - ${plan.limits.includedUsage / 100} usage included -
    @@ -773,6 +805,23 @@ export function TierPro({
      + + + This plan includes ${plan.tierPrice} of compute each month. After that's used, tasks + keep running and you're billed per our{" "} + + compute usage rates + + . + + } + > + ${plan.limits.includedUsage / 100} / month credits included + + {`Then ${formatCurrency(concurrencyAddOnPricing.centsPerStep / 100, true)}/month per ${ concurrencyAddOnPricing.stepSize @@ -801,6 +850,16 @@ export function TierPro({ {pricingDefinitions.additionalRealtimeConnections.content} + + + Request a BAA + + } + /> +
    ); @@ -809,41 +868,12 @@ export function TierPro({ export function TierEnterprise() { return ( -
    -
    -
    -

    Enterprise

    -
    -

    - Tailor a custom plan -

    -
    -
      - - All Pro plan features + - - - Custom log retention - -
    -
      - - Priority support - - - Role-based access control - -
    -
      - - SOC 2 report - - - SSO - -
    +
    +
    +

    Enterprise

    +

    Tailor a custom plan

    -
    +
    +
    +
      + + All Pro plan features + + + + Custom log retention + +
    +
      + + Priority support + + + Role-based access control + +
    +
      + + SOC 2 report + + + SSO + +
    +
      + + + Request a BAA + + } + /> + +
    +
    ); } @@ -921,36 +989,6 @@ function PricingHeader({ ); } -function TierLimit({ children, href }: { children: React.ReactNode; href?: string }) { - return ( - <> -
    - {href ? ( - - {children} - - } - content={ -
    - View compute pricing information - -
    - } - /> - ) : ( -
    {children}
    - )} - - ); -} - function FeatureItem({ checked, checkedColor = "primary", @@ -1206,6 +1244,31 @@ function QueryPeriod({ limits }: { limits: Limits }) { ); } +function HIPAAAddOn({ + children, + checkedColor = "primary", +}: { + children?: React.ReactNode; + checkedColor?: "primary" | "bright"; +}) { + return ( + +
    +
    + + HIPAA BAA + {" "} + add-on +
    + {children && {children}} +
    +
    + ); +} + function Branches({ limits, children }: { limits: Limits; children?: React.ReactNode }) { return ( 0}> From fc752a4480e6a041a472cfb5f4e01a4c3dfdf64b Mon Sep 17 00:00:00 2001 From: D-K-P <8297864+D-K-P@users.noreply.github.com> Date: Thu, 11 Jun 2026 14:11:33 +0100 Subject: [PATCH 3/9] feat(webapp): label help, concurrency, and region contact form types --- apps/webapp/app/routes/resources.feedback.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/webapp/app/routes/resources.feedback.ts b/apps/webapp/app/routes/resources.feedback.ts index 127f6a06df3..2029dd03e54 100644 --- a/apps/webapp/app/routes/resources.feedback.ts +++ b/apps/webapp/app/routes/resources.feedback.ts @@ -21,7 +21,7 @@ export const feedbackTypes = { }, help: { label: "Help me out", - labelTypeId: undefined, + labelTypeId: "lt_01KTVCAPZY5ZJ0SS4ACMXWYYT3", threadTitle: "Contact form: Help me out", }, enterprise: { @@ -36,12 +36,12 @@ export const feedbackTypes = { }, concurrency: { label: "Increase my concurrency", - labelTypeId: undefined, + labelTypeId: "lt_01KTVCCY2PDE5V6WV2PQ8N85K2", threadTitle: "Contact form: Increase my concurrency", }, region: { label: "Suggest a new region", - labelTypeId: undefined, + labelTypeId: "lt_01KTVCDPYYBW6KS9H5V8MTQ0GG", threadTitle: "Contact form: Suggest a new region", }, hipaa: { From 604b194eedd4c979815afc6b34d05ef7e636b3ed Mon Sep 17 00:00:00 2001 From: D-K-P <8297864+D-K-P@users.noreply.github.com> Date: Thu, 11 Jun 2026 14:12:50 +0100 Subject: [PATCH 4/9] fix(webapp): use the feedback form plain label for general feedback --- apps/webapp/app/routes/resources.feedback.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/webapp/app/routes/resources.feedback.ts b/apps/webapp/app/routes/resources.feedback.ts index 2029dd03e54..bc6e3c30847 100644 --- a/apps/webapp/app/routes/resources.feedback.ts +++ b/apps/webapp/app/routes/resources.feedback.ts @@ -31,7 +31,7 @@ export const feedbackTypes = { }, feedback: { label: "General feedback", - labelTypeId: "lt_01HB920BT61HB7T776BCK4GC7X", + labelTypeId: "lt_01HB920BSRZ3RA1ETHBVEB5ST2", threadTitle: "Contact form: General feedback", }, concurrency: { From cacce4954fc5a85cee27815a7f1d098019309506 Mon Sep 17 00:00:00 2001 From: D-K-P <8297864+D-K-P@users.noreply.github.com> Date: Thu, 11 Jun 2026 14:30:23 +0100 Subject: [PATCH 5/9] fix(webapp): describe hipaa baa as a paid add-on, not pro-and-enterprise --- .server-changes/hipaa-addon-pricing-cta.md | 6 ------ apps/webapp/app/components/Feedback.tsx | 4 ++-- 2 files changed, 2 insertions(+), 8 deletions(-) delete mode 100644 .server-changes/hipaa-addon-pricing-cta.md diff --git a/.server-changes/hipaa-addon-pricing-cta.md b/.server-changes/hipaa-addon-pricing-cta.md deleted file mode 100644 index 9603413fea8..00000000000 --- a/.server-changes/hipaa-addon-pricing-cta.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -area: webapp -type: feature ---- - -Add a HIPAA BAA add-on row to the Hobby, Pro, and Enterprise tiers on the in-app pricing/plan-selection cards. Each row opens the existing Feedback dialog pre-filled with a new `hipaa` feedback type. Restructure `feedbackTypes` to match the marketing contact form (label / labelTypeId / threadTitle), so every supported inquiry type tags its Plain thread with the same label ID used by the marketing form and uses a consistent "Contact form: …" thread title. Also reformat the included-compute line on each tier ("$X / month free credits" / "$X / month credits included") and move it from the `TierLimit` block into a `FeatureItem` with a `DefinitionTip`, matching the marketing pricing page. diff --git a/apps/webapp/app/components/Feedback.tsx b/apps/webapp/app/components/Feedback.tsx index bc44f190943..d35cdb737d4 100644 --- a/apps/webapp/app/components/Feedback.tsx +++ b/apps/webapp/app/components/Feedback.tsx @@ -142,8 +142,8 @@ export function Feedback({ button, defaultValue = "bug", onOpenChange }: Feedbac panelClassName="w-full mb-2" > - We offer a signed Business Associate Agreement (BAA) as a paid add-on on Pro - and Enterprise plans. To help us get back to you quickly, please include your + We offer a signed Business Associate Agreement (BAA) as a paid add-on on + any paid plan. To help us get back to you quickly, please include your company name, expected go-live date, and a brief description of the PHI workload you plan to run. From 3d0a9f2e0a333cb72adf00a2c2eda2e6e2d31396 Mon Sep 17 00:00:00 2001 From: D-K-P <8297864+D-K-P@users.noreply.github.com> Date: Thu, 11 Jun 2026 14:40:40 +0100 Subject: [PATCH 6/9] fix(webapp): tighten hipaa panel copy and clean up select-plan indentation --- apps/webapp/app/components/Feedback.tsx | 7 +++---- .../resources.orgs.$organizationSlug.select-plan.tsx | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/apps/webapp/app/components/Feedback.tsx b/apps/webapp/app/components/Feedback.tsx index d35cdb737d4..0848359e219 100644 --- a/apps/webapp/app/components/Feedback.tsx +++ b/apps/webapp/app/components/Feedback.tsx @@ -142,10 +142,9 @@ export function Feedback({ button, defaultValue = "bug", onOpenChange }: Feedbac panelClassName="w-full mb-2" > - We offer a signed Business Associate Agreement (BAA) as a paid add-on on - any paid plan. To help us get back to you quickly, please include your - company name, expected go-live date, and a brief description of the PHI - workload you plan to run. + We offer a signed Business Associate Agreement (BAA) as a paid add-on on any + paid plan. To help us get back to you quickly, please include your company + name, and a brief description of the PHI workload you plan to run. )} diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx index 1fccf215bab..04003686aee 100644 --- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx +++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx @@ -322,7 +322,7 @@ export function TierFree({
    - {showGithubVerificationBadge && status === "approved" && ( + {showGithubVerificationBadge && status === "approved" && ( {status === "rejected" ? (
    -
    +
    Your Trigger.dev account failed to be verified for the Free plan because your GitHub From 69e4d80f7b75d5df763d98bcca197f39b63f167f Mon Sep 17 00:00:00 2001 From: D-K-P <8297864+D-K-P@users.noreply.github.com> Date: Thu, 11 Jun 2026 16:13:54 +0100 Subject: [PATCH 7/9] chore(webapp): add server-changes entry for hipaa baa pricing cta --- .server-changes/hipaa-addon-pricing-cta.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .server-changes/hipaa-addon-pricing-cta.md diff --git a/.server-changes/hipaa-addon-pricing-cta.md b/.server-changes/hipaa-addon-pricing-cta.md new file mode 100644 index 00000000000..8dc4a41f8b2 --- /dev/null +++ b/.server-changes/hipaa-addon-pricing-cta.md @@ -0,0 +1,6 @@ +--- +area: webapp +type: feature +--- + +Request a HIPAA BAA add-on directly from any paid pricing tier in the dashboard. From 6fb35e280850d601717ee889edd1574d941e1e82 Mon Sep 17 00:00:00 2001 From: D-K-P <8297864+D-K-P@users.noreply.github.com> Date: Thu, 11 Jun 2026 16:25:01 +0100 Subject: [PATCH 8/9] fix(webapp): align hobby and pro tooltip credits to use includedUsage --- .../routes/resources.orgs.$organizationSlug.select-plan.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx index 04003686aee..9cb75b0b6fd 100644 --- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx +++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx @@ -665,7 +665,7 @@ export function TierHobby({ title="Credits included" content={ <> - This plan includes ${plan.tierPrice} of compute each month. After that's used, tasks + This plan includes ${plan.limits.includedUsage / 100} of compute each month. After that's used, tasks keep running and you're billed per our{" "} compute usage rates @@ -810,7 +810,7 @@ export function TierPro({ title="Credits included" content={ <> - This plan includes ${plan.tierPrice} of compute each month. After that's used, tasks + This plan includes ${plan.limits.includedUsage / 100} of compute each month. After that's used, tasks keep running and you're billed per our{" "} compute usage rates From c2560dad87b5eb5734c162173827f85953fc3e11 Mon Sep 17 00:00:00 2001 From: D-K-P <8297864+D-K-P@users.noreply.github.com> Date: Thu, 11 Jun 2026 16:54:34 +0100 Subject: [PATCH 9/9] style(webapp): make hobby and pro credits tooltip hoverable --- .../app/components/DefinitionTooltip.tsx | 4 +++- ...ces.orgs.$organizationSlug.select-plan.tsx | 22 ++++++++++--------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/apps/webapp/app/components/DefinitionTooltip.tsx b/apps/webapp/app/components/DefinitionTooltip.tsx index 5bb3a713997..d91cce92c99 100644 --- a/apps/webapp/app/components/DefinitionTooltip.tsx +++ b/apps/webapp/app/components/DefinitionTooltip.tsx @@ -6,14 +6,16 @@ export function DefinitionTip({ content, children, title, + disableHoverableContent = true, }: { content: React.ReactNode; children: React.ReactNode; title: React.ReactNode; + disableHoverableContent?: boolean; }) { return ( - + {children} diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx index 9cb75b0b6fd..2ba2c761d70 100644 --- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx +++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.select-plan.tsx @@ -662,16 +662,17 @@ export function TierHobby({
      - This plan includes ${plan.limits.includedUsage / 100} of compute each month. After that's used, tasks - keep running and you're billed per our{" "} - + + This plan includes ${plan.limits.includedUsage / 100} of compute each month. After + that's used, tasks keep running and you're billed per our{" "} + compute usage rates . - + } > ${plan.limits.includedUsage / 100} / month credits included @@ -807,16 +808,17 @@ export function TierPro({
        - This plan includes ${plan.limits.includedUsage / 100} of compute each month. After that's used, tasks - keep running and you're billed per our{" "} - + + This plan includes ${plan.limits.includedUsage / 100} of compute each month. After + that's used, tasks keep running and you're billed per our{" "} + compute usage rates . - + } > ${plan.limits.includedUsage / 100} / month credits included