DealsFlow becomes the business workflow layer after app activity.
Most teams already have the product data. The missing piece is the operational layer around it. DealsFlow ingests the activity your app already knows about, then uses that data to run onboarding, segmentation, support context, follow-up automation, CRM memory, booking workflows, and revenue-aware operations without forcing you to rebuild those systems inside your product.
- Import new app users after registration.
- Track installs, opens, subscriptions, and purchases.
- Sync products or services from the app catalog.
- Sync orders and sales so Flow can reason over customers and revenue events.
- Sync in-app support conversations and messages so support operations live in one place.
- Sync demos, calls, or consultations booked from inside the app.
- Let Flow identify inactive users, draft outreach, summarize support threads, and manage follow-up workflows.
The natural objects your app sends into DealsFlow
The core ingest model is straightforward: users, lifecycle and product events, products or services, sales or orders, support conversations, support messages, and bookings. Those are the objects Flow can use to build operational context around the app.
Users
Imported app users become the canonical CRM client record that follow-up, support, bookings, and sales context attach to.
Lifecycle and product events
Use events for installs, opens, subscriptions, purchases, and other signals that describe what just happened in the app.
Products or services
Sync the catalog your app actually sells so Flow can reason about what the user bought, booked, or asked about.
Sales or orders
Attach buyers and products to revenue events so follow-up can use customer and transaction context together.
Support conversations
Bring imported threads into DealsFlow inbox context so support workflows have the same customer record and product context.
Support messages
Append or update the messages inside imported conversations so thread history stays operational inside Flow.
Bookings
Sync demos, calls, consultations, appointments, and similar bookings with the right client and service context.
{
"external_user_id": "usr_123",
"email": "user@example.com",
"name": "John Doe",
"created_at": "2026-03-23T10:30:00Z",
"plan": "pro",
"status": "active",
"subscription_status": "active",
"billing_model": "subscription",
"billing_interval": "month",
"installed_at": "2026-03-23T10:30:00Z",
"install_platform": "ios",
"install_source": "producthunt",
"app_version": "1.4.2",
"metadata": {
"source": "producthunt",
"company": "Acme Labs"
}
}
{
"event": "app_installed",
"user": {
"external_user_id": "usr_123",
"email": "user@example.com",
"name": "John Doe"
},
"properties": {
"install_platform": "ios",
"install_source": "producthunt",
"app_version": "1.4.2"
},
"event_timestamp": "2026-03-23T10:30:00Z"
}
{
"external_product_id": "prod_roman_pro",
"sku": "ROMAN-PRO",
"title": "Roman Pro",
"type": "product",
"description": "Training app for modern athletes.",
"short_description": "Roman mobile training",
"currency": "USD",
"price": "29.00",
"sale_price": "19.00",
"is_active": true
}
{
"sale_id": "order_1001",
"date": "2026-03-23T16:45:00Z",
"quantity": 2,
"total": "58.00",
"buyer": {
"external_user_id": "usr_123",
"email": "user@example.com",
"name": "John Doe"
},
"product": {
"external_product_id": "prod_roman_pro",
"sku": "ROMAN-PRO",
"title": "Roman Pro",
"currency": "USD",
"price": "29.00"
}
}
{
"thread_id": "conv_support_1001",
"last_message_at": "2026-03-24T09:00:00Z",
"channel": {
"external_channel_id": "app_support_main",
"display_name": "In-App Support",
"type": "app_inbox"
},
"contact": {
"external_user_id": "usr_123",
"email": "user@example.com",
"name": "John Doe",
"phone": "+15551234567"
},
"metadata": {
"topic": "billing",
"plan": "pro"
}
}
{
"message_id": "msg_support_1001",
"thread_id": "conv_support_1001",
"direction": "in",
"text": "I need help with my billing screen.",
"sent_at": "2026-03-24T09:15:00Z",
"delivery_status": "read",
"channel": {
"external_channel_id": "app_support_main",
"display_name": "In-App Support",
"type": "app_inbox"
},
"contact": {
"external_user_id": "usr_123",
"email": "user@example.com",
"name": "John Doe"
},
"metadata": {
"screen": "billing_modal",
"device": "ios"
}
}
{
"booking_id": "booking_1001",
"title": "Roman onboarding call",
"booking_type": "video_call",
"status": "confirmed",
"scheduled_at": "2026-03-25T10:30:00Z",
"duration_minutes": 45,
"location": "Google Meet",
"notes": "Booked from inside the mobile app.",
"client": {
"external_user_id": "usr_123",
"email": "user@example.com",
"name": "John Doe"
},
"service_external_ids": ["svc_onboarding"]
}
Supported user fields
external_user_idemailnamecreated_atplanstatussubscription_statusbilling_modelbilling_intervalsubscription_started_atsubscription_ends_atinstalled_atlast_opened_atuninstalled_atinstall_platforminstall_sourceapp_versioninstall_countis_installednext_billing_atlast_payment_atlast_payment_amountlast_payment_currencylifetime_valuetotal_payments_countis_active_customermetadata
Supported event fields
eventuserpropertiesevent_timestampIdempotency-Key
user_signed_up, user_purchased, subscription_started, subscription_renewed, app_installed, app_opened, app_uninstalled.
Supported product and service fields
external_product_idskutitletypedescriptionshort_descriptioncurrencypricesale_pricecost_priceapprox_duration_minutesis_active
Supported sale and order fields
sale_iddatequantitytotalbuyerproduct
Supported conversation fields
thread_idlast_message_atchannelcontactmetadata
Supported message fields
message_idthread_iddirectiontextmediasent_atdelivery_statusmetadata
Supported booking fields
booking_idtitlebooking_typestatusscheduled_atduration_minuteslocationnotesclientservice_external_idsservices
The implemented Developer API surface
All requests are made against https://app.dealsflow.ai with a Bearer API key from DealsFlow Settings > Developer API. Keys are org-scoped. The endpoint surface is intentionally compact: send the business objects your app already owns, then let Flow operate on that context.
GET /api/developer/health/ to check API reachability and current API version. Use GET /api/developer/me/ to confirm the authenticated organization and return key metadata for the current API key.
/api/developer/health/Checks API reachability and returns the current API version.
/api/developer/me/Confirms the authenticated organization and returns key metadata for the current API key.
/api/developer/users/upsert/Creates or updates an imported app user.
- Syncs a canonical CRM client.
- Updates attached app profile context when app-specific fields are present.
/api/developer/events/Ingests lifecycle and product events for app activity, installs, subscriptions, purchases, and similar signals.
- Supports idempotency with the
Idempotency-Keyheader. - Use it for events such as
app_installed,app_opened, and revenue or subscription signals.
/api/developer/products/upsert/Creates or updates imported products or services.
/api/developer/sales/upsert/Creates or updates imported sales and orders.
- Can attach buyer and product in the same request.
- Useful when Flow needs both customer and revenue context together.
/api/developer/conversations/upsert/Creates or updates imported support conversations and threads.
- Places the thread into DealsFlow inbox context.
- Keeps support workflows attached to the same customer record used elsewhere in Flow.
/api/developer/messages/upsert/Creates or updates imported support messages.
- Appends or updates messages inside imported conversations.
- Lets Flow reason over thread history, not just the last event.
/api/developer/bookings/upsert/Creates or updates demos, calls, consultations, appointments, and similar bookings.
- Attaches the booking to the right client.
- Can attach imported services with
service_external_idsorservices.
Real curl requests for the public API
These examples use the implemented surface above. Authentication is always Bearer auth, keys are org-scoped, and event ingest supports Idempotency-Key when you need safe retries.
POST /api/developer/events/
Eventscurl -X POST "https://app.dealsflow.ai/api/developer/events/" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: evt-usr_123-app_installed-20260323T103000Z" \
-d '{
"event": "app_installed",
"user": {
"external_user_id": "usr_123",
"email": "user@example.com",
"name": "John Doe"
},
"properties": {
"install_platform": "ios",
"install_source": "producthunt",
"app_version": "1.4.2"
},
"event_timestamp": "2026-03-23T10:30:00Z"
}'
POST /api/developer/users/upsert/
Userscurl -X POST "https://app.dealsflow.ai/api/developer/users/upsert/" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"external_user_id": "usr_123",
"email": "user@example.com",
"name": "John Doe",
"created_at": "2026-03-23T10:30:00Z",
"plan": "pro",
"status": "active",
"subscription_status": "active",
"billing_model": "subscription",
"billing_interval": "month",
"installed_at": "2026-03-23T10:30:00Z",
"install_platform": "ios",
"install_source": "producthunt",
"app_version": "1.4.2",
"metadata": {
"source": "producthunt",
"company": "Acme Labs"
}
}'
POST /api/developer/messages/upsert/
Supportcurl -X POST "https://app.dealsflow.ai/api/developer/messages/upsert/" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"message_id": "msg_support_1001",
"thread_id": "conv_support_1001",
"direction": "in",
"text": "I need help with my billing screen.",
"sent_at": "2026-03-24T09:15:00Z",
"delivery_status": "read",
"channel": {
"external_channel_id": "app_support_main",
"display_name": "In-App Support",
"type": "app_inbox"
},
"contact": {
"external_user_id": "usr_123",
"email": "user@example.com",
"name": "John Doe"
},
"metadata": {
"screen": "billing_modal",
"device": "ios"
}
}'
POST /api/developer/bookings/upsert/
Bookingscurl -X POST "https://app.dealsflow.ai/api/developer/bookings/upsert/" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"booking_id": "booking_1001",
"title": "Roman onboarding call",
"booking_type": "video_call",
"status": "confirmed",
"scheduled_at": "2026-03-25T10:30:00Z",
"duration_minutes": 45,
"location": "Google Meet",
"notes": "Booked from inside the mobile app.",
"client": {
"external_user_id": "usr_123",
"email": "user@example.com",
"name": "John Doe"
},
"service_external_ids": ["svc_onboarding"]
}'
Operational context around the app, not just another raw database
Once the app data is ingested, Flow can act on it. That means segmentation by behavior, support workflows in inbox context, follow-up driven by product and sales state, and booking workflows that understand who booked, what they booked, and what should happen next.
Segment users by behavior
Use installs, opens, subscriptions, purchases, and status fields to group users by lifecycle stage, activity, revenue state, or source.
Act on support conversations in inbox context
Imported conversations and messages land in DealsFlow inbox context so support operations can use the same customer, product, and thread history together.
Use product and sales context for follow-up
Products, services, and orders let Flow draft follow-up based on what the user bought, what they asked about, and what revenue state they are in.
Use bookings for reminders and post-booking workflows
Bookings can trigger reminders, handoff preparation, and post-booking follow-up tied to the same client and service context.
- Identify inactive users from lifecycle signals.
- Draft outreach with product-aware and revenue-aware context.
- Summarize support threads from imported conversations and messages.
- Manage follow-up workflows after purchases, support activity, and bookings.
DealsFlow becomes operational context around the app, not just a raw database.
Auth model, reachability checks, and documented error codes
- Base API URL:
https://app.dealsflow.ai - Authentication: Bearer API key from DealsFlow Settings > Developer API
- Keys are org-scoped
- Use
Authorization: Bearer YOUR_API_KEYon every request
GET /api/developer/health/checks reachability and returns the current API version.GET /api/developer/me/confirms the authenticated organization and current key metadata.- Use the
Idempotency-Keyheader onPOST /api/developer/events/when retrying event ingestion.
missing_authorizationAuthorization header is missing.
invalid_api_keyBearer key is invalid for the organization or no longer usable.
invalid_jsonRequest body is not valid JSON.
missing_user_identityUser upsert or nested user data is missing its required identity.
missing_sale_identitySale or order upsert is missing its required sale identifier.
missing_thread_identityConversation upsert is missing its required thread identifier.
missing_message_identityMessage upsert is missing its required message identifier.
missing_booking_identityBooking upsert is missing its required booking identifier.
missing_booking_scheduled_atBooking upsert is missing scheduled_at.
rate_limitedRetry later and back off before sending the next request burst.
Send the data your app already has. Let Flow operate on it.
Connect registration, lifecycle, catalog, revenue, support, and booking data once. Then use DealsFlow as the workflow layer for onboarding, segmentation, inbox operations, follow-up, CRM context, and post-booking work.