App and credentials
Install the dedicated FM Onboarding app with bot name FM Bot in the support workspace. The checked-in template isscripts/onboarding/slack-app-manifest.json. Replace its deployment URL with the
approved Convex HTTP URL ending in /slack/onboarding-events. Do not point the new
app at the internal staff Slack receiver.
The app creates private channels, reads their membership and messages, invites
workspace members and posts the welcome. It reads workspace user profiles and
email addresses to match the verified onboarding contact. Its scopes are
groups:read, groups:write, groups:history, users:read,
users:read.email and chat:write. It does not request workspace administration,
public-channel history or workspace email-invitation permissions. See Slack’s
channel creation
and channel invitation
documentation.
Slack’s workspace permissions must also allow Members → Create private
channels under Roles & permissions → Account types. Bot scopes alone do
not override an admins-only setting; Slack returns restricted_action when
creation is blocked. Enabling this permission also lets full-member Operators
create their own private channels, so obtain workspace-owner approval first.
It does not grant access to existing private support channels.
Enter credentials directly in the approved environment settings. Never put tokens,
signing secrets or shared invitation URLs in Git, screenshots or chat.
After product-account linking, the Onboarding & Setup Labs feature must also allow writes for that Location. Before an account exists, the payment flow uses the verified Operations enrollment described below.
Existing support-agent reply and AI policy gates stay in force; installing this
app does not enable automatic AI replies or retention communications.
The shared staff roster is required in every provisioned customer channel. To preserve
an existing teammate’s access to only one channel, use a channel-specific entry instead
of adding them to the shared roster:
team_join, user_change, member_joined_channel,
member_left_channel and message.groups. The dedicated endpoint checks both
workspace and app IDs after signature verification. Membership events trigger
fresh API reads; event order does not decide access. A bounded five-minute sweep
retries unfinished setup after five minutes and checks connected accounts every
30 minutes for missed membership events. Larger queues take multiple passes.
Workspace invitations
Free Slack does not offer the Enterprise invitation API. Staff can email an invitation from Slack, or publish a shared invitation in Admin → Settings → Onboarding. The Operator’s Join the Slack workspace button reads the current approved link when clicked, including on a page opened before the link was replaced. A shared link admits anyone holding it to the community; it does not grant private support access. Use a link explicitly set to Never expires in Slack. Expiring links are not supported. Each link admits up to 400 people; the default capacity threshold is 350. Signed workspace join events maintain an estimate, and the weekly browser check records Slack’s actual per-link usage. The app checks capacity hourly and sends bot alerts for capacity warnings, missing verification or broken links. Accepted alerts repeat at most daily; failed deliveries retry hourly. The browser replaces a link only at its verified capacity threshold or when it no longer works, then publishes another verified Never expires link. No age-based renewal runs. Previously saved and deployment invitations need a one-time Never expires confirmation in settings. After saving, settings are authoritative, including an intentionally cleared or paused link. Network or sign-in failures preserve the last confirmed availability and request staff review. See Onboarding settings for counter reconciliation and recovery. If a current invitation cannot be provided, the Join button explains that it is being updated and directs the Operator to their onboarding team. Use the verified onboarding email. Setup never matches names or automatically grants private access to unrelated community members. One primary Operator account remains the onboarding identity for each Location; do not substitute a teammate’s email.From payment to private support
After payment-welcome activation, the Operations payment workflow finds or creates an Onboarding opportunity and sends its authenticated payment webhook. The app verifies the payment, order, approved product and exact contact, then queues a private channel. The customer does not need a Slack membership or a CRM sub-account yet. FM Bot creates the channel, saves its ID on that exact opportunity and adds the configured support staff. The welcome email and SMS wait until the channel and current workspace invitation are ready, then include both the onboarding form and a Join our free support workspace link. The customer joins using their purchase email. Signed membership events and the recovery sweep match that email, add the primary Operator to the reserved channel and post one welcome. Staff can speak with them there immediately. The welcome mentions the primary Operator, explains who to tag for support, and links to Funding Machine inside that customer’s CRM account. It is sent only after Slack confirms channel membership. If membership arrives before account linking, the bot welcomes them without an account URL and updates that same message once the verified product Location is available. It never uses the Operations Location in the link. Existing welcome messages are not rewritten; uncertain initial sends need staff review. When the product sub-account is created and verified account linking completes, setup attaches the same channel to that Location. It preserves membership, channel history and welcome receipts. Until then, account-specific support ingestion and automated account tools remain unavailable; staff can still respond directly in Slack. This path requires send mode on the payment-welcome policy, both live-engine enable controls, the workspace/provisioning switches, the CRM write gate and an approved workspace invitation. For new paid customers only, keepONBOARDING_SLACK_PROVISION_ENABLED=false and enable
ONBOARDING_SLACK_PAID_PROVISION_ENABLED=true. Only payment enrollments at or after
the welcome policy’s cutoff qualify. This restriction follows the reservation when
the CRM account is linked; payment and hold status are checked before provider writes.
Turning the paid switch off stops further writes without removing existing channels.
The general provisioning switch still permits the broader eligible-account rollout,
so it must remain off when limiting setup to new paid customers.
A Location pilot list blocks creation before a Location exists;
remove it only as part of the approved broader rollout. Compute mode performs no Slack
writes. Refunds, holds, changed identities and pending CRM edits stop new access grants.
The five-minute sweep handles five due payment enrollments per pass and recovers up to
five older enrollments that have not entered the Slack queue. Payment-check failures and saved jobs
back off, and signed join events can trigger an earlier check.
Before a sub-account exists, staff can pause or resume the Operations welcome enrollment
through the authorized welcome controls. Its signed links expire after thirty days;
reissue invalidates the old form and Slack links without resending messages. The Slack
link reads the current approved invitation when clicked, so rotation does not require
another email. See Onboarding notifications.
Customer teammates
Customers can have additional teammates in their existing private support channel. These people do not need individual CRM links, and their presence does not make the connection unhealthy. The channel must still match exactly one verified Location in the configured workspace, with FM Bot, the assigned staff and the primary Operator. For additional participants, the signed message receiver checks Slack’s current channel membership and active human profile before creating a support signal. Their messages and replies are customer messages. Only configured Funding Machine staff trigger a staff handoff. Teammates cannot replace the primary Operator, complete that person’s onboarding membership check, or gain account-management permissions through Slack membership. Public, externally shared, archived and ambiguously mapped channels are not accepted for teammate messages. Removed members and bots are not accepted. Do not add customer teammates to either staff roster. Invite or remove teammates through Slack’s normal private-channel controls; the engine does not invite them or restore their membership. Paused or disconnected onboarding connections still block customer message ingestion. If Slack cannot verify an additional participant, the message is not ingested; existing Operator and staff processing remains available. If staff reply while a customer message is still being verified, FM Bot preserves the staff handoff for that exact account and thread. Once verification finishes, the bot can prepare drafts but cannot automatically reply over the staff response.Activation and rehearsal
- Approve app creation and installation for the named support workspace. Create the app without event subscriptions until the receiver is deployed and its app ID/signing secret are configured, then enable its subscriptions. Keep provisioning disabled during configuration.
- Verify the bot’s workspace, the staff roster and the signed receiver. Configure public community/default channels in Slack; private support channels must never be default channels.
- Deploy the verified code through the repository’s approved release process.
- Set
ONBOARDING_SLACK_PROVISION_LOCATION_IDSto the approved pilot Location IDs before enabling provisioning and the CRM write gate. The onboarding Labs feature must be enabled for each pilot Location too. Other Locations can keep using onboarding without gaining provisioning permission. Removing a Location from the list stops its next channel, membership, welcome, or CRM write; adding it again resumes its saved setup attempt. Keep the global provisioning switch off while preparing the pilot. Remove the Location restriction only after approving the broader rollout; omitting it preserves the existing behavior for all eligible Locations. - Use a named synthetic pilot contact and workspace member: confirm one private channel, exact CRM ID readback, staff membership, email match, Operator membership and a single welcome. Confirm another Location cannot claim that channel.
- Verify pause/resume, a removed member, a deactivated member, archived channel and provider-error states. Obtain exact-target approval before any live test that changes membership, posts a message or updates CRM data.
fm-{first-name}-{last-name}-{company-name}
from the verified onboarding contact. For example, Alex D’Angelo at Example Funding
becomes fm-alex-dangelo-example-funding. Names use lowercase letters and hyphens;
apostrophes and accents are removed. If the company is not known yet, setup uses
fm-{first-name}-{last-name} (for example, fm-joseph-jenkinson). Staff can rename
the channel in Slack once the company is known, including while a fully prepared
channel is waiting for its Operator to join. Adding a company to the CRM later
does not automatically rename or replace the channel.
Missing first/last names, unusable supplied names or a name over Slack’s 80-character
limit require staff review. A duplicate name also requires
review: setup does not add a random suffix or adopt another customer’s channel.
Saved channel IDs and unfinished reservations keep their existing identity when
contact details change. Rename an existing channel in Slack after checking its
CRM mapping; the saved channel ID keeps its connection intact.

