AdTech QA checklist
Build reusable functional and integration coverage.
Test lab / Exchange testing
A no-bid response is not automatically an integration defect. The test must separate protocol validity from demand eligibility.
Create a sanitized request fixture with a known impression, media type, publisher context, geography, currency, and floor. Keep a second fixture with one intentionally invalid field for negative testing.
Send the valid fixture through the test integration and validate the response contract. Then send the malformed fixture and confirm that the exchange rejects it predictably rather than creating an unexplained downstream failure.
For the valid fixture, vary one eligibility condition at a time: geography, format, floor, creative eligibility, or campaign budget. A no-bid under an intentionally ineligible condition can be a correct outcome.
If the valid opportunity receives a no-bid while all eligibility conditions are satisfied, inspect the DSP's decision evidence and exchange filters. If the malformed request fails validation as designed, that is a passing negative test.
Retain valid, invalid, boundary, timeout, and business-ineligible fixtures. Record the expected outcome for each so a future adapter or exchange change does not turn a legitimate no-bid into a mysterious failure.
A synthetic exchange sends a valid-looking OpenRTB 2.6 request for a banner impression and receives HTTP 204 from a bidder. The lab distinguishes a legitimate no-bid decision from a malformed transport or business-rule rejection.
Capture HTTP status, request ID, imp IDs, format dimensions, site or app context, device signals, bidfloor and currency, consent fields, and bidder-side eligibility logs if available.
Send one baseline fixture known to be eligible, then vary only the floor, format, or blocked category. Check JSON schema and field types separately from campaign targeting and budget.
HTTP 204 can be a valid no-bid response; it does not by itself mean the bidder endpoint failed. HTTP 400, 5xx, malformed JSON, or timeouts belong in separate error classes.
Maintain a reproducible request corpus with expected status classes. Fix malformed payloads first; then ask demand partners for a reason code or targeting explanation using a sanitized request ID.
A well-formed bid request can still produce no bid because of consent, creative format, geo, budget, frequency, or campaign eligibility. Avoid assuming every no-bid is an integration bug.
Create two OpenRTB fixtures that are identical except for one controlled field. For example, hold impression ID, media type, site context and currency constant while changing the bid floor from a permissive value to a deliberately restrictive value. The expected result is not that a DSP must bid on the first fixture: bidding remains a commercial decision. The test instead verifies that the exchange forwards the correct floor and that any filtering is explained by observable policy or adapter behavior. Repeat the approach for geography, format support and blocked advertiser categories.
A valid request may produce no bid because the DSP has no eligible campaign, the floor is too high or its pacing rules exclude the opportunity. Separately, malformed JSON, missing required fields or unsupported protocol values should trigger documented validation behavior. Treat these as separate test classes. Log the request ID, HTTP status, response body, timeout threshold and exchange rejection reason when available. A blank response body, HTTP 204 and a structured no-bid response are not automatically equivalent across integrations; use the specific endpoint contract.
Verify that the impression array is populated and each impression has a usable ID. Check that the declared banner, video or native format matches the inventory actually offered. Validate currency assumptions, bid floor units, site or app identity and the presence of required privacy signals. A request can be syntactically valid but commercially unusable because a critical context field is absent. Preserve a sanitized fixture and compare it against a known-good integration sample. Do not paste real device identifiers, IP addresses or consent strings into a public troubleshooting article.
For every test request, record one of five outcomes: valid bid, intentional no-bid, timeout, protocol rejection or transport failure. Then attach evidence: returned bid ID and price for a bid, configured eligibility rule for an intentional no-bid, elapsed time for a timeout, validator error for a protocol rejection, or network error for transport failure. This prevents the catch-all label no-bid from concealing defects. Compare exchange-side and DSP-side logs when both are available, because an exchange may reject a bid after the DSP returns it.
Save boundary fixtures for zero floor, high floor, missing optional field, unsupported format, malformed JSON and timeout. State the expected classification for each fixture and make the assertion resilient to legitimate DSP campaign changes. A useful deterministic regression environment uses a mock bidder with explicit rules rather than a live DSP whose budget and targeting fluctuate. Once protocol behavior passes in the mock environment, run a limited live smoke test and treat business no-bids as observations, not automatic failures.