Introduction
Overview
Prospects in Frontier stores and manage subscription preferences for various activities like newsletters, blog updates, and marketing communications. Unlike user preferences which are tied to registered accounts (registered account means record is present in users table), Prospects is designed to handle subscriptions for non-registered users.
A key feature of Prospects is its ability to manage subscriptions without requiring user registration. This makes it ideal for:
- Newsletter subscriptions from website visitors
- Blog update notifications for readers
- Marketing communication preferences
- Event notifications etc
Each email address can be subscribed to multiple activities simultaneously, allowing granular control over different types of communications. The system maintains subscription status and related details independently of Frontier's user authentication system.
Key Fields
- Email: Subscriber's email address
- Activity: Type of subscription (newsletters, marketing emails, blog articles)
- Status: Current subscription state (
subscribed
orunsubscribed
) - ChangedAt: Timestamp of last status change (useful for metrics like monthly subscriber growth)
- Source: Origin of subscription (
website
,email
,social-media
) - Verified: Email verification status (boolean)
Access Control
Admin users have full CRUD access.
Public access limited to prospect creation via the unauthenticated endpoint
API Reference
Public Endpoints
Create a prospect (Unauthenticated)
Endpoint: POST /v1beta1/prospects
RPC: CreateProspectPublic
Request:
{
"email": "test@example.com",
"activity": "newsletter",
"source": "website"
}
Response:
{
"prospect": {
"id": "id-1",
"name": "",
"email": "test@example.com",
"phone": "",
"activity": "newsletter",
"status": "STATUS_SUBSCRIBED",
"changed_at": "2025-03-04T07:23:52.611644Z",
"source": "website",
"verified": true,
"created_at": "2025-03-04T07:23:52.611644Z",
"updated_at": "2025-03-04T07:23:52.611644Z",
"metadata": {}
}
}
Admin endpoints
Create a prospect
Endpoint: POST /v1beta1/admin/prospects
RPC: CreateProspect
Request:
{
"email": "test@example.com",
"activity": "blog",
"status": 1, // subscribed
"source": "admin",
"metadata": {
"medium": "test"
}
}
Response:
{
"prospect": {
"id": "id-2",
"name": "",
"email": "test@example.com",
"phone": "",
"activity": "blog",
"status": "STATUS_SUBSCRIBED",
"changed_at": "2025-03-04T07:23:52.611644Z",
"source": "admin",
"verified": true,
"created_at": "2025-03-04T07:23:52.611644Z",
"updated_at": "2025-03-04T07:23:52.611644Z",
"metadata": {"medium": "test"}
}
}
Get Prospect
Endpoint: GET v1beta1/admin/prospects/{id}
RPC: GetProspect
Request: v1beta1/admin/prospects/id-1
Response:
{
"prospect": {
"id": "id-1",
"name": "",
"email": "test@example.com",
"phone": "",
"activity": "newsletter",
"status": "STATUS_SUBSCRIBED",
"changed_at": "2025-03-04T07:23:52.611644Z",
"source": "website",
"verified": true,
"created_at": "2025-03-04T07:23:52.611644Z",
"updated_at": "2025-03-04T07:23:52.611644Z",
"metadata": {}
}
}
List Prospects
Endpoint: POST /v1beta1/admin/prospects/list
RPC: ListProspects
Request:
{
// filters, sorting, pagination and groups supported
}
Response:
{
"prospects": [
{
"id": "id-1",
"name": "",
"email": "test@example.com",
"phone": "",
"activity": "newsletter",
"status": "STATUS_SUBSCRIBED",
"changed_at": "2025-03-04T07:23:52.611644Z",
"source": "website",
"verified": true,
"created_at": "2025-03-04T07:23:52.611644Z",
"updated_at": "2025-03-04T07:23:52.611644Z",
"metadata": {}
},
{
"prospect": {
"id": "id-2",
"name": "",
"email": "test@example.com",
"phone": "",
"activity": "blog",
"status": "STATUS_SUBSCRIBED",
"changed_at": "2025-03-04T07:23:52.611644Z",
"source": "admin",
"verified": true,
"created_at": "2025-03-04T07:23:52.611644Z",
"updated_at": "2025-03-04T07:23:52.611644Z",
"metadata": {"medium": "test"}
}
}
],
"pagination": {
"offset": 0,
"limit": 2,
"total_count": 5
},
"group": null
}
Update Prospect
Endpoint: PUT /v1beta1/admin/prospects/{id}
RPC: UpdateProspect
Request:
{
"id": "id-1",
"name": "updated-name",
"email": "test@example.com",
"phone": "",
"activity": "newsletter",
"status": "STATUS_SUBSCRIBED",
"changed_at": "2025-03-04T07:23:52.611644Z",
"source": "website",
"verified": true,
"created_at": "2025-03-04T07:23:52.611644Z",
"updated_at": "2025-03-04T07:23:52.611644Z",
"metadata": {}
}
Response:
{
"prospect": {
"id": "id-1",
"name": "updated-name",
"email": "test@example.com",
"phone": "",
"activity": "newsletter",
"status": "STATUS_SUBSCRIBED",
"changed_at": "2025-03-04T07:23:52.611644Z",
"source": "website",
"verified": true,
"created_at": "2025-03-04T07:23:52.611644Z",
"updated_at": "2025-03-05T07:23:52.611644Z",
"metadata": {}
}
}
Delete Prospect
Endpoint: DELETE /v1beta1/admin/prospects/{id}
RPC: DeleteProspect
Request: v1beta1/admin/prospects/id-1
Response: {}