FixSaySkip

How the FoxPlug brain decides

Each time you press Build the brief, FoxPlug reads the tools you connected, stores what it found, and writes one thing to fix, one to say and one to skip. This page lists every signal it reads and the rules that turn a signal into a suggestion. It describes what the code does and nothing more.

Nothing here posts, emails or changes anything on its own. You press every button.

1Every signal it reads

Grouped by source. A source only counts once you connect it, and the brief says what it checked so an empty line is never a mystery. When a source is not connected, the brief adds one line saying what connecting it would unlock.

Payments

StripeLemon SqueezyPaddlePolarGumroadRevenueCatPatreon
  • Failed payments. Subscriptions past due and the monthly amount at risk. This becomes the fix line: fix it before you post.
  • Revenue milestones. Compared with the last stored number at least a day old. Crossing $100, $500, $1,000, $2,500, $5,000, $10,000, $25,000 or $50,000 a month becomes a say line.
  • New paying customers in the last 30 days, including your first one.
  • A first customer from a new country, when no earlier customer came from there.
  • Revenue rescue. Cards about to expire, and failed payments that need the customer to act. Payments that failed for lack of funds are left to Stripe's own retries, so no message yet. Payments the bank refused without a reason or flagged as fraud are marked do not chase.
  • Saving customers. People still paying who are set to leave or downgrade. The money panel counts those whose period ends within 7 days.
  • Win-back. Cancellations of the last 180 days. People who left 45 to 90 days ago are marked as the best time to write. Anyone on your do-not-contact list is left out, including people who unsubscribed.
  • Why they left. For cancellations of the last 30 days, one plain line built from facts only, never a guessed reason.
  • Patreon patron counts and newest patrons become updates, the way Stripe's do.
  • Lemon Squeezy, Paddle, Polar, Gumroad and RevenueCat give the brief the same numbers as Stripe: active subscribers, monthly revenue, new and cancelled in 30 days. The first paying customer, then 10, 50 and 100 subscribers, become say lines. Lemon Squeezy, Paddle and Polar also report past-due subscriptions, which become the fix line. Gumroad has no subscriber price list, so its monthly revenue is the subscription charges of the last 30 days and the brief says so. RevenueCat gives revenue and active subscriptions only, with no new or cancelled split. Card expiry, saving customers and win-back need each customer's details, so they stay Stripe only.

Code and shipping

GitHubGitLabBitbucketLinearyour AI coding toolyour own log
  • Activity from these tools becomes updates. Every update gets a score, a story type and a one-line why it matters.
  • Shipped but never announced. If you shipped at least 2 things in the last 30 days and at least 2 of them have no approved or posted update, the brief picks the highest scoring one as the say line.
  • Not worth a post. At least 2 dependency bumps, migrations or refactors among your last 14 days of changes (matched by their names), or at least 2 changes marked internal, becomes the skip line.
  • Requests people left. Issues on your GitHub repositories with a request label or request wording, and the people who added a plus one, are matched to what you shipped. This becomes a say line: shipped, N people asked for it, tell them.

Deploys

VercelNetlifySupabase
  • Each deploy becomes an update and a marker in time. Visits and errors are compared before and after it.
  • Supabase edge-function deploys and shipped database migrations become updates the same way.

Errors

Sentry
  • For each deploy from 12 hours to 5 days ago, FoxPlug counts errors in the window before and the same window after (up to 48 hours).
  • It raises a fix line only when the errors after are at least 30 and at least 3 times the errors before (before counted as at least 10). If several deploys qualify, the worst ratio wins.

Traffic

CloudflarePlausiblePostHogGoogle AnalyticsFirebaseFathomUmamiMatomoSimple AnalyticsVercel Web Analytics
  • Any connected tool that stores a daily series counts.
  • Matomo, Simple Analytics and Vercel Web Analytics are read into the same shape as the others, so the same rules below apply to them. Where one has no figure (Simple Analytics and Vercel give no session length or bounce rate) that field stays empty rather than zero, and no rule uses it.
  • Visits down after a deploy. Looks at a deploy made 2 to 6 days ago. Needs at least 3 days of data before it, at least 2 full days after, and at least 10 visits a day before. A drop of 30 percent or more becomes a fix line.
  • A referrer worth thanking. At least 15 visits in the later half of the window, and at least 3 times what it sent in the earlier half. This becomes a say line.

Friction

PostHogClarity
  • Rage clicks and dead clicks. PostHog gives the page, the clicked element's text and the number of sessions. Clarity gives the page.
  • Used only when the read is from the last 8 days. It is matched to a deploy or commit made from 3 days before to 1 day after the problem first appeared. It becomes a fix line.

