Independent testing report · Sample
BookWell — appointment booking & payments (fictional demo application)
Summary
Six findings in total. The three below are the ones blocking launch — the remaining three were cosmetic and are listed in the full report.
| # | Finding | Area | Severity |
|---|---|---|---|
| 01 | Customer records readable without logging in | Data exposure | Critical |
| 02 | Tip field accepts unlimited values, breaking the order total | Payments | High |
| 03 | Reward applies to services it was never configured for | Business logic | High |
| 04–06 | Cosmetic and copy issues — see full report | Interface | Low |
Findings in detail
Every finding gives you what we did, what happened, what should have happened, why it matters commercially, and what to change. You should be able to hand any one of these to a developer without explaining it.
The endpoint that returns a customer's bookings doesn't check who is asking. Supply any phone number in the URL and it returns that customer's record — no login, no token, no ownership check. Because phone numbers are guessable, the entire customer base can be walked one request at a time.
# No authentication header of any kind GET /api/customer/bookings/%2B15550100123 Host: api.bookwell-demo.example # Response — 200 OK { "customers": [{ "firstName": "[CUSTOMER NAME]", "phoneNumber": "[PHONE]", "venueId": "[ID]" }], "bookings": [{ "status": "scheduled", "scheduledTime": "2026-07-02T03:30:00.000Z", "paymentStatus": "paid", "paymentMethod": "card", "price": 400, "customerInfo": { "name": "[NAME]", "phone": "[PHONE]" } }] }
Note: values above are redacted placeholders. In a real report this block contains the actual response so your developer can confirm the problem in seconds.
The custom tip field has no maximum and no format validation. Entering an absurdly large number is accepted without error, and the order total is then rendered in scientific notation rather than as currency.
100000000000000000000000000000.Service subtotal $40.00 Custom tip 100000000000000000000000000000 Order total $1e+30 ← accepted, no error
The field should accept currency only — digits with at most two decimal places — enforce a sensible maximum, and reject anything else with a clear message. A monetary total should never render in scientific notation.
A complimentary reward set up for one specific service can be redeemed against any other service, including more expensive ones. The booked service is never checked against the reward's configuration.
Reward configured for: Service A ($30) Customer books: Service B ($95) Reward applied: accepted — Service B becomes free Margin lost: $95 instead of the intended $30
Same format, your application, findings you can hand straight to a developer — plus a verdict on whether it's ready for strangers.
Break my app — $997 Launch Check — $297