Projects — Scheduled & Continuous AI Work
A Project is a container for recurring or one-off AI work. Each time the schedule fires (or you trigger manually), FleetQ creates a ProjectRun — a timestamped execution with its own budget, status, and artifact history.
Scenario: A SaaS startup runs a daily "Churn Risk Scanner" project that analyses CRM usage data, identifies accounts that haven't logged in for 14 days, drafts personalised win-back emails, and delivers them to the CS team Slack channel.
Project types
One-Shot
Runs once on activation. Perfect for long-running data processing tasks, one-time migrations, or experiments you want to track as a project with milestones.
Continuous
Runs on a schedule — hourly, daily, weekly, or custom cron. Each run is independent. Use for monitoring, digests, lead qualification, and any repeating AI workflow.
Schedule frequencies
Cron expressions support standard 5-field syntax: 0 8 * * 1 = every Monday at 08:00.
The scheduler resolves due projects every minute — sub-minute scheduling is not supported.
Overlap policies
What happens if a previous run is still active when the next schedule fires:
| Policy | Behaviour |
|---|---|
| skip | Skip the new run. The in-progress run finishes undisturbed. |
| queue | Queue the new run. Starts as soon as the previous run completes. |
| allow | Allow concurrent runs. Both the in-progress and new run execute simultaneously. |
Milestones
Attach business milestones to a project — e.g. "Process 1,000 leads" or "Generate 50 blog posts". Track progress on the project detail page. Milestones generate notifications when reached.
Budget per project
Set a spending cap on each project. When the total spend across all runs approaches the limit:
- At 80%: notification sent to project owner
- At 100%: new runs are blocked until budget is increased
Projects also inherit the team-level budget. If either budget is exhausted, runs are blocked.
Trigger a run manually
curl -X POST https://fleetq.169.58.89.204.sslip.io/api/v1/projects/PROJECT_ID/trigger \
-H "Authorization: Bearer YOUR_TOKEN"