Optional paid research-case workflow. Comradery via Help Requests is the default — most quick questions get free volunteer help. Research Services is the opt-in escalation for cases that genuinely need many hours of focused work: deep ancestor traces, full record-set transcriptions, professional-grade reports.
This module is off by default. Enable it under Settings → Features when you want it.
What you can do
- Take paid research requests via a public intake form with up-front Stripe billing.
- Quote every request at $30 an hour for one hour up front, and change any case's rate and hours once it comes in.
- Researchers claim cases from a queue and log hours as they work.
- Bill additional hours mid-case — researcher requests, requester authorizes via Stripe, case continues.
- In-system messaging between requester and researcher with file attachments.
- Status-change emails fire on every transition (claimed, in_progress, needs_more_hours, completed).
- Convert a free Help Request thread into a paid case when it turns out the work is too big.
- All hours flow into the unified volunteer-hours ledger — paid hours are still logged hours.
How a case flows
- Visitor fills the intake form on a page hosting
[sp_research_request]. - Submission creates the case in
pending_paymentstatus. Visitor is redirected to Stripe Checkout for the up-front fee (rate × max_hours_authorized). - On payment success, case flips to
openand lands in the admin queue. Configured admin email is notified. - A researcher claims the case (an admin assigns it from the case-edit page, or a researcher claims it from the My Research Assignments page). Status flips to
claimed. Requester is emailed. - Researcher logs the first hour of work. Status auto-flips to
in_progress. Requester is emailed. - Researcher works the case, communicates via in-system messages, logs hours as they go.
- If more time is needed: researcher uses the "Request Additional Hours" form on the admin case page. SocietyPress creates a pending invoice, emails the requester a Stripe payment link, sets status to
needs_more_hours. When the requester pays, the invoice marks paid, the case'smax_hours_authorizedincreases, status returns toin_progress. - Researcher delivers results (typically as a message with a PDF report attached). Marks status
completed. Requester is emailed.
How to enable the module
Settings → Features → Paid Research Services → On. The new admin menu item (Research → Research Cases) appears.
Every new case starts at these terms:
- Hourly rate — $30.00 an hour.
- Hours covered — the up-front fee pays for 1 hour.
- Response time — 14 days.
There isn't yet a screen to change those starting terms for your society; they're on the roadmap.
A case's rate and hours can be changed on its own admin page after it comes in — the up-front fee the requester pays is always worked out from the starting terms above.
How to put the intake form on a page
Drop the Research Case Request widget on a page with the page builder, or use the [sp_research_request] shortcode.
The form has fields for case title, description, surname, ancestor name, time period, location, and "what have you already tried?" (optional). At the bottom is a quote box that shows the up-front cost calculated from your defaults.
When the visitor submits, they're sent to Stripe Checkout. On success, they're returned to the form page with a "Payment received — your case is in the queue" message.
How to set up researchers
Researchers are marked under Settings → Who Can Do What. Find the volunteer, tick Paid Research, and click Save Access. That's the only thing the tick does: it doesn't open the admin side of the site, so a researcher keeps signing in like any other member.
Only people with the tick can see or claim open cases on the My Research Assignments page. Anyone else who finds that page is told it's for the society's researchers. If you take the tick away from someone partway through a case, they can still see and finish the cases they already claimed, but they can't claim new ones. Admins can also assign a case to a researcher from the case's admin page.
Researchers see two things:
- The "My Research Assignments" dashboard (via
[sp_my_research_assignments]shortcode) showing their active cases plus open cases available to claim. - Inline log-hours forms on each active case so they can record time as they work without leaving the page.
How to manage cases
Research → Research Cases. List filters by status (Pending Payment / Open / Claimed / In Progress / Needs More Hours / Completed / Cancelled / Refunded) plus search by title, requester, or surname.
Click "Review" on a row to open the single-case view. The page shows requester info, the full case description, hours logged so far (with totals), invoices issued, and a sidebar with status workflow + researcher assignment + rate override + SLA override + admin notes.
Two postboxes auto-inject below the main case detail:
- Hours Logged — a table of every hour entry plus an inline form to log more.
- Request Additional Hours — when the case needs more time, fill this out (hours + reason). It creates a pending invoice, emails the requester a payment link, sets status to
needs_more_hours.
How members track their cases
Members see their cases via [sp_my_research_cases] (matching page-builder widget). Each card shows status, researcher (if assigned), paid amount, hours authorized, and SLA.
If there's a pending invoice for additional hours, the card shows it inline as a yellow callout with an "Authorize & Pay" button. Clicking the button creates a Stripe Checkout for that invoice; on payment success, hours bump and the case continues.
How conversion-from-Help-Request works
A Help Request thread sometimes reveals "this is too much for free help." On the admin Help Request view page, when the Research Services module is enabled, a button appears: ↑ Convert to paid Research Case.
Clicking it:
- Creates a new Research Case pre-filled with the Help Request's title, description, and requester contact info.
- Status starts at
pending_paymentso the requester can authorize the fee. - Drops a system response into the original Help Request thread noting the escalation.
- Emails the requester explaining their question has been escalated, with a link to authorize payment.
The original Help Request stays — only the conversation is preserved. If the requester pays, the new case enters the queue. If they don't, nothing happens to either record.
How messaging works
Both admin and member case views render a chat-style thread of messages. Reply form below accepts text + an optional file attachment (image / PDF / DOC / DOCX / TXT).
Sending a message emails the other party — researcher when the requester wrote, requester when staff/researcher wrote. Falls back to your configured admin email when no researcher has claimed yet.
The thread is private to the requester, the assigned researcher, and staff. Other members can't see it.
If something looks wrong
Intake form says "stripe_unconfigured." Add your Stripe keys under Settings → Events → Online Payments.
Case is stuck in pending_payment after the requester says they paid. Stripe success URL didn't get hit (closed tab, browser interrupted). Look at the Stripe dashboard → Payments to verify the charge succeeded; if it did, manually flip the case status to open and update paid_amount in the admin.
Requester didn't get the additional-hours email. Check your site can send email at all — "Lost your password?" on the sign-in page with your own address is the quickest test; if it never arrives, see Email Setup. If mail works, look at the case's invoice list — the invoice should have been created. The email goes to the requester's email; verify it's correct on the case.
Researcher can't see open cases. Check that they're logged in and on a page hosting [sp_my_research_assignments]. The dashboard uses the logged-in user's ID to find claimed cases; if the page is cached, it might show stale data.
A researcher claimed a case but isn't doing the work. Open the case admin, change claimed_by_user_id (Researcher dropdown in the sidebar) to assign someone else. The original researcher loses access; the new one is notified.
Related guides
- Help Requests — the free comradery counterpart
- Donations — same Stripe Checkout path is reused
- Members — researchers are members; volunteer hours are member-attributed
- Governance — research hours feed the same volunteer-hours ledger