Closed work (issues and tasks)

GitHub IssuesJiraClickUp
  • A closed feature becomes a say line: "Shipped: Dark mode". A feature with 2 or more thumbs-up on GitHub says "Shipped what 5 people asked for: Dark mode", the same line the request boards give.
  • A closed bug becomes "Fixed: ..." and is kept for the changelog. It is not a post, and a bug-only week adds to the Skip line.
  • Other closed work shows as "Closed: ..." and is scored like any update.
  • What counts as a bug or a feature: the issue type (Jira) or the labels and tags (GitHub, ClickUp). A bug label wins over a feature label. GitHub issues closed as not planned are ignored, and so are pull requests.
  • GitHub Issues use the GitHub connection you already have. Public repositories work as they are; private ones need the token to allow Issues read-only. Reporter, assignee and comments are never read. Sprints and releases are not read.

Where you build (GitHub Actions, AI coding tools, Framer, Webflow, Lovable, v0, Bolt, Base44, Replit)

GitHub ActionsClaude CodeCodexCursorFramerWebflowLovablev0BoltBase44Replit
  • GitHub Actions. Fix first: the main branch has been red for 3 or more days, the first card in your Today brief. Post: builds on the main branch got 40 percent faster or more (one workflow compared week on week), once per repository per week. Read only, when you press Read my builds.
  • AI coding tools (Claude Code, Codex, Grok Build, Cursor, Gemini CLI, Cline, Kiro). What your tool logs becomes an update and is scored like any other. An update marked not for users is kept as an internal note and counts toward not worth a post. Nothing is posted by the tool.
  • Framer and Webflow. A page that went live, or a CMS item that was published, is an update; a copy tweak (an edited page or edited item) is skipped. Framer is compared between two reads (pages pending last time and published now). Webflow also sends live events, checked by a signature; page metadata and edited-item events are logged and ignored.
  • Lovable and v0 give one update per project or chat edited since your last read (titles and times only, never prompts or code). Bolt, Base44 and Replit save to GitHub, so their changes arrive through your GitHub connection.

Work tools

NotionAsanaTrello
  • Events from these tools become updates and are scored like any other.
  • They do not give FoxPlug the identity of a person who asked for something, so they are not read for requests. They are not part of the shipped but never announced count, which reads code, deploy, Linear, manual and AI coding tool entries.

What your users ask for

CannyFeaturebaseIntercomHelp ScoutGetFoxChat
  • Shipped what people asked for. A request you marked complete in Canny or Featurebase in the last 60 days, with at least one vote, becomes a say line: "Shipped what 14 people asked for: Dark mode". Two or more in the same stretch also give one total line.
  • Looks like you shipped it. An open request with at least 2 votes (3 conversations for Intercom and Help Scout) whose words match something you shipped in the last 30 days becomes a say line that says "looks like" and asks you to mark it complete in that tool. Matching is by words in the titles, so check it before you post.
  • Intercom and Help Scout are read for tags and topics only, counted over 30 days. A tag used on at least 2 conversations counts as a request with that many votes. Message text, names and emails are never read.
  • GetFoxChat pushes topics to you: once a day it counts what visitors asked for or complained about on your site and sends the topic and the number of conversations, nothing else. It is treated like an Intercom tag: 3 or more conversations is a request with that many votes, and when something you shipped matches it you get the same "looks like you shipped it" line.
  • Nobody is written to. FoxPlug keeps titles and counts, not who asked, so it cannot email the people who voted. It gives you the post; telling the voters is yours to do in the tool.

Your newsletter

Kitbeehiiv
  • Subscriber milestones. The highest round number your list has passed (100, 250, 500, 1,000, 2,500, 5,000, 10,000, 25,000) becomes a say line: "Your newsletter passed 1,000 subscribers". A list that connects at 5,000 says 5,000, not 100.
  • Open and click rate are shown on the Newsletter card and used as the reason on that line. They are not scored on their own.
  • This week's issue. The newsletter maker already builds an issue from your published updates; you read it, put it in your tool as a draft, and send it yourself. FoxPlug never sends it.
  • Counts only. No subscriber, address or message is read. Loops is not read: its API has no subscriber count.

Your community

