Skip to main content

Workflow Templates & Marketplace

Pre-built Workflow recipes. Two distinct surfaces:

  • Templates — first-party templates curated and shipped by CronDB. Some are free; others are bundled with paid plans or sold individually. Discoverable via GET /v1/workflows/templates.
  • Marketplace — community-published workflows. Any user can publish; everyone else can browse, install, rate. Discoverable via GET /v1/workflows/marketplace.

Plus version history on every workflow you own — every save snapshots, and rollback is one POST.


First-Party Templates

List templates

GET /v1/workflows/templates?detail=summary

detail=summary (default) drops the marketing copy from each row (~37% smaller payload). Use for grid views. Pass detail=full to include the marketplace_detail body — story, use cases, step explanations — for the detail page.

Response

{
"templates": [
{
"id": "ind_saas_intent_alert_to_slack",
"name": "SaaS intent alerts → Slack",
"description": "When a SaaS intent alert fires, post the top 5 to your Slack #sales-leads channel.",
"tag": "beginner",
"trigger_type": "intent_alert",
"actions": [
{"type": "filter_domains", "config": {"limit": 5}},
{"type": "http_request", "config": {"method": "POST", "url": "{{slack_webhook_url}}", "body": {"text": "..."}}}
],
"price_cents": 0,
"price_display": "Free",
"is_free": true,
"owned": true,
"industries": ["saas"]
}
]
}

Response Fields

FieldDescription
idStable template ID. Used for install + rate.
tagbeginner, intermediate, advanced — drives default pricing.
price_cents / price_displayPer-template pricing. Free templates have price_cents: 0.
is_freeFree for any signed-in user.
ownedAlready accessible to the caller — either bought, plan-perk, or is_free. Filter by this for "my templates" view.
industriesAuto-derived from the template's id prefix (ind_saas_*saas) and any industry condition value. Empty for general-purpose templates.

Install a template

POST /v1/workflows/install-template
{ "template_id": "ind_saas_intent_alert_to_slack" }

The endpoint creates a fresh workflow on the caller's account from the template's trigger + conditions + actions. Returns the new workflow object. Paid templates require a prior purchase (returns 402 if not owned).

Template stats (public)

GET /v1/workflows/template-stats

Public — no auth. Returns install counts and average ratings for every official template:

{
"install_counts": {
"ind_saas_intent_alert_to_slack": 1247,
"ind_fintech_funding_to_sequence": 412
},
"ratings": {
"ind_saas_intent_alert_to_slack": { "avg": 4.6, "count": 89 }
}
}

Use this to badge templates with social proof.

Rate a template

POST /v1/workflows/rate-template
{ "template_id": "ind_saas_intent_alert_to_slack", "template_type": "workflow", "rating": 5, "review": "..." }

Must have installed (or purchased) the template — returns 403 otherwise. Rating overwrites any prior rating from the same user.

My ratings

GET /v1/workflows/my-ratings

Lookup the caller's submitted ratings — useful for marking up the templates list with "you rated this 5★ on Apr 12."

Suggestions

GET /v1/workflows/suggest-templates

Returns templates the engine thinks the caller would benefit from, based on which industries they search for, what their saved alerts target, and which templates similar accounts use. Rough collaborative-filtering signal — quality improves with more user activity.


Community Marketplace

User-published workflows. Anyone can publish; anyone can install.

Browse

GET /v1/workflows/marketplace?category=outbound&difficulty=intermediate&sort=popular&page=1&limit=20&q=slack
Query ParamDescription
categoryoutbound, enrichment, monitoring, notifications, data-cleanup, etc.
difficultybeginner, intermediate, advanced.
sortpopular (install count), newest (created_at), top_rated (rating sum).
page / limitPagination. limit 1-50, default 20.
qSubstring search on name + description.

Response

{
"items": [
{
"id": 41,
"name": "Drip-feed warm domains into HubSpot",
"description": "When a tracked-keyword match fires...",
"category": "enrichment",
"tags": ["hubspot", "enrichment"],
"difficulty": "intermediate",
"trigger_type": "tracked_keyword_match",
"actions": [/* full action graph */],
"user_id": 18,
"author_handle": "@sarahg",
"install_count": 142,
"rating_sum": 32,
"rating_count": 8,
"average_rating": 4.0,
"is_public": true,
"created_at": "2026-04-08T10:00:00Z"
}
],
"total": 87,
"page": 1,
"pages": 5
}

