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.

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

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