DiscordSlack
  • Member milestones (Discord). The highest round number your server has passed (50, 100, 250, 500, 1,000, 2,500, 5,000, 10,000) becomes a say line: "Your Discord passed 500 members". A server that connects at 800 says 500, not 50.
  • Your own announcements. The latest messages you wrote in the up to 3 channels you pick are shown on the Community card, so you can see what is already announced before you post. Other bots, system lines and other people's messages are skipped.
  • Already announced. When the biggest update you have not posted about matches something you wrote in your Discord or Slack in the last 14 days (it has to say at least two of the update's words and half of them), the "You shipped N things" line starts with "Already announced in Discord on Nov 09. Post it where you have not yet (X, LinkedIn), not in Discord again." The update stays on the list; only the duplicate in the same community is dropped. Matching is by words, so check it.
  • Slack has no member count. That needs permission to list every person in the workspace, which FoxPlug does not ask for, so Slack gives announcements only.
  • FoxPlug never posts, reacts or edits in either place, and keeps no member's name or message. Disconnecting makes the Discord bot leave your server and revokes the Slack access.

Your Product Hunt launch

Product Hunt
  • Only your own launch. You paste your own developer token and the address of your own launch. FoxPlug reads that one launch, only when you press Check for what's new, never more than once every 10 minutes or 6 times a day, and never writes to Product Hunt. It does not look at anyone else's launch.
  • Reply to new comments (fix first): comments that arrived since your last read, on a launch from the last 7 days. The first hours decide how the day goes.
  • Thank your supporters (say): from 25 upvotes, a short thank-you post is suggested.
  • Your launch is climbing (say): at least 10 new upvotes and 20% more since your last read becomes a nudge to post where your visitors come from.
  • Shown to you only. The numbers are marked "Source: Product Hunt" with a link to your launch, and they are kept on your own connection: never published, shared, exported or used on any public page.

Where it runs

RenderCloudflare Pages and WorkersRailway
  • A deploy that is failing. A service whose newest finished deploy failed in the last 7 days becomes the fix line: "Your api deploy is failing on Render. Fix this first." It names how many failed in a row and since when. A deploy that is still building, or that you cancelled, is not a failure. A later good deploy clears the line.
  • A clean deploy becomes an update, the way Vercel and Netlify deploys do.
  • A new service or project (made in the last 14 days) can be a post, and so can its domain while the service is new. An old domain is never announced, because no host says when a domain was added.
  • Environment variables, logs and DNS are never read.

Your own webhook (Zapier, Make, n8n, anything that can send a web request)

WebhookZapierMaken8n
  • Post: a shipped, launched or released event with user_facing true becomes an update. It is written when you press Check for what's new, and scored like any other.
  • Fix first: an event with error, failed, incident, outage or down in its name becomes the first card in the Today brief for three days. It is never posted.
  • Email your customers: an event named customer_notice or email_customers becomes an idea in the Today brief for a week. FoxPlug sends nothing for you.
  • Skip: user_facing false is kept as a private note and never posted. The event named test only checks your address and saves nothing.

Where your software is published

npmPyPIWordPress.orgChrome Web StoreApp StoreGoogle Play
  • Post: a new version becomes an update and a changelog entry. A download or install milestone (100, 500, 1,000, 5,000, 10,000 and so on) becomes an update, once per step.
  • Fix first: a new 1-star rating or review becomes the first card in the Today brief for three days.
  • Repost: a new 5-star rating or review becomes a repost idea in the Today brief for a week. It is never posted for you.
  • npm, PyPI, WordPress.org and the Chrome Web Store are read from public pages, so nothing secret is needed. The App Store and Google Play use your own read-only key. Where a store gives no public review list, new ratings are noticed by the count moving between two reads.

Search (Google Search Console, Bing Webmaster Tools)

Search ConsoleBing
  • Post: five or more searches your site now shows up for that it did not show up for in the 28 days before become an update, "ranking for N new searches". Needs at least 3 impressions each.
  • Write next: a page with 10 or more clicks that is up by half or more on the 28 days before becomes a card in the Today brief, "write the next post on that topic" (two weeks). It is never posted.
  • Read-only: Google sign-in asks only to view Search Console data; Bing uses your own API key. Nothing is read until you press Read my searches.

Uptime (UptimeRobot, Better Stack, Checkly)

UptimeRobotBetter StackCheckly
  • Fix first: a monitor that is down becomes the first card in the Today brief and stays there until the monitor reports it back up (or three days pass). It is never posted and nothing about it is upbeat.
  • Post, optionally: when an incident is over, one short honest update says how long it was down and that it is fixed. It is written only when you press Check for what's new, and you can skip it.
  • Post: a 30 or 90 day availability of 99, 99.5, 99.9, 99.95 or 99.99 percent becomes an update, once per month or quarter, only when the monitor is older than that window and nothing is down. The percentage is the figure the monitoring tool itself reports. FoxPlug never works one out.
  • Checkly gives no percentage through its API key, so for Checkly only down and back-up are used.

Your site and changelog

Your siteChangelog
  • When nothing is connected yet, the first brief is built from a read of your site itself.
  • Notes left by changelog readers who gave an email count as requests. A changelog entry can be limited to one plan, so a plan-only feature reaches only that plan's readers.

What it does not read

  • Signups of your own product are not read. The brief says so on its own lines.
  • Build pipeline runs are not a signal on their own. A pipeline or workflow change is treated as internal plumbing when an update is scored.

2How a post is chosen

Every update gets a score from 0 to 100. The score is computed from real signals, not guessed.

The score

  • A base for the kind of story: customer proof, shipped feature, technical lesson, founder story, metric milestone, or internal.
  • Plus the size of the change, read from the commit count in its title.
  • Plus a scan for user-facing words against internal-plumbing words, and a bump for words that mean major or breaking.
  • Then a small nudge of up to 15 points either way from reading the update. Quiet periods score low; nothing is manufactured.

What the score decides

  • Under 35: no post is written. The update is marked too small to post.
  • 35 and over: short posts, one per channel you ticked in Where you post.
  • 80 and over (or a customer or metric milestone at 55 and over): short posts now, plus an offer of a full write-up. The write-up is never made without your click.
  • Your tone setting moves the floor: conservative raises it by 12, loud lowers it by 12.
  • Updates about mentions, team news and your own site stay short posts; they are never offered a write-up.

Per-channel bars and limits

  • Each channel can be set to Off, Low (30), Medium (60) or High (78). A channel only gets a draft when the score clears its bar.
  • The same moment never drafts twice inside your dedupe window.
  • Launch stage can hold routine work. Building in public holds ordinary bug fixes for the weekly digest; stealth surfaces only real milestones.
  • On the Free plan the sixth update of a day is kept and held, and is written when you upgrade or press the button on a day with updates left.

Plan my week

  • Up to five actions ranked by fixed rules from the stored brief. No model is called, so it costs nothing and invents no number.
  • Base weights: fix 100, money at risk 90, people waiting 80, win-back 70, something to say 60, a number that moved 55, a decision due 50, why someone left 45.
  • Each carries its why and its source. Ticking one off nudges the kinds you really do a little higher next time.
Each brief line shows where its number came from and when it was pulled, for example Stripe, pulled Nov 09. If a source was not read, the line says that instead of guessing.

336 things that happen, and what the brain suggests

Every example below is a rule the code really has. Amounts are examples.

Fix first
13 subscriptions are past due, $87 a month at risk.Fix 3 customers' payments failed. Fix before you post.Why: money at risk beats announcing anything; the line links to the failed payments.
2You deployed on Tuesday. Visits averaged 120 a day before and 70 a day since.Fix Visits are down 42 percent since you deployed. Look before you post.Why: a drop of 30 percent or more, with enough days on both sides, is likely yours.
348 hours after a deploy there were 90 errors, against 12 in the 48 hours before.Fix Errors are 7.5x higher since you deployed. Fix before you post.Why: at least 30 errors and at least 3 times before. Say nothing until it is fixed.
4Several errors appear after two different deploys.Fix Only the deploy with the worst ratio is shown.Why: one clear thing to fix beats a list.
5Rage clicks on a pricing button started the day after a deploy.Fix The page, the button's text, the session count, and the deploy and commit it lines up with.Why: first seen from 3 days before to 1 day after a change points at it.
6Two cards expire this month.Email Revenue rescue: 2 customers to write to. A draft note is ready; you send it.Why: an expiring card needs the customer to act.
7A payment failed for lack of funds.Skip No message yet.Why: Stripe's automatic retries usually fix these.
8A payment was refused by the bank with no reason, or flagged as fraud.Skip Do not chase it.Why: a note cannot fix it.
9A customer is paying but set to cancel in 5 days.Email Saving customers: 1 still paying, leaving. A draft note is ready.Why: the period ends within 7 days, so there is still time.
Say it
10Revenue goes from $940 to $1,060 a month.Say You passed $1,000 a month. Tell people.Why: the number crossed a milestone since the last stored one.
11Your first subscription starts.Say Tell people about your first paying customer.Why: one new subscription and one active.
124 new paying customers in 30 days.Say Tell people: 4 new paying customers this month.Why: counted from Stripe.
13A subscription starts from Japan, and none ever did before.Say Your first customer from Japan. Tell people.Why: a new country in the last 30 days.
14One site sent 40 visits in the later half of the week and 8 in the earlier half.Say Thank that site: it sent 5x its earlier traffic.Why: at least 15 visits and at least 3 times before.
15You shipped a feature 3 people asked for on GitHub.Say Shipped it. 3 people asked for it. Tell them.Why: the requests are matched to what shipped.
16You shipped 6 things this month and announced none.Say The brief names the biggest one, with its score.Why: at least 2 shipped and at least 2 unannounced.
17You shipped a big win; 4 people who left over missing features might want it.Email Win back: 4 people to invite back. Draft notes ready.Why: people who asked for something like it get a feature note; people who left over price get a different one.
18Customers left 60 days ago.Email Marked as the best time to write.Why: 45 to 90 days after leaving is the window the rule uses.
19Two customers you wrote to came back.Say Won back: 2 customers, with the monthly amount.Why: their subscription started again.
20Someone cancelled and their last visit and errors can be found.Know Why they left: one plain line of facts.Why: facts only, never a guessed reason.
Skip it
213 dependency bumps in 14 days.Skip Not worth a post: 3 dependency bumps.Why: matched by name; 2 or more is enough.
222 database migrations.Skip Not worth a post: 2 migrations.Why: plumbing readers do not care about.
23A refactor, a rename and a lint fix.Skip Not worth a post: 3 refactors.Why: matched by name.
244 of your last 9 changes were marked internal.Skip Not worth a post: 4 of your last 9 changes are internal.Why: the scorer marked them not for posting.
25A quiet week with nothing new to announce.Skip Nothing to announce right now, with what was checked.Why: no filler posts.
26Nothing is broken.Fix Nothing to fix right now, listing what was checked.Why: an empty line says what it looked at.
27An update scores 28.Skip No post is written; it is marked too small.Why: under 35.
Post choices
28A new feature scores 82.Post Short posts for your ticked channels, and an offer of a full write-up.Why: 80 and over earns the offer. You choose.
29A customer validation scores 60.Post The write-up is offered too.Why: customer and metric stories earn it at 55.
30An update scores 70 and one channel is set to High.Post That channel gets no draft; the others do.Why: High needs 78.
31The same moment fires twice.Post One draft, not two.Why: deduped on the moment's own identity.
32It is the sixth update of the day on Free.Post Kept and held, written on upgrade or when you press the button.Why: the plan's daily limit counts updates.
33You set the tone to conservative.Post The floor moves from 35 to 47, so fewer things surface.Why: conservative adds 12.
34A feature is only for one plan.Post The changelog entry shows to that plan's readers only.Why: entries can be limited by plan.
35Stripe is not connected.Setup Connect Stripe to unlock failed payments, new customers, new countries and revenue milestones.Why: the brief says what is missing.
36Nothing is connected at all.Setup The first brief is built from a read of your site itself.Why: so there is something real on day one.

4What it never does

  • It never posts on its own. Every post goes out because you pressed a button. Nothing posts itself.
  • It never sends a note on its own. Rescue, saving and win-back notes are drafts. A note goes out only when you press Send, from your own email.
  • It never writes to people on your do-not-contact list, which includes people who unsubscribed.
  • It never makes up a number or a reason. A line with nothing behind it says so. Reasons for leaving are facts from your tools, never a guess.
  • It never changes anything in Stripe, GitHub or your other tools. Reads are read-only.
  • It never fetches in the background for someone who is not looking. It reads when you press Build the brief or Check for what's new.
  • Your shared brief stays safe. The share card carries only short lines that pass a safety check; a line that does not pass is left off.

5Questions

How often does the brain run?

Only when you press Build the brief, Update the brief, or Check for what's new. There is no background timer for your project.

Why does it say nothing to fix?

Because none of the fix rules fired. The line lists what it checked, for example Stripe failed payments and site visits before and after your last deploy.

Why did it skip something I shipped?

Either the update scored under 35, the name looked like a dependency bump, migration or refactor, or it was marked internal. You can bump any update to a post yourself and your choice wins.

Can I make it stop suggesting something?

Yes. Turn a suggestion down and FoxPlug can learn it as a rule. The rules are listed under How I work, where you can turn any of them off or delete it.

Does it learn from me?

Approving or turning down a suggestion changes what it ranks. Plan my week ranks the kinds of action you really do a little higher.

What does it cost to run?

The brief and Plan my week run on fixed rules with no model call. Reading an update to score it and draft posts does use one. See the pricing page for plans.

Which tools can I connect?

The tools named in section 1. Each one is read only, and you can disconnect it at any time.

Where can I see it working?

Our own brief, zeros included, is at foxplug.com/proof.

This page describes how FoxPlug works today. Questions: support. Open the app.