Get one entry

GET /v1/workflows/marketplace/{marketplace_id}

Install

POST /v1/workflows/marketplace/{marketplace_id}/install

Creates a new workflow on the caller's account, paused by default (start paused so the caller can configure secrets / connection IDs / Slack webhooks before going live). Increments the marketplace entry's install_count. Counts against the caller's plan-tier workflow quota.

Rate

POST /v1/workflows/marketplace/{marketplace_id}/rate
{ "rating": 5, "review": "Worked out of the box." }

1-5 stars. Re-rating overwrites the prior rating and adjusts rating_sum accordingly.

Publish your own

POST /v1/workflows/{workflow_id}/publish

Publish a workflow you own to the marketplace.

Body FieldDescription
nameDisplay name in the marketplace. Must be unique per author.
descriptionDefaults to the workflow's own description.
categoryPick from the list above.
tagsFree-form array (used for search).
difficultybeginner / intermediate / advanced.

Returns 400 if you've already published an entry with the same name. To remove an entry: DELETE /v1/workflows/marketplace/{id}.


Versioning

Every PUT /v1/workflows/{id} snapshots the previous state. Use these endpoints to inspect or roll back.

List versions

GET /v1/workflows/{workflow_id}/versions
{
"versions": [
{"id": 88, "version_number": 12, "change_summary": "Updated actions", "created_at": "2026-05-04T08:22:18Z"},
{"id": 87, "version_number": 11, "change_summary": "Updated trigger, conditions", "created_at": "2026-05-03T11:00:00Z"}
]
}

Last 50 versions returned, newest first. The change_summary is auto-generated from which fields the diff touched.

Get a snapshot

GET /v1/workflows/{workflow_id}/versions/{version_id}

Returns the full snapshot — name, description, trigger_type, trigger_config, conditions, actions, execution_limits, is_active — exactly as the workflow looked at that version.

Rollback

POST /v1/workflows/{workflow_id}/versions/{version_id}/rollback

Restores the workflow to that version's state. Creates a new version row labelled "Rolled back to vN" so the rollback itself is auditable. Returns the workflow in its restored state.


Workflow Analytics

Cross-workflow analytics for the caller's account: total runs, success rate, daily breakdown, top workflows by execution volume, per-action-type success rates.

Endpoint

GET /v1/workflows/analytics?days=30

days accepts 1-90, default 30.

Response

{
"total_workflows": 12,
"active_workflows": 8,
"total_runs": 1842,
"runs_by_status": { "success": 1701, "error": 102, "partial": 39 },
"runs_by_day": [
{"date": "2026-04-06", "count": 41},
{"date": "2026-04-07", "count": 58}
],
"top_workflows": [
{"id": 17, "name": "Hot fintech to Slack", "runs": 412, "is_active": true}
],
"action_success_rates": {
"http_request": {"total": 1604, "success": 1572, "error": 32, "success_rate": 98.0},
"enroll_in_sequence": {"total": 198, "success": 196, "error": 2, "success_rate": 99.0},
"ai_extract": {"total": 412, "success": 401, "error": 11, "success_rate": 97.3}
},
"avg_duration_seconds": 4.8
}

action_success_rates is the most actionable field — sort descending by error rate to find which action types are flaking. Spike in http_request errors? Probably an external endpoint changed. Spike in ai_extract errors? Probably your BYOK key has rate-limit issues.


Notes

  • Templates id strings are stable — store them, not the human-readable name. Names occasionally change for clarity.
  • Marketplace publishing is open by default; spam moderation happens out of band. If you find an entry that looks like spam, contact support@crondb.com with the marketplace ID.
  • Marketplace installs always start paused. The reason: most templates expect you to wire up a Slack webhook URL or connection ID before they'd actually work. Better to start paused than fire a half-configured run.
  • Version snapshots only capture the workflow definition, not the execution history. Rolling back doesn't undo past runs.

Next Steps