Show the bug.
Get the ticket.

Record it and say what's wrong. Brief Cloud writes a clear ticket and files it in your tracker.

Try it now: 2 bugs to report

acme.shop/checkout
ProductsPricingAccount Cart 1
Checkout
Acme Pro, billed monthly
Email
sam@acme.shop
Card
4242 4242 4242 4242
Expiry
12 / 28
CVC
•••
Secured by AcmePay
Acme ProMonthly plan
Subtotal$49.00
Tax$0.00
Total$49.00
00:00
Draw on it
Engineering›ENG-142
Saved in Drafts. Read it over, then file it.

Written by Brief Cloud in 9 seconds

Summary

Steps to reproduce

    Expected

    Actual

    Evidence

    Console and network

    ✕ TypeError: Cannot read properties of undefined (reading 'id')
        at submitPayment (checkout.js:88)
    ✕ POST /api/pay   500   612 ms

    Environment

    Chrome 141 on macOS · 1440 x 900 · acme.shop/checkout

    Create free account

    Try it live

    Report 2 real bugs with Brief Cloud, right here. About a minute.

    A live demo. Nothing you do here leaves this page.

    Files straight into

    • Linear
    • Jira
    • GitHub
    • GitLab
    • Azure DevOps
    • ClickUp
    • Notion
    • Trello
    • Asana
    • Monday
    Claude vs Brief Cloud

    Claude writes essays.
    Brief Cloud writes tickets.

    Paste one line about a bug into Claude and you get pages of guesses about code it has never seen. Brief Cloud saw the bug, so you get a short ticket with proof.

    ClaudeAI chat, from one line1,284 words

    🐛 [P1] Payment Submission Failure in Checkout Flow: Potential Unhandled Promise Rejection in usePaymentIntent Leading to Silent Failure State

    📋 Summary

    Based on the reported behavior, the checkout payment flow appears to fail silently. This is most likely caused by an unhandled promise rejection in the payment confirmation pipeline, although it could also stem from a race condition between the PaymentElement mount lifecycle and the clientSecret fetch.

    🔍 Root Cause Analysis (hypothesized)

    The handleSubmit callback in src/features/checkout/components/CheckoutForm.tsx likely calls stripe.confirmPayment() without awaiting elements.submit(). The error may be swallowed by the onError handler in src/lib/api/payments.ts, leaving checkoutSlice.status stuck in 'pending'.

    🛠️ Proposed Fix
    // src/features/checkout/hooks/usePaymentIntent.ts
    const { mutateAsync } = useMutation({
      mutationFn: confirmPaymentIntent,
      onError: (err: StripeError) => {
        dispatch(checkoutSlice.actions.setError(err.code));
        Sentry.captureException(err);
        throw err;
      },
    });
    🧪 Testing Strategy
    • Mock @stripe/react-stripe-js with jest.mock and simulate card_declined
    • Add a Playwright E2E for the 3DS challenge path
    • Verify idempotency keys on retried POST /v1/payment_intents
    ⚠️ Risks

    Changing error propagation in the mutation layer may affect other consumers of usePaymentIntent, including the subscription upgrade flow, the BillingPortal retry banner and the legacy checkout-v1 fallback.

    ✔️ Acceptance Criteria
    • ☐ Payment errors surface to the user
    • ☐ No regression in 3DS flows
    • ☐ Sentry breadcrumbs include paymentIntent.id
    EM

    EmWhich card? Which browser? Also, none of these files exist.

    Guesses and made-up files. No video, no screenshot, no logs.

    Brief CloudFiled in Linear84 words

    Pay fails at checkout with a 500

    Steps to reproduce
    1. Open acme.shop/checkout.
    2. Fill in the card details.
    3. Click Pay $49.00. It says “Something went wrong.”
    ExpectedThe order goes through.
    Actual“Something went wrong.” No order.
    0:07
    Replay, the last minute
    Screenshot, Pay circled
    ✕ POST /api/pay 500 612 ms ✕ TypeError checkout.js:88
    EM

    EmClear. Picking it up now.

    The real error, a replay and a screenshot. Ready to fix.

    Claude is a trademark of Anthropic. The left ticket is an example of what a chat writes from a one-line bug report: “pay button broken on checkout”.

    Features

    More ways to catch a bug.

    Record it, point at it, or grab the minute that just happened. Then make the ticket yours.

    Video and voice

    Record the tab and talk it through. Then trim it, crop it, or mark the moment it breaks.

    Screenshots

    Draw in red to point at the problem. Add a note. Up to 3 per bug.

    Replay the last minute

    On your team's sites, Brief keeps the last 60 seconds. The bug already happened? It's already saved.

    Brief it New

    Press Alt Shift B. Brief looks back at the last minute and drafts the bug for you.

    Ticket rules

    Tell Brief how your team likes tickets, like you'd tell a teammate. Every ticket follows.

    Edit with AI

    Every ticket is a page you can edit. Select text to improve or shorten it. Or press Ctrl K and ask.

    Watch

    See it on a real bug.

    From click to filed ticket, start to finish.

    Pricing

    Free. Ready in 2 minutes.

    Free while in early access, for your whole team. No card, no coding agent. Just three steps.

    1 min 1

    Create your account

    Sign up free, then connect Linear, Jira, GitHub, or any of the 10 trackers we support.

    Create free account
    30 sec 2

    Add to Chrome

    Install Brief Cloud, then click the cloud in its popup to link it to your account.

    Add to Chrome
    30 sec 3

    Report your first bug

    Pin Brief, click it, show the bug. No bug handy? Use our page that's broken on purpose.

    Open the broken page
    FAQ

    Good questions.

    Do I need a coding agent or any setup?
    No. Brief Cloud writes and files the ticket for you. Create an account, connect your tracker, add the extension. That's it.
    What goes into a ticket?
    A clear title and summary, steps to reproduce, expected and actual, your video or screenshots, plus the console errors and failed network calls from the recording. Your ticket rules decide the labels and the style.
    Does it record all the time?
    No. Brief captures when you record or take a screenshot. Replay only keeps the last minute on sites your team adds, so you can catch a bug after it happens.
    What happens to my data?
    Your recording is used to write the ticket. Once it's filed, the audio and sampled frames are deleted. What you type is masked in the steps. No ads, no analytics in the extension, and we never sell your data. Read the privacy policy.
    Which browsers?
    Chrome on desktop, and other Chromium browsers like Edge, Brave and Arc.

    Your next bug takes 30 seconds.

    Create your account now. It's free while in early access.

    Or add the Chrome extension