Programs & Enrollments
Configure and manage offerings users can enroll in—and track their eligibility and status
A Program is any offering that requires a user to sign up or "enroll." Common examples include:
- Demand response initiatives, like California's Demand Side Grid Support (DSGS) program
- Battery or thermostat rebate programs provided by utilities, CCAs, or other organizations
- Custom programs that your Organization may create and manage on Texture
From a Texture perspective, these Programs follow a common flow:
- Your Organization creates an Instance of a Program (e.g., a specific battery rebate rollout).
- A user enrolls—typically by completing a Texture-hosted form or your custom flow using the API.
- Texture evaluates eligibility—both in real time and asynchronously.
See below for how Programs, Program Instances, and Enrollments work on Texture.
For a deeper reference, check out our overview docs.
What is a Program?
A Program defines the template for an offering users can enroll in—such as "DSGS," "Battery Rebate Program," or "Time-of-Use Billing Pilot."
- Common fields: name, description, logo, eligibility criteria, terms, service areas, start/end dates
- Program Catalog: Texture maintains a set of shared programs (e.g., DSGS)
- Custom Programs: Your Organization can also define its own
Program vs. Program Instance
Each Program can have multiple Program Instances, which tailor that offering to a specific context:
- Branding (logo, name, imagery, copy)
- Enrollment form (URL, required fields)
- Eligibility criteria and terms
For example, you could run two DSGS Instances—each with its own sign-up form and region-specific rules.
Program Instances allow for custom preferences, partner branding, or custom eligibility rules—all without redefining the underlying Program.
Program Instances
A Program Instance activates a Program for your Organization. Each Instance is fully configurable:
- Example:
battery_rebate_nycusing the base "Battery Rebate Program" but customized for NYC customers - Each Instance gets a unique
slugused in enrollment forms and API calls - Organizations can create multiple Instances from the same Program
Create an Instance
Use the Texture API:
POST /programs/{programSlug}/instances
Define:
name,description,logoeligibilityCriteriacustom terms and fields
See our API reference for full request and response details.
Enrollments
An Enrollment is how a user joins a specific Program Instance. It includes the user's details, the target Instance, and any eligibility evaluation.
What's Included
- Customer info: name, email, address
- Program Instance: the slug or ID
- Custom fields: flexible fields like utility account number or battery serial
How to Enroll
- Texture-Generated Forms
- Use a branded, customizable form hosted by Texture
- Data is stored automatically when submitted
- Custom UI + API
- Collect info in your own UI and call:
POST /enrollments
Enrollment Identification Methods
You can identify the enrolling user using one of four supported inputs:
- enrollmentId — Re-enroll a known customer; pulls prior data
- customerId — For existing Contacts with contact info on file
- leadId — For Leads; if required fields are missing, Texture returns a 400
- customerInfo — For brand new users; all fields must be included
If you use leadId or customerInfo, ensure all required fields are present. Incomplete submissions will be rejected.
Checking Enrollment Status
Once submitted, check enrollment progress with:
GET /enrollments/{enrollmentId}
Or retrieve filtered lists:
GET /enrollments?status={status}
To receive real-time updates, configure webhooks. Texture will send:
enrollment.submittedenrollment.approvedenrollment.rejected
Eligibility Checks
Programs can define rules users must meet to qualify. Texture checks these during and after enrollment.
Types of checks:
- Synchronous: Instant checks (e.g., ZIP code, device spec)
- Asynchronous: Delayed validations (e.g., utility confirmation)
Track progress with the eligibility.status field.
Typical statuses:
| Status | Description |
|---|---|
| candidate | Started but not fully evaluated |
| eligible | Passed initial checks |
| ineligible | Failed requirements |
| submitted | Formally submitted |
| approved | Fully qualified |
| rejected | Did not pass |
| unenrolled | Previously enrolled, now removed |
Example Workflow
Here's how a battery rebate flow might work:
- Org creates a Program Instance:
battery-rebate-nyc - Shares Texture form link
- User provides info
- Texture runs synchronous checks
- If eligible, user connects device or utility account
- Texture performs async checks (if needed)
- Enrollment progresses through status changes
- Webhooks notify your system or you poll for updates
Why Programs & Enrollments?
This model helps you:
- Run multiple tailored Instances from a shared Program
- Evaluate users instantly and over time
- Capture flexible data
- Automate with webhook updates
It lets you launch and scale offerings without rebuilding logic or sign-up flows each time.
Additional Tips for Developers
- Sandbox Testing: Try flows in a non-production workspace
- Error Handling: Look at HTTP codes and
eligibility.reasonfor rejections - Security: Protect API keys and validate any external identifiers
- Reference Docs: See the API spec for all payloads and endpoint details
Next Steps
- Explore the API Reference for
/programs,/instances, and/enrollments - Set up Destinations to receive webhooks
- Customize or embed Texture forms
- Reach out via live chat in the Dashboard for support or program requests