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.
@@ -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.