Skip to main content
A case is one tracked workflow against one counterparty. The current implementation stores it in DynamoDB, processes it asynchronously, and updates it as the thread evolves.

Core Fields

Runtime Fields

Defaults

If you omit them at creation time:
  • maxAttempts defaults to 3
  • followUpDelayHours defaults to 72
That means a default case can send:
  • 1 initial outreach
  • up to 3 automated follow-ups

Attachments

Attachments are tracked separately from result:
  • they come from inbound reply events
  • they are stored as metadata on the case
  • they appear in webhook payloads and GET /cases/{id}
  • you fetch a fresh downloadUrl with GET /cases/{id}/attachments/{attachmentId}
The current implementation does not inspect attachment contents directly.

Usage Limits

POST /cases checks monthly usage before creating a new case:
  • SANDBOX: 100
  • PAYG: 100
  • BASE_PRO: 500
The limit compares both:
  • created cases in the current UTC month
  • billable finished cases in the current UTC month
The code treats completed cases as billable. Failed cases are billable unless the terminal resultStatus is BOUNCED, REJECTED, or COMPLAINED.

Design Advice

Good cases are:
  • specific
  • bounded to one outcome
  • easy to verify from the conversation
Good examples:
  • “Collect a signed W-9 from the vendor.”
  • “Confirm whether the Tuesday delivery window works.”
  • “Get the corrected March invoice.”
Poor examples:
  • “Handle vendor onboarding.”
  • “Figure out what to do.”
  • “Manage all communication with this account forever.”