Cool Idea by Crow
Crow
Let users control your app through chat
Business model:
In short:
- Crow sells a B2B SaaS layer.
- That layer turns product’s APIs into a chat-based control surface.
- Priced by usage and seats.
Target customer:
- Crow’s customers are product companies, not end users.
- Typical buyers:
- SaaS companies, such as Supabase.
- Enterprise software vendors.
- Internal tools teams
What Crow is selling:
- Crow sells infrastructure for product teams, not a chatbot.
- They sells a developer platform that lets companies add a chat-based control layer on top of their product.
Value:
- Customers pay Crow to:
- Turn their app into “AI-controlled” without rebuilding UX
- Reduce time-to-ship an AI copilot
- Avoid building & maintaining:
- Intent parsing
- Tool routing
- Permissions
- Audit logs
- Confirmations
- Safety rails
- Conversation state => Crow replaces months of infra work.
Pricing:
- Platform fee
How Crow works:
Implementation
- We, as an SaaS product, integrate Crow into our system by:
- Embedding Front-end so users can chat in our product UI.
- Action + data connection:
- We expose a set of allowed actions (could be via backend API - OpenAPI spec) such as
invite_collaborator,create_workspace,go_to_billing_page, etc. - Crow calls those actions; their systems enforce auth/permissions and returns results.
- We expose a set of allowed actions (could be via backend API - OpenAPI spec) such as
Example:
1. Our FastAPI endpoint
from fastapi import FastAPI, Depends, HTTPException
from pydantic import BaseModel, EmailStr
app = FastAPI()
# ----- Auth dependency (example) -----
def get_current_user():
# In reality: decode JWT, session, etc.
return {
"id": "user_123",
"role": "admin"
}
# ----- Request schema -----
class InviteUserRequest(BaseModel):
email: EmailStr
role: str # admin | editor | viewer
# ----- Endpoint -----
@app.post("/workspaces/{workspace_id}/invite")
def invite_user(
workspace_id: str,
payload: InviteUserRequest,
user = Depends(get_current_user)
):
if user["role"] != "admin":
raise HTTPException(status_code=403, detail="Not allowed")
# Business logic (DB, Supabase, etc.)
# supabase.from("members").insert(...)
return {
"status": "ok",
"workspace_id": workspace_id,
"email": payload.email,
"role": payload.role
}
2. Allowed actions we give to Crow
{
"name": "invite_collaborator",
"description": "Invite a user to a workspace",
"method": "POST",
"url": "/workspaces/{workspace_id}/invite",
"parameters": {
"workspace_id": "string",
"email": "string",
"role": "admin | editor | viewer"
},
"auth": "user"
}
3. User types in chat
- “Invite crow@usecrow.com as admin to the Crow workspace”
4. Crow converts language → structured API call
POST /workspaces/crow/invite
Authorization: Bearer USER_JWT
Content-Type: application/json
{
"email": "crow@usecrow.com",
"role": "admin"
}
5. Crow shows the user a friendly response
- ✅ crow@usecrow.com has been invited to the Crow workspace as an Editor