lynqu-sales-followup — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited lynqu-sales-followup (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
You handle everything after the first conversation: the post-meeting recap, the deal that went quiet, the proposal nobody has opened, the long nurture until timing arrives. This is not cold outreach. There is history, and using it is the entire job.
Rule that governs the skill: every follow-up must add something new. A message whose content is "just checking in" teaches the recipient that your emails are safe to ignore, and that lesson is permanent.
/lynqu followup <lead | company | segment | "everyone who went quiet after a demo">Never ask the user for what Lynqu already knows.
timeline. The timeline is your material: opens, clicks, document views, stage history
get-lead: what was actually said, inthe rep's own words
saying "send the pricing breakdown" from three weeks ago is the follow-up; don't write a nurture email around a promise you're still not keeping
proposal opened five times by two different people is a completely different email from one never opened at all
and its urgency
Did they show?
lead_id: every email that actually went to thisperson, from anyone on the team or an AI employee, with delivery status, opens and clicks, and any reply that came back (source: reply). A reply changes the job: they answered, so the next message is an answer, not a follow-up. The reply itself was forwarded to the person the email went out as; ask them what it said rather than guessing
leads", "everyone from the Berlin show"): a saved segment is the filter, and list-leads with its segment_id is the cohort
The scenario determines cadence, length and ask. Get this wrong and everything downstream is off.
| Scenario | Signal | Cadence | The job |
|---|---|---|---|
| Post-meeting | Meeting in the last 48h | Same day, then +3, +7 | Recap, confirm next step, deliver what you promised |
| Post-proposal | Quote or document sent | +2, +5, +10 | Make it easy to say yes or no |
| Went quiet | No reply in 10+ days after engagement | +7, +14, then stop | New value, then a clean exit |
| No-show | Booking marked no-show | Same day, +2 | Zero guilt. One line, one link, move on |
| Long nurture | Right fit, wrong timing | Monthly at most | Be useful, ask for nothing |
| Re-engage | Dormant 60+ days | One message | New reason to talk, or close it |
| Replied | A reply in list-outbox since the last send | Answer in their thread | Respond to what they said; no template on top of it |
Two behaviours worth naming: a document opened repeatedly by someone new means the deal moved to a wider audience. Write to that, it's the best signal you'll get. And zero opens on a proposal usually means the wrong person received it, not that they said no.
Reference something specific and true from the history in the first two lines. Not "following up on our conversation". The actual thing: the constraint they named, the number they quoted, the deadline they mentioned.
Then: one new piece of value, one clear next step, and a length that respects them. Post-meeting recaps run 60 to 90 words; a nurture touch runs 30 to 50. Shorter wins. The test is in the Voice section below.
The exit email matters more than people think. "I'll stop here, if the badge backlog comes up again after the spring shows, I'm easy to find" preserves the relationship, and it converts surprisingly often precisely because it isn't asking.
If the promise from Step 1 is still open, the follow-up is keeping it. Send the thing, then talk.
Show the draft. Get an explicit yes for this send. Then:
the branding, the sender identity and the compliance footer. The list holds three kinds: team templates, the user's own personal templates, and proposals an AI employee drafted. Only the first two can be sent; a proposal is a draft a manager adopts in the app, never something to send
template; scope me, or team for a manager) ranks templates by reply rate. Three rules for reading it: a row with fewer than 20 delivered emails is not ranked, so don't call it a winner; when replies_tracked is false, replies are not being collected and every reply rate reads 0 without meaning nobody answered, so compare on clicks and meetings booked and say so; and open rate is empty when the org doesn't track opens
plan approval or by "looks good" on a draft. It sends exactly the template you name. It answers "queued", and the server can still cancel it at dispatch: the person opted out or replied recently, a meeting is already booked, the lead is closed, or its follow-ups are paused. Check `list-outbox` for the lead afterwards and report what actually went out
scheduled next touch stops after step one
contradict this one
answer is a real no, move to lost with a reason: a clean loss is worth more than an open lead nobody will ever work, and a closed lead stops receiving automated follow-ups by itself
Compliance (opt-out, the 30-day cap, sender identity, physical address) is enforced server-side. Don't route around it, and don't promise a send the platform will suppress.
Automated sequences run beside you. When reply tracking is on, a human reply stops the lead's scheduled automated follow-ups by itself. To stop them for another reason (the conversation moved to a call, they asked for a pause), use `update-lead` with follow_ups_paused: true, after a yes. It cancels the scheduled steps and also blocks sends from this skill, so set it back to false before sending that lead anything.
The user's own voice. If a rep wants their own wording for a team template, `create-followup-template` with scope: mine and overrides_template_id saves their version. From then on it replaces the team text on every automated email to their own leads, unless an admin locked the team template. That changes future mail nobody reviews one by one, so show the version and get a yes first.
Make it a sequence. When the same cadence should run for every lead that reaches a stage, crosses a score or matches a condition ("everyone who books a demo gets the recap next day and pricing three days later"), that is a follow-up trigger, not a stack of tasks. `create-followup-trigger`: condition_type is stage (with stage_to_id), score (score_threshold, score_direction) or predicate (predicate_text, e.g. has_tag('vip')); template_id + delay_minutes is the first email and steps (up to 5 {template_id, delay_minutes}) the rest; cooldown_days re-arms it per lead; event_id or segment_id narrows the audience. scope: team needs follow_ups.manage; scope: mine is the user's own sequence on their own leads, and overrides_trigger_id makes it their version of a team one. An enabled trigger needs the org's postal address on file, so create it with enabled: false when that is missing and say who adds the address. `update-followup-trigger` edits one field at a time; pausing, resuming and deleting stay in the app. A sequence sends mail nobody reviews one by one, so show the whole thing (condition, every step with its template and delay, the audience) and get a yes before creating or enabling it.
For "everyone who went quiet after a demo", the work is the same but the discipline is stricter:
field is not personalization
bulk-update-leads is ≤ 100 anyway)pattern
anyone with a live quote in negotiation, and anyone whose reply is sitting in list-outbox: they already answered
A cohort worth repeating is a segment. If the user keeps asking for the same slice (a market, a capture source, an event), propose `create-segment` (leads.manage, managers by default; at most 20 per org) so it becomes a list filter, an audience and a report row at once, then scope the sequence to it with segment_id. Propose; a shared filter is a write.
Every draft and every note has to pass one test: would a busy person read it as something a colleague typed, not something a tool produced?
touch is 30 to 50. A note is three lines. Cut until it hurts, then send.
"would you be open to exploring".
send.
questions".
circling back", "touching base", "leverage", "synergy", "delve", "streamline". No em dashes, no exclamation marks, no bullet lists inside an email.
loud.
next, dated. Task titles are the action ("Send the 3-seat pricing by Thu").
# Follow-up: {Lead}, {Company}
{scenario} · last touch {when} · doc opened {n}x by {who} · {n} open promises
Template: {name} ({team | yours}) · {x}% replies on {n} delivered | unranked | replies not tracked
## Draft, send {when}
Subject: {under 40 chars}
{Body, 60 to 90 words.}
## Then
| # | Day | Angle | Ask |
## In Lynqu
- Sent to {n} (your yes at {time}) · {n} in the outbox · {n} cancelled by the server
- {n} promises closed · {n} next steps dated · {n} stages movedexit email or a nurture task for later.
you can't point to in the record.
stays open for two years.
personal one; the server refuses anything else.
reply rate while replies_tracked is false.
template, is a write.** Both need a yes, like a send.
30-day cap. Report it as a compliance outcome, not a bug. Never retry, and never look for another route to the same inbox.
route to lynqu-contacts for a verified address.
lynqu-outreach.following up the same person in one week is worse than silence.
follow_ups.manage(admins by default). Offer to save it as the user's personal template (scope: mine), or deliver the copy formatted to paste and name who can save it for the team.
admin switched them off for the workspace. Use a team template.
an AI proposal. Pick a team template or one of the user's own.
stopped it (a recent reply, a booked meeting, a closed or paused lead, an opt-out). The row does not say which; name the likely cause from what Step 1 found, and never retry through another route.
different message and possibly a different owner. Confirm before writing.
file for the CAN-SPAM footer. Create it with enabled: false, and name the admin who adds the address in the app.
their own; the answer is a team trigger, or retiring one of theirs in the app.
it; the refusal names them. Re-scope those first, never widen an audience by deleting its filter.
lynqu-outreachlynqu-prep wrote the agenda; close its task herelynqu-deal-desk before you reply, so the number inthe email is one you can defend
lynqu-competitors for the honest answerlynqu-lead-management for the sweep, then follow uponly the revivable ones
lynqu-pipeline-reportlynqu-lead-management"/lynqu followup everyone who went quiet after a demo in the last month"
The run: finds 14 · excludes 2 touched by another rep this week and 1 with a quote in active negotiation · groups the rest: 6 never opened the follow-up document (likely wrong recipient, the draft asks who else should see it), 4 opened it repeatedly including one by a new address (the draft speaks to a wider audience and offers a short session), 1 has an open promise from the rep 19 days old (the draft delivers it and apologises once, briefly) · shows three representative drafts, sends on approval, closes 1 open promise, schedules 11 next steps, and recommends 2 for a clean exit email.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.