QA in Action
Real bug reports, interactive test execution, and clear QA artifacts that show how we reduce release risk before production.
Bug Report Examples
This page works like a quick proof pack: instead of generic promises, you can inspect bug report structure, level of detail, and the kind of QA deliverables your team would actually receive.
How we structure findings
Problem
We capture the problem, context, environment, and reproduction path without ambiguity.
Impact
We explain what breaks for the user, the business, or the release itself.
Recommendation
We suggest safer fix directions and what should be verified after the change.
Retest
After the fix, we rerun the scenario and confirm the actual post-fix status.
Sample Bug Reports
Processing continues transaction search after Travel Rule decline
The processing-service continues searching and processing transactions even after the Travel Rule service returns a DECLINED status.
- Create an invoice or transaction
- Wait for Travel Rule verification to start
- Return a DECLINED response from the Travel Rule service
- Check processing-service logs and queue activity
- Verify that transaction search continues after the decline
- Immediately terminate transaction-search after DECLINED status
- Add an early-stop mechanism for the processing pipeline
- Prevent creation of new processing jobs after Travel Rule rejection
- Add guard-check validation before each transaction processing stage
- Log the processing flow termination reason
- Cover the scenario with integration and e2e tests
Polygon RPC provider returns malformed block data
Polygon RPC providers (Infura, Alchemy, GetBlock) intermittently return malformed
block payloads that fail deserialization with
DeserError: BlockTransactions during block processing.
- Connect to Polygon RPC via Infura or Alchemy
- Request block data using
eth_getBlockByNumber - Attempt to deserialize
BlockTransactions - Observe intermittent
DeserErrorfailures
DeserError, causing the RPC backend to skip affected blocks.
- Update transaction deserialization logic for EIP-4844 compatibility
- Add fallback parsing for unknown transaction variants
- Implement retry and provider failover for malformed RPC responses
- Log affected block numbers and provider responses for investigation
- Validate RPC payload schema before transaction processing
- Cover blob transaction scenarios with regression and integration tests
Crypto invoice waits full timeout when no deposit is detected
Crypto invoices remain in AwaitingCryptoDeposit state until the full
expires_at timeout (5-10+ hours) even when no blockchain transaction
is ever detected, causing poor payment widget UX.
- Create a crypto invoice and open the payment widget
- Observe invoice state
AwaitingCryptoDeposit - Do not send any crypto transaction
- Wait for the deposit detection window to pass
- Verify that the invoice still waits until
expires_at
"Transaction still not found" responses while the widget keeps
showing "awaiting payment".
expires_at timeout
should only apply once a transaction has been detected.
- Implement two-tier timeout logic for crypto invoices
- Add early expiry for invoices without detected transactions
- Keep invoices cancellable during the deposit detection window
- Prevent expiry when oracle-pool has already detected an in-flight transaction
- Unsubscribe oracle-pool listeners on all invoice expiry states
- Move invoice timeout values into configurable environment variables
GetInvoice returns 500 after oracle-pool callback
After receiving an oracle-pool callback, the GetInvoice endpoint
returns 500 Internal Server Error instead of a valid invoice object.
- Create invoice via
PaymentInvoicesService.CreateInvoice - Verify invoice state is
pending.awaiting_crypto_deposit - Call
GetInvoiceand confirm it works before callback - Send
POST /v1/callbacks/oracle-poolwithstatus=1andconfirmations=1 - Call
GetInvoiceagain using the sameinvoice_id
GetInvoice returns
500 Internal Server Error after oracle-pool callback processing.
GetInvoice should return a valid invoice object with an updated
state such as pending.awaiting_checks,
pending.awaiting_exchange, or expired.
- Validate invoice state transitions after oracle-pool callback processing
- Add null and schema validation before invoice serialization
- Log callback payloads and invoice state mutations for debugging
- Prevent invalid invoice states from reaching GetInvoice response mapping
- Add fallback error handling for malformed callback data
- Cover callback-to-GetInvoice flow with integration and regression tests
Payment Gateway Timeout
Payment fails when the provider response takes longer than 15 seconds. Users lose orders and money.
- Add a product to the cart
- Proceed to checkout
- Enter card details
- Click "Pay" on a slow connection
- Increase timeout to 30 seconds
- Add a retry mechanism (3 attempts)
- Show a progress indicator
Session Token in URL
Authentication token is visible in the browser address bar, allowing interception via browser history or proxy logs.
- Click "Sign in with Google"
- Complete OAuth authorization
- Check the URL after redirect
site.com/home?token=abc123
- Remove the token from URL parameters
- Use a secure cookie with SameSite=Strict
- Check access logs for exposed tokens
Menu Overlap on iPhone SE
Navigation menu items overlap on screens smaller than 375px.
- Open the site on iPhone SE
- Tap the burger menu
- Check how the menu items are positioned
- Add a media query for screens below 375px
- Reduce font size or spacing
- Test on a real iPhone SE
Draft Loss After Page Refresh
Latest changes in a long form disappear if the user refreshes the page while autosave is delayed.
- Open a long form with autosave enabled
- Enter data for 20-30 seconds
- Refresh the page during synchronization
- Store unsynchronized state locally
- Add a sync status indicator
- Warn before reload when unsaved changes exist
Privilege Escalation via Role Cache
After admin rights are revoked, the user can still perform protected actions for some time.
- Remove the administrator role from an existing user
- Do not end the current session
- Try to perform admin actions
- Invalidate the role cache after permission updates
- Validate roles server-side for sensitive actions
- Log access attempts after permission revocation
Purchase Event Missing in Analytics
A successful order is created, but the purchase event is not sent after one-click checkout.
- Start one-click checkout with a saved card
- Complete payment successfully
- Check network requests and the analytics dashboard
- Trigger analytics only after confirmed backend success
- Add alerts for drops in purchase events
- Cover checkout flows with a dedicated regression suite
Filters Reset After Catalog Pagination
After moving to the second catalog page, active filters disappear and the product list changes without warning.
- Open the product catalog
- Apply 2-3 filters and sorting
- Go to the second results page
- Add filters to URL parameters
- Use the History API for navigation
- Store filter state in sessionStorage
PDF Invoice Remains Accessible After Logout
The invoice link continues to open the document even after the user session ends.
- Sign in and open invoice history
- Copy the direct PDF link
- Log out and open the link in a new tab
- Validate authorization at the file endpoint level
- Use short-lived signed URLs
- Add audit logging for access to sensitive documents
SQL Injection in Search Field
The search field does not escape special characters, allowing arbitrary SQL queries to execute.
- Open the product catalog
- Enter into search:
'; DROP TABLE orders; -- - Press Enter
- Use parameterized queries (prepared statements)
- Add input validation at the API layer
- Enable WAF rules for SQL injection patterns
XSS Through Review Field
User reviews are rendered without HTML escaping, allowing scripts to execute.
- Open any product
- Add a review with text:
<script>alert('XSS')</script> - Save the review
- Use textContent instead of innerHTML
- Add CSP headers
- Audit all user-generated content output points
No API Rate Limiting
The password reset API endpoint has no request rate limits.
- Send a password change request
- Repeat the request 100+ times per minute
- Check the server responses
- Add rate limiting (5 requests per minute)
- Implement exponential backoff
- Log suspicious activity
Executable File Upload
The avatar upload form accepts any file types, including .exe and .php.
- Open profile settings
- Select shell.php instead of an image
- Upload the file
- Validate MIME type and file extension
- Check file magic bytes
- Store files outside the web root with renamed filenames
Duplicate Charge After Payment Retry
If the user retries payment after a delayed provider response, two successful charges are created for the same order.
- Place an order using a bank card
- Wait for a delayed response from the payment provider
- Click the "Pay" button again
- Add an idempotency key for each payment request
- Disable the button after the first click until the provider responds
- Log duplicated webhooks and reconciliation cases separately
Incorrect Rounding During Partial Payment
When a bonus balance is used for partial payment, the checkout total differs from the amount sent to the payment provider.
- Add a product with fractional cents to the cart
- Apply bonus balance to part of the amount
- Proceed to card payment confirmation
- Unify rounding rules between frontend and backend
- Use minor units instead of float values
- Add autotests for bonus and mixed-payment scenarios
Refund Event Missing in Analytics
After a successful refund in the admin panel, the refund event does not reach either GA4 or the internal finance dashboard.
- Open a paid order in the admin panel
- Perform a partial or full refund
- Check analytics events and the BI dashboard
- Send a dedicated refund event after backend confirmation
- Monitor gaps between orders and refunds in analytics
- Cover the refund flow with a dedicated regression scenario
UTM Parameters Lost After Login
After the user signs in, campaign attribution resets and orders are reported as direct / none.
- Open a landing page with UTM parameters
- Go to a product page and sign in
- Finish checkout and verify source / medium
- Persist attribution state in sessionStorage or server session
- Do not overwrite source after the auth redirect
- Add checks for the login-to-checkout funnel
Autotest Run Demo
See what a demo autotest suite run looks like: statuses, risk signals, summary metrics, and a path to a real QA report example.
What this shows: a typical checkout verification flow with pass/fail statuses, warnings, and signals that help prevent a risky release.
Press the button to see not just the summary, but also concrete findings from the report.
Sample Test Cases
- Open the login page
- Enter a valid email
- Enter a valid password
- Click "Sign In"
- Open the product page
- Select size/color if needed
- Click "Add to Cart"
- Verify the cart badge updates
- Enter a non-existent email
- Click "Send Link"
- Observe the system response
- Open one-click checkout
- Complete payment successfully
- Check network requests and analytics events
- Remove the administrator role from the user in another session
- Return to the current admin session
- Try to change billing or roles for other users
- Change several fields in the form
- Do not wait for autosave to finish
- Try to refresh the page or navigate to another section
What you receive in a real engagement
These examples are simplified, but the structure is the same in real projects: reproducible evidence, clear priorities, business impact, and recommendations the team can act on immediately.
Prioritized Findings
Each bug is grouped by severity and impact so the team can immediately see what blocks the release and what can be planned separately.
Clear Reproduction Steps
Environment, steps, expected result, and actual result remove ambiguity and save development time.
Practical Recommendations
We do not stop at saying "it is broken"; we point out risk areas, safer fixes, and what should be verified after the change.
Fast First Signal
Critical scenarios stay in focus, so the first report already helps product and engineering make decisions.
Need the same QA artifact format for your product?
We can shape the same kind of QA support for your team: bug reports, retests, release-risk visibility, and a report structure that is easy to act on.