This App Showcase post is an AI-generated test blog for evaluating quickstart candidates; treat it as draft application guidance, not final product documentation.
AI-generated test blog - HeavenBase Team - June 23, 2026 - ~1,300 words - ~7 min read
Imagine an independent creator who writes a newsletter and occasionally works with sponsors. The work is not complicated at first: remember which brands are promising, what the next outreach step is, and which promised deliverable is due soon.
Creator CRM turns that ordinary workflow into a small HeavenBase app. You do not need to know sales software to follow it. A “lead” is a possible sponsor, and a “deliverable” is something the creator promised to publish.
1. Background and Goal
Many creators begin with a spreadsheet or a notes app. That is fine until the creator wants an assistant or agent to help with follow-ups. Then two questions appear: where is the structured truth, and what should the agent be allowed to touch?
The goal of this tutorial is to build a small CRM that can:
- list the best sponsor opportunities
- show deliverables due this week
- keep each record simple enough to read
- expose only sponsor and deliverable data to an agent profile
The last point matters. A helpful agent should not automatically see every future entity you add to a workspace.
2. Scenario and Setting
We will use a fictional creator named Mira. She is choosing between two brands and has two promised pieces of content for the stronger lead.
| Brand | Situation | Next Question |
|---|
| Aurora Gear | Strong fit and larger budget. | What should Mira send next? |
| Lumen Desk | Possible fit, but still early. | Should Mira ask for a product sample? |
The app should help Mira answer two practical questions: “Which lead deserves attention?” and “What is due in the next seven days?”
You can replace sponsors with clients, grants, event partners, or freelance prospects. The pattern is the same: track an opportunity and the work promised against it.
3. Step 1: Decide the Agent Boundary
Before writing data, define what an agent should be allowed to do. This profile can read, query, create, and patch only two entity types: sponsor-lead and deliverable.
import heavenbase as hb
from community_runtime import demo_workspace, parse_reset, print_frame, seed
hb.ext.register_profile(
hb.ext.ProfileSpec(
name="creator-crm-agent",
extends=("agent",),
tools=("read", "query", "upsert", "set"),
entities=("sponsor-lead", "deliverable"),
serializer="markdown",
),
replace=True,
)
This is a small safety habit worth teaching early: define the assistant’s allowed surface before the app grows.
4. Step 2: Define Leads and Deliverables
The app needs two cards. SponsorLead stores the relationship with a brand. Deliverable stores the promised work tied to a lead.
class SponsorLead(hb.Entity):
"""Sponsor or partnership lead."""
brand = hb.field(hb.ShortText).desc("Brand name")
fit = hb.field(hb.Integer).desc("1 is weak fit, 5 is excellent fit")
budget = hb.field(hb.Float).desc("Estimated campaign budget")
next_step = hb.field(hb.LongText).desc("Next outreach step")
status = hb.field(hb.ShortText).desc("new, active, won, or lost")
class Deliverable(hb.Entity):
"""Promised deliverable for an active lead."""
lead_id = hb.field(hb.Identifier).desc("SponsorLead object_id")
channel = hb.field(hb.ShortText).desc("Channel")
due_days = hb.field(hb.Integer).desc("Days until due")
brief = hb.field(hb.LongText).desc("Creative brief")
The field names are intentionally plain. A non-technical user can read brand, budget, next_step, and due_days without learning database vocabulary.
5. Step 3: Open the Workspace and Add Rows
Now open the local workspace, register both card types, and seed the two sponsors plus two deliverables.
WS_ID = "community-app-creator-crm"
ws, _ = demo_workspace(WS_ID, "apps-creator-crm", parse_reset())
ws.enable_extension("agent")
ws.register(SponsorLead)
ws.register(Deliverable)
seed(
ws,
SponsorLead,
[
{"object_id": "lead-aurora", "brand": "Aurora Gear", "fit": 5, "budget": 7500.0, "next_step": "Send spring trail concept.", "status": "active"},
{"object_id": "lead-lumen", "brand": "Lumen Desk", "fit": 3, "budget": 2800.0, "next_step": "Ask for product sample.", "status": "new"},
],
)
seed(
ws,
Deliverable,
[
{"object_id": "deliv-1", "lead_id": "lead-aurora", "channel": "newsletter", "due_days": 6, "brief": "Trail packing checklist placement."},
{"object_id": "deliv-2", "lead_id": "lead-aurora", "channel": "short-video", "due_days": 12, "brief": "One 30-second campsite setup clip."},
],
)
This gives Mira enough data to make a real choice without turning the demo into a full business system.
6. Step 4: Ask the Next Business Questions
First, ask which sponsor lead has a strong fit. Then ask what deliverable is due within seven days.
best_leads = (
ws.query(SponsorLead)
.where(SponsorLead.fit >= 4)
.select("brand", "budget", "next_step")
.execute()
)
upcoming = (
ws.query(Deliverable)
.where(Deliverable.due_days <= 7)
.select("lead_id", "channel", "due_days", "brief")
.execute()
)
The output is the whole value of the first version:
Best sponsor leads
object_id | brand | budget | next_step
--------------------------------------
'lead-aurora' | 'Aurora Gear' | 7500.0 | 'Send spring trail concept.'
Upcoming deliverables
object_id | lead_id | channel | due_days | brief
------------------------------------------------
'deliv-1' | 'lead-aurora' | 'newsletter' | 6 | 'Trail packing checklist placement.'
This is enough for Mira to act today: send the Aurora Gear concept and prepare the newsletter placement.
7. Step 5: Expose the Safe Agent View
Finally, build the MCP toolkit from the custom profile and check what the agent can see.
toolkit = ws.to_mcp(profile="creator-crm-agent")
print(toolkit.run("list_entities")["entities"])
The result is deliberately narrow:
Scoped agent entities: ['deliverable', 'sponsor-lead']
This is the main lesson of the example. HeavenBase is not just storing rows; it also lets the app describe the boundary an assistant should use.
A successful run shows the best lead, the upcoming deliverable, and a scoped agent profile that lists only deliverable and sponsor-lead.
8. What This Teaches
Creator CRM is friendly because the problem is easy to picture. It starts with normal work: decide who to reply to and what is due soon. Then it introduces HeavenBase as the place where those facts become typed records and scoped tools.
The next version could add reminders, notes from sponsor calls, content approval status, or a reusable extension that registers this creator workflow for other users.
Try It
From the community examples checkout, run:
rtk bash scripts/run.bash apps.creator_crm
Use this draft as a quickstart candidate when you want the first app to feel personal and practical rather than infrastructure-first.
Further Exploration
Related resources:
- Entities - Model leads and deliverables as typed rows
- HeavenBase MCP - Create MCP profiles from a workspace
- Toolkits - Understand tool groups and profile-scoped tools
- Extensions - Package reusable entity and profile bundles
- Agents - Attach workspace tools to an LLM session