crewly 1.20.447 → 1.20.449
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/skills/agent/checkup-analyse/SKILL.md +99 -0
- package/config/skills/agent/checkup-analyse/analyse.mjs +603 -0
- package/config/skills/agent/checkup-analyse/execute.sh +34 -0
- package/config/skills/agent/checkup-analyse/execute.test.sh +126 -0
- package/config/skills/agent/ingest-exports/SKILL.md +97 -0
- package/config/skills/agent/ingest-exports/execute.sh +35 -0
- package/config/skills/agent/ingest-exports/execute.test.sh +82 -0
- package/config/skills/agent/ingest-exports/fixtures/jackrabbit-enrollments.csv +4 -0
- package/config/skills/agent/ingest-exports/fixtures/jotform-submissions.csv +4 -0
- package/config/skills/agent/ingest-exports/fixtures/mailchimp-audience.csv +3 -0
- package/config/skills/agent/ingest-exports/fixtures/quickbooks-invoices.csv +4 -0
- package/config/skills/agent/ingest-exports/fixtures/square-customers.csv +4 -0
- package/config/skills/agent/ingest-exports/fixtures/square-transactions.csv +5 -0
- package/config/skills/agent/ingest-exports/fixtures/unknown-report.csv +4 -0
- package/config/skills/agent/ingest-exports/ingest.mjs +368 -0
- package/dist/backend/build-info.json +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Check-up Analysis
|
|
3
|
+
description: The analysis step of the small-business check-up. Reads what ingest-exports wrote, links the same person across every file, follows inquiry → sign-up → payment → repeat and lists where it breaks (unanswered inquiries, sign-ups with no payment, payments from nobody on the roster, drop-outs, lapsed customers, overdue invoices, double entry, customers missing from the mailing list), each with an hours/week and $/month estimate whose formula is shown. Writes breaks.json and report.md.
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
category: analysis
|
|
6
|
+
skillType: claude-skill
|
|
7
|
+
assignableRoles:
|
|
8
|
+
- "*"
|
|
9
|
+
triggers:
|
|
10
|
+
- check-up analysis
|
|
11
|
+
- analyse check-up
|
|
12
|
+
- find the breaks
|
|
13
|
+
- where does the business leak
|
|
14
|
+
- checkup report
|
|
15
|
+
- top 3 breaks
|
|
16
|
+
tags:
|
|
17
|
+
- check-up
|
|
18
|
+
- small-business
|
|
19
|
+
- analysis
|
|
20
|
+
- report
|
|
21
|
+
execution:
|
|
22
|
+
type: script
|
|
23
|
+
script:
|
|
24
|
+
file: execute.sh
|
|
25
|
+
interpreter: bash
|
|
26
|
+
timeoutMs: 120000
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
# Check-up Analysis
|
|
30
|
+
|
|
31
|
+
Step 3 of the small-business check-up (crewly#1062). After `ingest-exports`
|
|
32
|
+
has turned the owner's CSV exports into one schema, this skill reads that
|
|
33
|
+
folder and says where the chain **inquiry → sign-up → payment → repeat**
|
|
34
|
+
breaks between the apps, and what each break costs.
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
bash execute.sh --in "$CREWLY_HOME/checkup/<customer>/ingest" --out "$CREWLY_HOME/checkup/<customer>/analysis"
|
|
38
|
+
bash execute.sh --in …/ingest --as-of 2026-10-31 --assume hourlyValue=40 --assume lapsedDays=60
|
|
39
|
+
bash execute.sh '{"in":"…/ingest","out":"…/analysis","asOf":"2026-10-31","assume":{"winBackRate":0.1}}'
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
`--in` is the `--out` folder of `ingest-exports` (or single `<file>.json`
|
|
43
|
+
files from it). `--as-of` defaults to the last dated activity in the data;
|
|
44
|
+
pass today's date when the exports are fresh so overdue and lapsed are
|
|
45
|
+
measured against now.
|
|
46
|
+
|
|
47
|
+
## The breaks
|
|
48
|
+
|
|
49
|
+
| type | what it means |
|
|
50
|
+
|---|---|
|
|
51
|
+
| `inquiry_no_follow_through` | a form submission (Jotform) from someone with no sign-up and no payment at any time |
|
|
52
|
+
| `signed_up_unpaid` | a sign-up (Jackrabbit, Mindbody, Calendly) with no payment from that person on or after it (7-day grace before) |
|
|
53
|
+
| `paid_not_listed` | a payment from someone on no roster (only checked when a roster export is present) |
|
|
54
|
+
| `dropped` | a sign-up marked dropped / cancelled |
|
|
55
|
+
| `lapsed` | a customer with no activity for `lapsedDays` (90) before as-of |
|
|
56
|
+
| `overdue_invoices` | an invoice with a balance whose due date is before as-of |
|
|
57
|
+
| `double_entry` | the same person (by email, then phone) in two or more systems; notes a phone missing in one or differing names on contact rows |
|
|
58
|
+
| `not_on_mailing_list` | a paying or signed-up customer the mailing list (Mailchimp) does not have (only when a list export is present) |
|
|
59
|
+
|
|
60
|
+
People are linked by email first, then phone, then name when a row has
|
|
61
|
+
neither. Hashed exports (`ingest-exports --hash-names`) link the same way,
|
|
62
|
+
so the counts are identical and no name appears in the output.
|
|
63
|
+
|
|
64
|
+
## Estimates
|
|
65
|
+
|
|
66
|
+
Every break carries `estimate: { hoursPerWeek, dollarsPerMonth, formula,
|
|
67
|
+
isEstimate: true }`. The formula is written out with the numbers used, e.g.
|
|
68
|
+
`$180 in unpaid fees ÷ 1 months = $180/month; 1 × 10 min ÷ 3.3 weeks = 0.1
|
|
69
|
+
h/week`. The inputs are assumptions the owner can change with
|
|
70
|
+
`--assume key=value`:
|
|
71
|
+
|
|
72
|
+
- `hourlyValue` 30 — what an hour of the owner's or staff's time is worth
|
|
73
|
+
- `minutesPerManualEntry` 4, `minutesPerFollowUp` 10
|
|
74
|
+
- `inquiryConversionRate` 0.3, `winBackRate` 0.2, `listReachRate` 0.1
|
|
75
|
+
- `lapsedDays` 90
|
|
76
|
+
- `avgCustomerValue` — default: the mean paid amount / sign-up fee in the data
|
|
77
|
+
|
|
78
|
+
Hours and dollars are spread over the period the data covers (first activity
|
|
79
|
+
to as-of), so a one-off $180 over one month reads as $180/month.
|
|
80
|
+
|
|
81
|
+
## What comes out
|
|
82
|
+
|
|
83
|
+
One JSON line (per-break count and estimate, `top3`, `totals`, `notes` for
|
|
84
|
+
checks the data could not support) and, with `--out`:
|
|
85
|
+
|
|
86
|
+
- `breaks.json` — everything, including every item (person label, dates,
|
|
87
|
+
amounts, systems, conflicts) and the assumptions used
|
|
88
|
+
- `report.md` — the owner-facing text: top 3 breaks with count, estimate,
|
|
89
|
+
formula and what an agent could do for each, then every break, the files,
|
|
90
|
+
and the assumptions
|
|
91
|
+
|
|
92
|
+
## Report back
|
|
93
|
+
|
|
94
|
+
Give the owner the top 3 in plain words with the count and the estimate, and
|
|
95
|
+
say that the dollars are estimates from the assumptions listed. Name people
|
|
96
|
+
only when the owner needs to act on them and the exports were not hashed;
|
|
97
|
+
otherwise report counts. Do not paste `breaks.json`. If `notes` says a check
|
|
98
|
+
could not run (no roster export, no mailing-list export), say which export
|
|
99
|
+
would make it possible.
|