Gravity Forms 3.1.1 fixes entry searches where only start_date or only end_date is provided. Earlier behavior could assume the missing value meant today, silently shrinking historical exports, reports, retention jobs, and integrations. The dangerous result is usually plausible: a CSV downloads or a job finishes, but many valid entries are absent.
Use this for survey exports, lead reports, scheduled CSV jobs, finance reconciliations, retention deletion, consent audits, CRM backfills, analytics dashboards, and custom code that calls GFAPI::get_entries with date search criteria.
Quick answer
Build entries just before, inside, and just after a known UTC date window. Query with both boundaries, start_date only, end_date only, and neither boundary. In Gravity Forms 3.1.1, an omitted start should include all otherwise matching history before the end, while an omitted end should include all matching entries after the start. Compare counts, oldest and newest IDs, local time conversion, export rows, pagination, and scheduled-job checkpoints. Never approve the fix from a total count alone.
Test scenarios to run
Run the same controlled fixture across these branches. Write down the expected result before testing so a surprising response is easy to identify.
| Scenario | Fixture | Expected result |
| Start only | Entries before and after start | All later matches |
| End only | Old and recent entries | All earlier matches |
| Both dates | Closed test window | Only entries in range |
| No dates | Other filters only | All matching history |
Diagnostic table
Use this table to connect the observed behavior to evidence and a verification step.
| Action | Evidence | Verification |
| Freeze timestamp fixtures | Record WordPress timezone, PHP timezone, database timezone, Gravity Forms version, API method, search criteria, status filter, page size, sort direction, and job checkpoint. | Oldest and newest returned IDs match the written date-boundary expectations. |
| Compare all boundary modes | Create entries around midnight, daylight-saving changes, month end, year end, and the exact intended start and end instants. | Admin, GFAPI, REST, export, report, and scheduled-job results agree for the same criteria. |
| Reconcile complete ID sets | Run both-boundary, start-only, end-only, and no-boundary searches with the same field filters and compare full ID sets rather than counts alone. | Pagination and sorting do not omit records or move the processing checkpoint backward. |
| Reset stale job checkpoints | Check admin entry search, GFAPI code, REST responses, CSV export, scheduled reports, retention jobs, CRM backfills, and any cached aggregate. | Retention or deletion jobs operate only on the reviewed candidate set and preserve rollback evidence. |
What to check first
- Record WordPress timezone, PHP timezone, database timezone, Gravity Forms version, API method, search criteria, status filter, page size, sort direction, and job checkpoint.
- Create entries around midnight, daylight-saving changes, month end, year end, and the exact intended start and end instants.
- Run both-boundary, start-only, end-only, and no-boundary searches with the same field filters and compare full ID sets rather than counts alone.
- Check admin entry search, GFAPI code, REST responses, CSV export, scheduled reports, retention jobs, CRM backfills, and any cached aggregate.
- Protect destructive retention or deletion work with a dry run, maximum row threshold, approval step, and export of candidate IDs.
Field notes
- Write the pass condition before changing anything and keep one repeatable synthetic fixture for the full test window.
- Record exact versions and UTC timestamps because deployments, caches, retries, scheduled actions, and background jobs can change the evidence.
- Test the public path and the stored server-side result, not only an admin preview, isolated command, or API response.
- Repeat verification after the relevant cache, queue, cron, webhook, and observation window has completed.
Useful command or data shape
Adapt paths, IDs, and privacy handling to the site before running commands or storing data on production.
$criteria = ['start_date' => '2026-08-01 00:00:00'];
$entries = GFAPI::get_entries(7, $criteria, ['key' => 'date_created', 'direction' => 'ASC']);
foreach ($entries as $entry) { echo $entry['id'] . ' ' . $entry['date_created'] . PHP_EOL; }
Why this usually happens
- A missing date is normalized to the current date instead of remaining null.
- Local midnight is compared with stored UTC timestamps without an explicit conversion.
- Pagination makes a truncated result look like a date-filter problem.
- A scheduled job saves a cursor from a previously incomplete result set.
Decision rule
Approve the update when each omitted boundary remains genuinely open, UTC and local timestamps are documented, pagination returns the complete set, and scheduled jobs neither skip nor repeat entries.
Production verification checklist
- Oldest and newest returned IDs match the written date-boundary expectations.
- Admin, GFAPI, REST, export, report, and scheduled-job results agree for the same criteria.
- Pagination and sorting do not omit records or move the processing checkpoint backward.
- Retention or deletion jobs operate only on the reviewed candidate set and preserve rollback evidence.
Safe fix order
Use a sequence that makes each result easy to prove. Stop when new evidence changes the scope or owner of the problem.
- Freeze timestamp fixtures
- Compare all boundary modes
- Reconcile complete ID sets
- Reset stale job checkpoints
- Protect destructive jobs
Mistakes to avoid
- Changing production before recording exact versions, UTC timestamps, a stable fixture, the expected result, and a tested rollback point.
- Treating one successful screen as proof while stored records, logs, queues, caches, emails, APIs, and downstream systems remain unchecked.
- Testing only as an administrator instead of using the role, device, locale, cache state, payment state, and failure branch that customers reach.
- Leaving temporary exclusions, debug output, test accounts, broad permissions, or one-off repair code active after verification.
Questions teams ask during testing
Can I run this directly in production?
Begin with read-only evidence and use staging for package, database, checkout, form, permission, or security changes. If a production canary is necessary, make it identifiable, reversible, monitored, and unable to expose personal data or charge a customer.
How do I avoid a false positive?
Repeat the same fixture with the same versions, role, URL, locale, cache state, and integrations. Compare browser, stored, API, and log evidence instead of relying on one screen.
What should the evidence packet contain?
Keep UTC time, exact versions, synthetic record ID, expected result, actual result, relevant log lines, change made, rollback point, owner, and final verification. Redact secrets and personal data.
When is the test complete?
Close the work when the primary path passes, failure branches are understood, stored and downstream records reconcile, temporary changes are removed, and monitoring covers the next update.
What to tell the client or owner
Give the owner a concise packet with the affected workflow, exact versions, UTC test time, fixture ID, expected result, actual result, key logs, change made, rollback point, final result, unresolved risks, owner, and next review date. Remove credentials and personal data before sharing it.
When HandL WP should help
Bring in help when this affects leads, checkout, search visibility, security, paid media reporting, or a client production site. HandL WP can trace the issue through WordPress, hosting, cache, tracking, and Search Console, then verify the workflow after the technical fix.
If this is active on a production site, have HandL WP reconcile Gravity Forms reports.
Related HandL WP guides
Use these related guides when the same issue touches tracking, security, checkout, or crawler visibility.
Helpful references