[{"data":1,"prerenderedAt":44490},["ShallowReactive",2],{"handbook-\u002Fhandbook\u002Fcompany\u002Fprinciples\u002F":3,"handbook-nav":89},{"id":4,"title":5,"body":6,"description":75,"extension":81,"meta":82,"navGroup":83,"navOrder":83,"navTitle":83,"navigation":84,"path":85,"seo":86,"stem":87,"__hash__":88},"handbook\u002Fhandbook\u002Fcompany\u002Fprinciples.md","Principles",{"type":7,"value":8,"toc":74},"minimark",[9,13,18,22,26,29,32,36,39,42,51],[10,11,5],"h1",{"id":12},"principles",[14,15,17],"h2",{"id":16},"all-remote","All Remote",[19,20,21],"p",{},"We are a fully remote company that puts a strong emphasis on trust and respect\nfor its employees, customers, partners, and communities. We are able to hire the\nright people from wherever they are in the world. We work openly with one\nanother and value clear communication and decision making without being sat in\nthe same room.",[14,23,25],{"id":24},"open-source-stewardship","Open Source Stewardship",[19,27,28],{},"We believe strongly that Open Source lives at the heart of everything we do.\nEver since Node-RED was published as  an Open Source project, we have taken\ngreat care to stay true to that principle.",[19,30,31],{},"Node-RED has an open governance model which means everyone has a seat at the\ntable. We will continue to champion that model and work with the community to\nensure anyone who wants to contribute to the project is able to.",[14,33,35],{"id":34},"esg-policy","ESG Policy",[19,37,38],{},"We believe that integrating Environmental, Social, and Governance (ESG) principles\ninto our core operations is the right thing to do and also fundamental to our success.",[19,40,41],{},"Our environmental focus is on minimizing our footprint through efficient\nresource management, promoting sustainable practices within our operations, and\nour supply chain.",[19,43,44,45,50],{},"We are committed to ethical interactions and ensuring our products\u002Fservices contribute positively.\nWe maintain a ",[46,47,49],"a",{"href":48},"\u002Fhandbook\u002Fpeopleops\u002Fcode-of-conduct\u002F","Code of Conduct"," that\noutlines our expectations for behavior and interaction within our company and community.",[19,52,53,54,58,59,63,64,68,69,73],{},"We maintain strong governance through our Board of Directors and comprehensive company policies. Our ",[46,55,57],{"href":56},"\u002Fhandbook\u002Fcompany\u002Fboard\u002F","board meetings","\nfollow a structured approach to provide oversight and strategic direction. We have established clear policies around\n",[46,60,62],{"href":61},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002F","security",", ",[46,65,67],{"href":66},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Foperations-security\u002F","operations",",\n[human resources[(\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fhuman-resources\u002F), and\n",[46,70,72],{"href":71},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fthird-party-risk-management\u002F","third-party risk management","\nto ensure proper controls and accountability across the organization.",{"title":75,"searchDepth":76,"depth":76,"links":77},"",2,[78,79,80],{"id":16,"depth":76,"text":17},{"id":24,"depth":76,"text":25},{"id":34,"depth":76,"text":35},"md",{},null,true,"\u002Fhandbook\u002Fcompany\u002Fprinciples",{"title":5,"description":75},"handbook\u002Fcompany\u002Fprinciples","h7wgSGORCQZWBP6ZEYnJ8aVTE3R9pjr-8Of1MML4Vkw",[90,621,1311,1483,2156,2327,2366,2815,3033,3298,3340,3380,3647,3980,4137,4292,4494,4630,4965,5149,5492,5624,5995,6152,6308,6493,6623,6715,7056,7308,7486,8396,8767,8861,8933,9061,9206,9349,9518,10019,10147,10355,10599,10642,10855,11075,11606,11825,11998,12396,12478,12635,12759,12850,12914,13116,13217,13993,14696,14753,14905,15113,15279,15447,16755,17116,17214,17291,17654,17803,17870,18152,18375,19111,19272,19328,19380,20084,21117,21291,21357,21816,22068,22128,22472,23657,24087,24129,24324,24362,24722,24780,24928,25272,25594,25857,26025,26091,26350,27113,27930,28606,29079,29190,29291,29608,29900,30133,30226,30396,30611,30721,30990,31066,31380,31427,31574,31778,31988,32658,32810,33289,34065,34130,34237,34451,34506,34734,34831,34998,35075,35330,35535,35701,35881,36170,36210,36355,36595,36872,37316,37416,37661,37866,37983,38416,38507,39260,39994,40029,40457,41482,41581,42169,42519,42769,42962,42988,43158,43261,43554,43796,43913,43976,44152,44166,44388],{"id":91,"title":92,"body":93,"description":100,"extension":81,"meta":615,"navGroup":83,"navOrder":83,"navTitle":616,"navigation":84,"path":617,"seo":618,"stem":619,"__hash__":620},"handbook\u002Fhandbook\u002Fcompany\u002Fboard.md","Board meetings",{"type":7,"value":94,"toc":598},[95,98,101,111,114,118,121,124,127,136,140,143,159,163,168,171,185,189,192,195,198,202,205,232,235,238,243,246,266,269,273,276,393,397,406,409,413,416,420,426,429,456,461,464,493,497,500,503,515,518,522,531,535,538,550,553,556,565,569,572,575,589],[10,96,92],{"id":97},"board-meetings",[19,99,100],{},"There are Board Meeting Cadence with 4 official 120-minute meetings per year\n(once per quarter) about 1 month after the quarter closes, interspersed with 4\n60-minute informal meetings that are focused on metrics and cover one strategic\ntopic for a deep dive.",[19,102,103,104,110],{},"Scheduling is done by sending out a ",[46,105,109],{"href":106,"rel":107},"https:\u002F\u002Fdoodle.com\u002Fen\u002F",[108],"nofollow","Doodle"," to ensure\nit's low friction for all participants.",[19,112,113],{},"Board meeting dates are planned and communicated at the beginning of each calendar year. Before confirming dates, ensure there are no major conflicts (e.g. company events, holidays, or key stakeholder unavailability). One (1) month prior to each Board meeting, reconfirm the scheduled date and check for any new conflicts. Any changes or cancellations must be communicated to the Board at least one (1) month in advance, and if a meeting is cancelled, all Board members must be notified.",[14,115,117],{"id":116},"calendar-invites","Calendar invites",[19,119,120],{},"Since some of the folks invited alternate meetings they attend, we have two\nsequences of invites scheduled to recur at 26 weeks (instead of one sequence at\n13 weeks). This is important to note since this means that if you want to link\nsomething in the meeting invite (e.g. a doc or slides), it must be edited in two\nplaces. This is more reasonable than manually adding folks to the meeting in\nalternating succession.",[19,122,123],{},"Calendar invites include all the folks expected to be at the board meeting,\nincluding our legal counsel.",[19,125,126],{},"COS and VP of Sales should be included on all board meeting calendar invites. When sending the calendar invite, attach the board deck (as a PDF) so attendees have it ahead of time.",[19,128,129,130,135],{},"For a full and up-to-date list of board members, observers, legal counsel, and key stakeholders to include, refer to the ",[46,131,134],{"href":132,"rel":133},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1dkQaHjTDs8OIKQaUcPZe5RVliu-yY6RjmBnJXnfhr0U\u002Fedit?tab=t.0#heading=h.xtkvy2qm8i83",[108],"FF Executive Assistant Guide"," — specifically the Name Familiarity & Relationship table, which includes all BoD members, observers, and legal contacts.",[14,137,139],{"id":138},"the-strategic-timeline","The Strategic Timeline",[19,141,142],{},"Working from the meeting date, follow these milestones:",[144,145,146,150,153,156],"ul",{},[147,148,149],"li",{},"T-minus 2 Weeks: Draft the agenda and create the deck or decks",[147,151,152],{},"T-minus 1 Week: The Dry Run. First draft of slides complete. Present to internal stakeholders\u002Fexecutives.",[147,154,155],{},"T-minus 2-4 Days: Final Board Package distributed (allows directors time to read).",[147,157,158],{},"Meeting Day: Execution and note-taking.",[14,160,162],{"id":161},"the-meeting","The Meeting",[164,165,167],"h3",{"id":166},"the-dry-run-one-week-out","The Dry Run: One Week out",[19,169,170],{},"Schedule a dry run meeting with all internal stakeholders a week prior to the actual meeting date.\nKey Objectives:",[144,172,173,176,179,182],{},[147,174,175],{},"Finalize slides: Which slides require more support",[147,177,178],{},"Audit the Data: Double-check the numbers",[147,180,181],{},"Time Management: Ensure the presentation fits within 60-70% of the allotted time, leaving the rest for Q&A.",[147,183,184],{},"Craft storyline and identify focussed discussions to resolve key challenges for the company.",[164,186,188],{"id":187},"prewatch","Prewatch",[19,190,191],{},"Three business days before the meeting, the CEO will send a 5-10 minute prewatch\nvideo giving Board Members an overview of the metrics and topics for discussion.\nSince meetings are generally scheduled for Tuesdays, this means the prewatch\nneeds to go out on Fridays.",[19,193,194],{},"In most circumstances a 5-10 min prewatch can help make the time together even\nmore productive, as you get to move contextualizing to before-the-meeting and it\ngives people time to let things bake in their head, improving the quality of\nconversation.",[19,196,197],{},"In the email where we send the pre-watch, we should also include the key metrics\nin the text of the email.",[164,199,201],{"id":200},"structure","Structure",[19,203,204],{},"The 120 minutes of each meeting are structured in the following time blocks:",[144,206,207,215,218],{},[147,208,209,210],{},"30 minutes Metrics and Company Performance - The company presents key metrics,\ncomparing against the plan and updates projections. The figures will be\ndistributed well in advance, and as such the discussion should be focussed on\nthe reflections of the numbers.\n",[144,211,212],{},[147,213,214],{},"15 minutes (of this 30) on Plan vs Actual Performance",[147,216,217],{},"60 minutes Strategic Discussion - In the Strategic Discussion portion, we will\nfocus on one to three (but no more) key topics of focus for the business for\ndiscussion. Prior context is shared through the prewatch.",[147,219,220,221],{},"30 minutes \"Routine business\" (Closed session) - Providing an open\nforum for board members and observers to raise additional topics. In this\nClosed portion of the meeting, we will always cover:\n",[144,222,223,226,229],{},[147,224,225],{},"Stock Option Approvals.",[147,227,228],{},"Approval of previous meeting's minutes.",[147,230,231],{},"Compensation matters related to team members over 250K USD.",[19,233,234],{},"It would be highly appreciated if topics to be discussed are shared in advance with the rest of the board.",[19,236,237],{},"It is the CEO's responsibility to manage time in the meeting.",[239,240,242],"h4",{"id":241},"stock-options-approval","Stock Options Approval",[19,244,245],{},"Board approval is required for every new employee's options grant. For each applicable employee, the slide must include:",[144,247,248,251,254,257,260,263],{},[147,249,250],{},"Employee name",[147,252,253],{},"Title",[147,255,256],{},"Current option allocation (if applicable)",[147,258,259],{},"Options to be offered",[147,261,262],{},"Fully diluted total ownership post-grant",[147,264,265],{},"Vesting schedule\nAll information must be based on the final, executed offer letter. Employees included on this slide must have completed onboarding prior to the board meeting.",[19,267,268],{},"To note: Stock Options cannot be approved when the company's 409A Valuation is expired.",[14,270,272],{"id":271},"metrics","Metrics",[19,274,275],{},"Key Metrics to include:",[144,277,278,314,339,359,382],{},[147,279,280,281],{},"Revenue\n",[144,282,283,298,301,311],{},[147,284,285,286],{},"Current ARR\n",[144,287,288,295],{},[147,289,290],{},[46,291,294],{"href":292,"rel":293},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Freports-dashboard\u002F26586079\u002Fview\u002F111119975",[108],"Sales Led cARR",[147,296,297],{},"(Self-Serve MRR * 12) aka Self-Serve ARR",[147,299,300],{},"Current YoY Growth",[147,302,303,304],{},"End of Quarter Projections\n",[144,305,306,309],{},[147,307,308],{},"Sales Led cARR (Closed & Goal)",[147,310,297],{},[147,312,313],{},"Churned revenue",[147,315,316,317],{},"Customers\n",[144,318,319],{},[147,320,321,322],{},"Total Subscriptions\n",[144,323,324,327,330,333,336],{},[147,325,326],{},"New Subscriptions",[147,328,329],{},"Renewed Subscriptions",[147,331,332],{},"Churned",[147,334,335],{},"Upsell\u002FUpgrade",[147,337,338],{},"Downsell\u002FDowngrade",[147,340,341,342],{},"Company\n",[144,343,344,347,350,353,356],{},[147,345,346],{},"Runway in $",[147,348,349],{},"Runway in time",[147,351,352],{},"Cash Burned, planned vs actual",[147,354,355],{},"Cash on hand, planned vs actual",[147,357,358],{},"Headcount, planned vs actual",[147,360,361,362],{},"Deal Board for the Quarter (Pipeline broken down by stages)\n",[144,363,364,367,370,373,376,379],{},[147,365,366],{},"Discovery",[147,368,369],{},"Diagnose",[147,371,372],{},"Solution",[147,374,375],{},"Closing\u002FCommitting",[147,377,378],{},"Closed Won",[147,380,381],{},"Also, Key Deals Highlights",[147,383,384,385],{},"Product Metrics:\n",[144,386,387,390],{},[147,388,389],{},"Managed NR Runtimes, including self-hosted",[147,391,392],{},"Self-hosted platforms reported via telemetry",[164,394,396],{"id":395},"board-deck","Board Deck",[19,398,399,400,405],{},"FlowFuse provides a board deck with high level business overview items, the\ninspiration for slides is\n",[46,401,404],{"href":402,"rel":403},"https:\u002F\u002Fwww.slideshare.net\u002Fslideshow\u002Fsenovo-board-meeting-template\u002F128164697",[108],"taken from this template",".\nThe template is updated to fit the FlowFuse business.",[19,407,408],{},"Slides are stored in the \"Investors\" folder in the \"FlowFuse Admin\" Shared\nDrive.",[239,410,412],{"id":411},"sending-out-the-deck","Sending out the deck",[19,414,415],{},"2-4 Days before the board meeting, save the document as a pdf file and share it with the board members for review. Include minutes from last time and other assets in the same email. Additionally, the deck should also be attached to the calendar invite at the time it is sent (PDF or Google Slides). For Google Slides, please provide comment-only access to allow board members to submit questions ahead of the meeting.",[239,417,419],{"id":418},"managing-the-two-slide-decks","Managing the Two Slide Decks",[19,421,422],{},[423,424,425],"strong",{},"1. The Open Session Deck (General Team)",[19,427,428],{},"This deck focuses on transparency, high-level performance, and culture.",[144,430,431,439],{},[147,432,433,434],{},"Purpose: Celebrate wins, align on company goals, and share the \"vibe\" of the business.\n",[144,435,436],{},[147,437,438],{},"Highlights\u002FChallenges\u002FFocus",[147,440,441,442],{},"Content:\n",[144,443,444,447,450,453],{},[147,445,446],{},"OKR updates",[147,448,449],{},"Marketing highlights",[147,451,452],{},"New hires",[147,454,455],{},"Product roadmaps",[19,457,458],{},[423,459,460],{},"2. The Closed Session Deck (Executive\u002FBoard Only)",[19,462,463],{},"This contains sensitive \"Closed Matters\" that require legal privilege or high-level strategic oversight.",[144,465,466,469],{},[147,467,468],{},"Purpose: Deep-dive into governance, sensitive financials, and high-risk decisions.",[147,470,441,471],{},[144,472,473,476,479,482,485],{},[147,474,475],{},"Compensation: Exec salaries, equity grants, and bonus structures.",[147,477,478],{},"Legal: Pending litigation or regulatory updates.",[147,480,481],{},"Strategic Moves: M&A discussions, fundraising details, or layoffs.",[147,483,484],{},"Financials: Detailed burn rates and runway audits.",[147,486,487,488],{},"Approval of minutes of the last BoD\n",[144,489,490],{},[147,491,492],{},"Link to the finalized minutes from the previous board meeting which are stored in the FlowFuse Admin Shared Drive, under Investors, in the appropriate year folder.",[164,494,496],{"id":495},"post-meeting-action-items","Post meeting action items",[19,498,499],{},"Within a week after the board meeting, the CEO will distribute assets related to\nthe board meeting.",[19,501,502],{},"Assets will always include:",[504,505,506,509,512],"ol",{},[147,507,508],{},"A link to the final board deck with metrics in the shared Google Drive",[147,510,511],{},"A link to the pre-shared materials for the Strategic Discussion",[147,513,514],{},"List of action items",[19,516,517],{},"Once everything has been finalized, share the high-level wins and strategic direction from the Open Session with your broader leadership team at the next Strategy meeting.",[164,519,521],{"id":520},"meeting-minutes","Meeting Minutes",[19,523,524,525,530],{},"Meeting Minutes are compiled by our Counsel and shared after the meeting. They\nare stored in the FlowFuse Admin Shared Drive, in the\n",[46,526,529],{"href":527,"rel":528},"https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Ffolders\u002F1EO1QO2K0wsHKRhA6FUjwkLvILrPCsAHA",[108],"Investors directory",",\nunder the correct year.",[14,532,534],{"id":533},"monthly-investor-updates","Monthly Investor Updates",[19,536,537],{},"FlowFuse investors get a monthly update sent to them through Carta, which\ncontains the KPIs we track and editorialized information from the CEO on company\nperformance. For transparency, the company includes financial performance data\nfrom QuickBooks, and reports on 3 key metrics: ARR, Burn, and Runway.",[19,539,540,541,545,546,549],{},"The subject is structured as: ",[542,543,544],"code",{},"FlowFuse \u003CMonth> \u003CYear> Update",", for example:\n",[542,547,548],{},"FlowFuse May 2025 Update",".",[19,551,552],{},"This update should be sent on the 10th of every month, unless there is a delay in the financial review with the controller.",[19,554,555],{},"The template to use:",[557,558,563],"pre",{"className":559,"code":561,"language":562},[560],"language-text","Dear FlowFuse Investors,\n\n\u003CProgress made over the past month in 4 sentences max>\n\nKPIs (Per end of May)\n* ARR:  $[XX]M, up from $[XX]M end of [Previous Month] and up from $[X]M last year ([Y]x YoY growth)\n* Burn 3m AVG: $[XXX]k\u002Fmo\n* Runway until: [YYYY-MM] (Cash at hand \u002F 3m average burn)\n\n[Topic one]\n[Topic two]\n[Topic three]\n\nBest,\n\nZJ\n","text",[542,564,561],{"__ignoreMap":75},[14,566,568],{"id":567},"major-investors","Major Investors",[19,570,571],{},"Major investors have access to more data on company performance through Carta.",[19,573,574],{},"The company must deliver the following deliverables to all Major Investors:",[144,576,577,580,583,586],{},[147,578,579],{},"Unaudited financial statements within 120 days after each fiscal year.",[147,581,582],{},"Unaudited financials within 45 days after each fiscal quarter.",[147,584,585],{},"Cap table is available through Carta",[147,587,588],{},"Approved annual budget and business plan for the next fiscal year as soon as\npracticable, at most within 30 days of each fiscal year.",[19,590,591,592,597],{},"One investor in particular wants ",[46,593,596],{"href":594,"rel":595},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F10K12_RdNOu81-Ooxh1Vca6dF_EN3VWl2\u002Fedit?gid=1113941930#gid=1113941930",[108],"this worksheet"," to be updated\nevery quarter. It's set up to be mostly automatically imported from the Ops Plan.",{"title":75,"searchDepth":76,"depth":76,"links":599},[600,601,602,608,613,614],{"id":116,"depth":76,"text":117},{"id":138,"depth":76,"text":139},{"id":161,"depth":76,"text":162,"children":603},[604,606,607],{"id":166,"depth":605,"text":167},3,{"id":187,"depth":605,"text":188},{"id":200,"depth":605,"text":201},{"id":271,"depth":76,"text":272,"children":609},[610,611,612],{"id":395,"depth":605,"text":396},{"id":495,"depth":605,"text":496},{"id":520,"depth":605,"text":521},{"id":533,"depth":76,"text":534},{"id":567,"depth":76,"text":568},{},"Board & Investors","\u002Fhandbook\u002Fcompany\u002Fboard",{"title":92,"description":100},"handbook\u002Fcompany\u002Fboard","yM0BteE6Meq5GvIyfx11MewwCp2bEhC8RCbJqzZTsjE",{"id":622,"title":623,"body":624,"description":631,"extension":81,"meta":1305,"navGroup":83,"navOrder":83,"navTitle":1306,"navigation":84,"path":1307,"seo":1308,"stem":1309,"__hash__":1310},"handbook\u002Fhandbook\u002Fcompany\u002Fcommunication.md","Communication",{"type":7,"value":625,"toc":1280},[626,629,632,636,643,647,650,653,657,661,669,675,679,693,697,700,704,708,711,714,722,726,729,732,736,739,743,746,749,783,787,794,798,801,804,818,821,829,833,840,843,846,849,855,859,862,902,906,909,998,1007,1018,1023,1026,1041,1044,1048,1056,1059,1082,1085,1089,1098,1101,1104,1107,1115,1118,1133,1136,1155,1159,1163,1213,1217,1225,1228,1232,1235,1238,1241,1244,1247,1267,1270,1274,1277],[10,627,623],{"id":628},"communication",[19,630,631],{},"As a distributed company, we rely on clear, consistent, and intentional communication so teams can stay aligned, make effective decisions, and collaborate smoothly across timezones.",[14,633,635],{"id":634},"company-wide-announcements","Company-wide announcements",[19,637,638,639,642],{},"We post company-wide announcements in the ",[542,640,641],{},"#announcements"," channel in Slack. Everyone should follow this channel. Some announcements include a short video to give extra context or to explain the change in a more personal way. If the change requires a Handbook update, we include the pull request link so you can review the source of truth.",[14,644,646],{"id":645},"ai-assisted-communication","AI-Assisted Communication",[19,648,649],{},"AI tools, including Large Language Models (LLMs), can help you communicate better. For example, a non-native English speaker can use an LLM to improve word choice or adjust tone. People can often notice when AI wrote a message, and it may feel impersonal. It can help to edit AI output so it reflects your personal tone and clearly shows your intent.",[19,651,652],{},"Remember that communication is always between humans. We are responsible for the messages we send and for how others might understand them. Always review and confirm AI suggestions before sending a message. AI should support your communication, not replace your judgment or your voice.",[14,654,656],{"id":655},"date-and-time","Date and time",[164,658,660],{"id":659},"use-utc-for-times","Use UTC for times",[19,662,663,664,549],{},"Unless stated otherwise, communicate times in UTC. This helps everyone avoid timezone mistakes and makes coordination easier. Each person only needs to ",[46,665,668],{"href":666,"rel":667},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FList_of_UTC_offsets",[108],"remember their own offset from UTC",[19,670,671,674],{},[423,672,673],{},"Exception:"," When planning to meet in a physical location, use that location’s timezone.",[164,676,678],{"id":677},"time-of-day","Time of day",[19,680,681,682,685,686,689,690,549],{},"Use the 24 hour clock for all times. For example, write ",[542,683,684],{},"10:00"," or ",[542,687,688],{},"15:00",". If you need to include a 12 hour format for clarity, write it explicitly, such as ",[542,691,692],{},"3 PM",[164,694,696],{"id":695},"formatting-dates","Formatting dates",[19,698,699],{},"Different countries use different date formats, so be explicit. Use the YYYY-MM-DD format by default. This format is unambiguous, follows the ISO 8601 standard, and works well in tools like Google Sheets.",[14,701,703],{"id":702},"meetings","Meetings",[164,705,707],{"id":706},"general-guidance","General guidance",[19,709,710],{},"Each meeting should have an agenda. An agenda helps participants prepare and decide whether they need to attend. Any participant may add items to the agenda. Please prefix your item with your name or initials so it is clear who will introduce and lead that topic.",[19,712,713],{},"It is fine to add new items while the meeting is happening. Doing this can keep the discussion focused and help the group stay on track.",[19,715,716,717,721],{},"Record customer-facing meetings with Fathom. See the ",[46,718,720],{"href":719},"\u002Fhandbook\u002Fsales\u002Fmeetings\u002F","Sales Meetings guide"," for details) for details.",[164,723,725],{"id":724},"during-the-meeting","During the meeting",[19,727,728],{},"Meetings start on time, and the initiator is the person who owns the first agenda item. When they finish, they hand over to the owner of the next item.",[19,730,731],{},"Take notes directly in the agenda during the meeting. This improves readability and flow, and it removes the need to scroll to a separate notes section.",[164,733,735],{"id":734},"no-agenda-no-attenda","No Agenda, No Attenda",[19,737,738],{},"Most meetings exist to discuss items and make decisions. If a meeting has no agenda items five minutes before the meeting, don't have it.",[164,740,742],{"id":741},"google-calendar-delegation","Google Calendar Delegation",[19,744,745],{},"You can allow other team members to manage events you create on your calendar. You can set this permission for each event or enable it by default. Enabling it by default is especially helpful in an async remote work environment.",[19,747,748],{},"To enable this for all future events you create:",[504,750,751,759,767,773],{},[147,752,753,754,758],{},"Sign in to ",[46,755,756],{"href":756,"rel":757},"https:\u002F\u002Fcalendar.google.com",[108]," with your FlowFuse email address.",[147,760,761,762,549],{},"In the top right, click the Gear icon and open ",[46,763,766],{"href":764,"rel":765},"https:\u002F\u002Fcalendar.google.com\u002Fcalendar\u002Fu\u002F0\u002Fr\u002Fsettings",[108],"Google Calendar Settings",[147,768,769,770,549],{},"Go to ",[542,771,772],{},"Event settings",[147,774,775,776,779,780,549],{},"Under ",[542,777,778],{},"Guest permissions",", enable ",[542,781,782],{},"Modify event",[164,784,786],{"id":785},"coffee-calls","Coffee calls",[19,788,789,790,793],{},"Coffee calls are social and do not require an agenda. If you want to be matched with a random team member every two weeks for a coffee chat, join the ",[542,791,792],{},"#virtual-coffee"," channel on Slack.",[14,795,797],{"id":796},"asynchronous-communication","Asynchronous communication",[19,799,800],{},"Working across timezones and different schedules can be challenging. It helps to organize information so it is easy to find later. Important information should live in places that are persistent and searchable.",[19,802,803],{},"Information should thus be stored in:",[504,805,806,809,812,815],{},[147,807,808],{},"The handbook",[147,810,811],{},"GitHub issues",[147,813,814],{},"GitHub repositories",[147,816,817],{},"Google Drive (Docs, Sheets, and similar)",[19,819,820],{},"Do not store information in:",[504,822,823,826],{},[147,824,825],{},"Slack",[147,827,828],{},"Figma",[164,830,832],{"id":831},"email","Email",[19,834,835,836,839],{},"Use email for internal communication only when you need a written record. This is helpful for topics like compensation, underperformance, or other formal decisions where clarity and traceability matter. For everything else, use ",[46,837,825],{"href":838},"#slack"," so conversations stay quick, open, and easy to follow.",[164,841,825],{"id":842},"slack",[19,844,845],{},"Use threads in Slack whenever possible. Threads keep conversations organized and reduce the need to scroll through long channels.",[19,847,848],{},"Prefer public channels over direct messages. Public channels help everyone stay informed and make it easier for others to join or support the conversation.",[19,850,851,852],{},"Our recommended Slack (light) theme is:\n",[542,853,854],{},"#F2F2F2,#FFC806,#779FA1,#FFFFFF,#F0D36C,#111111,#2AB052,#FD0B00,#AA4444,#FFFFFF",[239,856,858],{"id":857},"recommended-channels","Recommended channels",[19,860,861],{},"You will not automatically join every Slack channel when you start. Below are some helpful channels you may want to join depending on your interests and work.",[144,863,864,869,879,885,890,896],{},[147,865,866,868],{},[542,867,641],{}," for company-wide announcements.",[147,870,871,878],{},[46,872,875],{"href":873,"rel":874},"https:\u002F\u002Fflowfuse.slack.com\u002Farchives\u002FC04GW82DJFK",[108],[542,876,877],{},"#feature-demos"," for product demos of sprint and release deliveries, showcased to a wide audience (marketing, sales, product strategy, leadership). Everyone should stay aware of product changes, no matter their role.",[147,880,881,884],{},[542,882,883],{},"#ops-metrics"," for sales and engagement metrics.",[147,886,887,889],{},[542,888,792],{}," to join the coffee call rotation.",[147,891,892,895],{},[542,893,894],{},"#gh-handbook"," to follow updates to the handbook.",[147,897,898,901],{},[542,899,900],{},"#thanks"," for sharing appreciation with teammates. Expressing thanks often is especially important in remote teams to help maintain a positive culture.",[239,903,905],{"id":904},"channel-name-structure","Channel name structure",[19,907,908],{},"We use a simple naming structure in Slack to make channels easier to find and understand. These prefixes help show the purpose of each channel.",[910,911,912,929],"table",{},[913,914,915],"thead",{},[916,917,918,923,926],"tr",{},[919,920,922],"th",{"align":921},"left","Type",[919,924,925],{"align":921},"Slack prefix",[919,927,928],{"align":921},"Purpose",[930,931,932,946,959,972,985],"tbody",{},[916,933,934,938,943],{},[935,936,937],"td",{"align":921},"Department",[935,939,940],{"align":921},[542,941,942],{},"#dept-",[935,944,945],{"align":921},"Conversations for each company department",[916,947,948,951,956],{},[935,949,950],{"align":921},"Project based work",[935,952,953],{"align":921},[542,954,955],{},"#proj-",[935,957,958],{"align":921},"Work related to a project with a clear end point",[916,960,961,964,969],{},[935,962,963],{"align":921},"GitHub notifications",[935,965,966],{"align":921},[542,967,968],{},"#gh-",[935,970,971],{"align":921},"Automated updates from our GitHub repositories",[916,973,974,977,982],{},[935,975,976],{"align":921},"Ops notifications",[935,978,979],{"align":921},[542,980,981],{},"#ops-",[935,983,984],{"align":921},"Alerts and notifications from operations tools",[916,986,987,990,995],{},[935,988,989],{"align":921},"Customer discussion",[935,991,992],{"align":921},[542,993,994],{},"#cust-",[935,996,997],{"align":921},"Discuss deals and continued adoption for customers",[19,999,1000,1001,1006],{},"We recommend organizing these channels into ",[46,1002,1005],{"href":1003,"rel":1004},"https:\u002F\u002Fslack.com\u002Fhelp\u002Farticles\u002F360043207674-Organize-your-sidebar-with-custom-sections",[108],"custom Slack sections"," for easier navigation.",[19,1008,1009,1010,1013,1014,1017],{},"We also have channels for specific groups, such as ",[542,1011,1012],{},"#people-managers"," for managers and ",[542,1015,1016],{},"#us-hr"," for HR topics specific to US team members.",[1019,1020,1022],"h5",{"id":1021},"project-channels","Project channels",[19,1024,1025],{},"Project channels are created for ongoing work within a product lane with a clear scope. Use them for day-to-day coordination, intermediate demos, design feedback, and scope discussions among the directly involved stakeholders.",[19,1027,1028,1029,1034,1035,1037,1038,1040],{},"When a feature is ready to be delivered, post the final demo in ",[46,1030,1032],{"href":873,"rel":1031},[108],[542,1033,877],{},". This keeps ",[542,1036,877],{}," focused on what is ready for a wider audience, and ",[542,1039,955],{}," channels focused on what is still in progress.",[19,1042,1043],{},"When you create a new channel, add a clear description. This helps everyone browse channels and decide which ones are relevant to their work.",[164,1045,1047],{"id":1046},"github","GitHub",[19,1049,1050,1051,1055],{},"All code at FlowFuse is stored in Git, and GitHub hosts our repositories. All changes, feature ideas, and requests are tracked there. GitHub also holds task lists for onboarding, ",[46,1052,1054],{"href":1053},"\u002Fhandbook\u002Fdesign\u002Fart-requests","art requests",", and other work that is not code related. It is important to stay up to date with GitHub and its notifications.",[19,1057,1058],{},"You can use the following views to keep track of items that need your attention:",[144,1060,1061,1068,1075],{},[147,1062,1063],{},[46,1064,1067],{"href":1065,"rel":1066},"https:\u002F\u002Fgithub.com\u002Fpulls\u002Fmentioned",[108],"Pull requests that mention you",[147,1069,1070],{},[46,1071,1074],{"href":1072,"rel":1073},"https:\u002F\u002Fgithub.com\u002Fissues\u002Fmentioned",[108],"Issues that mention you",[147,1076,1077],{},[46,1078,1081],{"href":1079,"rel":1080},"https:\u002F\u002Fgithub.com\u002Fpulls\u002Freview-requested",[108],"Pull requests that need your review",[19,1083,1084],{},"Please respond to mentions and review requests within two business days.",[164,1086,1088],{"id":1087},"standup-meetings","Standup meetings",[19,1090,1091,1092,1097],{},"Standup meetings are difficult to run across many time zones, so we run standups asynchronously using ",[46,1093,1096],{"href":1094,"rel":1095},"https:\u002F\u002Fgeekbot.com\u002F",[108],"Geekbot",". Geekbot sends a prompt each workday at 9:00 in your local time, or when you first become active in Slack after that time.",[19,1099,1100],{},"Previously, all standups were posted in a single #standup channel. That channel is now archived, and standups live in departmental channels (Sales, Marketing, BizOps, and Engineering, which currently includes Product).",[19,1102,1103],{},"This keeps signal-to-noise healthy as we grow and ensures updates are shared where the most relevant stakeholders can easily find them, without scrolling through standups from other teams.",[19,1105,1106],{},"A good standup update reduces the need for status updates in live meetings. When writing your update, keep the following in mind:",[504,1108,1109,1112],{},[147,1110,1111],{},"Connect your work to our broader goals. Explain what you plan to do today and how it supports the company’s priorities.",[147,1113,1114],{},"Focus on clear, specific actions rather than vague updates. This helps with accountability and shared understanding.",[19,1116,1117],{},"Pro tips:",[144,1119,1120,1127],{},[147,1121,1122,1123,1126],{},"If a question does not apply to you, enter ",[542,1124,1125],{},"-"," to skip.",[147,1128,1129,1130,549],{},"If you want to submit your update earlier in the day, message Geekbot with ",[542,1131,1132],{},"report",[19,1134,1135],{},"Example standup messages:",[144,1137,1138,1141,1144],{},[147,1139,1140],{},"Bad: \"More work on the special feature\"",[147,1142,1143],{},"Better: \"Align on plan for building special feature with Manny and work on it\"",[147,1145,1146,1147],{},"Best:\n",[144,1148,1149,1152],{},[147,1150,1151],{},"Get Manny's sign off on plan for special feature",[147,1153,1154],{},"Break Issue 1234 into relevant tasks",[164,1156,1158],{"id":1157},"current-meetings","Current meetings",[239,1160,1162],{"id":1161},"monday-team-catchup","Monday Team Catchup",[504,1164,1165,1176,1193,1210],{},[147,1166,1167,1168],{},"Purpose & Attendance\nOur Monday meeting serves a dual purpose: maintaining organizational alignment as we scale and fostering a connected team culture.",[144,1169,1170,1173],{},[147,1171,1172],{},"First 10 Minutes (Mandatory): All team members are expected to join for the Department Spotlight to stay informed on collective progress and high-level goals.",[147,1174,1175],{},"Remainder of Meeting (Optional): Following the spotlight, the meeting transitions into an open team catch-up. You are welcome to stay to share personal or professional updates, or depart if you need to focus on other priorities.",[147,1177,1178,1179],{},"Format: Department Spotlights\nEach Monday, one department will lead a 5–10 minute presentation. These briefings are intended to be concise, high-level, and focused on information that impacts the broader organization.\nThe rotation will follow a four-week cycle:",[144,1180,1181,1184,1187,1190],{},[147,1182,1183],{},"Week 1: Company Update – Focusing on organizational health and \"big picture\" goals by the CEO",[147,1185,1186],{},"Week 2: Technology & Product – Demonstrating what we are building and the \"why\" behind it by the Engineering & Product leadership",[147,1188,1189],{},"Week 3: Sales – Reporting on growth, revenue, and direct customer insights by Sales leadership",[147,1191,1192],{},"Week 4: Marketing – Highlighting how we are communicating our value to the market by marketing leadership",[147,1194,1195,1196],{},"Presenter Guidelines\nTo maintain a high-energy pace and respect the team's time:",[144,1197,1198,1201,1204,1207],{},[147,1199,1200],{},"Content: Focus on three pillars: Recent Wins, Current Challenges, and Upcoming Milestones.",[147,1202,1203],{},"Time Limit: 10 minutes maximum (including 2 minutes for Q&A).",[147,1205,1206],{},"Visuals: Keep to 3–5 high-impact, data-informed slides.",[147,1208,1209],{},"Deadline: Share your slides in the #General channel by EOD Friday prior to your presentation.",[147,1211,1212],{},"Open Agenda (Optional Segment)\nFor the latter portion of the meeting, team members are encouraged to add items to the agenda. This is an informal space to share weekend highlights, personal news, or professional updates that keep you busy.\nEffective Date: This new format begins Monday, February 2nd, 2026.",[239,1214,1216],{"id":1215},"strategy-call","Strategy Call",[19,1218,1219,1220,1224],{},"The Strategy Call brings team leadership together each week to check in and discuss important topics. We spend the first 5-10 minutes reviewing ",[46,1221,1223],{"href":1222},"\u002Fhandbook\u002Fcompany\u002Fstrategy#kpi","key metrics",". The rest of the agenda changes based on current priorities.",[19,1226,1227],{},"This call takes place on Tuesdays.",[14,1229,1231],{"id":1230},"_11-meetings","1:1 meetings",[19,1233,1234],{},"Each employee at FlowFuse has regular one-on-one meetings with their manager. For individual contributors, 1:1s should happen at least once a month. Depending on role, tenure, and current needs, a biweekly (every two weeks) or weekly cadence may be more appropriate and should be agreed upon by the manager and direct report.",[19,1236,1237],{},"The direct report owns the agenda. Use this time to talk about anything that helps you succeed, such as personal updates, challenges, feedback, or decisions you need support with.",[19,1239,1240],{},"Keep your agenda in a shared Google Doc. Both you and your manager should add items as they come to mind, instead of waiting until the day before. During the meeting, you can walk through the topics in whatever order is most useful.",[19,1242,1243],{},"A 1:1 should not turn into a status update meeting. Share status updates in GitHub issues, standups, or other async channels. Use your 1:1 to get alignment, talk through difficulties, or brainstorm solutions.",[19,1245,1246],{},"When preparing your agenda, you can reflect on questions like:",[144,1248,1249,1252,1255,1258,1261,1264],{},[147,1250,1251],{},"What went well in the last few weeks?",[147,1253,1254],{},"What did not go well?",[147,1256,1257],{},"Which problems were difficult, and what would have made them easier?",[147,1259,1260],{},"What important but not urgent tasks need attention?",[147,1262,1263],{},"How did you receive feedback, and did that approach work for you?",[147,1265,1266],{},"Where do you want to improve, and do you want help creating a plan?",[19,1268,1269],{},"Include an “Action Items” section in your agenda to track follow-up tasks from the meeting. Add timelines when they are helpful.",[14,1271,1273],{"id":1272},"skip-level-meetings","Skip level meetings",[19,1275,1276],{},"Skip level meetings give team members a chance to speak directly with their manager's manager. These meetings help you stay connected to broader strategy and give space to share feedback based on your own experience.",[19,1278,1279],{},"The frequency of skip level meetings depends on your needs, but a good guideline is once every 6 to 8 weeks. As FlowFuse grows, these meetings may happen less often.",{"title":75,"searchDepth":76,"depth":76,"links":1281},[1282,1283,1284,1289,1296,1303,1304],{"id":634,"depth":76,"text":635},{"id":645,"depth":76,"text":646},{"id":655,"depth":76,"text":656,"children":1285},[1286,1287,1288],{"id":659,"depth":605,"text":660},{"id":677,"depth":605,"text":678},{"id":695,"depth":605,"text":696},{"id":702,"depth":76,"text":703,"children":1290},[1291,1292,1293,1294,1295],{"id":706,"depth":605,"text":707},{"id":724,"depth":605,"text":725},{"id":734,"depth":605,"text":735},{"id":741,"depth":605,"text":742},{"id":785,"depth":605,"text":786},{"id":796,"depth":76,"text":797,"children":1297},[1298,1299,1300,1301,1302],{"id":831,"depth":605,"text":832},{"id":842,"depth":605,"text":825},{"id":1046,"depth":605,"text":1047},{"id":1087,"depth":605,"text":1088},{"id":1157,"depth":605,"text":1158},{"id":1230,"depth":76,"text":1231},{"id":1272,"depth":76,"text":1273},{},"Communications","\u002Fhandbook\u002Fcompany\u002Fcommunication",{"title":623,"description":631},"handbook\u002Fcompany\u002Fcommunication","s27ymIrTRAn1ZI8DTyLs-YtvVtZ0yqftOkb5kXWEXDg",{"id":1312,"title":1313,"body":1314,"description":75,"extension":81,"meta":1477,"navGroup":83,"navOrder":83,"navTitle":1478,"navigation":84,"path":1479,"seo":1480,"stem":1481,"__hash__":1482},"handbook\u002Fhandbook\u002Fcompany\u002Fdecisions.md","How we make decisions",{"type":7,"value":1315,"toc":1468},[1316,1319,1323,1326,1334,1337,1340,1343,1366,1370,1373,1380,1386,1393,1400,1404,1412,1416,1420,1423,1437,1440,1442,1445,1449,1452],[10,1317,1313],{"id":1318},"how-we-make-decisions",[14,1320,1322],{"id":1321},"directly-responsible-individual","Directly Responsible Individual",[19,1324,1325],{},"A DRI, also known as Directly Responsible Individual, is a method of assigning\nclear ownership and accountability for specific tasks, projects, or initiatives\nwithin an organization. The purpose of a DRI is to ensure that there is a single\nindividual who is ultimately responsible for the success or failure of a\nparticular undertaking.",[19,1327,1328,1329,1333],{},"When decisions need to be made in a DRI's area of responsibility, the DRI\nis the person who has the final say and is empowered to make those decisions.\nThis allows for efficient decision-making and prevents decision paralysis or\nambiguity within FlowFuse. The DRI is expected to gather relevant input and\nfeedback from other stakeholders but is ultimately responsible for making the\nfinal call. Other stakeholders might need to\n",[46,1330,1332],{"href":1331},".\u002Fvalues.md#disagreeandcommit","Disagree and Commit",". Regular\n(async) communication and collaboration with other team members and stakeholders\nis crucial to ensure alignment and support for the DRI's initiatives.",[19,1335,1336],{},"The appointment of a DRI occurs through the CEO or CTO. They will identify the\nareas of ownership and accountability within the organization and then assign\nthe appropriate DRI. The selection of a DRI is based on factors such as\nexpertise, experience, and the individual's ability to handle the specific task\nor project successfully.",[19,1338,1339],{},"Note that both the CEO and CTO retain the right to override decisions. This should very seldomly happen.",[19,1341,1342],{},"DRI's weren't invented by FlowFuse, we stand on the shoulder of giants that\nchampioned the term and iterated before us. Read about the prior art:",[504,1344,1345,1352,1359],{},[147,1346,1347],{},[46,1348,1351],{"href":1349,"rel":1350},"http:\u002F\u002Ffortune.com\u002F2011\u002F08\u002F25\u002Fhow-apple-works-inside-the-worlds-biggest-startup\u002F",[108],"Apple",[147,1353,1354],{},[46,1355,1358],{"href":1356,"rel":1357},"https:\u002F\u002Fabout.gitlab.com\u002Fhandbook\u002Fpeople-group\u002Fdirectly-responsible-individuals\u002F",[108],"GitLab",[147,1360,1361],{},[46,1362,1365],{"href":1363,"rel":1364},"https:\u002F\u002Ffleetdm.com\u002Fhandbook\u002Fcompany\u002Fwhy-this-way#why-direct-responsibility",[108],"FleetDM",[10,1367,1369],{"id":1368},"how-we-assign-project-roles-and-responsibilities","How we assign project roles and responsibilities",[19,1371,1372],{},"Projects of any size are typically carried out by more than one individual, and so it is helpful to have a way of organizing responsibilities beyond identifying only the DRI. For this, we use the RACI framework. RACI stands for: Responsible, Accountable, Consulted, and Informed.",[19,1374,1375,1376,1379],{},"The ",[423,1377,1378],{},"Responsible"," person is the one who is responsible for executing on the project. In accordance with our use of the DRI concept, at FlowFuse, there is never more than one person recognized as the Responsible person on a project, even if the project has multiple individuals doing the work.",[19,1381,1375,1382,1385],{},[423,1383,1384],{},"Accountable"," person is the one who is accountable for meeting whatever goals are associated with the project. For example, as purposeful projects will be associated with some higher-level KPI, the accountable person will be the one who is tasked with ensuring that the project delivers on the KPI and overall brings results. It is not unusual for the Responsible person and the Accountable person to be the same individual, and depending on the nature of the project, there may be more than one Accountable person.",[19,1387,1388,1389,1392],{},"A ",[423,1390,1391],{},"Consulted"," person is anyone whose expertise is needed to plan and execute on a project. There will often be many consulted individuals on a project, and they are individually responsible (Responsible) for the sub-project of delivering on whatever portion of work is needed for the Responsible person to do their work.",[19,1394,1395,1396,1399],{},"An ",[423,1397,1398],{},"Informed"," person is anyone who must be made aware of project status. This is one-way communication to those who need to know the outcome but don't contribute directly to the task.",[14,1401,1403],{"id":1402},"dri-responsible-and-accountable","DRI, Responsible, and Accountable",[19,1405,1406,1407,1411],{},"Because at FlowFuse we are committed to the ",[46,1408,1410],{"href":1409},"\u002Fhandbook\u002Fcompany\u002Fdecisions\u002F#directly-responsible-individual","DRI"," concept, the DRI for a project or initiative always assumes both the Responsible role and an Accountable role in the RACI matrix. They have final decision-making authority and are ultimately responsible for the success or failure of the work.",[14,1413,1415],{"id":1414},"when-to-use-raci","When to use RACI",[164,1417,1419],{"id":1418},"projects","Projects",[19,1421,1422],{},"RACI is a project management tool but, like any tool, should be applied only when it is useful and necessary. We use explicit RACI role identifications when:",[144,1424,1425,1428,1431,1434],{},[147,1426,1427],{},"Working on cross-functional projects with multiple stakeholders",[147,1429,1430],{},"Clarifying roles in complex processes",[147,1432,1433],{},"Onboarding new team members to existing projects",[147,1435,1436],{},"Establishing a new workstream with multiple dependencies",[19,1438,1439],{},"For smaller, straightforward tasks, the DRI concept alone may be sufficient.",[164,1441,703],{"id":702},[19,1443,1444],{},"In cross-functional meetings, there are often action items assigned. When any amount of collaboration on action items is needed, assign roles based on the RACI structure.",[164,1446,1448],{"id":1447},"resources","Resources",[19,1450,1451],{},"More information about the RACI framework and how it can be applied can be found here:",[144,1453,1454,1461],{},[147,1455,1456],{},[46,1457,1460],{"href":1458,"rel":1459},"https:\u002F\u002Fwww.atlassian.com\u002Fwork-management\u002Fproject-management\u002Fraci-chart#:~:text=RACI%20charts%20categorize%20these%20roles,accountability%20for%20tasks%20or%20deliverables",[108],"Atlassian",[147,1462,1463],{},[46,1464,1467],{"href":1465,"rel":1466},"https:\u002F\u002Fmonday.com\u002Fblog\u002Fproject-management\u002Fraci-model\u002F",[108],"Monday.com",{"title":75,"searchDepth":76,"depth":76,"links":1469},[1470,1471,1472],{"id":1321,"depth":76,"text":1322},{"id":1402,"depth":76,"text":1403},{"id":1414,"depth":76,"text":1415,"children":1473},[1474,1475,1476],{"id":1418,"depth":605,"text":1419},{"id":702,"depth":605,"text":703},{"id":1447,"depth":605,"text":1448},{},"Decision making and project management","\u002Fhandbook\u002Fcompany\u002Fdecisions",{"title":1313,"description":75},"handbook\u002Fcompany\u002Fdecisions","jz1t7RHiFKC29aYzXphk5Hk6CwdNlkEe5GmG2MhG1zM",{"id":1484,"title":1485,"body":1486,"description":75,"extension":81,"meta":2150,"navGroup":83,"navOrder":83,"navTitle":2151,"navigation":84,"path":2152,"seo":2153,"stem":2154,"__hash__":2155},"handbook\u002Fhandbook\u002Fcompany\u002Fguides\u002Fgit.md","How to use Git",{"type":7,"value":1487,"toc":2117},[1488,1491,1495,1530,1542,1553,1557,1561,1564,1611,1615,1618,1647,1651,1654,1676,1680,1684,1706,1721,1728,1736,1742,1747,1759,1763,1771,1774,1781,1792,1800,1804,1807,1813,1819,1823,1827,1843,1851,1857,1864,1882,1888,1892,1902,1906,1919,1923,1934,1943,1948,1952,1960,1963,1967,1970,1973,1976,1990,1993,2001,2004,2013,2015,2021,2024,2027,2030,2044,2048,2059,2062,2076,2079,2084,2088,2094,2098,2106,2109,2112,2114],[10,1489,1485],{"id":1490},"how-to-use-git",[14,1492,1494],{"id":1493},"background","Background",[19,1496,1497,1501,1502,1506,1507,1511,1512,1514,1515,1519,1520,1522,1523,1526,1527,1529],{},[46,1498,1500],{"href":1499},"#git","Git"," is a way for a team to create written content, track any changes to that content, and seek approval for any changes to become the ",[46,1503,1505],{"href":1504},"#publish","Published"," version of that content on ",[46,1508,1510],{"href":1509},"#live","Live",". ",[46,1513,1500],{"href":1499}," can be used in many ways, our developers use it to write the code which makes FlowFuse work. In this guide we are focusing on the process of working with documents within our company ",[46,1516,1518],{"href":1517},"#handbook","Handbook"," or website. We will use ",[46,1521,1500],{"href":1499},"'s terminology to describe how we are working. This guide also assumes you are using ",[46,1524,1047],{"href":1525},"#github",".com to edit the ",[46,1528,1518],{"href":1517}," and website.",[19,1531,1532,1533,1537,1538,549],{},"When making changes to a ",[46,1534,1536],{"href":1535},"#project","Project"," at least two people have to agree that the changes should be Published. In most cases those two people would be yourself and a ",[46,1539,1541],{"href":1540},"#reviewer","Reviewer",[19,1543,1544,1545,1549,1550,1552],{},"We have included a ",[46,1546,1548],{"href":1547},"#glossary","Glossary"," at the end of this guide which hopefully will give you a good start with common ",[46,1551,1500],{"href":1499}," terminology.",[14,1554,1556],{"id":1555},"quick-guide","Quick Guide",[164,1558,1560],{"id":1559},"new-contributions","New Contributions",[19,1562,1563],{},"If you've been asked to do a new piece of work, this is the quick bullet list of steps to follow:",[504,1565,1566,1577,1584,1587,1590,1593,1596,1599,1602,1605],{},[147,1567,1568,1569,1572,1573,1576],{},"Switch to (",[542,1570,1571],{},"checkout",") to the latest version of the repository's ",[542,1574,1575],{},"main"," branch",[147,1578,1579,1580,1583],{},"Create a new branch (with a ",[542,1581,1582],{},"kebab-case-name",")",[147,1585,1586],{},"Make the changes you need to do locally on your machine",[147,1588,1589],{},"Add & Commit your changes when they're ready.",[147,1591,1592],{},"Push your changes to the branch",[147,1594,1595],{},"You can do multiple commits and pushes to iterate on your work. It will all be saved to your branch",[147,1597,1598],{},"When ready for review, open a Pull Request",[147,1600,1601],{},"Assign someone else as a reviewer, they may offer feedback",[147,1603,1604],{},"The reviewer, when happy, will approve and merge the Pull request",[147,1606,1607,1608,1610],{},"Once your PR is merged, be sure to switch back to the ",[542,1609,1575],{}," branch again",[164,1612,1614],{"id":1613},"modifying-an-existing-contribution","Modifying an Existing Contribution",[19,1616,1617],{},"If another person has opened a Pull Request or branch already, and asked you to make additions to that, then the steps differ slightly:",[504,1619,1620,1623,1626,1628,1631,1634,1637,1640,1642],{},[147,1621,1622],{},"Switch to their branch on your machine (if request to append to the Pull Request, that will have a branch associated to.)",[147,1624,1625],{},"Make the changes you need to do locally",[147,1627,1589],{},[147,1629,1630],{},"Push your changes to the branch. Any pushed changes will automatically update the associated Pull Request.",[147,1632,1633],{},"You can do multiple commits and pushes to iterate on your work. It will all be saved to your branch & PR.",[147,1635,1636],{},"Check with the original PR owner as to whether you're reviewing the PR, or if someone else has been assigned",[147,1638,1639],{},"Reviewer submits their feedback, if any.",[147,1641,1604],{},[147,1643,1644,1645,1576],{},"Once you have finished your contributions, you can switch back to the ",[542,1646,1575],{},[164,1648,1650],{"id":1649},"completing-a-pull-request-review","Completing a Pull Request Review",[19,1652,1653],{},"You may be asked to conduct a Pull Request Review. This means that someone else has contributed some work, and would like you to check whether it works, and whether you're happy with the contributions made. These are the steps by which you can do that:",[504,1655,1656,1658,1661,1664,1667,1670],{},[147,1657,1622],{},[147,1659,1660],{},"Run the code (e.g. website server or FlowFuse platform) and ensure their changes work as expected.",[147,1662,1663],{},"\"Add your Review\" on GitHub, offer comments and recommendations where required.",[147,1665,1666],{},"Once you're happy, \"Approve\" the Pull Request",[147,1668,1669],{},"Merge the PR",[147,1671,1672,1673,1675],{},"Ensure you have switched back to the ",[542,1674,1575],{}," branch locally before continuing any other work.",[14,1677,1679],{"id":1678},"how-to-make-changes-to-the-live-version-of-a-project","How to make changes to the Live version of a Project",[164,1681,1683],{"id":1682},"create-a-branch","Create a Branch",[19,1685,1686,1687,1691,1692,1694,1695,1697,1698,1700,1701,1703,1704,549],{},"The first step to editing content is to create a ",[46,1688,1690],{"href":1689},"#branch","Branch"," of that content. A ",[46,1693,1690],{"href":1689}," is a complete copy of the ",[46,1696,1536],{"href":1535},". Creating a ",[46,1699,1690],{"href":1689}," allows you to edit the content without those edits changing the ",[46,1702,1510],{"href":1509}," copy of a ",[46,1705,1536],{"href":1535},[19,1707,1708,1709,1711,1712,685,1717,549],{},"Navigate to the Project within ",[46,1710,1047],{"href":1525}," you want to work on, that would usually be ",[46,1713,1716],{"href":1714,"rel":1715},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fwebsite",[108],"our website",[46,1718,1518],{"href":1719,"rel":1720},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fhandbook",[108],[19,1722,1723],{},[1724,1725],"img",{"alt":1726,"src":1727},"Create a new Branch","\u002Fhandbook\u002Fimages\u002Fgit-how-to\u002Fnew-branch-1.png",[19,1729,1375,1730,1732,1733,1735],{},[46,1731,1690],{"href":1689}," name should give a brief overview of what you are planning to change in the ",[46,1734,1536],{"href":1535},", for example ‘Add Git guide for non-tech projects & staff’ then click the ‘create branch’ link.",[19,1737,1738,1739,1741],{},"You should now notice that where the drop down said ‘main’ before it now says the name of the ",[46,1740,1690],{"href":1689}," you just created.",[19,1743,1744],{},[1724,1745],{"alt":1726,"src":1746},"\u002Fhandbook\u002Fimages\u002Fgit-how-to\u002Fnew-branch-2.png",[19,1748,1749,1750,1752,1753,1755,1756,1758],{},"You can now start the process of actually creating or editing content, any changes you make will not yet be added to the ",[46,1751,1505],{"href":1504}," version of the ",[46,1754,1510],{"href":1509}," ",[46,1757,1536],{"href":1535}," so don't worry if you make mistakes or are not yet happy with the finished product.",[164,1760,1762],{"id":1761},"create-a-new-file-document","Create a new file (document)",[19,1764,1765,1766,1768,1769,549],{},"In this example I am going to create a new document in the ",[46,1767,1518],{"href":1517}," which will help non-technical FlowFuse team members use ",[46,1770,1500],{"href":1499},[19,1772,1773],{},"Firstly I will create a new document called git-how-to.md in the design folder.",[19,1775,1776],{},[1724,1777],{"alt":1778,"src":1779,"title":1780},"Create a new file","\u002Fhandbook\u002Fimages\u002Fgit-how-to\u002Fnew-file-1.gif","@skip",[19,1782,1783,1784,1788,1789,1791],{},"The file type is .md (Markdown). A ",[46,1785,1787],{"href":1786},"#markdown","Markdown"," file is similar to a .docx or .txt. It allows you to lay out content in a document including text, images, titles, headers and tables. You can read more about ",[46,1790,1787],{"href":1786}," here.",[19,1793,1794,1795,1799],{},"In the video above I pressed ‘",[46,1796,1798],{"href":1797},"#commit","Commit"," changes’ which is the same as saving your document.",[164,1801,1803],{"id":1802},"editing-your-document","Editing your document",[19,1805,1806],{},"I can now start the process of writing my document, first I will reopen it in the editor, then I will add the content.",[19,1808,1809],{},[1724,1810],{"alt":1811,"src":1812,"title":1780},"Edit the new file","\u002Fhandbook\u002Fimages\u002Fgit-how-to\u002Fedit-file-1.gif",[19,1814,1815,1816,1818],{},"I will work on the file until I think it's ready for a colleague to review the changes I have made. Once I am happy with the content I will ",[46,1817,1798],{"href":1797}," the changes as I did before.",[14,1820,1822],{"id":1821},"how-to-get-those-changes-published","How to get those changes published",[164,1824,1826],{"id":1825},"creating-a-pull-request","Creating a Pull Request",[19,1828,1829,1830,1834,1835,1839,1840,1842],{},"I am now ready to request a ",[46,1831,1833],{"href":1832},"#review","Review"," of my work from a colleague. To do this I need to create a ",[46,1836,1838],{"href":1837},"#pull-request","Pull Request",". Once you create the ",[46,1841,1838],{"href":1837}," an alert will be sent to your colleagues asking them for feedback on your work.",[19,1844,1845,1847,1848,1850],{},[46,1846,1047],{"href":1525}," gives you an easy to find button to create a ",[46,1849,1838],{"href":1837}," for your current work.",[19,1852,1853],{},[1724,1854],{"alt":1855,"src":1856,"title":1780},"Create a Pull Request","\u002Fhandbook\u002Fimages\u002Fgit-how-to\u002Fcreate-a-pr-1.gif",[19,1858,1859,1860,1863],{},"It's a good idea to provide your colleagues descriptive comments explaining the goals of the changes you have made as well as anything else you think would help them ",[46,1861,1862],{"href":1832},"review"," your work.",[19,1865,1866,1867,1869,1870,1873,1874,1876,1877,1879,1880,1863],{},"Once you press the 'Create pull request' button an alert will be sent to one of FlowFuse's Slack channels letting everyone know you'd like your work reviewed. You can also request a ",[46,1868,1862],{"href":1832}," from a specific colleague using the ",[46,1871,1872],{"href":1540},"Reviewers"," section of your ",[46,1875,1838],{"href":1837}," Click on ",[46,1878,1872],{"href":1540}," then select the colleague you think would be best placed to ",[46,1881,1862],{"href":1832},[19,1883,1884],{},[1724,1885],{"alt":1886,"src":1887,"title":1780},"Request a review from a specific colleague","\u002Fhandbook\u002Fimages\u002Fgit-how-to\u002Fnominate-a-reviewer-1.gif",[164,1889,1891],{"id":1890},"requesting-a-review-of-your-work","Requesting a review of your work",[19,1893,1894,1895,1898,1899,1901],{},"Once a colleague has ",[46,1896,1897],{"href":1832},"reviewed"," your work you will receive an email alert. They can provide feedback on your work in three ways, sometimes a ",[46,1900,1862],{"href":1832}," will include more than one type of feedback.",[239,1903,1905],{"id":1904},"approval-of-your-branch-to-go-live","Approval of your Branch to go live",[19,1907,1908,1909,1911,1912,1755,1914,1916,1917,549],{},"This is the easiest to deal with, the ",[46,1910,1541],{"href":1540}," doesn't think anything needs to be changed. Proceed to the next section to get the changes in your ",[46,1913,1690],{"href":1689},[46,1915,1505],{"href":1504}," to ",[46,1918,1510],{"href":1509},[239,1920,1922],{"id":1921},"comments-on-your-branch-asking-you-to-make-edits","Comments on your Branch asking you to make edits.",[19,1924,1375,1925,1927,1928,1930,1931,1933],{},[46,1926,1541],{"href":1540}," has given feedback on your ",[46,1929,1690],{"href":1689},", you will need to consider making edits and provide feedback to the ",[46,1932,1541],{"href":1540}," to explain what you changed (or didn't) and why.",[19,1935,1936,1937,1939,1940,1942],{},"Once you are happy that your edits address the Reviewer's feedback points ",[46,1938,1798],{"href":1797}," your changes. You should now also reply to each of the ",[46,1941,1541],{"href":1540},"'s comments letting them know what you changed or why you didn't change anything based on their comments.",[19,1944,1375,1945,1947],{},[46,1946,1541],{"href":1540}," will now read your comments and edits and based on their actions you may need to respond to further comments or edits.",[239,1949,1951],{"id":1950},"suggested-edits-to-your-branch","Suggested edits to your Branch.",[19,1953,1375,1954,1956,1957,1959],{},[46,1955,1541],{"href":1540}," has editing your ",[46,1958,1690],{"href":1689}," themselves, you can read through their edits and approve them if you think they improve the content.",[19,1961,1962],{},"TO DO - How does the user actually deal with this?",[164,1964,1966],{"id":1965},"publishing-to-live","Publishing to live",[19,1968,1969],{},"TO DO - Write up the process to publish to live.",[14,1971,1548],{"id":1972},"glossary",[164,1974,1690],{"id":1975},"branch",[19,1977,1978,1979,1981,1982,1984,1985,1987,1988,549],{},"When working in ",[46,1980,1500],{"href":1499},", a Branch is a complete copy of a ",[46,1983,1536],{"href":1535}," which you can make changes to without those changes effecting the ",[46,1986,1510],{"href":1509}," copy of the ",[46,1989,1536],{"href":1535},[164,1991,1798],{"id":1992},"commit",[19,1994,1995,1996,1998,1999,549],{},"The process to save changes to a ",[46,1997,1690],{"href":1689}," of a ",[46,2000,1536],{"href":1535},[164,2002,1500],{"id":2003},"git",[19,2005,2006,2007,2012],{},"An app to help us collaboratively manage changes to documents. You can read more ",[46,2008,2011],{"href":2009,"rel":2010},"https:\u002F\u002Fgit-scm.com\u002F",[108],"here"," but we'd advise you don't unless you are a developer as Git has a lot of features and terminology which you don't need to understand at this point.",[164,2014,1047],{"id":1046},[19,2016,2017,2018,2020],{},"A website which allows you to manage ",[46,2019,1500],{"href":1499},". GitHub also allows you to communicate with your colleagues about changes you are making.",[164,2022,1518],{"id":2023},"handbook",[19,2025,2026],{},"FlowFuse's public document explaining how run the company.",[164,2028,1510],{"id":2029},"live",[19,2031,2032,2033,2035,2036,2040,2041,549],{},"The current version of each ",[46,2034,1536],{"href":1535}," which anyone can access on the internet, click here to view the live versions of the ",[46,2037,2039],{"href":2038},"\u002F","website"," and ",[46,2042,2023],{"href":2043},"\u002Fhandbook\u002F",[164,2045,2047],{"id":2046},"markup","Markup",[19,2049,2050,2051,1511,2056,2058],{},"A method to add formatting to a document by adding additional characters around content. You can read more on the ",[46,2052,2055],{"href":2053,"rel":2054},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMarkup_language",[108],"Wikipedia article",[46,2057,1787],{"href":1786}," is a Markup format.",[164,2060,1787],{"id":2061},"markdown",[19,2063,1388,2064,2067,2068,2073,2074],{},[46,2065,2047],{"href":2066},"#markup"," language for formatting content in documents. You can read more in this ",[46,2069,2072],{"href":2070,"rel":2071},"https:\u002F\u002Fwww.markdownguide.org\u002F",[108],"guide",". FlowFuse uses Markdown to format content for our website and ",[46,2075,1518],{"href":1517},[164,2077,1536],{"id":2078},"project",[19,2080,2081,2082,549],{},"A collection of documents and content which usually relate to a specific topic. In this guide we are discussing how to edit two FlowFuse Projects, our website and our ",[46,2083,1518],{"href":1517},[164,2085,2087],{"id":2086},"publish","Publish",[19,2089,2090,2091,2093],{},"The action which takes your work on a ",[46,2092,1536],{"href":1535}," and makes it available on the internet for anyone to view.",[164,2095,2097],{"id":2096},"pull-request","Pull-Request",[19,2099,2100,2101,2103,2104,549],{},"A request to have your work from a ",[46,2102,1690],{"href":1689}," Published to ",[46,2105,1510],{"href":1509},[164,2107,1541],{"id":2108},"reviewer",[19,2110,2111],{},"A team member who is going to check your work and provide feedback.",[164,2113,1833],{"id":1862},[19,2115,2116],{},"The process by which a colleague checks and provides feedback on your work.",{"title":75,"searchDepth":76,"depth":76,"links":2118},[2119,2120,2125,2130,2135],{"id":1493,"depth":76,"text":1494},{"id":1555,"depth":76,"text":1556,"children":2121},[2122,2123,2124],{"id":1559,"depth":605,"text":1560},{"id":1613,"depth":605,"text":1614},{"id":1649,"depth":605,"text":1650},{"id":1678,"depth":76,"text":1679,"children":2126},[2127,2128,2129],{"id":1682,"depth":605,"text":1683},{"id":1761,"depth":605,"text":1762},{"id":1802,"depth":605,"text":1803},{"id":1821,"depth":76,"text":1822,"children":2131},[2132,2133,2134],{"id":1825,"depth":605,"text":1826},{"id":1890,"depth":605,"text":1891},{"id":1965,"depth":605,"text":1966},{"id":1972,"depth":76,"text":1548,"children":2136},[2137,2138,2139,2140,2141,2142,2143,2144,2145,2146,2147,2148,2149],{"id":1975,"depth":605,"text":1690},{"id":1992,"depth":605,"text":1798},{"id":2003,"depth":605,"text":1500},{"id":1046,"depth":605,"text":1047},{"id":2023,"depth":605,"text":1518},{"id":2029,"depth":605,"text":1510},{"id":2046,"depth":605,"text":2047},{"id":2061,"depth":605,"text":1787},{"id":2078,"depth":605,"text":1536},{"id":2086,"depth":605,"text":2087},{"id":2096,"depth":605,"text":2097},{"id":2108,"depth":605,"text":1541},{"id":1862,"depth":605,"text":1833},{},"Using Git","\u002Fhandbook\u002Fcompany\u002Fguides\u002Fgit",{"title":1485,"description":75},"handbook\u002Fcompany\u002Fguides\u002Fgit","Z7rHKe7xGPI3bqlj3eseZ0kB7UqjvUyCdalKE9Q7OU8",{"id":2157,"title":2158,"body":2159,"description":75,"extension":81,"meta":2322,"navGroup":83,"navOrder":83,"navTitle":83,"navigation":84,"path":2323,"seo":2324,"stem":2325,"__hash__":2326},"handbook\u002Fhandbook\u002Fcompany\u002Fguides\u002Fgworkspace.md","Google Workspace",{"type":7,"value":2160,"toc":2312},[2161,2164,2168,2171,2175,2184,2198,2206,2210,2214,2217,2221,2224,2238,2241,2258,2262,2265,2268,2279,2282,2286],[10,2162,2158],{"id":2163},"google-workspace",[14,2165,2167],{"id":2166},"overview","Overview",[19,2169,2170],{},"FlowFuse uses Google Workspace for collaboration and productivity tools. Our Google Workspace includes Gmail, Drive, Docs, Sheets, Slides, Meet, Calendar, and other applications that help us work efficiently as a team.",[14,2172,2174],{"id":2173},"sharing-work","Sharing Work",[19,2176,2177,2178,2183],{},"At FlowFuse, we believe that work should be ",[46,2179,2182],{"href":2180,"rel":2181},"https:\u002F\u002Fflowfuse.com\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fdata-management\u002F",[108],"shared and accessible to all team members by default",". This transparency helps us:",[144,2185,2186,2189,2192,2195],{},[147,2187,2188],{},"Collaborate more effectively",[147,2190,2191],{},"Reduce duplication of effort",[147,2193,2194],{},"Ensure institutional knowledge is preserved",[147,2196,2197],{},"Enable asynchronous work across time zones",[19,2199,2200,2201,2205],{},"Therefore, when saving your work, default to putting it in the shared Google Drive in the correct location. If storing your work with a wide audience isn't in accordance with our ",[46,2202,2204],{"href":2180,"rel":2203},[108],"data management policy",", keep it in your private Google Drive.",[14,2207,2209],{"id":2208},"proper-document-storage","Proper Document Storage",[164,2211,2213],{"id":2212},"shared-drive-vs-personal-drive","Shared Drive vs. Personal Drive",[19,2215,2216],{},"When you create a new Google Doc, Sheet, or Slide, by default it is saved in \"My Drive\" - your personal Google Drive space. While this is fine for personal drafts or notes, any work that may be valuable to others in the company should be moved to the appropriate shared folder.",[164,2218,2220],{"id":2219},"how-to-move-files-to-a-shared-folder","How to Move Files to a Shared Folder",[19,2222,2223],{},"When you create a new document that should be shared with the team:",[504,2225,2226,2229,2232,2235],{},[147,2227,2228],{},"Open the document in Google Docs\u002FSheets\u002FSlides",[147,2230,2231],{},"Click on the folder icon near the document name at the top of the page",[147,2233,2234],{},"In the \"Move item\" dialog box, navigate to the appropriate shared folder.",[147,2236,2237],{},"Select the destination folder and click \"Move\"",[19,2239,2240],{},"Alternatively:",[504,2242,2243,2246,2249,2252,2255],{},[147,2244,2245],{},"Go to drive.google.com",[147,2247,2248],{},"Find the file you want to move",[147,2250,2251],{},"Right-click on the file and select \"Move to\"",[147,2253,2254],{},"Navigate to the appropriate shared folder",[147,2256,2257],{},"Click \"Move here\"",[164,2259,2261],{"id":2260},"access-permissions","Access Permissions",[19,2263,2264],{},"By storing your documents in the shared drive, you ensure they have the correct default permissions. However, there may be times when you need to adjust sharing settings.",[19,2266,2267],{},"To change permission settings:",[504,2269,2270,2273,2276],{},[147,2271,2272],{},"Open the file",[147,2274,2275],{},"Click the \"Share\" button in the top-right",[147,2277,2278],{},"Adjust permissions as needed",[19,2280,2281],{},"For sensitive documents, please use the principle of least privilege - only grant access to those who need it.",[14,2283,2285],{"id":2284},"best-practices","Best Practices",[144,2287,2288,2294,2300,2306],{},[147,2289,2290,2293],{},[423,2291,2292],{},"Use descriptive file names"," that clearly indicate the content and purpose",[147,2295,2296,2299],{},[423,2297,2298],{},"Include dates in file names"," for documents that are updated periodically",[147,2301,2302,2305],{},[423,2303,2304],{},"Create and use templates"," for recurring document types",[147,2307,2308,2311],{},[423,2309,2310],{},"Comment instead of editing"," when suggesting changes to others' work",{"title":75,"searchDepth":76,"depth":76,"links":2313},[2314,2315,2316,2321],{"id":2166,"depth":76,"text":2167},{"id":2173,"depth":76,"text":2174},{"id":2208,"depth":76,"text":2209,"children":2317},[2318,2319,2320],{"id":2212,"depth":605,"text":2213},{"id":2219,"depth":605,"text":2220},{"id":2260,"depth":605,"text":2261},{"id":2284,"depth":76,"text":2285},{},"\u002Fhandbook\u002Fcompany\u002Fguides\u002Fgworkspace",{"title":2158,"description":75},"handbook\u002Fcompany\u002Fguides\u002Fgworkspace","8KPuPPYmaC3FV6IqIdgNrQJNsaLJUlmDXeQ1-OT-ce4",{"id":2328,"title":2329,"body":2330,"description":2337,"extension":81,"meta":2361,"navGroup":83,"navOrder":83,"navTitle":2329,"navigation":84,"path":2362,"seo":2363,"stem":2364,"__hash__":2365},"handbook\u002Fhandbook\u002Fcompany\u002Fguides\u002Findex.md","Guides",{"type":7,"value":2331,"toc":2359},[2332,2335,2338],[10,2333,2329],{"id":2334},"guides",[19,2336,2337],{},"A collection of guides for some of things that are foundational to working at\nFlowFuse",[144,2339,2340,2346,2353],{},[147,2341,2342,2345],{},[46,2343,2344],{"href":2152},"Git Intro"," - get started with Git",[147,2347,2348,2352],{},[46,2349,2351],{"href":2350},"\u002Fhandbook\u002Fcompany\u002Fguides\u002Fmarkdown","Markdown Guide"," - a quick primer for Markdown",[147,2354,2355,2358],{},[46,2356,2357],{"href":2323},"Google Workspace Guide"," - overview of working with Google Workspace and best practices for sharing and storing files",{"title":75,"searchDepth":76,"depth":76,"links":2360},[],{},"\u002Fhandbook\u002Fcompany\u002Fguides",{"title":2329,"description":2337},"handbook\u002Fcompany\u002Fguides\u002Findex","B3Qdj0ixeeKXV9QhxXcj0vU2RXmNFedcK2bC-KeKtTk",{"id":2367,"title":2351,"body":2368,"description":2375,"extension":81,"meta":2811,"navGroup":83,"navOrder":83,"navTitle":2351,"navigation":84,"path":2350,"seo":2812,"stem":2813,"__hash__":2814},"handbook\u002Fhandbook\u002Fcompany\u002Fguides\u002Fmarkdown.md",{"type":7,"value":2369,"toc":2799},[2370,2373,2376,2392,2396,2427,2431,2434,2437,2475,2479,2487,2507,2511,2518,2538,2541,2547,2555,2559,2565,2575,2578,2583,2593,2597,2604,2626,2630,2637,2667,2671,2677,2687,2691,2698,2714,2717,2723,2741,2744,2769,2795],[10,2371,2351],{"id":2372},"markdown-guide",[19,2374,2375],{},"This is a very short reference guide for those trying to write Markdown. For more\ncomprehensive guides, we recommend looking at:",[144,2377,2378,2385],{},[147,2379,2380],{},[46,2381,2384],{"href":2382,"rel":2383},"https:\u002F\u002Fwww.markdownguide.org\u002Fcheat-sheet\u002F",[108],"Markdown Guide's Cheat Sheet",[147,2386,2387],{},[46,2388,2391],{"href":2389,"rel":2390},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fget-started\u002Fwriting-on-github\u002Fgetting-started-with-writing-and-formatting-on-github\u002Fbasic-writing-and-formatting-syntax",[108],"GitHub's Getting Started with Markdown Guide",[14,2393,2395],{"id":2394},"header","Header",[557,2397,2400],{"className":2398,"code":2399,"language":81,"meta":75,"style":75},"language-md shiki shiki-themes github-light github-dark","# First-Tier Header\n## Second-Tier Header\n### Third-Tier Header\n#### Fourth-Tier Header\n",[542,2401,2402,2411,2416,2421],{"__ignoreMap":75},[2403,2404,2407],"span",{"class":2405,"line":2406},"line",1,[2403,2408,2410],{"class":2409},"sq-ep","# First-Tier Header\n",[2403,2412,2413],{"class":2405,"line":76},[2403,2414,2415],{"class":2409},"## Second-Tier Header\n",[2403,2417,2418],{"class":2405,"line":605},[2403,2419,2420],{"class":2409},"### Third-Tier Header\n",[2403,2422,2424],{"class":2405,"line":2423},4,[2403,2425,2426],{"class":2409},"#### Fourth-Tier Header\n",[14,2428,2430],{"id":2429},"paragraph","Paragraph",[19,2432,2433],{},"Hello There, this is a paragraph that is split over\nmultiple lines in the source, but displays as a single\nformatted paragraph.",[19,2435,2436],{},"To start a new paragraph, we separate it with a blank line\nfrom the previous paragraph.",[557,2438,2440],{"className":2398,"code":2439,"language":81,"meta":75,"style":75},"Hello There, this is a paragraph that is split over\nmultiple lines in the source, but displays as a single\nformatted paragraph.\n\nTo start a new paragraph, we separate it with a blank line\nfrom the previous paragraph.\n",[542,2441,2442,2448,2453,2458,2463,2469],{"__ignoreMap":75},[2403,2443,2444],{"class":2405,"line":2406},[2403,2445,2447],{"class":2446},"sVt8B","Hello There, this is a paragraph that is split over\n",[2403,2449,2450],{"class":2405,"line":76},[2403,2451,2452],{"class":2446},"multiple lines in the source, but displays as a single\n",[2403,2454,2455],{"class":2405,"line":605},[2403,2456,2457],{"class":2446},"formatted paragraph.\n",[2403,2459,2460],{"class":2405,"line":2423},[2403,2461,2462],{"emptyLinePlaceholder":84},"\n",[2403,2464,2466],{"class":2405,"line":2465},5,[2403,2467,2468],{"class":2446},"To start a new paragraph, we separate it with a blank line\n",[2403,2470,2472],{"class":2405,"line":2471},6,[2403,2473,2474],{"class":2446},"from the previous paragraph.\n",[14,2476,2478],{"id":2477},"list-bullet-points","List - Bullet Points",[144,2480,2481,2484],{},[147,2482,2483],{},"this is a bullet point list",[147,2485,2486],{},"this is another item in the list",[557,2488,2490],{"className":2398,"code":2489,"language":81,"meta":75,"style":75},"- this is a bullet point list\n- this is another item in the list\n",[542,2491,2492,2500],{"__ignoreMap":75},[2403,2493,2494,2497],{"class":2405,"line":2406},[2403,2495,1125],{"class":2496},"s4XuR",[2403,2498,2499],{"class":2446}," this is a bullet point list\n",[2403,2501,2502,2504],{"class":2405,"line":76},[2403,2503,1125],{"class":2496},[2403,2505,2506],{"class":2446}," this is another item in the list\n",[14,2508,2510],{"id":2509},"list-numbered","List - Numbered",[504,2512,2513,2516],{},[147,2514,2515],{},"this is a numbered list",[147,2517,2486],{},[557,2519,2521],{"className":2398,"code":2520,"language":81,"meta":75,"style":75},"1. this is a numbered list\n2. this is another item in the list\n",[542,2522,2523,2531],{"__ignoreMap":75},[2403,2524,2525,2528],{"class":2405,"line":2406},[2403,2526,2527],{"class":2496},"1.",[2403,2529,2530],{"class":2446}," this is a numbered list\n",[2403,2532,2533,2536],{"class":2405,"line":76},[2403,2534,2535],{"class":2496},"2.",[2403,2537,2506],{"class":2446},[19,2539,2540],{},"To prevent reordering and keeping count, Markdown allows you to use non-sequential numbers:",[557,2542,2545],{"className":2543,"code":2544,"language":562},[560],"1. Item one\n1. Item two\n",[542,2546,2544],{"__ignoreMap":75},[504,2548,2549,2552],{},[147,2550,2551],{},"Item one",[147,2553,2554],{},"Item two",[14,2556,2558],{"id":2557},"text-format-italic","Text Format - Italic",[19,2560,2561],{},[2562,2563,2564],"em",{},"this will be italic",[557,2566,2568],{"className":2398,"code":2567,"language":81,"meta":75,"style":75},"*this will be italic*\n",[542,2569,2570],{"__ignoreMap":75},[2403,2571,2572],{"class":2405,"line":2406},[2403,2573,2567],{"class":2574},"s5osK",[14,2576,2558],{"id":2577},"text-format-italic-1",[19,2579,2580],{},[423,2581,2582],{},"this will be bold",[557,2584,2586],{"className":2398,"code":2585,"language":81,"meta":75,"style":75},"**this will be bold**\n",[542,2587,2588],{"__ignoreMap":75},[2403,2589,2590],{"class":2405,"line":2406},[2403,2591,2585],{"class":2592},"sIZ1i",[14,2594,2596],{"id":2595},"links","Links",[19,2598,2599],{},[46,2600,2603],{"href":2601,"rel":2602},"http:\u002F\u002Fexample.com\u002F",[108],"this will be a link",[557,2605,2607],{"className":2398,"code":2606,"language":81,"meta":75,"style":75},"[this will be a link](http:\u002F\u002Fexample.com\u002F)\n",[542,2608,2609],{"__ignoreMap":75},[2403,2610,2611,2614,2617,2620,2623],{"class":2405,"line":2406},[2403,2612,2613],{"class":2446},"[",[2403,2615,2603],{"class":2616},"svl0z",[2403,2618,2619],{"class":2446},"](",[2403,2621,2601],{"class":2622},"s2frl",[2403,2624,2625],{"class":2446},")\n",[14,2627,2629],{"id":2628},"images","Images",[19,2631,2632,2633,2636],{},"A picture speaks a thousand words, to include an image in your content it's like a link\nbut with an ",[542,2634,2635],{},"!"," in front of it.",[557,2638,2640],{"className":2398,"code":2639,"language":81,"meta":75,"style":75},"![Image Name](image.jpg \"alt text when you hover the image\")\n",[542,2641,2642],{"__ignoreMap":75},[2403,2643,2644,2647,2650,2652,2655,2659,2662,2665],{"class":2405,"line":2406},[2403,2645,2646],{"class":2446},"![",[2403,2648,2649],{"class":2616},"Image Name",[2403,2651,2619],{"class":2446},[2403,2653,2654],{"class":2622},"image.jpg",[2403,2656,2658],{"class":2657},"s1zC7"," \"",[2403,2660,2661],{"class":2616},"alt text when you hover the image",[2403,2663,2664],{"class":2657},"\"",[2403,2666,2625],{"class":2446},[14,2668,2670],{"id":2669},"quoting","Quoting",[2672,2673,2674],"blockquote",{},[19,2675,2676],{},"this will quote some text",[557,2678,2680],{"className":2398,"code":2679,"language":81,"meta":75,"style":75},"> this will quote some text\n",[542,2681,2682],{"__ignoreMap":75},[2403,2683,2684],{"class":2405,"line":2406},[2403,2685,2679],{"class":2686},"s9eBZ",[14,2688,2690],{"id":2689},"code-example","Code Example",[19,2692,2693,2694,2697],{},"For ",[542,2695,2696],{},"inline"," quoting, use single backticks:",[557,2699,2701],{"className":2398,"code":2700,"language":81,"meta":75,"style":75},"For `inline` quoting, use single backticks.\n",[542,2702,2703],{"__ignoreMap":75},[2403,2704,2705,2707,2711],{"class":2405,"line":2406},[2403,2706,2693],{"class":2446},[2403,2708,2710],{"class":2709},"sj4cs","`inline`",[2403,2712,2713],{"class":2446}," quoting, use single backticks.\n",[19,2715,2716],{},"For block quotes, use triple backticks:",[557,2718,2721],{"className":2719,"code":2720,"language":562},[560],"this will write the content as if it is code\n",[542,2722,2720],{"__ignoreMap":75},[557,2724,2726],{"className":2398,"code":2725,"language":81,"meta":75,"style":75},"```\nthis will write the content as if it is code\n```\n",[542,2727,2728,2733,2737],{"__ignoreMap":75},[2403,2729,2730],{"class":2405,"line":2406},[2403,2731,2732],{"class":2446},"```\n",[2403,2734,2735],{"class":2405,"line":76},[2403,2736,2720],{"class":2446},[2403,2738,2739],{"class":2405,"line":605},[2403,2740,2732],{"class":2446},[19,2742,2743],{},"Add syntax highlighting by defining the language, for example:",[557,2745,2749],{"className":2746,"code":2747,"language":2748,"meta":75,"style":75},"language-js shiki shiki-themes github-light github-dark","console.log(\"Hello, world!\")\n","js",[542,2750,2751],{"__ignoreMap":75},[2403,2752,2753,2756,2760,2763,2767],{"class":2405,"line":2406},[2403,2754,2755],{"class":2446},"console.",[2403,2757,2759],{"class":2758},"sScJk","log",[2403,2761,2762],{"class":2446},"(",[2403,2764,2766],{"class":2765},"sZZnC","\"Hello, world!\"",[2403,2768,2625],{"class":2446},[557,2770,2772],{"className":2398,"code":2771,"language":81,"meta":75,"style":75},"```js\nconsole.log(\"Hello, world!\")\n```\n",[542,2773,2774,2779,2791],{"__ignoreMap":75},[2403,2775,2776],{"class":2405,"line":2406},[2403,2777,2778],{"class":2446},"```js\n",[2403,2780,2781,2783,2785,2787,2789],{"class":2405,"line":76},[2403,2782,2755],{"class":2446},[2403,2784,2759],{"class":2758},[2403,2786,2762],{"class":2446},[2403,2788,2766],{"class":2765},[2403,2790,2625],{"class":2446},[2403,2792,2793],{"class":2405,"line":605},[2403,2794,2732],{"class":2446},[2796,2797,2798],"style",{},"html pre.shiki code .sq-ep, html code.shiki .sq-ep{--shiki-default:#005CC5;--shiki-default-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .s5osK, html code.shiki .s5osK{--shiki-default:#24292E;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:italic}html pre.shiki code .sIZ1i, html code.shiki .sIZ1i{--shiki-default:#24292E;--shiki-default-font-weight:bold;--shiki-dark:#E1E4E8;--shiki-dark-font-weight:bold}html pre.shiki code .svl0z, html code.shiki .svl0z{--shiki-default:#032F62;--shiki-default-text-decoration:underline;--shiki-dark:#DBEDFF;--shiki-dark-text-decoration:underline}html pre.shiki code .s2frl, html code.shiki .s2frl{--shiki-default:#24292E;--shiki-default-text-decoration:underline;--shiki-dark:#E1E4E8;--shiki-dark-text-decoration:underline}html pre.shiki code .s1zC7, html code.shiki .s1zC7{--shiki-default:#032F62;--shiki-default-text-decoration:underline;--shiki-dark:#9ECBFF;--shiki-dark-text-decoration:underline}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":75,"searchDepth":76,"depth":76,"links":2800},[2801,2802,2803,2804,2805,2806,2807,2808,2809,2810],{"id":2394,"depth":76,"text":2395},{"id":2429,"depth":76,"text":2430},{"id":2477,"depth":76,"text":2478},{"id":2509,"depth":76,"text":2510},{"id":2557,"depth":76,"text":2558},{"id":2577,"depth":76,"text":2558},{"id":2595,"depth":76,"text":2596},{"id":2628,"depth":76,"text":2629},{"id":2669,"depth":76,"text":2670},{"id":2689,"depth":76,"text":2690},{},{"title":2351,"description":2375},"handbook\u002Fcompany\u002Fguides\u002Fmarkdown","fij-gZrSV_Aon6D-nz2mNOFafSeFeU57AaMnGL3FEls",{"id":2816,"title":2817,"body":2818,"description":2825,"extension":81,"meta":3028,"navGroup":2817,"navOrder":83,"navTitle":2817,"navigation":84,"path":3029,"seo":3030,"stem":3031,"__hash__":3032},"handbook\u002Fhandbook\u002Fcompany\u002Findex.md","Company",{"type":7,"value":2819,"toc":3016},[2820,2823,2826,2917,2921,2925,2932,2938,2942,2950,2954,2962,2973,2977,2983,2987,2990,2994,3002,3006,3009,3013],[10,2821,2817],{"id":2822},"company",[19,2824,2825],{},"The company sections in the handbook describes how the company as a whole works,\nand contains department agnostic details.",[910,2827,2828,2836],{},[913,2829,2830],{},[916,2831,2832,2834],{},[919,2833],{},[919,2835],{},[930,2837,2838,2849,2859,2870,2879,2890,2898,2908],{},[916,2839,2840,2846],{},[935,2841,2842],{},[46,2843,2845],{"href":2844},"\u002Fhandbook\u002Fcompany\u002Fvalues\u002F","Values",[935,2847,2848],{},"The core values that guide the company and how we work",[916,2850,2851,2856],{},[935,2852,2853],{},[46,2854,623],{"href":2855},"\u002Fhandbook\u002Fcompany\u002Fcommunication\u002F",[935,2857,2858],{},"How we communicate and keep everyone informed",[916,2860,2861,2867],{},[935,2862,2863],{},[46,2864,2866],{"href":2865},"\u002Fhandbook\u002Fcompany\u002Fdecisions\u002F","Decisions",[935,2868,2869],{},"Decision making in an async ready fashion is harder than in person, learn how FlowFuse does it",[916,2871,2872,2876],{},[935,2873,2874],{},[46,2875,92],{"href":56},[935,2877,2878],{},"Board meetings, and how they work for us",[916,2880,2881,2887],{},[935,2882,2883],{},[46,2884,2886],{"href":2885},"\u002Fhandbook\u002Fcompany\u002Forganizational-structure","Organizational Structure",[935,2888,2889],{},"Company org chart and reporting relationships",[916,2891,2892,2896],{},[935,2893,2894],{},[46,2895,5],{"href":85},[935,2897],{},[916,2899,2900,2906],{},[935,2901,2902],{},[46,2903,2905],{"href":2904},"\u002Fhandbook\u002Fcompany\u002Fremote","Remote work",[935,2907],{},[916,2909,2910,2915],{},[935,2911,2912],{},[46,2913,2914],{"href":61},"Security",[935,2916],{},[14,2918,2920],{"id":2919},"legal-details","Legal details",[164,2922,2924],{"id":2923},"mailing-address","Mailing address",[19,2926,2927,2928,549],{},"As a registering company we have to provide our address to customers and suppliers when they specifically request that information. For all day to day communications we should make it clear that by far the most practical way to contact us is via ",[46,2929,2931],{"href":2930},"mailto:support@flowfuse.com","support@flowfuse.com",[557,2933,2936],{"className":2934,"code":2935,"language":562},[560],"FlowFuse Inc\n548 Market St\nPMB 24889\nSan Francisco, California 94104-5401 US\n",[542,2937,2935],{"__ignoreMap":75},[164,2939,2941],{"id":2940},"official-name-change-incorporation-document","Official Name Change & Incorporation Document",[19,2943,2944,2949],{},[46,2945,2948],{"href":2946,"rel":2947},"https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1cnHv1K8VxKeq8YuRaUpczO9c8ilm6kHZ\u002Fview?usp=drive_link",[108],"Here's"," the official document detailing the transition from Flowforge to Flowfuse and the company's incorporation as a Delaware Corporation.",[164,2951,2953],{"id":2952},"banking-details","Banking details",[19,2955,2956,2957,549],{},"For larger customers with internal processes requiring our bank details, they can wire the money to the company's\nchecking account. Wiring instructions to be shared by the rep are found in\n",[46,2958,2961],{"href":2959,"rel":2960},"https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1B68cgaut2zdpEx6EfuBTJYMU36f8pYqH\u002Fview?usp=drive_link",[108],"our internal drive",[144,2963,2964],{},[147,2965,2966,2967,2972],{},"If a vendor is sending money back to our account in any other currency than USD, we should find the necessary currency information from this ",[46,2968,2971],{"href":2969,"rel":2970},"https:\u002F\u002Fwww.svb.com\u002Fincoming-wire-payment\u002F",[108],"link"," and share it with them.",[164,2974,2976],{"id":2975},"dun-bradstreet","Dun & Bradstreet",[19,2978,2979,2980],{},"FlowFuse's Dun (DUNS number) and Bradstreet ID is: ",[542,2981,2982],{},"11-899-4742",[164,2984,2986],{"id":2985},"naics-code","NAICS code",[19,2988,2989],{},"541512 - Computer Systems Design and Related Services",[164,2991,2993],{"id":2992},"soc2-type-2-report","SOC2 Type 2 report",[19,2995,2996,2997,549],{},"Our 2025, and at this time latest, SOC2 Type 2 report can be found ",[46,2998,3001],{"href":2999,"rel":3000},"https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1uBzNvSMaJXZLA24bjJmoDO8mOoUdZG4t\u002Fview?usp=sharing",[108],"on our internal Google Drive",[164,3003,3005],{"id":3004},"tax-id","Tax ID",[19,3007,3008],{},"FlowFuse's tax ID (Employer Identification Number or EIN) is in the Finance vault in 1Password. Ask the CEO for our Federal EIN.\nAsk the CEO for Federal EIN",[164,3010,3012],{"id":3011},"companies-ultimate-beneficiaries","Companies Ultimate Beneficiaries",[19,3014,3015],{},"FlowFuse's Ultimate Beneficiaries is in the Company Info vault in 1Password. Ask the CEO for our Ultimate Beneficiaries list.",{"title":75,"searchDepth":76,"depth":76,"links":3017},[3018],{"id":2919,"depth":76,"text":2920,"children":3019},[3020,3021,3022,3023,3024,3025,3026,3027],{"id":2923,"depth":605,"text":2924},{"id":2940,"depth":605,"text":2941},{"id":2952,"depth":605,"text":2953},{"id":2975,"depth":605,"text":2976},{"id":2985,"depth":605,"text":2986},{"id":2992,"depth":605,"text":2993},{"id":3004,"depth":605,"text":3005},{"id":3011,"depth":605,"text":3012},{},"\u002Fhandbook\u002Fcompany",{"title":2817,"description":2825},"handbook\u002Fcompany\u002Findex","MNqS9W7znGQ65aSK6rAfHRX5LBDlay7fn0zyd8Iu7_s",{"id":3034,"title":2886,"body":3035,"description":3042,"extension":81,"meta":3293,"navGroup":83,"navOrder":83,"navTitle":2886,"navigation":84,"path":2885,"seo":3295,"stem":3296,"__hash__":3297},"handbook\u002Fhandbook\u002Fcompany\u002Forganizational-structure.md",{"type":7,"value":3036,"toc":3286},[3037,3040,3043,3047,3205,3209,3220,3224,3227,3242,3255,3258,3265,3273,3283],[10,3038,2886],{"id":3039},"organizational-structure",[19,3041,3042],{},"This page provides an overview of FlowFuse's organizational structure and reporting relationships.",[14,3044,3046],{"id":3045},"organization-chart","Organization Chart",[557,3048,3052],{"className":3049,"code":3050,"language":3051,"meta":75,"style":75},"language-mermaid shiki shiki-themes github-light github-dark","graph TD\n    Board[Board of Directors]\n{% for member in team | dictsortBy(false, 'order') %}\n    {% set nodeId = member.name | replace(\" \", \"\") | replace(\"'\", \"\") | replace(\"-\", \"\") %}\n    {% if not member.reports_to %}\n        {{ nodeId }}[{{ member.name }}\u003Cbr\u002F>{{ member.title }}]\n        Board --> {{ nodeId }}\n    {% endif %}\n{% endfor %}\n{% for member in team | dictsortBy(false, 'order') %}\n    {% if member.reports_to %}\n        {% set nodeId = member.name | replace(\" \", \"\") | replace(\"'\", \"\") | replace(\"-\", \"\") %}\n        {% set managerId = member.reports_to | replace(\" \", \"\") | replace(\"'\", \"\") | replace(\"-\", \"\") %}\n        {{ nodeId }}[{{ member.name }}\u003Cbr\u002F>{{ member.title }}]\n        {{ managerId }} --> {{ nodeId }}\n    {% endif %}\n{% endfor %}\n    classDef executive fill:#EFF6FF,stroke:#60A5FA,stroke-width:2px,rx:6,ry:6\n    classDef head fill:#EEF2FF,stroke:#818CF8,stroke-width:2px,rx:6,ry:6\n    classDef employee fill:#F3F4F6,stroke:#9CA3AF,stroke-width:1px,rx:6,ry:6\n    classDef board fill:#FFEFEA,stroke:#FA9170,stroke-width:2px,rx:6,ry:6\n\n    class Board board\n{% for member in team | dictsortBy(false, 'order') %}{% set nodeId = member.name | replace(\" \", \"\") | replace(\"'\", \"\") | replace(\"-\", \"\") %}{% if not member.reports_to %}    class {{ nodeId }} executive\n{% elif member.title == \"CTO\" or member.title == \"Engineering Manager\" or member.title == \"VP of Sales\" or member.title == \"Product Marketing Manager\" or member.title == \"Director of Product\" %}    class {{ nodeId }} head\n{% else %}    class {{ nodeId }} employee\n{% endif %}{% endfor %}\n","mermaid",[542,3053,3054,3059,3064,3069,3074,3079,3084,3090,3096,3102,3107,3113,3119,3125,3130,3136,3141,3146,3152,3158,3164,3170,3175,3181,3187,3193,3199],{"__ignoreMap":75},[2403,3055,3056],{"class":2405,"line":2406},[2403,3057,3058],{},"graph TD\n",[2403,3060,3061],{"class":2405,"line":76},[2403,3062,3063],{},"    Board[Board of Directors]\n",[2403,3065,3066],{"class":2405,"line":605},[2403,3067,3068],{},"{% for member in team | dictsortBy(false, 'order') %}\n",[2403,3070,3071],{"class":2405,"line":2423},[2403,3072,3073],{},"    {% set nodeId = member.name | replace(\" \", \"\") | replace(\"'\", \"\") | replace(\"-\", \"\") %}\n",[2403,3075,3076],{"class":2405,"line":2465},[2403,3077,3078],{},"    {% if not member.reports_to %}\n",[2403,3080,3081],{"class":2405,"line":2471},[2403,3082,3083],{},"        {{ nodeId }}[{{ member.name }}\u003Cbr\u002F>{{ member.title }}]\n",[2403,3085,3087],{"class":2405,"line":3086},7,[2403,3088,3089],{},"        Board --> {{ nodeId }}\n",[2403,3091,3093],{"class":2405,"line":3092},8,[2403,3094,3095],{},"    {% endif %}\n",[2403,3097,3099],{"class":2405,"line":3098},9,[2403,3100,3101],{},"{% endfor %}\n",[2403,3103,3105],{"class":2405,"line":3104},10,[2403,3106,3068],{},[2403,3108,3110],{"class":2405,"line":3109},11,[2403,3111,3112],{},"    {% if member.reports_to %}\n",[2403,3114,3116],{"class":2405,"line":3115},12,[2403,3117,3118],{},"        {% set nodeId = member.name | replace(\" \", \"\") | replace(\"'\", \"\") | replace(\"-\", \"\") %}\n",[2403,3120,3122],{"class":2405,"line":3121},13,[2403,3123,3124],{},"        {% set managerId = member.reports_to | replace(\" \", \"\") | replace(\"'\", \"\") | replace(\"-\", \"\") %}\n",[2403,3126,3128],{"class":2405,"line":3127},14,[2403,3129,3083],{},[2403,3131,3133],{"class":2405,"line":3132},15,[2403,3134,3135],{},"        {{ managerId }} --> {{ nodeId }}\n",[2403,3137,3139],{"class":2405,"line":3138},16,[2403,3140,3095],{},[2403,3142,3144],{"class":2405,"line":3143},17,[2403,3145,3101],{},[2403,3147,3149],{"class":2405,"line":3148},18,[2403,3150,3151],{},"    classDef executive fill:#EFF6FF,stroke:#60A5FA,stroke-width:2px,rx:6,ry:6\n",[2403,3153,3155],{"class":2405,"line":3154},19,[2403,3156,3157],{},"    classDef head fill:#EEF2FF,stroke:#818CF8,stroke-width:2px,rx:6,ry:6\n",[2403,3159,3161],{"class":2405,"line":3160},20,[2403,3162,3163],{},"    classDef employee fill:#F3F4F6,stroke:#9CA3AF,stroke-width:1px,rx:6,ry:6\n",[2403,3165,3167],{"class":2405,"line":3166},21,[2403,3168,3169],{},"    classDef board fill:#FFEFEA,stroke:#FA9170,stroke-width:2px,rx:6,ry:6\n",[2403,3171,3173],{"class":2405,"line":3172},22,[2403,3174,2462],{"emptyLinePlaceholder":84},[2403,3176,3178],{"class":2405,"line":3177},23,[2403,3179,3180],{},"    class Board board\n",[2403,3182,3184],{"class":2405,"line":3183},24,[2403,3185,3186],{},"{% for member in team | dictsortBy(false, 'order') %}{% set nodeId = member.name | replace(\" \", \"\") | replace(\"'\", \"\") | replace(\"-\", \"\") %}{% if not member.reports_to %}    class {{ nodeId }} executive\n",[2403,3188,3190],{"class":2405,"line":3189},25,[2403,3191,3192],{},"{% elif member.title == \"CTO\" or member.title == \"Engineering Manager\" or member.title == \"VP of Sales\" or member.title == \"Product Marketing Manager\" or member.title == \"Director of Product\" %}    class {{ nodeId }} head\n",[2403,3194,3196],{"class":2405,"line":3195},26,[2403,3197,3198],{},"{% else %}    class {{ nodeId }} employee\n",[2403,3200,3202],{"class":2405,"line":3201},27,[2403,3203,3204],{},"{% endif %}{% endfor %}\n",[14,3206,3208],{"id":3207},"reporting-structure","Reporting Structure",[19,3210,3211,3212,3215,3216,3219],{},"The organizational structure is automatically generated from team member data files located in ",[542,3213,3214],{},"src\u002F_data\u002Fteam\u002F",". Each team member's JSON file includes a ",[542,3217,3218],{},"reports_to"," field that indicates their direct manager.",[164,3221,3223],{"id":3222},"executive-leadership","Executive Leadership",[19,3225,3226],{},"The CEO reports to the Board of Directors.",[19,3228,3229,3230,3232,3233,3237,3238,3241],{},"{% set ceo = null %}{% for member in team | dictsortBy(false, 'order') %}{% if not member.reports_to %}{% set ceo = member %}{% endif %}{% endfor %}\n{% set directReports = ",[2403,3231],{}," %}{% for member in team | dictsortBy(false, 'order') %}{% if member.reports_to == ceo.name %}{% set directReports = (directReports.push(member), directReports) %}{% endif %}{% endfor %}\nDirect reports to ",[3234,3235],"binding",{"value":3236},"ceo.name"," (",[3234,3239],{"value":3240},"ceo.title","):\n{% for member in team | dictsortBy(false, 'order') %}{% if member.reports_to == ceo.name %}",[144,3243,3244],{},[147,3245,3246,3237,3251,3254],{},[423,3247,3248],{},[3234,3249],{"value":3250},"member.name",[3234,3252],{"value":3253},"member.title","){% endif %}{% endfor %}",[19,3256,3257],{},"{% for manager in team | dictsortBy(false, 'order') %}{% set hasReports = false %}{% for member in team %}{% if member.reports_to == manager.name %}{% set hasReports = true %}{% endif %}{% endfor %}{% if hasReports and manager.reports_to %}",[164,3259,3261,3264],{"id":3260},"s-team",[3234,3262],{"value":3263},"manager.name","'s Team",[19,3266,3267,3237,3269,3272],{},[3234,3268],{"value":3263},[3234,3270],{"value":3271},"manager.title",") has the following direct reports:\n{% for member in team | dictsortBy(false, 'order') %}{% if member.reports_to == manager.name %}",[144,3274,3275],{},[147,3276,3277,3279,3280,3282],{},[3234,3278],{"value":3250}," - ",[3234,3281],{"value":3253},"{% endif %}{% endfor %}\n{% endif %}{% endfor %}",[2796,3284,3285],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":75,"searchDepth":76,"depth":76,"links":3287},[3288,3289],{"id":3045,"depth":76,"text":3046},{"id":3207,"depth":76,"text":3208,"children":3290},[3291,3292],{"id":3222,"depth":605,"text":3223},{"id":3260,"depth":605,"text":3264},{"templateEngineOverride":3294},"njk,md",{"title":2886,"description":3042},"handbook\u002Fcompany\u002Forganizational-structure","JMRi-qyIgLri5F1FRFJWn4kqD6Qw0fhhe83pGaapoCA",{"id":4,"title":5,"body":3299,"description":75,"extension":81,"meta":3338,"navGroup":83,"navOrder":83,"navTitle":83,"navigation":84,"path":85,"seo":3339,"stem":87,"__hash__":88},{"type":7,"value":3300,"toc":3333},[3301,3303,3305,3307,3309,3311,3313,3315,3317,3319,3323],[10,3302,5],{"id":12},[14,3304,17],{"id":16},[19,3306,21],{},[14,3308,25],{"id":24},[19,3310,28],{},[19,3312,31],{},[14,3314,35],{"id":34},[19,3316,38],{},[19,3318,41],{},[19,3320,44,3321,50],{},[46,3322,49],{"href":48},[19,3324,53,3325,58,3327,63,3329,68,3331,73],{},[46,3326,57],{"href":56},[46,3328,62],{"href":61},[46,3330,67],{"href":66},[46,3332,72],{"href":71},{"title":75,"searchDepth":76,"depth":76,"links":3334},[3335,3336,3337],{"id":16,"depth":76,"text":17},{"id":24,"depth":76,"text":25},{"id":34,"depth":76,"text":35},{},{"title":5,"description":75},{"id":3341,"title":3342,"body":3343,"description":3350,"extension":81,"meta":3376,"navGroup":83,"navOrder":83,"navTitle":3342,"navigation":84,"path":2904,"seo":3377,"stem":3378,"__hash__":3379},"handbook\u002Fhandbook\u002Fcompany\u002Fremote.md","Remote Work",{"type":7,"value":3344,"toc":3372},[3345,3348,3351,3355,3362,3366,3369],[10,3346,3342],{"id":3347},"remote-work",[19,3349,3350],{},"FlowFuse is fully remote and our team spans multiple countries and timezones.\nWorking remotely can require some changes.",[14,3352,3354],{"id":3353},"working-from-a-coworking-space","Working from a Coworking space",[19,3356,3357,3358,549],{},"Not everyone wants to sit at home during work, it's recommended to work at least\none day a week outside of home. To accommodate this, you can\n",[46,3359,3361],{"href":3360},"\u002Fhandbook\u002Fpeopleops\u002Fexpenses#coworking-space-allowance","expense a coworking space",[14,3363,3365],{"id":3364},"separating-work-from-private-life","Separating work from private life",[19,3367,3368],{},"It's advised to separate work and private life as much as possible. Now there's\nless of a physical barrier, it's more important to create this barrier on the\ndigital world. Turn off notification outside of your intended working hours for\nemail, Slack, and GitHub where possible.",[19,3370,3371],{},"While FlowFuse allows you to use your work devices for private purposes, this\nis another venue to explore. It might work out better to have a private devices\nwithout any work related data to have access to work when not working.",{"title":75,"searchDepth":76,"depth":76,"links":3373},[3374,3375],{"id":3353,"depth":76,"text":3354},{"id":3364,"depth":76,"text":3365},{},{"title":3342,"description":3350},"handbook\u002Fcompany\u002Fremote","htkLkZqgmyaUBDs78UeFSrAiQtCLuOD7TMNDM_HSH7c",{"id":3381,"title":3382,"body":3383,"description":75,"extension":81,"meta":3642,"navGroup":83,"navOrder":83,"navTitle":3382,"navigation":84,"path":3643,"seo":3644,"stem":3645,"__hash__":3646},"handbook\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Faccess-control.md","Access Control Policy",{"type":7,"value":3384,"toc":3627},[3385,3388,3410,3413,3416,3420,3428,3431,3434,3460,3464,3468,3477,3481,3501,3505,3516,3520,3536,3540,3543,3547,3550,3561,3565,3568,3571,3574,3600,3603,3606],[10,3386,3382],{"id":3387},"access-control-policy",[910,3389,3390,3400],{},[913,3391,3392],{},[916,3393,3394,3397],{},[919,3395,3396],{},"Policy owner",[919,3398,3399],{},"Effective date",[930,3401,3402],{},[916,3403,3404,3407],{},[935,3405,3406],{},"@knolleary",[935,3408,3409],{},"2023-05-01",[14,3411,928],{"id":3412},"purpose",[19,3414,3415],{},"This policy describes how FlowFuse controls access to information and systems. Its purpose is to ensure only authorized parties can access data and systems in line with business objectives.",[14,3417,3419],{"id":3418},"scope","Scope",[19,3421,3422,3423,3427],{},"This policy applies to all FlowFuse systems that handle confidential data. The ",[46,3424,3426],{"href":3425},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fdata-management","Data Management Policy"," defines what counts as confidential data.",[19,3429,3430],{},"It also applies to all FlowFuse employees and to any external partners who have access to FlowFuse systems or resources.",[14,3432,3382],{"id":3433},"access-control-policy-1",[504,3435,3436,3439,3442,3445,3448,3451,3454,3457],{},[147,3437,3438],{},"Protect all computing resources—such as servers, user devices, network equipment, services, and applications—with strong authentication, authorization, and auditing.",[147,3440,3441],{},"Each user must use their own unique account for interactive access. Accounts must not be shared.",[147,3443,3444],{},"Enforce industry best practices for passwords, service accounts, and access keys, including requirements for length, complexity, and rotation. See the Password Policy for details.",[147,3446,3447],{},"Require the use of strong passwords and multi-factor authentication (MFA) wherever supported.",[147,3449,3450],{},"Require MFA for all critical systems and resources, including all production environments.",[147,3452,3453],{},"Remove unused accounts, passwords, and access keys within 30 days.",[147,3455,3456],{},"Assign unique access keys or service accounts for each application or system process.",[147,3458,3459],{},"Configure authenticated sessions to time out after a defined period of inactivity.",[164,3461,3463],{"id":3462},"how-to-request-access-or-permission-to-a-system","How to Request Access or Permission to a System",[164,3465,3467],{"id":3466},"how-to-request-access-or-permissions","How to Request Access or Permissions",[19,3469,3470,3471,3476],{},"To request access or permissions (for example: AWS, GitHub, or HubSpot), open an ",[46,3472,3475],{"href":3473,"rel":3474},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fadmin\u002Fissues\u002Fnew?assignees=ZJvandeWeg%2C+knolleary&labels=&projects=&template=access-request.md",[108],"Access Request issue"," in the admin repository.",[164,3478,3480],{"id":3479},"access-authorization-and-termination","Access Authorization and Termination",[504,3482,3483,3486,3489,3492,3495,3498],{},[147,3484,3485],{},"Use role-based access control (RBAC) or a similar method to manage access permissions.",[147,3487,3488],{},"Provision standard access during employee onboarding based on the user’s job role. All additional access requests must be approved by the requester’s manager before access is granted.",[147,3490,3491],{},"Require CTO approval for access to critical resources, including production environments.",[147,3493,3494],{},"Review access on a regular basis and revoke permissions when they are no longer needed.",[147,3496,3497],{},"Revoke all system access and disable accounts within 24 hours (one business day) after employment ends.",[147,3499,3500],{},"Review all user access at least annually and whenever a user’s job role changes.",[164,3502,3504],{"id":3503},"shared-secrets-management","Shared Secrets Management",[504,3506,3507,3510,3513],{},[147,3508,3509],{},"Minimize the use of shared credentials and allow them only as an approved exception.",[147,3511,3512],{},"When shared credentials are required, store and share them securely using the company-provided password manager, 1Password.",[147,3514,3515],{},"Support any shared access to critical systems with a method that uniquely identifies the individual user.",[14,3517,3519],{"id":3518},"privileged-access-management","Privileged Access Management",[504,3521,3522,3530,3533],{},[147,3523,3524,3525],{},"Prevent direct login to systems using privileged accounts.",[144,3526,3527],{},[147,3528,3529],{},"A privileged account provides administrative access to critical systems, such as an Active Directory Domain Administrator, a root user on a Linux or Unix system, or an Administrator or Root User on an AWS account.",[147,3531,3532],{},"Require privileged access to be obtained only through a proxy or equivalent mechanism that uses strong authentication (such as MFA), a unique individual account, and full auditing of user activity.",[147,3534,3535],{},"Keep direct administrative access to production systems to an absolute minimum.",[14,3537,3539],{"id":3538},"access-to-source-code","Access to Source Code",[19,3541,3542],{},"Develop source code in the open by default. Restrict access only when required for business reasons. Grant access to private repositories based on business need and job role.",[14,3544,3546],{"id":3545},"password-policy","Password Policy",[19,3548,3549],{},"Enforce industry best practices for passwords and configure systems to support these requirements wherever possible.",[144,3551,3552,3555,3558],{},[147,3553,3554],{},"Use a minimum password length of 8 characters with a mix of letters, numbers, symbols, and cases.",[147,3556,3557],{},"Do not reuse passwords across different systems.",[147,3559,3560],{},"Store passwords only in the company-provided password vault, 1Password.",[14,3562,3564],{"id":3563},"programmatically-accessible-resources","Programmatically Accessible Resources",[19,3566,3567],{},"When programmatic access to resources is required, the following guidelines must\nbe followed:",[14,3569,3564],{"id":3570},"programmatically-accessible-resources-1",[19,3572,3573],{},"When programmatic access is required, follow these guidelines:",[504,3575,3576,3579,3582,3585,3594,3597],{},[147,3577,3578],{},"Use API keys or access tokens instead of username and password combinations.",[147,3580,3581],{},"Avoid sharing secrets across environments unless required for operational reasons.",[147,3583,3584],{},"Store all secrets securely in 1Password and never share them in plaintext.",[147,3586,3587,3588,3593],{},"Rotate secrets on a regular basis—at least annually—and follow ",[46,3589,3592],{"href":3590,"rel":3591},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1bFBaVWNYKjPSMefn5drkElwM-nk06ilCrtH88ZtTjAo",[108],"internal\nguidelines"," for rotation.",[147,3595,3596],{},"Apply the principle of least privilege by granting only the access required for the application to function.",[147,3598,3599],{},"Do not hardcode secrets in source code.",[3601,3602],"hr",{},[19,3604,3605],{},"This policy is adapted from the following sources:",[144,3607,3608,3620],{},[147,3609,3610,3237,3615,1583],{},[46,3611,3614],{"href":3612,"rel":3613},"https:\u002F\u002Fgithub.com\u002FJupiterOne\u002Fsecurity-policy-templates",[108],"JupiterOne Security Policy Templates",[46,3616,3619],{"href":3617,"rel":3618},"https:\u002F\u002Fcreativecommons.org\u002Flicenses\u002Fby-sa\u002F4.0\u002F",[108],"CC BY-SA 4.0",[147,3621,3622],{},[46,3623,3626],{"href":3624,"rel":3625},"https:\u002F\u002Fvanta.com",[108],"Vanta",{"title":75,"searchDepth":76,"depth":76,"links":3628},[3629,3630,3631,3637,3638,3639,3640,3641],{"id":3412,"depth":76,"text":928},{"id":3418,"depth":76,"text":3419},{"id":3433,"depth":76,"text":3382,"children":3632},[3633,3634,3635,3636],{"id":3462,"depth":605,"text":3463},{"id":3466,"depth":605,"text":3467},{"id":3479,"depth":605,"text":3480},{"id":3503,"depth":605,"text":3504},{"id":3518,"depth":76,"text":3519},{"id":3538,"depth":76,"text":3539},{"id":3545,"depth":76,"text":3546},{"id":3563,"depth":76,"text":3564},{"id":3570,"depth":76,"text":3564},{},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Faccess-control",{"title":3382,"description":75},"handbook\u002Fcompany\u002Fsecurity\u002Faccess-control","mpfQSd293hklqifRTDKiIpWX8u3Grw3ZqDoT5ENBQPE",{"id":3648,"title":3649,"body":3650,"description":75,"extension":81,"meta":3975,"navGroup":83,"navOrder":83,"navTitle":3649,"navigation":84,"path":3976,"seo":3977,"stem":3978,"__hash__":3979},"handbook\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fai-development-and-customer-data.md","AI Development and Customer Data Policy",{"type":7,"value":3651,"toc":3959},[3652,3655,3674,3676,3679,3682,3684,3687,3698,3702,3719,3723,3726,3729,3743,3746,3750,3753,3767,3770,3773,3777,3786,3795,3799,3802,3810,3813,3827,3830,3834,3853,3857,3860,3871,3874,3885,3888,3892,3903,3907,3910,3924,3928,3947,3951],[10,3653,3649],{"id":3654},"ai-development-and-customer-data-policy",[910,3656,3657,3665],{},[913,3658,3659],{},[916,3660,3661,3663],{},[919,3662,3396],{},[919,3664,3399],{},[930,3666,3667],{},[916,3668,3669,3671],{},[935,3670,3406],{},[935,3672,3673],{},"2026-02-18",[14,3675,928],{"id":3412},[19,3677,3678],{},"This policy describes how AI-enabled functionality is designed, developed, and used within FlowFuse, both in the product and internally by FlowFuse team members.",[19,3680,3681],{},"Its purpose is to protect customer data, maintain trust, and ensure responsible, transparent, and secure use of AI technologies.",[14,3683,3419],{"id":3418},[19,3685,3686],{},"This policy applies to:",[144,3688,3689,3692,3695],{},[147,3690,3691],{},"AI functionality shipped as part of the FlowFuse product",[147,3693,3694],{},"Internal use of AI tools by FlowFuse employees and contractors",[147,3696,3697],{},"Integrations with third-party AI services",[14,3699,3701],{"id":3700},"guiding-principles","Guiding Principles",[504,3703,3704,3707,3710,3713,3716],{},[147,3705,3706],{},"AI is assistive, not autonomous.",[147,3708,3709],{},"Humans remain accountable for decisions and outcomes.",[147,3711,3712],{},"Customer trust and data protection take precedence over experimentation speed.",[147,3714,3715],{},"AI usage must be intentional, scoped, and reversible.",[147,3717,3718],{},"FlowFuse does not train AI models on customer data or company data.",[14,3720,3722],{"id":3721},"internal-use-of-ai-by-flowfuse-team-members","Internal Use of AI by FlowFuse Team Members",[19,3724,3725],{},"FlowFuse supports and encourages responsible use of AI tools by team members to improve development velocity, quality, and operational effectiveness.",[19,3727,3728],{},"When using AI internally:",[504,3730,3731,3734,3737,3740],{},[147,3732,3733],{},"Do not share customer data with AI tools except as explicitly permitted by this policy.",[147,3735,3736],{},"Use internal, synthetic, or publicly available data for experimentation whenever possible.",[147,3738,3739],{},"Review AI-generated output before relying on it or including it in the product.",[147,3741,3742],{},"Do not use AI tools to bypass security controls, access restrictions, or approval processes.",[19,3744,3745],{},"Apply the same data protection, security, and review standards to internal AI usage as to AI functionality shipped within the product.",[164,3747,3749],{"id":3748},"approved-ai-tools","Approved AI Tools",[19,3751,3752],{},"FlowFuse provides the following AI tools to team members:",[144,3754,3755,3761],{},[147,3756,3757,3760],{},[423,3758,3759],{},"Claude"," (via Claude Team) — general-purpose AI assistant for writing, analysis, coding support, and research.",[147,3762,3763,3766],{},[423,3764,3765],{},"Gemini"," (via Google Workspace) — AI features built into Gmail, Docs, Meet, and other Workspace apps.",[19,3768,3769],{},"AI features built into other approved tools (for example, summarization, drafting assistance, or transcription) are covered by the existing approval of the underlying tool and the principles in this policy.",[19,3771,3772],{},"Other AI tools may be approved on a case-by-case basis through the vendor approval process. The full list of approved vendors and software is maintained in Vanta and via approved Vendor & Software Checklist issues in the admin repo on GitHub.",[164,3774,3776],{"id":3775},"requesting-a-new-ai-tool","Requesting a New AI Tool",[19,3778,3779,3780,3785],{},"To request approval for a new AI tool, open a ",[46,3781,3784],{"href":3782,"rel":3783},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fadmin\u002Fissues\u002Fnew?template=vendor-process.md",[108],"Vendor & Software Checklist"," issue in the admin repo on GitHub. The request is reviewed for security, data handling, and budget before approval.",[19,3787,3788,3789,3794],{},"To request access to an already-approved AI tool, open an ",[46,3790,3793],{"href":3791,"rel":3792},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fadmin\u002Fissues\u002Fnew?template=access-request.md",[108],"Access \u002F Permission Request"," issue in the admin repo on GitHub.",[14,3796,3798],{"id":3797},"customer-data-usage","Customer Data Usage",[19,3800,3801],{},"Customer data may be used with AI systems only under the following conditions:",[504,3803,3804,3807],{},[147,3805,3806],{},"Use customer data solely to provide the requested product functionality.",[147,3808,3809],{},"Ensure all AI processing of customer data follows existing access controls, logging, and security policies.",[19,3811,3812],{},"Customer data is not used for the following purposes:",[504,3814,3815,3818,3821,3824],{},[147,3816,3817],{},"Do not use customer data to train shared, public, or cross-customer AI models.",[147,3819,3820],{},"FlowFuse does not train AI models on customer data.",[147,3822,3823],{},"Do not use customer data for internal experimentation unrelated to a customer’s use case.",[147,3825,3826],{},"Do not use customer data to improve general-purpose AI model behavior.",[19,3828,3829],{},"Customer data remains owned and controlled by the customer at all times.",[14,3831,3833],{"id":3832},"internal-data-vs-customer-data","Internal Data vs Customer Data",[504,3835,3836,3850],{},[147,3837,3838,3839],{},"Internal, synthetic, or anonymized data may be used for:",[144,3840,3841,3844,3847],{},[147,3842,3843],{},"Prototyping and experimentation",[147,3845,3846],{},"Prompt development",[147,3848,3849],{},"Evaluation and testing of AI features",[147,3851,3852],{},"Do not repurpose customer data for internal AI development or testing, even if anonymized, without explicit approval.",[14,3854,3856],{"id":3855},"third-party-ai-services","Third-Party AI Services",[19,3858,3859],{},"Third-party AI providers may be used within the FlowFuse product only when:",[504,3861,3862,3865,3868],{},[147,3863,3864],{},"Appropriate contractual data protection terms are in place.",[147,3866,3867],{},"The provider does not retain or reuse customer data for model training.",[147,3869,3870],{},"Data shared is limited to the minimum required to provide the feature.",[19,3872,3873],{},"Review new AI provider integrations prior to use and assess them for:",[504,3875,3876,3879,3882],{},[147,3877,3878],{},"Data handling and retention practices.",[147,3880,3881],{},"Security posture.",[147,3883,3884],{},"Compliance and risk implications.",[19,3886,3887],{},"FlowFuse maintains a documented inventory of approved third-party AI services used within the product that may process customer data. This inventory includes references to each provider’s relevant data handling and security policies. The inventory is reviewed as part of the vendor risk management process and is available upon request.",[14,3889,3891],{"id":3890},"product-transparency","Product Transparency",[504,3893,3894,3897,3900],{},[147,3895,3896],{},"Clearly identify AI-assisted functionality in the product and\u002For documentation.",[147,3898,3899],{},"Do not present AI outputs as authoritative or decision-final.",[147,3901,3902],{},"Inform users when AI is involved and ensure they understand that human judgment is required.",[14,3904,3906],{"id":3905},"prohibited-ai-use-cases","Prohibited AI Use Cases",[19,3908,3909],{},"Do not use AI for:",[504,3911,3912,3915,3918,3921],{},[147,3913,3914],{},"Fully autonomous decision-making affecting customers.",[147,3916,3917],{},"Safety-critical or high-risk operational decisions.",[147,3919,3920],{},"Surveillance, behavioral profiling, or user scoring.",[147,3922,3923],{},"Legal, medical, or employment decision-making.",[14,3925,3927],{"id":3926},"review-and-oversight","Review and Oversight",[504,3929,3930,3944],{},[147,3931,3932,3933],{},"Require new AI-enabled features to undergo review that considers:",[144,3934,3935,3938,3941],{},[147,3936,3937],{},"Data inputs and outputs",[147,3939,3940],{},"Customer impact and potential failure modes",[147,3942,3943],{},"Third-party dependencies",[147,3945,3946],{},"Restrict, modify, or disable AI functionality if risks or assumptions change.",[14,3948,3950],{"id":3949},"exceptions-and-enforcement","Exceptions and Enforcement",[504,3952,3953,3956],{},[147,3954,3955],{},"Require explicit review and approval for any exception to this policy.",[147,3957,3958],{},"Violations may result in feature rollback or removal of integrations.",{"title":75,"searchDepth":76,"depth":76,"links":3960},[3961,3962,3963,3964,3968,3969,3970,3971,3972,3973,3974],{"id":3412,"depth":76,"text":928},{"id":3418,"depth":76,"text":3419},{"id":3700,"depth":76,"text":3701},{"id":3721,"depth":76,"text":3722,"children":3965},[3966,3967],{"id":3748,"depth":605,"text":3749},{"id":3775,"depth":605,"text":3776},{"id":3797,"depth":76,"text":3798},{"id":3832,"depth":76,"text":3833},{"id":3855,"depth":76,"text":3856},{"id":3890,"depth":76,"text":3891},{"id":3905,"depth":76,"text":3906},{"id":3926,"depth":76,"text":3927},{"id":3949,"depth":76,"text":3950},{},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fai-development-and-customer-data",{"title":3649,"description":75},"handbook\u002Fcompany\u002Fsecurity\u002Fai-development-and-customer-data","fD3YrRFolokiO8QNU42w5YkF6RL0U5lciCQvJpK7m5A",{"id":3981,"title":3982,"body":3983,"description":75,"extension":81,"meta":4132,"navGroup":83,"navOrder":83,"navTitle":3982,"navigation":84,"path":4133,"seo":4134,"stem":4135,"__hash__":4136},"handbook\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fasset-management.md","Asset Management Policy",{"type":7,"value":3984,"toc":4119},[3985,3988,4007,4009,4012,4014,4017,4020,4024,4027,4031,4034,4038,4045,4049,4052,4056,4063,4067,4070,4077,4082,4086,4089,4093,4096,4099,4101,4103],[10,3986,3982],{"id":3987},"asset-management-policy",[910,3989,3990,3998],{},[913,3991,3992],{},[916,3993,3994,3996],{},[919,3995,3396],{},[919,3997,3399],{},[930,3999,4000],{},[916,4001,4002,4004],{},[935,4003,3406],{},[935,4005,4006],{},"2023-06-01",[14,4008,928],{"id":3412},[19,4010,4011],{},"This policy establishes how the organization identifies, manages, and protects its assets. Its purpose is to ensure that information and equipment receive appropriate protection and to prevent unauthorized disclosure, modification, removal, or destruction of organizational data.",[14,4013,3419],{"id":3418},[19,4015,4016],{},"This policy applies to all organizational assets owned or managed by FlowFuse, including information, equipment, and devices. It also applies to all employees and third parties who use or handle these assets.",[19,4018,4019],{},"## Policy",[164,4021,4023],{"id":4022},"inventory-of-assets","Inventory of Assets",[19,4025,4026],{},"Identify all assets that store, process, or transmit confidential information, and maintain an up-to-date inventory of these assets.",[164,4028,4030],{"id":4029},"ownership-of-assets","Ownership of Assets",[19,4032,4033],{},"Assign each asset in the inventory to a specific individual or group responsible for its management and protection.",[164,4035,4037],{"id":4036},"acceptable-use-of-assets","Acceptable Use of Assets",[19,4039,4040,4041,549],{},"Follow the acceptable use rules defined in the ",[46,4042,4044],{"href":4043},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Finformation-security","Information Security Policy",[164,4046,4048],{"id":4047},"loss-or-theft-of-assets","Loss or Theft of Assets",[19,4050,4051],{},"Report the loss or theft of any device that stores FlowFuse data or provides access to FlowFuse systems immediately. This includes devices such as computers, hardware tokens, and personal mobile phones.",[164,4053,4055],{"id":4054},"return-of-assets","Return of Assets",[19,4057,4058,4059,549],{},"Return all FlowFuse assets in your possession when your employment or contract ends, following the ",[46,4060,4062],{"href":4061},"\u002Fhandbook\u002Fpeopleops\u002Fhiring\u002F#offboarding","off-boarding process",[164,4064,4066],{"id":4065},"handling-of-assets","Handling of Assets",[19,4068,4069],{},"Employees and users who are issued or handle FlowFuse equipment are expected to\nuse reasonable judgment and exercise due care in protecting and maintaining the\nequipment.",[19,4071,4072,4073,4076],{},"Employees are responsible for ensuring that company equipment is secured and\nproperly attended to whenever it is transported or stored. Equipment must be\nsecured in accordance with the ",[46,4074,4075],{"href":3643},"Access Control policy"," and must not be left unattended in public locations.",[19,4078,4079,4080,549],{},"All mobile devices shall be handled in accordance with the ",[46,4081,4044],{"href":4043},[14,4083,4085],{"id":4084},"exceptions","Exceptions",[19,4087,4088],{},"Submit requests for exceptions to this policy by email to the CEO or CTO for approval.",[14,4090,4092],{"id":4091},"violations-enforcement","Violations & Enforcement",[19,4094,4095],{},"Report any violations of this policy to the CEO or CTO immediately.",[19,4097,4098],{},"Violations may result in suspension of system access and disciplinary action in accordance with company procedures, up to and including termination of employment.",[3601,4100],{},[19,4102,3605],{},[144,4104,4105,4114],{},[147,4106,4107,3237,4110,1583],{},[46,4108,3614],{"href":3612,"rel":4109},[108],[46,4111,4113],{"href":3617,"rel":4112},[108],"CC BY-SA 4 license",[147,4115,4116],{},[46,4117,3626],{"href":3624,"rel":4118},[108],{"title":75,"searchDepth":76,"depth":76,"links":4120},[4121,4122,4130,4131],{"id":3412,"depth":76,"text":928},{"id":3418,"depth":76,"text":3419,"children":4123},[4124,4125,4126,4127,4128,4129],{"id":4022,"depth":605,"text":4023},{"id":4029,"depth":605,"text":4030},{"id":4036,"depth":605,"text":4037},{"id":4047,"depth":605,"text":4048},{"id":4054,"depth":605,"text":4055},{"id":4065,"depth":605,"text":4066},{"id":4084,"depth":76,"text":4085},{"id":4091,"depth":76,"text":4092},{},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fasset-management",{"title":3982,"description":75},"handbook\u002Fcompany\u002Fsecurity\u002Fasset-management","w35TfUp5OB35c1kH7roA3lbhMDKD1_l-ywWN5K_tPC0",{"id":4138,"title":4139,"body":4140,"description":75,"extension":81,"meta":4287,"navGroup":83,"navOrder":83,"navTitle":4139,"navigation":84,"path":4288,"seo":4289,"stem":4290,"__hash__":4291},"handbook\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fbusiness-continuity.md","Business Continuity & Disaster Recovery Policy",{"type":7,"value":4141,"toc":4277},[4142,4145,4164,4166,4169,4171,4174,4177,4181,4184,4188,4191,4195,4198,4212,4216,4219,4222,4254,4258,4261,4263],[10,4143,4139],{"id":4144},"business-continuity-disaster-recovery-policy",[910,4146,4147,4155],{},[913,4148,4149],{},[916,4150,4151,4153],{},[919,4152,3396],{},[919,4154,3399],{},[930,4156,4157],{},[916,4158,4159,4161],{},[935,4160,3406],{},[935,4162,4163],{},"2023-07-01",[14,4165,928],{"id":3412},[19,4167,4168],{},"The purpose of this business continuity plan is to prepare FlowFuse in the\nevent of service outages caused by factors beyond our control (e.g., natural\ndisasters, man-made events), and to restore services to the widest extent\npossible in a minimum time frame.",[14,4170,3419],{"id":3418},[19,4172,4173],{},"This policy applies to the FlowFuse Cloud production environment, and any\nindividual instances of the platform FlowFuse manages on behalf of customers.",[19,4175,4176],{},"It also applies to any systems used in support of the business critical operations\nof the company.",[14,4178,4180],{"id":4179},"continuity-of-critical-services","Continuity of Critical Services",[19,4182,4183],{},"As an all-remote company, our business-critical systems are provided by third-party\nvendors and we rely on their SLAs in the event of any outage.",[14,4185,4187],{"id":4186},"flowfuse-platform-general-disaster-recovery-procedures","FlowFuse Platform General Disaster Recovery Procedures",[19,4189,4190],{},"In the event of a situation that has material impact to the FlowFuse Cloud platform,\nor any equivalent system managed by FlowFuse on behalf of our customers, the following\nprocedures apply.",[164,4192,4194],{"id":4193},"notification-phase","Notification Phase",[19,4196,4197],{},"This phase deals with the initial identification of a situation that impacts a\nproduction system. The procedure is as follows:",[504,4199,4200,4203,4206,4209],{},[147,4201,4202],{},"An incident is identified. Full details are relayed to the CTO.",[147,4204,4205],{},"The CTO announces an incident in Slack and directs the engineering\u002Fdevops teams\nto gather information and assess the impact and estimated recovery time.",[147,4207,4208],{},"If the incident will result in a prolonged outage or otherwise, the CTO will\nactivate the Recovery phase.",[147,4210,4211],{},"The CTO will notify the necessary teams of this decision, including the CEO.",[164,4213,4215],{"id":4214},"recovery-phase","Recovery Phase",[19,4217,4218],{},"The goal is to fully restore the affected system within 24 hours of the outage and\nto minimise further disruption for the affected users.",[19,4220,4221],{},"The following steps should be taken. The CTO will coordinate these actions with\nthe required teams.",[504,4223,4224,4227,4230,4233,4236,4239,4242,4245,4248,4251],{},[147,4225,4226],{},"Notify affected users to begin initial communication",[147,4228,4229],{},"Assess damage to the environment",[147,4231,4232],{},"Create a new production environment",[147,4234,4235],{},"Ensure new environment is properly secured",[147,4237,4238],{},"Deploy platform code to new environment",[147,4240,4241],{},"Restore data backup to new environment",[147,4243,4244],{},"Verify platform deployment",[147,4246,4247],{},"Verify logging, monitoring and alerting functionality",[147,4249,4250],{},"Update DNS and other necessary records to point to the new environment",[147,4252,4253],{},"Notify affected users through established channels",[164,4255,4257],{"id":4256},"resolution-phase","Resolution Phase",[19,4259,4260],{},"Once the system has been restored, the CTO will initiate a post mortem of the event\nto ensure any lessons from the outage and subsequent recovery can be reviewed and\ncaptured.",[3601,4262],{},[19,4264,4265,4266,3237,4270,4273,4274],{},"Policy derived from ",[46,4267,4269],{"href":3612,"rel":4268},[108],"JupiterOne\u002Fsecurity-policy-templates",[46,4271,4113],{"href":3617,"rel":4272},[108],") and ",[46,4275,3626],{"href":3624,"rel":4276},[108],{"title":75,"searchDepth":76,"depth":76,"links":4278},[4279,4280,4281,4282],{"id":3412,"depth":76,"text":928},{"id":3418,"depth":76,"text":3419},{"id":4179,"depth":76,"text":4180},{"id":4186,"depth":76,"text":4187,"children":4283},[4284,4285,4286],{"id":4193,"depth":605,"text":4194},{"id":4214,"depth":605,"text":4215},{"id":4256,"depth":605,"text":4257},{},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fbusiness-continuity",{"title":4139,"description":75},"handbook\u002Fcompany\u002Fsecurity\u002Fbusiness-continuity","sCT9D0eHCubxxq10f-sFoynfoGrxNuIf1wR4Yrl9yno",{"id":4293,"title":4294,"body":4295,"description":4299,"extension":81,"meta":4488,"navGroup":83,"navOrder":83,"navTitle":4489,"navigation":84,"path":4490,"seo":4491,"stem":4492,"__hash__":4493},"handbook\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fcomputer-security.md","Computer Security",{"type":7,"value":4296,"toc":4476},[4297,4300,4306,4309,4313,4318,4321,4325,4329,4332,4346,4350,4354,4357,4361,4365,4368,4372,4375,4380,4415,4419,4422,4426,4429,4433,4436,4456,4460,4463,4467,4470,4473],[19,4298,4299],{},"As an all-remote company, good security practices are required of all FlowFuse employees.",[19,4301,4302,4303,549],{},"The following guide details requirements for personal computer security; these are in support of our broader ",[46,4304,4305],{"href":61},"security policies",[19,4307,4308],{},"We use the Vanta Agent to monitor a set of these requirements, but it does not cover them all. At this time, we rely on self-managed compliance.",[164,4310,4312],{"id":4311},"encrypted-hard-drive","Encrypted Hard Drive",[19,4314,4315],{},[2562,4316,4317],{},"Monitored by Vanta",[19,4319,4320],{},"Ensure your hard drive is encrypted to prevent unauthorized access. This is a built-in feature of all operating systems and must be enabled.",[164,4322,4324],{"id":4323},"anti-virus","Anti-Virus",[19,4326,4327],{},[2562,4328,4317],{},[19,4330,4331],{},"System-level anti-virus must be enabled.",[144,4333,4334,4337,4340],{},[147,4335,4336],{},"Windows: use the built-in Windows Defender Antivirus",[147,4338,4339],{},"MacOS: Enable Gatekeeper\u002FXProtect",[147,4341,4342,4343],{},"Linux: ",[2562,4344,4345],{},"guidance tbd",[164,4347,4349],{"id":4348},"use-of-a-password-manager","Use of a Password Manager",[19,4351,4352],{},[2562,4353,4317],{},[19,4355,4356],{},"To encourage secure password usage, FlowFuse provides 1Password to all employees.",[164,4358,4360],{"id":4359},"screenlock-enabled","Screenlock Enabled",[19,4362,4363],{},[2562,4364,4317],{},[19,4366,4367],{},"Devices must have a screenlock configured to enable after a short period of idle time (maximum 15 minutes).",[164,4369,4371],{"id":4370},"firewall","Firewall",[19,4373,4374],{},"Enable a firewall to prevent external access to your device.",[144,4376,4377],{},[147,4378,4379],{},"Windows: use the built-in Windows Defender firewall",[4381,4382,4383,4389],"details",{},[4384,4385,4386],"summary",{},[423,4387,4388],{},"- MacOS: use the built-in firewall service",[504,4390,4391,4397,4402,4408],{},[147,4392,4393,4394],{},"Open ",[423,4395,4396],{},"System Settings",[147,4398,769,4399],{},[423,4400,4401],{},"Network",[147,4403,4404,4405,4407],{},"Select ",[423,4406,4371],{}," on the sidebar",[147,4409,4410,4411,4414],{},"Click ",[423,4412,4413],{},"Turn On Firewall"," if it's not already enabled",[164,4416,4418],{"id":4417},"disable-guestauto-login","Disable guest\u002Fauto-login",[19,4420,4421],{},"Disable any guest accounts on the device and do not allow auto-login of any account.",[164,4423,4425],{"id":4424},"keep-software-up-to-date","Keep software up to date",[19,4427,4428],{},"All software, from the Operating System to the Browser, must be kept up to date. Where possible enable auto-updates and actively ensure they are applied.",[164,4430,4432],{"id":4431},"secure-browsing","Secure Browsing",[19,4434,4435],{},"As so much of our work is done in the browser, it is a crucial tool to keep secure. The following guidelines must be followed; specific details will vary depending on the browser being used.",[144,4437,4438,4441,4444,4447],{},[147,4439,4440],{},"Keep the browser up to date",[147,4442,4443],{},"Only install trusted extensions and keep them up to date",[147,4445,4446],{},"Enable the 1Password extension to provide secure password management",[147,4448,4449,4450,4455],{},"Chrome: enable ",[46,4451,4454],{"href":4452,"rel":4453},"https:\u002F\u002Fsupport.google.com\u002Fchrome\u002Fanswer\u002F9890866",[108],"Enhanced protection"," browsing protection level",[164,4457,4459],{"id":4458},"secure-log-retention","Secure log retention",[19,4461,4462],{},"Operating system logs must be retained and stored securely according to Operation system defaults. Hard drives encryption must be enabled, no immediate additional action is currently required.",[164,4464,4466],{"id":4465},"intrusion-detection-and-prevention","Intrusion Detection and Prevention",[19,4468,4469],{},"For users with privileged access to production systems, additional controls will be required. This have not yet been fully defined, but will require\nsolutions around Intrusion Detection and Prevention (IDPS).",[19,4471,4472],{},"A lot of the controls outlined above play a part in this; firewalls, malware detection, anti-virus etc.",[19,4474,4475],{},"Each operating system has its own tools available for full Intrusion Detection; this guide will be updated with details as our requirements mature.",{"title":75,"searchDepth":76,"depth":76,"links":4477},[4478,4479,4480,4481,4482,4483,4484,4485,4486,4487],{"id":4311,"depth":605,"text":4312},{"id":4323,"depth":605,"text":4324},{"id":4348,"depth":605,"text":4349},{"id":4359,"depth":605,"text":4360},{"id":4370,"depth":605,"text":4371},{"id":4417,"depth":605,"text":4418},{"id":4424,"depth":605,"text":4425},{"id":4431,"depth":605,"text":4432},{"id":4458,"depth":605,"text":4459},{"id":4465,"depth":605,"text":4466},{},"Hardware Security Policy","\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fcomputer-security",{"description":4299},"handbook\u002Fcompany\u002Fsecurity\u002Fcomputer-security","ulWBFyBsHlklJjZQZEJOEQJfwEc48SMpQceTnNNXtmo",{"id":4495,"title":4496,"body":4497,"description":75,"extension":81,"meta":4625,"navGroup":83,"navOrder":83,"navTitle":4496,"navigation":84,"path":4626,"seo":4627,"stem":4628,"__hash__":4629},"handbook\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fcryptography.md","Cryptography Policy",{"type":7,"value":4498,"toc":4614},[4499,4502,4520,4522,4525,4527,4530,4533,4536,4544,4547,4561,4565,4568,4572,4575,4578,4581,4584,4588,4591,4593,4596,4598,4601,4603],[10,4500,4496],{"id":4501},"cryptography-policy",[910,4503,4504,4512],{},[913,4505,4506],{},[916,4507,4508,4510],{},[919,4509,3396],{},[919,4511,3399],{},[930,4513,4514],{},[916,4515,4516,4518],{},[935,4517,3406],{},[935,4519,4006],{},[14,4521,928],{"id":3412},[19,4523,4524],{},"To ensure proper and effective use of cryptography to protect the confidentiality,\nauthenticity and\u002For integrity of information. This policy establishes requirements\nfor the use and protection of cryptographic keys and cryptographic methods\nthroughout the entire encryption lifecycle.",[14,4526,3419],{"id":3418},[19,4528,4529],{},"All FlowFuse data, information and information systems that handle confidential\nor critical information.",[14,4531,4496],{"id":4532},"cryptography-policy-1",[19,4534,4535],{},"FlowFuse requires all team members apply appropriate cryptographic controls in\nhandling of data. Where encryption is in use, strong cryptography with associated\nkey management processes and procedures shall be implemented. All encryption\nshall be performed in accordance with industry standards, including NIST SP 800-57.",[19,4537,4538,4539,549],{},"Customer or confidential company data must utilize strong ciphers and configurations\nin accordance with vendor recommendations and industry best practices including\n",[46,4540,4543],{"href":4541,"rel":4542},"https:\u002F\u002Fcsrc.nist.gov\u002Fprojects\u002Fcryptographic-standards-and-guidelines",[108],"NIST when stored or transferred over a public network",[19,4545,4546],{},"FlowFuse requires all team members to comply with the cryptography policy, such that:",[144,4548,4549,4552,4555,4558],{},[147,4550,4551],{},"All Production Data at rest is stored on encrypted volumes.",[147,4553,4554],{},"Volume encryption keys are protected from unauthorized access. Volume encryption\nkey material is protected with access controls such that the key material is\nonly accessible by privileged accounts.",[147,4556,4557],{},"Encrypted volumes use strong cipher algorithms, key strength, and key management\nprocess.",[147,4559,4560],{},"Data is protected in transit using recent TLS versions with ciphers recognized as secure.",[164,4562,4564],{"id":4563},"local-diskvolume-encryption","Local disk\u002Fvolume encryption",[19,4566,4567],{},"Encryption and key management for local disk encryption of end-user devices follow\nthe defined best practices for Windows, macOS, and Linux\u002FUnix operating systems,\nsuch as Bitlocker and FileVault.",[164,4569,4571],{"id":4570},"protecting-data-in-transit","Protecting data in transit",[19,4573,4574],{},"All external data transmission is encrypted end-to-end. This includes, but is not\nlimited to, cloud infrastructure and third-party vendors and applications.",[19,4576,4577],{},"Transmission encryption keys and systems that generate keys are protected from\nunauthorized access. Transmission encryption key materials are protected with\naccess controls and may only be accessed by privileged accounts.",[19,4579,4580],{},"TLS endpoints must score at least an \"B\" on SSLLabs.com.",[19,4582,4583],{},"Transmission encryption keys are limited to use for one year and then must be\nregenerated.",[164,4585,4587],{"id":4586},"encryption-of-portable-and-removable-media-devices","Encryption of portable and removable media devices",[19,4589,4590],{},"It is mandatory for all employees and contractors to use full disk encryption on any portable or removable media device that stores, processes, or transfers company-related information. This includes but is not limited to USB drives, external hard drives, and SD cards.",[14,4592,4085],{"id":4084},[19,4594,4595],{},"Requests for an exception to this policy must be submitted to the CEO or CTO for\napproval.",[14,4597,4092],{"id":4091},[19,4599,4600],{},"Any known violations of this policy should be reported to the CEO or CTO.\nViolations of this policy can result in immediate withdrawal or suspension of\nsystem access and\u002For disciplinary action in accordance with company procedures\nup to and including termination of employment.",[3601,4602],{},[19,4604,4265,4605,3237,4608,4273,4611],{},[46,4606,4269],{"href":3612,"rel":4607},[108],[46,4609,4113],{"href":3617,"rel":4610},[108],[46,4612,3626],{"href":3624,"rel":4613},[108],{"title":75,"searchDepth":76,"depth":76,"links":4615},[4616,4617,4618,4623,4624],{"id":3412,"depth":76,"text":928},{"id":3418,"depth":76,"text":3419},{"id":4532,"depth":76,"text":4496,"children":4619},[4620,4621,4622],{"id":4563,"depth":605,"text":4564},{"id":4570,"depth":605,"text":4571},{"id":4586,"depth":605,"text":4587},{"id":4084,"depth":76,"text":4085},{"id":4091,"depth":76,"text":4092},{},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fcryptography",{"title":4496,"description":75},"handbook\u002Fcompany\u002Fsecurity\u002Fcryptography","4ofWZ6jrYESH3UMmLfSd4aDi6M3fFlXqPyNnc_wigtc",{"id":4631,"title":3426,"body":4632,"description":75,"extension":81,"meta":4961,"navGroup":83,"navOrder":83,"navTitle":3426,"navigation":84,"path":3425,"seo":4962,"stem":4963,"__hash__":4964},"handbook\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fdata-management.md",{"type":7,"value":4633,"toc":4942},[4634,4637,4656,4658,4661,4663,4666,4669,4672,4675,4679,4682,4696,4703,4707,4712,4715,4718,4724,4740,4745,4748,4751,4756,4773,4778,4781,4784,4789,4802,4807,4812,4826,4830,4833,4853,4856,4871,4874,4884,4886,4891,4895,4898,4901,4905,4908,4911,4914,4918,4921,4923,4925,4927,4929,4931],[10,4635,3426],{"id":4636},"data-management-policy",[910,4638,4639,4647],{},[913,4640,4641],{},[916,4642,4643,4645],{},[919,4644,3396],{},[919,4646,3399],{},[930,4648,4649],{},[916,4650,4651,4654],{},[935,4652,4653],{},"@ZJvandeWeg",[935,4655,3409],{},[14,4657,928],{"id":3412},[19,4659,4660],{},"To ensure that information is classified, protected, retained and securely\ndisposed of in accordance with its importance to the organization.",[14,4662,3419],{"id":3418},[19,4664,4665],{},"All FlowFuse data, information and information systems.",[14,4667,3426],{"id":4668},"data-management-policy-1",[19,4670,4671],{},"FlowFuse classifies data and information systems in accordance with legal\nrequirements, sensitivity, and business criticality in order to ensure that\ninformation is given the appropriate level of protection. Data owners are\nresponsible for identifying any additional requirements for specific data or\nexceptions to standard handling requirements.",[19,4673,4674],{},"Information systems and applications shall be classified according to the highest\nclassification of data that they store or process.",[14,4676,4678],{"id":4677},"data-classification","Data Classification",[19,4680,4681],{},"To help FlowFuse and its employees easily understand requirements associated\nwith different kinds of information, the company has created four classes of data.",[144,4683,4684,4687,4690,4693],{},[147,4685,4686],{},"Critical",[147,4688,4689],{},"Confidential",[147,4691,4692],{},"Internal",[147,4694,4695],{},"Public",[19,4697,4698,4699,4702],{},"As FlowFuse is an open company by default, most of our data falls into ",[423,4700,4701],{},"public",".\nBut it is important to recognize when a higher classification is required.",[164,4704,4706],{"id":4705},"definitions-and-examples","Definitions and Examples",[19,4708,4709,4711],{},[423,4710,4686],{}," data includes data that must be protected due to regulatory\nrequirements, privacy, and\u002For security sensitivities.",[19,4713,4714],{},"Unauthorized disclosure of critical data may result in major disruption to\nbusiness operations, significant cost, irreparable reputation damage, and\u002For\nlegal prosecution of the company.",[19,4716,4717],{},"External disclosure of critical data is strictly prohibited without an approved\nprocess and agreement in place.",[19,4719,4720,4723],{},[2562,4721,4722],{},"Example Critical Data"," Types include",[144,4725,4726,4729],{},[147,4727,4728],{},"PII (personally identifiable information, including a user's full name, address, government ID number, email address, phone number, IP address, biometric information, or other information that can uniquely identify a person)",[147,4730,4731,4732],{},"Production security data, such as\n",[144,4733,4734,4737],{},[147,4735,4736],{},"Production secrets, passwords, access keys, certificates, etc.",[147,4738,4739],{},"Production security audit logs, events, and incident data",[19,4741,4742,4744],{},[423,4743,4689],{}," data includes data that contains significant value to the company.",[19,4746,4747],{},"Unauthorized disclosure may result in disruption to business operations and loss of value.",[19,4749,4750],{},"Disclosure requires the signing of NDA and management approval.",[19,4752,4753,4723],{},[2562,4754,4755],{},"Example Confidential Data",[144,4757,4758,4761,4764,4767,4770],{},[147,4759,4760],{},"Business plans",[147,4762,4763],{},"Employee\u002FHR data",[147,4765,4766],{},"Any news or public announcement - prior to publication",[147,4768,4769],{},"Non-production security data",[147,4771,4772],{},"Incident reports - prior to publication",[19,4774,4775,4777],{},[423,4776,4692],{}," data contains information used for day-to-day internal operations of\nthe company.",[19,4779,4780],{},"Unauthorized disclosure may cause undesirable outcomes to business operations.",[19,4782,4783],{},"Disclosure requires management approval. NDA is usually required but may be\nwaived on a case-by-case basis.",[19,4785,4786,4723],{},[2562,4787,4788],{},"Example Internal Data",[144,4790,4791,4794,4797,4799],{},[147,4792,4793],{},"Slack messages",[147,4795,4796],{},"Meeting minutes, unless classified otherwise",[147,4798,832],{},[147,4800,4801],{},"Legal documents",[19,4803,4804,4806],{},[423,4805,4695],{}," data is data intended for public consumption and can be freely distributed\noutside of FlowFuse.",[19,4808,4809,4723],{},[2562,4810,4811],{},"Example Public Data",[144,4813,4814,4817,4820,4823],{},[147,4815,4816],{},"FlowFuse source code, unless classified otherwise",[147,4818,4819],{},"Marketing material",[147,4821,4822],{},"Product documentation",[147,4824,4825],{},"The company handbook",[14,4827,4829],{"id":4828},"data-handling-requirements","Data Handling Requirements",[164,4831,4686],{"id":4832},"critical",[144,4834,4835,4838,4841,4844,4847,4850],{},[147,4836,4837],{},"Encrypted at rest",[147,4839,4840],{},"Not stored outside of protected systems - eg secure password vault",[147,4842,4843],{},"Backups encrypted and secured",[147,4845,4846],{},"Retained for as long as operationally, contractually or legally required",[147,4848,4849],{},"Only accessible to privileged users",[147,4851,4852],{},"Never transferred to entities outside of the company",[164,4854,4689],{"id":4855},"confidential",[144,4857,4858,4860,4862,4865,4868],{},[147,4859,4837],{},[147,4861,4843],{},[147,4863,4864],{},"No anonymous access",[147,4866,4867],{},"Access based on 'need-to-know'",[147,4869,4870],{},"Transfer to entities outside of the company only done via legal contract or\narrangement with the explicit permission of management and\u002For the data owner",[164,4872,4692],{"id":4873},"internal",[144,4875,4876,4879,4882],{},[147,4877,4878],{},"Access restricted to company employees or approved contractors",[147,4880,4881],{},"No unauthenticated access",[147,4883,4870],{},[164,4885,4695],{"id":4701},[144,4887,4888],{},[147,4889,4890],{},"No special data handling required - other than due diligence that higher\nclassified data is not accidentally included in public data. For example, access\ntokens in source code.",[14,4892,4894],{"id":4893},"data-retention","Data Retention",[19,4896,4897],{},"FlowFuse shall retain data as long as the company has a need for its use, or to\nmeet regulatory or contractual requirements. Once data is no longer needed, it\nshall be securely disposed of or archived. Data owners, in consultation with\nlegal counsel, may determine retention periods for their data.",[19,4899,4900],{},"Personally identifiable information (PII) shall be deleted or de-identified as\nsoon as it no longer has a business use.",[14,4902,4904],{"id":4903},"data-disposal","Data Disposal",[19,4906,4907],{},"Data classified as critical, confidential or internal shall be securely deleted\nwhen no longer needed.",[19,4909,4910],{},"FlowFuse will ensure any third-party system used in the operations of the company\nwill meet the requires for secure data disposal.",[19,4912,4913],{},"Personally identifiable information (PII) shall be collected, used and retained\nonly for as long as the company has a legitimate business purpose. PII shall be\nsecurely deleted and disposed of following contract termination in accordance\nwith company policy, contractual commitments and all relevant laws and regulations.\nPII shall also be deleted in response to a verified request from a consumer or\ndata subject, where the company does not have a legitimate business interest or\nother legal obligation to retain the data.",[14,4915,4917],{"id":4916},"legal-requirements","Legal Requirements",[19,4919,4920],{},"Under certain circumstances, FlowFuse may become subject to legal proceedings\nrequiring retention of data associated with legal holds, lawsuits, or other\nmatters as stipulated by FlowFuse legal counsel. Such records and information\nare exempt from any other requirements specified within this Data Management Policy\nand are to be retained in accordance with requirements identified by the Legal\ndepartment. All such holds and special retention requirements are subject to\nannual review with FlowFuse's legal counsel to evaluate continuing requirements\nand scope.",[14,4922,4085],{"id":4084},[19,4924,4595],{},[14,4926,4092],{"id":4091},[19,4928,4600],{},[3601,4930],{},[19,4932,4265,4933,3237,4936,4273,4939],{},[46,4934,4269],{"href":3612,"rel":4935},[108],[46,4937,4113],{"href":3617,"rel":4938},[108],[46,4940,3626],{"href":3624,"rel":4941},[108],{"title":75,"searchDepth":76,"depth":76,"links":4943},[4944,4945,4946,4947,4950,4956,4957,4958,4959,4960],{"id":3412,"depth":76,"text":928},{"id":3418,"depth":76,"text":3419},{"id":4668,"depth":76,"text":3426},{"id":4677,"depth":76,"text":4678,"children":4948},[4949],{"id":4705,"depth":605,"text":4706},{"id":4828,"depth":76,"text":4829,"children":4951},[4952,4953,4954,4955],{"id":4832,"depth":605,"text":4686},{"id":4855,"depth":605,"text":4689},{"id":4873,"depth":605,"text":4692},{"id":4701,"depth":605,"text":4695},{"id":4893,"depth":76,"text":4894},{"id":4903,"depth":76,"text":4904},{"id":4916,"depth":76,"text":4917},{"id":4084,"depth":76,"text":4085},{"id":4091,"depth":76,"text":4092},{},{"title":3426,"description":75},"handbook\u002Fcompany\u002Fsecurity\u002Fdata-management","_j6cegNE80Sz2isfDhmBT5JW3KJ66J78Q2FtCRAfuss",{"id":4966,"title":4967,"body":4968,"description":75,"extension":81,"meta":5144,"navGroup":83,"navOrder":83,"navTitle":4967,"navigation":84,"path":5145,"seo":5146,"stem":5147,"__hash__":5148},"handbook\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fhuman-resources.md","Human Resources Security Policy",{"type":7,"value":4969,"toc":5130},[4970,4973,4991,4993,4996,4998,5001,5005,5009,5012,5015,5019,5027,5035,5039,5042,5045,5049,5052,5063,5066,5069,5072,5075,5079,5082,5089,5092,5095,5099,5102,5108,5110,5113,5115,5117,5119],[10,4971,4967],{"id":4972},"human-resources-security-policy",[910,4974,4975,4983],{},[913,4976,4977],{},[916,4978,4979,4981],{},[919,4980,3396],{},[919,4982,3399],{},[930,4984,4985],{},[916,4986,4987,4989],{},[935,4988,4653],{},[935,4990,4006],{},[14,4992,928],{"id":3412},[19,4994,4995],{},"To ensure that employees and contractors meet security requirements, understand\ntheir responsibilities, and are suitable for their roles.",[14,4997,3419],{"id":3418},[19,4999,5000],{},"This policy applies to all employees of FlowFuse, consultants, contractors and\nother third-party entities with access to FlowFuse production networks and\nsystem resources.",[14,5002,5004],{"id":5003},"policy","Policy",[164,5006,5008],{"id":5007},"screening","Screening",[19,5010,5011],{},"Background verification checks on FlowFuse personnel shall be carried out in\naccordance with relevant laws, regulations, and shall be proportional to the\nbusiness requirements, the classification of the information to be accessed, and\nthe perceived risks.",[19,5013,5014],{},"All third-parties with technical privileged or administrative access to FlowFuse\nproduction systems or networks are subject to a background check or requirement\nto provide evidence of an acceptable background, based on their level of access\nand the perceived risk to FlowFuse.",[164,5016,5018],{"id":5017},"competence-performance-assessment","Competence & Performance Assessment",[19,5020,5021,5022,5026],{},"The skills and competence of employees and contractors shall be assessed as part\nof the ",[46,5023,5025],{"href":5024},"\u002Fhandbook\u002Fpeopleops\u002Fhiring","hiring process",". Required skills and competencies shall be listed in job\ndescriptions and requisitions, and\u002For aligned with the responsibilities outlined\nin the Information Security Roles and Responsibilities Policy. Competency\nevaluations may include reference checks, education and certification verifications,\ntechnical testing, and interviews.",[19,5028,5029,5030,5034],{},"All FlowFuse employees will undergo an ",[46,5031,5033],{"href":5032},"\u002Fhandbook\u002Fpeopleops\u002Fperformance-review","annual performance review"," which will\ninclude an assessment of job performance, competence in the role, adherence to\ncompany policies and code of conduct, and achievement of role-specific objectives.",[164,5036,5038],{"id":5037},"terms-conditions-of-employment","Terms & Conditions of Employment",[19,5040,5041],{},"Company policies and information security roles and responsibilities shall be\ncommunicated to employees and third-parties at the time of hire or engagement,\nand employees and contractors are required to formally acknowledge their\nunderstanding and acceptance of their security responsibilities.",[19,5043,5044],{},"Employees and relevant third-parties shall follow all FlowFuse information\nsecurity policies.",[164,5046,5048],{"id":5047},"management-responsibilities","Management Responsibilities",[19,5050,5051],{},"Each policy owner shall be responsible for ensuring that information security policies\nand procedures are reviewed annually, available in the company handbook, and that\nemployees and contractors abide by those policies and procedures for the duration\nof their employment or engagement.",[19,5053,5054,5055,5058,5059,549],{},"The primary source for the policies is the ",[46,5056,5057],{"href":61},"company handbook",".\nThe review status of each policy is tracked in ",[46,5060,3626],{"href":5061,"rel":5062},"https:\u002F\u002Fapp.vanta.com",[108],[19,5064,5065],{},"Annual policy reviews shall include a review of any linked or referenced procedures,\nstandards or guidelines.",[19,5067,5068],{},"PeopleOps shall ensure that information security responsibilities are\ncommunicated to individuals, through written job descriptions, policies or some\nother documented method which is accurately updated and maintained.",[19,5070,5071],{},"Compliance with information security policies and procedures and fulfillment of\ninformation security responsibilities shall be evaluated as part of the performance\nreview process wherever applicable.",[19,5073,5074],{},"Management shall consider excessive pressures, and opportunities for fraud when\nestablishing incentives and segregating roles, responsibilities, and authorities.",[164,5076,5078],{"id":5077},"information-security-awareness-education-training","Information Security Awareness, Education & Training",[19,5080,5081],{},"All FlowFuse employees and third-parties with administrative or privileged\ntechnical access to FlowFuse production systems and networks shall complete\nsecurity awareness training at the time of hire and annually thereafter.",[19,5083,5084,5085,5088],{},"This is managed via the ",[46,5086,3626],{"href":5061,"rel":5087},[108]," platform.",[19,5090,5091],{},"Management shall monitor training completion and shall take appropriate steps to\nensure compliance with this policy. Employees and contractors shall be aware of\nrelevant information security and data privacy policies and procedures. The\ncompany shall ensure that personnel receive security and data privacy training\nappropriate to their role and data handling responsibilities.",[19,5093,5094],{},"In order to maintain a robust level of security awareness, the company will\nprovide security-related updates and communications to company personnel on an\non-going basis through the usual communication channels as needed.",[164,5096,5098],{"id":5097},"termination-process","Termination Process",[19,5100,5101],{},"Employee and contractor termination and offboarding processes shall ensure that\nphysical and logical access is promptly revoked in accordance with company SLAs\nand policies, and that all company issued equipment is returned.",[19,5103,5104,5105],{},"The full offboarding process is available ",[46,5106,2011],{"href":5107},"\u002Fhandbook\u002Fpeopleops\u002Fhiring#offboarding",[14,5109,4085],{"id":4084},[19,5111,5112],{},"Requests for an exception to this policy must be submitted by email to the CEO\nor CTO for approval.",[14,5114,4092],{"id":4091},[19,5116,4600],{},[3601,5118],{},[19,5120,4265,5121,3237,5124,4273,5127],{},[46,5122,4269],{"href":3612,"rel":5123},[108],[46,5125,4113],{"href":3617,"rel":5126},[108],[46,5128,3626],{"href":3624,"rel":5129},[108],{"title":75,"searchDepth":76,"depth":76,"links":5131},[5132,5133,5134,5142,5143],{"id":3412,"depth":76,"text":928},{"id":3418,"depth":76,"text":3419},{"id":5003,"depth":76,"text":5004,"children":5135},[5136,5137,5138,5139,5140,5141],{"id":5007,"depth":605,"text":5008},{"id":5017,"depth":605,"text":5018},{"id":5037,"depth":605,"text":5038},{"id":5047,"depth":605,"text":5048},{"id":5077,"depth":605,"text":5078},{"id":5097,"depth":605,"text":5098},{"id":4084,"depth":76,"text":4085},{"id":4091,"depth":76,"text":4092},{},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fhuman-resources",{"title":4967,"description":75},"handbook\u002Fcompany\u002Fsecurity\u002Fhuman-resources","krR6EU7JKYaqRD700ALeWHjkF8Q5L1MXYPHRQoaZ2FM",{"id":5150,"title":5151,"body":5152,"description":75,"extension":81,"meta":5487,"navGroup":83,"navOrder":83,"navTitle":5151,"navigation":84,"path":5488,"seo":5489,"stem":5490,"__hash__":5491},"handbook\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fincident-response.md","Incident Response Plan",{"type":7,"value":5153,"toc":5467},[5154,5157,5175,5177,5180,5182,5185,5189,5196,5200,5206,5215,5219,5222,5233,5236,5250,5254,5258,5261,5284,5287,5291,5298,5318,5322,5352,5356,5362,5368,5372,5375,5378,5416,5420,5423,5426,5429,5433,5436,5439,5443,5446,5448,5450,5452,5454,5456],[10,5155,5151],{"id":5156},"incident-response-plan",[910,5158,5159,5167],{},[913,5160,5161],{},[916,5162,5163,5165],{},[919,5164,3396],{},[919,5166,3399],{},[930,5168,5169],{},[916,5170,5171,5173],{},[935,5172,3406],{},[935,5174,4163],{},[14,5176,928],{"id":3412},[19,5178,5179],{},"This document establishes the plan for managing information security incidents\nand events, and offers guidance for employees or incident responders who believe\nthey have discovered, or are responding to, a security incident.",[14,5181,3419],{"id":3418},[19,5183,5184],{},"This policy covers all information security or data privacy events or incidents.",[14,5186,5188],{"id":5187},"external-vulnerability-disclosures","External Vulnerability Disclosures",[19,5190,5191,5192,549],{},"This policy relates to how we deal with security issues internally. For information\non how to report potential vulnerabilities in the FlowFuse platform and associated\ncomponents from outside the company, please refer to our ",[46,5193,5195],{"href":5194},"\u002Fhandbook\u002Fengineering\u002Fsecurity","Vulnerability Reporting policy",[14,5197,5199],{"id":5198},"incident-and-event-definitions","Incident and Event Definitions",[19,5201,1388,5202,5205],{},[423,5203,5204],{},"security event"," is an observable occurrence relevant to the confidentiality,\navailability, integrity, or privacy of company controlled data, systems or networks.",[19,5207,1388,5208,5211,5212,5214],{},[423,5209,5210],{},"security incident"," is a ",[2562,5213,5204],{}," which results in loss or damage to\nthe confidentiality, availability, integrity, or privacy of company controlled\ndata, systems or networks.",[14,5216,5218],{"id":5217},"security-incident-response-team","Security Incident Response Team",[19,5220,5221],{},"The Security Incident Response Team (SIRT) is responsible for",[144,5223,5224,5227,5230],{},[147,5225,5226],{},"Reviewing analyzing, and logging all received reports and tracking their statuses.",[147,5228,5229],{},"Performing investigations, creating and executing action plans, and post-incident activities.",[147,5231,5232],{},"Collaboration with law enforcement agencies.",[19,5234,5235],{},"Current members of the FlowFuse SIRT:",[144,5237,5238,5241,5244,5247],{},[147,5239,5240],{},"CTO",[147,5242,5243],{},"CEO",[147,5245,5246],{},"Customer Success manager",[147,5248,5249],{},"Product Manager",[14,5251,5253],{"id":5252},"incident-reporting-documentation","Incident Reporting & Documentation",[164,5255,5257],{"id":5256},"reporting","Reporting",[19,5259,5260],{},"If a FlowFuse employee, contractor, user, or customer becomes aware of an\ninformation security event or incident, possible incident, imminent incident,\nunauthorized access, policy violation, security weakness, or suspicious activity,\nthen they shall immediately report the information using one of the following\ncommunication channels:",[144,5262,5263,5271,5281],{},[147,5264,5265,5266,5270],{},"Email ",[46,5267,5269],{"href":5268},"mailto:security@flowfuse.com","security@flowfuse.com"," with information or reports about the event or\nincident",[147,5272,5273,5274],{},"Raise an issue in ",[46,5275,5278],{"href":5276,"rel":5277},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fsecurity",[108],[542,5279,5280],{},"flowforge\u002Fsecurity",[147,5282,5283],{},"Report it in #security channel in slack",[19,5285,5286],{},"Reports should include specific details about what has been observed or discovered.",[164,5288,5290],{"id":5289},"severity","Severity",[19,5292,1375,5293,5297],{},[46,5294,5296],{"href":5295},"#security-incident-response-team","SIRT"," shall monitor incident and event\nissues and shall assign a severity (via label) based on the following categories:",[144,5299,5300,5306,5312],{},[147,5301,5302,5305],{},[423,5303,5304],{},"P3\u002FP4"," - Low and Medium Severity\nIssues meeting this severity are simply suspicions or odd behaviors. They\nare not verified and require further investigation. There is no clear indicator\nthat systems have tangible risk and do not require emergency response. This\nincludes lost\u002Fstolen laptop with disk encryption, suspicious emails, outages,\nstrange activity on a laptop, etc.",[147,5307,5308,5311],{},[423,5309,5310],{},"P2"," - High Severity\nHigh severity issues relate to problems where an adversary or active\nexploitation hasn't been proven yet, and may not have happened, but is likely\nto happen. This may include lost\u002Fstolen laptop without encryption, vulnerabilities\nwith direct risk of exploitation, threats with risk or adversarial persistence\non our systems (e.g.: backdoors, malware), malicious access of business\ndata (e.g.: passwords, vulnerability data, payments information).",[147,5313,5314,5317],{},[423,5315,5316],{},"P1"," - Critical Severity\nCritical issues relate to actively exploited risks and involve a malicious\nactor or threats that put any individual at risk of physical harm.\nIdentification of active exploitation is required to meet this severity category.",[164,5319,5321],{"id":5320},"escalation-and-internal-reporting","Escalation and Internal Reporting",[144,5323,5324,5331,5342],{},[147,5325,5326,5328,5329],{},[423,5327,5316],{}," - Critical Severity\nP1 issues require immediate notification to a member of the ",[46,5330,5296],{"href":5295},[147,5332,5333,5335,5336,5341],{},[423,5334,5310],{}," - High Severity\nAn issue should be raised in ",[46,5337,5339],{"href":5276,"rel":5338},[108],[542,5340,5280],{},"\nand explicit notification in the #security channel",[147,5343,5344,5346,5347],{},[423,5345,5304],{}," - Medium and Low Severity\nAn issue should be raised in ",[46,5348,5350],{"href":5276,"rel":5349},[108],[542,5351,5280],{},[164,5353,5355],{"id":5354},"documentation","Documentation",[19,5357,5358,5359,5361],{},"All reported security events, incidents, and response activities shall be documented\nand adequately protected in the ",[542,5360,5280],{}," repository.",[19,5363,5364,5365,5367],{},"A root cause analysis (RCA) may be performed on all verified ",[423,5366,5316],{}," security incidents.\nIt will be reference in the incident issue and reviewed by the SIRT.",[14,5369,5371],{"id":5370},"incident-response-process","Incident Response Process",[19,5373,5374],{},"For critical issues, the response team will follow an iterative response process.",[19,5376,5377],{},"This covers the following phases:",[504,5379,5380,5386,5392,5398,5404,5410],{},[147,5381,5382,5385],{},[423,5383,5384],{},"Investigate"," - establish the known facts of the situation.",[147,5387,5388,5391],{},[423,5389,5390],{},"Contain"," - limit the impact of the situation.",[147,5393,5394,5397],{},[423,5395,5396],{},"Eradicate"," - remove the immediate cause of the situation.",[147,5399,5400,5403],{},[423,5401,5402],{},"Recover"," - restore the affected systems and services.",[147,5405,5406,5409],{},[423,5407,5408],{},"Remediate"," - apply necessary preventative measures to ensure the situation cannot happen again.",[147,5411,5412,5415],{},[423,5413,5414],{},"Document"," - perform a post-mortem of the situation and a root-cause analysis (RCA). Document to ensure lessons can be learnt.",[14,5417,5419],{"id":5418},"external-communications-and-breach-reporting","External Communications and Breach Reporting",[19,5421,5422],{},"In the event of unauthorized access to company or customer systems, networks,\nand\u002For data, the CEO, with Legal advice, determine what external communications\nare required.",[19,5424,5425],{},"Breaches shall be reported to customers, consumers, data subjects and regulators\nwithout undue delay and in accordance with all contractual commitments and\napplicable legislation.",[19,5427,5428],{},"No personnel may disclose information regarding incident or potential breaches\nto any third party or unauthorized person without the approval of legal and\u002For\nexecutive management.",[14,5430,5432],{"id":5431},"mitigation-and-remediation","Mitigation and Remediation",[19,5434,5435],{},"The CEO and CTO shall determine any immediate or long term mitigations or\nremedial actions that need to be taken as a result of an incident or breach.",[19,5437,5438],{},"In the event that mitigations or remedial actions are needed, executive staff\nshall direct personnel with respect to planning, communicating and executing\nthose activities.",[164,5440,5442],{"id":5441},"cooperation-with-customers-data-controller-and-authorities","Cooperation with Customers, Data Controller and Authorities",[19,5444,5445],{},"As needed and determined by legal and executive staff, the company shall\ncooperate with customers, Data Controllers and regulators to fulfill all of its\nobligations in the event of an incident or data breach.",[14,5447,4085],{"id":4084},[19,5449,4595],{},[14,5451,4092],{"id":4091},[19,5453,4600],{},[3601,5455],{},[19,5457,4265,5458,3237,5461,4273,5464],{},[46,5459,4269],{"href":3612,"rel":5460},[108],[46,5462,4113],{"href":3617,"rel":5463},[108],[46,5465,3626],{"href":3624,"rel":5466},[108],{"title":75,"searchDepth":76,"depth":76,"links":5468},[5469,5470,5471,5472,5473,5474,5480,5481,5482,5485,5486],{"id":3412,"depth":76,"text":928},{"id":3418,"depth":76,"text":3419},{"id":5187,"depth":76,"text":5188},{"id":5198,"depth":76,"text":5199},{"id":5217,"depth":76,"text":5218},{"id":5252,"depth":76,"text":5253,"children":5475},[5476,5477,5478,5479],{"id":5256,"depth":605,"text":5257},{"id":5289,"depth":605,"text":5290},{"id":5320,"depth":605,"text":5321},{"id":5354,"depth":605,"text":5355},{"id":5370,"depth":76,"text":5371},{"id":5418,"depth":76,"text":5419},{"id":5431,"depth":76,"text":5432,"children":5483},[5484],{"id":5441,"depth":605,"text":5442},{"id":4084,"depth":76,"text":4085},{"id":4091,"depth":76,"text":4092},{},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fincident-response",{"title":5151,"description":75},"handbook\u002Fcompany\u002Fsecurity\u002Fincident-response","ByV1HW5fyxyh1kepeaiftDNwB8C8B_rG-9Jh2Z355GA",{"id":5493,"title":2914,"body":5494,"description":5500,"extension":81,"meta":5619,"navGroup":83,"navOrder":83,"navTitle":2914,"navigation":84,"path":5620,"seo":5621,"stem":5622,"__hash__":5623},"handbook\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Findex.md",{"type":7,"value":5495,"toc":5612},[5496,5498,5501,5504,5579,5583,5587,5590,5593,5597,5600,5604],[10,5497,2914],{"id":62},[19,5499,5500],{},"To ensure the safety and security of our company, employees, and customers, FlowFuse\nmaintains a set of security policies that we all must follow.",[19,5502,5503],{},"It is important that every takes the time to understand their own responsibilities\nin this area, which includes prompt reporting and resolution of any issues identified.",[144,5505,5506,5511,5517,5521,5525,5531,5537,5541,5545,5551,5556,5562,5566,5571,5575],{},[147,5507,5508],{},[46,5509,5510],{"href":4043},"Information Security Policy and Acceptable Use Policy",[147,5512,5513],{},[46,5514,5516],{"href":5515},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Finformation-security-roles","Information Security Roles and Responsibilities",[147,5518,5519],{},[46,5520,3382],{"href":3643},[147,5522,5523],{},[46,5524,3426],{"href":3425},[147,5526,5527],{},[46,5528,5530],{"href":5529},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fsecure-development","Secure Development Policy",[147,5532,5533],{},[46,5534,5536],{"href":5535},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Foperations-security","Operations Security Policy",[147,5538,5539],{},[46,5540,4496],{"href":4626},[147,5542,5543],{},[46,5544,3982],{"href":4133},[147,5546,5547],{},[46,5548,5550],{"href":5549},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fthird-party-risk-management","Third Party Risk Management Policy",[147,5552,5553],{},[46,5554,5555],{"href":5145},"Human Resources Policy",[147,5557,5558],{},[46,5559,5561],{"href":5560},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Frisk-management","Risk Management Policy",[147,5563,5564],{},[46,5565,5151],{"href":5488},[147,5567,5568],{},[46,5569,5570],{"href":4288},"Business Continuity and Disaster Recover Policy",[147,5572,5573],{},[46,5574,4294],{"href":4490},[147,5576,5577],{},[46,5578,3649],{"href":3976},[14,5580,5582],{"id":5581},"credentials","Credentials",[164,5584,5586],{"id":5585},"password-vault","Password vault",[19,5588,5589],{},"The company provides a 1Password Vault account to all employees. When available,\nsign in with your Google Workspace account. When this option is not available,\nyou must not reuse the same password between different application, but you must\ngenerate a new one per application. Passwords are stored in 1Password for both\nindividual user accounts and shared accounts (e.g. FlowFuse npmjs account).",[19,5591,5592],{},"Any shared accounts should be in an appropriate vault shared with those that\nneed it only, but always more than just one person.",[164,5594,5596],{"id":5595},"_2fa","2FA",[19,5598,5599],{},"For all services that support it, 2FA authentication should be enabled and if possible enforced by policy. Where possible the 2FA seed keys should be added to the entry in the Password Vault.",[14,5601,5603],{"id":5602},"executive-fraud","Executive Fraud",[19,5605,5606,5607,5611],{},"The CEO, CTO, and other executives at FlowFuse will never email anyone to wire\nmoney, request you to buy gift cards, or request any other type of monitory\ntransaction. Transactions are started through ",[46,5608,5610],{"href":5609},"\u002Fhandbook\u002Foperations\u002Fvendors","a set process","\nonly. When in doubt, reach out through Slack and request a huddle with the executive\nto validate.",{"title":75,"searchDepth":76,"depth":76,"links":5613},[5614,5618],{"id":5581,"depth":76,"text":5582,"children":5615},[5616,5617],{"id":5585,"depth":605,"text":5586},{"id":5595,"depth":605,"text":5596},{"id":5602,"depth":76,"text":5603},{},"\u002Fhandbook\u002Fcompany\u002Fsecurity",{"title":2914,"description":5500},"handbook\u002Fcompany\u002Fsecurity\u002Findex","UtiOVEmnD8yzUOHtg_a7be2CkFVTxd1lYin8gFhilX8",{"id":5625,"title":5510,"body":5626,"description":75,"extension":81,"meta":5991,"navGroup":83,"navOrder":83,"navTitle":5510,"navigation":84,"path":4043,"seo":5992,"stem":5993,"__hash__":5994},"handbook\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Finformation-security.md",{"type":7,"value":5627,"toc":5975},[5628,5631,5650,5652,5655,5658,5661,5663,5666,5669,5671,5674,5677,5681,5686,5689,5695,5699,5702,5738,5742,5745,5750,5753,5756,5759,5762,5765,5769,5772,5786,5790,5793,5797,5800,5803,5806,5927,5931,5934,5936,5945,5947,5950,5954,5962,5964],[10,5629,5510],{"id":5630},"information-security-policy-and-acceptable-use-policy",[910,5632,5633,5641],{},[913,5634,5635],{},[916,5636,5637,5639],{},[919,5638,3396],{},[919,5640,3399],{},[930,5642,5643],{},[916,5644,5645,5647],{},[935,5646,3406],{},[935,5648,5649],{},"2025-04-16",[14,5651,2167],{"id":2166},[19,5653,5654],{},"This Information Security Policy is intended to protect FlowFuse's employees,\npartners and the company from illegal or damaging actions by individuals, either\nknowingly or unknowingly.",[19,5656,5657],{},"FlowFuse systems are to be used for business purposes in serving the interests of\nthe company, and of our clients and customers in the course of normal operations.",[19,5659,5660],{},"Effective security is a team effort involving the participation and support of\nevery FlowFuse employee or contractor who deals with information and\u002For\ninformation systems. It is the responsibility of every team member to read and\nunderstand this policy, and to conduct their activities accordingly.",[14,5662,928],{"id":3412},[19,5664,5665],{},"The purpose of this policy is to communicate our information security policies\nand outline the acceptable use and protection of FlowFuse's information and\nassets. These rules are in place to protect customers, employees, and FlowFuse.\nInappropriate use exposes FlowFuse to risks including virus attacks, compromise\nof network systems and services, financial and reputational risk, and legal and\ncompliance issues.",[19,5667,5668],{},"The FlowFuse \"Information Security Policy\" is comprised of this policy and all\nFlowFuse policies referenced and\u002For linked within this document.",[14,5670,3419],{"id":3418},[19,5672,5673],{},"This policy applies to the use of information, electronic and computing devices,\nand network resources to conduct FlowFuse business or interact with internal\nnetworks and business systems, whether owned or leased by FlowFuse, the employee,\nor a third party. All employees, contractors, consultants, temporary, and other\nworkers at FlowFuse and its subsidiaries are responsible for exercising good\njudgment regarding appropriate use of information, electronic devices, and\nnetwork resources in accordance with FlowFuse policies and standards, and local\nlaws and regulations.",[19,5675,5676],{},"This policy applies to employees, contractors, consultants, temporaries, and\nother workers at FlowFuse, including all personnel affiliated with third\nparties. This policy applies to all FlowFuse-controlled company and customer\ndata as well as all equipment, systems, networks and software owned or leased by\nFlowFuse.",[14,5678,5680],{"id":5679},"security-incident-reporting","Security Incident Reporting",[19,5682,5683,5684,549],{},"All users are required to report known or suspected security events or incidents,\nincluding policy violations and observed security weaknesses. Incidents shall be\nreported immediately or as soon as possible by sending an email to ",[46,5685,5269],{"href":5268},[19,5687,5688],{},"In your email please describe the incident or observation along with any relevant\ndetails.",[19,5690,5691,5692,549],{},"Any security issue related to vulnerabilities in the product should be reported\nvia our ",[46,5693,5694],{"href":5194},"disclosure policy",[14,5696,5698],{"id":5697},"device-policy","Device Policy",[19,5700,5701],{},"All end-user devices (e.g., mobile phones, tablets, laptops, desktops) must\ncomply with this policy.",[504,5703,5704,5709,5712,5715,5718,5721,5726,5729,5732,5735],{},[147,5705,5706,5707,549],{},"System level and user level passwords must comply with the ",[46,5708,3382],{"href":3643},[147,5710,5711],{},"Providing access to another individual, either deliberately or through failure\nto secure a device is prohibited.",[147,5713,5714],{},"All end-user, personal (BYOD) or company owned devices used to access FlowFuse\ninformation systems (i.e. email) must adhere to the following rules and requirements:",[147,5716,5717],{},"Devices must be secured with a password (or equivalent control such as biometric)\nprotected screensaver or screen lock.",[147,5719,5720],{},"Devices must not be left unattended in public.",[147,5722,5723,5724],{},"Users must report any suspected misuse or theft of a mobile device immediately\nto ",[46,5725,5269],{"href":5268},[147,5727,5728],{},"Avoid sharing credentials. Secrets must be stored safely, using features such\nas GitHub Secrets. For accounts and other sensitive data that need to be shared\nuse the company-provided password manager, 1Password, and ensure an appropriate\nscope of sharing is used.",[147,5730,5731],{},"Confidential information must not be stored on portable media such as USB drives",[147,5733,5734],{},"Accessing FlowFuse systems on public \"shared\" computers, such as hotel kiosks\nis strictly prohibited",[147,5736,5737],{},"Upon termination users agree to return all company owned devices and delete\nall company information and accounts from any personal devices",[14,5739,5741],{"id":5740},"acceptable-use-policy","Acceptable Use Policy",[19,5743,5744],{},"FlowFuse proprietary and customer information stored on electronic and computing\ndevices, whether owned or leased by FlowFuse, the employee or a third party,\nremains the sole property of FlowFuse for the purposes of this policy.",[19,5746,5747,5748,549],{},"Employees and contractors must ensure through legal or technical means that\nproprietary information is protected in accordance with the ",[46,5749,3426],{"href":3425},[19,5751,5752],{},"Google Drive should be used to store and share files within the company, ensuring\nproper access controls are applied.",[19,5754,5755],{},"You have a responsibility to promptly report the theft, loss, or unauthorized\ndisclosure of FlowFuse proprietary information or equipment. You may access,\nuse or share FlowFuse proprietary information only to the extent it is authorized\nand necessary to fulfill your assigned job duties.",[19,5757,5758],{},"Employees are responsible for exercising good judgment regarding the\nreasonableness of personal use of company-provided devices.",[19,5760,5761],{},"For security and network maintenance purposes, authorized individuals within\nFlowFuse may monitor equipment, systems and network traffic at any time.\nFlowFuse reserves the right to audit networks and systems on a periodic basis\nto ensure compliance with this policy.",[19,5763,5764],{},"Employees must ensure the software they use is properly licensed and used as\nintended.",[164,5766,5768],{"id":5767},"ai-tools-usage","AI Tools Usage",[19,5770,5771],{},"When using AI tools:",[504,5773,5774,5777,5780,5783],{},[147,5775,5776],{},"Do not input sensitive or confidential information unless explicitly approved",[147,5778,5779],{},"Be aware of data retention and privacy policies of AI tools",[147,5781,5782],{},"Follow our security policies and guidelines",[147,5784,5785],{},"Report any security concerns related to AI tool usage immediately",[14,5787,5789],{"id":5788},"unacceptable-use","Unacceptable Use",[19,5791,5792],{},"Under no circumstances is an employee of FlowFuse authorized to engage in any\nactivity that is illegal under local, state, federal or international law while\nutilizing FlowFuse-owned resources or while representing FlowFuse in any capacity.",[14,5794,5796],{"id":5795},"additional-policies-and-procedures-incorporated-by-reference","Additional Policies and Procedures Incorporated by Reference",[19,5798,5799],{},"Personnel are responsible for reading and complying with all policies relevant\nto their roles and responsibilities.",[19,5801,5802],{},"The following table lists the policies that form our Information Security model.",[19,5804,5805],{},"This table will be updated with links to the individual policy documents as they\nget added to the handbook and adopted.",[910,5807,5808,5817],{},[913,5809,5810],{},[916,5811,5812,5815],{},[919,5813,5814],{},"Role",[919,5816,928],{},[930,5818,5819,5828,5837,5847,5856,5865,5874,5883,5892,5900,5909,5918],{},[916,5820,5821,5825],{},[935,5822,5823],{},[46,5824,3382],{"href":3643},[935,5826,5827],{},"To limit access to information and information processing systems to authorized parties in accordance with business objectives.",[916,5829,5830,5834],{},[935,5831,5832],{},[46,5833,3982],{"href":4133},[935,5835,5836],{},"To identify organizational assets and define appropriate protection responsibilities.",[916,5838,5839,5844],{},[935,5840,5841],{},[46,5842,5843],{"href":4288},"Business Continuity & Disaster Recovery Plan",[935,5845,5846],{},"To prepare FlowFuse in the event of extended service outages caused by factors beyond our control (e.g., natural disasters, man-made events), and to restore services to the widest extent possible in a minimum time frame.",[916,5848,5849,5853],{},[935,5850,5851],{},[46,5852,4496],{"href":4626},[935,5854,5855],{},"To ensure proper and effective use of cryptography to protect the confidentiality, authenticity and\u002For integrity of information.",[916,5857,5858,5862],{},[935,5859,5860],{},[46,5861,3426],{"href":3425},[935,5863,5864],{},"To ensure that information is classified and protected in accordance with its importance to the organization.",[916,5866,5867,5871],{},[935,5868,5869],{},[46,5870,5555],{"href":5145},[935,5872,5873],{},"To ensure that employees and contractors meet security requirements, understand their responsibilities, and are suitable for their roles.",[916,5875,5876,5880],{},[935,5877,5878],{},[46,5879,5151],{"href":5488},[935,5881,5882],{},"Policy and procedures for suspected or confirmed information security incidents.",[916,5884,5885,5889],{},[935,5886,5887],{},[46,5888,5536],{"href":5535},[935,5890,5891],{},"To ensure the correct and secure operation of information processing systems and facilities.",[916,5893,5894,5897],{},[935,5895,5896],{},"Physical Security Policy",[935,5898,5899],{},"To prevent unauthorized physical access or damage to the organization's information and information processing facilities.",[916,5901,5902,5906],{},[935,5903,5904],{},[46,5905,5561],{"href":5560},[935,5907,5908],{},"To define the process for assessing and managing FlowFuse's information security risks in order to achieve the company's business and information security objectives.",[916,5910,5911,5915],{},[935,5912,5913],{},[46,5914,5530],{"href":5529},[935,5916,5917],{},"To ensure that information security is designed and implemented within the development lifecycle for applications and information systems.",[916,5919,5920,5924],{},[935,5921,5922],{},[46,5923,5550],{"href":5549},[935,5925,5926],{},"To ensure protection of the organization's data and assets that are shared with, accessible to, or managed by suppliers, including external parties or third-party organizations such as service providers, vendors, and customers, and to maintain an agreed level of information security and service delivery in line with supplier agreements.",[14,5928,5930],{"id":5929},"policy-compliance","Policy Compliance",[19,5932,5933],{},"FlowFuse will measure and verify compliance to this policy through various\nmethods, including but not limited to ongoing monitoring, and both internal and\nexternal audits.",[14,5935,4085],{"id":4084},[19,5937,5938,5939,5944],{},"Requests for an exception to this policy must be submitted to the CTO or CEO for\napproval by raising an issue on the ",[46,5940,5943],{"href":5941,"rel":5942},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fadmin",[108],"admin repository","\nor via email if confidentiality is required.",[14,5946,4092],{"id":4091},[19,5948,5949],{},"Any known violations of this policy should be reported to the CTO or CEO.\nViolations of this policy can result in immediate withdrawal or suspension of\nsystem and network privileges and\u002For disciplinary action in accordance with\ncompany procedures up to and including termination of employment.",[14,5951,5953],{"id":5952},"whistleblower-policy","Whistleblower Policy",[19,5955,5956,5957,549],{},"Our Whistleblower Policy is intended to encourage and enable employees and others to raise serious concerns internally so that we can address and correct inappropriate conduct and actions. It is the responsibility of all employees to report concerns about violations of our code of ethics or suspected violations of law or regulations that govern our operations. It is contrary to our values for anyone to retaliate against any employee or who in good faith reports an ethics violation, or a suspected violation of law, such as a complaint of discrimination, or suspected fraud, or suspected violation of any regulation. An employee who retaliates against someone who has reported a violation in good faith is subject to discipline up to and including termination of employment. Anonymous reports may be submitted via FlowFuse's ",[46,5958,5961],{"href":5959,"rel":5960},"https:\u002F\u002Fforms.gle\u002FmttPj8NXd9yhb31H7",[108],"Whistleblower Channel",[3601,5963],{},[19,5965,4265,5966,3237,5969,4273,5972],{},[46,5967,4269],{"href":3612,"rel":5968},[108],[46,5970,4113],{"href":3617,"rel":5971},[108],[46,5973,3626],{"href":3624,"rel":5974},[108],{"title":75,"searchDepth":76,"depth":76,"links":5976},[5977,5978,5979,5980,5981,5982,5985,5986,5987,5988,5989,5990],{"id":2166,"depth":76,"text":2167},{"id":3412,"depth":76,"text":928},{"id":3418,"depth":76,"text":3419},{"id":5679,"depth":76,"text":5680},{"id":5697,"depth":76,"text":5698},{"id":5740,"depth":76,"text":5741,"children":5983},[5984],{"id":5767,"depth":605,"text":5768},{"id":5788,"depth":76,"text":5789},{"id":5795,"depth":76,"text":5796},{"id":5929,"depth":76,"text":5930},{"id":4084,"depth":76,"text":4085},{"id":4091,"depth":76,"text":4092},{"id":5952,"depth":76,"text":5953},{},{"title":5510,"description":75},"handbook\u002Fcompany\u002Fsecurity\u002Finformation-security","3vDF30KH_hRoVxo0TbIvIJwLZvR7jt13dRiyer8s5iA",{"id":5996,"title":5516,"body":5997,"description":75,"extension":81,"meta":6148,"navGroup":83,"navOrder":83,"navTitle":5516,"navigation":84,"path":5515,"seo":6149,"stem":6150,"__hash__":6151},"handbook\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Finformation-security-roles.md",{"type":7,"value":5998,"toc":6137},[5999,6002,6020,6022,6025,6029,6033,6041,6043,6065,6068,6082,6086,6094,6098,6109,6113,6130,6132],[10,6000,5516],{"id":6001},"information-security-roles-and-responsibilities",[910,6003,6004,6012],{},[913,6005,6006],{},[916,6007,6008,6010],{},[919,6009,3396],{},[919,6011,3399],{},[930,6013,6014],{},[916,6015,6016,6018],{},[935,6017,4653],{},[935,6019,4006],{},[14,6021,928],{"id":3412},[19,6023,6024],{},"FlowFuse is committed to conducting business in compliance with all applicable laws,\nregulations, and company policies. FlowFuse has adopted this policy to outline\nthe security measures required to protect electronic information systems and\nrelated equipment from unauthorized use.",[14,6026,6028],{"id":6027},"roles-and-responsibilities","Roles and Responsibilities",[164,6030,6032],{"id":6031},"board-of-directors","Board of directors",[144,6034,6035,6038],{},[147,6036,6037],{},"Oversight over risk and internal control for information security, privacy, and compliance.",[147,6039,6040],{},"Consults with executive leadership to understand FlowFuse's security mission and risks and provides guidance to bring them into alignment",[164,6042,3223],{"id":3222},[144,6044,6045,6048,6051,6054],{},[147,6046,6047],{},"Approves Capital Expenditures for Information Security and Privacy programs and initiatives",[147,6049,6050],{},"Oversight over the execution of the information security and Privacy risk management program and risk treatments",[147,6052,6053],{},"Communication Path to the Board of Directors",[147,6055,6056,6057,2040,6060,6064],{},"Aligns ",[46,6058,6059],{"href":4043},"Information Security",[46,6061,6063],{"href":6062},"\u002Fprivacy-policy\u002F#privacy-policy","Privacy Policy"," based on FlowFuse's mission, strategic objectives and risk appetite",[164,6066,5240],{"id":6067},"cto",[144,6069,6070,6073,6076,6079],{},[147,6071,6072],{},"Oversight over information security in the software development process",[147,6074,6075],{},"Responsible for the design, development, implementation, operation, maintenance\nand monitoring of development and commercial cloud hosting security controls",[147,6077,6078],{},"Responsible for oversight over policy development",[147,6080,6081],{},"Responsible for implementing risk management in the development process",[164,6083,6085],{"id":6084},"systems-owners","Systems Owners",[144,6087,6088,6091],{},[147,6089,6090],{},"Maintain the confidentiality, integrity and availability of the information\nsystems for which they are responsible in compliance with FlowFuse's policies\non information security and privacy",[147,6092,6093],{},"Approval of technical access and change requests for non-standard access to\nsystems under their control",[164,6095,6097],{"id":6096},"employees-contractors-temporary-workers-etc","Employees, contractors, temporary workers, etc.",[144,6099,6100,6103,6106],{},[147,6101,6102],{},"Acting at all times in a manner that does not place at risk the security of\nthemselves, colleagues, and the information and resources they have use of",[147,6104,6105],{},"Helping to identify areas where risk management practices should be adopted",[147,6107,6108],{},"Adhering to company policies and standards of conduct Reporting incidents and\nobserved anomalies or weaknesses",[164,6110,6112],{"id":6111},"peopleops-manager","Peopleops Manager",[144,6114,6115,6118,6121,6124,6127],{},[147,6116,6117],{},"Ensuring employees and contractors are qualified and competent for their roles",[147,6119,6120],{},"Ensuring appropriate testing and background checks are completed",[147,6122,6123],{},"Ensuring that employees and relevant contractors are presented with company policies and the Code of Conduct (CoC)",[147,6125,6126],{},"Ensuring that employee performance and adherence the CoC is periodically evaluated",[147,6128,6129],{},"Ensuring that employees receive appropriate security training",[3601,6131],{},[19,6133,4265,6134],{},[46,6135,3626],{"href":3624,"rel":6136},[108],{"title":75,"searchDepth":76,"depth":76,"links":6138},[6139,6140],{"id":3412,"depth":76,"text":928},{"id":6027,"depth":76,"text":6028,"children":6141},[6142,6143,6144,6145,6146,6147],{"id":6031,"depth":605,"text":6032},{"id":3222,"depth":605,"text":3223},{"id":6067,"depth":605,"text":5240},{"id":6084,"depth":605,"text":6085},{"id":6096,"depth":605,"text":6097},{"id":6111,"depth":605,"text":6112},{},{"title":5516,"description":75},"handbook\u002Fcompany\u002Fsecurity\u002Finformation-security-roles","B2gH9YxsY0EcYAJ-O9Dy4L0Iy9MNpVMuusPKsq1Tmkk",{"id":6153,"title":5536,"body":6154,"description":75,"extension":81,"meta":6304,"navGroup":83,"navOrder":83,"navTitle":5536,"navigation":84,"path":5535,"seo":6305,"stem":6306,"__hash__":6307},"handbook\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Foperations-security.md",{"type":7,"value":6155,"toc":6292},[6156,6159,6177,6179,6181,6183,6186,6190,6196,6200,6203,6206,6209,6226,6230,6233,6236,6242,6246,6249,6252,6255,6258,6261,6265,6268,6271,6273,6275,6277,6279,6281],[10,6157,5536],{"id":6158},"operations-security-policy",[910,6160,6161,6169],{},[913,6162,6163],{},[916,6164,6165,6167],{},[919,6166,3396],{},[919,6168,3399],{},[930,6170,6171],{},[916,6172,6173,6175],{},[935,6174,3406],{},[935,6176,4006],{},[14,6178,928],{"id":3412},[19,6180,5891],{},[14,6182,3419],{"id":3418},[19,6184,6185],{},"All FlowFuse data, information and information systems that are business critical\nand\u002For process, store, or transmit company data.",[14,6187,6189],{"id":6188},"operations-security","Operations Security",[19,6191,6192,6193,549],{},"Both technical and administrative operating procedures shall be documented as\nneeded and made available to all users who need them via the ",[46,6194,2023],{"href":6195},"\u002Fhandbook",[164,6197,6199],{"id":6198},"change-management","Change Management",[19,6201,6202],{},"Changes to the organization, business processes, information processing facilities,\nproduction software and infrastructure, and systems that affect information\nsecurity in the production environment and financial systems shall be tested,\nreviewed, and approved prior to production deployment.",[19,6204,6205],{},"All significant changes to in-scope systems and networks must be documented.",[19,6207,6208],{},"Change management processes shall include:",[144,6210,6211,6214,6217,6220,6223],{},[147,6212,6213],{},"Processes for planning and testing of changes, including remediation measures",[147,6215,6216],{},"Documented approval and authorization before proceeding with changes that may\nhave a significant impact on information security, operations, or the production\nplatform",[147,6218,6219],{},"Advance communication\u002Fwarning of changes, including schedules and a description\nof reasonably anticipated effects, provided to all relevant internal and\nexternal stakeholders",[147,6221,6222],{},"Documentation of all emergency changes and subsequent review",[147,6224,6225],{},"A process for remediating unsuccessful changes",[164,6227,6229],{"id":6228},"separation-of-development-staging-and-production-environments","Separation of Development, Staging and Production Environments",[19,6231,6232],{},"Development and staging environments shall be strictly segregated from production\nSaaS environments to reduce the risks of unauthorized access or changes to the\noperational environment.",[19,6234,6235],{},"Confidential production customer data must not be used in development or test\nenvironments without the express approval of the CTO\u002FCEO.",[19,6237,6238,6239,6241],{},"Refer to the ",[46,6240,3426],{"href":3425}," for a description of\nConfidential data. If production customer data is approved for use in the course\nof development or testing, it shall be scrubbed of any such sensitive information\nwhenever feasible.",[14,6243,6245],{"id":6244},"information-backup","Information Backup",[19,6247,6248],{},"The need for backups of systems, databases, information and data shall be considered\nand appropriate backup processes shall be designed, planned and implemented.",[19,6250,6251],{},"Backup procedures must include procedures for maintaining and recovering customer\ndata in accordance with documented SLAs. Security measures to protect backups\nshall be designed and applied in accordance with the confidentiality or sensitivity\nof the data.",[19,6253,6254],{},"Backup copies of information, software and system images shall be taken regularly\nto protect against loss of data. Backups and restore capabilities shall be\nperiodically tested, not less than annually.",[19,6256,6257],{},"Backups must be stored separately from the production data location.",[19,6259,6260],{},"FlowFuse does not regularly backup user devices like laptops. Users are expected to\nstore critical files and information in the company-provided Google Drive with\nappropriate access controls applied.",[14,6262,6264],{"id":6263},"logging-monitoring","Logging & Monitoring",[19,6266,6267],{},"Production infrastructure shall be configured to produce detailed logs appropriate\nto the function served by the system or device. Event logs recording user\nactivities, exceptions, faults and information security events shall be produced,\nkept and reviewed through manual or automated processes as needed.",[19,6269,6270],{},"Appropriate alerts shall be configured for events that represent a significant\nthreat to the confidentiality, availability or integrity of production systems\nor Confidential data.",[14,6272,4085],{"id":4084},[19,6274,4595],{},[14,6276,4092],{"id":4091},[19,6278,4600],{},[3601,6280],{},[19,6282,4265,6283,3237,6286,4273,6289],{},[46,6284,4269],{"href":3612,"rel":6285},[108],[46,6287,4113],{"href":3617,"rel":6288},[108],[46,6290,3626],{"href":3624,"rel":6291},[108],{"title":75,"searchDepth":76,"depth":76,"links":6293},[6294,6295,6296,6300,6301,6302,6303],{"id":3412,"depth":76,"text":928},{"id":3418,"depth":76,"text":3419},{"id":6188,"depth":76,"text":6189,"children":6297},[6298,6299],{"id":6198,"depth":605,"text":6199},{"id":6228,"depth":605,"text":6229},{"id":6244,"depth":76,"text":6245},{"id":6263,"depth":76,"text":6264},{"id":4084,"depth":76,"text":4085},{"id":4091,"depth":76,"text":4092},{},{"title":5536,"description":75},"handbook\u002Fcompany\u002Fsecurity\u002Foperations-security","HkqMHzmMBL1oZskj7IcBYRHjKsA_cG3Mf-fyjmjodp8",{"id":6309,"title":3426,"body":6310,"description":75,"extension":81,"meta":6489,"navGroup":83,"navOrder":83,"navTitle":5561,"navigation":84,"path":5560,"seo":6490,"stem":6491,"__hash__":6492},"handbook\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Frisk-management.md",{"type":7,"value":6311,"toc":6478},[6312,6314,6332,6334,6337,6339,6341,6344,6347,6351,6354,6357,6360,6368,6372,6377,6380,6383,6386,6390,6393,6396,6422,6425,6429,6432,6451,6454,6457,6459,6461,6463,6465,6467],[10,6313,3426],{"id":4636},[910,6315,6316,6324],{},[913,6317,6318],{},[916,6319,6320,6322],{},[919,6321,3396],{},[919,6323,3399],{},[930,6325,6326],{},[916,6327,6328,6330],{},[935,6329,3406],{},[935,6331,4006],{},[14,6333,928],{"id":3412},[19,6335,6336],{},"To define actions to address information security risks and opportunities. To\ndefine a plan for the achievement of information security and privacy objectives.",[14,6338,3419],{"id":3418},[19,6340,4665],{},[19,6342,6343],{},"Risks that could affect the medium to long-term goals should be considered as\nwell as risks that will be encountered in the day-to-day delivery of services.",[19,6345,6346],{},"Risks will be targeted to achieve maximum benefit without increasing the\nbureaucratic burden and ultimately affecting core service delivery to the\norganization.",[14,6348,6350],{"id":6349},"risk-management-strategy","Risk Management Strategy",[19,6352,6353],{},"A thorough risk assessment must be conducted to evaluate potential threats and\nvulnerabilities to the confidentiality, integrity, and availability of sensitive,\nconfidential, and proprietary electronic information FlowFuse stores, transmits,\nand\u002For processes.",[19,6355,6356],{},"Risk assessments must be performed with any major change to FlowFuse's business\nor technical operations and\u002For supporting infrastructure no less than once per year.",[19,6358,6359],{},"Strategies shall be developed to mitigate or accept the risks identified in the\nrisk assessment process.",[19,6361,1388,6362,6367],{},[46,6363,6366],{"href":6364,"rel":6365},"https:\u002F\u002Fapp.vanta.com\u002Frisk-management\u002Frisk-register",[108],"risk register"," is maintained\nand monitored quarterly to assess compliance with the above policy, and document\nnewly discovered or created risks.",[14,6369,6371],{"id":6370},"managing-risk","Managing Risk",[19,6373,6374,6375,549],{},"Risks are assessed and ranked according to their impact and their likelihood of\noccurrence. A formal Risk Assessment, and network penetration tests, will be\nperformed at least annually and shall take into consideration the results of any\ntechnical vulnerability management activities performed in accordance with the\n",[46,6376,5536],{"href":5535},[19,6378,6379],{},"Each risk will be assessed as to its likelihood and impact. Both impact and\nlikelihood are assessed on a scale of 1-5. Impact can range from 1 (\"Very low impact\")\nto 5 (\"Very high impact\") and likelihood can range from 1 (\"Very unlikely\") to 5 (\"Very likely\").",[19,6381,6382],{},"The criteria for determining risk is the combined likelihood and impact of an\nevent adversely affecting the confidentiality, availability, integrity, or\nprivacy of organizational and customer information, personally identifiable\ninformation (PII), or business information systems.",[19,6384,6385],{},"For all risk inputs such as risk assessments, vulnerability scans, penetration test,\nbug bounty programs, etc., FlowFuse management shall reserve the right to modify\nrisk rankings based on its assessment of the nature and criticality of the system\nprocessing, as well as the nature, criticality and exploitability (or other\nrelevant factors and considerations) of the identified vulnerability.",[14,6387,6389],{"id":6388},"risk-response-treatment-and-tracking","Risk Response, Treatment, and Tracking",[19,6391,6392],{},"Risk will be prioritized and maintained in a risk register where they will be\nprioritized and mapped using the approach contained in this policy.",[19,6394,6395],{},"The following responses to risk should be employed:",[144,6397,6398,6404,6410,6416],{},[147,6399,6400,6403],{},[423,6401,6402],{},"Modify",": take actions or employ strategies to reduce the risk.",[147,6405,6406,6409],{},[423,6407,6408],{},"Accept",": accept and monitor the risk at the present time. This may be necessary for some risks that arise from external events.",[147,6411,6412,6415],{},[423,6413,6414],{},"Transfer",": pass the risk on to another party. For example contractual terms may be agreed to ensure that the risk is not borne by FlowFuse or insurance may be appropriate for protection against financial loss.",[147,6417,6418,6421],{},[423,6419,6420],{},"Avoid",": cease the activity or to change it in such a way as to end the risk.",[19,6423,6424],{},"Where FlowFuse chooses a risk response other than \"Accept\" or \"Avoid\" it shall\ndevelop a Risk Treatment Plan",[164,6426,6428],{"id":6427},"risk-management-procedures","Risk Management Procedures",[19,6430,6431],{},"The procedure for managing risk will meet the following criteria:",[144,6433,6434,6442,6445,6448],{},[147,6435,6436,6437,6441],{},"FlowFuse will maintain a ",[46,6438,6440],{"href":6364,"rel":6439},[108],"Risk Register"," and Treatment Plan.",[147,6443,6444],{},"Risks are ranked by \"likelihood\" and \"severity\u002Fimpact\" as critical, high, medium, low, and negligible.",[147,6446,6447],{},"Overall risk shall be determined through a combination of likelihood and impact.",[147,6449,6450],{},"Risks may be evaluated to estimate potential monetary loss where possible.",[19,6452,6453],{},"FlowFuse will respond to risks in a prioritized fashion. Remediation priority\nwill consider the risk likelihood and impact, cost, work effort, and availability\nof resources. Multiple remediations may be undertaken simultaneously.",[19,6455,6456],{},"Regular reports will be made to the senior leadership of FlowFuse to ensure\nrisks are being mitigated appropriately, and in accordance with business\npriorities and objectives.",[14,6458,4085],{"id":4084},[19,6460,4595],{},[14,6462,4092],{"id":4091},[19,6464,4600],{},[3601,6466],{},[19,6468,4265,6469,3237,6472,4273,6475],{},[46,6470,4269],{"href":3612,"rel":6471},[108],[46,6473,4113],{"href":3617,"rel":6474},[108],[46,6476,3626],{"href":3624,"rel":6477},[108],{"title":75,"searchDepth":76,"depth":76,"links":6479},[6480,6481,6482,6483,6484,6487,6488],{"id":3412,"depth":76,"text":928},{"id":3418,"depth":76,"text":3419},{"id":6349,"depth":76,"text":6350},{"id":6370,"depth":76,"text":6371},{"id":6388,"depth":76,"text":6389,"children":6485},[6486],{"id":6427,"depth":605,"text":6428},{"id":4084,"depth":76,"text":4085},{"id":4091,"depth":76,"text":4092},{},{"title":3426,"description":75},"handbook\u002Fcompany\u002Fsecurity\u002Frisk-management","IpOzztUnEH0my7nY5bumrVEWB9jtkpd9z_8oVRBUVcE",{"id":6494,"title":5530,"body":6495,"description":75,"extension":81,"meta":6619,"navGroup":83,"navOrder":83,"navTitle":5530,"navigation":84,"path":5529,"seo":6620,"stem":6621,"__hash__":6622},"handbook\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fsecure-development.md",{"type":7,"value":6496,"toc":6613},[6497,6500,6518,6520,6523,6525,6528,6531,6534,6556,6564,6590,6594,6597,6600,6602],[10,6498,5530],{"id":6499},"secure-development-policy",[910,6501,6502,6510],{},[913,6503,6504],{},[916,6505,6506,6508],{},[919,6507,3396],{},[919,6509,3399],{},[930,6511,6512],{},[916,6513,6514,6516],{},[935,6515,3406],{},[935,6517,3409],{},[14,6519,928],{"id":3412},[19,6521,6522],{},"To ensure that information security is designed and implemented within the\ndevelopment lifecycle for applications and information systems.",[14,6524,3419],{"id":3418},[19,6526,6527],{},"All FlowFuse applications and information systems that are business critical\nand\u002For process, store, or transmit Confidential data. This policy applies to all\ninternal and external engineers and developers of FlowFuse software and\ninfrastructure.",[14,6529,5530],{"id":6530},"secure-development-policy-1",[19,6532,6533],{},"FlowFuse policy requires that:",[504,6535,6536,6539],{},[147,6537,6538],{},"FlowFuse software engineering and product development is required to follow\nsecurity best practices. Product should be \"Secure by Design\" and \"Secure by\nDefault\".",[147,6540,6541,6542],{},"Quality assurance activities must be performed as part of the routine development\nprocess. This includes, but not limited to:",[144,6543,6544,6547,6550,6553],{},[147,6545,6546],{},"suitable unit testing included with any change request,",[147,6548,6549],{},"peer code reviews prior to merging changes,",[147,6551,6552],{},"continual automated testing",[147,6554,6555],{},"manual product testing and verification prior to release to production",[19,6557,6558,6559,6563],{},"Code reviews should also cover documentation and tests to ensure our\n",[46,6560,6562],{"href":6561},"\u002Fhandbook\u002Fengineering\u002Fproject-management#defining-done","definition of done"," is\nachieved.",[504,6565,6566,6569,6572,6575,6578,6581,6584,6587],{"start":605},[147,6567,6568],{},"Risk assessment activities (i.e. threat modeling) must be performed for a\nnew product or major changes to an existing product.",[147,6570,6571],{},"Security requirements must be defined, tracked, and implemented.",[147,6573,6574],{},"Security analysis must be performed for any open source software and\u002For\nthird-party components and dependencies included in FlowFuse software products.",[147,6576,6577],{},"Static application security testing (SAST) must be performed throughout\ndevelopment and prior to each release.",[147,6579,6580],{},"Dynamic application security testing (DAST) must be performed prior to each\nrelease.",[147,6582,6583],{},"All critical or high severity security findings must be remediated prior to\neach release.",[147,6585,6586],{},"All critical or high severity vulnerabilities discovered post release must\nbe remediated in the next release or within the defined, predetermined timeframe.",[147,6588,6589],{},"Any exception to the remediation of a finding must be documented and\napproved by the CTO.",[14,6591,6593],{"id":6592},"secure-development-environment","Secure Development Environment",[19,6595,6596],{},"FlowFuse uses separate Staging and Production systems. These are logically\nsegregated environments in different AWS accounts.",[19,6598,6599],{},"The Production environment is classified Critical with suitable controls in place\nto limit access to the infrastructure.",[3601,6601],{},[19,6603,4265,6604,3237,6607,4273,6610],{},[46,6605,4269],{"href":3612,"rel":6606},[108],[46,6608,4113],{"href":3617,"rel":6609},[108],[46,6611,3626],{"href":3624,"rel":6612},[108],{"title":75,"searchDepth":76,"depth":76,"links":6614},[6615,6616,6617,6618],{"id":3412,"depth":76,"text":928},{"id":3418,"depth":76,"text":3419},{"id":6530,"depth":76,"text":5530},{"id":6592,"depth":76,"text":6593},{},{"title":5530,"description":75},"handbook\u002Fcompany\u002Fsecurity\u002Fsecure-development","b5YDXUchqj0K1XoQB5xjwITWyyENcAUS44UQEFQ1Hh4",{"id":6624,"title":6625,"body":6626,"description":75,"extension":81,"meta":6711,"navGroup":83,"navOrder":83,"navTitle":6625,"navigation":84,"path":5549,"seo":6712,"stem":6713,"__hash__":6714},"handbook\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fthird-party-risk-management.md","Third-Party Risk Management Policy",{"type":7,"value":6627,"toc":6704},[6628,6631,6649,6651,6654,6656,6662,6664,6670,6673,6676,6679,6682,6684,6687,6689,6691,6693],[10,6629,6625],{"id":6630},"third-party-risk-management-policy",[910,6632,6633,6641],{},[913,6634,6635],{},[916,6636,6637,6639],{},[919,6638,3396],{},[919,6640,3399],{},[930,6642,6643],{},[916,6644,6645,6647],{},[935,6646,4653],{},[935,6648,4006],{},[14,6650,928],{"id":3412},[19,6652,6653],{},"To ensure protection of the organization's data and assets that are shared with,\naccessible to, or managed by suppliers, including external parties or third-party\norganizations such as service providers, vendors, and customers, and to maintain\nan agreed level of information security and service delivery in line with supplier\nagreements.",[14,6655,3419],{"id":3418},[19,6657,6658,6659,549],{},"All data and information systems owned or used by FlowFuse that are business\ncritical and\u002For process, store, or transmit data classified as ",[46,6660,6661],{"href":3425},"Confidential or Critical",[14,6663,5004],{"id":5003},[19,6665,6666,6667,549],{},"A list of approved vendors\u002Fpartners must be maintained and reviewed annually. This\nlist will be linked from the ",[46,6668,6669],{"href":5609},"Vendor section of the handbook",[19,6671,6672],{},"Approval from management must be in place before onboarding any new vendor or\ncontractor that impacts FlowFuse production systems. Additionally, all changes\nto existing contract agreements must be reviewed and approved before implementation.",[19,6674,6675],{},"For any technology solution that needs to be integrated with FlowFuse production\nenvironment or operations, a review should be held to understand and approve the\nrisk. Periodic compliance assessment and SLA review may be required.",[19,6677,6678],{},"FlowFuse Customers or Partners should not be allowed access outside of their\nown environment, meaning they cannot access, modify, or delete any data belonging\nto other third parties.",[19,6680,6681],{},"Additional vendor agreements should be obtained as required by applicable regulatory\ncompliance requirements.",[14,6683,4085],{"id":4084},[19,6685,6686],{},"Requests for an exception to this policy must be submitted via email to the\nCEO or CTO for approval.",[14,6688,4092],{"id":4091},[19,6690,4600],{},[3601,6692],{},[19,6694,4265,6695,3237,6698,4273,6701],{},[46,6696,4269],{"href":3612,"rel":6697},[108],[46,6699,4113],{"href":3617,"rel":6700},[108],[46,6702,3626],{"href":3624,"rel":6703},[108],{"title":75,"searchDepth":76,"depth":76,"links":6705},[6706,6707,6708,6709,6710],{"id":3412,"depth":76,"text":928},{"id":3418,"depth":76,"text":3419},{"id":5003,"depth":76,"text":5004},{"id":4084,"depth":76,"text":4085},{"id":4091,"depth":76,"text":4092},{},{"title":6625,"description":75},"handbook\u002Fcompany\u002Fsecurity\u002Fthird-party-risk-management","YZso86MatZ47jJ4fThekFnMquYEGBdL7AQMI0GQ4hxw",{"id":6716,"title":6717,"body":6718,"description":6725,"extension":81,"meta":7051,"navGroup":83,"navOrder":83,"navTitle":83,"navigation":84,"path":7052,"seo":7053,"stem":7054,"__hash__":7055},"handbook\u002Fhandbook\u002Fcompany\u002Fstrategy.md","Strategy",{"type":7,"value":6719,"toc":7036},[6720,6723,6726,6740,6744,6747,6751,6754,6757,6765,6768,6772,6781,6784,6788,6802,6806,6817,6821,6824,6841,6844,6848,6856,6860,6863,6866,6904,6908,6911,6918,6922,6925,6930,6948,6952],[10,6721,6717],{"id":6722},"strategy",[19,6724,6725],{},"Please also review:",[144,6727,6728,6734],{},[147,6729,6730,6731,549],{},"our ",[46,6732,6733],{"href":2844},"company values",[147,6735,6730,6736,549],{},[46,6737,6739],{"href":6738},"\u002Fhandbook\u002Fmarketing\u002Fmessaging\u002F","Messaging Framework",[14,6741,6743],{"id":6742},"flowfuses-mission","FlowFuse's Mission",[19,6745,6746],{},"FlowFuse will empower 1 billion people to fuse the digital realm and physical\nreality through building bespoke workflows, applications, and integrations,\nunleashing their creativity so that they can effortlessly leverage their own\nskills and expertise.",[164,6748,6750],{"id":6749},"achieving-our-mission","Achieving our Mission",[19,6752,6753],{},"At the core of FlowFuse is Node-RED, the Low-Code platform that allows many to\nbuild software with little or no coding knowledge. This enables anyone to be\ninnovative and develop solutions to be successful in their respective roles.\nFlowFuse will only be successful if Node-RED becomes the default way to write\nsoftware for hundreds of thousands of people. FlowFuse is, and will remain, the\nprimary contributor to Node-RED. Our product is the best way to run Node-RED at\nany scale.",[19,6755,6756],{},"Furthermore, FlowFuse aims to make it a great experience to build, deploy, and\nmaintain software -- especially for non-software engineers. Allowing complex\nthings to be achieved. Two good examples are",[504,6758,6759,6762],{},[147,6760,6761],{},"FlowFuse Dashboard - Allowing to build Dashboards and interactive\napplications",[147,6763,6764],{},"Project-Link - Linking Edge devices to the Cloud, enabling broadcasts and\npoint-to-point connections",[19,6766,6767],{},"A key differentiator for FlowFuse is our approach to licensing of our software.\nThe core is open, free as in beer and as in speech. Our product is open for\nscrutiny, usage, improvements, for the world. While there's a subset of the\nproduct proprietary licensed, the source is available to read. We believe that\nOpen Source Software plays a key part in education, reducing vendor lock-in, and\ncommunity building.",[14,6769,6771],{"id":6770},"the-market","The market",[19,6773,6774,6775,6780],{},"We focus on\n",[46,6776,6779],{"href":6777,"rel":6778},"https:\u002F\u002Fflowfuse.com\u002Fhandbook\u002Fmarketing\u002Fmessaging\u002F",[108],"Ideal Customer Profile (ICP)","\ncompanies, which are those in manufacturing, logistics, and other data-intensive\nindustrial sectors where operational efficiency is critical to providing value.",[19,6782,6783],{},"Within those companies, we focus our outreach and marketing activities on people\nwho are responsible for improving engineering processes. These individuals are\noften Architects, Engineering Managers, and specialists in IT or OT.",[14,6785,6787],{"id":6786},"the-problems","The problems",[504,6789,6790,6793,6796,6799],{},[147,6791,6792],{},"Data is in Silos and Inaccessible: Industrial data is often hard to access\nand extract, fragmented, and trapped within disparate systems, making it\ndifficult to access and consolidate for analysis. Engineers need a way to\nbreak down these silos and unify their data sources.",[147,6794,6795],{},"Lack of Visualization and Feedback Loops: Existing industrial data systems\noften fail to provide intuitive visualizations and real-time feedback\nmechanisms. Engineers need a platform that allows them to easily visualize\ndata, monitor performance, and quickly identify areas for improvement.",[147,6797,6798],{},"Barriers to Building Solutions: Many industrial engineers lack the correct\ntools and resources to build custom applications for their specific needs. IT\ndepartments typically are focused on business operations and don’t have\nexpertise on industrial systems or processes. However, data analysis\napplications for industrial processes also need to meet company security and\ncompliance requirements. The industrial side of the organization requires a\nsolution that empowers them to create solutions, within compliance\nguidelines, without relying heavily on IT departments or external developers.",[147,6800,6801],{},"Overwhelming Complexity of Industrial Systems: Industrial environments are\ncharacterized by a vast array of protocols, technologies, and legacy systems.\nThis complexity makes it difficult for teams to integrate and leverage data\nfrom different sources into a view of operations that can help identify\noptimizations.",[14,6803,6805],{"id":6804},"why-these-problems-are-significant","Why these problems are significant",[504,6807,6808,6811,6814],{},[147,6809,6810],{},"Suboptimal Decision-Making: When engineers lack access to comprehensive and\ntimely data, they are forced to make decisions based on incomplete or\ninaccurate information. This can lead to missed opportunities, inefficient\nprocesses, and costly errors.",[147,6812,6813],{},"Slow Response to Issues: Without real-time feedback loops and interactive\nvisualizations, it can be difficult to detect and respond to emerging\nproblems promptly. This can result in production delays, quality issues, and\nincreased downtime.",[147,6815,6816],{},"Missed Opportunities for Innovation: The inability to easily build custom\nsolutions stifles innovation. Engineers may have brilliant ideas for\nimprovements but lack the means to implement them, leaving valuable potential\nuntapped.",[14,6818,6820],{"id":6819},"the-value","The Value",[19,6822,6823],{},"The FlowFuse Platform addresses the problems status above by providing our ICP\nwith the tools they need to:",[504,6825,6826,6829,6832,6835],{},[147,6827,6828],{},"Unify and Access Data: FlowFuse breaks down data silos, aggregate data from\ndisparate sources, and make it easily accessible for analysis and decision\nmaking in a secure way.",[147,6830,6831],{},"Visualize and Interact: FlowFuse offers intuitive visualizations, real-time\nfeedback loops, and interactive dashboards that enable engineers to monitor\nperformance, identify trends, and make data-driven decisions.",[147,6833,6834],{},"Build Custom Solutions: The low-code platform empowers engineers to create\ncustom applications, dashboards, and automation workflows without extensive\ncoding knowledge.",[147,6836,6837,6838,549],{},"Simplify Complexity: We abstract away the complexities of industrial systems,\nproviding a comprehensive user-friendly interface that allows engineers to\nfocus on solving problems, not wrestling with technology. See also our\n",[46,6839,6840],{"href":6738},"Messaging page",[19,6842,6843],{},"FlowFuse uses Open-Source technologies like Node-RED and MQTT to help our\ncustomers being successful in remedying their problems.",[14,6845,6847],{"id":6846},"measuring-success","Measuring Success",[19,6849,6850,6851,6855],{},"There's multiple ways to align a company around business goals, and at FlowFuse\nwe've identified ",[46,6852,6854],{"href":6853},"#kpi","KPIs",". A KPI is a tool to identify problems and areas for\nimprovement.",[164,6857,6859],{"id":6858},"kpi","KPI",[19,6861,6862],{},"A KPI, or Key Performance Indicator, is a heuristic metric for company-wide\nsuccess. At FlowFuse we're engaged in many initiatives to grow our offering and\nassess product-market fit.",[19,6864,6865],{},"We review KPIs every Tuesday as part of our recurring strategy meeting.\nAt this time, we review the following KPIs:",[144,6867,6868,6882,6890],{},[147,6869,6870,6871],{},"Product & Engineering\n",[144,6872,6873,6876,6879],{},[147,6874,6875],{},"Engineering Time to Value (Median)",[147,6877,6878],{},"Engineering Time to Value (P75)",[147,6880,6881],{},"Active Node-RED Instances",[147,6883,6884,6885],{},"Marketing\n",[144,6886,6887],{},[147,6888,6889],{},"Pipeline Generated",[147,6891,6892,6893],{},"Sales\n",[144,6894,6895,6898,6901],{},[147,6896,6897],{},"cARR Projected (This Q)",[147,6899,6900],{},"cARR Closed (This Q)",[147,6902,6903],{},"cARR Goal (This Q)",[239,6905,6907],{"id":6906},"annual-recurring-revenue-arr","Annual Recurring Revenue (ARR)",[19,6909,6910],{},"Now that FlowFuse has a stable and maturing product, we're trying to verify\nproduct-market fit. This requires sales, and ARR is a good metric to track this.",[19,6912,6913,6914,6917],{},"Incidental revenue that's ",[2562,6915,6916],{},"not"," recurring does not factor into this metric, as it's\nhard to build a business on unpredictable revenue streams. Furthermore, it's usually\nharder to scale.",[14,6919,6921],{"id":6920},"strategy-meeting","Strategy Meeting",[19,6923,6924],{},"To maintain high velocity and accountability, the strategy team gathers every two weeks. This meeting is not for status updates; it is strictly for decision-making, unblocking strategic initiatives, and translating strategy into immediate tactics.",[19,6926,6927],{},[423,6928,6929],{},"Meeting rules",[504,6931,6932,6935,6938,6945],{},[147,6933,6934],{},"Pre-Read Mandatory: KPIs and the agenda must be in the doc 24 hours prior.",[147,6936,6937],{},"Exception-Based Reporting: We only discuss \"Red\u002FYellow\" metrics (blockers\u002Frisks).",[147,6939,6940,6944],{},[46,6941,6943],{"href":6942},"\u002Fhandbook\u002Fcompany\u002Fvalues\u002F#disagreeandcommit","Disagree & Commit",": Strong debate is encouraged,\nbut once a decision is made, it's made and everyone executes as one.",[147,6946,6947],{},"The Kill List: To add a new initiative, we must explicitly define what we are stopping to free up capacity.",[164,6949,6951],{"id":6950},"meeting-agenda","Meeting agenda",[910,6953,6954,6970],{},[913,6955,6956],{},[916,6957,6958,6961,6964,6967],{},[919,6959,6960],{"align":921},"Time",[919,6962,6963],{"align":921},"Agenda Item",[919,6965,6966],{"align":921},"Goal",[919,6968,6969],{"align":921},"Owner",[930,6971,6972,6985,7004,7022],{},[916,6973,6974,6977,6980,6983],{},[935,6975,6976],{"align":921},"00:00 - 00:05",[935,6978,6979],{"align":921},"Quarterly OKR",[935,6981,6982],{"align":921},"Re-anchor on Quarterly OKR.",[935,6984,5243],{"align":921},[916,6986,6987,6990,6995,7002],{},[935,6988,6989],{"align":921},"00:05 - 00:15",[935,6991,6992,6994],{"align":921},[46,6993,6859],{"href":6853}," Scoreboard",[935,6996,6997,6998,7001],{"align":921},"Review ",[2562,6999,7000],{},"only"," off-track numbers (The Brutal Facts).",[935,7003,5243],{"align":921},[916,7005,7006,7009,7012,7019],{},[935,7007,7008],{"align":921},"00:15 - 00:40",[935,7010,7011],{"align":921},"Strategic Topic",[935,7013,7014,7015,7018],{"align":921},"Discuss ",[2562,7016,7017],{},"one"," major strategic topic or signal.",[935,7020,7021],{"align":921},"Topic Owner",[916,7023,7024,7027,7030,7033],{},[935,7025,7026],{"align":921},"00:40 - 00:55",[935,7028,7029],{"align":921},"Tactics & Kill List",[935,7031,7032],{"align":921},"Update the action list, and assign owners. Review open list of last meeting, review Say vs Do ratio.",[935,7034,7035],{"align":921},"Chief of Staff",{"title":75,"searchDepth":76,"depth":76,"links":7037},[7038,7041,7042,7043,7044,7045,7048],{"id":6742,"depth":76,"text":6743,"children":7039},[7040],{"id":6749,"depth":605,"text":6750},{"id":6770,"depth":76,"text":6771},{"id":6786,"depth":76,"text":6787},{"id":6804,"depth":76,"text":6805},{"id":6819,"depth":76,"text":6820},{"id":6846,"depth":76,"text":6847,"children":7046},[7047],{"id":6858,"depth":605,"text":6859},{"id":6920,"depth":76,"text":6921,"children":7049},[7050],{"id":6950,"depth":605,"text":6951},{},"\u002Fhandbook\u002Fcompany\u002Fstrategy",{"title":6717,"description":6725},"handbook\u002Fcompany\u002Fstrategy","dmDJRYgJtsoVc3BTuj65dugp8AM1ZSN94lZ2oCJoxRg",{"id":7057,"title":2845,"body":7058,"description":7302,"extension":81,"meta":7303,"navGroup":83,"navOrder":83,"navTitle":83,"navigation":84,"path":7304,"seo":7305,"stem":7306,"__hash__":7307},"handbook\u002Fhandbook\u002Fcompany\u002Fvalues.md",{"type":7,"value":7059,"toc":7295},[7060,7063,7068,7071,7075,7112,7116,7166,7170,7201,7205,7256,7260],[10,7061,2845],{"id":7062},"values",[19,7064,7065,7066],{},"FlowFuse has a few core values. Values we aspire to live by in everything we do\nat FlowFuse. With a shared set of values, norms that are created every day will\nalign with what company we want to be, and how we conduct business. When we are\noperating within our Values, we are also abiding by our ",[46,7067,49],{"href":48},[19,7069,7070],{},"Our values are as follows:",[14,7072,7074],{"id":7073},"results","📈 Results",[504,7076,7077,7084,7091,7098,7105],{},[147,7078,7079,7083],{},[46,7080,7082],{"name":7081},"resultsoverhours","Results over Hours",": We value results over the hours you spend working. We appreciate the effort, but value the results. Make users happy, care about the team member you helped. You schedule your day to make the most out of it for you. Don't brag about hours worked, take pride in your achievements.",[147,7085,7086,7090],{},[46,7087,7089],{"name":7088},"doitnow","Do it now",": Growth is exponential; Ship today, observe first results tomorrow, observe compounding effects in just 2 days.",[147,7092,7093,7097],{},[46,7094,7096],{"name":7095},"ownership","Ownership",": Take initiative, keep stakeholders in the loop, find and resolve bottlenecks. Collaborate with others. There's one individual responsible for your achievements; You! Something is never \"not my job\". If you see an opportunity to drive something forward, do it.",[147,7099,7100,7104],{},[46,7101,7103],{"name":7102},"disagreeandcommit","Disagree and commit",": Discussion is healthy, but decisions do not need full consensus. Disagree with a point-of-view, make your case, but accept other solutions are valid too. Once a choice is made, commit as a team to follow it. Allow others to prove themselves. Reaching consensus for every decision does not scale.",[147,7106,7107,7111],{},[46,7108,7110],{"name":7109},"keepitshortandsimple","Keep it short and simple",": Don't over-engineer your solution or let the scope creep beyond what makes sense for an iteration. Fast progress requires fast understanding. Boring solutions are good. Allow everyone to understand your solution. There will always be another iteration.",[14,7113,7115],{"id":7114},"iterative-improvement","🔁 Iterative Improvement",[504,7117,7118,7130,7140,7147,7154],{},[147,7119,7120,7124,7125,549],{},[46,7121,7123],{"name":7122},"smallsteps","Small Steps",": Every mountain can be climbed with small steps. Make a change,\nreassess your direction, repeat. Scope down your work item, reflect, and scope\nit down again. Get the minimal amount of work down, but no less, find the ",[46,7126,7129],{"href":7127,"rel":7128},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGolden_mean_%28philosophy%29",[108],"golden mean",[147,7131,7132,7136,7137,549],{},[46,7133,7135],{"name":7134},"biasforaction","Bias for Action",": Don't overthink, do what is the most natural in this moment. ",[46,7138,7089],{"href":7139},"#doitnow",[147,7141,7142,7146],{},[46,7143,7145],{"name":7144},"acceptingchange","Accepting Change",": Be eager to accept change: Is it better than yesterday, and can we improve on it tomorrow?",[147,7148,7149,7153],{},[46,7150,7152],{"name":7151},"everythingisadraft","Everything is a Draft",": Today won't be perfect, tomorrow will be better. Perfection is the death of progress.",[147,7155,7156,7160,7161,549],{},[46,7157,7159],{"name":7158},"decidewheregoodisgoodenough","Decide where good is good enough","; understand where excellence is our company's\nedge. Apply the ",[46,7162,7165],{"href":7163,"rel":7164},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPareto_principle",[108],"pareto principle",[14,7167,7169],{"id":7168},"collaborative-community","👥 Collaborative Community",[504,7171,7172,7179,7187,7194],{},[147,7173,7174,7178],{},[46,7175,7177],{"name":7176},"beinclusive","Be inclusive",": in a community everyone is different; allow them to be. We\nvalue empathy, courtesy, and respect for each other.",[147,7180,7181,7186],{},[46,7182,7185],{"href":7183,"rel":7184},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FInformation_wants_to_be_free",[108],"Information wants to be free",":\nStore information in public places by default: our Handbook and GitHub issues.\nAllow others to understand you and your decisions.",[147,7188,7189,7193],{},[46,7190,7192],{"name":7191},"knowledgeispower","Knowledge is Power",": Share your knowledge with others. This can be through\nwriting documentation, handbook entries, creating tutorials, keeping a meeting agenda,\nor running workshops with others.",[147,7195,7196,7200],{},[46,7197,7199],{"name":7198},"thinkbigpicture","Think big picture",": It's not \"your\" issue\u002Fbug, the whole community can have\nopinions and provide suggestions.",[14,7202,7204],{"id":7203},"️-constructive-candor","⛑️ Constructive Candor",[504,7206,7207,7214,7221,7228,7235,7242,7249],{},[147,7208,7209,7213],{},[46,7210,7212],{"name":7211},"feedbackaidsgrowth","Feedback aids growth",": it reinforces what is good and helps drive improvement where needed.",[147,7215,7216,7220],{},[46,7217,7219],{"name":7218},"beconsiderate","Be considerate",": feedback is about helping others to improve, not scoring points. Use care and consideration of how it will be received.",[147,7222,7223,7227],{},[46,7224,7226],{"name":7225},"providetimelyfeedback","Provide timely feedback",": it is better to address things when they are fresh in our minds and quicker to remedy.",[147,7229,7230,7234],{},[46,7231,7233],{"name":7232},"assumepositiveintent","Assume positive intent"," when receiving feedback. When you feel defensive it's OK to\nrespond later.",[147,7236,7237,7241],{},[46,7238,7240],{"id":7239},"optimism","Be optimistic",", treat situations as if a positive outcome is always possible.",[147,7243,7244,7248],{},[46,7245,7247],{"name":7246},"beopenandhonest","Be open and honest"," about your own mistakes, take ownership of them and their resolve.",[147,7250,7251,7255],{},[46,7252,7254],{"name":7253},"appreciateeachother","Appreciate each other",". Say thanks often, preferably in public.",[14,7257,7259],{"id":7258},"customer-empathy","🤝 Customer Empathy",[504,7261,7262,7269,7276,7288],{},[147,7263,7264,7268],{},[46,7265,7267],{"name":7266},"focusonthecustomer","Focus on the customer",": We want them to be successful. Pay attention to competition, but put the customer first.",[147,7270,7271,7275],{},[46,7272,7274],{"name":7273},"becuriousnotjudgemental","Be curious, not judgemental",": Understanding starts with asking questions. Aim to get a deep understanding of their desires and motivations.",[147,7277,7278,7282,7283,7287],{},[46,7279,7281],{"name":7280},"listentofeedback","Listen to feedback"," and respond quickly and respectfully. Customers may be frustrated or potentially seem unreasonable - we are here to listen and help them move forward.  ",[46,7284,7286],{"href":7285},"#optimism","Apply optimism",", and be friendly.",[147,7289,7290,7294],{},[46,7291,7293],{"name":7292},"showempathy","Show empathy"," in all interactions and choices. Our solutions aim to solve customer problems effectively and efficiently.",{"title":75,"searchDepth":76,"depth":76,"links":7296},[7297,7298,7299,7300,7301],{"id":7073,"depth":76,"text":7074},{"id":7114,"depth":76,"text":7115},{"id":7168,"depth":76,"text":7169},{"id":7203,"depth":76,"text":7204},{"id":7258,"depth":76,"text":7259},"FlowFuse has a few core values. Values we aspire to live by in everything we do\nat FlowFuse. With a shared set of values, norms that are created every day will\nalign with what company we want to be, and how we conduct business. When we are\noperating within our Values, we are also abiding by our Code of Conduct",{},"\u002Fhandbook\u002Fcompany\u002Fvalues",{"title":2845,"description":7302},"handbook\u002Fcompany\u002Fvalues","S45UYq-ESkKSJPbVrnOs6veKYhA16ISvyO_FTTzBQ5A",{"id":7309,"title":7310,"body":7311,"description":7318,"extension":81,"meta":7482,"navGroup":83,"navOrder":83,"navTitle":7310,"navigation":84,"path":1053,"seo":7483,"stem":7484,"__hash__":7485},"handbook\u002Fhandbook\u002Fdesign\u002Fart-requests.md","Art Requests",{"type":7,"value":7312,"toc":7475},[7313,7316,7319,7322,7342,7346,7349,7374,7377,7383,7387,7390,7430,7436,7440,7459,7462,7466],[10,7314,7310],{"id":7315},"art-requests",[19,7317,7318],{},"Across FlowFuse it will be a common occurrence that we need visual content created. These can be part of development tasks (where you're comfortable doing the development work, but less doing the graphic\u002Fillustrative design work) or social\u002Fmarketing materials.",[19,7320,7321],{},"Likely places this will be required are:",[144,7323,7324,7327,7330,7333,7336,7339],{},[147,7325,7326],{},"Tiles for Blog Posts",[147,7328,7329],{},"Tiles & Associated Graphics\u002FAssets for Webinars & AMA Sessions",[147,7331,7332],{},"Diagrams for Presentations",[147,7334,7335],{},"Social Media Adverts & Graphics",[147,7337,7338],{},"YouTube Video Thumbnails",[147,7340,7341],{},"Product Illustrations & Graphics",[14,7343,7345],{"id":7344},"creating-an-art-request","Creating an Art Request",[19,7347,7348],{},"You can create an issue on any of the FlowFuse Repositories that best suits the asset required, e.g:",[144,7350,7351,7359,7366],{},[147,7352,7353,7358],{},[46,7354,7357],{"href":7355,"rel":7356},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fflowfuse",[108],"FlowFuse\u002Fflowfuse",": In-Product Visuals (e.g. icons, diagrams, pictograms)",[147,7360,7361,7365],{},[46,7362,7364],{"href":1714,"rel":7363},[108],"FlowFuse\u002Fwebsite",": Markitechture Diagrams, Blog Tiles, Webinar & AMA Tiles",[147,7367,7368,7373],{},[46,7369,7372],{"href":7370,"rel":7371},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fmarketing",[108],"FlowFuse\u002Fcontent",": Social Media Assets, YouTube Thumbnails Tiles and anything else that doesn't fit above",[19,7375,7376],{},"When creating an issue, you'll be presented with an option to create an \"Art Request\" from the Issue Templates:",[19,7378,7379],{},[1724,7380],{"alt":7381,"src":7382,"title":7381},"Screenshot from GitHub to show the option for creating an Art Request","\u002Fhandbook\u002Fimages\u002Fscreenshots\u002Fgh-artrequest-template.png",[164,7384,7386],{"id":7385},"details-to-include","Details to Include",[19,7388,7389],{},"Please be sure to include as much detail as possible, but most importantly:",[144,7391,7392,7397,7418,7424],{},[147,7393,7394,7396],{},[423,7395,922],{},": What type of asset is this? Blog Tile? YouTube Thumbnail?",[147,7398,7399,7402,7403,63,7406,7409,7410,7413,7414,7417],{},[423,7400,7401],{},"Format",": Image (e.g. ",[542,7404,7405],{},".png",[542,7407,7408],{},".jpg","), Video (e.g. ",[542,7411,7412],{},"mp4","), Animation (e.g. ",[542,7415,7416],{},".gif"," or Lottie Animation)",[147,7419,7420,7423],{},[423,7421,7422],{},"Deadline",": This is defined on the right-side of the issue under the \"Art Requests\" project, once the issue has been created.",[147,7425,7426,7429],{},[423,7427,7428],{},"Milestone",": If this is a Product request, please add the Development Project and assign the relevant release milestone, otherwise, this is not required.",[19,7431,7432],{},[1724,7433],{"alt":7434,"src":7435,"title":7434},"Screenshot from GitHub to show where to set the deadline for an Art Request","\u002Fhandbook\u002Fimages\u002Fscreenshots\u002Fgh-artrequest-example.png",[14,7437,7439],{"id":7438},"tracking-art-request-progress","Tracking Art Request Progress",[19,7441,7442,7443,2040,7446,7449,7450,7455,7456,793],{},"All newly created Art Requests will be tagged with ",[542,7444,7445],{},"design",[542,7447,7448],{},"artwork"," - this ensures that the issue is automatically added to our ",[46,7451,7454],{"href":7452,"rel":7453},"https:\u002F\u002Fgithub.com\u002Forgs\u002FFlowFuse\u002Fprojects\u002F10",[108],"Art Requests Project Board",", and alerts a designer in the ",[542,7457,7458],{},"#gh-art-requests",[19,7460,7461],{},"When a designer assigns themselves to the issue, they should also add the issue to the Development Project Board, and assign the relevant Iteration within which the piece of work is being undertaken, this ensures that it shows on our wider Team view as to what everyone is working on at any given time.",[14,7463,7465],{"id":7464},"delivery-of-art","Delivery of Art",[19,7467,7468,7469,7474],{},"While the art request will include a delivery method of the assets, please be\nsure to also always export the asset to the ",[46,7470,7473],{"href":7471,"rel":7472},"https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Ffolders\u002F1PiuFwW3H8XuydolepmfQQ4BjcdNekVQg",[108],"Design directory","\nso others, non-designers, can find and reuse these assets.",{"title":75,"searchDepth":76,"depth":76,"links":7476},[7477,7480,7481],{"id":7344,"depth":76,"text":7345,"children":7478},[7479],{"id":7385,"depth":605,"text":7386},{"id":7438,"depth":76,"text":7439},{"id":7464,"depth":76,"text":7465},{},{"title":7310,"description":7318},"handbook\u002Fdesign\u002Fart-requests","qS5JqRofnrHcfe6sVaCAf2909Uq8gD-KLiVwEb7ajMk",{"id":7487,"title":7488,"body":7489,"description":8389,"extension":81,"meta":8390,"navGroup":83,"navOrder":83,"navTitle":8391,"navigation":84,"path":8392,"seo":8393,"stem":8394,"__hash__":8395},"handbook\u002Fhandbook\u002Fdesign\u002Fbranding.md","FlowFuse Branding Guidelines",{"type":7,"value":7490,"toc":8369},[7491,7494,7504,7507,7521,7525,7529,7532,7536,7542,7552,7555,7575,7583,7585,7595,7599,7602,7606,7608,7618,7622,7625,7631,7635,7637,7646,7650,7652,7661,7665,7668,7672,7674,7680,7710,7714,7716,7722,7740,7743,7747,7749,7755,7773,7792,7796,7799,7880,7884,7902,7906,7910,7917,7968,7972,7989,8077,8087,8095,8102,8127,8136,8140,8155,8159,8163,8166,8170,8173,8177,8180,8202,8206,8221,8224,8281,8284,8292,8296,8309,8312,8320,8328,8331,8335,8346,8349,8356,8360],[10,7492,7488],{"id":7493},"flowfuse-branding-guidelines",[19,7495,7496,7497,7503],{},"For FlowFuse Assets (e.g. logos, pictograms, and raw design files), if you're part of the FlowFuse team, please refer to the ",[46,7498,7500],{"href":7471,"rel":7499},[108],[542,7501,7502],{},"\u002Fdesign"," folder on the company Google Drive.",[19,7505,7506],{},"If you're not part of the FlowFuse organization, you can download the logos from the following links:",[144,7508,7509,7515],{},[147,7510,7511],{},[46,7512,7514],{"href":7513},"\u002Fhandbook\u002Fimages\u002Flogos\u002FFlowFuse_logo_png.zip","PNG low-resolution files",[147,7516,7517],{},[46,7518,7520],{"href":7519},"\u002Fhandbook\u002Fimages\u002Flogos\u002FFlowFuse_logo_vector.zip","Vector files (PDF and SVG)",[14,7522,7524],{"id":7523},"logo","Logo",[164,7526,7528],{"id":7527},"composition","Composition",[19,7530,7531],{},"Our logo is a combination mark, featuring an abstract symbol that represents the flows connecting the nodes, along with a wordmark displaying our name.",[164,7533,7535],{"id":7534},"versions","Versions",[19,7537,7538,7541],{},[423,7539,7540],{},"The horizontal version is the preferred choice",". When space and layout constraints make this option an awkward fit, forcing the logo to be too small, the vertical version can be used.",[239,7543,7545,7546],{"id":7544},"horizontal-version-preferred-choice","Horizontal Version ",[2403,7547,7551],{"className":7548},[7549,7550],"font-light","italic","(preferred choice)",[3601,7553],{"style":7554},"margin-bottom:30px; border-color:#E5E7EB;",[7556,7557,7566,7567],"div",{"className":7558},[7559,7560,7561,7562,7563,7564,7565],"flex","h-full","flex-col","justify-center","items-center","md:mt-0","mb-14","\n    ",[1724,7568],{"width":7569,"min-width":7570,"className":7571,"alt":7573,"src":7574},250,"250",[7572],"p-2","Image of the horizontal version of FlowFuse logo","..\u002Fimages\u002Flogos\u002Fff-logo--wordmark--light.png",[239,7576,7578,7579],{"id":7577},"vertical-version-only-use-if-you-have-space-and-layout-constraints","Vertical Version ",[2403,7580,7582],{"className":7581},[7549,7550],"(only use if you have space and layout constraints)",[3601,7584],{"style":7554},[7556,7586,7566,7588],{"className":7587},[7559,7560,7561,7562,7563,7564,7565],[1724,7589],{"width":7590,"min-width":7591,"className":7592,"alt":7593,"src":7594},180,"180",[7572],"Image of the vertical version of FlowFuse logo","..\u002Fimages\u002Flogos\u002Fff-logo--square--light.png",[164,7596,7598],{"id":7597},"minimum-sizes","Minimum Sizes",[19,7600,7601],{},"Only when the size becomes too small for the combination mark to render the wordmark legibly, the symbol can be used independently without the wordmark.",[239,7603,7605],{"id":7604},"symbol","Symbol",[3601,7607],{"style":7554},[7556,7609,7566,7611],{"className":7610},[7559,7560,7561,7562,7563,7564,7565],[1724,7612],{"width":7613,"min-width":7614,"className":7615,"alt":7616,"src":7617},60,"60",[7572],"Image of the FlowFuse symbol","..\u002Fimages\u002Flogos\u002Fff-icon--light.png",[164,7619,7621],{"id":7620},"construction-and-correct-usage","Construction and correct usage",[19,7623,7624],{},"The order, distance, and proportion of the elements composing the combination mark must not be altered in any way.",[19,7626,1388,7627,7630],{},[423,7628,7629],{},"safety area of 2X"," is defined to ensure proper image usage and readability.",[239,7632,7634],{"id":7633},"construction-of-horizontal-version","Construction of Horizontal Version",[3601,7636],{"style":7554},[7556,7638,7566,7640],{"className":7639},[7559,7560,7561,7562,7563,7564,7565],[1724,7641],{"width":7642,"className":7643,"alt":7644,"src":7645},500,[7572],"Image depicting the construction process of the logo's horizontal version.","..\u002Fimages\u002Flogos\u002Fhorizontal-construction.png",[239,7647,7649],{"id":7648},"construction-of-vertical-version","Construction of Vertical Version",[3601,7651],{"style":7554},[7556,7653,7566,7655],{"className":7654},[7559,7560,7561,7562,7563,7564,7565],[1724,7656],{"width":7657,"className":7658,"alt":7659,"src":7660},357,[7572],"Image depicting the construction process of the logo's vertical version.","..\u002Fimages\u002Flogos\u002Fvertical-construction.png",[164,7662,7664],{"id":7663},"chromatic-versions","Chromatic Versions",[19,7666,7667],{},"Depending on the background against which the logo is presented, there are corresponding versions to be used.",[239,7669,7671],{"id":7670},"dark-backgrounds","Dark Backgrounds",[3601,7673],{"style":7554},[19,7675,7676,7677],{},"Search for the file name ending with \"dark\", such as: ",[2562,7678,7679],{},"ff-logo--wordmark--dark.png",[7556,7681,7566,7689,7566,7702],{"className":7682},[7559,7560,7561,7562,7563,7683,7565,7684,7685,7686,7687,7688],"md:mt-4","bg-indigo-700","rounded-md","md:w-[60%]","min-w-[330px]","m-auto",[7556,7690,7696,7697,7566],{"className":7691},[7692,7693,7694,7695],"w-[90%]","border-b","border-gray-400","p-8","\n        ",[1724,7698],{"className":7699,"width":7569,"min-width":7570,"alt":7700,"src":7701},[7688,7572],"Image of the horizontal version of FlowFuse logo for dark backgrounds","..\u002Fimages\u002Flogos\u002Fff-logo--wordmark--dark.png",[7556,7703,7696,7705,7566],{"className":7704},[7695],[1724,7706],{"width":7590,"min-width":7591,"className":7707,"alt":7708,"src":7709},[7572],"Image of the vertical version of FlowFuse logo for dark backgrounds","..\u002Fimages\u002Flogos\u002Fff-logo--square--dark.png",[239,7711,7713],{"id":7712},"light-backgrounds","Light Backgrounds",[3601,7715],{"style":7554},[19,7717,7718,7719],{},"Search for the file name ending with \"light\", like: ",[2562,7720,7721],{},"ff-logo--wordmark--light.png",[7556,7723,7566,7726,7566,7734],{"className":7724},[7559,7560,7561,7562,7563,7683,7565,7725,7685,7686,7687,7688],"bg-white",[7556,7727,7696,7730,7566],{"className":7728},[7692,7693,7729,7695],"border-gray-100",[1724,7731],{"className":7732,"width":7569,"min-width":7570,"alt":7733,"src":7574},[7688,7572],"Image of the horizontal version of FlowFuse logo for light backgrounds",[7556,7735,7696,7737,7566],{"className":7736},[7695],[1724,7738],{"width":7590,"min-width":7591,"className":7739,"alt":7733,"src":7594},[7572],[19,7741,7742],{},"Please note that the dark background version consists of two colors, while the remaining versions consist of a single color.",[239,7744,7746],{"id":7745},"monochromatic","Monochromatic",[3601,7748],{"style":7554},[19,7750,7751,7752],{},"When only black or white are allowed, search for the file name ending with \"black\" or \"white\". For instance: ",[2562,7753,7754],{},"ff-logo--wordmark--white.png",[7556,7756,7566,7758,7566,7766],{"className":7757},[7559,7560,7561,7562,7563,7683,7565,7725,7685,7686,7687,7688],[7556,7759,7696,7761,7566],{"className":7760},[7692,7693,7729,7695],[1724,7762],{"className":7763,"width":7569,"min-width":7570,"alt":7764,"src":7765},[7688,7572],"Image of the monochromatic version of FlowFuse logo","..\u002Fimages\u002Flogos\u002Fff-logo--wordmark--black.png",[7556,7767,7696,7769,7566],{"className":7768},[7695],[1724,7770],{"className":7771,"width":7590,"min-width":7591,"alt":7764,"src":7772},[7688,7572],"..\u002Fimages\u002Flogos\u002Fff-logo--square--black.png",[7556,7774,7566,7777,7566,7785],{"className":7775},[7559,7560,7561,7562,7563,7683,7565,7776,7685,7686,7687,7688],"bg-black",[7556,7778,7696,7781,7566],{"className":7779},[7692,7693,7780,7695],"border-gray-500",[1724,7782],{"className":7783,"width":7569,"min-width":7570,"alt":7764,"src":7784},[7688,7572],"..\u002Fimages\u002Flogos\u002Fff-logo--wordmark--white.png",[7556,7786,7696,7788,7566],{"className":7787},[7695],[1724,7789],{"className":7790,"width":7590,"min-width":7591,"alt":7764,"src":7791},[7688,7572],"..\u002Fimages\u002Flogos\u002Fff-logo--square--white.png",[14,7793,7795],{"id":7794},"fonts","Fonts",[19,7797,7798],{},"The following fonts are used across the FlowFuse platform, website, and branded materials. The table below outlines where each font is applied.",[910,7800,7801,7819],{},[913,7802,7803],{},[916,7804,7805,7808,7810,7813,7816],{},[919,7806,7807],{},"Font",[919,7809,7524],{},[919,7811,7812],{},"Platform",[919,7814,7815],{},"Website",[919,7817,7818],{},"Branded Materials",[930,7820,7821,7842,7861],{},[916,7822,7823,7833,7835,7838,7840],{},[935,7824,7825],{},[46,7826,7829,7832],{"href":7827,"rel":7828},"https:\u002F\u002Ftailwindcss.com",[108],[423,7830,7831],{},"font-sans"," (Tailwind CSS)",[935,7834],{},[935,7836,7837],{},"*",[935,7839],{},[935,7841],{},[916,7843,7844,7853,7855,7857,7859],{},[935,7845,7846],{},[46,7847,7850],{"href":7848,"rel":7849},"https:\u002F\u002Ffonts.google.com\u002Fspecimen\u002FHeebo",[108],[423,7851,7852],{},"Heebo",[935,7854],{},[935,7856],{},[935,7858,7837],{},[935,7860,7837],{},[916,7862,7863,7872,7874,7876,7878],{},[935,7864,7865],{},[46,7866,7869],{"href":7867,"rel":7868},"https:\u002F\u002Ffonts.google.com\u002Fspecimen\u002FBaloo+Da+2",[108],[423,7870,7871],{},"Baloo Da 2",[935,7873,7837],{},[935,7875],{},[935,7877],{},[935,7879],{},[239,7881,7883],{"id":7882},"notes","Notes:",[144,7885,7886,7896],{},[147,7887,7888,7891,7892,7895],{},[423,7889,7890],{},"Heebo:"," When using this font, we aim to avoid weights heavier than ",[2562,7893,7894],{},"semi-bold"," to maintain a clean and balanced design.",[147,7897,7898,7901],{},[423,7899,7900],{},"Baloo Da 2:"," Exclusively used in the FlowFuse logo.",[14,7903,7905],{"id":7904},"color-palette","Color Palette",[7907,7908,7909],"script",{},"\nfunction ffCopyHex(hex, el) {\n    navigator.clipboard.writeText(hex);\n    var c = el.querySelector('.cc-copy'), k = el.querySelector('.cc-check');\n    c.style.display = 'none';\n    k.style.display = 'block';\n    setTimeout(function() { c.style.display = 'block'; k.style.display = 'none'; }, 1500);\n}\n",[19,7911,7912,7913,7916],{},"{% set colorPalette = ",[2403,7914,7915],{},"\n[\n{ name: \"Black\",   hex: \"#000000\" },\n{ name: \"White\",   hex: \"#FFFFFF\", light: true }\n],\n[\n{ name: \"Grey 50\",  hex: \"#F9FAFB\", light: true },\n{ name: \"Grey 100\", hex: \"#F3F4F6\", light: true },\n{ name: \"Grey 200\", hex: \"#E5E7EB\", light: true },\n{ name: \"Grey 300\", hex: \"#D1D5DB\" },\n{ name: \"Grey 400\", hex: \"#9CA3AF\" },\n{ name: \"Grey 500\", hex: \"#6B7280\" },\n{ name: \"Grey 600\", hex: \"#4B5563\" },\n{ name: \"Grey 700\", hex: \"#374151\" },\n{ name: \"Grey 800\", hex: \"#1F2937\" },\n{ name: \"Grey 900\", hex: \"#111827\" }\n],\n[\n{ name: \"Red 50\",  hex: \"#FFE8E5\", light: true },\n{ name: \"Red 100\", hex: \"#FFBFB5\", light: true },\n{ name: \"Red 200\", hex: \"#FF8A7B\", light: true },\n{ name: \"Red 300\", hex: \"#FF604F\" },\n{ name: \"Red 400\", hex: \"#FF3B27\" },\n{ name: \"Red 500\", hex: \"#FF2400\" },\n{ name: \"Red 600\", hex: \"#DA3D0B\" },\n{ name: \"Red 700\", hex: \"#B32E09\" },\n{ name: \"Red 800\", hex: \"#8D1F06\" },\n{ name: \"Red 900\", hex: \"#671506\" }\n],\n[\n{ name: \"Indigo 50\",  hex: \"#EEF2FF\", light: true },\n{ name: \"Indigo 100\", hex: \"#E0E7FF\", light: true },\n{ name: \"Indigo 200\", hex: \"#C7D2FE\", light: true },\n{ name: \"Indigo 300\", hex: \"#A5B4FC\" },\n{ name: \"Indigo 400\", hex: \"#818CF8\" },\n{ name: \"Indigo 500\", hex: \"#6366F1\" },\n{ name: \"Indigo 600\", hex: \"#4F46E5\" },\n{ name: \"Indigo 700\", hex: \"#4338CA\" },\n{ name: \"Indigo 800\", hex: \"#3730A3\" },\n{ name: \"Indigo 900\", hex: \"#312E81\" }\n],\n[\n{ name: \"Blue 50\",  hex: \"#EFF6FF\", light: true },\n{ name: \"Blue 100\", hex: \"#DBEAFE\", light: true },\n{ name: \"Blue 200\", hex: \"#BFDBFE\", light: true },\n{ name: \"Blue 300\", hex: \"#93C5FD\" },\n{ name: \"Blue 400\", hex: \"#60A5FA\" },\n{ name: \"Blue 500\", hex: \"#3B82F6\" },\n{ name: \"Blue 600\", hex: \"#2563EB\" },\n{ name: \"Blue 700\", hex: \"#1D4ED8\" },\n{ name: \"Blue 800\", hex: \"#1E40AF\" },\n{ name: \"Blue 900\", hex: \"#1E3A8A\" }\n]\n"," %}",[7556,7918,7921,7922,7967],{"className":7919},[7920],"space-y-6","\n{% for group in colorPalette %}\n",[7556,7923,7926,7927,7967],{"className":7924},[7925],"ff-color-grid","\n{% for color in group %}\n",[7556,7928,7566,7931,7566,7953],{"className":7929},[7930],"ff-color-card",[7556,7932,7696,7936,7566],{"className":7933,"style":7935},[7934],"cc-swatch","background:{{ color.hex }}{% if color.light %};border-bottom:1px solid #E5E7EB{% endif %}",[2403,7937,7940,7941,7940,7947,7696],{"className":7938},[7939],"cc-btn","\n            ",[2403,7942,7946],{"className":7943,"style":7945},[7944],"cc-copy","display:block","{% include \"components\u002Ficons\u002Fclipboard-copy.svg\" %}",[2403,7948,7952],{"className":7949,"style":7951},[7950],"cc-check","display:none","{% include \"components\u002Ficons\u002Fcheck.svg\" %}",[7556,7954,7696,7957,7696,7962,7566],{"className":7955},[7956],"cc-info",[19,7958,7961],{"className":7959},[7960],"cc-name","{{ color.name }}",[19,7963,7966],{"className":7964},[7965],"cc-hex","{{ color.hex }}","\n{% endfor %}\n",[164,7969,7971],{"id":7970},"text-color-contrast","Text Color & Contrast",[19,7973,7974,7979,7980,7983,7984,7988],{},[46,7975,7978],{"href":7976,"rel":7977},"https:\u002F\u002Fwww.w3.org\u002FTR\u002FWCAG21\u002F#contrast-minimum",[108],"WCAG 2.1 AA"," requires a contrast ratio of at least ",[423,7981,7982],{},"4.5:1"," between normal-size body text and its background (large text — 18pt or larger, or 14pt bold — requires 3:1; see ",[46,7985,7987],{"href":7976,"rel":7986},[108],"Success Criterion 1.4.3","). Several values in the grey scale above look similar but sit on opposite sides of that threshold, so choose by background:",[910,7990,7991,8003],{},[913,7992,7993],{},[916,7994,7995,7997,8000],{},[919,7996,1494],{},[919,7998,7999],{},"Minimum grey for normal text",[919,8001,8002],{},"Notes",[930,8004,8005,8029,8051,8066],{},[916,8006,8007,8013,8022],{},[935,8008,8009,8010,1583],{},"White (",[542,8011,8012],{},"#FFFFFF",[935,8014,8015,3237,8018,8021],{},[423,8016,8017],{},"Grey 500",[542,8019,8020],{},"#6B7280",", 4.83:1)",[935,8023,8024,8025,8028],{},"Minimum for normal text. Site body copy uses Grey 700 (",[542,8026,8027],{},"#374151",", 7.56:1); Grey 500 is used for bolded prose text and for secondary metadata like dates, bylines, and captions",[916,8030,8031,8040,8048],{},[935,8032,8033,8034,63,8037,1583],{},"Grey 50 \u002F Grey 100 (",[542,8035,8036],{},"bg-gray-50",[542,8038,8039],{},"bg-gray-100",[935,8041,8042,3237,8045,1583],{},[423,8043,8044],{},"Grey 600",[542,8046,8047],{},"#4B5563",[935,8049,8050],{},"Grey 500 produces only ~4.3:1 on Grey 100, below AA",[916,8052,8053,8059,8063],{},[935,8054,8055,8056,1583],{},"Indigo 50 (",[542,8057,8058],{},"bg-indigo-50",[935,8060,8061],{},[423,8062,8044],{},[935,8064,8065],{},"Tinted background reduces effective contrast against mid-greys",[916,8067,8068,8071,8074],{},[935,8069,8070],{},"Dark backgrounds (Grey 600+)",[935,8072,8073],{},"Grey 300 or lighter, or white",[935,8075,8076],{},"Light values required to reach 4.5:1",[19,8078,8079,8086],{},[423,8080,8081,8082,8085],{},"Grey 400 (",[542,8083,8084],{},"#9CA3AF",") fails AA for normal text on any light background (≈2.85:1 on white)."," Reserve it for:",[144,8088,8089,8092],{},[147,8090,8091],{},"Decorative, non-text elements (icons, dividers, tree-branch characters), where the 3:1 non-text contrast rule applies",[147,8093,8094],{},"Intentional placeholder or disabled states where the reduced contrast is the intended signal — for example, unconfirmed talks on an event schedule, inactive form fields, or greyed-out menu items. Document the intent inline so future edits preserve it.",[19,8096,8097,8098,8101],{},"When in doubt, run the page through Lighthouse and check the ",[542,8099,8100],{},"color-contrast"," audit before shipping.",[19,8103,8104,8107,8108,8111,8112,8115,8116,8118,8119,8122,8123,8126],{},[423,8105,8106],{},"Lighthouse"," (built into Chrome DevTools): open the page → DevTools (",[542,8109,8110],{},"⌘⌥I"," \u002F ",[542,8113,8114],{},"F12",") → ",[423,8117,8106],{}," tab → tick ",[423,8120,8121],{},"Accessibility"," → ",[423,8124,8125],{},"Analyze page load",". Scroll to \"Contrast\" in the report — any failing element is listed with its selector and the actual ratio.",[19,8128,8129,8130,8135],{},"For a one-off spot-check without running a full audit, the ",[46,8131,8134],{"href":8132,"rel":8133},"https:\u002F\u002Fwebaim.org\u002Fresources\u002Fcontrastchecker\u002F",[108],"WebAIM Contrast Checker"," takes two hex values and returns the ratio.",[14,8137,8139],{"id":8138},"iconography","Iconography",[19,8141,8142,8143,8148,8149,2040,8152,549],{},"All app and site iconography uses ",[46,8144,8147],{"href":8145,"rel":8146},"https:\u002F\u002Fheroicons.com\u002F",[108],"Heroicons",", by the makers of Tailwind CSS. Within our flowforge app, we have two icon sizes available which can be assigned with ",[542,8150,8151],{},"ff-icon",[542,8153,8154],{},"ff-icon-sm",[14,8156,8158],{"id":8157},"branded-templates","Branded Templates",[164,8160,8162],{"id":8161},"email-signature","Email Signature",[19,8164,8165],{},"Using a consistent email signature helps people outside FlowFuse understand who we are and what we do. Including your job title gives context to your role, and the link to our website makes it easy for recipients to learn more about us. It also reinforces our brand and makes every interaction look professional and cohesive.",[1019,8167,8169],{"id":8168},"when-to-use-your-signature","When to use your signature",[19,8171,8172],{},"Always include it in external emails (clients, partners, vendors, community members) and when starting or joining a new email thread. For ongoing replies within the same thread, it's optional. Many email clients have settings to automatically include your signature only in new emails, which can help streamline this.",[239,8174,8176],{"id":8175},"gmail-browser","Gmail (Browser)",[19,8178,8179],{},"If you're using Gmail in your browser:",[504,8181,8182,8188,8191,8199],{},[147,8183,769,8184],{},[46,8185,8187],{"href":8186},"\u002Femail-signature\u002F","flowfuse.com\u002Femail-signature\u002F",[147,8189,8190],{},"Copy the signature displayed on the page",[147,8192,8193,8194],{},"Paste it into your Gmail signature settings following ",[46,8195,8198],{"href":8196,"rel":8197},"https:\u002F\u002Fsupport.google.com\u002Fmail\u002Fanswer\u002F8395?hl=en&co=GENIE.Platform%3DDesktop",[108],"these instructions",[147,8200,8201],{},"Update the placeholder text with your personal information",[239,8203,8205],{"id":8204},"apple-mail","Apple Mail",[19,8207,8208,8209,8214,8215,8220],{},"If you're using the Apple Mail app, you can follow ",[46,8210,8213],{"href":8211,"rel":8212},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=Gb4dbik1YPI",[108],"this video tutorial"," which covers most of the steps below. The main difference is that we're providing you with the ",[46,8216,8219],{"href":8217,"rel":8218},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fwebsite\u002Fblob\u002Fmain\u002Fsrc\u002Femail-signature.njk",[108],"signature code"," directly, so you can skip the HTML generation part.",[19,8222,8223],{},"Here are the detailed steps:",[504,8225,8226,8234,8244,8250,8257,8268,8278],{},[147,8227,8228,8229,8233],{},"Create a new signature following ",[46,8230,8198],{"href":8231,"rel":8232},"https:\u002F\u002Fsupport.apple.com\u002Fen-gb\u002Fguide\u002Fmail\u002Fmail11943\u002Fmac",[108],". Name it and leave it empty. If any content is added automatically, delete it. Close the Mail app.",[147,8235,8236,8237,8240,8241],{},"In Finder, go to the menu bar and select ",[423,8238,8239],{},"Go > Go to Folder",", then enter: ",[542,8242,8243],{},"~\u002FLibrary\u002FMail",[147,8245,8246,8247,549],{},"Navigate to the folder that starts with \"V\" followed by a number (this indicates your Mail version and will vary by user), then go to ",[423,8248,8249],{},"MailData > Signatures",[147,8251,8252,8253,8256],{},"Find the file with the ",[542,8254,8255],{},"*.mailsignature"," extension and open it in a text editor.",[147,8258,8259,8260,8263,8264,549],{},"Replace everything below the line ",[542,8261,8262],{},"Mime-Version: [version]"," with the code from ",[46,8265,8267],{"href":8217,"rel":8266},[108],"email-signature.njk",[147,8269,8270,8271,8274,8275,549],{},"Save the file, then press ",[423,8272,8273],{},"Command + I"," to open the Info window and check ",[423,8276,8277],{},"Locked",[147,8279,8280],{},"Reopen the Mail app, return to the Signatures menu, and edit the placeholder data with your personal information.",[19,8282,8283],{},"Your signature is now ready to use.",[2672,8285,8286],{},[19,8287,8288,8291],{},[423,8289,8290],{},"Note:"," Please preserve the typography, colors, and formatting in the signature template to maintain brand consistency.",[164,8293,8295],{"id":8294},"presentations","Presentations",[19,8297,8298,8299,8302,8303,8308],{},"There's a ",[423,8300,8301],{},"branded theme"," for Google Slides presentations available in the ",[46,8304,8307],{"href":8305,"rel":8306},"https:\u002F\u002Fdocs.google.com\u002Fpresentation\u002Fu\u002F0\u002F?tgif=d&ftv=1",[108],"FlowFuse template gallery",". To access it, you need to be logged in to your FlowFuse account. Look for a theme called \"FlowFuse Template\".",[19,8310,8311],{},"When you click on it, two things will happen:",[504,8313,8314,8317],{},[147,8315,8316],{},"A new Google Slides file will be created in your Drive with the theme applied.",[147,8318,8319],{},"The file will open for editing.",[19,8321,8322,8323,549],{},"You'll find a fully designed presentation as an example of how to use different layouts. To explore all the predefined options available, check the ",[46,8324,8327],{"href":8325,"rel":8326},"https:\u002F\u002Fsupport.google.com\u002Fdocs\u002Fanswer\u002F1705254?hl=en&ref_topic=19434&sjid=8039782987794605660-EU#zippy=%2Cchange-layout:~:text=your%20theme%20colors-,Change%20layout,-A%20layout%20is",[108],"Layout menu",[19,8329,8330],{},"Feel free to edit the content, delete or add slides as needed. Any changes you make will only affect your copy in your Drive.",[164,8332,8334],{"id":8333},"letterhead","Letterhead",[19,8336,1388,8337,8340,8341,8345],{},[423,8338,8339],{},"branded Google Docs letterhead"," is also available in the ",[46,8342,8307],{"href":8343,"rel":8344},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fu\u002F0\u002F?ftv=1&folder=16xMKKQxonSD4IkdLJjVuACTrQInZ_-Zr&tgif=d",[108],", titled \"FlowFuse Letterhead – Template.\" Make sure you're logged into your FlowFuse account to see it.",[19,8347,8348],{},"Clicking the template will create an editable copy in your Drive — just like with the presentation template. You can customize this copy freely without affecting the original.",[2672,8350,8351],{},[19,8352,8353,8355],{},[423,8354,8290],{}," Both templates include predefined typography, colors, and margins. Please preserve these elements to maintain consistency across all branded materials.",[164,8357,8359],{"id":8358},"video-call-backgrounds","Video Call Backgrounds",[19,8361,8362,8363,8368],{},"As part of our design assets, we have ",[46,8364,8367],{"href":8365,"rel":8366},"https:\u002F\u002Fdrive.google.com\u002Fopen?id=1B0-m5L_X2dvLqbQXvW9RqpMvSDC_FM_0&usp=drive_fs",[108],"branded images"," in our company drive that can be used as backgrounds for video calls. Both regular and mirrored versions are available to suit the platform and view mode you have set up.",{"title":75,"searchDepth":76,"depth":76,"links":8370},[8371,8378,8379,8382,8383],{"id":7523,"depth":76,"text":7524,"children":8372},[8373,8374,8375,8376,8377],{"id":7527,"depth":605,"text":7528},{"id":7534,"depth":605,"text":7535},{"id":7597,"depth":605,"text":7598},{"id":7620,"depth":605,"text":7621},{"id":7663,"depth":605,"text":7664},{"id":7794,"depth":76,"text":7795},{"id":7904,"depth":76,"text":7905,"children":8380},[8381],{"id":7970,"depth":605,"text":7971},{"id":8138,"depth":76,"text":8139},{"id":8157,"depth":76,"text":8158,"children":8384},[8385,8386,8387,8388],{"id":8161,"depth":605,"text":8162},{"id":8294,"depth":605,"text":8295},{"id":8333,"depth":605,"text":8334},{"id":8358,"depth":605,"text":8359},"For FlowFuse Assets (e.g. logos, pictograms, and raw design files), if you're part of the FlowFuse team, please refer to the \u002Fdesign folder on the company Google Drive.",{"templateEngineOverride":3294},"Branding","\u002Fhandbook\u002Fdesign\u002Fbranding",{"title":7488,"description":8389},"handbook\u002Fdesign\u002Fbranding","0BKReVuUX-pZYPCH_2WSvfNNIQzPpsFTPeQjsNOlo5o",{"id":8397,"title":8398,"body":8399,"description":8406,"extension":81,"meta":8762,"navGroup":83,"navOrder":83,"navTitle":8398,"navigation":84,"path":8763,"seo":8764,"stem":8765,"__hash__":8766},"handbook\u002Fhandbook\u002Fdesign\u002Fdesign-thinking.md","Design Thinking",{"type":7,"value":8400,"toc":8759},[8401,8404,8407,8425,8428,8436,8440,8446],[10,8402,8398],{"id":8403},"design-thinking",[19,8405,8406],{},"At FlowFuse, we practice Design Thinking when considering our UI design and wider decisions influencing the overall user experience of FlowFuse.",[2672,8408,8409,8412],{},[19,8410,8411],{},"Design Thinking is a non-linear, iterative process that teams use to understand users, challenge assumptions, redefine problems and create innovative solutions to prototype and test.",[19,8413,8414,8415],{},"-- ",[8416,8417,8418],"cite",{},[46,8419,8422],{"href":8420,"rel":8421},"https:\u002F\u002Fwww.interaction-design.org\u002Fliterature\u002Ftopics\u002Fdesign-thinking",[108],[2562,8423,8424],{},"Design Thinking, Interaction Design Foundation",[19,8426,8427],{},"As designers and developers, empathising with our users will lead to a better product. When proposing new feature ideas, concepts and changes to existing UX, arguments should always be considered from the perspective of our users.",[19,8429,8430,8431,8435],{},"Whilst most of the output from our Design Thinking workshops and sessions can be\nfound within ",[46,8432,8434],{"href":8433},"\u002Fhandbook\u002Fdesign\u002Ftools#figjam-(more-info)","FigJam",", we have also written up some of our Design Thinking Findings to the Handbook.",[14,8437,8439],{"id":8438},"user-personas","User Personas",[19,8441,8442,8443,549],{},"Personas are fictional characters that represent the different users we expect to interact with FlowFuse as a brand and\u002For platform. At FlowFuse, we have many personas that will evolve over time, we have written up some of our Personas ",[46,8444,2011],{"href":8445},"\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fpersonas",[7556,8447,7566,8452,7566,8531,7566,8588,7566,8645,7566,8702],{"className":8448},[8449,8450,8451],"grid","grid-cols-2","gap-4",[7556,8453,7696,8460,7696,8481,7566],{"className":8454},[7685,8455,8456,8457,8458,8459],"bg-gray-900","text-white","p-4","border-2","border-black",[7556,8461,7940,8467,7940,8473,7696],{"className":8462},[8463,8464,8465,8466],"py-2","text-center","border-b-2","border-red-400",[1724,8468],{"className":8469,"src":8472},[8470,7685,8458,8471,7688],"w-32","border-white","..\u002Fimages\u002Fpersonas\u002Fsahib.jpg",[8474,8475,8480],"label",{"className":8476},[8477,8478,8479],"block","mt-2","font-bold","Sahib, Startup CTO",[7556,8482,7940,8484,7940,8497,7940,8509,7940,8520,7696],{"className":8483},[8463],[7556,8485,8487,8488,8487,8492,7940],{"className":8486},[7559,7561],"\n                ",[8474,8489,8491],{"className":8490},[8479],"Age:",[2403,8493,8496],{"className":8494},[8495],"leading-6","33",[7556,8498,8487,8501,8487,8505,7940],{"className":8499},[7559,7561,8500],"mt-1",[8474,8502,8504],{"className":8503},[8479],"Occupation:",[2403,8506,8508],{"className":8507},[8495],"CTO, New Startup Inc.",[7556,8510,8487,8512,8487,8516,7940],{"className":8511},[7559,7561,8500],[8474,8513,8515],{"className":8514},[8479],"Software Skillset:",[2403,8517,8519],{"className":8518},[8495],"Computer Science, MSc",[7556,8521,8487,8523,8487,8527,7940],{"className":8522},[7559,7561,8500],[8474,8524,8526],{"className":8525},[8479],"Node-RED Experience:",[2403,8528,8530],{"className":8529},[8495],"Using it extensively in New Startup Inc.",[7556,8532,7696,8534,7696,8545,7566],{"className":8533},[7685,8455,8456,8457,8458,8459],[7556,8535,7940,8537,7940,8541,7696],{"className":8536},[8463,8464,8465,8466],[1724,8538],{"className":8539,"src":8540},[8470,7685,8458,8471,7688],"..\u002Fimages\u002Fpersonas\u002Fdanielle.jpg",[8474,8542,8544],{"className":8543},[8477,8478,8479],"Danielle, the Developer",[7556,8546,7940,8548,7940,8558,7940,8568,7940,8578,7696],{"className":8547},[8463],[7556,8549,8487,8551,8487,8554,7940],{"className":8550},[7559,7561],[8474,8552,8491],{"className":8553},[8479],[2403,8555,8557],{"className":8556},[8495],"24",[7556,8559,8487,8561,8487,8564,7940],{"className":8560},[7559,7561,8500],[8474,8562,8504],{"className":8563},[8479],[2403,8565,8567],{"className":8566},[8495],"Software Developer, New Startup Inc. (works for Sahib)",[7556,8569,8487,8571,8487,8574,7940],{"className":8570},[7559,7561,8500],[8474,8572,8515],{"className":8573},[8479],[2403,8575,8577],{"className":8576},[8495],"Computer Science & AI, BSc",[7556,8579,8487,8581,8487,8584,7940],{"className":8580},[7559,7561,8500],[8474,8582,8526],{"className":8583},[8479],[2403,8585,8587],{"className":8586},[8495],"Never used it, aware of it via day job and network",[7556,8589,7696,8591,7696,8602,7566],{"className":8590},[7685,8455,8456,8457,8458,8459],[7556,8592,7940,8594,7940,8598,7696],{"className":8593},[8463,8464,8465,8466],[1724,8595],{"className":8596,"src":8597},[8470,7685,8458,8471,7688],"..\u002Fimages\u002Fpersonas\u002Fchris.jpg",[8474,8599,8601],{"className":8600},[8477,8478,8479],"Chris, the Consultant",[7556,8603,7940,8605,7940,8615,7940,8625,7940,8635,7696],{"className":8604},[8463],[7556,8606,8487,8608,8487,8611,7940],{"className":8607},[7559,7561],[8474,8609,8491],{"className":8610},[8479],[2403,8612,8614],{"className":8613},[8495],"44",[7556,8616,8487,8618,8487,8621,7940],{"className":8617},[7559,7561,8500],[8474,8619,8504],{"className":8620},[8479],[2403,8622,8624],{"className":8623},[8495],"Consultant Chris' Consultancy Inc.",[7556,8626,8487,8628,8487,8631,7940],{"className":8627},[7559,7561,8500],[8474,8629,8515],{"className":8630},[8479],[2403,8632,8634],{"className":8633},[8495],"System Integrator, 10+ yrs experience",[7556,8636,8487,8638,8487,8641,7940],{"className":8637},[7559,7561,8500],[8474,8639,8526],{"className":8640},[8479],[2403,8642,8644],{"className":8643},[8495],"Very familiar, uses it for quick and reliable dev on customer projects",[7556,8646,7696,8648,7696,8659,7566],{"className":8647},[7685,8455,8456,8457,8458,8459],[7556,8649,7940,8651,7940,8655,7696],{"className":8650},[8463,8464,8465,8466],[1724,8652],{"className":8653,"src":8654},[8470,7685,8458,8471,7688],"..\u002Fimages\u002Fpersonas\u002Fneil.jpg",[8474,8656,8658],{"className":8657},[8477,8478,8479],"Neil, Node-RED Developer",[7556,8660,7940,8662,7940,8672,7940,8682,7940,8692,7696],{"className":8661},[8463],[7556,8663,8487,8665,8487,8668,7940],{"className":8664},[7559,7561],[8474,8666,8491],{"className":8667},[8479],[2403,8669,8671],{"className":8670},[8495],"28",[7556,8673,8487,8675,8487,8678,7940],{"className":8674},[7559,7561,8500],[8474,8676,8504],{"className":8677},[8479],[2403,8679,8681],{"className":8680},[8495],"Software Developer, Company N",[7556,8683,8487,8685,8487,8688,7940],{"className":8684},[7559,7561,8500],[8474,8686,8515],{"className":8687},[8479],[2403,8689,8691],{"className":8690},[8495],"Computer Science, BSc",[7556,8693,8487,8695,8487,8698,7940],{"className":8694},[7559,7561,8500],[8474,8696,8526],{"className":8697},[8479],[2403,8699,8701],{"className":8700},[8495],"Actively developing Node-RED nodes",[7556,8703,7696,8705,7696,8716,7566],{"className":8704},[7685,8455,8456,8457,8458,8459],[7556,8706,7940,8708,7940,8712,7696],{"className":8707},[8463,8464,8465,8466],[1724,8709],{"className":8710,"src":8711},[8470,7685,8458,8471,7688],"..\u002Fimages\u002Fpersonas\u002Fharry.jpg",[8474,8713,8715],{"className":8714},[8477,8478,8479],"Harry, the Hobbyist",[7556,8717,7940,8719,7940,8729,7940,8739,7940,8749,7696],{"className":8718},[8463],[7556,8720,8487,8722,8487,8725,7940],{"className":8721},[7559,7561],[8474,8723,8491],{"className":8724},[8479],[2403,8726,8728],{"className":8727},[8495],"52",[7556,8730,8487,8732,8487,8735,7940],{"className":8731},[7559,7561,8500],[8474,8733,8504],{"className":8734},[8479],[2403,8736,8738],{"className":8737},[8495],"Practical Engineer (Not Software)",[7556,8740,8487,8742,8487,8745,7940],{"className":8741},[7559,7561,8500],[8474,8743,8515],{"className":8744},[8479],[2403,8746,8748],{"className":8747},[8495],"Self-taught",[7556,8750,8487,8752,8487,8755,7940],{"className":8751},[7559,7561,8500],[8474,8753,8526],{"className":8754},[8479],[2403,8756,8758],{"className":8757},[8495],"Experienced - Active member of the Node-RED community",{"title":75,"searchDepth":76,"depth":76,"links":8760},[8761],{"id":8438,"depth":76,"text":8439},{},"\u002Fhandbook\u002Fdesign\u002Fdesign-thinking",{"title":8398,"description":8406},"handbook\u002Fdesign\u002Fdesign-thinking","CY18RmdYT3s05_5OoSt8fcByxSw0Up9LlhHw7hoqjlY",{"id":8768,"title":8769,"body":8770,"description":8776,"extension":81,"meta":8855,"navGroup":8856,"navOrder":83,"navTitle":8769,"navigation":84,"path":8857,"seo":8858,"stem":8859,"__hash__":8860},"handbook\u002Fhandbook\u002Fdesign\u002Findex.md","Design",{"type":7,"value":8771,"toc":8852},[8772,8774,8777,8810,8814,8817],[10,8773,8769],{"id":7445},[19,8775,8776],{},"This section of our handbook contains all details related to FlowFuse's visual language. From our Branding Guidelines, with logos and color palettes, through to how we plan design work and ensure empathy for users through Design Thinking.",[144,8778,8779,8783,8787,8799],{},[147,8780,8781],{},[46,8782,8391],{"href":8392},[147,8784,8785],{},[46,8786,8398],{"href":8763},[147,8788,8789,8793],{},[46,8790,8792],{"href":8791},"\u002Fhandbook\u002Fdesign\u002Fprocess","Process",[144,8794,8795],{},[147,8796,8797],{},[46,8798,7310],{"href":1053},[147,8800,8801,8805,8806],{},[46,8802,8804],{"href":8803},"\u002Fhandbook\u002Fdesign\u002Ftools","Tools","\n| ",[46,8807,8809],{"href":8808},"\u002Fhandbook\u002Fdesign\u002Fvideos","Videos",[14,8811,8813],{"id":8812},"inspiration","Inspiration",[19,8815,8816],{},"For the creative aspect of the website and its UX, we refer to a few B2B sites for various page patterns whether it's the layout, user flow, or interactions, and this may extend to other aspects as well. Here's a list:",[504,8818,8819,8826,8832,8839,8845],{},[147,8820,8821],{},[46,8822,8825],{"href":8823,"rel":8824},"https:\u002F\u002Fasana.com\u002F",[108],"Asana",[147,8827,8828],{},[46,8829,1358],{"href":8830,"rel":8831},"https:\u002F\u002Fabout.gitlab.com",[108],[147,8833,8834],{},[46,8835,8838],{"href":8836,"rel":8837},"https:\u002F\u002Fwww.adyen.com\u002F",[108],"Adyen",[147,8840,8841],{},[46,8842,1365],{"href":8843,"rel":8844},"https:\u002F\u002Ffleetdm.com\u002F",[108],[147,8846,8847],{},[46,8848,8851],{"href":8849,"rel":8850},"https:\u002F\u002Fmailchimp.com\u002F",[108],"Mailchimp",{"title":75,"searchDepth":76,"depth":76,"links":8853},[8854],{"id":8812,"depth":76,"text":8813},{},"Engineering & Design Practices","\u002Fhandbook\u002Fdesign",{"title":8769,"description":8776},"handbook\u002Fdesign\u002Findex","utYIjlv_nRqo-5rbMm1jPlSsgVRUU_6rttrX4wzrR84",{"id":8862,"title":8792,"body":8863,"description":75,"extension":81,"meta":8929,"navGroup":83,"navOrder":83,"navTitle":83,"navigation":84,"path":8791,"seo":8930,"stem":8931,"__hash__":8932},"handbook\u002Fhandbook\u002Fdesign\u002Fprocess.md",{"type":7,"value":8864,"toc":8921},[8865,8868,8870,8876,8880,8884,8892,8895,8899,8902,8906,8909,8912,8915,8918],[10,8866,8792],{"id":8867},"process",[14,8869,7310],{"id":7315},[19,8871,8872,8873,8875],{},"If you want something designed or drawn, then please follow the details in\n",[46,8874,7310],{"href":1053}," in order to have your request be picked up by an available designer.",[14,8877,8879],{"id":8878},"scheduling","Scheduling",[164,8881,8883],{"id":8882},"product-design","Product design",[19,8885,8886,8887,8891],{},"The Design process is bound by the ",[46,8888,8890],{"href":8889},"\u002Fhandbook\u002Fengineering\u002Fproject-management#cadence","Development Cadence",".\nWork begins on formal design (mid and high-fidelity UX and visual design assets)\ntwo weeks prior to a release cycle beginning.",[19,8893,8894],{},"In getting a head start on major design work, we ensure that prior thinking has\nbeen conducted on the high-level UX, and development is not blocked at the start\nof a release sprint. Both visual and UX design iterations will occur throughout the\nfirst two weeks of a cycle, alongside development efforts.",[164,8896,8898],{"id":8897},"website-and-rest-of-design-assets","Website and rest of design assets",[19,8900,8901],{},"In contrast to the platform, changes and updates to the web design can be implemented independently and are not limited to specific release cycles. The timing and order of these changes, as well as the creation of other design assets such as blog images, open graphs, presentations, illustrations, etc., depend on prioritization aligned with the company's interests.",[14,8903,8905],{"id":8904},"design-review","Design Review",[19,8907,8908],{},"This phase aims to ensure that the designs not only look visually appealing, but also effectively communicate the intended message to the audience.",[19,8910,8911],{},"To achieve this, please assess the organization of information, evaluate the readability and coherence of text, and verify the alignment with the project's objectives.",[19,8913,8914],{},"All design proposals, including UX\u002FUI and other design assets, will be presented and signed off in GitHub, ensuring one source of truth and centralizing the process for all design-related work.",[19,8916,8917],{},"For UX\u002FUI proposals, the design review concludes with the sign-off of Figma designs by the page owner, who is usually the DRI for the Website but may be another team member. As for the rest of the design assets, it's determined by the person who created the Art Request.",[19,8919,8920],{},"While iterations can be made during the development phase for UX\u002FUI design in terms of content and layout, it is recommended to facilitate feedback loops during the design phase. By getting early feedback, we aim to identify and address any potential issues before entering the development phase. This approach helps streamline the design workflow, allowing for quicker iterations and ultimately saving time.",{"title":75,"searchDepth":76,"depth":76,"links":8922},[8923,8924,8928],{"id":7315,"depth":76,"text":7310},{"id":8878,"depth":76,"text":8879,"children":8925},[8926,8927],{"id":8882,"depth":605,"text":8883},{"id":8897,"depth":605,"text":8898},{"id":8904,"depth":76,"text":8905},{},{"title":8792,"description":75},"handbook\u002Fdesign\u002Fprocess","7peyclIW_bzBlUAydrOYl1BAwxI6ffyXMO6NNJQVJeU",{"id":8934,"title":8804,"body":8935,"description":9056,"extension":81,"meta":9057,"navGroup":83,"navOrder":83,"navTitle":83,"navigation":84,"path":8803,"seo":9058,"stem":9059,"__hash__":9060},"handbook\u002Fhandbook\u002Fdesign\u002Ftools.md",{"type":7,"value":8936,"toc":9046},[8937,8940,8948,8957,8960,8966,8973,8981,8984,8987,8995,8998,9018,9021,9035,9043],[10,8938,8804],{"id":8939},"tools",[19,8941,8942,8943,8947],{},"If you ever require a license to one of the following tools (where applicable), then please read our ",[46,8944,8946],{"href":8945},"\u002Fhandbook\u002Fpeopleops\u002Fexpenses#software-licenses","licensing"," section in order to attain one.",[14,8949,8951,8952,1583],{"id":8950},"figma-more-info","Figma (",[46,8953,8956],{"href":8954,"rel":8955},"https:\u002F\u002Fwww.figma.com\u002F",[108],"more info",[19,8958,8959],{},"Figma is used to construct mid- and high-fidelity designs. We have two primary working documents for design iterations:",[144,8961,8962,8964],{},[147,8963,7815],{},[147,8965,7812],{},[19,8967,8968,8969,8972],{},"Underlying each of these Figma files is a standardised component library, which coincides with FlowFuse's ",[542,8970,8971],{},"forge-ui-component"," library.",[14,8974,8976,8977,1583],{"id":8975},"figjam-more-info","FigJam (",[46,8978,8956],{"href":8979,"rel":8980},"https:\u002F\u002Fwww.figma.com\u002Ffigjam\u002F",[108],[19,8982,8983],{},"Figjam, a sister-product of Figma, is a cloud-hosted white boarding tool that enables remote, digital collaboration.",[19,8985,8986],{},"Any in-person whiteboard discussions should have a documented digital copy. Additionally, FigJam can be used to host and run digital workshops.",[14,8988,8990,8991,1583],{"id":8989},"adobe-creative-cloud-more-info","Adobe Creative Cloud (",[46,8992,8956],{"href":8993,"rel":8994},"https:\u002F\u002Fwww.adobe.com\u002Fuk\u002Fcreativecloud.html",[108],[19,8996,8997],{},"For visual design elements of the user interface and public-facing material, we predominantly use Adobe Illustrator and Adobe After Effects.",[144,8999,9000,9006],{},[147,9001,9002,9005],{},[423,9003,9004],{},"Illustrator"," provides us tooling to create high-quality, static SVG assets to supplement the user experience on both the website and the FlowFuse platform.",[147,9007,9008,9011,9012,9017],{},[423,9009,9010],{},"After Effects"," enables the generation of animated SVG elements. In particular, we work with ",[46,9013,9016],{"href":9014,"rel":9015},"https:\u002F\u002Flottiefiles.com\u002F",[108],"Lottie Files"," for injection into both our website and FlowFuse platform.",[19,9019,9020],{},"Other tools included in the Creative Cloud suite that may be useful include:",[144,9022,9023,9029],{},[147,9024,9025,9028],{},[423,9026,9027],{},"Photoshop"," can be used for raster image and photo-editing.",[147,9030,9031,9034],{},[423,9032,9033],{},"Premiere Pro"," is an excellent video-editing software.",[14,9036,9038,9039,1583],{"id":9037},"blender-more-info","Blender (",[46,9040,8956],{"href":9041,"rel":9042},"https:\u002F\u002Fblender.org",[108],[19,9044,9045],{},"Blender is a free and open-source 3D computer graphics software toolset. It can be used to create static renders of 3d assets, or entire 2d & 3d animations.",{"title":75,"searchDepth":76,"depth":76,"links":9047},[9048,9050,9052,9054],{"id":8950,"depth":76,"text":9049},"Figma (more info)",{"id":8975,"depth":76,"text":9051},"FigJam (more info)",{"id":8989,"depth":76,"text":9053},"Adobe Creative Cloud (more info)",{"id":9037,"depth":76,"text":9055},"Blender (more info)","If you ever require a license to one of the following tools (where applicable), then please read our licensing section in order to attain one.",{},{"title":8804,"description":9056},"handbook\u002Fdesign\u002Ftools","g9lvW9KshQWLnFbNxh5F0VluJuCvXP3BTBXKwNwCA6w",{"id":9062,"title":8809,"body":9063,"description":9070,"extension":81,"meta":9200,"navGroup":9201,"navOrder":83,"navTitle":9202,"navigation":84,"path":8808,"seo":9203,"stem":9204,"__hash__":9205},"handbook\u002Fhandbook\u002Fdesign\u002Fvideos.md",{"type":7,"value":9064,"toc":9190},[9065,9068,9071,9074,9082,9090,9093,9102,9106,9109,9114,9123,9126,9142,9144,9149,9154,9158,9170,9174],[10,9066,8809],{"id":9067},"videos",[19,9069,9070],{},"This section of our handbook is dedicated to guidance on how to create video\u002Fmedia assets for FlowFuse. Here you can find information on what types of videos we produce at FlowFuse and the templating and formatting we recommend for each.",[19,9072,9073],{},"Videos should be produced at 1920 x 1080 resolution.",[19,9075,9076,9077,9081],{},"Check our ",[46,9078,9080],{"href":9079},"\u002Fhandbook\u002Fdesign\u002Fbranding\u002F","branding guidelines"," for fonts, colors and logo versions.",[19,9083,9084,9085,9089],{},"We have a collection of ",[46,9086,9088],{"href":9087},"#assets","assets"," that will make video editing and creation a lot simpler, particularly in Adobe Premiere Pro.",[14,9091,9092],{"id":9088},"Assets",[19,9094,9095,9096,9101],{},"If you have an Adobe Creative Cloud account, and are a member of the FlowFuse team, then you will have access to the \"FlowFuse Templates\" library in Premiere Pro. This contains a collection of ",[46,9097,9100],{"href":9098,"rel":9099},"https:\u002F\u002Fhelpx.adobe.com\u002Fuk\u002Fpremiere-pro\u002Fusing\u002Fessential-graphics-panel.html",[108],"Essential Graphics templates",", videos and audio files that can be used across any FlowFuse videos.",[164,9103,9105],{"id":9104},"essential-graphics-templates","Essential Graphics Templates",[19,9107,9108],{},"These can be created in Adobe After Effects and provide an easy-to-use editable template for composition in Premiere Pro. We have a growing collection of FlowFuse templates that can be dropped and modified accordingly in your own FlowFuse videos.",[7556,9110,9113],{"className":9111},[9112],"video-caption","Using Essential Graphics in Premiere Pro",[9115,9116,9117,9118],"video",{"width":7642,"controls":84},"\n  ",[9119,9120],"source",{"src":9121,"type":9122},"https:\u002F\u002Fwebsite-data.s3.eu-west-1.amazonaws.com\u002Fusing-essential-graphics-in-pp.mp4","video\u002Fmp4",[164,9124,8809],{"id":9125},"videos-1",[19,9127,9128,9129,9132,9133,9135,9136,9141],{},"Re-usable ",[542,9130,9131],{},".mp4"," files that may be used across FlowFuse videos. These are also available in \"FlowFuse Templates\" Premiere Pro Library. If you don't have access to the library and need the ",[542,9134,9131],{}," files to use them in a different software, you can find them in the ",[46,9137,9140],{"href":9138,"rel":9139},"https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Ffolders\u002F1QcVSXPs2Rip2vi6S8BrmZAwp9TLAVsrw?usp=drive_link",[108],"Video assets"," folder from our shared Drive.",[14,9143,8804],{"id":8939},[19,9145,9146,9147,8947],{},"If you require a license to one of the following tools (where applicable), then please read our ",[46,9148,8946],{"href":8945},[164,9150,8990,9151,1583],{"id":8989},[46,9152,8956],{"href":8993,"rel":9153},[108],[239,9155,9157],{"id":9156},"video-editing","Video Editing",[144,9159,9160,9165],{},[147,9161,9162,9164],{},[423,9163,9010],{}," enables the generation of videos and provides control of individual animated elements within a composition. Use this if you're looking to generate bespoke animations to use in your videos.",[147,9166,9167,9169],{},[423,9168,9033],{}," - Use this when piecing together multiple bits of footage and existing FlowFuse templates. Premiere Pro is better for stitching existing compositions, for example, the opening\u002Fclosing FlowFuse title sequences, either side of some demo footage.",[164,9171,9173],{"id":9172},"image-editing","Image Editing",[144,9175,9176,9186],{},[147,9177,9178,9180,9181,549],{},[423,9179,9004],{}," provides tooling to create templates that can ingested into After Effects. It's often easier to layout complex content in Illustrator, ",[46,9182,9185],{"href":9183,"rel":9184},"https:\u002F\u002Fwww.schoolofmotion.com\u002Fblog\u002Fimport-adobe-illustrator-files-into-after-effects",[108],"then export to After Effects for animation",[147,9187,9188,9028],{},[423,9189,9027],{},{"title":75,"searchDepth":76,"depth":76,"links":9191},[9192,9196],{"id":9088,"depth":76,"text":9092,"children":9193},[9194,9195],{"id":9104,"depth":605,"text":9105},{"id":9125,"depth":605,"text":8809},{"id":8939,"depth":76,"text":8804,"children":9197},[9198,9199],{"id":8989,"depth":605,"text":9053},{"id":9172,"depth":605,"text":9173},{},"Sales & Marketing","Video",{"title":8809,"description":9070},"handbook\u002Fdesign\u002Fvideos","vQqNhQocBLINyv5tqrO45ezc0kJE-olF-saLBpr7SiE",{"id":9207,"title":9208,"body":9209,"description":9216,"extension":81,"meta":9344,"navGroup":83,"navOrder":83,"navTitle":9208,"navigation":84,"path":9345,"seo":9346,"stem":9347,"__hash__":9348},"handbook\u002Fhandbook\u002Fengineering\u002Fcontributing\u002Fcertified-nodes.md","Certified Nodes",{"type":7,"value":9210,"toc":9339},[9211,9214,9217,9226,9233,9237,9250,9254,9261,9281,9285,9288,9333],[10,9212,9208],{"id":9213},"certified-nodes",[19,9215,9216],{},"FlowFuse maintains a catalogue of nodes from the community that we put through regular checks\nto ensure they are of high quality and standards for use by our customers.",[19,9218,9219,9220,9225],{},"The catalogue is maintained in the ",[46,9221,9224],{"href":9222,"rel":9223},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fcertified-nr-nodes",[108],"certified-nr-nodes","(🔒) repository.",[19,9227,9228,9229,9232],{},"A daily GH action runs the audit process across all nodes and regenerates the ",[542,9230,9231],{},"catalogue.json"," file served to Node-RED\ninstances within FlowFuse.",[14,9234,9236],{"id":9235},"proposing-a-new-node-to-be-included","Proposing a new node to be included",[504,9238,9239,9247],{},[147,9240,9241,9246],{},[46,9242,9245],{"href":9243,"rel":9244},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fcertified-nr-nodes\u002Fissues\u002Fnew",[108],"Raise an issue","(🔒) with details of the node to be added.",[147,9248,9249],{},"Assign the issue to the CTO (or in his absence, another member of the Engineering Team).",[14,9251,9253],{"id":9252},"adding-a-new-node-to-the-list","Adding a new node to the list",[19,9255,9256,9257,9260],{},"Full details on the technical process are provided in the ",[46,9258,9224],{"href":9222,"rel":9259},[108],"(🔒) readme.",[504,9262,9263,9266,9272,9275,9278],{},[147,9264,9265],{},"Perform due diligence on the module; how popular is it, is it well maintained, is there a backlog of open issues etc.",[147,9267,9268,9269],{},"Add the module to the list held in ",[542,9270,9271],{},"modules.json",[147,9273,9274],{},"Run the audit locally to check the current state of the module. Review the results and assess whether we can accept it into the catalogue in its current state.",[147,9276,9277],{},"Raise a PR with the updated module list and audit output for the module.",[147,9279,9280],{},"Review the PR with the CTO\u002FEngineering Team",[14,9282,9284],{"id":9283},"generating-tokens-for-access-to-certified-nodes-registry","Generating Tokens for Access to Certified Nodes Registry",[19,9286,9287],{},"Licensed Self Hosting customers can request access to the Certified Nodes registry via support. These are the steps to generate a token for them",[504,9289,9290,9301,9308,9315,9322],{},[147,9291,9292,9293,9296,9297,9300],{},"On FlowFuse Cloud in the FlowFuse Team, locate the ",[542,9294,9295],{},"ff-certified-nodes"," instance in the ",[542,9298,9299],{},"Internal Tools"," Application",[147,9302,9303,9304,9307],{},"Open the editor and locate the function node in the ",[542,9305,9306],{},"Authentication"," tab",[147,9309,9310,9311,9314],{},"The comments at the top of the tab explain how to generate a token using the customer name and a randomly generated password (recommend using the ",[542,9312,9313],{},"pwgen"," command to create random password)",[147,9316,9317,9318,9321],{},"Add the username, password and token (as comment) to the ",[542,9319,9320],{},"tokens"," object in the function node",[147,9323,9324,9325,9328,9329,9332],{},"Provide the token to the customer to add in the ",[542,9326,9327],{},"Admin Settings"," -> ",[542,9330,9331],{},"FlowFuse Nodes"," section in their Forge instance",[19,9334,9335],{},[1724,9336],{"alt":9337,"src":9338},"screen shot of Admin Settings page where token is entered","\u002Fhandbook\u002Fengineering\u002Fimages\u002Fff-cert-nodes-token.png",{"title":75,"searchDepth":76,"depth":76,"links":9340},[9341,9342,9343],{"id":9235,"depth":76,"text":9236},{"id":9252,"depth":76,"text":9253},{"id":9283,"depth":76,"text":9284},{},"\u002Fhandbook\u002Fengineering\u002Fcontributing\u002Fcertified-nodes",{"title":9208,"description":9216},"handbook\u002Fengineering\u002Fcontributing\u002Fcertified-nodes","Rccf23u1gsaYEPVyLZ20NXkUunghu1IIdSr39M-82IY",{"id":9350,"title":9351,"body":9352,"description":75,"extension":81,"meta":9512,"navGroup":83,"navOrder":83,"navTitle":9513,"navigation":84,"path":9514,"seo":9515,"stem":9516,"__hash__":9517},"handbook\u002Fhandbook\u002Fengineering\u002Fcontributing\u002Fff-tables.md","Setting up a local FF Tables test environment",{"type":7,"value":9353,"toc":9509},[9354,9357,9361,9364,9506],[10,9355,9351],{"id":9356},"setting-up-a-local-ff-tables-test-environment",[14,9358,9360],{"id":9359},"postgres-instance","Postgres instance",[19,9362,9363],{},"FlowFuse Tables relies on a local Postgres instance. The following command assumes you are on Linux.",[504,9365,9366,9369,9382],{},[147,9367,9368],{},"Create a directory to hold the database files",[147,9370,9371,9372,9378,9381],{},"Run the following Docker command (from within that new directory)",[557,9373,9376],{"className":9374,"code":9375,"language":562},[560],"docker run -p 5433:5432 -e POSTGRES_USER=root -e POSTGRES_PASSWORD=password -v `pwd`\u002Fdb:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata postgres:17\n",[542,9377,9375],{"__ignoreMap":75},[9379,9380],"br",{},"The port has been mapped to 5433 to ensure it doesn't clash with a different postgres instance",[147,9383,9384,9385,9388,9389],{},"add the following to the end of your ",[542,9386,9387],{},"etc\u002Fflowfuse.local.yml"," file",[557,9390,9394],{"className":9391,"code":9392,"language":9393,"meta":75,"style":75},"language-yaml shiki shiki-themes github-light github-dark","tables:\n  enabled: true\n  driver:\n    type: postgres-localfs\n    options:\n      database:\n        user: root\n        password: password\n        host: localhost\n        port: 5433\n        database: postgres\n        ssl: false\n","yaml",[542,9395,9396,9404,9415,9422,9432,9439,9446,9456,9466,9476,9486,9496],{"__ignoreMap":75},[2403,9397,9398,9401],{"class":2405,"line":2406},[2403,9399,9400],{"class":2686},"tables",[2403,9402,9403],{"class":2446},":\n",[2403,9405,9406,9409,9412],{"class":2405,"line":76},[2403,9407,9408],{"class":2686},"  enabled",[2403,9410,9411],{"class":2446},": ",[2403,9413,9414],{"class":2709},"true\n",[2403,9416,9417,9420],{"class":2405,"line":605},[2403,9418,9419],{"class":2686},"  driver",[2403,9421,9403],{"class":2446},[2403,9423,9424,9427,9429],{"class":2405,"line":2423},[2403,9425,9426],{"class":2686},"    type",[2403,9428,9411],{"class":2446},[2403,9430,9431],{"class":2765},"postgres-localfs\n",[2403,9433,9434,9437],{"class":2405,"line":2465},[2403,9435,9436],{"class":2686},"    options",[2403,9438,9403],{"class":2446},[2403,9440,9441,9444],{"class":2405,"line":2471},[2403,9442,9443],{"class":2686},"      database",[2403,9445,9403],{"class":2446},[2403,9447,9448,9451,9453],{"class":2405,"line":3086},[2403,9449,9450],{"class":2686},"        user",[2403,9452,9411],{"class":2446},[2403,9454,9455],{"class":2765},"root\n",[2403,9457,9458,9461,9463],{"class":2405,"line":3092},[2403,9459,9460],{"class":2686},"        password",[2403,9462,9411],{"class":2446},[2403,9464,9465],{"class":2765},"password\n",[2403,9467,9468,9471,9473],{"class":2405,"line":3098},[2403,9469,9470],{"class":2686},"        host",[2403,9472,9411],{"class":2446},[2403,9474,9475],{"class":2765},"localhost\n",[2403,9477,9478,9481,9483],{"class":2405,"line":3104},[2403,9479,9480],{"class":2686},"        port",[2403,9482,9411],{"class":2446},[2403,9484,9485],{"class":2709},"5433\n",[2403,9487,9488,9491,9493],{"class":2405,"line":3109},[2403,9489,9490],{"class":2686},"        database",[2403,9492,9411],{"class":2446},[2403,9494,9495],{"class":2765},"postgres\n",[2403,9497,9498,9501,9503],{"class":2405,"line":3115},[2403,9499,9500],{"class":2686},"        ssl",[2403,9502,9411],{"class":2446},[2403,9504,9505],{"class":2709},"false\n",[2796,9507,9508],{},"html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":75,"searchDepth":76,"depth":76,"links":9510},[9511],{"id":9359,"depth":76,"text":9360},{},"FF Tables","\u002Fhandbook\u002Fengineering\u002Fcontributing\u002Fff-tables",{"title":9351,"description":75},"handbook\u002Fengineering\u002Fcontributing\u002Fff-tables","E5crfFng4jYXnqo8SRTM0B5aMudQKoZkugRB_2clQLo",{"id":9519,"title":9520,"body":9521,"description":75,"extension":81,"meta":10012,"navGroup":83,"navOrder":83,"navTitle":9520,"navigation":84,"path":10015,"seo":10016,"stem":10017,"__hash__":10018},"handbook\u002Fhandbook\u002Fengineering\u002Fcontributing\u002Findex.md","Contributing",{"type":7,"value":9522,"toc":9998},[9523,9526,9530,9534,9542,9551,9568,9573,9601,9606,9610,9631,9635,9639,9646,9649,9653,9689,9693,9702,9708,9711,9715,9722,9725,9728,9735,9746,9750,9753,9756,9759,9789,9792,9803,9806,9812,9823,9826,9829,9833,9843,9846,9890,9896,9907,9911,9918,9921,9944,9949,9965,9969,9972],[10,9524,9520],{"id":9525},"contributing",[14,9527,9529],{"id":9528},"coding-best-practices","Coding Best Practices",[164,9531,9533],{"id":9532},"linting","Linting",[19,9535,9536,9537,549],{},"All code repositories adopt our standard linting rules found in the ",[46,9538,9541],{"href":9539,"rel":9540},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002F.github\u002Fblob\u002Fmain\u002F.eslintrc",[108],"flowforge\u002F.github repository",[19,9543,9544,9545,9550],{},"We use ",[46,9546,9549],{"href":9547,"rel":9548},"https:\u002F\u002Fstandardjs.com\u002F",[108],"StandardJS",", with one exception - 4 spaces not 2.",[19,9552,9553,9554,9559,9560,9563,9564,9567],{},"If you're using VSCode, then we recommend using the ",[46,9555,9558],{"href":9556,"rel":9557},"https:\u002F\u002Fgithub.com\u002FMicrosoft\u002Fvscode-eslint",[108],"ESLint extension"," and setting ",[542,9561,9562],{},"all"," for the ",[542,9565,9566],{},"Eslint › Code Actions On Save: Mode"," setting:",[1724,9569],{"width":9570,"alt":9571,"src":9572},429,"ESLint - Action on Save","..\u002F..\u002Fimages\u002Feslint_actiononsave.png",[19,9574,9575,9576,685,9579,9582,9583,2040,9588,9591,9592,2040,9594,9596,9597,9600],{},"In the case of working with ",[542,9577,9578],{},"vue",[542,9580,9581],{},"njk"," files (found in the ",[46,9584,9587],{"href":9585,"rel":9586},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fflowfuse\u002Ftree\u002Fmain\u002Ffrontend",[108],"frontend",[46,9589,2039],{"href":1714,"rel":9590},[108]," repositories), then you can add ",[542,9593,9578],{},[542,9595,9581],{}," to the ",[542,9598,9599],{},"Eslint: Probe"," setting in order to enable auto-formatting on save for these file types.",[1724,9602],{"width":9603,"alt":9604,"src":9605},478,"ESLint - Probe","..\u002F..\u002Fimages\u002Feslint_probe.png",[164,9607,9609],{"id":9608},"editor-config","Editor Config",[19,9611,1375,9612,9616,9617,9624,9625,9630],{},[46,9613,9615],{"href":1714,"rel":9614},[108],"website repository"," uses a ",[46,9618,9621],{"href":9619,"rel":9620},"https:\u002F\u002Feditorconfig.org",[108],[542,9622,9623],{},".editorconfig","\nto allow editors to automatically pick up the correct style for that repository.\nSome editors, like neovim, has this pre-installed. If you're using VSCode, an\n",[46,9626,9629],{"href":9627,"rel":9628},"https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=EditorConfig.EditorConfig",[108],"plugin","\nis available.",[14,9632,9634],{"id":9633},"git-best-practices","Git Best Practices",[164,9636,9638],{"id":9637},"committing","Committing",[19,9640,9641,9642,9645],{},"Take care when adding files to a commit. It's easy just to ",[542,9643,9644],{},"git add -A"," (i.e. add all local changes to a commit) but this can result in commits and PRs being clogged with excessive changes that aren't linked to the actual issue\u002Ffeature at hand.",[19,9647,9648],{},"Take your time when committing files. Review each file carefully and ensure what you're adding to a commit is relevant and necessary.",[239,9650,9652],{"id":9651},"git-commit-messages","Git Commit Messages",[144,9654,9655,9658,9671,9674,9686],{},[147,9656,9657],{},"Capitalise the first letter, no trailing dot, 72 chars or less.",[147,9659,9660,9661,9664,9665,685,9668,1583],{},"First line should be an imperative\u002Fpresent tense, e.g. ",[542,9662,9663],{},"Change"," (not ",[542,9666,9667],{},"Changed",[542,9669,9670],{},"Changes",[147,9672,9673],{},"Do not include the issue number in the first line, this means that commit message are then suitable to include in a changelog as-is.",[147,9675,9676,9677,1755,9680,1755,9683],{},"Second line should either be blank, or reference to an issue\u002FPR using one of the GitHub recognized keywords, e.g. ",[542,9678,9679],{},"closes #...",[542,9681,9682],{},"fixes #...",[542,9684,9685],{},"part of #...",[147,9687,9688],{},"The remainder should be any further narrative that is needed. Wrapped at 72 chars.",[239,9690,9692],{"id":9691},"branching-vs-forking","Branching vs. Forking",[19,9694,9695,9696,9698,9699,9701],{},"Commits must never be pushed directly to ",[542,9697,1575],{},". Instead, branch or fork from the relevant branch (most likely ",[542,9700,1575],{},") and work from there.",[19,9703,9704,9705,549],{},"It is preferred that new work be added on a branch (rather than in a forked repository), although this is not enforced. Branch names should be short, informative, and if directly linked to a single issue number, reference such issue number, e.g. ",[542,9706,9707],{},"29-issue-summary",[19,9709,9710],{},"Once code is merged, please close any related branches in order to keep the repository tidy.",[164,9712,9714],{"id":9713},"pull-requests","Pull Requests",[19,9716,9717,9718,9721],{},"PRs, when opened, should have at least one reviewer assigned, and a consequent review approved, before any merge takes place. If a PR is opened for review\u002Fdiscussion purposes, this PR should be set to ",[542,9719,9720],{},"draft"," state.",[19,9723,9724],{},"When merging a PR, you should choose the \"Squash and merge\" option. This is the default approach for merging pull requests.",[19,9726,9727],{},"When conducting a PR review, if you are the last (or only) reviewer and all reviews (including your own) are approvals, unless there is a comment from the author stating otherwise, you are free to conduct the merge. Otherwise, leave the merge to the author of the PR, or a future reviewer.",[19,9729,9730,9731,549],{},"For a comprehensive review of the Pull Request, utilize the designated FlowFuse pre-staging environment. As of the composition of this document, the pre-staging verification is only available for the primary ",[46,9732,9734],{"href":7355,"rel":9733},[108],"FlowFuse NPM package",[19,9736,9737,9738,9740,9741,9745],{},"Pre-staging environment is created for each Pull Request created within ",[542,9739,7357],{}," repo which includes changes in the source code. Read more in the ",[46,9742,9744],{"href":9743},"#test-changes-in-staging","Test Changes in Staging"," section.",[14,9747,9749],{"id":9748},"conducting-code-reviews","Conducting Code Reviews",[19,9751,9752],{},"As part of our commitment to quality, all code changes should be reviewed by at least one other developer before being merged. This is to ensure that the code is of a high standard, and that any potential issues are caught early.",[19,9754,9755],{},"When code is ready to review, developer should open a Pull Request (PR) and assign a reviewer. The reviewer should then review the code, and provide feedback in the form of comments on the PR.",[19,9757,9758],{},"When reviewing code, consider the following:",[144,9760,9761,9777,9783],{},[147,9762,9763,9766,9767,9772,9773,9776],{},[423,9764,9765],{},"Functionality:"," Has the acceptance criteria on the attached issue been met? Does the code do what it is supposed to do? You ",[2562,9768,9769],{},[423,9770,9771],{},"must explicitly test the functionality",". It is recommended to do so in a ",[46,9774,9775],{"href":9743},"staging environment"," as well as pulling code changes locally and testing on your own machine.",[147,9778,9779,9782],{},[423,9780,9781],{},"Test Coverage:"," Are there tests for the new code introduced? Are the test cases sufficient, and do they cover more than just golden path?",[147,9784,9785,9788],{},[423,9786,9787],{},"Documentation:"," Ensure that supporting documentation has been written, this is especially important for new features and options introduced.",[164,9790,9744],{"id":9791},"test-changes-in-staging",[19,9793,9794,9795,9797,9798,9802],{},"For FlowFuse, when changes are merged into the ",[542,9796,1575],{}," branch, they are ",[46,9799,9801],{"href":9800},"\u002Fhandbook\u002Fengineering\u002Fops\u002Fproduction#deployment-to-flowfuse-cloud","automatically deployed to the production environment",". As such, it is vital a thorough review has been conducted before merging, and that the changes have been tested in a staging environment.",[19,9804,9805],{},"When a pull request includes modifications to the source code, a dedicated pre-staging environment is automatically generated. This pre-staging environment is a complete replica of the staging environment, ensuring that it mirrors the conditions and configurations found in staging. The pre-staging environment serves as a testing ground, allowing developers to thoroughly evaluate their changes before they are merged into the main codebase. This ensures that any issues can be identified and addressed in an isolated setting, maintaining the integrity of the staging environment.",[19,9807,9808],{},[1724,9809],{"alt":9810,"src":9811},"Example entry in the PR status to show the \"Deploy Staging\" job","\u002Fhandbook\u002Fimages\u002Fscreenshots\u002Fdevops-pr-staging.png",[19,9813,9814,9815,9818,9819,9822],{},"The environment itself will then be available at: ",[542,9816,9817],{},"https:\u002F\u002F\u003Cpr-number>.flowfuse.dev\u002F"," . Information about the pre-staging deployment is sent to ",[542,9820,9821],{},"gh-pipelines"," Slack channel.",[19,9824,9825],{},"Access credentials for the pre-staging environment are located in the FlowFuse 1Password vault.",[19,9827,9828],{},"The FlowFuse application deployed from the Pull Request comes pre-configured. The environment is terminated upon PR merging or closure.",[239,9830,9832],{"id":9831},"custom-pre-staging-environment","Custom Pre-Staging Environment",[19,9834,9835,9836,9839,9840,9842],{},"By default, a pre-staging environment is automatically created for each Pull Request made in the ",[542,9837,9838],{},"flowfuse\u002Fflowfuse"," repository, containing changes from the related feature branch.\nHowever, there are instances where it is necessary to test changes or features made in the dependency packages of ",[542,9841,9838],{},".\nThis can be accomplished by triggering a GitHub Actions pipeline to create a pre-staging environment with additional input parameters.",[19,9844,9845],{},"To create a customized pre-staging environment, please follow the steps below:",[504,9847,9848,9854,9860,9865,9876,9883],{},[147,9849,9850,9851,549],{},"Push the changes you want to test to the feature branch of the specific package's repository, ie. ",[542,9852,9853],{},"nr-project-nodes",[147,9855,9856,9857,9859],{},"In the ",[542,9858,9838],{}," repository, create a new feature branch. Use this branch to make any necessary changes that depend on the updated package from step 1, if applicable.",[147,9861,9862,9863,5361],{},"Create a Pull Request for the changes in the ",[542,9864,9838],{},[147,9866,9867,9868,9873,9874,5361],{},"Navigate to the ",[46,9869,9872],{"href":9870,"rel":9871},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fflowfuse\u002Factions\u002Fworkflows\u002Fbranch-deploy.yaml",[108],"Create pre-staging environment workflow page"," in the Actions tab of the ",[542,9875,9838],{},[147,9877,9878,9879,9882],{},"On the right side, click the ",[542,9880,9881],{},"Run workflow"," button.",[147,9884,9885,9886,9889],{},"Complete the ",[542,9887,9888],{},"Pull request number"," field and the dependent package feature branch name.",[19,9891,9892],{},[1724,9893],{"alt":9894,"src":9895,"dataZoomable":75},"Create pre-staging environment workflow inputs","\u002Fhandbook\u002Fimages\u002Fscreenshots\u002Fgh-pre-staging-workflow-inputs.png",[504,9897,9898],{"start":3086},[147,9899,9900,9901,9903,9904,9906],{},"Click the ",[542,9902,9881],{}," button and wait for the results. A Slack notification will be sent to the ",[542,9905,9821],{}," channel with the link to the pre-staging environment.",[1019,9908,9910],{"id":9909},"using-the-custom-node-red-stack","Using the custom Node-RED stack",[19,9912,9913,9914,9917],{},"If you decide to create a pre-staging environment using the ",[542,9915,9916],{},"nr-launcher"," feature branch (or its dependencies), a custom Node-RED stack will be created to allow you to test the changes.",[19,9919,9920],{},"Once your pre-staging environment is created, you can create a new instance that uses the custom stack:",[504,9922,9923,9926,9929,9932,9935,9938,9941],{},[147,9924,9925],{},"Log in to your pre-staging environment",[147,9927,9928],{},"Select the desired team",[147,9930,9931],{},"Select an application",[147,9933,9934],{},"Click \"Add Instance\"",[147,9936,9937],{},"Select the \"Custom\" entry in the \"Node-RED Version\" dropdown",[147,9939,9940],{},"Press Next until you reach the last step of the instance creation wizard",[147,9942,9943],{},"Press \"Create Instance\" to create your instance",[19,9945,9946],{},[423,9947,9948],{},"NOTES:",[144,9950,9951,9954],{},[147,9952,9953],{},"If you need to update the branch used in your custom stack, you will need to re-run the \"Custom Pre-Staging Environment\" action.",[147,9955,9956,9957],{},"Before you re-run the \"Custom Pre-Staging Environment\" action, you must do one of the following:\n",[144,9958,9959,9962],{},[147,9960,9961],{},"Delete all Hosted Instances using the custom stack",[147,9963,9964],{},"Change all Hosted Instances using the custom stack to a non-custom stack",[164,9966,9968],{"id":9967},"community-contributions","Community Contributions",[19,9970,9971],{},"As an open-core project, FlowFuse welcomes community contributions to the project. If you are, as a FlowFuse employee, conducting a review of a community contribution, please consider these additional guidelines:",[504,9973,9974,9980,9986,9992],{},[147,9975,9976,9979],{},[423,9977,9978],{},"Be Grateful:"," The community has taken the time to contribute to the project in their own time. They didn't need to do this, explicitly thank contributors for their Pull Requests, especially for first time contributors.",[147,9981,9982,9985],{},[423,9983,9984],{},"Be Respectful:"," In some cases, contributors may not have considered all the implications of their changes, or may not have the technical acumen to make the changes themselves to the standards we may like. Remember, they are doing this because they care about the project. Be respectful, provide feedback and be encouraging of future changes. Teaching a contributor about our code, and about mechanics of the project is a great way to help them improve, and will encourage more contributions in the future.",[147,9987,9988,9991],{},[423,9989,9990],{},"Don't pressure them:"," Proposing modifications and fixes to their Pull Requests are valid, and are important to ensuring we maintain a high quality codebase. However, we should never ask a contributor to do more work than they need to do. They are volunteering their time, and we shouldn't place demands on them to pick up additional issues as if they were FlowFuse employees. If they ask where they could be helpful, or want to take tasks for us, then please do assign accordingly.",[147,9993,9994,9997],{},[423,9995,9996],{},"Don't be afraid to step in and make changes yourself:"," Having a contributor go from opening a PR to seeing it merged is our main objective here. Closing that loop in a timely and supportive manner will encourage more contributions in the future. Sometimes, it may be necessary to make changes to a PR yourself, and explain to the contributor the reasoning behind your modifications to their work. Teaching is vitally important still, but doing some things yourself will reduce the friction to merge for the contributor, so make assessments where this could be done.",{"title":75,"searchDepth":76,"depth":76,"links":9999},[10000,10004,10008],{"id":9528,"depth":76,"text":9529,"children":10001},[10002,10003],{"id":9532,"depth":605,"text":9533},{"id":9608,"depth":605,"text":9609},{"id":9633,"depth":76,"text":9634,"children":10005},[10006,10007],{"id":9637,"depth":605,"text":9638},{"id":9713,"depth":605,"text":9714},{"id":9748,"depth":76,"text":9749,"children":10009},[10010,10011],{"id":9791,"depth":605,"text":9744},{"id":9967,"depth":605,"text":9968},{"originalPath":10013,"updated":10014},"development\u002Fcontributing.md","git modified","\u002Fhandbook\u002Fengineering\u002Fcontributing",{"title":9520,"description":75},"handbook\u002Fengineering\u002Fcontributing\u002Findex","-2vwbXAlxoSEm7XSgyWNp6ogduIhItKFlk0Urcs2wuM",{"id":10020,"title":10021,"body":10022,"description":10029,"extension":81,"meta":10141,"navGroup":83,"navOrder":83,"navTitle":10142,"navigation":84,"path":10143,"seo":10144,"stem":10145,"__hash__":10146},"handbook\u002Fhandbook\u002Fengineering\u002Fcontributing\u002Fteam-npm-registry.md","FlowFuse Team NPM Registry",{"type":7,"value":10023,"toc":10137},[10024,10027,10030,10034,10111,10115],[10,10025,10021],{"id":10026},"flowfuse-team-npm-registry",[19,10028,10029],{},"To enable a local development environment for the Team NPM feature follow these steps.",[14,10031,10033],{"id":10032},"registry-setup","Registry Setup",[144,10035,10036,10045,10054,10063,10072,10081,10090,10102],{},[147,10037,10038,10039],{},"Create a directory to hold the NPM registry\n",[557,10040,10043],{"className":10041,"code":10042,"language":562},[560],"mkdir npm-registry\ncd npm-registry\n",[542,10044,10042],{"__ignoreMap":75},[147,10046,10047,10048],{},"Create\n",[557,10049,10052],{"className":10050,"code":10051,"language":562},[560],"mkdir config storage\n",[542,10053,10051],{"__ignoreMap":75},[147,10055,10056,10057],{},"Install verdaccio\n",[557,10058,10061],{"className":10059,"code":10060,"language":562},[560],"npm install --prefix=. verdaccio\n",[542,10062,10060],{"__ignoreMap":75},[147,10064,10065,10066],{},"Clone auth plugin\n",[557,10067,10070],{"className":10068,"code":10069,"language":562},[560],"git clone https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fverdaccio-ff-auth.git\n",[542,10071,10069],{"__ignoreMap":75},[147,10073,10074,10075],{},"Build auth plugin\n",[557,10076,10079],{"className":10077,"code":10078,"language":562},[560],"cd verdaccio-ff-auth\nnpm install\nnpm run build\n",[542,10080,10078],{"__ignoreMap":75},[147,10082,10083,10084],{},"Add auth plugin\n",[557,10085,10088],{"className":10086,"code":10087,"language":562},[560],"cd ..\nnpm install .\u002Fverdaccio-ff-auth\n",[542,10089,10087],{"__ignoreMap":75},[147,10091,10092,10093,10096],{},"Configure verdaccio, create a file called ",[542,10094,10095],{},"config\u002Fconfig.yaml",[557,10097,10100],{"className":10098,"code":10099,"language":562},[560],"storage: ..\u002Fstorage\nauth:\n    ff-auth:\n        baseURL: http:\u002F\u002F127.0.0.1:3000\n        adminSecret: secret\npackages:\n    '@*\u002F*':\n        access: $authenticated\nlog: { type: stdout, format: pretty, level: http }\n",[542,10101,10099],{"__ignoreMap":75},[147,10103,10104,10105],{},"Start verdaccio\n",[557,10106,10109],{"className":10107,"code":10108,"language":562},[560],".\u002Fnode_modules\u002F.bin\u002Fverdaccio --config config\u002Fconfig.yaml\n",[542,10110,10108],{"__ignoreMap":75},[14,10112,10114],{"id":10113},"configure-flowfuse","Configure Flowfuse",[144,10116,10117,10130],{},[147,10118,10119,10120,10123,10124],{},"Add the following to the end of your ",[542,10121,10122],{},"flowforge.yml"," file\n",[557,10125,10128],{"className":10126,"code":10127,"language":562},[560],"npmRegistry:\n  enabled: true\n  url: http:\u002F\u002Flocalhost:4873\n  admin:\n    username: admin\n    password: secret\n",[542,10129,10127],{"__ignoreMap":75},[147,10131,10132,10133],{},"Update TeamTypes to enable the feature\n",[1724,10134],{"alt":10135,"src":10136},"sceen shot of team type features","\u002Fhandbook\u002Fengineering\u002Fimages\u002Fnpm-registry-team-type.png",{"title":75,"searchDepth":76,"depth":76,"links":10138},[10139,10140],{"id":10032,"depth":76,"text":10033},{"id":10113,"depth":76,"text":10114},{},"Team NPM Registry","\u002Fhandbook\u002Fengineering\u002Fcontributing\u002Fteam-npm-registry",{"title":10021,"description":10029},"handbook\u002Fengineering\u002Fcontributing\u002Fteam-npm-registry","ZzqQ0kt35azO0xkcw3Coje4NuSf4Jj5FNB3FCRtSbBs",{"id":10148,"title":10149,"body":10150,"description":10349,"extension":81,"meta":10350,"navGroup":83,"navOrder":83,"navTitle":10149,"navigation":84,"path":10351,"seo":10352,"stem":10353,"__hash__":10354},"handbook\u002Fhandbook\u002Fengineering\u002Fdependency-updates.md","Dependency Updates",{"type":7,"value":10151,"toc":10340},[10152,10155,10164,10168,10171,10173,10176,10180,10183,10221,10225,10228,10239,10242,10246,10256,10271,10274,10278,10281,10290,10309,10312,10333,10337],[10,10153,10149],{"id":10154},"dependency-updates",[19,10156,10157,10158,10163],{},"This page covers how we triage ",[46,10159,10162],{"href":10160,"rel":10161},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcode-security\u002Fconcepts\u002Fsupply-chain-security\u002Fabout-dependabot-pull-requests",[108],"Dependabot"," pull requests across our repositories so the backlog stays under control.",[14,10165,10167],{"id":10166},"why-we-triage-weekly","Why we triage weekly",[19,10169,10170],{},"Dependabot opens pull requests as soon as new versions ship. Left alone, those PRs pile up, conflict with each other, and become risky to merge in bulk. A short, regular triage slot keeps each batch small enough to review carefully and stops the backlog from reforming.",[14,10172,7096],{"id":7095},[19,10174,10175],{},"The triage rotation is owned by the engineering team. One engineer takes the slot each week, works through the open Dependabot PRs across our repositories, and hands off at the end of the week. Budget around 30 minutes — anything that does not fit in that slot gets escalated rather than rushed.",[14,10177,10179],{"id":10178},"weekly-process","Weekly process",[19,10181,10182],{},"Work through Dependabot PRs in this order:",[504,10184,10185,10191,10197,10203,10209,10215],{},[147,10186,10187,10190],{},[423,10188,10189],{},"Wait at least 12 hours after a version is published before merging."," Compromised or broken releases are usually flagged within that window. Merging immediately after publish removes that safety margin.",[147,10192,10193,10196],{},[423,10194,10195],{},"Check for an active npm advisory or breach report on the package."," Look at the package's npm page and the GitHub advisory database before approving. If anything is open against that version, hold the PR until it clears.",[147,10198,10199,10202],{},[423,10200,10201],{},"Read the release notes for each bump."," Confirm there are no breaking changes that affect how we use the package. Patch and minor bumps still occasionally ship behavior changes worth knowing about.",[147,10204,10205,10208],{},[423,10206,10207],{},"Merge the safe, small bumps first."," Patch and minor updates with a contained diff and clean release notes go in early. Leave anything with an unusually large diff for closer review.",[147,10210,10211,10214],{},[423,10212,10213],{},"CI must pass before merging — no exceptions."," A red build on a dependency PR is the signal that something needs investigation, not a bypass.",[147,10216,10217,10220],{},[423,10218,10219],{},"Check all repositories."," - Dependabot is active in all our repositiories.",[14,10222,10224],{"id":10223},"major-version-bumps","Major version bumps",[19,10226,10227],{},"Major version bumps do not fit in the weekly slot. When one appears:",[504,10229,10230,10233,10236],{},[147,10231,10232],{},"Pull the PR out of the weekly batch.",[147,10234,10235],{},"Assign an owner who knows the affected code.",[147,10237,10238],{},"Schedule it into a milestone alongside time to read the migration guide, update our usage, and verify the change end-to-end.",[19,10240,10241],{},"Treat the major bump as its own piece of work, not as routine maintenance.",[14,10243,10245],{"id":10244},"mutually-exclusive-bumps","Mutually exclusive bumps",[19,10247,10248,10249,685,10252,10255],{},"Two open PRs sometimes touch the same ",[542,10250,10251],{},"package.json",[542,10253,10254],{},"package-lock.json"," entries and cannot both merge cleanly. Flag these as soon as you spot them:",[144,10257,10258,10261,10268],{},[147,10259,10260],{},"Pick the bump you want to land first and merge it.",[147,10262,10263,10264,10267],{},"Comment on the second PR with ",[542,10265,10266],{},"@dependabot recreate"," so Dependabot rebuilds it against the updated lockfile.",[147,10269,10270],{},"If the second bump becomes redundant after the first lands, close it and let Dependabot reopen the PR on the next scan.",[19,10272,10273],{},"Catching these early avoids wasted CI runs and reviewer time.",[14,10275,10277],{"id":10276},"stale-or-conflicted-prs","Stale or conflicted PRs",[19,10279,10280],{},"Dependabot rebases its PRs automatically when conflicts appear, but stops doing so once a PR has been open for 30 days without merging. Triaging weekly keeps PRs inside that window.",[19,10282,10283,10284,10289],{},"Dependabot exposes a ",[46,10285,10288],{"href":10286,"rel":10287},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fcode-security\u002Freference\u002Fsupply-chain-security\u002Fdependabot-pull-request-comment-commands",[108],"list of commands"," in the collapsed comment at the bottom of every PR. Use these to refresh stuck branches:",[144,10291,10292,10298,10303],{},[147,10293,10294,10297],{},[542,10295,10296],{},"@dependabot rebase"," — rebase the branch on the latest target. This is the right call for ordinary lockfile conflicts.",[147,10299,10300,10302],{},[542,10301,10266],{}," — rebuild the PR from scratch, overwriting any edits made to the branch. Use this when the PR has been hand-edited and you want Dependabot to take it back over, or when rebase has not produced a clean branch.",[147,10304,10305,10308],{},[542,10306,10307],{},"@dependabot merge"," — auto-merge once CI passes. Safe to comment preemptively as long as the checks above have been done.",[19,10310,10311],{},"If Dependabot replies that it cannot rebase, the branch has usually been hand-edited and Dependabot will not force-push over your commits. In that case:",[504,10313,10314,10324,10327,10330],{},[147,10315,10316,10317,685,10320,10323],{},"If you want Dependabot to keep managing the branch, mark your hand-edited commits with ",[542,10318,10319],{},"[dependabot skip]",[542,10321,10322],{},"[skip dependabot]"," in the commit message. Dependabot will then rebase and force-push over them as needed.",[147,10325,10326],{},"Otherwise, treat the PR as a normal branch — pull it down locally, resolve the conflict by hand, and push the fix back up.",[147,10328,10329],{},"If the hand-edited changes are no longer needed, close the PR and let Dependabot open a fresh one.",[147,10331,10332],{},"Do not delete commits from the Dependabot branch without recording why in the PR — the next person triaging needs to understand what changed.",[14,10334,10336],{"id":10335},"when-in-doubt","When in doubt",[19,10338,10339],{},"Hold the PR and raise it in the engineering channel. A dependency that waits a week to merge is fine; a bad dependency that ships to production is not.",{"title":75,"searchDepth":76,"depth":76,"links":10341},[10342,10343,10344,10345,10346,10347,10348],{"id":10166,"depth":76,"text":10167},{"id":7095,"depth":76,"text":7096},{"id":10178,"depth":76,"text":10179},{"id":10223,"depth":76,"text":10224},{"id":10244,"depth":76,"text":10245},{"id":10276,"depth":76,"text":10277},{"id":10335,"depth":76,"text":10336},"This page covers how we triage Dependabot pull requests across our repositories so the backlog stays under control.",{},"\u002Fhandbook\u002Fengineering\u002Fdependency-updates",{"title":10149,"description":10349},"handbook\u002Fengineering\u002Fdependency-updates","cV0TwiO8aPTAOtFELU9hmFI3ETFLbI7ZG4JH5kMUv0k",{"id":10356,"title":10357,"body":10358,"description":10593,"extension":81,"meta":10594,"navGroup":83,"navOrder":83,"navTitle":10357,"navigation":84,"path":10595,"seo":10596,"stem":10597,"__hash__":10598},"handbook\u002Fhandbook\u002Fengineering\u002Ffrontend\u002Fdata-attributes.md","Data Attributes",{"type":7,"value":10359,"toc":10587},[10360,10363,10376,10388,10391,10394,10461,10464,10467,10503,10506,10509,10551,10554,10557,10584],[10,10361,10357],{"id":10362},"data-attributes",[19,10364,10365,10366,10371,10372,10375],{},"It is recommended in the ",[46,10367,10370],{"href":10368,"rel":10369},"https:\u002F\u002Fdocs.cypress.io\u002Fguides\u002Freferences\u002Fbest-practices#Selecting-Elements",[108],"Cypress Best Practices"," to utilise ",[542,10373,10374],{},"data-"," attributes on HTML elements in order to ensure safe selection of objects that won't evolve\u002Fchange over time.",[19,10377,10378,10379,10384,10385,10387],{},"Similarly, this is a best practices for ",[46,10380,10383],{"href":10381,"rel":10382},"https:\u002F\u002Fposthog.com\u002F",[108],"PostHog"," which we also use to track user behaviour across the application. As such, we have defined our own best practice set of ",[542,10386,10374],{}," attributes to use:",[14,10389,10390],{"id":10390},"data-nav",[19,10392,10393],{},"Tag elements that have a sole purpose of moving a user from one place to another. This is used for any navigation item in a side bar, tab or any of the primary navigation dropdown menus for switching team or user options",[557,10395,10399],{"className":10396,"code":10397,"language":10398,"meta":75,"style":75},"language-html shiki shiki-themes github-light github-dark","\u003Crouter-link to=\"admin\u002Fsettings\" data-nav=\"admin-settings\">\n    \u003Cnav-item label=\"Admin Settings\">\u003C\u002Fnav-item>\n\u003C\u002Frouter-link>\n","html",[542,10400,10401,10429,10452],{"__ignoreMap":75},[2403,10402,10403,10406,10409,10412,10415,10418,10421,10423,10426],{"class":2405,"line":2406},[2403,10404,10405],{"class":2446},"\u003C",[2403,10407,10408],{"class":2686},"router-link",[2403,10410,10411],{"class":2758}," to",[2403,10413,10414],{"class":2446},"=",[2403,10416,10417],{"class":2765},"\"admin\u002Fsettings\"",[2403,10419,10420],{"class":2758}," data-nav",[2403,10422,10414],{"class":2446},[2403,10424,10425],{"class":2765},"\"admin-settings\"",[2403,10427,10428],{"class":2446},">\n",[2403,10430,10431,10434,10437,10440,10442,10445,10448,10450],{"class":2405,"line":76},[2403,10432,10433],{"class":2446},"    \u003C",[2403,10435,10436],{"class":2686},"nav-item",[2403,10438,10439],{"class":2758}," label",[2403,10441,10414],{"class":2446},[2403,10443,10444],{"class":2765},"\"Admin Settings\"",[2403,10446,10447],{"class":2446},">\u003C\u002F",[2403,10449,10436],{"class":2686},[2403,10451,10428],{"class":2446},[2403,10453,10454,10457,10459],{"class":2405,"line":605},[2403,10455,10456],{"class":2446},"\u003C\u002F",[2403,10458,10408],{"class":2686},[2403,10460,10428],{"class":2446},[14,10462,10463],{"id":10463},"data-form",[19,10465,10466],{},"Identify particular form elements like text-input, textarea of dropdowns using this tag.",[557,10468,10470],{"className":10396,"code":10469,"language":10398,"meta":75,"style":75},"\u003CFormRow data-form=\"device-name\" v-model=\"input.name\">Name\u003C\u002FFormRow>\n",[542,10471,10472],{"__ignoreMap":75},[2403,10473,10474,10476,10480,10483,10485,10488,10491,10493,10496,10499,10501],{"class":2405,"line":2406},[2403,10475,10405],{"class":2446},[2403,10477,10479],{"class":10478},"s7hpK","FormRow",[2403,10481,10482],{"class":2758}," data-form",[2403,10484,10414],{"class":2446},[2403,10486,10487],{"class":2765},"\"device-name\"",[2403,10489,10490],{"class":2758}," v-model",[2403,10492,10414],{"class":2446},[2403,10494,10495],{"class":2765},"\"input.name\"",[2403,10497,10498],{"class":2446},">Name\u003C\u002F",[2403,10500,10479],{"class":10478},[2403,10502,10428],{"class":2446},[14,10504,10505],{"id":10505},"data-action",[19,10507,10508],{},"Used to identify buttons that do not navigate, but instead complete an action. This could include submitting a form, or opening a dialog, e.g.,",[557,10510,10512],{"className":10396,"code":10511,"language":10398,"meta":75,"style":75},"\u003Cff-button data-action=\"delete-project\" kind=\"danger\" @click=\"deleteProject()\">\u003C\u002Fff-button>\n",[542,10513,10514],{"__ignoreMap":75},[2403,10515,10516,10518,10521,10524,10526,10529,10532,10534,10537,10540,10542,10545,10547,10549],{"class":2405,"line":2406},[2403,10517,10405],{"class":2446},[2403,10519,10520],{"class":2686},"ff-button",[2403,10522,10523],{"class":2758}," data-action",[2403,10525,10414],{"class":2446},[2403,10527,10528],{"class":2765},"\"delete-project\"",[2403,10530,10531],{"class":2758}," kind",[2403,10533,10414],{"class":2446},[2403,10535,10536],{"class":2765},"\"danger\"",[2403,10538,10539],{"class":2758}," @click",[2403,10541,10414],{"class":2446},[2403,10543,10544],{"class":2765},"\"deleteProject()\"",[2403,10546,10447],{"class":2446},[2403,10548,10520],{"class":2686},[2403,10550,10428],{"class":2446},[14,10552,10553],{"id":10553},"data-el",[19,10555,10556],{},"A catch all for everything else, an element that we're likely going to want to capture, but doesn't fit into any of the other categories, e.g.,",[557,10558,10560],{"className":10396,"code":10559,"language":10398,"meta":75,"style":75},"\u003Cff-data-table data-el=\"templates\">...\u003C\u002Fff-data-table>\n",[542,10561,10562],{"__ignoreMap":75},[2403,10563,10564,10566,10569,10572,10574,10577,10580,10582],{"class":2405,"line":2406},[2403,10565,10405],{"class":2446},[2403,10567,10568],{"class":2686},"ff-data-table",[2403,10570,10571],{"class":2758}," data-el",[2403,10573,10414],{"class":2446},[2403,10575,10576],{"class":2765},"\"templates\"",[2403,10578,10579],{"class":2446},">...\u003C\u002F",[2403,10581,10568],{"class":2686},[2403,10583,10428],{"class":2446},[2796,10585,10586],{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7hpK, html code.shiki .s7hpK{--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}",{"title":75,"searchDepth":76,"depth":76,"links":10588},[10589,10590,10591,10592],{"id":10390,"depth":76,"text":10390},{"id":10463,"depth":76,"text":10463},{"id":10505,"depth":76,"text":10505},{"id":10553,"depth":76,"text":10553},"It is recommended in the Cypress Best Practices to utilise data- attributes on HTML elements in order to ensure safe selection of objects that won't evolve\u002Fchange over time.",{},"\u002Fhandbook\u002Fengineering\u002Ffrontend\u002Fdata-attributes",{"title":10357,"description":10593},"handbook\u002Fengineering\u002Ffrontend\u002Fdata-attributes","bNSrISpRi2lThW5Zvmb_s6HLARSOj0MWZ9G0kuYFvpE",{"id":10600,"title":10601,"body":10602,"description":10609,"extension":81,"meta":10636,"navGroup":83,"navOrder":83,"navTitle":10637,"navigation":84,"path":10638,"seo":10639,"stem":10640,"__hash__":10641},"handbook\u002Fhandbook\u002Fengineering\u002Ffrontend\u002Findex.md","Front-End",{"type":7,"value":10603,"toc":10634},[10604,10607,10610],[10,10605,10601],{"id":10606},"front-end",[19,10608,10609],{},"A collection of how-to's and best practice guides for FlowFuse's front-end development.",[144,10611,10612,10616,10622,10628],{},[147,10613,10614],{},[46,10615,10357],{"href":10595},[147,10617,10618],{},[46,10619,10621],{"href":10620},"\u002Fhandbook\u002Fengineering\u002Ffrontend\u002Fservices","Services",[147,10623,10624],{},[46,10625,10627],{"href":10626},"\u002Fhandbook\u002Fengineering\u002Ffrontend\u002Ftesting","Testing",[147,10629,10630],{},[46,10631,10633],{"href":10632},"\u002Fhandbook\u002Fengineering\u002Ffrontend\u002Flayouts","Layouts",{"title":75,"searchDepth":76,"depth":76,"links":10635},[],{},"Front End","\u002Fhandbook\u002Fengineering\u002Ffrontend",{"title":10601,"description":10609},"handbook\u002Fengineering\u002Ffrontend\u002Findex","FB7g5EGc3HwRy6DAG-2TgjnzHvCNwwoSRwKxqVUY-2s",{"id":10643,"title":10644,"body":10645,"description":10850,"extension":81,"meta":10851,"navGroup":83,"navOrder":83,"navTitle":83,"navigation":84,"path":10632,"seo":10852,"stem":10853,"__hash__":10854},"handbook\u002Fhandbook\u002Fengineering\u002Ffrontend\u002Flayouts.md","Front-End Layouts",{"type":7,"value":10646,"toc":10841},[10647,10650,10657,10673,10677,10680,10683,10686,10689,10697,10700,10703,10706,10709,10712,10715,10718,10721,10724,10727,10735,10739,10746,10835,10838],[10,10648,10633],{"id":10649},"layouts",[19,10651,10652,10653,10656],{},"The frontend has 5 layouts which can be found in ",[542,10654,10655],{},"frontend\u002Fsrc\u002Flayouts",":",[144,10658,10659,10661,10664,10667,10670],{},[147,10660,7812],{},[147,10662,10663],{},"Plain",[147,10665,10666],{},"Page",[147,10668,10669],{},"Box",[147,10671,10672],{},"Immersive",[14,10674,10676],{"id":10675},"layout-variants","Layout Variants",[164,10678,7812],{"id":10679},"platform",[19,10681,10682],{},"The platform layout serves as the primary structure throughout the application.",[19,10684,10685],{},"It comprises a page header and side navigation, offering features such as platform banners, toast notifications, dialog\u002Fmodals, and interview popups.",[19,10687,10688],{},"Most importantly, it is designed to be mobile-friendly.",[19,10690,10691,10694],{},[1724,10692],{"alt":10633,"src":10693},"\u002Fhandbook\u002Fimages\u002Fdevelopment\u002Flayout-platform.png",[2562,10695,10696],{},"Screenshot of the FlowFuse platform to show the areas controlled by the Platform (green) layout and the child, Page (red) layout.",[239,10698,10666],{"id":10699},"page",[19,10701,10702],{},"The page layout is used primarily as a wrapper for Vue pages and has support for a header slot among a default one.",[164,10704,10663],{"id":10705},"plain",[19,10707,10708],{},"The plain layout serves as a blank structure primarily used for embedded pages or any other structures that don't require navigation or headers (ex: error pages).",[19,10710,10711],{},"Has support for alerts and dialog\u002Fmodals.",[164,10713,10672],{"id":10714},"immersive",[19,10716,10717],{},"The immersive layout serves as the flexbox for the hosted and remoted editor instances.",[19,10719,10720],{},"Does not have support for left drawers. All drawers are shown as a layout over the expert drawer.",[164,10722,10669],{"id":10723},"box",[19,10725,10726],{},"The box layout is used in the initial Setup phase and consists of a boxed layout which guides you through the required steps in configuring the Flow Fuse Application.",[19,10728,10729,10732],{},[1724,10730],{"alt":10633,"src":10731},"\u002Fhandbook\u002Fimages\u002Fdevelopment\u002Flayout-box.png",[2562,10733,10734],{},"Screenshot of the FlowFuse platform with a page using the \"Box\" layout.",[14,10736,10738],{"id":10737},"layout-selection","Layout Selection",[19,10740,10741,10742,10745],{},"Layout selection is done via a ",[542,10743,10744],{},"layout"," meta attribute defined on the page route.",[557,10747,10751],{"className":10748,"code":10749,"language":10750,"meta":75,"style":75},"language-javascript shiki shiki-themes github-light github-dark","{\n    path: '\u002Finstance\u002F:id',\n    name: 'Instance',\n    component: Instance,\n    meta: {\n        title: 'Instance - Overview',\n        layout: 'plain' \u002F\u002F 'platform'\u002F'modal'\u002F'plain'\n    },\n}\n","javascript",[542,10752,10753,10758,10771,10783,10791,10799,10811,10825,10830],{"__ignoreMap":75},[2403,10754,10755],{"class":2405,"line":2406},[2403,10756,10757],{"class":2446},"{\n",[2403,10759,10760,10763,10765,10768],{"class":2405,"line":76},[2403,10761,10762],{"class":2758},"    path",[2403,10764,9411],{"class":2446},[2403,10766,10767],{"class":2765},"'\u002Finstance\u002F:id'",[2403,10769,10770],{"class":2446},",\n",[2403,10772,10773,10776,10778,10781],{"class":2405,"line":605},[2403,10774,10775],{"class":2758},"    name",[2403,10777,9411],{"class":2446},[2403,10779,10780],{"class":2765},"'Instance'",[2403,10782,10770],{"class":2446},[2403,10784,10785,10788],{"class":2405,"line":2423},[2403,10786,10787],{"class":2758},"    component",[2403,10789,10790],{"class":2446},": Instance,\n",[2403,10792,10793,10796],{"class":2405,"line":2465},[2403,10794,10795],{"class":2758},"    meta",[2403,10797,10798],{"class":2446},": {\n",[2403,10800,10801,10804,10806,10809],{"class":2405,"line":2471},[2403,10802,10803],{"class":2758},"        title",[2403,10805,9411],{"class":2446},[2403,10807,10808],{"class":2765},"'Instance - Overview'",[2403,10810,10770],{"class":2446},[2403,10812,10813,10816,10818,10821],{"class":2405,"line":3086},[2403,10814,10815],{"class":2758},"        layout",[2403,10817,9411],{"class":2446},[2403,10819,10820],{"class":2765},"'plain'",[2403,10822,10824],{"class":10823},"sJ8bj"," \u002F\u002F 'platform'\u002F'modal'\u002F'plain'\n",[2403,10826,10827],{"class":2405,"line":3092},[2403,10828,10829],{"class":2446},"    },\n",[2403,10831,10832],{"class":2405,"line":3098},[2403,10833,10834],{"class":2446},"}\n",[19,10836,10837],{},"If the layout meta attribute is missing or an invalid value is passed, the application will default to the platform layout.",[2796,10839,10840],{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":75,"searchDepth":76,"depth":76,"links":10842},[10843,10849],{"id":10675,"depth":76,"text":10676,"children":10844},[10845,10846,10847,10848],{"id":10679,"depth":605,"text":7812},{"id":10705,"depth":605,"text":10663},{"id":10714,"depth":605,"text":10672},{"id":10723,"depth":605,"text":10669},{"id":10737,"depth":76,"text":10738},"The frontend has 5 layouts which can be found in frontend\u002Fsrc\u002Flayouts:",{},{"title":10644,"description":10850},"handbook\u002Fengineering\u002Ffrontend\u002Flayouts","mU1xniNxMBVwvHUzhtIH_LLM504CNys0kbQG4PGjObI",{"id":10856,"title":10621,"body":10857,"description":11070,"extension":81,"meta":11071,"navGroup":83,"navOrder":83,"navTitle":83,"navigation":84,"path":10620,"seo":11072,"stem":11073,"__hash__":11074},"handbook\u002Fhandbook\u002Fengineering\u002Ffrontend\u002Fservices.md",{"type":7,"value":10858,"toc":11066},[10859,10862,10868,10873,10877,10880,10889,10954,10963,10967,10970,11050,11057,11063],[10,10860,10621],{"id":10861},"services",[19,10863,10864,10865,549],{},"The frontend contains two helper services that can be called anywhere in the UI. Each of the services control components built into the main ",[542,10866,10867],{},"Platform.vue",[9115,10869,9117,10870],{"width":7642,"controls":84},[9119,10871],{"src":10872,"type":9122},"https:\u002F\u002Fwebsite-data.s3.eu-west-1.amazonaws.com\u002Fui-services-demo.mp4",[14,10874,10876],{"id":10875},"alerts","Alerts",[19,10878,10879],{},"Alerts should be used to reinforce the completion of an action, or to alert a user that something has gone wrong.",[19,10881,10882,10883,10888],{},"The important piece to note here is that alerts should be for ",[2562,10884,10885],{},[423,10886,10887],{},"information only",", and should not require any actions on the user's part.",[557,10890,10892],{"className":2746,"code":10891,"language":2748,"meta":75,"style":75},"import Alert from '@\u002Fservices\u002Falerts'\n\n\u002F*\n * msg       - The text to be displayed in the alert.\n * type      - 'info' | 'confirmation' | 'warning'\n * countdown - (optional) If provided, the alert will disappear\n *             after this duration (ms), defaults to 3000.\n *\u002F\nAlert.emit(msg, type, countdown)\n",[542,10893,10894,10909,10913,10918,10923,10928,10933,10938,10943],{"__ignoreMap":75},[2403,10895,10896,10900,10903,10906],{"class":2405,"line":2406},[2403,10897,10899],{"class":10898},"szBVR","import",[2403,10901,10902],{"class":2446}," Alert ",[2403,10904,10905],{"class":10898},"from",[2403,10907,10908],{"class":2765}," '@\u002Fservices\u002Falerts'\n",[2403,10910,10911],{"class":2405,"line":76},[2403,10912,2462],{"emptyLinePlaceholder":84},[2403,10914,10915],{"class":2405,"line":605},[2403,10916,10917],{"class":10823},"\u002F*\n",[2403,10919,10920],{"class":2405,"line":2423},[2403,10921,10922],{"class":10823}," * msg       - The text to be displayed in the alert.\n",[2403,10924,10925],{"class":2405,"line":2465},[2403,10926,10927],{"class":10823}," * type      - 'info' | 'confirmation' | 'warning'\n",[2403,10929,10930],{"class":2405,"line":2471},[2403,10931,10932],{"class":10823}," * countdown - (optional) If provided, the alert will disappear\n",[2403,10934,10935],{"class":2405,"line":3086},[2403,10936,10937],{"class":10823}," *             after this duration (ms), defaults to 3000.\n",[2403,10939,10940],{"class":2405,"line":3092},[2403,10941,10942],{"class":10823}," *\u002F\n",[2403,10944,10945,10948,10951],{"class":2405,"line":3098},[2403,10946,10947],{"class":2446},"Alert.",[2403,10949,10950],{"class":2758},"emit",[2403,10952,10953],{"class":2446},"(msg, type, countdown)\n",[19,10955,10956,10957,10962],{},"The service is built from the ",[46,10958,10961],{"href":10959,"rel":10960},"https:\u002F\u002Fflowfuse.github.io\u002Fforge-ui-components\u002F#ff-notification-toast",[108],"ff-notification-toast"," forge-ui-component.",[14,10964,10966],{"id":10965},"dialog","Dialog",[19,10968,10969],{},"The Dialog service should be used when user confirmation is required, after an action has been taken. For example, if a user attempts to delete a resource, a confirmation Dialog should be shown to ensure this was not an accidental action.",[557,10971,10973],{"className":2746,"code":10972,"language":2748,"meta":75,"style":75},"import Dialog from '@\u002Fservices\u002Fdialog'\n\n\u002F*\n * msg      - {\n *               header: '\u003Cheader title>',\n *               kind: 'danger` | `primary` | `secondary` | `tertiary',  (default = 'primary') \n *               text: 'show this message in the dialog',\n *               html: 'instead of \"text\", you can provide html for more custom appearance and content',\n *               confirmLabel: '\u003Cconfirm-label>'\n *            }\n * callback - function to run when the user confirms the dialog\n *\u002F\nDialog.show(msg, callback)\n",[542,10974,10975,10987,10991,10995,11000,11005,11010,11015,11020,11025,11030,11035,11039],{"__ignoreMap":75},[2403,10976,10977,10979,10982,10984],{"class":2405,"line":2406},[2403,10978,10899],{"class":10898},[2403,10980,10981],{"class":2446}," Dialog ",[2403,10983,10905],{"class":10898},[2403,10985,10986],{"class":2765}," '@\u002Fservices\u002Fdialog'\n",[2403,10988,10989],{"class":2405,"line":76},[2403,10990,2462],{"emptyLinePlaceholder":84},[2403,10992,10993],{"class":2405,"line":605},[2403,10994,10917],{"class":10823},[2403,10996,10997],{"class":2405,"line":2423},[2403,10998,10999],{"class":10823}," * msg      - {\n",[2403,11001,11002],{"class":2405,"line":2465},[2403,11003,11004],{"class":10823}," *               header: '\u003Cheader title>',\n",[2403,11006,11007],{"class":2405,"line":2471},[2403,11008,11009],{"class":10823}," *               kind: 'danger` | `primary` | `secondary` | `tertiary',  (default = 'primary') \n",[2403,11011,11012],{"class":2405,"line":3086},[2403,11013,11014],{"class":10823}," *               text: 'show this message in the dialog',\n",[2403,11016,11017],{"class":2405,"line":3092},[2403,11018,11019],{"class":10823}," *               html: 'instead of \"text\", you can provide html for more custom appearance and content',\n",[2403,11021,11022],{"class":2405,"line":3098},[2403,11023,11024],{"class":10823}," *               confirmLabel: '\u003Cconfirm-label>'\n",[2403,11026,11027],{"class":2405,"line":3104},[2403,11028,11029],{"class":10823}," *            }\n",[2403,11031,11032],{"class":2405,"line":3109},[2403,11033,11034],{"class":10823}," * callback - function to run when the user confirms the dialog\n",[2403,11036,11037],{"class":2405,"line":3115},[2403,11038,10942],{"class":10823},[2403,11040,11041,11044,11047],{"class":2405,"line":3121},[2403,11042,11043],{"class":2446},"Dialog.",[2403,11045,11046],{"class":2758},"show",[2403,11048,11049],{"class":2446},"(msg, callback)\n",[19,11051,10956,11052,10962],{},[46,11053,11056],{"href":11054,"rel":11055},"https:\u002F\u002Fflowfuse.github.io\u002Fforge-ui-components\u002F#ff-dialog",[108],"ff-dialog",[19,11058,11059,11060,11062],{},"More complex ",[542,11061,11056],{}," instances, where you can use the component directly, can also be used for forms.",[2796,11064,11065],{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":75,"searchDepth":76,"depth":76,"links":11067},[11068,11069],{"id":10875,"depth":76,"text":10876},{"id":10965,"depth":76,"text":10966},"The frontend contains two helper services that can be called anywhere in the UI. Each of the services control components built into the main Platform.vue.",{},{"title":10621,"description":11070},"handbook\u002Fengineering\u002Ffrontend\u002Fservices","CeOmY8r3MFBRqInuuRtsvzdMIxHXVQ-sqz_4NKdAdtE",{"id":11076,"title":11077,"body":11078,"description":11085,"extension":81,"meta":11602,"navGroup":83,"navOrder":83,"navTitle":83,"navigation":84,"path":10626,"seo":11603,"stem":11604,"__hash__":11605},"handbook\u002Fhandbook\u002Fengineering\u002Ffrontend\u002Ftesting.md","Front-End Testing",{"type":7,"value":11079,"toc":11594},[11080,11083,11086,11108,11111,11114,11117,11121,11139,11143,11146,11149,11167,11170,11192,11195,11201,11362,11370,11373,11405,11412,11415,11419,11433,11436,11440,11454,11457,11461,11464,11468,11474,11478,11481,11509,11517,11532,11539,11543,11550,11563,11566,11591],[10,11081,11077],{"id":11082},"front-end-testing",[19,11084,11085],{},"For our front-end we test on two fronts:",[144,11087,11088,11095],{},[147,11089,11090,11094],{},[46,11091,11093],{"href":11092},"#unit-tests","Unit Tests"," - Focusses on individual functional testing. Each function should be tested in complete isolation",[147,11096,11097,11101,11102,11107],{},[46,11098,11100],{"href":11099},"#e2e-integration-tests","E2E Integration Tests"," - Driven by automated testing framework, ",[46,11103,11106],{"href":11104,"rel":11105},"https:\u002F\u002Fwww.cypress.io\u002F",[108],"Cypress",", this tests our front-end in its entirety, including button clicks, navigations and API calls.",[14,11109,11093],{"id":11110},"unit-tests",[19,11112,11113],{},"Not yet written",[14,11115,11100],{"id":11116},"e2e-integration-tests",[164,11118,11120],{"id":11119},"foreword","Foreword",[19,11122,11123,11130],{},[2562,11124,11125,11126,11129],{},"When running e2e tests locally, the NPM scripts are in the ",[542,11127,11128],{},"flowforge"," package.",[2562,11131,11132,11133,1916,11136,11138],{},"Be sure to ",[542,11134,11135],{},"cd",[542,11137,11128],{}," before attempting to run them",[164,11140,11142],{"id":11141},"running-locally","Running Locally",[19,11144,11145],{},"To run the E2E tests locally, you first need to start a web server that the tests will run against.\nFor testing purposes, a single server is configured with multiple users, teams, and projects.",[19,11147,11148],{},"To start the server, open a terminal and run:",[557,11150,11154],{"className":11151,"code":11152,"language":11153,"meta":75,"style":75},"language-bash shiki shiki-themes github-light github-dark","npm run cy:web-server\n","bash",[542,11155,11156],{"__ignoreMap":75},[2403,11157,11158,11161,11164],{"class":2405,"line":2406},[2403,11159,11160],{"class":2758},"npm",[2403,11162,11163],{"class":2765}," run",[2403,11165,11166],{"class":2765}," cy:web-server\n",[19,11168,11169],{},"This spins up two web servers, each configured differently",[557,11171,11175],{"className":11172,"code":11173,"language":11174,"meta":75,"style":75},"language-shell shiki shiki-themes github-light github-dark","OS Environment running at http:\u002F\u002Flocalhost:3001\nEE Environment running at http:\u002F\u002Flocalhost:3002\nERROR: Failed to verify email connection: Error: connect ECONNREFUSED 127.0.0.1:1025\n","shell",[542,11176,11177,11182,11187],{"__ignoreMap":75},[2403,11178,11179],{"class":2405,"line":2406},[2403,11180,11181],{},"OS Environment running at http:\u002F\u002Flocalhost:3001\n",[2403,11183,11184],{"class":2405,"line":76},[2403,11185,11186],{},"EE Environment running at http:\u002F\u002Flocalhost:3002\n",[2403,11188,11189],{"class":2405,"line":605},[2403,11190,11191],{},"ERROR: Failed to verify email connection: Error: connect ECONNREFUSED 127.0.0.1:1025\n",[19,11193,11194],{},"The email connection failure warning is expected. E2E tests that rely on email functionality will be skipped.",[19,11196,11197,11198,10656],{},"If you need to run tests involving email functionality, you'll have to enable local SMTP servers.\nTo do that, add the following section to your ",[542,11199,11200],{},"etc\u002Fflowforge.local.yml",[557,11202,11206],{"className":11203,"code":11204,"language":11205,"meta":75,"style":75},"language-yml shiki shiki-themes github-light github-dark","...\ne2e:\n  email:\n    os:\n      enabled: true\n      debug: true\n      smtp:\n        host: localhost\n        port: 1025\n        web_port: 8025\n        secure: false\n    ee:\n      enabled: true\n      debug: true\n      smtp:\n        host: localhost\n        port: 1026\n        web_port: 8026\n        secure: false\n...\n","yml",[542,11207,11208,11213,11220,11227,11234,11243,11252,11259,11267,11276,11286,11295,11302,11310,11318,11324,11332,11341,11350,11358],{"__ignoreMap":75},[2403,11209,11210],{"class":2405,"line":2406},[2403,11211,11212],{"class":2758},"...\n",[2403,11214,11215,11218],{"class":2405,"line":76},[2403,11216,11217],{"class":2686},"e2e",[2403,11219,9403],{"class":2446},[2403,11221,11222,11225],{"class":2405,"line":605},[2403,11223,11224],{"class":2686},"  email",[2403,11226,9403],{"class":2446},[2403,11228,11229,11232],{"class":2405,"line":2423},[2403,11230,11231],{"class":2686},"    os",[2403,11233,9403],{"class":2446},[2403,11235,11236,11239,11241],{"class":2405,"line":2465},[2403,11237,11238],{"class":2686},"      enabled",[2403,11240,9411],{"class":2446},[2403,11242,9414],{"class":2709},[2403,11244,11245,11248,11250],{"class":2405,"line":2471},[2403,11246,11247],{"class":2686},"      debug",[2403,11249,9411],{"class":2446},[2403,11251,9414],{"class":2709},[2403,11253,11254,11257],{"class":2405,"line":3086},[2403,11255,11256],{"class":2686},"      smtp",[2403,11258,9403],{"class":2446},[2403,11260,11261,11263,11265],{"class":2405,"line":3092},[2403,11262,9470],{"class":2686},[2403,11264,9411],{"class":2446},[2403,11266,9475],{"class":2765},[2403,11268,11269,11271,11273],{"class":2405,"line":3098},[2403,11270,9480],{"class":2686},[2403,11272,9411],{"class":2446},[2403,11274,11275],{"class":2709},"1025\n",[2403,11277,11278,11281,11283],{"class":2405,"line":3104},[2403,11279,11280],{"class":2686},"        web_port",[2403,11282,9411],{"class":2446},[2403,11284,11285],{"class":2709},"8025\n",[2403,11287,11288,11291,11293],{"class":2405,"line":3109},[2403,11289,11290],{"class":2686},"        secure",[2403,11292,9411],{"class":2446},[2403,11294,9505],{"class":2709},[2403,11296,11297,11300],{"class":2405,"line":3115},[2403,11298,11299],{"class":2686},"    ee",[2403,11301,9403],{"class":2446},[2403,11303,11304,11306,11308],{"class":2405,"line":3121},[2403,11305,11238],{"class":2686},[2403,11307,9411],{"class":2446},[2403,11309,9414],{"class":2709},[2403,11311,11312,11314,11316],{"class":2405,"line":3127},[2403,11313,11247],{"class":2686},[2403,11315,9411],{"class":2446},[2403,11317,9414],{"class":2709},[2403,11319,11320,11322],{"class":2405,"line":3132},[2403,11321,11256],{"class":2686},[2403,11323,9403],{"class":2446},[2403,11325,11326,11328,11330],{"class":2405,"line":3138},[2403,11327,9470],{"class":2686},[2403,11329,9411],{"class":2446},[2403,11331,9475],{"class":2765},[2403,11333,11334,11336,11338],{"class":2405,"line":3143},[2403,11335,9480],{"class":2686},[2403,11337,9411],{"class":2446},[2403,11339,11340],{"class":2709},"1026\n",[2403,11342,11343,11345,11347],{"class":2405,"line":3148},[2403,11344,11280],{"class":2686},[2403,11346,9411],{"class":2446},[2403,11348,11349],{"class":2709},"8026\n",[2403,11351,11352,11354,11356],{"class":2405,"line":3154},[2403,11353,11290],{"class":2686},[2403,11355,9411],{"class":2446},[2403,11357,9505],{"class":2709},[2403,11359,11360],{"class":2405,"line":3160},[2403,11361,11212],{"class":2758},[2672,11363,11364],{},[19,11365,11366,11369],{},[423,11367,11368],{},"Note",": Docker must be installed and running on your system, as the web servers are launched using Docker containers.",[19,11371,11372],{},"On the next start of the web server, you should see log output similar to:",[557,11374,11376],{"className":11172,"code":11375,"language":11174,"meta":75,"style":75},"OS Environment running at http:\u002F\u002Flocalhost:3001\nEE Environment running at http:\u002F\u002Flocalhost:3002\nMailpit: Starting e-mail server...\nMailpit: Web UI available at http:\u002F\u002Flocalhost:8025\u002F with SMTP listening on port 1025\nMailpit: Starting e-mail server...\nMailpit: Web UI available at http:\u002F\u002Flocalhost:8026\u002F with SMTP listening on port 1026\n",[542,11377,11378,11382,11386,11391,11396,11400],{"__ignoreMap":75},[2403,11379,11380],{"class":2405,"line":2406},[2403,11381,11181],{},[2403,11383,11384],{"class":2405,"line":76},[2403,11385,11186],{},[2403,11387,11388],{"class":2405,"line":605},[2403,11389,11390],{},"Mailpit: Starting e-mail server...\n",[2403,11392,11393],{"class":2405,"line":2423},[2403,11394,11395],{},"Mailpit: Web UI available at http:\u002F\u002Flocalhost:8025\u002F with SMTP listening on port 1025\n",[2403,11397,11398],{"class":2405,"line":2465},[2403,11399,11390],{},[2403,11401,11402],{"class":2405,"line":2471},[2403,11403,11404],{},"Mailpit: Web UI available at http:\u002F\u002Flocalhost:8026\u002F with SMTP listening on port 1026\n",[2672,11406,11407],{},[19,11408,11409,11411],{},[423,11410,11368],{},": In CI environments, E2E tests that rely on email functionality are run by default with SMTP servers already configured.",[19,11413,11414],{},"Once this is up and running, you then have two options:",[239,11416,11418],{"id":11417},"run-tests-via-terminal","Run Tests via Terminal",[557,11420,11422],{"className":11151,"code":11421,"language":11153,"meta":75,"style":75},"npm run cy:run\n",[542,11423,11424],{"__ignoreMap":75},[2403,11425,11426,11428,11430],{"class":2405,"line":2406},[2403,11427,11160],{"class":2758},[2403,11429,11163],{"class":2765},[2403,11431,11432],{"class":2765}," cy:run\n",[19,11434,11435],{},"This will execute all of the front-end E2E tests in the terminal and display the results.\nTypically, this is the command to run if you simply want to run all of the tests\nWhen developing\u002Fdebugging tests, opening the Cypress Application will likely be more useful.",[239,11437,11439],{"id":11438},"run-tests-via-cypress-application","Run Tests via Cypress Application",[557,11441,11443],{"className":11151,"code":11442,"language":11153,"meta":75,"style":75},"npm run cy:open\n",[542,11444,11445],{"__ignoreMap":75},[2403,11446,11447,11449,11451],{"class":2405,"line":2406},[2403,11448,11160],{"class":2758},[2403,11450,11163],{"class":2765},[2403,11452,11453],{"class":2765}," cy:open\n",[19,11455,11456],{},"Opens the Cypress application. From here, you can run individual test files, and see the framework clicking through the UI as the tests are run. If you're developing or debugging your own tests, we recommend this.",[164,11458,11460],{"id":11459},"hints-tips","Hints & Tips",[19,11462,11463],{},"If you're looking to write your own Cypress tests, then here are some tips that can help you get started:",[239,11465,11467],{"id":11466},"beforeeach","beforeEach",[19,11469,11470,11471,11473],{},"If you explore some of the existing tests, you'll see that ",[542,11472,11467],{}," is a very useful way of ensuring consistent behaviour across a group of tests, e.g. starting from the same point, or making sure a user is logged in.",[239,11475,11477],{"id":11476},"helper-functions","Helper Functions",[19,11479,11480],{},"To make Cypress testing easier, we have created a collection of helper functions that can be called within any loop of the testing framework.",[557,11482,11484],{"className":2746,"code":11483,"language":2748,"meta":75,"style":75},"cy.login(\u003Cusername>, \u003Cpassword>)\n",[542,11485,11486],{"__ignoreMap":75},[2403,11487,11488,11491,11494,11497,11500,11503,11506],{"class":2405,"line":2406},[2403,11489,11490],{"class":2446},"cy.",[2403,11492,11493],{"class":2758},"login",[2403,11495,11496],{"class":2446},"(\u003C",[2403,11498,11499],{"class":2686},"username",[2403,11501,11502],{"class":2446},">, \u003C",[2403,11504,11505],{"class":2686},"password",[2403,11507,11508],{"class":2446},">)\n",[19,11510,11511,11512,549],{},"This will log you into FlowFuse as the given user. The test users are defined in the ",[46,11513,11516],{"href":11514,"rel":11515},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fflowfuse\u002Fblob\u002Fmain\u002Ftest\u002Fe2e\u002Ffrontend\u002Fenvironments\u002Fstandard.js",[108],"test environment",[557,11518,11520],{"className":2746,"code":11519,"language":2748,"meta":75,"style":75},"cy.home()\n",[542,11521,11522],{"__ignoreMap":75},[2403,11523,11524,11526,11529],{"class":2405,"line":2406},[2403,11525,11490],{"class":2446},[2403,11527,11528],{"class":2758},"home",[2403,11530,11531],{"class":2446},"()\n",[19,11533,11534,11535,11538],{},"This will navigate the test to the homepage of the application, but more importantly it contains several ",[542,11536,11537],{},"cy.wait()"," calls to make sure the relevant API calls have completed before continuing.\nIt is recommended that you call this for every test that requires a login.",[239,11540,11542],{"id":11541},"selecting-elements-actions","Selecting Elements & Actions",[19,11544,10365,11545,10371,11548,10375],{},[46,11546,10370],{"href":10368,"rel":11547},[108],[542,11549,10374],{},[19,11551,10378,11552,11555,11556,11559,11560,11562],{},[46,11553,10383],{"href":10381,"rel":11554},[108]," which we also use. As such, we have defined ",[46,11557,11558],{"href":10595},"our own best practice"," set of ",[542,11561,10374],{}," attributes to use.",[19,11564,11565],{},"When writing your own tests, where possible, you should do element selection via these custom data tags, e.g.,",[557,11567,11569],{"className":2746,"code":11568,"language":2748,"meta":75,"style":75},"cy.get('a[data-nav=\"team-members\"]').click()\n",[542,11570,11571],{"__ignoreMap":75},[2403,11572,11573,11575,11578,11580,11583,11586,11589],{"class":2405,"line":2406},[2403,11574,11490],{"class":2446},[2403,11576,11577],{"class":2758},"get",[2403,11579,2762],{"class":2446},[2403,11581,11582],{"class":2765},"'a[data-nav=\"team-members\"]'",[2403,11584,11585],{"class":2446},").",[2403,11587,11588],{"class":2758},"click",[2403,11590,11531],{"class":2446},[2796,11592,11593],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":75,"searchDepth":76,"depth":76,"links":11595},[11596,11597],{"id":11110,"depth":76,"text":11093},{"id":11116,"depth":76,"text":11100,"children":11598},[11599,11600,11601],{"id":11119,"depth":605,"text":11120},{"id":11141,"depth":605,"text":11142},{"id":11459,"depth":605,"text":11460},{},{"title":11077,"description":11085},"handbook\u002Fengineering\u002Ffrontend\u002Ftesting","Fdr0Aui7V4R7XWiWBbeTFy-yrrg7Hw-6hlLHqYlddLY",{"id":11607,"title":11608,"body":11609,"description":11616,"extension":81,"meta":11820,"navGroup":8856,"navOrder":83,"navTitle":11608,"navigation":84,"path":11821,"seo":11822,"stem":11823,"__hash__":11824},"handbook\u002Fhandbook\u002Fengineering\u002Findex.md","Engineering",{"type":7,"value":11610,"toc":11811},[11611,11614,11617,11620,11637,11641,11644,11673,11677,11714,11718,11727,11731,11734,11745,11747,11749,11763,11766,11769,11795,11797,11799],[10,11612,11608],{"id":11613},"engineering",[19,11615,11616],{},"The Engineering department combines product management and software development\nto build and maintain FlowFuse's product and infrastructure.",[19,11618,11619],{},"This includes, but is not limited to:",[144,11621,11622,11625,11628,11631,11634],{},[147,11623,11624],{},"Defining and prioritizing product requirements based on user and customer needs",[147,11626,11627],{},"Developing new product features in accordance with the product strategy",[147,11629,11630],{},"Providing technical input into the planning process - assisting with\nscoping of items, technical prioritization and sizing",[147,11632,11633],{},"Providing technical support to our customers and community members",[147,11635,11636],{},"Ensuring the ongoing operations of FlowFuse Cloud",[14,11638,11640],{"id":11639},"product","Product",[19,11642,11643],{},"The product function defines what we build and why.",[144,11645,11646,11653,11659,11666],{},[147,11647,11648,11652],{},[46,11649,11651],{"href":11650},"\u002Fhandbook\u002Fengineering\u002Fproduct","Product Overview"," - how product management works",[147,11654,11655,11658],{},[46,11656,6717],{"href":11657},"\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fstrategy"," - where the product is headed",[147,11660,11661,11665],{},[46,11662,11664],{"href":11663},"\u002Fhandbook\u002Fengineering\u002Fproduct\u002Ffeedback","Feedback"," - how we collect and process feedback",[147,11667,11668,11672],{},[46,11669,11671],{"href":11670},"\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fpricing","Pricing Principles"," - how we decide feature tiers",[14,11674,11676],{"id":11675},"general","General",[144,11678,11679,11684,11691,11696,11701,11708],{},[147,11680,11681],{},[46,11682,11683],{"href":5194},"Security Policy",[147,11685,11686,11690],{},[46,11687,11689],{"href":11688},"\u002Fhandbook\u002Fengineering\u002Fpackaging","Packaging"," - how we manage repos and npm packaging",[147,11692,11693,11695],{},[46,11694,9520],{"href":10015}," - tips & details on how to set up a local development environment.",[147,11697,11698,11700],{},[46,11699,10149],{"href":10351}," - how we triage Dependabot PRs each week",[147,11702,11703,11707],{},[46,11704,11706],{"href":11705},"\u002Fhandbook\u002Fengineering\u002Fproject-management","Project Management"," - details the processes we use to guide product development.",[147,11709,11710,11713],{},[46,11711,8804],{"href":11712},"\u002Fhandbook\u002Fengineering\u002Ftools"," - the tools we use",[14,11715,11717],{"id":11716},"releases","Releases",[144,11719,11720],{},[147,11721,11722,11726],{},[46,11723,11725],{"href":11724},"\u002Fhandbook\u002Fengineering\u002Freleases\u002Fprocess","Release Process"," - how we ship",[14,11728,11730],{"id":11729},"contributing-development-environment","Contributing - Development Environment",[19,11732,11733],{},"These pages help you setup additional infrastructure for local development.",[144,11735,11736,11741],{},[147,11737,11738,11740],{},[46,11739,10142],{"href":10143}," - Setting up local development environment",[147,11742,11743,11740],{},[46,11744,9513],{"href":9514},[14,11746,10601],{"id":10606},[19,11748,10609],{},[144,11750,11751,11755,11759],{},[147,11752,11753],{},[46,11754,10357],{"href":10595},[147,11756,11757],{},[46,11758,10621],{"href":10620},[147,11760,11761],{},[46,11762,10627],{"href":10626},[14,11764,11765],{"id":67},"Operations",[19,11767,11768],{},"How we run and manage our FlowFuse Cloud platform",[144,11770,11771,11777,11783,11789],{},[147,11772,11773],{},[46,11774,11776],{"href":11775},"\u002Fhandbook\u002Fengineering\u002Fops\u002Fproduction","Production Environment",[147,11778,11779],{},[46,11780,11782],{"href":11781},"\u002Fhandbook\u002Fengineering\u002Fops\u002Fstaging","Staging Environment",[147,11784,11785],{},[46,11786,11788],{"href":11787},"\u002Fhandbook\u002Fengineering\u002Fops\u002Fobservability","Observability",[147,11790,11791],{},[46,11792,11794],{"href":11793},"\u002Fhandbook\u002Fengineering\u002Fops\u002Fincident-response","Incident Response",[14,11796,2329],{"id":2334},[19,11798,2337],{},[144,11800,11801,11806],{},[147,11802,11803,2345],{},[46,11804,2344],{"href":11805},"\u002Fhandbook\u002Fcompany\u002Fguides\u002Fgit\u002F",[147,11807,11808,2352],{},[46,11809,2351],{"href":11810},"\u002Fhandbook\u002Fcompany\u002Fguides\u002Fmarkdown\u002F",{"title":75,"searchDepth":76,"depth":76,"links":11812},[11813,11814,11815,11816,11817,11818,11819],{"id":11639,"depth":76,"text":11640},{"id":11675,"depth":76,"text":11676},{"id":11716,"depth":76,"text":11717},{"id":11729,"depth":76,"text":11730},{"id":10606,"depth":76,"text":10601},{"id":67,"depth":76,"text":11765},{"id":2334,"depth":76,"text":2329},{},"\u002Fhandbook\u002Fengineering",{"title":11608,"description":11616},"handbook\u002Fengineering\u002Findex","O9S4afN-hJFfhhkQQ59qVwNbYR1Fn0gIXGI1HycnVKE",{"id":11826,"title":11827,"body":11828,"description":11835,"extension":81,"meta":11993,"navGroup":83,"navOrder":83,"navTitle":11827,"navigation":84,"path":11994,"seo":11995,"stem":11996,"__hash__":11997},"handbook\u002Fhandbook\u002Fengineering\u002Fops\u002Fdedicated.md","FlowFuse Dedicated",{"type":7,"value":11829,"toc":11987},[11830,11833,11836,11839,11843,11846,11916,11920,11923,11926,11952,11956,11959,11966,11970,11973,11977,11980,11984],[10,11831,11827],{"id":11832},"flowfuse-dedicated",[19,11834,11835],{},"FlowFuse Dedicated is our product offering where we will host a dedicated instance\nof the platform for a customer.",[19,11837,11838],{},"This is a guide for the setup and delivery of a dedicated instance.",[164,11840,11842],{"id":11841},"pre-deployment","Pre-deployment",[19,11844,11845],{},"In order to create the dedicated instance, some information will be required from the customer.",[144,11847,11848,11888,11898,11904,11910],{},[147,11849,11850,11853,11854],{},[423,11851,11852],{},"A domain name or sub domain name to host the platform on",".\n",[144,11855,11856,11862,11873,11882,11885],{},[147,11857,11858,11859,549],{},"By default, we will offer to host the platform under a domain of ",[542,11860,11861],{},"\u003Ccustomer>.flowfuse.io",[147,11863,11864,11865,11868,11869,11872],{},"The core platform (",[542,11866,11867],{},"app.","), broker (",[542,11870,11871],{},"mqtt.",") and hosted instances will be made available under this domain.",[147,11874,11875,11876,11878,11879],{},"The base domain, ",[542,11877,11861],{},", will redirect to ",[542,11880,11881],{},"app.\u003Ccustomer>.flowfuse.io",[147,11883,11884],{},"All traffic to the domain will be on port 443 - including the Device Agent MQTT connection",[147,11886,11887],{},"If the customer requests to use their own (sub-)domain, they will need to set up their DNS to point\nat the AWS Route53 end-point once it has been created.",[147,11889,11890,11893,11894,11897],{},[423,11891,11892],{},"Choice of AWS region",". We default to ",[542,11895,11896],{},"eu-west-1"," but customers may want to choose one more\nlocal to them. Not all AWS regions are equal and we may need to review their choice for suitability.",[147,11899,11900,11903],{},[423,11901,11902],{},"Capacity planning",". Whilst the platform will scale to meet demand, we want to sure we provision\nit at a suitable level for their intended usage. Understanding their planned usage and growth rate\nwill help us pick the right node size for the cluster.",[147,11905,11906,11909],{},[423,11907,11908],{},"Team\u002FInstance types",". We will default to creating equivalent Team and Instance types as\nwe use on FFCloud. If a customer has specific needs in this area, this should be identified prior\nto deployment.",[147,11911,11912,11915],{},[423,11913,11914],{},"SSO Configuration",". As with FFCloud, if the customer plans to integrate with their SSO provider,\nwe will need to capture the necessary information. This can be done after the initial deployment.",[164,11917,11919],{"id":11918},"deployment","Deployment",[19,11921,11922],{},"An issue should be raised in the CloudProject repository using the Dedicated Checklist template\nand assigned to the member of the engineering\u002Fops team who will do the setup.",[19,11924,11925],{},"This checklist covers the follow items:",[504,11927,11928,11931,11934,11937,11940,11943,11946,11949],{},[147,11929,11930],{},"Create a new AWS sub-account for each dedicated env.",[147,11932,11933],{},"Create user accounts for the ops team",[147,11935,11936],{},"Use Terraform to set up initial cluster",[147,11938,11939],{},"Setup grafana monitoring - including all the necessary alerting",[147,11941,11942],{},"Setup initial admin account - store details in 1Password",[147,11944,11945],{},"Setup initial Stacks, Instance Types and Team Types",[147,11947,11948],{},"Setup SSO for customer",[147,11950,11951],{},"Create initial account for customer admin user (if we’re giving them admin access)",[164,11953,11955],{"id":11954},"migration","Migration",[19,11957,11958],{},"For existing customers of FFCloud who are choosing to move to a FFDedicated environment,\nwe need to consider how to migrate their existing account. This will need to be considered\non a case-by-case basis in discussion with the customer as there are a number of challenges\naround providing a seamless migration.",[19,11960,11961,11962,11965],{},"For example, we cannot migrate access tokens between platforms. This will require devices\nto be reprovisioned with new credentials as well as have their ",[542,11963,11964],{},"device.yml"," updated to point\nto the new platform URL.",[164,11967,11969],{"id":11968},"maintenance","Maintenance",[19,11971,11972],{},"We will agree a maintenance policy with the customer to fit their needs. We will require\nthe code to be kept up to date - the question is how we schedule updates.",[239,11974,11976],{"id":11975},"flowfuse-code-updates","FlowFuse Code Updates",[19,11978,11979],{},"We can either do CI\u002FCD as we do for FF Cloud, or apply updates following each monthly release.",[239,11981,11983],{"id":11982},"k8s-updates","k8s Updates",[19,11985,11986],{},"We will coordinate maintenance windows with the customer for when we need to apply\nupdates to the underlying k8s infrastructure as this will require restarts of their\nNode-RED instances.",{"title":75,"searchDepth":76,"depth":76,"links":11988},[11989,11990,11991,11992],{"id":11841,"depth":605,"text":11842},{"id":11918,"depth":605,"text":11919},{"id":11954,"depth":605,"text":11955},{"id":11968,"depth":605,"text":11969},{},"\u002Fhandbook\u002Fengineering\u002Fops\u002Fdedicated",{"title":11827,"description":11835},"handbook\u002Fengineering\u002Fops\u002Fdedicated","KE_86tzXmEWHUMFuGoxu0Jk6YRojSVQ7lkliUq2nkec",{"id":11999,"title":12000,"body":12001,"description":12008,"extension":81,"meta":12391,"navGroup":83,"navOrder":83,"navTitle":11919,"navigation":84,"path":12392,"seo":12393,"stem":12394,"__hash__":12395},"handbook\u002Fhandbook\u002Fengineering\u002Fops\u002Fdeployment.md","Dependencies within the CI\u002FCD process",{"type":7,"value":12002,"toc":12388},[12003,12006,12009,12099,12103,12122,12141,12144,12385],[10,12004,12000],{"id":12005},"dependencies-within-the-cicd-process",[19,12007,12008],{},"This paragraph shows a graphical presentation of dependencies between each build pipeline in our CI\u002FCD process.",[557,12010,12012],{"className":3049,"code":12011,"language":3051,"meta":75,"style":75},"graph TB\n    A[NR-File-Nodes package] & C[NR-Project-Nodes package] --> B[NR-launcher package]\n    B ----> X[Node-RED container build]\n    B --> D[LocalFS package]\n    D --> E[FlowFuse package]\n    E & F[K8s package] --> Y[Flowfuse container build]\n    G[File-server package] -----> Z[File-server container build]\n    click A href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fnr-file-nodes\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fpublish.yml\" \"NR-File-Nodes package\" _blank\n    click B href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fnr-launcher\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fpublish.yml\" \"NR-launcher package\" _blank\n    click C href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fnr-project-nodes\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fpublish.yml\" _blank\n    click D href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fdriver-localfs\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fpublish.yml\" _blank\n    click E href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fflowfuse\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fpublish.yml\" _blank\n    click F href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fdriver-k8s\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fpublish.yml\" _blank\n    click G href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Ffile-server\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fpublish.yml\" _blank\n    click X href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fhelm\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fnodered-container.yml\" _blank\n    click Y href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fhelm\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fflowforge-container.yml\" _blank\n    click Z href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fhelm\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Ffileserver-container.yml\" _blank\n",[542,12013,12014,12019,12024,12029,12034,12039,12044,12049,12054,12059,12064,12069,12074,12079,12084,12089,12094],{"__ignoreMap":75},[2403,12015,12016],{"class":2405,"line":2406},[2403,12017,12018],{},"graph TB\n",[2403,12020,12021],{"class":2405,"line":76},[2403,12022,12023],{},"    A[NR-File-Nodes package] & C[NR-Project-Nodes package] --> B[NR-launcher package]\n",[2403,12025,12026],{"class":2405,"line":605},[2403,12027,12028],{},"    B ----> X[Node-RED container build]\n",[2403,12030,12031],{"class":2405,"line":2423},[2403,12032,12033],{},"    B --> D[LocalFS package]\n",[2403,12035,12036],{"class":2405,"line":2465},[2403,12037,12038],{},"    D --> E[FlowFuse package]\n",[2403,12040,12041],{"class":2405,"line":2471},[2403,12042,12043],{},"    E & F[K8s package] --> Y[Flowfuse container build]\n",[2403,12045,12046],{"class":2405,"line":3086},[2403,12047,12048],{},"    G[File-server package] -----> Z[File-server container build]\n",[2403,12050,12051],{"class":2405,"line":3092},[2403,12052,12053],{},"    click A href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fnr-file-nodes\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fpublish.yml\" \"NR-File-Nodes package\" _blank\n",[2403,12055,12056],{"class":2405,"line":3098},[2403,12057,12058],{},"    click B href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fnr-launcher\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fpublish.yml\" \"NR-launcher package\" _blank\n",[2403,12060,12061],{"class":2405,"line":3104},[2403,12062,12063],{},"    click C href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fnr-project-nodes\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fpublish.yml\" _blank\n",[2403,12065,12066],{"class":2405,"line":3109},[2403,12067,12068],{},"    click D href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fdriver-localfs\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fpublish.yml\" _blank\n",[2403,12070,12071],{"class":2405,"line":3115},[2403,12072,12073],{},"    click E href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fflowfuse\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fpublish.yml\" _blank\n",[2403,12075,12076],{"class":2405,"line":3121},[2403,12077,12078],{},"    click F href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fdriver-k8s\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fpublish.yml\" _blank\n",[2403,12080,12081],{"class":2405,"line":3127},[2403,12082,12083],{},"    click G href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Ffile-server\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fpublish.yml\" _blank\n",[2403,12085,12086],{"class":2405,"line":3132},[2403,12087,12088],{},"    click X href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fhelm\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fnodered-container.yml\" _blank\n",[2403,12090,12091],{"class":2405,"line":3138},[2403,12092,12093],{},"    click Y href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fhelm\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fflowforge-container.yml\" _blank\n",[2403,12095,12096],{"class":2405,"line":3143},[2403,12097,12098],{},"    click Z href \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fhelm\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Ffileserver-container.yml\" _blank\n",[14,12100,12102],{"id":12101},"how-does-it-work","How does it work?",[19,12104,12105,12106,12108,12109,12112,12113,12116,12117,549],{},"The CI\u002FCD process is executed by GitHub Actions.\nEach change pushed to the repositories ",[542,12107,1575],{}," branch initiates the process.\nNode package publish process is defined in the file ",[542,12110,12111],{},".github\u002Fworkflows\u002Fpublish.yml"," in each repository while container images build steps can be found in ",[542,12114,12115],{},".github\u002Fworkflows\u002F*-containers.yml"," files in ",[46,12118,12121],{"href":12119,"rel":12120},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fhelm\u002Ftree\u002Fmain\u002F.github\u002Fworkflows",[108],"helm repository",[19,12123,12124,12125,12130,12131,12136,12137,12140],{},"Each package has its dedicated code repository. Due to the security limitations of GitHub Actions, there is no possibility to access the pipeline from one repository to another.\nTherefore, there is a need to use a dedicated ",[46,12126,12129],{"href":12127,"rel":12128},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fapps\u002Foverview",[108],"GitHub App"," to access repositories and trigger the build process of the dependent package. The process of creating such GitHub App is described in the ",[46,12132,12135],{"href":12133,"rel":12134},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fdevelopers\u002Fapps\u002Fcreating-a-github-app",[108],"GitHub documentation",".\nBecause such GitHub App imitates a regular user, it is necessary to include ",[542,12138,12139],{},"workflow_dispatch"," event in the dependent workflow definition.",[19,12142,12143],{},"Example of job responsible for triggering dependent pipeline:",[557,12145,12147],{"className":9391,"code":12146,"language":9393,"meta":75,"style":75},"  dispatch_container_build:\n    runs-on: ubuntu-latest\n    steps:\n        # This step uses GitHub App to generate a token \n        # which is used to trigger dependent pipeline\n      - name: Generate a token\n        # ID of the step to reference it in the next one\n        id: generate_token                                        \n        # Name of the action\n        uses: tibdex\u002Fgithub-app-token@v1\n        with:\n          # GitHub App ID\n          app_id: ${{ secrets.GH_BOT_APP_ID }}\n          # GitHub App private key\n          private_key: ${{ secrets.GH_BOT_APP_KEY }}\n\n        # This step triggers dependent pipeline located in \n        # the `helm` repository and defined in the \n        # `flowforge-container.yml` file\n      - name: Trigger flowforge container build\n        # Name of the action\n        uses: benc-uk\u002Fworkflow-dispatch@v1\n        with:\n          # Name of the workflow to trigger\n          workflow: flowforge-container.yml\n          # Name of the repository where \n          # the dependent workflow is located\n          repo: flowfuse\u002Fhelm\n          # Branch name\n          ref: main\n          # Token generated in the previous step                                                 \n          token: ${{ steps.generate_token.outputs.token }}\n",[542,12148,12149,12156,12166,12173,12178,12183,12196,12201,12214,12219,12229,12236,12241,12251,12256,12266,12270,12275,12280,12285,12296,12300,12309,12315,12320,12330,12335,12340,12351,12357,12368,12374],{"__ignoreMap":75},[2403,12150,12151,12154],{"class":2405,"line":2406},[2403,12152,12153],{"class":2686},"  dispatch_container_build",[2403,12155,9403],{"class":2446},[2403,12157,12158,12161,12163],{"class":2405,"line":76},[2403,12159,12160],{"class":2686},"    runs-on",[2403,12162,9411],{"class":2446},[2403,12164,12165],{"class":2765},"ubuntu-latest\n",[2403,12167,12168,12171],{"class":2405,"line":605},[2403,12169,12170],{"class":2686},"    steps",[2403,12172,9403],{"class":2446},[2403,12174,12175],{"class":2405,"line":2423},[2403,12176,12177],{"class":10823},"        # This step uses GitHub App to generate a token \n",[2403,12179,12180],{"class":2405,"line":2465},[2403,12181,12182],{"class":10823},"        # which is used to trigger dependent pipeline\n",[2403,12184,12185,12188,12191,12193],{"class":2405,"line":2471},[2403,12186,12187],{"class":2446},"      - ",[2403,12189,12190],{"class":2686},"name",[2403,12192,9411],{"class":2446},[2403,12194,12195],{"class":2765},"Generate a token\n",[2403,12197,12198],{"class":2405,"line":3086},[2403,12199,12200],{"class":10823},"        # ID of the step to reference it in the next one\n",[2403,12202,12203,12206,12208,12211],{"class":2405,"line":3092},[2403,12204,12205],{"class":2686},"        id",[2403,12207,9411],{"class":2446},[2403,12209,12210],{"class":2765},"generate_token",[2403,12212,12213],{"class":2446},"                                        \n",[2403,12215,12216],{"class":2405,"line":3098},[2403,12217,12218],{"class":10823},"        # Name of the action\n",[2403,12220,12221,12224,12226],{"class":2405,"line":3104},[2403,12222,12223],{"class":2686},"        uses",[2403,12225,9411],{"class":2446},[2403,12227,12228],{"class":2765},"tibdex\u002Fgithub-app-token@v1\n",[2403,12230,12231,12234],{"class":2405,"line":3109},[2403,12232,12233],{"class":2686},"        with",[2403,12235,9403],{"class":2446},[2403,12237,12238],{"class":2405,"line":3115},[2403,12239,12240],{"class":10823},"          # GitHub App ID\n",[2403,12242,12243,12246,12248],{"class":2405,"line":3121},[2403,12244,12245],{"class":2686},"          app_id",[2403,12247,9411],{"class":2446},[2403,12249,12250],{"class":2765},"${{ secrets.GH_BOT_APP_ID }}\n",[2403,12252,12253],{"class":2405,"line":3127},[2403,12254,12255],{"class":10823},"          # GitHub App private key\n",[2403,12257,12258,12261,12263],{"class":2405,"line":3132},[2403,12259,12260],{"class":2686},"          private_key",[2403,12262,9411],{"class":2446},[2403,12264,12265],{"class":2765},"${{ secrets.GH_BOT_APP_KEY }}\n",[2403,12267,12268],{"class":2405,"line":3138},[2403,12269,2462],{"emptyLinePlaceholder":84},[2403,12271,12272],{"class":2405,"line":3143},[2403,12273,12274],{"class":10823},"        # This step triggers dependent pipeline located in \n",[2403,12276,12277],{"class":2405,"line":3148},[2403,12278,12279],{"class":10823},"        # the `helm` repository and defined in the \n",[2403,12281,12282],{"class":2405,"line":3154},[2403,12283,12284],{"class":10823},"        # `flowforge-container.yml` file\n",[2403,12286,12287,12289,12291,12293],{"class":2405,"line":3160},[2403,12288,12187],{"class":2446},[2403,12290,12190],{"class":2686},[2403,12292,9411],{"class":2446},[2403,12294,12295],{"class":2765},"Trigger flowforge container build\n",[2403,12297,12298],{"class":2405,"line":3166},[2403,12299,12218],{"class":10823},[2403,12301,12302,12304,12306],{"class":2405,"line":3172},[2403,12303,12223],{"class":2686},[2403,12305,9411],{"class":2446},[2403,12307,12308],{"class":2765},"benc-uk\u002Fworkflow-dispatch@v1\n",[2403,12310,12311,12313],{"class":2405,"line":3177},[2403,12312,12233],{"class":2686},[2403,12314,9403],{"class":2446},[2403,12316,12317],{"class":2405,"line":3183},[2403,12318,12319],{"class":10823},"          # Name of the workflow to trigger\n",[2403,12321,12322,12325,12327],{"class":2405,"line":3189},[2403,12323,12324],{"class":2686},"          workflow",[2403,12326,9411],{"class":2446},[2403,12328,12329],{"class":2765},"flowforge-container.yml\n",[2403,12331,12332],{"class":2405,"line":3195},[2403,12333,12334],{"class":10823},"          # Name of the repository where \n",[2403,12336,12337],{"class":2405,"line":3201},[2403,12338,12339],{"class":10823},"          # the dependent workflow is located\n",[2403,12341,12343,12346,12348],{"class":2405,"line":12342},28,[2403,12344,12345],{"class":2686},"          repo",[2403,12347,9411],{"class":2446},[2403,12349,12350],{"class":2765},"flowfuse\u002Fhelm\n",[2403,12352,12354],{"class":2405,"line":12353},29,[2403,12355,12356],{"class":10823},"          # Branch name\n",[2403,12358,12360,12363,12365],{"class":2405,"line":12359},30,[2403,12361,12362],{"class":2686},"          ref",[2403,12364,9411],{"class":2446},[2403,12366,12367],{"class":2765},"main\n",[2403,12369,12371],{"class":2405,"line":12370},31,[2403,12372,12373],{"class":10823},"          # Token generated in the previous step                                                 \n",[2403,12375,12377,12380,12382],{"class":2405,"line":12376},32,[2403,12378,12379],{"class":2686},"          token",[2403,12381,9411],{"class":2446},[2403,12383,12384],{"class":2765},"${{ steps.generate_token.outputs.token }}\n",[2796,12386,12387],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":75,"searchDepth":76,"depth":76,"links":12389},[12390],{"id":12101,"depth":76,"text":12102},{},"\u002Fhandbook\u002Fengineering\u002Fops\u002Fdeployment",{"title":12000,"description":12008},"handbook\u002Fengineering\u002Fops\u002Fdeployment","t7HCcOd26BI_lNuo9QvoS4GznUOLO_pEDMLFaWDIX9k",{"id":12397,"title":11794,"body":12398,"description":12405,"extension":81,"meta":12474,"navGroup":83,"navOrder":83,"navTitle":11794,"navigation":84,"path":11793,"seo":12475,"stem":12476,"__hash__":12477},"handbook\u002Fhandbook\u002Fengineering\u002Fops\u002Fincident-response.md",{"type":7,"value":12399,"toc":12469},[12400,12403,12406,12409,12415,12417,12424,12427,12430,12434,12442,12445,12456,12459,12463,12466],[10,12401,11794],{"id":12402},"incident-response",[19,12404,12405],{},"When an issue is identified that impacts the availability of any part of the production platform,\nit is vital we are able to respond effectively, resolve the issue and ensure lessons are learnt\nto prevent it happening again.",[19,12407,12408],{},"This page outlines how we should handle these situations.",[19,12410,12411,12412,549],{},"Any incident involving information security or data privacy must follow our\n",[46,12413,12414],{"href":5488},"Information Security Incident Response policy",[14,12416,623],{"id":628},[19,12418,12419,12420,12423],{},"Once an incident has been identified, a thread should be started in ",[542,12421,12422],{},"#dept-engineering"," in slack\nand a huddle started.",[19,12425,12426],{},"The purpose of the huddle is to ensure clear communication between individuals working on the incident\nand to co-ordinate any actions taken.",[19,12428,12429],{},"The slack thread should be used to document findings and actions taken.",[14,12431,12433],{"id":12432},"root-cause-analysis","Root Cause Analysis",[19,12435,12436,12437,549],{},"Once the incident has been resolved such that customers are no longer impacted,\nthe CTO, or nominated individual, will raise an ",[46,12438,12441],{"href":12439,"rel":12440},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002FCloudProject\u002Fissues\u002Fnew\u002Fchoose",[108],"Incident issue on the CloudProject repo",[19,12443,12444],{},"This contains three sections:",[144,12446,12447,12450,12453],{},[147,12448,12449],{},"Timeline - reconstructed from the slack thread, this should provide a timeline of events from\ninitial detection of the incident, to the point it has been resolved.",[147,12451,12452],{},"RCA - the root cause analysis should provide more details on what caused the incident. This\nshould include any appropriate technical details, along with how it was resolved.",[147,12454,12455],{},"Actions - part of the RCA is to identify any follow-up actions that need to be completed",[19,12457,12458],{},"The issue should remain open until all actions are complete.",[14,12460,12462],{"id":12461},"public-blog-post","Public Blog Post",[19,12464,12465],{},"Depending on the nature of the incident, we may choose to publish a blog post with details\nfor our customers. This should be our default response, however we may decide some incidents\nare sufficiently localised to not warrant a full write-up.",[19,12467,12468],{},"The blog post should explain the incident in an accessible way - we want to be open with\nour customers. This should include links to any relevant follow-up actions to demonstrate\nwhat we learnt from the incident and how we will improve the platform in response.",{"title":75,"searchDepth":76,"depth":76,"links":12470},[12471,12472,12473],{"id":628,"depth":76,"text":623},{"id":12432,"depth":76,"text":12433},{"id":12461,"depth":76,"text":12462},{},{"title":11794,"description":12405},"handbook\u002Fengineering\u002Fops\u002Fincident-response","LiZ16jDY9rTyPY7UdXyTiIyiD11s5A6DUPDk1Eagq84",{"id":12479,"title":12480,"body":12481,"description":75,"extension":81,"meta":12630,"navGroup":83,"navOrder":83,"navTitle":12480,"navigation":84,"path":12631,"seo":12632,"stem":12633,"__hash__":12634},"handbook\u002Fhandbook\u002Fengineering\u002Fops\u002Findex.md","Platform Ops",{"type":7,"value":12482,"toc":12627},[12483,12486,12524,12528,12540,12599,12602],[10,12484,12480],{"id":12485},"platform-ops",[144,12487,12488,12492,12496,12500,12504,12508,12512,12518],{},[147,12489,12490],{},[46,12491,11788],{"href":11787},[147,12493,12494],{},[46,12495,11782],{"href":11781},[147,12497,12498],{},[46,12499,11776],{"href":11775},[147,12501,12502],{},[46,12503,11919],{"href":12392},[147,12505,12506],{},[46,12507,11794],{"href":11793},[147,12509,12510],{},[46,12511,11827],{"href":11994},[147,12513,12514],{},[46,12515,12517],{"href":12516},"\u002Fhandbook\u002Fengineering\u002Fops\u002Fproduction-stack-update","Updating Stacks",[147,12519,12520],{},[46,12521,12523],{"href":12522},"\u002Fhandbook\u002Fengineering\u002Fops\u002Fself-hosted-assistant","Self Hosted Assistant",[14,12525,12527],{"id":12526},"cicd","CI\u002FCD",[19,12529,12530,12531,12536,12537,12539],{},"As part of our CI\u002FCD pipeline in our ",[46,12532,12535],{"href":12533,"rel":12534},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fflowfuse\u002F",[108],"@flowfuse\u002Fflowfuse"," repository, we perform the following actions when code is merged to the ",[542,12538,1575],{}," branch:",[504,12541,12542,12550,12567,12577,12585,12596],{},[147,12543,12544,12545],{},"Several backend and UI tests are executed against the code by ",[46,12546,12549],{"href":12547,"rel":12548},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fflowfuse\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Ftests.yml",[108],"this pipeline",[147,12551,12552,12553,12558,12559,12562,12563,549],{},"Once all tests complete with success, ",[46,12554,12557],{"href":12555,"rel":12556},"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@flowfuse\u002Fflowfuse",[108],"FlowFuse npm package"," is built and published to the npm registry with a ",[542,12560,12561],{},"nightly"," tag by ",[46,12564,12549],{"href":12565,"rel":12566},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fflowfuse\u002Factions\u002Fworkflows\u002Fpublish.yml",[108],[147,12568,12569,12558,12572,12562,12574,549],{},[46,12570,12557],{"href":12555,"rel":12571},[108],[542,12573,12561],{},[46,12575,12549],{"href":12565,"rel":12576},[108],[147,12578,12579,12580],{},"The same pipeline triggers another action, responsible for ",[46,12581,12584],{"href":12582,"rel":12583},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fhelm\u002Factions\u002Fworkflows\u002Fflowforge-container.yml",[108],"building a container image",[147,12586,12587,12588,12592,12593,12595],{},"Container image build pipeline uses ",[46,12589,12591],{"href":12555,"rel":12590},[108],"flowfuse npm package"," created in step 1 (tagged as ",[542,12594,12561],{},") to build a fresh container image",[147,12597,12598],{},"The resulting image is used to perform deployment on both staging and production environments.",[19,12600,12601],{},"You can read more about our various environments here:",[144,12603,12604,12612,12621],{},[147,12605,12606,12611],{},[46,12607,12610],{"href":12608,"rel":12609},"https:\u002F\u002Fflowfuse.com\u002Fhandbook\u002Fengineering\u002Fcontributing\u002F#test-changes-in-staging",[108],"Pre Staging"," - used for each individual pull request as part of the code review process.",[147,12613,12614,12617,12618,12620],{},[46,12615,12616],{"href":11781},"Staging"," - triggered by merge to ",[542,12619,1575],{}," branch, used for testing the full application, without fear of damaging the production environment.",[147,12622,12623,12626],{},[46,12624,12625],{"href":11775},"Production"," - the live environment that our customers use.",{"title":75,"searchDepth":76,"depth":76,"links":12628},[12629],{"id":12526,"depth":76,"text":12527},{},"\u002Fhandbook\u002Fengineering\u002Fops",{"title":12480,"description":75},"handbook\u002Fengineering\u002Fops\u002Findex","ICKyexUG1T9-Y5uWjH4Q_znb_Aa8l7sSz3jL9YEWYxk",{"id":12636,"title":11788,"body":12637,"description":12644,"extension":81,"meta":12755,"navGroup":83,"navOrder":83,"navTitle":11788,"navigation":84,"path":11787,"seo":12756,"stem":12757,"__hash__":12758},"handbook\u002Fhandbook\u002Fengineering\u002Fops\u002Fobservability.md",{"type":7,"value":12638,"toc":12745},[12639,12642,12645,12649,12653,12656,12664,12668,12671,12675,12678,12689,12696,12700,12703,12709,12713,12724,12728],[10,12640,11788],{"id":12641},"observability",[19,12643,12644],{},"Observability is the ability to understand the internal state and behavior of a system by analyzing its outputs, without requiring knowledge of its internal workings. In the context of DevOps, this means having a holistic view of your applications and infrastructure, including their health, performance, and any potential issues.",[14,12646,12648],{"id":12647},"tools-we-use","Tools we use",[164,12650,12652],{"id":12651},"prometheus","Prometheus",[19,12654,12655],{},"Prometheus is used to monitor the health of our applications and infrastructure. It collects metrics from various sources, including our applications, Kubernetes, and AWS. We use it to monitor the following:",[144,12657,12658,12661],{},[147,12659,12660],{},"Application Metrics: Prometheus collects metrics from our applications, including HTTP requests, database queries, and background jobs.",[147,12662,12663],{},"Kubernetes Metrics: Prometheus collects metrics from Kubernetes, including CPU and memory usage, pod status, and network traffic.",[164,12665,12667],{"id":12666},"loki","Loki",[19,12669,12670],{},"Loki is a log aggregation system designed to work seamlessly with Prometheus. We use Loki to collect, store, and query logs from our applications and infrastructure. It complements Prometheus by providing a way to analyze logs alongside metrics.",[164,12672,12674],{"id":12673},"grafana","Grafana",[19,12676,12677],{},"Grafana is a popular open-source platform for creating, sharing, and managing dashboards. It complements Prometheus and Loki by providing a unified interface for visualizing and analyzing observability data. Key features include:",[144,12679,12680,12683,12686],{},[147,12681,12682],{},"Data Source Integration: Grafana supports various data sources, including Prometheus and Loki, making it an ideal choice for aggregating and visualizing metrics and logs in one place.",[147,12684,12685],{},"Customizable Dashboards: Grafana offers extensive customization options, enabling you to build tailored dashboards that provide the insights you need.",[147,12687,12688],{},"Alerting: You can set up alerting rules in Grafana to proactively monitor your systems based on your metrics and logs data.",[19,12690,12691],{},[46,12692,12695],{"href":12693,"rel":12694},"https:\u002F\u002Finsights.flowfuse.com",[108],"Link",[164,12697,12699],{"id":12698},"aws-cloudwatch","AWS CloudWatch",[19,12701,12702],{},"AWS CloudWatch is a monitoring and observability service that provides data and actionable insights for AWS, hybrid, and on-premises applications and infrastructure resources. In our case we use it to monitor infrastructure-related resources in AWS.",[19,12704,12705],{},[46,12706,12695],{"href":12707,"rel":12708},"https:\u002F\u002Feu-west-1.console.aws.amazon.com\u002Fcloudwatch\u002Fhome?region=eu-west-1#home:",[108],[164,12710,12712],{"id":12711},"uptime-robot","Uptime Robot",[19,12714,12715,12719,12720,12723],{},[46,12716,12712],{"href":12717,"rel":12718},"https:\u002F\u002Fuptimerobot.com\u002F",[108]," is used to monitor our public facing sites, including FlowFuse Cloud. This polls\neach endpoint at regular intervals and raises an alarm if an error is detected. The alerts are sent to ",[542,12721,12722],{},"#ops-uptime-alerts"," in slack\nand emailed to the CTO.",[14,12725,12727],{"id":12726},"alerting","Alerting",[19,12729,12730,12731,12735,12736,12739,12740,549],{},"Any ",[46,12732,10875],{"href":12733,"rel":12734},"https:\u002F\u002Finsights.flowfuse.com\u002Falerting\u002Flist",[108]," that have been configured\nin Grafana will post to the ",[542,12737,12738],{},"#ops-alerts"," channel in slack. The alert, where appropriate,\nwill include a link to the relevant section of the ",[46,12741,12744],{"href":12742,"rel":12743},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1NMPWEFgHkVNN7RqHXUgijEGdNwZH-SlaAspOQr9Vg9k\u002Fedit#heading=h.a7jq4bkz66hv",[108],"Incident Playbook",{"title":75,"searchDepth":76,"depth":76,"links":12746},[12747,12754],{"id":12647,"depth":76,"text":12648,"children":12748},[12749,12750,12751,12752,12753],{"id":12651,"depth":605,"text":12652},{"id":12666,"depth":605,"text":12667},{"id":12673,"depth":605,"text":12674},{"id":12698,"depth":605,"text":12699},{"id":12711,"depth":605,"text":12712},{"id":12726,"depth":76,"text":12727},{},{"title":11788,"description":12644},"handbook\u002Fengineering\u002Fops\u002Fobservability","RCRPoIbq-4GygD0p5aM2Mfawb0nASbDcChGa50ij0kM",{"id":12760,"title":11776,"body":12761,"description":12845,"extension":81,"meta":12846,"navGroup":83,"navOrder":83,"navTitle":11776,"navigation":84,"path":11775,"seo":12847,"stem":12848,"__hash__":12849},"handbook\u002Fhandbook\u002Fengineering\u002Fops\u002Fproduction.md",{"type":7,"value":12762,"toc":12840},[12763,12766,12773,12782,12786,12797,12804,12811,12815,12824,12831,12833],[10,12764,11776],{"id":12765},"production-environment",[19,12767,12768,12769,12772],{},"Our production environment runs in ",[542,12770,12771],{},"EU-West-1"," in a dedicated AWS account.",[19,12774,12775,12776,12781],{},"Access to the AWS account is restricted and not generally available. If you believe\nyou have a need to access the AWS account, raise an ",[46,12777,12780],{"href":12778,"rel":12779},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fadmin\u002Fissues\u002Fnew\u002Fchoose",[108],"Access\u002FPermission Request issue","\nand assign to the CTO for review.",[14,12783,12785],{"id":12784},"using-production","Using production",[19,12787,12788,12789,12792,12793,12796],{},"SSO is enabled for all ",[542,12790,12791],{},"@flowfuse.com"," employees. Everyone is a member of ",[542,12794,12795],{},"FlowForge Team","\nwhere Applications\u002FInstances can be created.",[19,12798,12799,12800,12803],{},"By default, FlowFuse employee accounts do not have Admin level access. A dedicated\nadmin account exists with details in ",[542,12801,12802],{},"1Password"," for those with approved admin level\naccess.",[19,12805,12806,12807,549],{},"If you want to create your own Team for work purposes, request your team to be\nupgraded using manual billing by filing a ",[46,12808,12810],{"href":12809},"\u002Fhandbook\u002Foperations\u002Fchange\u002F#flowfuse-cloud-change-control","change request issue",[14,12812,12814],{"id":12813},"deployment-to-flowfuse-cloud","Deployment to FlowFuse Cloud",[19,12816,12817,12818,12820,12821,549],{},"Any pull requests that are merged into ",[542,12819,1575],{}," will automatically trigger a deployment to the production environment. As such, it is vitally important that PR Reviews are conducted thoroughly, following our guidance ",[46,12822,2011],{"href":12823},"\u002Fhandbook\u002Fengineering\u002Fcontributing#conducting-code-reviews",[19,12825,12826,12827,12830],{},"All pull requests can be tested in a full staging environment ahead of being merged. Details on how to do this can be found in our ",[46,12828,9520],{"href":12829},"\u002Fhandbook\u002Fengineering\u002Fcontributing#test-changes-in-staging"," guide.",[14,12832,11788],{"id":12641},[144,12834,12835],{},[147,12836,12837,12839],{},[46,12838,11788],{"href":11787}," - how we monitor production",{"title":75,"searchDepth":76,"depth":76,"links":12841},[12842,12843,12844],{"id":12784,"depth":76,"text":12785},{"id":12813,"depth":76,"text":12814},{"id":12641,"depth":76,"text":11788},"Our production environment runs in EU-West-1 in a dedicated AWS account.",{},{"title":11776,"description":12845},"handbook\u002Fengineering\u002Fops\u002Fproduction","LTB5oDTdno6Mpj7azciMKXkWs4UskFPCbJ1SxJ_b0Ng",{"id":12851,"title":12852,"body":12853,"description":12860,"extension":81,"meta":12909,"navGroup":83,"navOrder":83,"navTitle":12910,"navigation":84,"path":12516,"seo":12911,"stem":12912,"__hash__":12913},"handbook\u002Fhandbook\u002Fengineering\u002Fops\u002Fproduction-stack-update.md","How to Update Stacks on Production",{"type":7,"value":12854,"toc":12906},[12855,12858,12861,12863,12903],[10,12856,12852],{"id":12857},"how-to-update-stacks-on-production",[19,12859,12860],{},"As part of a FlowFuse Release the Stack definitions need updating\nto use the latest container images.",[14,12862,8792],{"id":8867},[504,12864,12865,12868,12878,12881,12891,12900],{},[147,12866,12867],{},"Login as a FlowFuse Cloud Admin user",[147,12869,12870,12871,12876],{},"Navigate to Admin Settings -> Stacks\n",[1724,12872],{"alt":12873,"dataZoomable":75,"src":12874,"width":12875},"Screenshot of Stacks list","\u002Fhandbook\u002Fimages\u002Fops\u002Fstacks-list.png","800px",[2562,12877,12873],{},[147,12879,12880],{},"For each Stack in the \"Active Stacks\" section select \"Create New Version\" from the 3 dot menu and then follow Steps 4,5,6",[147,12882,12883,12884,12889],{},"Edit the Stack Name to remove the \"-copy\" and update the semver number\n",[1724,12885],{"alt":12886,"dataZoomable":75,"src":12887,"width":12888},"Screenshot of Stack Name","\u002Fhandbook\u002Fimages\u002Fops\u002Fstack-name.png","700px",[2562,12890,12886],{},[147,12892,12893,12894,12898],{},"Edit the \"Container Location\" to edit the container tag, update just the semver of FlowFuse, not the Node-RED version suffix\n",[1724,12895],{"alt":12896,"dataZoomable":75,"src":12897,"width":12888},"Screenshot of Stack Location","\u002Fhandbook\u002Fimages\u002Fops\u002Fstack-location.png",[2562,12899,12896],{},[147,12901,12902],{},"Complete this step with the \"Create\" button",[19,12904,12905],{},"A new version of the Stack will appear in the \"Active Stacks\" list and the old one should move to the \"Inactive Stacks\" list.",{"title":75,"searchDepth":76,"depth":76,"links":12907},[12908],{"id":8867,"depth":76,"text":8792},{},"Update Stacks on Production",{"title":12852,"description":12860},"handbook\u002Fengineering\u002Fops\u002Fproduction-stack-update","zOM2wFozbkLC36oHHK6VjgD2Da6qQ3ghDY3EUjMyCm0",{"id":12915,"title":12916,"body":12917,"description":12924,"extension":81,"meta":13112,"navGroup":83,"navOrder":83,"navTitle":12523,"navigation":84,"path":12522,"seo":13113,"stem":13114,"__hash__":13115},"handbook\u002Fhandbook\u002Fengineering\u002Fops\u002Fself-hosted-assistant.md","FlowFuse Expert",{"type":7,"value":12918,"toc":13105},[12919,12922,12925,12928,12931,12934,12936,13001,13005,13009,13031,13034,13040,13043,13047,13050,13096],[10,12920,12916],{"id":12921},"flowfuse-expert",[19,12923,12924],{},"FlowFuse Expert is a collection of LLM based resources provided on FlowFuse Cloud.",[19,12926,12927],{},"Access to these features is also available to Enterprise Licensed Self Hosted and Dedicated Customers.",[19,12929,12930],{},"Self Hosted customers are directed to contact support to request the necessary authentication tokens to enable the features.",[19,12932,12933],{},"The FlowFuse Expert consists of two internal components that each need to be enabled with their own token. We are working to consolidate and simplify this configuration, but this is how it needs to be done for FlowFuse 2.28.",[14,12935,8792],{"id":8867},[504,12937,12938,12943,12946,12958,12995,12998],{},[147,12939,12940,12941],{},"Customer emails ",[542,12942,2931],{},[147,12944,12945],{},"Support\u002FSales needs to verify that the customer has a current Enterprise License",[147,12947,12948,12949,12954,12955,12957],{},"Once confirmed, they raise a ",[46,12950,12953],{"href":12951,"rel":12952},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002FCloudProject\u002Fissues\u002Fnew?assignees=&labels=change-request&projects=&template=change-request.yml&title=Change%3A+",[108],"Production Change Request"," providing details of the Customer and post a message to ",[542,12956,12422],{}," with a link.",[147,12959,12960,12961,12964,12965],{},"Engineering needs to create ",[423,12962,12963],{},"two"," access tokens for the customer.\n",[504,12966,12967,12982],{},[147,12968,12969,12972,12973,9296,12976,12978,12979,549],{},[423,12970,12971],{},"Assistant",": Open the Instance Settings for the ",[542,12974,12975],{},"flow-gen",[542,12977,9299],{}," Application. Under the Security settings create a new HTTP Bearer Token using the customer name as the token name. The token will only be displayed once, so make a note of it - this is the ",[423,12980,12981],{},"Assistant Token",[147,12983,12984,12972,12987,9296,12990,12978,12992,549],{},[423,12985,12986],{},"Expert",[542,12988,12989],{},"flowfuse-expert-api",[542,12991,9299],{},[423,12993,12994],{},"Expert Token",[147,12996,12997],{},"Engineering will provide the tokens to the Support\u002FSales person who raised the request.",[147,12999,13000],{},"Support\u002FSales then provide both tokens to the customer along with instructions on how and where to include this in the configuration - details below.",[14,13002,13004],{"id":13003},"configuration","Configuration",[164,13006,13008],{"id":13007},"docker","Docker",[19,13010,13011,13012,13015,13016,13019,13020,13023,13024,2040,13027,13030],{},"The feature is enabled by editing the ",[542,13013,13014],{},"configs.flowfuse.content"," section at the top of the ",[542,13017,13018],{},"docker-compse.yml"," file.\nAdd the following after the end of the ",[542,13021,13022],{},"npmRegistry"," section. The ",[542,13025,13026],{},"assistant",[542,13028,13029],{},"expert"," keys should be indented 6 spaces to match.",[19,13032,13033],{},"Insert the two tokens",[557,13035,13038],{"className":13036,"code":13037,"language":562},[560],"      assistant:\n        enabled: true\n        service:\n          url: https:\u002F\u002Fexpert.flowfuse.com\u002Fv1\u002Fopenai\n          token: \u003CAssistant Token>\n      expert:\n        enabled: true\n        service:\n          url: https:\u002F\u002Fexpert.flowfuse.com\u002Fv4\u002Fexpert\n          token: \u003CExpert Token>\n",[542,13039,13037],{"__ignoreMap":75},[19,13041,13042],{},"NOTE: For FlowFuse v2.29.0 and onward the urls can be omitted from the configuration as they have preset defaults",[164,13044,13046],{"id":13045},"kubernetes","Kubernetes",[19,13048,13049],{},"The feature is enabled by adding the tokens to the values passed to the Helm chart.",[144,13051,13052,13061,13069,13075,13082,13090],{},[147,13053,13054,13057,13058],{},[542,13055,13056],{},"forge.assistant.enabled"," should be set to ",[542,13059,13060],{},"true",[147,13062,13063,13057,13066],{},[542,13064,13065],{},"forge.assistant.service.url",[542,13067,13068],{},"https:\u002F\u002Fexpert.flowfuse.com\u002Fv1\u002Fopenai",[147,13070,13071,13074],{},[542,13072,13073],{},"forge.assistant.service.token"," should be set to the provided Assistant Token",[147,13076,13077,13057,13080],{},[542,13078,13079],{},"forge.expert.enabled",[542,13081,13060],{},[147,13083,13084,13057,13087],{},[542,13085,13086],{},"forge.expert.service.url",[542,13088,13089],{},"https:\u002F\u002Fexpert.flowfuse.com\u002Fv4\u002Fexpert",[147,13091,13092,13095],{},[542,13093,13094],{},"forge.expert.service.token"," should be set to the provided Expert Token",[19,13097,13098,13099,13101,13102,13104],{},"NOTE: For FlowFuse v2.29.0 and onward the urls (",[542,13100,13065],{}," & ",[542,13103,13086],{},") can be omitted from the configuration as they have preset defaults",{"title":75,"searchDepth":76,"depth":76,"links":13106},[13107,13108],{"id":8867,"depth":76,"text":8792},{"id":13003,"depth":76,"text":13004,"children":13109},[13110,13111],{"id":13007,"depth":605,"text":13008},{"id":13045,"depth":605,"text":13046},{},{"title":12916,"description":12924},"handbook\u002Fengineering\u002Fops\u002Fself-hosted-assistant","bX1atnI8MTaeHtBhIAIbjadpgUjpmWuww1zqEMiBSvo",{"id":13117,"title":11782,"body":13118,"description":13125,"extension":81,"meta":13213,"navGroup":83,"navOrder":83,"navTitle":11782,"navigation":84,"path":11781,"seo":13214,"stem":13215,"__hash__":13216},"handbook\u002Fhandbook\u002Fengineering\u002Fops\u002Fstaging.md",{"type":7,"value":13119,"toc":13204},[13120,13123,13126,13128,13131,13137,13141,13146,13148,13151,13160,13163,13167,13170,13178,13182,13189,13193,13201],[10,13121,11782],{"id":13122},"staging-environment",[19,13124,13125],{},"We have a staging environment running on AWS which is a scaled down replica of\nour managed FlowFuse offering, with a separate domain. Staging URL and sign in\ndetails can be found in the Developer Vault in 1Password.",[14,13127,11919],{"id":11918},[19,13129,13130],{},"Any change to core product repositories triggers a series of GitHub Actions that results\nin staging being updated with the latest code. This can take up to 30 minutes to complete.",[19,13132,13133,13134,549],{},"The deploy action can be monitored ",[46,13135,2011],{"href":12582,"rel":13136},[108],[14,13138,13140],{"id":13139},"aws-account","AWS Account",[19,13142,12775,13143,12781],{},[46,13144,12780],{"href":12778,"rel":13145},[108],[14,13147,832],{"id":831},[19,13149,13150],{},"Amazon SES is setup on staging however it is still running in sandbox mode which means only verified address & domains can RECEIVE emails from it, this is currently limited to flowfuse.com email addresses and a small set of pre-approved disposable emails.",[19,13152,13153,13154,13159],{},"If you need to use another email address with staging then you should raise an issue\nin ",[46,13155,13158],{"href":13156,"rel":13157},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002FCloudProject",[108],"CloudProject"," and assign to the CTO for review.",[19,13161,13162],{},"If approved, the email will need to be added to the SES configuration in the AWS console.",[164,13164,13166],{"id":13165},"test-email-accounts","Test Email accounts",[19,13168,13169],{},"We have enabled a small list of mailinator.com based email addresses for the purposes\nof short-lived testing of sign-up and user management.",[19,13171,13172,13173,549],{},"The inboxes for these email addresses are publicly accessible if known, so the list\nis available on ",[46,13174,13177],{"href":13175,"rel":13176},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002FCloudProject\u002Fissues\u002F135",[108],"this private issue",[164,13179,13181],{"id":13180},"accessing-staging","Accessing Staging",[19,13183,13184,13185,549],{},"To access the staging environment, log in with your @flowfuse.com account through Google SSO. The url for the staging environment is ",[46,13186,13187],{"href":13187,"rel":13188},"https:\u002F\u002Fforge.flowfuse.dev",[108],[14,13190,13192],{"id":13191},"using-staging","Using staging",[19,13194,13195,13196,549],{},"When setting up a team you'll need to enter billing details. For credit card\ndetails, use ",[46,13197,13200],{"href":13198,"rel":13199},"https:\u002F\u002Fstripe.com\u002Fdocs\u002Ftesting#testing-interactively",[108],"the Stripe mock data",[19,13202,13203],{},"As the staging cluster is purposefully smaller than production, please be mindful of deleting\nresources after use.",{"title":75,"searchDepth":76,"depth":76,"links":13205},[13206,13207,13208,13212],{"id":11918,"depth":76,"text":11919},{"id":13139,"depth":76,"text":13140},{"id":831,"depth":76,"text":832,"children":13209},[13210,13211],{"id":13165,"depth":605,"text":13166},{"id":13180,"depth":605,"text":13181},{"id":13191,"depth":76,"text":13192},{},{"title":11782,"description":13125},"handbook\u002Fengineering\u002Fops\u002Fstaging","d-xiKjbG7cEOfLE5Y7O7NXHRrqIUXnxiaj1uNqwyuVU",{"id":13218,"title":13219,"body":13220,"description":13227,"extension":81,"meta":13989,"navGroup":83,"navOrder":83,"navTitle":13219,"navigation":84,"path":11688,"seo":13990,"stem":13991,"__hash__":13992},"handbook\u002Fhandbook\u002Fengineering\u002Fpackaging.md","Packaging Guidelines",{"type":7,"value":13221,"toc":13972},[13222,13225,13228,13242,13246,13250,13282,13286,13303,13307,13310,13322,13324,13336,13339,13345,13349,13352,13364,13367,13412,13416,13423,13426,13432,13455,13459,13463,13480,13484,13494,13505,13518,13525,13528,13532,13543,13547,13550,13558,13687,13704,13708,13711,13726,13743,13749,13757,13763,13774,13777,13782,13843,13854,13865,13869,13877,13888,13895,13898,13903,13907,13910,13914,13938,13940,13955,13959,13969],[10,13223,13219],{"id":13224},"packaging-guidelines",[19,13226,13227],{},"This section describes the requirements we have for all GitHub repositories,\nand npm modules we maintain.",[19,13229,13230,13231,13237,13238,13241],{},"To help ensure all of the requirements are met, an issue should be raised in\n",[46,13232,13234],{"href":12778,"rel":13233},[108],[542,13235,13236],{},"FlowFuse\u002Fadmin","\nusing the ",[542,13239,13240],{},"New Repository Checklist"," and then worked through.",[14,13243,13245],{"id":13244},"github-projects","GitHub projects",[164,13247,13249],{"id":13248},"naming","Naming",[144,13251,13252,13258,13264,13270],{},[147,13253,13254,13255],{},"FlowFuse Components should start with ",[542,13256,13257],{},"flowfuse-",[147,13259,13260,13261],{},"If a Node-RED plugin\u002Fnode should start with ",[542,13262,13263],{},"nr-",[147,13265,13266,13267],{},"FlowFuse Certified nodes should start with ",[542,13268,13269],{},"ffcn-",[147,13271,13272,13273,13275,13276,685,13279],{},"Installers or Orchestration projects are named without the leading ",[542,13274,13257],{}," e.g. ",[542,13277,13278],{},"installer",[542,13280,13281],{},"helm",[164,13283,13285],{"id":13284},"settings","Settings",[144,13287,13288,13297],{},[147,13289,13290,13291,13294,13295,1576],{},"A rule should be added under the projects ",[542,13292,13293],{},"settings\u002Fbranches"," to prevent pushing directly to the ",[542,13296,1575],{},[147,13298,1375,13299,13302],{},[542,13300,13301],{},"Do not allow bypassing the above settings"," rule should be ticked when creating the branch rules",[164,13304,13306],{"id":13305},"content","Content",[19,13308,13309],{},"All Git Repositories must contain the following files:",[144,13311,13312,13317],{},[147,13313,13314],{},[542,13315,13316],{},"README.md",[147,13318,13319],{},[542,13320,13321],{},"LICENSE",[164,13323,9533],{"id":9532},[19,13325,13326,13327,13330,13331,549],{},"All code repositories should be using ESLint V9 or greater and adopt our standard linting rules by copying\n",[542,13328,13329],{},"eslint.config.mjs"," from the ",[46,13332,13335],{"href":13333,"rel":13334},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002F.github\u002Fblob\u002Fmain\u002Feslint.config.mjs",[108],"FlowFuse\u002F.github repository",[19,13337,13338],{},"If a repository has any additional requirements for linting, such as handling Vue\ncode, then additional plugins can be added.",[19,13340,13341,13342,9550],{},"We stick closely to the ",[46,13343,9549],{"href":9547,"rel":13344},[108],[239,13346,13348],{"id":13347},"scripts-for-linting-in-packagejson","Scripts for linting in package.json",[19,13350,13351],{},"We add 2 common scripts for linting:",[504,13353,13354,13359],{},[147,13355,13356],{},[542,13357,13358],{},"lint",[147,13360,13361],{},[542,13362,13363],{},"lint:fix",[19,13365,13366],{},"Below is a typical example:",[557,13368,13372],{"className":13369,"code":13370,"language":13371,"meta":75,"style":75},"language-json shiki shiki-themes github-light github-dark","    \"scripts\": {\n        \u002F\u002F ...other scripts...\n        \"lint\": \"eslint -c eslint.config.mjs\",\n        \"lint:fix\": \"eslint -c eslint.config.mjs --fix\"\n    },\n","json",[542,13373,13374,13381,13386,13398,13408],{"__ignoreMap":75},[2403,13375,13376,13379],{"class":2405,"line":2406},[2403,13377,13378],{"class":2765},"    \"scripts\"",[2403,13380,10798],{"class":2446},[2403,13382,13383],{"class":2405,"line":76},[2403,13384,13385],{"class":10823},"        \u002F\u002F ...other scripts...\n",[2403,13387,13388,13391,13393,13396],{"class":2405,"line":605},[2403,13389,13390],{"class":2709},"        \"lint\"",[2403,13392,9411],{"class":2446},[2403,13394,13395],{"class":2765},"\"eslint -c eslint.config.mjs\"",[2403,13397,10770],{"class":2446},[2403,13399,13400,13403,13405],{"class":2405,"line":2423},[2403,13401,13402],{"class":2709},"        \"lint:fix\"",[2403,13404,9411],{"class":2446},[2403,13406,13407],{"class":2765},"\"eslint -c eslint.config.mjs --fix\"\n",[2403,13409,13410],{"class":2405,"line":2465},[2403,13411,10829],{"class":2446},[164,13413,13415],{"id":13414},"notifications","Notifications",[19,13417,13418,13419,13422],{},"Repositories should be added to the appropriate Slack channel. For core code repositories,\nthis would be in the ",[542,13420,13421],{},"#gh-flowfuse"," channel.",[19,13424,13425],{},"To create a subscription, go to that channel and type the message:",[557,13427,13430],{"className":13428,"code":13429,"language":562},[560],"\u002Fgithub subscribe FlowFuse\u002FNAME-OF-REPO comments reviews\n",[542,13431,13429],{"__ignoreMap":75},[19,13433,13434,13435,63,13438,63,13441,63,13444,63,13446,63,13449,2040,13452,549],{},"This will subscribe to any notifications covering: ",[542,13436,13437],{},"issues",[542,13439,13440],{},"pulls",[542,13442,13443],{},"commits",[542,13445,11716],{},[542,13447,13448],{},"deployments",[542,13450,13451],{},"comments",[542,13453,13454],{},"reviews",[164,13456,13458],{"id":13457},"workflows","Workflows",[239,13460,13462],{"id":13461},"project-automation","Project Automation",[19,13464,13465,13466,13473,13474,13479],{},"All code repositories must have the Project Automation workflow added. This is done\nby adding ",[46,13467,13470],{"href":13468,"rel":13469},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fflowfuse\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fproject-automation.yml",[108],[542,13471,13472],{},".github\u002Fworkflows\u002Fproject-automation.yml",".\nThis workflow will ensure any opened issues are automatically added to the ",[46,13475,13478],{"href":13476,"rel":13477},"https:\u002F\u002Fgithub.com\u002Forgs\u002FFlowFuse\u002Fprojects\u002F3",[108],"Product board"," where it can be triaged and prioritised.",[239,13481,13483],{"id":13482},"release-publish","Release Publish",[19,13485,13486,13487,549],{},"For any repositories that contain modules to be published to public npm, they should also\nhave a copy of ",[46,13488,13491],{"href":13489,"rel":13490},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fflowfuse\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Frelease-publish.yml",[108],[542,13492,13493],{},".github\u002Fworkflows\u002Frelease-publish.yml",[19,13495,13496,13497,13500,13501,13504],{},"For modules being published to the Certified Nodes npm registry this ",[542,13498,13499],{},"release-publish.yml"," file should be edited to point to the ",[542,13502,13503],{},"https:\u002F\u002Fregistry.flowfuse.com"," registry and to make use of the correct token.",[19,13506,13507,13508,13513,13514,13517],{},"An example can be in the ",[46,13509,13512],{"href":13510,"rel":13511},"https:\u002F\u002Fgithub.com\u002FFlowfuse\u002Fnr-mcp-server-nodes\u002Fblob\u002Fmain\u002F.github\u002Fworkflose\u002Frelease-publish.yml",[108],"flowfuse\u002Fnr-mcp-server-nodes"," project. The ",[542,13515,13516],{},"CERTIFIED_NODES_PUBLISH_TOKEN"," should be added to the projects Secrets and can be found in 1Password.",[19,13519,13520,13521,13524],{},"This workflow will publish to npm whenever the repository is tagged with a ",[542,13522,13523],{},"vX.Y.Z"," format\ntag.",[19,13526,13527],{},"Note that each repository may have slightly different pre-publish requirements - for\nexample if there is a build step or not. You may need to customise the workflow\nto match what is needed.",[239,13529,13531],{"id":13530},"static-application-security-testing","Static Application Security Testing",[19,13533,13534,13535,13542],{},"For any repository that contains code, the Static Application Security Testing workflow should be added.\nThis is done by adding ",[46,13536,13539],{"href":13537,"rel":13538},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fflowfuse\u002Fblob\u002Fmain\u002F.github\u002Fworkflows\u002Fsast-scan.yml",[108],[542,13540,13541],{},".github\u002Fworkflows\u002Fsast.yml"," to the repository. This workflow will run on any pull request and will scan the code for any known security vulnerabilities. By default, scan results are added to The GitHub Advanced Security tab of the repository, but can be configured to also post comments on the pull request if vulnerabilities are found (see reusable workflow for details).",[164,13544,13546],{"id":13545},"labels","Labels",[19,13548,13549],{},"We have a standard set of labels that should be applied to all repositories. This\nensures we have a consistent approach to planning and tracking of work.",[19,13551,13552,13553,13557],{},"The definitive list of labels is maintained ",[46,13554,2011],{"href":13555,"rel":13556},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002F.github\u002Fblob\u002Fmain\u002Flabels.json",[108],"\nand are synchronized across all repositories via GitHub Actions.",[144,13559,13560,13577,13598,13630,13642,13651,13666],{},[147,13561,13562,13563,63,13566,63,13569,63,13572,63,13575],{},"Type: ",[542,13564,13565],{},"epic",[542,13567,13568],{},"story",[542,13570,13571],{},"task",[542,13573,13574],{},"bug",[542,13576,7448],{},[147,13578,13579,13580,63,13583,63,13586,63,13589,63,13592,63,13595],{},"Sizing: ",[542,13581,13582],{},"XS - 1",[542,13584,13585],{},"S - 2",[542,13587,13588],{},"M - 3",[542,13590,13591],{},"L - 5",[542,13593,13594],{},"XL - 8",[542,13596,13597],{},"XXL - 13",[147,13599,13600,13601,63,13604,63,13607,63,13610,63,13613,63,13616,63,13619,63,13622,63,13625,63,13628],{},"Area: ",[542,13602,13603],{},"area:docs",[542,13605,13606],{},"area:db",[542,13608,13609],{},"area:migration",[542,13611,13612],{},"area:frontend",[542,13614,13615],{},"area:api",[542,13617,13618],{},"area:device",[542,13620,13621],{},"area:billing",[542,13623,13624],{},"area:infrastrucutre",[542,13626,13627],{},"area:install",[542,13629,7445],{},[147,13631,13632,13633,63,13636,63,13639],{},"Priority: ",[542,13634,13635],{},"priority:high",[542,13637,13638],{},"priority:medium",[542,13640,13641],{},"priority:low",[147,13643,13644,13645,63,13648],{},"Status: ",[542,13646,13647],{},"blocked",[542,13649,13650],{},"consideration",[147,13652,13653,13654,63,13657,63,13660,63,13663],{},"Product Scope: ",[542,13655,13656],{},"scope:devices",[542,13658,13659],{},"scope:enterprise",[542,13661,13662],{},"scope:node-red",[542,13664,13665],{},"scope:collaboration",[147,13667,13668,13669,63,13672,63,13675,63,13678,63,13681,63,13684],{},"Other: ",[542,13670,13671],{},"good first issue",[542,13673,13674],{},"upstream",[542,13676,13677],{},"needs-triage",[542,13679,13680],{},"headline",[542,13682,13683],{},"backport",[542,13685,13686],{},"research",[19,13688,13689,13690,13697,13698,13703],{},"New repositories must be added to the list in ",[46,13691,13694],{"href":13692,"rel":13693},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002F.github\u002Fblob\u002Fmain\u002Fflowforge-repositories.yml",[108],[542,13695,13696],{},"flowforge-repositories.yml",",\nand then the ",[46,13699,13702],{"href":13700,"rel":13701},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002F.github\u002Factions\u002Fworkflows\u002Fsync-labels.yml",[108],"Synchronize Labels"," action manually run.",[14,13705,13707],{"id":13706},"npm-packages","NPM packages",[164,13709,13249],{"id":13710},"naming-1",[19,13712,13713,13715,13716,13719,13720,13725],{},[2562,13714,8290],{}," we are migrating to the ",[542,13717,13718],{},"@flowfuse"," scope of packages. See ",[46,13721,13724],{"href":13722,"rel":13723},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fadmin\u002Fissues\u002F211",[108],"this issue","\nfor details. This section of the handbook will be updated as part of the migration.",[144,13727,13728],{},[147,13729,13730,13731,13734,13735,13738,13739,13742],{},"npm packages should be scoped as either ",[542,13732,13733],{},"@flowfuse\u002F"," (pubilc) ",[542,13736,13737],{},"@flowfuse-nodes\u002F"," (restricted) or ",[542,13740,13741],{},"@flowfuse-certified-nodes\u002F"," (certified nodes)",[19,13744,13745,13746,13748],{},"Node-RED plugins should start with ",[542,13747,13263],{}," e.g.",[144,13750,13751,13754],{},[147,13752,13753],{},"@flowforge\u002Fnr-storage",[147,13755,13756],{},"@flowforge\u002Fnr-auth",[19,13758,13759,13760,13748],{},"FlowFuse plugins should start with ",[542,13761,13762],{},"forge-",[144,13764,13765,13768,13771],{},[147,13766,13767],{},"@flowforge\u002Fforge-driver-localfs",[147,13769,13770],{},"@flowforge\u002Fforge-driver-docker",[147,13772,13773],{},"@flowforge\u002Fforge-driver-k8s",[164,13775,13306],{"id":13776},"content-1",[19,13778,1375,13779,13781],{},[542,13780,10251],{}," must contain the following keys",[144,13783,13784,13787,13796,13805,13814,13825,13834],{},[147,13785,13786],{},"description",[147,13788,13789,13790],{},"repository\n",[557,13791,13794],{"className":13792,"code":13793,"language":562},[560],"\"repository\": {\n   \"type\": \"git\",\n   \"url\": \"git+https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fflowforge.git\"\n},\n",[542,13795,13793],{"__ignoreMap":75},[147,13797,13798,13799],{},"homepage\n",[557,13800,13803],{"className":13801,"code":13802,"language":562},[560],"\"homepage\": \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fflowforge#readme\",\n",[542,13804,13802],{"__ignoreMap":75},[147,13806,13807,13808],{},"bugs\n",[557,13809,13812],{"className":13810,"code":13811,"language":562},[560],"\"bugs\": {\n    \"url\": \"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fflowfuse\u002Fissues\"\n},\n",[542,13813,13811],{"__ignoreMap":75},[147,13815,13816,13817],{},"license\n",[144,13818,13819,13822],{},[147,13820,13821],{},"Apache-2.0",[147,13823,13824],{},"SEE LICENSE IN .\u002FLICENSE",[147,13826,13827,13828],{},"author\n",[557,13829,13832],{"className":13830,"code":13831,"language":562},[560],"\"author\": {\n    \"name\": \"FlowFuse Inc.\"\n},\n",[542,13833,13831],{"__ignoreMap":75},[147,13835,13836,13837],{},"engines\n",[557,13838,13841],{"className":13839,"code":13840,"language":562},[560],"\"engines\": {\n  \"node\": \">=16.x\"\n}\n",[542,13842,13840],{"__ignoreMap":75},[19,13844,13845,13846,685,13848,13850,13851,9745],{},"Packages with ",[542,13847,13737],{},[542,13849,13741],{}," scopes should also contain the ",[542,13852,13853],{},"registry",[144,13855,13856],{},[147,13857,13858,13859],{},"publishConfig\n",[557,13860,13863],{"className":13861,"code":13862,"language":562},[560],"\"publishConfig\": {\n   \"registry\": \"https:\u002F\u002Fregistry.flowfuse.com\"\n}\n",[542,13864,13862],{"__ignoreMap":75},[164,13866,13868],{"id":13867},"package-version-numbering","Package Version Numbering",[19,13870,13871,13872,549],{},"Package numbers should follow the Semantic Versioning Scheme as laid out on ",[46,13873,13876],{"href":13874,"rel":13875},"https:\u002F\u002Fsemver.org\u002F",[108],"semver.org",[19,13878,13879,13880,13883,13884,13887],{},"Each component will stay in step with the core flowforge\u002Fflowforge release numbering for ",[542,13881,13882],{},"major.minor"," but will increment their own ",[542,13885,13886],{},"fix"," values as needed. e.g. On release of v0.2.0 all components will tag and release v0.2.0, but can independently release v0.2.1 as needed.",[19,13889,13890,13891,13894],{},"Major and minor releases will follow the schedule laid out in the ",[46,13892,13893],{"href":8889},"Cadence"," section of the handbook.",[19,13896,13897],{},"A Fix release can be made at any time, depending on the best judgement of the engineer making the fix but requires a review by another team member.",[19,13899,13900,13901,549],{},"The process for making a release is documented ",[46,13902,2011],{"href":11724},[164,13904,13906],{"id":13905},"adding-npm-packages-to-stacks","Adding NPM packages to Stacks",[19,13908,13909],{},"As we build more FlowFuse specific nodes we will need to add these to the Stacks",[239,13911,13913],{"id":13912},"localfs","Localfs",[19,13915,13916,13917,1755,13921,13923,13924,13927,13928,13931,13932,13937],{},"Currently bundled packages for the localfs driver need to be added to the ",[46,13918,9916],{"href":13919,"rel":13920},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fnr-launcher",[108],[542,13922,10251],{},"  and the path to the node needs to be added to the ",[542,13925,13926],{},"nodesDir"," array in the ",[542,13929,13930],{},"lib\u002Flauncher.js"," file (around line 70). This will be updated in the next release to be controlled by the ",[46,13933,13936],{"href":13934,"rel":13935},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fdriver-localfs",[108],"driver-localfs"," project",[239,13939,13008],{"id":13007},[19,13941,13942,13943,13945,13946,13949,13950,13937],{},"Any nodes or themes should be added to the ",[542,13944,10251],{}," in ",[542,13947,13948],{},"node-red-container\u002F"," directory of the ",[46,13951,13954],{"href":13952,"rel":13953},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fdocker-compose",[108],"docker-compose",[239,13956,13958],{"id":13957},"k8s","K8s",[19,13960,13942,13961,13945,13963,13949,13965,13937],{},[542,13962,10251],{},[542,13964,13948],{},[46,13966,13281],{"href":13967,"rel":13968},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fhelm",[108],[2796,13970,13971],{},"html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":75,"searchDepth":76,"depth":76,"links":13973},[13974,13983],{"id":13244,"depth":76,"text":13245,"children":13975},[13976,13977,13978,13979,13980,13981,13982],{"id":13248,"depth":605,"text":13249},{"id":13284,"depth":605,"text":13285},{"id":13305,"depth":605,"text":13306},{"id":9532,"depth":605,"text":9533},{"id":13414,"depth":605,"text":13415},{"id":13457,"depth":605,"text":13458},{"id":13545,"depth":605,"text":13546},{"id":13706,"depth":76,"text":13707,"children":13984},[13985,13986,13987,13988],{"id":13710,"depth":605,"text":13249},{"id":13776,"depth":605,"text":13306},{"id":13867,"depth":605,"text":13868},{"id":13905,"depth":605,"text":13906},{},{"title":13219,"description":13227},"handbook\u002Fengineering\u002Fpackaging","EFWa7cL1XcukYYoIdlruwMyokRx447wDCHPJcbIACkc",{"id":13994,"title":13995,"body":13996,"description":14005,"extension":81,"meta":14691,"navGroup":83,"navOrder":83,"navTitle":13995,"navigation":84,"path":14692,"seo":14693,"stem":14694,"__hash__":14695},"handbook\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fblueprints.md","Blueprints",{"type":7,"value":13997,"toc":14674},[13998,14001,14009,14012,14015,14023,14027,14044,14052,14056,14060,14073,14077,14088,14178,14181,14184,14188,14195,14199,14208,14212,14215,14219,14226,14237,14240,14249,14253,14256,14264,14268,14271,14289,14291,14302,14306,14309,14312,14605,14607,14611,14619,14622,14628,14631,14634,14638,14646,14671],[10,13999,13995],{"id":14000},"blueprints",[19,14002,14003,14007],{},[1724,14004],{"alt":14005,"dataZoomable":75,"src":14006},"Screenshot of the Blueprint selection UI in FlowFuse","\u002Fhandbook\u002Fimages\u002Fdevelopment\u002Fscreenshot-blueprints.png",[2562,14008,14005],{},[19,14010,14011],{},"As part of the FlowFuse platform, it is possible to define \"Blueprints\".",[19,14013,14014],{},"Blueprints are packaged flows that help users get up and running with a particular project or idea. They should be informative, easy to understand, and provide a clear path to value.",[19,14016,14017,14018,549],{},"FlowFuse host a public version of our ",[46,14019,14022],{"href":14020,"rel":14021},"https:\u002F\u002Fflowfuse.com\u002Fblueprints\u002F",[108],"Blueprint Library here",[14,14024,14026],{"id":14025},"tracking-blueprint-ideas","Tracking Blueprint Ideas",[19,14028,14029,14030,14035,14036,14039,14040,11585],{},"We have a ",[46,14031,14034],{"href":14032,"rel":14033},"https:\u002F\u002Fgithub.com\u002Forgs\u002FFlowFuse\u002Fprojects\u002F28\u002Fviews\u002F1",[108],"GitHub Project Board"," used to track the state of each idea recorded in the private ",[542,14037,14038],{},"blueprint-library"," repository (",[46,14041,2971],{"href":14042,"rel":14043},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fblueprint-library\u002Fissues",[108],[19,14045,14046,14050],{},[1724,14047],{"alt":14048,"dataZoomable":75,"src":14049},"Screenshot of the Blueprint Project Board","\u002Fhandbook\u002Fimages\u002Fdevelopment\u002Fscreenshot-blueprints-pm.png",[2562,14051,14048],{},[14,14053,14055],{"id":14054},"submitting-a-blueprint","Submitting a Blueprint",[164,14057,14059],{"id":14058},"public-submission","Public Submission",[19,14061,14062,14063,14067,14068,14072],{},"We encourage Blueprint submissions from our customers, partners, and the wider community. Anyone can submit their own Blueprint idea via our online portal ",[46,14064,2011],{"href":14065,"rel":14066},"https:\u002F\u002Fflowfuse.com\u002Fblueprints\u002Fsubmit\u002F",[108],". Please check with the ",[46,14069,14071],{"href":14070},"#minimum-requirements","Minimum Requirements"," to ensure any submissions have provided the relevant details.",[164,14074,14076],{"id":14075},"internal-development","Internal Development",[19,14078,14079,14080,14082,14083,14087],{},"If a Blueprint is being developed internally, it should be added to the ",[542,14081,14038],{}," repository via a Pull Request. First, create an issue in the same repository to track its progress and ensure alignment with product and company strategy. The Pull Request must be reviewed and tested by another team member. Once approved, ",[46,14084,14086],{"href":14085},"#submitting-a-change-request","submit a Change Request",". When the responsible admin adds the Blueprint to the platform, they will share the Blueprint ID with the author, who should then include it in the Blueprint's README file:",[557,14089,14092],{"className":14090,"code":14091,"language":2061,"meta":75,"style":75},"language-markdown shiki shiki-themes github-light github-dark","---\ntitle: \u003CBlueprint Name>\ndescription: \"\u003CDescription goes here>\"\nimage: \u003CImage Path>\ntags:\n  - blueprints\n  - \u003Cblueprint tag such as manufacturing, getting-started, or other>\nlayout: layouts\u002Fblueprint.njk\nblueprintId: \u003CBlueprintId goes here>\n---\nRest of the content...\n",[542,14093,14094,14099,14109,14118,14128,14135,14143,14150,14159,14169,14173],{"__ignoreMap":75},[2403,14095,14096],{"class":2405,"line":2406},[2403,14097,14098],{"class":2446},"---\n",[2403,14100,14101,14104,14106],{"class":2405,"line":76},[2403,14102,14103],{"class":2686},"title",[2403,14105,9411],{"class":2446},[2403,14107,14108],{"class":2765},"\u003CBlueprint Name>\n",[2403,14110,14111,14113,14115],{"class":2405,"line":605},[2403,14112,13786],{"class":2686},[2403,14114,9411],{"class":2446},[2403,14116,14117],{"class":2765},"\"\u003CDescription goes here>\"\n",[2403,14119,14120,14123,14125],{"class":2405,"line":2423},[2403,14121,14122],{"class":2686},"image",[2403,14124,9411],{"class":2446},[2403,14126,14127],{"class":2765},"\u003CImage Path>\n",[2403,14129,14130,14133],{"class":2405,"line":2465},[2403,14131,14132],{"class":2686},"tags",[2403,14134,9403],{"class":2446},[2403,14136,14137,14140],{"class":2405,"line":2471},[2403,14138,14139],{"class":2446},"  - ",[2403,14141,14142],{"class":2765},"blueprints\n",[2403,14144,14145,14147],{"class":2405,"line":3086},[2403,14146,14139],{"class":2446},[2403,14148,14149],{"class":2765},"\u003Cblueprint tag such as manufacturing, getting-started, or other>\n",[2403,14151,14152,14154,14156],{"class":2405,"line":3092},[2403,14153,10744],{"class":2686},[2403,14155,9411],{"class":2446},[2403,14157,14158],{"class":2765},"layouts\u002Fblueprint.njk\n",[2403,14160,14161,14164,14166],{"class":2405,"line":3098},[2403,14162,14163],{"class":2686},"blueprintId",[2403,14165,9411],{"class":2446},[2403,14167,14168],{"class":2765},"\u003CBlueprintId goes here>\n",[2403,14170,14171],{"class":2405,"line":3104},[2403,14172,14098],{"class":2446},[2403,14174,14175],{"class":2405,"line":3109},[2403,14176,14177],{"class":2446},"Rest of the content...\n",[19,14179,14180],{},"Once done, the reviewer or the author can proceed to merge the Pull Request.",[14,14182,14071],{"id":14183},"minimum-requirements",[164,14185,14187],{"id":14186},"flow","Flow",[19,14189,14190,14191,14194],{},"The bare minimum requirement for a Blueprint is the respective ",[542,14192,14193],{},"flow.json"," file which details the Node-RED flow associated to the Blueprint.",[239,14196,14198],{"id":14197},"dependencies","Dependencies",[19,14200,14201,14202,14204,14205,14207],{},"With the ",[542,14203,14193],{}," we also need to have details on any third-party nodes and dependencies that the ",[542,14206,14193],{}," will require in order to be functional.",[164,14209,14211],{"id":14210},"screenshots","Screenshots",[19,14213,14214],{},"Images help commuicate the value of a Blueprint, without the need to fully deploy it. Screenshots and images are used as part of marketing material in socials, as well as imagery on the Blueprint Library itself, e.g. the image background of the Blueprint's tile.",[164,14216,14218],{"id":14217},"appearance","Appearance",[19,14220,14221,14222,14225],{},"Blueprints are designated to a ",[423,14223,14224],{},"category",". On FlowFuse Cloud, these categories are currently:",[144,14227,14228,14231,14234],{},[147,14229,14230],{},"Getting Started",[147,14232,14233],{},"Manufacturing",[147,14235,14236],{},"Other",[19,14238,14239],{},"But others can, and should, be added as required.",[19,14241,14242,14243,14248],{},"Each Blueprint can also have a custom icon, which should be defined as an icon from ",[46,14244,14247],{"href":14245,"rel":14246},"https:\u002F\u002Fv1.heroicons.com\u002F",[108],"Hero Icons v1",". The color for the tile of each Blueprint is hardcoded then depending on the category. Any changes to color, or coloring of new categories currently require a code change within FlowFuse.`",[164,14250,14252],{"id":14251},"company-information","Company Information",[19,14254,14255],{},"Submissions are encouraged to be from an organization, rather than an individual. As such, any submission must has an associated:",[144,14257,14258,14261],{},[147,14259,14260],{},"Company Name",[147,14262,14263],{},"Company Logo",[14,14265,14267],{"id":14266},"publishing-a-blueprint","Publishing a Blueprint",[19,14269,14270],{},"Blueprints must be published in two locations:",[144,14272,14273,14281],{},[147,14274,14275,14277,14278,14280],{},[423,14276,7815],{},": This is our ",[2562,14279,4701],{}," Blueprint Library, where users can browse Blueprints and get access to a quick \"Deploy\" action.",[147,14282,14283,14285,14286,14288],{},[423,14284,7812],{},": This is the ",[2562,14287,4873],{}," Blueprint Library within FlowFuse. It is configured as part of the FlowFuse Admin Panel.",[164,14290,7815],{"id":2039},[19,14292,14293,14294,14301],{},"To add a Blueprint to our public Blueprint Library, we need to publish the Blueprint to the ",[46,14295,14298,14300],{"href":14296,"rel":14297},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fblueprint-library",[108],[542,14299,14038],{}," repository",". The Website then automatically picks up the new Blueprint and publishes it.",[239,14303,14305],{"id":14304},"license","License",[19,14307,14308],{},"All Blueprints require a comment node be added to the flow, with the relevant license included.",[19,14310,14311],{},"You can import the required comment node by importing the following JSON:",[557,14313,14315],{"className":13369,"code":14314,"language":13371,"meta":75,"style":75},"{\n    \"id\": \"fc23cedbf1194ca4\",\n    \"type\": \"comment\",\n    \"z\": \"ad0d2e8ce07aeb8b\",\n    \"name\": \"License\",\n    \"info\": \"The FlowFuse License\\nCopyright (c) 2021-present FlowFuse Inc\\n\\nWith regard to the FlowFuse Software:\\n\\nThis software and associated documentation files (the \\\"Software\\\") may only be\\nused in production, if you (and any entity that you represent) have agreed to,\\nand are in compliance with, the FlowFuse Subscription Terms (the \\\"Terms\\\"),\\nor other agreements governing the use of the Software, as mutually agreed by you\\nand FlowFuse Inc (\\\"FlowFuse\\\"), and otherwise have a valid FlowFuse Subscription\\nfor the active usage. Subject to the foregoing sentence, you are free to modify\\nthis Software and publish patches to the Software. You agree that FlowFuse and\u002For\\nits licensors (as applicable) retain all right, title and interest in and to all\\nsuch modifications and\u002For patches, and all such modifications and\u002For patches may\\nonly be used, copied, modified, displayed, distributed, or otherwise exploited\\nwith a valid Subscription.\\nNotwithstanding the foregoing, you may copy and modify the Software for development\\nand testing purposes, without requiring a subscription.  You agree that FlowFuse\\nand\u002For its licensors (as applicable) retain all right, title and interest in and\\nto all such modifications.  You are not granted any other rights beyond what is\\nexpressly stated herein. Subject to the foregoing, it is forbidden to copy, merge,\\npublish, distribute, sublicense, and\u002For sell the Software.\\n\\nTHE SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\\nSOFTWARE.\\n\\nFor all third party components incorporated into the FlowFuse Software, those\\ncomponents are licensed under the original license provided by the owner of the\\napplicable component.\",\n    \"x\": 130,\n    \"y\": 40,\n    \"wires\": []\n}\n",[542,14316,14317,14321,14333,14345,14357,14369,14569,14581,14593,14601],{"__ignoreMap":75},[2403,14318,14319],{"class":2405,"line":2406},[2403,14320,10757],{"class":2446},[2403,14322,14323,14326,14328,14331],{"class":2405,"line":76},[2403,14324,14325],{"class":2709},"    \"id\"",[2403,14327,9411],{"class":2446},[2403,14329,14330],{"class":2765},"\"fc23cedbf1194ca4\"",[2403,14332,10770],{"class":2446},[2403,14334,14335,14338,14340,14343],{"class":2405,"line":605},[2403,14336,14337],{"class":2709},"    \"type\"",[2403,14339,9411],{"class":2446},[2403,14341,14342],{"class":2765},"\"comment\"",[2403,14344,10770],{"class":2446},[2403,14346,14347,14350,14352,14355],{"class":2405,"line":2423},[2403,14348,14349],{"class":2709},"    \"z\"",[2403,14351,9411],{"class":2446},[2403,14353,14354],{"class":2765},"\"ad0d2e8ce07aeb8b\"",[2403,14356,10770],{"class":2446},[2403,14358,14359,14362,14364,14367],{"class":2405,"line":2465},[2403,14360,14361],{"class":2709},"    \"name\"",[2403,14363,9411],{"class":2446},[2403,14365,14366],{"class":2765},"\"License\"",[2403,14368,10770],{"class":2446},[2403,14370,14371,14374,14376,14379,14382,14385,14388,14391,14393,14396,14399,14402,14404,14407,14409,14412,14414,14417,14419,14422,14424,14427,14429,14432,14434,14437,14439,14442,14444,14447,14449,14452,14454,14457,14459,14462,14464,14467,14469,14472,14474,14477,14479,14482,14484,14487,14489,14492,14494,14497,14499,14502,14504,14507,14509,14512,14514,14517,14519,14522,14524,14527,14529,14532,14534,14537,14539,14542,14544,14547,14549,14552,14554,14557,14559,14562,14564,14567],{"class":2405,"line":2471},[2403,14372,14373],{"class":2709},"    \"info\"",[2403,14375,9411],{"class":2446},[2403,14377,14378],{"class":2765},"\"The FlowFuse License",[2403,14380,14381],{"class":2709},"\\n",[2403,14383,14384],{"class":2765},"Copyright (c) 2021-present FlowFuse Inc",[2403,14386,14387],{"class":2709},"\\n\\n",[2403,14389,14390],{"class":2765},"With regard to the FlowFuse Software:",[2403,14392,14387],{"class":2709},[2403,14394,14395],{"class":2765},"This software and associated documentation files (the ",[2403,14397,14398],{"class":2709},"\\\"",[2403,14400,14401],{"class":2765},"Software",[2403,14403,14398],{"class":2709},[2403,14405,14406],{"class":2765},") may only be",[2403,14408,14381],{"class":2709},[2403,14410,14411],{"class":2765},"used in production, if you (and any entity that you represent) have agreed to,",[2403,14413,14381],{"class":2709},[2403,14415,14416],{"class":2765},"and are in compliance with, the FlowFuse Subscription Terms (the ",[2403,14418,14398],{"class":2709},[2403,14420,14421],{"class":2765},"Terms",[2403,14423,14398],{"class":2709},[2403,14425,14426],{"class":2765},"),",[2403,14428,14381],{"class":2709},[2403,14430,14431],{"class":2765},"or other agreements governing the use of the Software, as mutually agreed by you",[2403,14433,14381],{"class":2709},[2403,14435,14436],{"class":2765},"and FlowFuse Inc (",[2403,14438,14398],{"class":2709},[2403,14440,14441],{"class":2765},"FlowFuse",[2403,14443,14398],{"class":2709},[2403,14445,14446],{"class":2765},"), and otherwise have a valid FlowFuse Subscription",[2403,14448,14381],{"class":2709},[2403,14450,14451],{"class":2765},"for the active usage. Subject to the foregoing sentence, you are free to modify",[2403,14453,14381],{"class":2709},[2403,14455,14456],{"class":2765},"this Software and publish patches to the Software. You agree that FlowFuse and\u002For",[2403,14458,14381],{"class":2709},[2403,14460,14461],{"class":2765},"its licensors (as applicable) retain all right, title and interest in and to all",[2403,14463,14381],{"class":2709},[2403,14465,14466],{"class":2765},"such modifications and\u002For patches, and all such modifications and\u002For patches may",[2403,14468,14381],{"class":2709},[2403,14470,14471],{"class":2765},"only be used, copied, modified, displayed, distributed, or otherwise exploited",[2403,14473,14381],{"class":2709},[2403,14475,14476],{"class":2765},"with a valid Subscription.",[2403,14478,14381],{"class":2709},[2403,14480,14481],{"class":2765},"Notwithstanding the foregoing, you may copy and modify the Software for development",[2403,14483,14381],{"class":2709},[2403,14485,14486],{"class":2765},"and testing purposes, without requiring a subscription.  You agree that FlowFuse",[2403,14488,14381],{"class":2709},[2403,14490,14491],{"class":2765},"and\u002For its licensors (as applicable) retain all right, title and interest in and",[2403,14493,14381],{"class":2709},[2403,14495,14496],{"class":2765},"to all such modifications.  You are not granted any other rights beyond what is",[2403,14498,14381],{"class":2709},[2403,14500,14501],{"class":2765},"expressly stated herein. Subject to the foregoing, it is forbidden to copy, merge,",[2403,14503,14381],{"class":2709},[2403,14505,14506],{"class":2765},"publish, distribute, sublicense, and\u002For sell the Software.",[2403,14508,14387],{"class":2709},[2403,14510,14511],{"class":2765},"THE SOFTWARE IS PROVIDED ",[2403,14513,14398],{"class":2709},[2403,14515,14516],{"class":2765},"AS IS",[2403,14518,14398],{"class":2709},[2403,14520,14521],{"class":2765},", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR",[2403,14523,14381],{"class":2709},[2403,14525,14526],{"class":2765},"IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,",[2403,14528,14381],{"class":2709},[2403,14530,14531],{"class":2765},"FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE",[2403,14533,14381],{"class":2709},[2403,14535,14536],{"class":2765},"AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER",[2403,14538,14381],{"class":2709},[2403,14540,14541],{"class":2765},"LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,",[2403,14543,14381],{"class":2709},[2403,14545,14546],{"class":2765},"OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE",[2403,14548,14381],{"class":2709},[2403,14550,14551],{"class":2765},"SOFTWARE.",[2403,14553,14387],{"class":2709},[2403,14555,14556],{"class":2765},"For all third party components incorporated into the FlowFuse Software, those",[2403,14558,14381],{"class":2709},[2403,14560,14561],{"class":2765},"components are licensed under the original license provided by the owner of the",[2403,14563,14381],{"class":2709},[2403,14565,14566],{"class":2765},"applicable component.\"",[2403,14568,10770],{"class":2446},[2403,14570,14571,14574,14576,14579],{"class":2405,"line":3086},[2403,14572,14573],{"class":2709},"    \"x\"",[2403,14575,9411],{"class":2446},[2403,14577,14578],{"class":2709},"130",[2403,14580,10770],{"class":2446},[2403,14582,14583,14586,14588,14591],{"class":2405,"line":3092},[2403,14584,14585],{"class":2709},"    \"y\"",[2403,14587,9411],{"class":2446},[2403,14589,14590],{"class":2709},"40",[2403,14592,10770],{"class":2446},[2403,14594,14595,14598],{"class":2405,"line":3098},[2403,14596,14597],{"class":2709},"    \"wires\"",[2403,14599,14600],{"class":2446},": []\n",[2403,14602,14603],{"class":2405,"line":3104},[2403,14604,10834],{"class":2446},[164,14606,7812],{"id":10679},[239,14608,14610],{"id":14609},"submitting-a-change-request","Submitting a Change Request",[19,14612,14613,14614,14618],{},"To add a Blueprint to FlowFuse Cloud, a ",[46,14615,14617],{"href":12951,"rel":14616},[108],"Change Request"," must be submitted.",[19,14620,14621],{},"Example Change Request: Change: Add OEE Dashboard Blueprint to production",[557,14623,14626],{"className":14624,"code":14625,"language":562},[560],"### Environment\n\n- [ ] Staging\n- [x] Production\n\n### Due Date\n\n_No response_\n\n### Change Description\n\nThis PR (\u003CPR_LINK>) adds a new blueprint flow, along with documentation on how to use it with both real-world and simulated data sources.\n\n### Validation Steps\n\n- [ ] Is the Blueprint PR approved?  \n- [ ] Is the blueprint added to the specified environment?  \n- [ ] Is the Blueprint PR documentation updated with the blueprint ID and merged?\n",[542,14627,14625],{"__ignoreMap":75},[19,14629,14630],{},"The issue should include a link to the relevant Pull Request in the Blueprint Library repository where your Blueprint has been published.",[19,14632,14633],{},"Once the Blueprint is reviewed and approved, someone with admin access to FlowFuse will add it to the platform. After it is added, a Blueprint ID will be generated, which should be shared with the Blueprint author.",[239,14635,14637],{"id":14636},"creating-the-blueprint","Creating the Blueprint",[19,14639,14640,14644],{},[1724,14641],{"alt":14642,"dataZoomable":75,"src":14643},"Screenshot of the Blueprint Admin Panel in FlowFuse","\u002Fhandbook\u002Fimages\u002Fdevelopment\u002Fscreenshot-blueprints-admin.png",[2562,14645,14642],{},[504,14647,14648,14653,14656,14659,14662,14665,14668],{},[147,14649,14650,14651,5361],{},"Make sure the Blueprint is published to the ",[542,14652,14038],{},[147,14654,14655],{},"Login to FlowFuse Cloud as an Administrator",[147,14657,14658],{},"Navigate to the Admin Panel",[147,14660,14661],{},"Select the \"Blueprints\" tab",[147,14663,14664],{},"Click \"Create Flow Blueprint\"",[147,14666,14667],{},"Fill in the details of the Blueprint",[147,14669,14670],{},"Click \"Create\"",[2796,14672,14673],{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":75,"searchDepth":76,"depth":76,"links":14675},[14676,14677,14681,14687],{"id":14025,"depth":76,"text":14026},{"id":14054,"depth":76,"text":14055,"children":14678},[14679,14680],{"id":14058,"depth":605,"text":14059},{"id":14075,"depth":605,"text":14076},{"id":14183,"depth":76,"text":14071,"children":14682},[14683,14684,14685,14686],{"id":14186,"depth":605,"text":14187},{"id":14210,"depth":605,"text":14211},{"id":14217,"depth":605,"text":14218},{"id":14251,"depth":605,"text":14252},{"id":14266,"depth":76,"text":14267,"children":14688},[14689,14690],{"id":2039,"depth":605,"text":7815},{"id":10679,"depth":605,"text":7812},{},"\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fblueprints",{"title":13995,"description":14005},"handbook\u002Fengineering\u002Fproduct\u002Fblueprints","kUjvSlAY2eOqOwHHkmHnvUPO4hF7R-hcaEJ5R511hTc",{"id":14697,"title":14698,"body":14699,"description":14746,"extension":81,"meta":14747,"navGroup":83,"navOrder":83,"navTitle":14748,"navigation":84,"path":14749,"seo":14750,"stem":14751,"__hash__":14752},"handbook\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fdashboard.md","Node-RED Dashboard 2.0 - Project",{"type":7,"value":14700,"toc":14742},[14701,14704,14713,14717,14720,14729,14733],[10,14702,14698],{"id":14703},"node-red-dashboard-20-project",[19,14705,14706,14707,14712],{},"The Node-RED Dashboard, a vital tool for creating live dashboards and user interfaces for Node-RED flows, is to be succeeded due to its reliance on the no-longer-maintained Angular v1. This outdated foundation presents potential security issues that cannot be addressed with mere patches. To counter this, FlowFuse has launched a ",[46,14708,14711],{"href":14709,"rel":14710},"https:\u002F\u002Fflowfuse.com\u002Fblog\u002F2024\u002F01\u002Fdashboard-2-ga\u002F",[108],"new Version of the Dashbaord",". It will maintain the core principles of open-source, community-driven development under the Apache 2.0 license, and is designed to safely usher the Node-RED community into the future of data visualization.",[14,14714,14716],{"id":14715},"release-cadence-planning","Release Cadence & Planning",[19,14718,14719],{},"We are committed to delivering high-quality, incremental updates to the Node-RED Dashboard 2.0. We follow Agile methodology, releasing features as soon as they're fully developed and tested.",[19,14721,14722,14723,14728],{},"We encourage contributions from the community, whether it's in the form of feature suggestions, code contributions, or bug reports. Our GitHub ",[46,14724,14727],{"href":14725,"rel":14726},"https:\u002F\u002Fgithub.com\u002Forgs\u002FFlowFuse\u002Fprojects\u002F15",[108],"Dashboard Activity Tracker"," serves as the central hub for tracking progress and collaboration.",[14,14730,14732],{"id":14731},"monetization","Monetization",[19,14734,14735,14736,14741],{},"We adopted the open-core strategy, meaning all features from the former dashboard, along with other enhancements, will be available as described under the Apache 2.0 license. Additionally, an enterprise extension of the dashboard is offered, with features tailored to suit Personalised Multi-user Dashboards. See the ",[46,14737,14740],{"href":14738,"rel":14739},"https:\u002F\u002Fflowfuse.com\u002Fblog\u002F2024\u002F01\u002Fdashboard-2-multi-user\u002F",[108],"release blogpost"," for more details. This arrangement acknowledges that individuals with higher positions within an organization often have unique needs and demands.",{"title":75,"searchDepth":76,"depth":76,"links":14743},[14744,14745],{"id":14715,"depth":76,"text":14716},{"id":14731,"depth":76,"text":14732},"The Node-RED Dashboard, a vital tool for creating live dashboards and user interfaces for Node-RED flows, is to be succeeded due to its reliance on the no-longer-maintained Angular v1. This outdated foundation presents potential security issues that cannot be addressed with mere patches. To counter this, FlowFuse has launched a new Version of the Dashbaord. It will maintain the core principles of open-source, community-driven development under the Apache 2.0 license, and is designed to safely usher the Node-RED community into the future of data visualization.",{},"Node-RED Dashboard","\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fdashboard",{"title":14698,"description":14746},"handbook\u002Fengineering\u002Fproduct\u002Fdashboard","71wYEDcILxFfKR3dPcHWteWWAC_SW8TN5r1t5OvprgY",{"id":14754,"title":14755,"body":14756,"description":14763,"extension":81,"meta":14901,"navGroup":83,"navOrder":83,"navTitle":11664,"navigation":84,"path":11663,"seo":14902,"stem":14903,"__hash__":14904},"handbook\u002Fhandbook\u002Fengineering\u002Fproduct\u002Ffeedback.md","Product Feedback",{"type":7,"value":14757,"toc":14893},[14758,14761,14764,14767,14771,14774,14778,14781,14786,14795,14799,14802,14805,14828,14831,14839,14842,14845,14849,14852,14855,14859,14862,14865],[10,14759,14755],{"id":14760},"product-feedback",[19,14762,14763],{},"Product feedback provides invaluable insight into our product's strengths and areas for improvement. It forms the basis of our strategic product planning and the actions we undertake to refine our product. It's the voice of our customers, colleagues, and stakeholders, which serves as a guiding light to drive our innovation and adaptation. Feedback helps us ensure that we stay in tune with the evolving needs of our customers and the changing dynamics of the market, ultimately driving our product towards excellence and our company towards success.",[19,14765,14766],{},"FlowFuse is fortunate to have a community the size of the Node-RED community. The product organization should constantly be in touch with the community to understand their challenges, current solutions, and to learn why they have or haven't adopted FlowFuse.",[14,14768,14770],{"id":14769},"feedback-gathering","Feedback Gathering",[19,14772,14773],{},"Feedback collection is a crucial part of our product management process, and there are various methods we use to ensure we gather a wide array of perspectives.",[164,14775,14777],{"id":14776},"customer-calls","Customer calls",[19,14779,14780],{},"Direct communication with customers is one of the most valuable ways of gaining feedback. Customer calls provide us with rich, qualitative data, and allow us to probe deeper into issues, understanding not only what the problems are, but why they exist and how they impact the customer's experience.",[19,14782,14783,14784,549],{},"Record customer feedback calls using Fathom per the ",[46,14785,720],{"href":719},[19,14787,14788,14789,14794],{},"For each call document all the learnings to share internally, to start; make a\ncopy of ",[46,14790,14793],{"href":14791,"rel":14792},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1_gya2WZTJW0G2CxlsJguLDCJI3eHRILJzd9ICsn5QTs",[108],"this template","\nand roughly follow the questions listed.",[164,14796,14798],{"id":14797},"support-tickets","Support Tickets",[19,14800,14801],{},"One very valuable form of feedback is support tickets, where customers tell us the specific issues they are experiencing. To facilitate gathering feedback from support tickets, we categorize each ticket we receive.",[19,14803,14804],{},"When interacting with a support ticket for the first time, the person who opens the ticket selects a Category for the ticket in the About This Ticket section. The categories are:",[144,14806,14807,14810,14813,14816,14819,14822,14825],{},[147,14808,14809],{},"Product Issue: for tickets about FlowFuse, fit for a particular use case, and product issues not related to something not working as expected. (Those are covered in the category Product Performance Issue.)",[147,14811,14812],{},"Billing Issue: for problems with billing and cancellation\u002Frefund requests.",[147,14814,14815],{},"Feature Request: for feature requests.",[147,14817,14818],{},"General Inquiry: for tickets not covered by any of the other ticket types.",[147,14820,14821],{},"Product Performance Issue: for problems with the performance of particular features.",[147,14823,14824],{},"Dashboard Issue: for issues specifically with Dashboard.",[147,14826,14827],{},"How-To Question: for tickets about how to do something with FlowFuse or Node-RED.",[19,14829,14830],{},"When a user asks to cancel their subscription, follow this process:",[504,14832,14833,14836],{},[147,14834,14835],{},"Categorize their ticket as Billing Issue.",[147,14837,14838],{},"Solicit feedback about why they would like to cancel.",[19,14840,14841],{},"To facilitate (2), a Snippet has been created in HubSpot. In the Comment area in the open ticket, select Insert, Snippets, and 'User wants to cancel\u002Fdelete team.'",[19,14843,14844],{},"Users who delete their FlowFuse account are automatically sent a survey through HubSpot.",[164,14846,14848],{"id":14847},"linkedin-polls","LinkedIn Polls",[19,14850,14851],{},"LinkedIn provides a valuable platform for gathering feedback. Creating polls on LinkedIn can provide us with quick, quantitative feedback on specific features or proposed changes. This method also helps us to reach out to a wider network that includes not just our customers, but also industry peers and influencers.",[19,14853,14854],{},"The Product Manager should set up a minimum of one poll every six months, to collect feedback based on the upcoming strategic issues.",[164,14856,14858],{"id":14857},"node-red-community","Node-RED Community",[19,14860,14861],{},"We are privileged to be part of a vibrant community such as Node-RED, where our product organization can constantly learn and understand user challenges and solutions, as well as the reasons behind the adoption or non-adoption of FlowFuse. This ongoing communication is critical for our growth and improvement.",[19,14863,14864],{},"There are several ways we interact with the Node-RED community:",[144,14866,14867,14874,14880,14887],{},[147,14868,14869],{},[46,14870,14873],{"href":14871,"rel":14872},"https:\u002F\u002Fdiscourse.nodered.org\u002F",[108],"Forum",[147,14875,14876],{},[46,14877,825],{"href":14878,"rel":14879},"https:\u002F\u002Fnodered.org\u002Fslack",[108],[147,14881,14882],{},[46,14883,14886],{"href":14884,"rel":14885},"https:\u002F\u002Fstackoverflow.com\u002Fquestions\u002Ftagged\u002Fnode-red",[108],"Stack Overflow",[147,14888,14889],{},[46,14890,1047],{"href":14891,"rel":14892},"https:\u002F\u002Fgithub.com\u002Fnode-red",[108],{"title":75,"searchDepth":76,"depth":76,"links":14894},[14895],{"id":14769,"depth":76,"text":14770,"children":14896},[14897,14898,14899,14900],{"id":14776,"depth":605,"text":14777},{"id":14797,"depth":605,"text":14798},{"id":14847,"depth":605,"text":14848},{"id":14857,"depth":605,"text":14858},{},{"title":14755,"description":14763},"handbook\u002Fengineering\u002Fproduct\u002Ffeedback","Ug1G_sqkyKUWw-jYsbWi8_KMod7U_wjBkGsih43_T14",{"id":14906,"title":1548,"body":14907,"description":14913,"extension":81,"meta":15108,"navGroup":83,"navOrder":83,"navTitle":1548,"navigation":84,"path":15109,"seo":15110,"stem":15111,"__hash__":15112},"handbook\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fglossary.md",{"type":7,"value":14908,"toc":15090},[14909,14911,14914,14918,14921,14925,14928,14932,14935,14939,14950,14954,14957,14961,14964,14968,14971,14975,14978,14982,14985,14989,14992,15003,15007,15010,15014,15034,15038,15042,15045,15062,15066,15069,15083,15087],[10,14910,1548],{"id":1972},[19,14912,14913],{},"FlowFuse empowers everyone to build custom applications to achieve their business goals.\nThis glossary defines common terms you'll encounter when building solutions that integrate with industrial systems and processes.",[14,14915,14917],{"id":14916},"erp-enterprise-resource-planning","ERP (Enterprise Resource Planning)",[19,14919,14920],{},"Business management software that integrates core processes such as finance, HR, supply chain, and manufacturing.\nERP often connects with MES to provide an end-to-end view of operations.",[14,14922,14924],{"id":14923},"mes-manufacturing-execution-system","MES (Manufacturing Execution System)",[19,14926,14927],{},"A system that monitors, tracks, documents, and controls the process of manufacturing goods on the factory floor.\nIt bridges the gap between enterprise-level planning (ERP) and machine-level control (SCADA\u002FPLC).",[14,14929,14931],{"id":14930},"oee-overall-equipment-effectiveness","OEE (Overall Equipment Effectiveness)",[19,14933,14934],{},"A key performance indicator that measures the efficiency and effectiveness of manufacturing equipment.\nOEE is the product of Availability * Performance * Quality\nWhile 100% is the ideal, 85% is the generally accepted \"world-class\" benchmark for manufacturers",[164,14936,14938],{"id":14937},"the-three-components-of-oee","The Three Components of OEE:",[144,14940,14941,14944,14947],{},[147,14942,14943],{},"Availability: Measures downtime losses. This is the percentage of time the equipment is actually running when it is scheduled to be. It accounts for all planned and unplanned stops, like equipment breakdowns or changeovers.",[147,14945,14946],{},"Performance: Measures speed losses. This is the percentage of parts produced compared to the ideal maximum speed. It accounts for minor stops and slow cycles that reduce the equipment's output.",[147,14948,14949],{},"Quality: Measures quality losses. This is the percentage of good parts produced out of the total parts produced. It accounts for any defective or rejected parts.",[14,14951,14953],{"id":14952},"scada-supervisory-control-and-data-acquisition","SCADA (Supervisory Control and Data Acquisition)",[19,14955,14956],{},"A software system used to monitor and control industrial processes.\nSCADA provides real-time data, alarms, and reporting for infrastructure such as factories, utilities, and energy systems.\nSCADA, where present, is often used for automated data collection of facilities used in the measurement of OEE.",[14,14958,14960],{"id":14959},"andon","Andon",[19,14962,14963],{},"A visual and\u002For audible alert system used in manufacturing to highlight issues, signal assistance requests, or stop production when problems occur.\nIt improves communication and problem resolution on the shop floor.\nIf run\u002Fstop data generated by an Andon can be captured, it can form part of a reporting system nad OEE calculations.",[14,14965,14967],{"id":14966},"plc-programmable-logic-controller","PLC (Programmable Logic Controller)",[19,14969,14970],{},"An industrial computer designed to operate in harsh environments.\nPLCs are used to automate machinery and processes by executing programmed logic.\nIn cases where automated downtime recording is required, the PLC might incorporate specific logic for indicating the state of the machine.",[14,14972,14974],{"id":14973},"mqtt-message-queuing-telemetry-transport","MQTT (Message Queuing Telemetry Transport)",[19,14976,14977],{},"A lightweight messaging protocol often used for IoT and industrial applications to transfer data from sensors and machines.\nMQTT is becoming more common and can be found in PLCs meaning data collection can be greatly simplified.",[14,14979,14981],{"id":14980},"tpm-total-productive-maintenance","TPM (Total Productive Maintenance)",[19,14983,14984],{},"A maintenance strategy focused on improving equipment reliability by involving operators in routine maintenance, reducing downtime, and preventing failures.",[14,14986,14988],{"id":14987},"lean-manufacturing","Lean Manufacturing",[19,14990,14991],{},"A production methodology that aims to reduce waste, improve efficiency, and deliver more value to customers with fewer resources.\nFoundational tools of Lean Manufacturing include:",[144,14993,14994,14997,15000],{},[147,14995,14996],{},"5S: The 5s methodology uses five terms (Sort, Set in Order, Shine, Standardize, and Sustain) to create a clean, organized, and efficient work environment, which is a critical first step in eliminating waste.",[147,14998,14999],{},"Kaizen: The philosophy of continuous improvement. This approach encourages all employees to make small, incremental changes to processes over time to improve efficiency and quality. It's a key part of lean culture.",[147,15001,15002],{},"Kanban: A visual scheduling system used to manage and limit work in progress (WIP). It signals when to start new work based on demand, helping to achieve a \"just-in-time\" flow and prevent overproduction.",[14,15004,15006],{"id":15005},"six-sigma","Six Sigma",[19,15008,15009],{},"A set of techniques and tools for process improvement, focused on reducing variability and defects in manufacturing.",[164,15011,15013],{"id":15012},"core-principles","Core Principles",[504,15015,15016,15019,15022,15025,15028,15031],{},[147,15017,15018],{},"Customer satisfaction: All efforts are focused on meeting customer requirements and improving their experience.",[147,15020,15021],{},"Process focus: Emphasizes the point that if you fix the process, the output will consistently improve.",[147,15023,15024],{},"Remove variation form the process: Less variation leads to more predictable and reliable results.",[147,15026,15027],{},"Empower people in the process: Six Sigma relies on trained and empowered teams to drive change and maintain improvements.",[147,15029,15030],{},"Data driven decisions: Decisions should be based on facts and analysis. You biggest problem might be chronic losses not major breakdowns. Data and analysis will reveal this.",[147,15032,15033],{},"Continuous improvement: Ongoing, incremental improvements can accumulate to drive significant long-term results and avoid a return to less efficient processes.",[164,15035,15037],{"id":15036},"methodologies","Methodologies",[239,15039,15041],{"id":15040},"dmaic","DMAIC",[19,15043,15044],{},"The DMAIC approach is typically used in problem solving when improving existing processes. The five steps are defined as:",[144,15046,15047,15050,15053,15056,15059],{},[147,15048,15049],{},"Define: Identify the problem, goal and requirement.",[147,15051,15052],{},"Measure: Collect data to evaluate improvements.",[147,15054,15055],{},"Analyze: Use the data for understanding the problem.",[147,15057,15058],{},"Improve: Apply improvements to remove the problem.",[147,15060,15061],{},"Control: Control the process so improvements are not lost.",[239,15063,15065],{"id":15064},"dmadv","DMADV",[19,15067,15068],{},"The DMADV approach is typically used when creating a new product or new\u002Foverhauled process. The five steps are defined as:",[144,15070,15071,15073,15075,15077,15080],{},[147,15072,15049],{},[147,15074,15052],{},[147,15076,15055],{},[147,15078,15079],{},"Design: Generate designed for the new product or process.",[147,15081,15082],{},"Verify: Control the process so improvements are not lost.",[14,15084,15086],{"id":15085},"digital-twin","Digital Twin",[19,15088,15089],{},"A virtual representation of a physical asset, process, or system that is used for simulation, monitoring, and optimization.",{"title":75,"searchDepth":76,"depth":76,"links":15091},[15092,15093,15094,15097,15098,15099,15100,15101,15102,15103,15107],{"id":14916,"depth":76,"text":14917},{"id":14923,"depth":76,"text":14924},{"id":14930,"depth":76,"text":14931,"children":15095},[15096],{"id":14937,"depth":605,"text":14938},{"id":14952,"depth":76,"text":14953},{"id":14959,"depth":76,"text":14960},{"id":14966,"depth":76,"text":14967},{"id":14973,"depth":76,"text":14974},{"id":14980,"depth":76,"text":14981},{"id":14987,"depth":76,"text":14988},{"id":15005,"depth":76,"text":15006,"children":15104},[15105,15106],{"id":15012,"depth":605,"text":15013},{"id":15036,"depth":605,"text":15037},{"id":15085,"depth":76,"text":15086},{},"\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fglossary",{"title":1548,"description":14913},"handbook\u002Fengineering\u002Fproduct\u002Fglossary","bwT6fqPobbXPfBlPXS_ZAz0CU4v1dt5PDnWUsD8U4OI",{"id":15114,"title":11640,"body":15115,"description":15121,"extension":81,"meta":15275,"navGroup":83,"navOrder":83,"navTitle":11640,"navigation":84,"path":11650,"seo":15276,"stem":15277,"__hash__":15278},"handbook\u002Fhandbook\u002Fengineering\u002Fproduct\u002Findex.md",{"type":7,"value":15116,"toc":15271},[15117,15119,15122,15137,15141,15216,15220],[10,15118,11640],{"id":11639},[19,15120,15121],{},"The product function, and Product Managers (PM) by extension, are responsible for:",[504,15123,15124,15127,15130],{},[147,15125,15126],{},"Understanding and communicating the problem of our users and customers.",[147,15128,15129],{},"Defining requirements for a solution that is loved by our users, customers and the community.",[147,15131,15132,15133,15136],{},"Continuously aligning the product strategy with FlowFuse's core ",[46,15134,15135],{"href":7052},"strategic objectives",", ensuring not only that the product meets current market demands but also anticipates future trends.",[14,15138,15140],{"id":15139},"core-tasks-and-responsibilities","Core tasks and responsibilities",[910,15142,15143,15153],{},[913,15144,15145],{},[916,15146,15147,15150],{},[919,15148,15149],{},"Task",[919,15151,15152],{},"Description",[930,15154,15155,15165,15173,15181,15189,15197,15208],{},[916,15156,15157,15162],{},[935,15158,15159],{},[46,15160,15161],{"href":11657},"Maintain and Update Product Strategy",[935,15163,15164],{},"The PM is responsible for maintaining and updating the product strategy to ensure alignment with the company's goals and market demands.",[916,15166,15167,15170],{},[935,15168,15169],{},"Release Planning for Every Milestone",[935,15171,15172],{},"The PM is the DRI (Directly Responsible Individual) for planning and prioritizing work for the engineering group.",[916,15174,15175,15178],{},[935,15176,15177],{},"Create Release Changelog Entries",[935,15179,15180],{},"The changelog is the way to broadcast what features have been released. The PM is responsible for ensuring that changelog items are created, reviews are complete, and posts are made.",[916,15182,15183,15186],{},[935,15184,15185],{},"Connect User and Customer Insights with Product Prioritization",[935,15187,15188],{},"The PM is responsible for conducting customer interviews, collecting insights about customer adoption and pain points, and reprioritizing the \"Backlog\" and \"Roadmap\". The goal is to continuously refine the most important features, bugs, and technical debt to ensure market relevance.",[916,15190,15191,15194],{},[935,15192,15193],{},"Triage New Issues (features, bugs, security vulnerabilities, etc.)",[935,15195,15196],{},"The PM is responsible for prioritizing the most important issues based on the type of work.",[916,15198,15199,15202],{},[935,15200,15201],{},"Determine Pricing Tier for Features",[935,15203,15204,15205,549],{},"While the CEO and Sales team handle pricing, the PM is responsible for determining which features belong to specific ",[46,15206,15207],{"href":11670},"tiers",[916,15209,15210,15213],{},[935,15211,15212],{},"Product-Related Decisions",[935,15214,15215],{},"The PM is responsible for making strategic decisions that shape the overall direction of the product.",[14,15217,15219],{"id":15218},"how-product-works","How product works",[144,15221,15222,15226,15230,15236,15240,15244,15250,15256,15261,15265],{},[147,15223,15224],{},[46,15225,1548],{"href":15109},[147,15227,15228],{},[46,15229,11664],{"href":11663},[147,15231,15232],{},[46,15233,15235],{"href":15234},"\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fverticals","Product Categories",[147,15237,15238],{},[46,15239,6717],{"href":11657},[147,15241,15242],{},[46,15243,11671],{"href":11670},[147,15245,15246],{},[46,15247,15249],{"href":15248},"\u002Fhandbook\u002Fengineering\u002Fproject-management#feature-demos","Feature Demos",[147,15251,15252],{},[46,15253,15255],{"href":15254},"\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fversioning","Versioning",[147,15257,15258],{},[46,15259,272],{"href":15260},"\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fmetrics",[147,15262,15263],{},[46,15264,14748],{"href":14749},[147,15266,15267],{},[46,15268,15270],{"href":15269},"\u002Fhandbook\u002Fengineering\u002Fproduct\u002Ftelemetry","Product Growth",{"title":75,"searchDepth":76,"depth":76,"links":15272},[15273,15274],{"id":15139,"depth":76,"text":15140},{"id":15218,"depth":76,"text":15219},{},{"title":11640,"description":15121},"handbook\u002Fengineering\u002Fproduct\u002Findex","6wChawoEmca1fzWk22EyjbedkzB0mOk5H_F-Yh55x4Y",{"id":15280,"title":15281,"body":15282,"description":15289,"extension":81,"meta":15443,"navGroup":83,"navOrder":83,"navTitle":272,"navigation":84,"path":15260,"seo":15444,"stem":15445,"__hash__":15446},"handbook\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fmetrics.md","Product Metrics",{"type":7,"value":15283,"toc":15438},[15284,15287,15290,15296,15298,15302,15310,15314,15322,15326,15329,15332,15337,15340,15348,15352,15355,15431],[10,15285,15281],{"id":15286},"product-metrics",[19,15288,15289],{},"Our ongoing mission is to enable data-driven decision-making, facilitating strategic product development and enhancing user experience. To achieve this, we focus on specific product metrics that illuminate user behavior, feature adoption, and overall product performance.",[19,15291,15292,15293,549],{},"This handbook page provides an overview of the metrics we concentrate on, and how they contribute to our overall ",[46,15294,15295],{"href":11657},"product strategy",[14,15297,5],{"id":12},[239,15299,15301],{"id":15300},"data-driven-decision-making","Data-driven decision making",[19,15303,15304,15305,15309],{},"Aligned with our value of ",[46,15306,15308],{"href":15307},"\u002Fhandbook\u002Fcompany\u002Fvalues#%F0%9F%93%88-results","Results",", we are staunch advocates for data-driven decision-making. Instead of relying on assumptions or rushing decisions, we let data guide our actions to drive results. This doesn't mean we become paralyzed in the absence of data. Our Iterative Improvement and Bias for Action values remind us that it's crucial to keep moving forward, even when perfect data isn't available. We balance careful analysis with swift action, using the best information available to us at any given moment.",[239,15311,15313],{"id":15312},"continuous-learning-and-improvement","Continuous learning and improvement",[19,15315,15316,15317,15321],{},"Consistent with ",[46,15318,15320],{"href":15319},"\u002Fhandbook\u002Fcompany\u002Fvalues#%F0%9F%94%81-iterative-improvement","Iterative Improvement",", we believe even the smallest changes can contribute to our growth. We're committed to consistently reassessing, learning, and evolving based on the insights our data provides.",[14,15323,15325],{"id":15324},"leading-product-metric","Leading Product Metric",[19,15327,15328],{},"The cornerstone of our department's evaluation is encapsulated in the Leading Product Metric, namely the Weighted Customer Index (WCI). This metric serves as our North Star, guiding strategic decisions and operational improvements. The WCI is calculated to reflect the value and distribution of our customer base across different product tiers.",[19,15330,15331],{},"The formula for calculating the WCI is as follows:",[19,15333,15334],{},[542,15335,15336],{},"Weighted Customer Index = Number of Starter Tier customers + (Number of Teams Tier customers * 4) + (Number of Enterprise Tier customers * 8)",[19,15338,15339],{},"This metric is designed to reflect the relative value of different customer segments to the organization, with higher tiers of customers being weighted more heavily due to their greater impact on revenue and strategic value.",[19,15341,15342,15343,549],{},"The metric can be found ",[46,15344,15347],{"href":15345,"rel":15346},"https:\u002F\u002Fnew-product-metrics.flowfuse.cloud\u002Fdashboard\u002Fproduct",[108],"on this dashboard",[14,15349,15351],{"id":15350},"available-metrics","Available Metrics",[19,15353,15354],{},"Each metric we track provides unique insights into different facets of our product. These metrics validate or disprove product hypotheses, guide product development, and assist in informed decision-making regarding feature improvements. The ultimate goal is always to create a product that fulfills the needs and preferences of our users. Here is a list of the current key metrics we track:",[504,15356,15357,15363,15374,15385,15396,15407,15413,15419,15425],{},[147,15358,15359,15362],{},[423,15360,15361],{},"Applications with Multiple Instances",": Applications were designed to group Node-RED instances for enhanced organization, thus serving as a foundational element for numerous other features.",[147,15364,15365,15368,15369,15373],{},[423,15366,15367],{},"High Availability Adoption Rate",": This metric quantifies the proportion of active instances with activated ",[46,15370,15372],{"href":15371},"\u002Fdocs\u002Fuser\u002Fhigh-availability\u002F","High Availability (HA)",". It's calculated by dividing the number of HA instances by the total number of active instances.",[147,15375,15376,15379,15380,15384],{},[423,15377,15378],{},"Overall Pipeline Adoption Rate",": This metric illustrates the degree of ",[46,15381,15383],{"href":15382},"\u002Fdocs\u002Fuser\u002Fdevops-pipelines\u002F","pipeline"," adoption relative to applications, calculated by dividing the total number of pipelines by the total number of applications.",[147,15386,15387,15390,15391,15395],{},[423,15388,15389],{},"Snapshot Adoption Rate",": This rate evaluates the prevalence of active instances using one or more ",[46,15392,15394],{"href":15393},"\u002Fdocs\u002Fuser\u002Fsnapshots\u002F","snapshots",". It's determined by dividing the number of active instances with one or more snapshots by the total number of active instances.",[147,15397,15398,15401,15402,15406],{},[423,15399,15400],{},"Device Adoption Rate",": This metric demonstrates the rate at which teams adopt ",[46,15403,15405],{"href":15404},"\u002Fdocs\u002Fdevice-agent\u002Fintroduction\u002F","devices",", determined by dividing the number of teams with one or more devices by the total number of teams.",[147,15408,15409,15412],{},[423,15410,15411],{},"Weekly Active Users",": This fundamental metric provides insight into the overall usage and engagement with our product on a weekly basis.",[147,15414,15415,15418],{},[423,15416,15417],{},"Trial Effectiveness",": Percentage of users who started a free trial on FlowFuse Cloud and provided credit card details during or after the trial.",[147,15420,15421,15424],{},[423,15422,15423],{},"Teams Tier Overview",": Number of teams in each tier of FlowFuse Cloud.",[147,15426,15427,15430],{},[423,15428,15429],{},"Churn",": Percentage of deleted teams on FlowFuse Cloud for each tier in the last 14 days.",[19,15432,15433,15434,549],{},"All metrics can be found ",[46,15435,2011],{"href":15436,"rel":15437},"https:\u002F\u002Fproduct-metrics.flowforge.cloud\u002Fui\u002F#!\u002F0?socketid=eqAkzz9g64b4fhnSAAGx",[108],{"title":75,"searchDepth":76,"depth":76,"links":15439},[15440,15441,15442],{"id":12,"depth":76,"text":5},{"id":15324,"depth":76,"text":15325},{"id":15350,"depth":76,"text":15351},{},{"title":15281,"description":15289},"handbook\u002Fengineering\u002Fproduct\u002Fmetrics","spn7PuicXcPZDDldAiRLHAgResmjuKCzArTB4rqClvQ",{"id":15448,"title":15449,"body":15450,"description":15457,"extension":81,"meta":16751,"navGroup":83,"navOrder":83,"navTitle":15449,"navigation":84,"path":8445,"seo":16752,"stem":16753,"__hash__":16754},"handbook\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fpersonas\u002Findex.md","Personas",{"type":7,"value":15451,"toc":16735},[15452,15455,15458,15461,15473,15476,15480,15486,15502,15510,15526,15532,15541,15545,15548,15574,15578,15581,15586,15606,15611,15628,15633,15650,15654,15657,15662,15679,15684,15701,15706,15723,15727,15731,15751,15754,15790,15794,15820,15824,15827,15841,15845,15849,16021,16025,16177,16181,16334,16338,16536,16540,16705,16709,16715],[10,15453,15449],{"id":15454},"personas",[19,15456,15457],{},"Personas are fictional characters that represent the different users we expect to interact with FlowFuse as a brand and\u002For platform. Personas are a generalized way of talking about the ideal target we are aiming to communicate with and design for.",[19,15459,15460],{},"Personas help us not only define our messaging and marketing delivery, but also our product. Keeping personas in mind allows us to use the correct language and make the best decisions to address their specific problems and pain points.",[19,15462,15463,15464,15468,15469,15472],{},"As outlined in our ",[46,15465,15467],{"href":15466},"\u002Fhandbook\u002Fmarketing\u002Fbrand-voice\u002F","brand voice",", FlowFuse serves as ",[423,15470,15471],{},"a trusted partner for industrial engineers and developers navigating digital transformation",". We position ourselves as \"the engineer's enabler — technical enough to be respected, accessible enough to be adopted.\" This approach ensures our communication is aligned, consistent, and memorable across all organizational levels.",[19,15474,15475],{},"Our personas are structured around three strategic layers that reflect the typical FlowFuse adoption journey, with each layer playing distinct roles in the decision-making process:",[1019,15477,15479],{"id":15478},"three-layer-sales-structure","Three-Layer Sales Structure",[19,15481,15482,15485],{},[423,15483,15484],{},"Layer 1 - Users (End-users & Advocates)","\nFlowFuse serves as their reliable, technically-grounded partner for daily operational challenges.",[144,15487,15488,15495],{},[147,15489,15490,15494],{},[46,15491,15493],{"href":15492},"#peter%2C-automation-and-controls-engineer","Peter Automation and Controls Engineer"," - Uses Node-RED, MQTT, and industrial protocols",[147,15496,15497,15501],{},[46,15498,15500],{"href":15499},"#sarah%2C-process-engineer","Sarah Process Engineer"," - Works with data and industrial processes",[19,15503,15504,15507,15509],{},[423,15505,15506],{},"Layer 2 - Champions (Technical Influencers & Evaluators)",[9379,15508],{},"\nFlowFuse demonstrates value through practical, straightforward solutions that address real business needs.",[144,15511,15512,15519],{},[147,15513,15514,15518],{},[46,15515,15517],{"href":15516},"#steve%2C-plant-engineer","Steve Plant Engineer"," - Needs convincing through proven results and clear ROI",[147,15520,15521,15525],{},[46,15522,15524],{"href":15523},"#isabella%2C-iiot-project-lead","Isabella IIoT Project Lead"," - IT\u002FOT bridge seeking dependable platform for digital transformation",[19,15527,15528,15531],{},[423,15529,15530],{},"Layer 3 - Buyers (Economic Decision-Makers)","\nFlowFuse provides transparent, enterprise-ready solutions with measurable impact on business outcomes.",[144,15533,15534],{},[147,15535,15536,15540],{},[46,15537,15539],{"href":15538},"#paul%2C-plant-manager","Paul Plant Manager"," - Final decision maker focused on operational efficiency and innovation",[239,15542,15544],{"id":15543},"layer-interactions-influence-flow","Layer Interactions & Influence Flow",[19,15546,15547],{},"The personas influence each other in a structured flow that mirrors typical B2B technology adoption:",[144,15549,15550,15556,15562,15568],{},[147,15551,15552,15555],{},[423,15553,15554],{},"Users → Champions",": End-users like Peter and Sarah identify operational challenges and advocate for solutions to their engineering managers. Their hands-on experience and technical credibility make them powerful advocates for FlowFuse's capabilities.",[147,15557,15558,15561],{},[423,15559,15560],{},"Champions → Buyers",": Technical influencers like Steve and Isabella evaluate solutions, build business cases, and present recommendations to executive decision-makers. They translate technical benefits into business value propositions.",[147,15563,15564,15567],{},[423,15565,15566],{},"Buyers ← → Champions",": Decision-makers like Paul rely on champions for technical validation while providing budget authority and strategic direction. This bidirectional relationship ensures alignment between technical capabilities and business objectives.",[147,15569,15570,15573],{},[423,15571,15572],{},"Cross-layer Communication",": Users often directly influence buyers through demonstration of results and ROI, while buyers set constraints and requirements that flow down to champions and users.",[239,15575,15577],{"id":15576},"sales-funnel-stages-by-layer","Sales Funnel Stages by Layer",[19,15579,15580],{},"Each persona layer engages with FlowFuse at different stages of the sales funnel:",[19,15582,15583],{},[423,15584,15585],{},"Awareness Stage",[144,15587,15588,15594,15600],{},[147,15589,15590,15593],{},[423,15591,15592],{},"Users",": Discover FlowFuse through technical communities, Node-RED forums, industrial automation conferences",[147,15595,15596,15599],{},[423,15597,15598],{},"Champions",": Learn about FlowFuse through industry publications, vendor evaluations, peer networks",[147,15601,15602,15605],{},[423,15603,15604],{},"Buyers",": Become aware through business publications, executive briefings, strategic planning sessions",[19,15607,15608],{},[423,15609,15610],{},"Consideration Stage",[144,15612,15613,15618,15623],{},[147,15614,15615,15617],{},[423,15616,15592],{},": Evaluate technical capabilities, test integrations, assess ease of implementation",[147,15619,15620,15622],{},[423,15621,15598],{},": Analyze business impact, compare alternatives, build ROI calculations",[147,15624,15625,15627],{},[423,15626,15604],{},": Review strategic alignment, assess vendor stability, evaluate total cost of ownership",[19,15629,15630],{},[423,15631,15632],{},"Decision Stage",[144,15634,15635,15640,15645],{},[147,15636,15637,15639],{},[423,15638,15592],{},": Provide technical validation and implementation feedback",[147,15641,15642,15644],{},[423,15643,15598],{},": Present business cases and recommendations to decision-makers",[147,15646,15647,15649],{},[423,15648,15604],{},": Make final purchasing decisions based on business value and risk assessment",[239,15651,15653],{"id":15652},"marketing-materials-by-layer","Marketing Materials by Layer",[19,15655,15656],{},"Each persona layer requires targeted content that addresses their specific needs and decision-making criteria:",[19,15658,15659],{},[423,15660,15661],{},"Users (End-users & Advocates)",[144,15663,15664,15667,15670,15673,15676],{},[147,15665,15666],{},"Technical documentation and integration guides",[147,15668,15669],{},"Video tutorials and how-to content",[147,15671,15672],{},"Community forum discussions and peer testimonials",[147,15674,15675],{},"Hands-on trial experiences and sandbox environments",[147,15677,15678],{},"Technical webinars and training sessions",[19,15680,15681],{},[423,15682,15683],{},"Champions (Technical Influencers & Evaluators)",[144,15685,15686,15689,15692,15695,15698],{},[147,15687,15688],{},"ROI calculators and business case templates",[147,15690,15691],{},"Comparative analysis and competitive positioning",[147,15693,15694],{},"Solution architecture diagrams and technical specifications",[147,15696,15697],{},"Case studies demonstrating measurable business outcomes",[147,15699,15700],{},"Proof-of-concept implementation guides",[19,15702,15703],{},[423,15704,15705],{},"Buyers (Economic Decision-Makers)",[144,15707,15708,15711,15714,15717,15720],{},[147,15709,15710],{},"Executive briefings and strategic whitepapers",[147,15712,15713],{},"Total cost of ownership (TCO) analyses",[147,15715,15716],{},"Vendor stability and roadmap documentation",[147,15718,15719],{},"Security and compliance certifications",[147,15721,15722],{},"Customer success stories from similar organizations",[14,15724,15726],{"id":15725},"persona-template","Persona Template",[164,15728,15730],{"id":15729},"profile","Profile",[144,15732,15733,15739,15745],{},[147,15734,15735,15738],{},[423,15736,15737],{},"Name",": Naming your Persona is very important to increase empathy with them. Having them named is shown to make relating to their situation easier to do, and result in better product decisions.",[147,15740,15741,15744],{},[423,15742,15743],{},"Picture",": What does the persona look like? Choose a realistic and believable picture.",[147,15746,15747,15750],{},[423,15748,15749],{},"Age",": Choose a realistic age for the persona, this can also be a range if needs be, but try to keep it fairly precise.",[164,15752,15753],{"id":4381},"Details",[144,15755,15756,15762,15768,15778,15784],{},[147,15757,15758,15761],{},[423,15759,15760],{},"Occupation",": What is their professional occupation? This doesn't have to correlate directly to why they're a Persona, but can play a very important role defining them.",[147,15763,15764,15767],{},[423,15765,15766],{},"Purchasing Role",": Where in the hierarchy of a purchasing decision do they sit, and to what scale could we expect such a decision to bring in financially?",[147,15769,15770,15773,15774,15777],{},[423,15771,15772],{},"Technical Skillset",": This is a FlowFuse-specific characteristic we've introduced for our Personas. It's important as a low-code platform to consider technical skillsets, that developers or those in the technical industry such as ourselves may take for granted, and even ",[2562,15775,15776],{},"how"," they've learned their technical skillset, should they have one.",[147,15779,15780,15783],{},[423,15781,15782],{},"Node-RED Experience",": Another FlowFuse-specific detail. This helps us frame the sales\u002Fmarketing strategy for this Persona, and will also frame explanations of what FlowFuse is and does.",[147,15785,15786,15789],{},[423,15787,15788],{},"Additional information",": A catch-all for any other remarks or comments to be made for the persona.",[164,15791,15793],{"id":15792},"behaviours","Behaviours",[144,15795,15796,15802,15808,15814],{},[147,15797,15798,15801],{},[423,15799,15800],{},"Interests",": What personal and professional interests does this person have?",[147,15803,15804,15807],{},[423,15805,15806],{},"Motivations",": Why does this persona do what they do? What drives them?",[147,15809,15810,15813],{},[423,15811,15812],{},"Influences",": Where do they get their opinions from? What sources of information influence their own decision making?",[147,15815,15816,15819],{},[423,15817,15818],{},"Needs & Expectations",": What does this persona need in their day-to-day life to help them? What are their baseline expectiations for what \"good\" or \"valuable\" looks like?",[164,15821,15823],{"id":15822},"goals","Goals",[19,15825,15826],{},"What problem does the persona want to solve, or which benefit does the character seek? Why would the persona want to use or buy FlowFuse?",[144,15828,15829,15835],{},[147,15830,15831,15834],{},[423,15832,15833],{},"Job To Be Done",": In the context of the persona, what are they trying to achieve?",[147,15836,15837,15840],{},[423,15838,15839],{},"Challenges",": What are their regular blockers and pain points when trying to work towards their goals?",[14,15842,15844],{"id":15843},"persona-profiles","Persona Profiles",[164,15846,15848],{"id":15847},"paul-plant-manager","Paul, Plant Manager",[7556,15850,7566,15853,7566,15934],{"className":15851},[15852,7685,8455,8456,8457,8458,8459,7559,7561],"persona-card",[7556,15854,7696,15859,7696,15880,7566],{"className":15855},[7559,15856,8465,8466,15857,15858],"gap-6","pb-3","w-full",[7556,15860,7940,15866,7940,15870,7940,15876,7696],{"className":15861},[15862,8463,15863,8464,15864,15865],"w-48","pr-6","border-r-2","border-teal-400",[1724,15867],{"className":15868,"src":15869},[15858,7685,8458,8471,7688],"..\u002F..\u002F..\u002Fimages\u002Fpersonas\u002Fpaul.jpg",[8474,15871,15875],{"className":15872},[8477,8478,15873,15874],"font-medium","text-2xl","Paul",[8474,15877,15879],{"className":15878},[8477],"Plant Manager",[7556,15881,7940,15883,7940,15892,7940,15902,7940,15913,7940,15924,7696],{"className":15882},[8463],[7556,15884,8487,15886,8487,15889,7940],{"className":15885},[7559,7561],[8474,15887,8491],{"className":15888},[8479],[2403,15890,8728],{"className":15891},[8495],[7556,15893,8487,15895,8487,15898,7940],{"className":15894},[7559,7561,8500],[8474,15896,8504],{"className":15897},[8479],[2403,15899,15901],{"className":15900},[8495],"Plant Manager\u002FExec, Manufacturing Inc.",[7556,15903,8487,15905,8487,15909,7940],{"className":15904},[7559,7561,8500],[8474,15906,15908],{"className":15907},[8479],"Purchasing Role:",[2403,15910,15912],{"className":15911},[8495],"Final Decision Maker, Architect. >$50k. High Influence",[7556,15914,8487,15916,8487,15920,7940],{"className":15915},[7559,7561,8500],[8474,15917,15919],{"className":15918},[8479],"Technical Skillset:",[2403,15921,15923],{"className":15922},[8495],"Mechanical Engineering, MEng",[7556,15925,8487,15927,8487,15930,7940],{"className":15926},[7559,7561,8500],[8474,15928,8526],{"className":15929},[8479],[2403,15931,15933],{"className":15932},[8495],"Never heard of it",[7556,15935,7696,15938,7696,15959,7696,15977,7696,15993,7696,16007,7566],{"className":15936},[15937],"pt-3",[7556,15939,7940,15941,7940,15945,7696],{"className":15940},[7559,7561],[8474,15942,15944],{"className":15943},[8479],"Job to be done:",[144,15946,8487,15947,8487,15950,8487,15953,8487,15956,7940],{},[147,15948,15949],{},"Responsible for the overall production and profit of the products",[147,15951,15952],{},"Sets guidelines for investments and serves as the final decision-making authority",[147,15954,15955],{},"Responsible for growth of the plant",[147,15957,15958],{},"Ongoing investment planning and budget setting for new machines and new employees",[7556,15960,7940,15962,7940,15966,7696],{"className":15961},[7559,7561],[8474,15963,15965],{"className":15964},[8479],"Motivations:",[144,15967,8487,15968,8487,15971,8487,15974,7940],{},[147,15969,15970],{},"Wants the factory to run smoothly",[147,15972,15973],{},"Wants to improve the economic and future situation of the plant",[147,15975,15976],{},"Data & facts",[7556,15978,7940,15980,7940,15983,7696],{"className":15979},[7559,7561],[8474,15981,15982],{},"Influences:",[144,15984,8487,15985,8487,15988,8487,15991,7940],{},[147,15986,15987],{},"Conferences",[147,15989,15990],{},"LinkedIn",[147,15992,4401],{},[7556,15994,7940,15996,7940,15999,7696],{"className":15995},[7559,7561],[8474,15997,15998],{},"Needs & Expectations:",[144,16000,8487,16001,8487,16004,7940],{},[147,16002,16003],{},"Easy access to reporting",[147,16005,16006],{},"Transparency",[7556,16008,7940,16010,7940,16013,7696],{"className":16009},[7559,7561],[8474,16011,16012],{},"Biggest Challenges:",[144,16014,8487,16015,8487,16018,7940],{},[147,16016,16017],{},"Creating an innovative factory",[147,16019,16020],{},"Improve the economic situation",[164,16022,16024],{"id":16023},"steve-plant-engineer","Steve, Plant Engineer",[7556,16026,7566,16028,7566,16098],{"className":16027},[15852,7685,8455,8456,8457,8458,8459,7559,7561],[7556,16029,7696,16031,7696,16046,7566],{"className":16030},[7559,15856,8465,8466,15857,15858],[7556,16032,7940,16034,7940,16038,7940,16042,7696],{"className":16033},[15862,8463,15863,8464,15864,15865],[1724,16035],{"className":16036,"src":16037},[15858,7685,8458,8471,7688],"..\u002F..\u002F..\u002Fimages\u002Fpersonas\u002Fsteve.jpg",[8474,16039,16041],{"className":16040},[8477,8478,15873,15874],"Steve",[8474,16043,16045],{"className":16044},[8477],"Plant Engineer",[7556,16047,7940,16049,7940,16059,7940,16069,7940,16079,7940,16088,7696],{"className":16048},[8463],[7556,16050,8487,16052,8487,16055,7940],{"className":16051},[7559,7561],[8474,16053,8491],{"className":16054},[8479],[2403,16056,16058],{"className":16057},[8495],"46",[7556,16060,8487,16062,8487,16065,7940],{"className":16061},[7559,7561,8500],[8474,16063,8504],{"className":16064},[8479],[2403,16066,16068],{"className":16067},[8495],"Plant Engineer, Manufacturing Inc.",[7556,16070,8487,16072,8487,16075,7940],{"className":16071},[7559,7561,8500],[8474,16073,15908],{"className":16074},[8479],[2403,16076,16078],{"className":16077},[8495],"Decision Maker. >$15k. High Influence",[7556,16080,8487,16082,8487,16085,7940],{"className":16081},[7559,7561,8500],[8474,16083,15919],{"className":16084},[8479],[2403,16086,15923],{"className":16087},[8495],[7556,16089,8487,16091,8487,16094,7940],{"className":16090},[7559,7561,8500],[8474,16092,8526],{"className":16093},[8479],[2403,16095,16097],{"className":16096},[8495],"Knows of it",[7556,16099,7696,16101,7696,16124,7696,16139,7696,16150,7696,16161,7566],{"className":16100},[15937],[7556,16102,7940,16104,7940,16107,7696],{"className":16103},[7559,7561],[8474,16105,15944],{"className":16106},[8479],[144,16108,8487,16109,8487,16112,8487,16115,8487,16118,8487,16121,7940],{},[147,16110,16111],{},"Responsible for the design, production, and maintenance of a line or facility",[147,16113,16114],{},"Sets guidelines for mechanical design of a facility",[147,16116,16117],{},"Responsible for identifying opportunities for increased production",[147,16119,16120],{},"Ongoing investment planning and budget setting for new machines ",[147,16122,16123],{},"Prepares meaningful KPIs together with the production planner",[7556,16125,7940,16127,7940,16130,7696],{"className":16126},[7559,7561],[8474,16128,15965],{"className":16129},[8479],[144,16131,8487,16132,8487,16134,8487,16137,7940],{},[147,16133,15970],{},[147,16135,16136],{},"Downtime Reduction",[147,16138,15976],{},[7556,16140,7940,16142,7940,16144,7696],{"className":16141},[7559,7561],[8474,16143,15982],{},[144,16145,8487,16146,8487,16148,7940],{},[147,16147,15987],{},[147,16149,4401],{},[7556,16151,7940,16153,7940,16155,7696],{"className":16152},[7559,7561],[8474,16154,15998],{},[144,16156,8487,16157,8487,16159,7940],{},[147,16158,16003],{},[147,16160,16006],{},[7556,16162,7940,16164,7940,16166,7696],{"className":16163},[7559,7561],[8474,16165,16012],{},[144,16167,8487,16168,8487,16171,8487,16174,7940],{},[147,16169,16170],{},"Predictive Maintenance",[147,16172,16173],{},"Downtime Reporting",[147,16175,16176],{},"Process Visibility",[164,16178,16180],{"id":16179},"sarah-process-engineer","Sarah, Process Engineer",[7556,16182,7566,16184,7566,16253],{"className":16183},[15852,7685,8455,8456,8457,8458,8459,7559,7561],[7556,16185,7696,16187,7696,16202,7566],{"className":16186},[7559,15856,8465,8466,15857,15858],[7556,16188,7940,16190,7940,16194,7940,16198,7696],{"className":16189},[15862,8463,15863,8464,15864,15865],[1724,16191],{"className":16192,"src":16193},[15858,7685,8458,8471,7688],"..\u002F..\u002F..\u002Fimages\u002Fpersonas\u002Fsarah.jpg",[8474,16195,16197],{"className":16196},[8477,8478,15873,15874],"Sarah",[8474,16199,16201],{"className":16200},[8477],"Process Engineer",[7556,16203,7940,16205,7940,16214,7940,16224,7940,16234,7940,16244,7696],{"className":16204},[8463],[7556,16206,8487,16208,8487,16211,7940],{"className":16207},[7559,7561],[8474,16209,8491],{"className":16210},[8479],[2403,16212,8671],{"className":16213},[8495],[7556,16215,8487,16217,8487,16220,7940],{"className":16216},[7559,7561,8500],[8474,16218,8504],{"className":16219},[8479],[2403,16221,16223],{"className":16222},[8495],"Process Engineer, Manufacturing Inc.",[7556,16225,8487,16227,8487,16230,7940],{"className":16226},[7559,7561,8500],[8474,16228,15908],{"className":16229},[8479],[2403,16231,16233],{"className":16232},[8495],"Influencer, user",[7556,16235,8487,16237,8487,16240,7940],{"className":16236},[7559,7561,8500],[8474,16238,15919],{"className":16239},[8479],[2403,16241,16243],{"className":16242},[8495],"Industrial Engineering",[7556,16245,8487,16247,8487,16250,7940],{"className":16246},[7559,7561,8500],[8474,16248,8526],{"className":16249},[8479],[2403,16251,16097],{"className":16252},[8495],[7556,16254,7696,16256,7696,16279,7696,16294,7696,16310,7696,16321,7566],{"className":16255},[15937],[7556,16257,7940,16259,7940,16262,7696],{"className":16258},[7559,7561],[8474,16260,15944],{"className":16261},[8479],[144,16263,8487,16264,8487,16267,8487,16270,8487,16273,8487,16276,7940],{},[147,16265,16266],{},"Responsible for the design",[147,16268,16269],{},"Identify process flow bottle necks",[147,16271,16272],{},"Report on productivity and efficiency of a production line",[147,16274,16275],{},"Identify quality problems and is the quality engineer if one isn't present",[147,16277,16278],{},"Identifies meaningful KPIs and creates them",[7556,16280,7940,16282,7940,16285,7696],{"className":16281},[7559,7561],[8474,16283,15965],{"className":16284},[8479],[144,16286,8487,16287,8487,16289,8487,16292,7940],{},[147,16288,15970],{},[147,16290,16291],{},"Quality production",[147,16293,15976],{},[7556,16295,7940,16297,7940,16299,7696],{"className":16296},[7559,7561],[8474,16298,15982],{},[144,16300,8487,16301,8487,16304,8487,16307,7940],{},[147,16302,16303],{},"Industry specific Conferences",[147,16305,16306],{},"Peers",[147,16308,16309],{},"Automation and Controls Engineers",[7556,16311,7940,16313,7940,16315,7696],{"className":16312},[7559,7561],[8474,16314,15998],{},[144,16316,8487,16317,8487,16319,7940],{},[147,16318,16003],{},[147,16320,16006],{},[7556,16322,7940,16324,7940,16326,7696],{"className":16323},[7559,7561],[8474,16325,16012],{},[144,16327,8487,16328,8487,16331,7940],{},[147,16329,16330],{},"Data Access",[147,16332,16333],{},"Real Time Analytics",[164,16335,16337],{"id":16336},"isabella-iiot-project-lead","Isabella, IIoT Project Lead",[7556,16339,7566,16341,7566,16412],{"className":16340},[15852,7685,8455,8456,8457,8458,8459,7559,7561],[7556,16342,7696,16344,7696,16359,7566],{"className":16343},[7559,15856,8465,8466,15857,15858],[7556,16345,7940,16347,7940,16351,7696,16355,7696],{"className":16346},[15862,8463,15863,8464,15864,15865],[1724,16348],{"className":16349,"src":16350},[15858,7685,8458,8471,7688],"..\u002F..\u002F..\u002Fimages\u002Fpersonas\u002Fisabella.jpg",[8474,16352,16354],{"className":16353},[8477,8478,15873,15874],"Isabella",[8474,16356,16358],{"className":16357},[8477],"IIoT Project Lead & Industrial IT Architect",[7556,16360,7940,16362,7940,16372,7940,16382,7940,16392,7940,16402,7696],{"className":16361},[8463],[7556,16363,8487,16365,8487,16368,7940],{"className":16364},[7559,7561],[8474,16366,8491],{"className":16367},[8479],[2403,16369,16371],{"className":16370},[8495],"35–52",[7556,16373,8487,16375,8487,16378,7940],{"className":16374},[7559,7561,8500],[8474,16376,8504],{"className":16377},[8479],[2403,16379,16381],{"className":16380},[8495],"Head of Industrial IT \u002F IIoT Project Lead \u002F IT-OT Architect \u002F Digital Transformation Lead at manufacturing organizations (single plant to multi-plant international groups)",[7556,16383,8487,16385,8487,16388,7940],{"className":16384},[7559,7561,8500],[8474,16386,15908],{"className":16387},[8479],[2403,16389,16391],{"className":16390},[8495],"$50k–$500k+ budget authority, Strategic buyer and technical influencer",[7556,16393,8487,16395,8487,16398,7940],{"className":16394},[7559,7561,8500],[8474,16396,15919],{"className":16397},[8479],[2403,16399,16401],{"className":16400},[8495],"Deep industrial networking, protocols (OPC UA, MQTT, Modbus), cloud\u002Fedge architectures, cybersecurity, enterprise IT. Often self-taught, stays current through industry events.",[7556,16403,8487,16405,8487,16408,7940],{"className":16404},[7559,7561,8500],[8474,16406,8526],{"className":16407},[8479],[2403,16409,16411],{"className":16410},[8495],"Familiar with Node-RED as flexible integration tool. Experience from plant implementations to multi-site POCs. Seeks scalable, enterprise-ready solutions.",[7556,16413,7696,16415,7696,16441,7696,16464,7696,16486,7696,16511,7566],{"className":16414},[15937],[7556,16416,7940,16418,7940,16421,7696],{"className":16417},[7559,7561],[8474,16419,15944],{"className":16420},[8479],[144,16422,8487,16423,8487,16426,8487,16429,8487,16432,8487,16435,8487,16438,7940],{},[147,16424,16425],{},"Architect and deploy unified, scalable data collection and management platform across manufacturing sites",[147,16427,16428],{},"Enable secure, reliable, cost-effective access to operational data for analytics and business intelligence",[147,16430,16431],{},"Define IT\u002FOT architecture from machine level to global enterprise level",[147,16433,16434],{},"Coordinate handover to Operations for software component management",[147,16436,16437],{},"Manage integration of new facilities via M&A or expansion",[147,16439,16440],{},"Interface between IT department and OT departments",[7556,16442,7940,16444,7940,16447,7696],{"className":16443},[7559,7561],[8474,16445,15965],{"className":16446},[8479],[144,16448,8487,16449,8487,16452,8487,16455,8487,16458,8487,16461,7940],{},[147,16450,16451],{},"Deliver measurable business value through scalable, reliable technology solutions",[147,16453,16454],{},"Drive digital transformation and increase IIoT maturity across organization",[147,16456,16457],{},"Reduce complexity across tech stack while enabling operational excellence",[147,16459,16460],{},"Build future-proof data infrastructure supporting business growth",[147,16462,16463],{},"Demonstrate clear ROI and strategic value of IT investments to stakeholders",[7556,16465,7940,16467,7940,16469,7696],{"className":16466},[7559,7561],[8474,16468,15982],{},[144,16470,8487,16471,8487,16474,8487,16477,8487,16480,8487,16483,7940],{},[147,16472,16473],{},"Peer recommendations and industry analyst reports",[147,16475,16476],{},"Technical communities (Node-RED forums, IIoT networks)",[147,16478,16479],{},"Industry conferences, podcasts, professional networks",[147,16481,16482],{},"Direct POC results and reference cases from similar manufacturers",[147,16484,16485],{},"System integrators and technology partners",[7556,16487,7940,16489,7940,16491,7696],{"className":16488},[7559,7561],[8474,16490,15998],{},[144,16492,8487,16493,8487,16496,8487,16499,8487,16502,8487,16505,8487,16508,7940],{},[147,16494,16495],{},"Tools that interact seamlessly with industrial equipment and provide data to enterprise systems",[147,16497,16498],{},"Centralized management across multiple plants with flexible licensing",[147,16500,16501],{},"Seamless multi-protocol support with high availability and redundancy",[147,16503,16504],{},"Standards-compliant solutions with enterprise-grade security",[147,16506,16507],{},"Ability to quickly onboard new facilities and integrate acquired systems",[147,16509,16510],{},"Vendor-neutral approach with clear architecture documentation",[7556,16512,7940,16514,7940,16516,7696],{"className":16513},[7559,7561],[8474,16515,16012],{},[144,16517,8487,16518,8487,16521,8487,16524,8487,16527,8487,16530,8487,16533,7940],{},[147,16519,16520],{},"Legacy solutions difficult to scale, requiring excessive manual intervention",[147,16522,16523],{},"Systems tied to specific vendors or Windows-based platforms creating lock-in",[147,16525,16526],{},"Establishing and maintaining IIoT standards across diverse manufacturing environments",[147,16528,16529],{},"Managing complexity while ensuring high availability and security",[147,16531,16532],{},"Proving added value and ROI to production stakeholders and executive leadership",[147,16534,16535],{},"Rapidly integrating new plants and acquired company systems",[164,16537,16539],{"id":16538},"peter-automation-and-controls-engineer","Peter, Automation and Controls Engineer",[7556,16541,7566,16543,7566,16614],{"className":16542},[15852,7685,8455,8456,8457,8458,8459,7559,7561],[7556,16544,7696,16546,7696,16561,7566],{"className":16545},[7559,15856,8465,8466,15857,15858],[7556,16547,7940,16549,7940,16553,7940,16557,7696],{"className":16548},[15862,8463,15863,8464,15864,15865],[1724,16550],{"className":16551,"src":16552},[15858,7685,8458,8471,7688],"..\u002F..\u002F..\u002Fimages\u002Fpersonas\u002Fpeter.jpg",[8474,16554,16556],{"className":16555},[8477,8478,15873,15874],"Peter",[8474,16558,16560],{"className":16559},[8477],"Automation and Controls Engineer",[7556,16562,7940,16564,7940,16574,7940,16584,7940,16594,7940,16604,7696],{"className":16563},[8463],[7556,16565,8487,16567,8487,16570,7940],{"className":16566},[7559,7561],[8474,16568,8491],{"className":16569},[8479],[2403,16571,16573],{"className":16572},[8495],"42",[7556,16575,8487,16577,8487,16580,7940],{"className":16576},[7559,7561,8500],[8474,16578,8504],{"className":16579},[8479],[2403,16581,16583],{"className":16582},[8495],"Automation and Controls Engineering Team Lead, Manufacturing Inc.",[7556,16585,8487,16587,8487,16590,7940],{"className":16586},[7559,7561,8500],[8474,16588,15908],{"className":16589},[8479],[2403,16591,16593],{"className":16592},[8495],"$15k, Medium Influence",[7556,16595,8487,16597,8487,16600,7940],{"className":16596},[7559,7561,8500],[8474,16598,15919],{"className":16599},[8479],[2403,16601,16603],{"className":16602},[8495],"Electrical Engineering (BEng)",[7556,16605,8487,16607,8487,16610,7940],{"className":16606},[7559,7561,8500],[8474,16608,8526],{"className":16609},[8479],[2403,16611,16613],{"className":16612},[8495],"Has used it for small things",[7556,16615,7696,16617,7696,16648,7696,16662,7696,16680,7696,16690,7566],{"className":16616},[15937],[7556,16618,7940,16620,7940,16623,7696],{"className":16619},[7559,7561],[8474,16621,15944],{"className":16622},[8479],[144,16624,8487,16625,8487,16630,8487,16633,8487,16636,8487,16639,8487,16642,8487,16645,7940],{},[147,16626,16627,16628],{},"Works alongside ",[46,16629,16197],{"href":15499},[147,16631,16632],{},"Management of a team responsible for planning, design, and programming of PLCs",[147,16634,16635],{},"Conception, specification, and programming of Controls Systems",[147,16637,16638],{},"Connection of the control systems to other systems and implementation of process adjustments",[147,16640,16641],{},"Management of the commissioning of machines and production lines and controlling of compliance with software standards in the application",[147,16643,16644],{},"Central contact for control technology",[147,16646,16647],{},"Extract data from control systems and make available to enterprise",[7556,16649,7940,16651,7940,16654,7696],{"className":16650},[7559,7561],[8474,16652,15965],{"className":16653},[8479],[144,16655,8487,16656,8487,16659,7940],{},[147,16657,16658],{},"Visibility into the production",[147,16660,16661],{},"Enabling team member to solve own problems",[7556,16663,7940,16665,7940,16667,7696],{"className":16664},[7559,7561],[8474,16666,15982],{},[144,16668,8487,16669,8487,16672,8487,16675,8487,16677,7940],{},[147,16670,16671],{},"System Integrators",[147,16673,16674],{},"PLC OEMs (Siemens, Rockwell, ABB, Beckhoff)",[147,16676,15990],{},[147,16678,16679],{},"Trainings",[7556,16681,7940,16683,7940,16685,7696],{"className":16682},[7559,7561],[8474,16684,15998],{},[144,16686,8487,16687,7940],{},[147,16688,16689],{},"Wants easy ways to provide PLC data to other systems",[7556,16691,7940,16693,7940,16695,7696],{"className":16692},[7559,7561],[8474,16694,16012],{},[144,16696,8487,16697,8487,16700,8487,16702,7940],{},[147,16698,16699],{},"Budget",[147,16701,6960],{},[147,16703,16704],{},"Identifying problems gives them work",[14,16706,16708],{"id":16707},"common-use-cases","Common Use Cases",[19,16710,16711,16712,549],{},"Based on the Personas, the following section describes the most relevant Use Cases that we identified in exchange with our customers. These Use Cases align with the ",[46,16713,16714],{"href":11657},"Product Strategy",[504,16716,16717,16723,16729],{},[147,16718,16719,16722],{},[423,16720,16721],{},"Data transformation","\nAs Peter, Automation and Controls Engineer,\nI want to connect, collect, and store data from several sources,\nso that I can analyze my data further and ensure it is accessible in a unified manner.",[147,16724,16725,16728],{},[423,16726,16727],{},"Generate actionable insights","\nAs Peter, Automation and Controls Engineer and Sarah, Process Engineer,\nI want to visualize and analyze my data,\nso that I can generate actionable insights from my data.",[147,16730,16731,16734],{},[423,16732,16733],{},"Enterprise Readiness","\nAs Paul, Plant Manager,\nI want a professional partner with seamless enterprise integration, security, and a reliable architecture,\nso that I can use Node-RED in corporate and production environments.",{"title":75,"searchDepth":76,"depth":76,"links":16736},[16737,16743,16750],{"id":15725,"depth":76,"text":15726,"children":16738},[16739,16740,16741,16742],{"id":15729,"depth":605,"text":15730},{"id":4381,"depth":605,"text":15753},{"id":15792,"depth":605,"text":15793},{"id":15822,"depth":605,"text":15823},{"id":15843,"depth":76,"text":15844,"children":16744},[16745,16746,16747,16748,16749],{"id":15847,"depth":605,"text":15848},{"id":16023,"depth":605,"text":16024},{"id":16179,"depth":605,"text":16180},{"id":16336,"depth":605,"text":16337},{"id":16538,"depth":605,"text":16539},{"id":16707,"depth":76,"text":16708},{},{"title":15449,"description":15457},"handbook\u002Fengineering\u002Fproduct\u002Fpersonas\u002Findex","-G7ZkGw52i6UgNJOGsO8SlwP9ovnrDJ3PMaoigmfZmA",{"id":16756,"title":11671,"body":16757,"description":16764,"extension":81,"meta":17112,"navGroup":83,"navOrder":83,"navTitle":11671,"navigation":84,"path":11670,"seo":17113,"stem":17114,"__hash__":17115},"handbook\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fpricing.md",{"type":7,"value":16758,"toc":17098},[16759,16762,16765,16772,16776,16784,16787,16790,16794,16924,16928,16932,16937,16942,16947,16958,16961,16965,16970,16975,16979,17002,17005,17009,17014,17019,17023,17052,17055,17059,17062,17065,17069,17072,17076,17079,17082,17085,17088,17091,17095],[10,16760,11671],{"id":16761},"pricing-principles",[19,16763,16764],{},"This page sets out the concepts that we license and what units are measured across both FlowFuse Cloud  and Self-managed. Commercial decisions outside the scope of this document.",[19,16766,16767,16768,16771],{},"We have three primary tiers: Starter (Open-Source when self-managed), Pro, and Enterprise. The value and features provided within each tier correspond to the specific ",[46,16769,16770],{"href":8445},"persona",", acknowledging that a higher placement in the organizational chart typically implies different requirements.",[14,16773,16775],{"id":16774},"buyer-based-open-core-bboc-principle","Buyer-Based Open Core (BBOC) Principle",[19,16777,1375,16778,16783],{},[46,16779,16782],{"href":16780,"rel":16781},"https:\u002F\u002Fopencoreventures.com\u002Fblog\u002F2023-01-open-core-standard-pricing-model\u002F",[108],"Buyer-Based Open Core (BBOC)"," principle is a fundamental guideline in our product\ndevelopment and monetization strategy. It's a framework we employ to discern which features should be open source and which should be proprietary.\nBBOC aligns features into tiers based on their target users or 'buyers' — individual contributors, management, or executives.",[19,16785,16786],{},"Features that are most beneficial to individual contributors, such as PLC engineers and line workers, fall within our Starter tier. On the other hand, features that have broader organizational relevance, like Edge Connectivity or high availability, are offered in our Pro tier or Enterprise tier, targeted towards IIoT managers and plant managers who need to manage multiple Node-RED instances.",[19,16788,16789],{},"This buyer-based approach helps us focus our efforts on the value to the end-user, rather than technical specifications or development effort. It aligns our pricing strategy with the value each tier provides, ensuring that the cost is justified by the capabilities offered and the user persona it serves.",[14,16791,16793],{"id":16792},"value-layers","Value Layers",[910,16795,16796,16812],{},[913,16797,16798],{},[916,16799,16800,16803,16806,16809],{},[919,16801,16802],{},"Tier",[919,16804,16805],{},"Objective",[919,16807,16808],{},"Problem it Solves",[919,16810,16811],{},"Persona",[930,16813,16814,16851,16888],{},[916,16815,16816,16819,16822,16838],{},[935,16817,16818],{},"Starter",[935,16820,16821],{},"Enable professional Node-RED development for individuals and small teams",[935,16823,16824],{},[144,16825,16826,16829,16832,16835],{},[147,16827,16828],{},"Moving beyond local development to cloud hosting",[147,16830,16831],{},"Secure connections",[147,16833,16834],{},"Version control and backup capabilities",[147,16836,16837],{},"Basic team collaboration",[935,16839,16840],{},[144,16841,16842,16845,16848],{},[147,16843,16844],{},"Individual contributor",[147,16846,16847],{},"PLC engineer",[147,16849,16850],{},"Line worker",[916,16852,16853,16856,16859,16878],{},[935,16854,16855],{},"Pro",[935,16857,16858],{},"Build applications with Node-RED across distributed environments with more advanced management and full-stack features",[935,16860,16861],{},[144,16862,16863,16866,16869,16872,16875],{},[147,16864,16865],{},"Managing multiple instances across facilities",[147,16867,16868],{},"Edge device deployment and monitoring",[147,16870,16871],{},"Enhanced security and access controls",[147,16873,16874],{},"Team collaboration for larger organizations",[147,16876,16877],{},"Automated deployment workflows",[935,16879,16880],{},[144,16881,16882,16885],{},[147,16883,16884],{},"IIoT manager",[147,16886,16887],{},"Plant manager",[916,16889,16890,16893,16896,16915],{},[935,16891,16892],{},"Enterprise",[935,16894,16895],{},"Establish Node-RED as enterprise-wide standard with mission-critical capabilities",[935,16897,16898],{},[144,16899,16900,16903,16906,16909,16912],{},[147,16901,16902],{},"Enterprise-grade reliability and high availability",[147,16904,16905],{},"Compliance and comprehensive audit trails",[147,16907,16908],{},"Integration with corporate systems and SSO",[147,16910,16911],{},"Advanced monitoring and observability",[147,16913,16914],{},"Custom branding and dedicated support",[935,16916,16917],{},[144,16918,16919,16922],{},[147,16920,16921],{},"Central IT departments",[147,16923,16887],{},[14,16925,16927],{"id":16926},"tier-descriptions","Tier Descriptions",[164,16929,16931],{"id":16930},"starter-tier","Starter Tier",[19,16933,1375,16934,16936],{},[423,16935,16818],{}," tier is designed to introduce individuals to Node-RED development with FlowFuse. This tier provides the essential foundation for getting started with professional Node-RED hosting and development workflows.",[19,16938,16939,16941],{},[423,16940,928],{},": Enable individual contributors and engineers to quickly deploy and manage Node-RED applications with professional-grade hosting and basic collaboration features.",[19,16943,16944,10656],{},[423,16945,16946],{},"Key Capabilities",[144,16948,16949,16952,16955],{},[147,16950,16951],{},"Hosted Node-RED instance with reliable infrastructure and FlowFuse editor enhancements",[147,16953,16954],{},"Snapshot backups for version control and recovery",[147,16956,16957],{},"Basic team collaboration for up to 2 members",[19,16959,16960],{},"This tier allows users to move beyond local Node-RED development to a cloud-hosted environment with backup and security features, making it ideal for proof-of-concepts, learning, and small-scale deployments.",[164,16962,16964],{"id":16963},"pro-tier","Pro Tier",[19,16966,1375,16967,16969],{},[423,16968,16855],{}," tier is built for central IT, business teams, and SIs who need to build full-stack applications using Node-RED across multiple instances, manage edge devices effectively, and utilize more advanced Node-RED management features.",[19,16971,16972,16974],{},[423,16973,928],{},": Enable organizations to build industrial applications and scale their Node-RED rollout with advanced device management, enhanced security, and team collaboration features for managing 5 or more instances across distributed environments.",[19,16976,16977,10656],{},[423,16978,16946],{},[144,16980,16981,16984,16987,16990,16993,16996,16999],{},[147,16982,16983],{},"Multiple hosted Node-RED instances (up to 5 included)",[147,16985,16986],{},"Edge Device Management with FlowFuse Device Agent",[147,16988,16989],{},"Advanced security features and access controls",[147,16991,16992],{},"Enhanced team collaboration for up to 20 members",[147,16994,16995],{},"DevOps pipelines for automated deployments",[147,16997,16998],{},"Persistent context and shared libraries",[147,17000,17001],{},"Priority support with faster response times",[19,17003,17004],{},"This tier empowers organizations to implement Node-RED as a scalable solution across plants and facilities, with the tools needed to manage distributed deployments, ensure security compliance, and maintain operational efficiency.",[164,17006,17008],{"id":17007},"enterprise-tier","Enterprise Tier",[19,17010,1375,17011,17013],{},[423,17012,16892],{}," tier, built on Node-RED, is a comprehensive industrial application-building platform that sets a company-wide standard with enterprise-grade features for high availability, compliance, and integration.",[19,17015,17016,17018],{},[423,17017,928],{},": Enable central IT departments and enterprise organizations to deploy full-stack industrial applications using Node-RED at scale with the reliability, security, and integration capabilities required for mission-critical purposes.",[19,17020,17021,10656],{},[423,17022,16946],{},[144,17024,17025,17028,17031,17034,17037,17040,17043,17046,17049],{},[147,17026,17027],{},"Unlimited hosted Node-RED instances (20+ included)",[147,17029,17030],{},"High availability and disaster recovery features",[147,17032,17033],{},"Comprehensive audit logging and compliance reporting",[147,17035,17036],{},"Database feature",[147,17038,17039],{},"Enterprise integration with SSO, LDAP, and corporate systems",[147,17041,17042],{},"Advanced monitoring and observability tools",[147,17044,17045],{},"Custom domains and white-label options",[147,17047,17048],{},"Dedicated support with SLA guarantees",[147,17050,17051],{},"Professional services and custom development options",[19,17053,17054],{},"This tier transforms Node-RED into an enterprise-ready platform that meets the stringent requirements of large organizations, enabling them to standardize on FlowFuse for industrial automation, data integration, and digital transformation initiatives across their entire operation.",[14,17056,17058],{"id":17057},"teams","Teams",[19,17060,17061],{},"Teams are the basic unit within FlowFuse Cloud and the entity to which bills are charged.\nA team can create zero or more applications, and one or more user can be members.\nSubject to access controls, some users can add cloud instances and remote devices (agents)\nto applications, and invite other members.",[19,17063,17064],{},"The number of teams for the open source offering of FlowFuse is limited to 50.",[14,17066,17068],{"id":17067},"applications","Applications",[19,17070,17071],{},"A project has one or more Node-RED instance associated with it. The team is billed\nbased on the number of Node-RED instances consuming resources inside applications.",[14,17073,17075],{"id":17074},"cloud-instances","Cloud instances",[19,17077,17078],{},"On the FlowFuse Cloud, different levels of pricing is offered based on the CPU and memory\nresources that the instance has available. The price point is defined\nby the instance type which allows for an abstraction of stacks and billing. Additional\nfeatures may also be defined by the instance type, for example: Custom Domains support.",[19,17080,17081],{},"Self-managed FlowFuse installs are licensed based on the number of Node-RED instances, regardless of\navailable resources for each. Open source installs are limited to 50 instances per\nFlowFuse installation, and some features for instances aren't available, for example Persistent Context.",[14,17083,17084],{"id":15405},"Devices",[19,17086,17087],{},"Devices are owned by the team and are charged for when they are created\nregardless of if they are assigned to a project or their connection state.\nThe team is billed per device at the same rate regardless of tier or number of devices.",[19,17089,17090],{},"Devices are part of the licensed instances.",[14,17092,17094],{"id":17093},"licenses","Licenses",[19,17096,17097],{},"From the perspective of licensing the there's an unlicensed edition: open-source. This version is always self-managed. There's also a licensed version of FlowFuse, this can be self-managed or FlowFuse Managed. For FlowFuse managed properties there's 3 tiers; Starter, Pro, and Enterprise.\nThe open source edition doesn't require a license key to be uploaded. Without a valid license a basic set of features and\nquantity of instances(5), users(5), teams(5), and devices(5) are available.\nWhen a license is purchased it provides all of the functionality of the higher\nplans. It's then licensed for a number of Node-RED instances on an annual basis.",{"title":75,"searchDepth":76,"depth":76,"links":17099},[17100,17101,17102,17107,17108,17109,17110,17111],{"id":16774,"depth":76,"text":16775},{"id":16792,"depth":76,"text":16793},{"id":16926,"depth":76,"text":16927,"children":17103},[17104,17105,17106],{"id":16930,"depth":605,"text":16931},{"id":16963,"depth":605,"text":16964},{"id":17007,"depth":605,"text":17008},{"id":17057,"depth":76,"text":17058},{"id":17067,"depth":76,"text":17068},{"id":17074,"depth":76,"text":17075},{"id":15405,"depth":76,"text":17084},{"id":17093,"depth":76,"text":17094},{},{"title":11671,"description":16764},"handbook\u002Fengineering\u002Fproduct\u002Fpricing","TI6-x2AWse1b1eLo7YkFs1AqATW6JesoKSawGuxLTDU",{"id":17117,"title":5,"body":17118,"description":75,"extension":81,"meta":17209,"navGroup":83,"navOrder":83,"navTitle":5,"navigation":84,"path":17210,"seo":17211,"stem":17212,"__hash__":17213},"handbook\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fprinciples.md",{"type":7,"value":17119,"toc":17202},[17120,17124,17127,17131,17134,17137,17143,17146,17149,17152,17155,17158,17166,17170,17173,17178,17181,17184,17191,17195],[14,17121,17123],{"id":17122},"product-principles","Product Principles",[19,17125,17126],{},"Embedded within our strategy are the principles that guide our decision-making and product evolution, representing our commitment to providing a user-centered platform that seamlessly merges the virtues of open-source development with enterprise-grade functionality.",[164,17128,17130],{"id":17129},"convention-over-configuration","Convention over configuration",[19,17132,17133],{},"We want the default configuration of FlowFuse to be the best user experience for\nthe majority of users.",[19,17135,17136],{},"Every new option we add to the platform, whether for an administrator or end-user,\nrepresents another choice they have to deal with. This increases the cognitive burden\nof using the platform and can have a negative impact on user experience. It also\nincreases the engineering cost to develop and test features where there are many\npossible combinations to consider.",[19,17138,17139,17140,549],{},"For every feature we add that has some scope for configuration, our starting point\nin the design is to ",[423,17141,17142],{},"identify the right configuration and hard-code it in",[19,17144,17145],{},"This removes the choice from users' hands and minds. It does not prevent us from\nchoosing to make it more configurable in the future if user-feedback\u002Fbusiness-needs\nrequires it.",[19,17147,17148],{},"Where there is a strong case to expose an option to the end user, it should still\nbe provided with a sensible default value where possible that removes the need\nfor the user to set it themselves. This gives users the ability to customise\nthe option if\u002Fwhen they are ready to. But the default value should be the right\nanswer for most users.",[19,17150,17151],{},"Some configuration options cannot be defaulted - the user has to do make a choice.\nFor example, setting up email on the platform. The UX around these options must\nbe carefully considered to help the user get to the right choice with a minimum\nof effort.",[19,17153,17154],{},"Node-RED provides a lot of configuration options. We should not assume they are all\ncandidates to be exposed to FlowFuse users. For example, options to customise the\neditor appearance should be reserved options that we determine the right values for\nto ensure a consistent user experience across FlowFuse instances.",[19,17156,17157],{},"Options that have an impact on the behaviour of flows will need to be considered\non a case-by-case basis. But the starting point should always be to pick the right\ndefault and only expose to the user if absolutely necessary.",[19,17159,17160,17161,549],{},"See also: ",[46,17162,17165],{"href":17163,"rel":17164},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FConvention_over_configuration",[108],"Convention over Configuration on Wikipedia",[164,17167,17169],{"id":17168},"low-level-of-shame","Low level of shame",[19,17171,17172],{},"GitLab Head of Remote Darren M.",[2672,17174,17175],{},[19,17176,17177],{},"In many organizations, you take a risk when you put forth any work that’s not perfect — where you haven’t spent endless cycles planning for contingencies or counterpoints. Because of this, you’re incentivized to invest a lot of time and effort into preparing for ‘What if?’ scenarios before any work is presented.",[19,17179,17180],{},"The downside to that is clear. If you do eventually put forth the work, but it needed to be course corrected a long time ago, you’ve now squandered a lot of time that you could have spent improving it via iteration.",[19,17182,17183],{},"Having a low level of shame requires you to combat a natural inclination to conceal work until it’s perfect, and instead celebrate the small changes.",[19,17185,17160,17186],{},[46,17187,17190],{"href":17188,"rel":17189},"https:\u002F\u002Fhandbook.gitlab.com\u002Fhandbook\u002Fvalues\u002F#low-level-of-shame",[108],"Low level of shame - GitLab handbook",[164,17192,17194],{"id":17193},"open-source-enterprise","Open Source & Enterprise",[19,17196,17197,17198,17201],{},"We offer a number of ways that users can run the FlowFuse product, we will\nalways offer an open source version that has the core features. Features that\noffer higher business value or permit users to share across larger groups will\nbe offered as part of our paid propositions. FlowFuse Cloud is public and will\ngenerally include all open-source features that are available but may not offer\ncertain features such as SSO where integration is required between the platform\nand an enterprise. We offer customers the ability to have a dedicated managed\ninstance if that is a deployment model they require.\nA more detailed breakdown of the pricing and split between our Open Source and\nEnterprise Editions is on the ",[46,17199,17200],{"href":11670},"pricing principles"," page.",{"title":75,"searchDepth":76,"depth":76,"links":17203},[17204],{"id":17122,"depth":76,"text":17123,"children":17205},[17206,17207,17208],{"id":17129,"depth":605,"text":17130},{"id":17168,"depth":605,"text":17169},{"id":17193,"depth":605,"text":17194},{},"\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fprinciples",{"description":75},"handbook\u002Fengineering\u002Fproduct\u002Fprinciples","IAD_7mPvWkE5CQj_7bloS95hZOuOH0nBKMG9FxPnTCQ",{"id":17215,"title":17216,"body":17217,"description":75,"extension":81,"meta":17286,"navGroup":83,"navOrder":83,"navTitle":17216,"navigation":84,"path":17287,"seo":17288,"stem":17289,"__hash__":17290},"handbook\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fproduct-swimlanes.md","Product Swimlanes",{"type":7,"value":17218,"toc":17277},[17219,17222,17226,17234,17238,17241,17252,17256,17260,17263,17267,17270,17274],[10,17220,17216],{"id":17221},"product-swimlanes",[14,17223,17225],{"id":17224},"what-are-they","What are they",[19,17227,17228,17233],{},[46,17229,17232],{"href":17230,"rel":17231},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSwimlane",[108],"Product swimlanes"," are areas of focus and expertise within the Flowfuse product.",[14,17235,17237],{"id":17236},"why-we-use-them","Why we use them",[19,17239,17240],{},"Swimlanes allow us to",[504,17242,17243,17246,17249],{},[147,17244,17245],{},"Develop deep expertise in a particular focus area of the product",[147,17247,17248],{},"Assign decision rights to an individual when it comes to the features, roadmap, design and stakeholders of that area",[147,17250,17251],{},"Ship Faster: The teams' velocity increases as they deepen their experience within the product area.",[14,17253,17255],{"id":17254},"our-swimlanes","Our swimlanes",[164,17257,17259],{"id":17258},"ai-focus","AI Focus",[19,17261,17262],{},"AI enablement within the FlowFuse platform, including the FlowFuse Expert AI agent which has offers support and enablement (basic, pro\u002Ffree) and data insights (advanced enterprise).",[164,17264,17266],{"id":17265},"edge-orchestration-and-data-acquisition","Edge Orchestration and data acquisition",[19,17268,17269],{},"Everything edge related, from data acquisition to fleet orchestration.",[164,17271,17273],{"id":17272},"platform-core","Platform Core",[19,17275,17276],{},"The engine that runs the ship. all things relevant to the platform and its operation and resilience.",{"title":75,"searchDepth":76,"depth":76,"links":17278},[17279,17280,17281],{"id":17224,"depth":76,"text":17225},{"id":17236,"depth":76,"text":17237},{"id":17254,"depth":76,"text":17255,"children":17282},[17283,17284,17285],{"id":17258,"depth":605,"text":17259},{"id":17265,"depth":605,"text":17266},{"id":17272,"depth":605,"text":17273},{},"\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fproduct-swimlanes",{"title":17216,"description":75},"handbook\u002Fengineering\u002Fproduct\u002Fproduct-swimlanes","62h5pjSGnfCrb2AxOQ8kw4-wMpU4Ju3aIwKU23zJmYg",{"id":17292,"title":16714,"body":17293,"description":17649,"extension":81,"meta":17650,"navGroup":83,"navOrder":83,"navTitle":6717,"navigation":84,"path":11657,"seo":17651,"stem":17652,"__hash__":17653},"handbook\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fstrategy.md",{"type":7,"value":17294,"toc":17636},[17295,17298,17310,17317,17320,17324,17327,17331,17334,17338,17341,17344,17348,17351,17355,17358,17367,17370,17374,17377,17380,17486,17489,17493,17497,17500,17504,17507,17511,17520,17523,17527,17530,17534,17537,17545,17549,17552,17556,17559,17562,17566,17568,17571,17575,17578,17582,17585,17589,17592,17594,17597,17601,17604,17608,17612,17615,17619,17622,17626,17629,17633],[10,17296,16714],{"id":17297},"product-strategy",[19,17299,17300,17301,17304,17305,17309],{},"In support of our ",[46,17302,17303],{"href":7052},"company strategy",", and derived from our ",[46,17306,17308],{"href":17307},"\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fvision","vision",", we build our product around a single product mission statement:",[2672,17311,17312],{},[19,17313,17314],{},[423,17315,17316],{},"We are the platform that moves you from fragile, project-based automation to governed, distributed industrial runtime infrastructure.",[19,17318,17319],{},"Our strategy is reviewed on a regular basis and we will iterate when there is reason to do so.",[14,17321,17323],{"id":17322},"strategic-objectives","Strategic Objectives",[19,17325,17326],{},"Our strategic Objectives direct our investment and innovation efforts, and are re evaluated each quarter.",[164,17328,17330],{"id":17329},"establish-flowfuse-as-the-enterprise-trusted-node-red-platform","Establish FlowFuse as the Enterprise-Trusted Node-RED Platform",[19,17332,17333],{},"FlowFuse is committed to augmenting the enterprise-readiness of Node-RED. Our strategy emphasises enhancing audit and compliance capabilities, instituting stringent preventive and corrective controls, and bolstering security. By integrating these vital aspects, we aim to create a reliable, secure, and scalable environment. This initiative underlines our dedication to surpassing enterprise expectations and strengthening Node-RED's position in the industry.",[164,17335,17337],{"id":17336},"deliver-the-fastest-most-flexible-edge-deployments","Deliver the Fastest, most Flexible Edge Deployments",[19,17339,17340],{},"Many organizations position Node-RED instances on remote servers, edge-, or industrial-devices. This practise allows them to meet network-, infrastructure-, or use-case- requirements.",[19,17342,17343],{},"FlowFuse already supports this process by creating snapshots on Node-RED instances that can be deployed to multiple remote targets. We will continue to expand the functionalities to allow users to manage existing Node-RED instances, improve their development practices to accelerate development and ensure a reliable and repeatable process, providing more flexible remote deployment options and offering the best support for devices in closed and segmented networks as we are facing it in production environments.",[164,17345,17347],{"id":17346},"win-icp-manufacturing-logos","Win ICP Manufacturing Logos",[19,17349,17350],{},"Our Industrial enterprise customers rely on node-red and FlowFuse to complete the observability of their OT and IT networks. Our product solves real, painful problems for people responsible for the uptime and observability of their networks and production. We are committed to building, selling and marketing our platform with their needs at the forefront of our product decisions.",[14,17352,17354],{"id":17353},"roadmap","Roadmap",[19,17356,17357],{},"The company roadmap shows a high-level view of the features we are building to bring our company vision to fruition. Our roadmap provides transparency into our development priorities and helps align our team's efforts with our strategic objectives.",[19,17359,17360,17361,17366],{},"You can view our current roadmap in the ",[46,17362,17365],{"href":17363,"rel":17364},"https:\u002F\u002Fgithub.com\u002Forgs\u002FFlowFuse\u002Fprojects\u002F3\u002Fviews\u002F19",[108],"12 Month Plan view"," of our Product Planning project on GitHub.",[19,17368,17369],{},"The roadmap may need to be adjusted over time as we pivot when we identify better ways to accomplish our company goals. This flexibility allows us to respond to market changes, customer feedback, and emerging opportunities while maintaining our focus on delivering maximum value to our customers.",[14,17371,17373],{"id":17372},"product-pillars","Product Pillars",[19,17375,17376],{},"When we talk about our product features and the value it offers to our customers, we refer to our product pillars.",[19,17378,17379],{},"These three pillars ensure we are aligned with our product mission statement and company strategy.",[910,17381,17382,17398],{},[913,17383,17384],{},[916,17385,17386,17389,17392,17395],{},[919,17387,17388],{"align":921},"Pillar Name",[919,17390,17391],{"align":921},"Strategic Value Proposition",[919,17393,17394],{"align":921},"The \"Operational Scaling\" Problem\u002FSolution",[919,17396,17397],{"align":921},"Differentiation (vs. Raw Node-RED\u002FCompetitors)",[930,17399,17400,17430,17458],{},[916,17401,17402,17407,17413,17427],{},[935,17403,17404],{"align":921},[423,17405,17406],{},"Operational Scaling",[935,17408,17409,17412],{"align":921},[423,17410,17411],{},"Deliver Consistency at Scale."," Move from \"one-off\" projects to a global fleet strategy.",[935,17414,17415,17418,17419,17421,17423,17426],{"align":921},[423,17416,17417],{},"Problem:"," Successful pilots often become \"snowflakes\" that are impossible to maintain or update across multiple sites.",[9379,17420],{},[9379,17422],{},[423,17424,17425],{},"Solution:"," Centralized management of application patterns, ensuring that a CNC monitoring app at Site A is identical to the one at Site B.",[935,17428,17429],{"align":921},"Unlike raw Node-RED, FlowFuse provides the governance, deployment pipelines, and device management needed to scale without adding headcount.",[916,17431,17432,17437,17443,17455],{},[935,17433,17434],{"align":921},[423,17435,17436],{},"System Agility",[935,17438,17439,17442],{"align":921},[423,17440,17441],{},"Extend & Adapt without Rip-and-Replace."," Turn rigid vendor software into flexible business assets.",[935,17444,17445,17447,17448,17450,17452,17454],{"align":921},[423,17446,17417],{}," Purchased systems (MES\u002FSCADA) rarely meet 100% of local operational needs, leading to manual workarounds.",[9379,17449],{},[9379,17451],{},[423,17453,17425],{}," A \"low-code\" agility layer that sits atop existing systems to add custom logic, vendor-agnostic workflows, and tailored business rules.",[935,17456,17457],{"align":921},"FlowFuse acts as the \"anti-lock-in\" layer. It allows teams to customize their stack without relying on expensive original vendor consultants or custom C#\u002F.NET builds.",[916,17459,17460,17465,17471,17483],{},[935,17461,17462],{"align":921},[423,17463,17464],{},"Event-Driven Data Bridge",[935,17466,17467,17470],{"align":921},[423,17468,17469],{},"High-Precision Data Orchestration."," Connect the shop floor to the top floor based on real-world events.",[935,17472,17473,17475,17476,17478,17480,17482],{"align":921},[423,17474,17417],{}," Traditional middleware is often too heavy, while historians are too passive for real-time action.",[9379,17477],{},[9379,17479],{},[423,17481,17425],{}," A lightweight, event-based bridge that triggers data movement, transformation, and storage only when specific operational events occur.",[935,17484,17485],{"align":921},"We aren't a \"data lake.\" We are the intelligent router. This avoids the \"dump everything to the cloud\" cost trap and positions us as a surgical tool for IT\u002FOT integration.",[19,17487,17488],{},"Any new feature requests, product improvements, or other changes to our product can be reflected back to these pillars to ensure they are in line with our product strategy.",[164,17490,17492],{"id":17491},"build","Build",[239,17494,17496],{"id":17495},"simplified-hosting","Simplified Hosting",[19,17498,17499],{},"FlowFuse should offer a seamless hosting experience for Node-RED applications. This includes a simple onboarding process, control over the hosting environment (e.g. Node-RED versions), and a reliable infrastructure.",[239,17501,17503],{"id":17502},"version-control","Version Control",[19,17505,17506],{},"FlowFuse should provide a way to manage and track changes to Node-RED applications. This includes the ability to save progress of work, compare changes made over time. and revert to previous versions when required.",[239,17508,17510],{"id":17509},"trust","Trust",[19,17512,17513,17514,17519],{},"One of the joys of Node-RED as an open-source technology is the ",[46,17515,17518],{"href":17516,"rel":17517},"https:\u002F\u002Fflows.nodered.org\u002F",[108],"rich ecosystem of community-contributed nodes and flows",". The disadvantage of this in a production\u002Fenterprise context is the difficulty to trust in the reliability, quality and security of these contributions.",[19,17521,17522],{},"FlowFuse should ensure that users have an easy way to identify trustworthy and stable third-party nodes, without compromising the flexibility and openness of the platform.",[239,17524,17526],{"id":17525},"remote-access","Remote Access",[19,17528,17529],{},"Most of our customers are using Node-RED in remote environments, where they do not have easy access to the device running Node-RED. FlowFuse should provide a secure and reliable way to access, and deploy on Node-RED instances remotely.",[239,17531,17533],{"id":17532},"full-stack-applications","Full Stack Applications",[19,17535,17536],{},"FlowFuse should support the full end-to-end architecture of a modern application. This includes the ability to build both the frontend and backend of an application, as well as the ability to integrate with external services and APIs.",[19,17538,17539,17540,549],{},"Additionally, FlowFuse should ensure that it not only supports, but flourishes with, modern IT\u002FOT architecture such as the ",[46,17541,17544],{"href":17542,"rel":17543},"https:\u002F\u002Fflowfuse.com\u002Funified-namespace\u002F",[108],"Unified Namespace",[239,17546,17548],{"id":17547},"low-code","Low-Code",[19,17550,17551],{},"Node-RED's popularity is due to it's user-friendly, low-code user interface. FlowFuse should offer improvements to lower the point of entry for new users even further, and make it easier for users to build applications without needing to write code.",[239,17553,17555],{"id":17554},"collaborative-development","Collaborative Development",[19,17557,17558],{},"FlowFuse should ensure that it is optimized for collaborative development. We often see teams of over a dozen developers all needing to contribute and access the same Node-RED application. FlowFuse should provide the tools to make working in such an environment as easy as possible.",[19,17560,17561],{},"In addition to the scope of collaboration within a team, FlowFuse has an opportunity to become an ecosystem for sharing and collaborating on Node-RED applications with the wider Node-RED community too.",[164,17563,17565],{"id":17564},"manage","Manage",[239,17567,2914],{"id":62},[19,17569,17570],{},"It goes without saying that security is a top priority for any product. FlowFuse should ensure that Node-RED applications are secure by default, and that users have the tools to manage and monitor the security of their applications, for example through role-based access control (RBAC). Users should not have to worry about the security of their applications, but be able to have clear control over access and permissions to their applications when required.",[239,17572,17574],{"id":17573},"centralized-management","Centralized Management",[19,17576,17577],{},"This refers to the tooling that FlowFuse provides for the centralized management of Node-RED instances. In particular, the ability to manage multiple Node-RED instances from a single interface, whether that be a few instances hosted on FlowFuse or thousands of Node-RED environments running on edge devices.",[239,17579,17581],{"id":17580},"administration","Administration",[19,17583,17584],{},"Clear control over the full FlowFuse platform. This includes the ability to have clarity on platform-wide activity and the billing aspects of the platform and associated resources.",[239,17586,17588],{"id":17587},"frictionless-maintenance","Frictionless Maintenance",[19,17590,17591],{},"FlowFuse should ensure that maintenance, e.g. upgrading of Node-RED versions and dependencies. Maintenance will always be a chore for any application, but with FlowFuse, it should be as frictionless as possible.",[239,17593,11788],{"id":12641},[19,17595,17596],{},"FlowFuse should provide users with the tools to monitor appropriate activity of their Node-RED applications, ranging from performance metrics, to audit and error logging. This will ensure users are able to identify and resolve issues quickly, ideally before problems even occur, and ensure that their applications can stay running smoothly.",[239,17598,17600],{"id":17599},"billing","Billing",[19,17602,17603],{},"FlowFuse should provide a clear and transparent billing system for users. This includes the ability to manage and monitor costs, and the ability to scale up and down as required.",[164,17605,17607],{"id":17606},"deploy","Deploy",[239,17609,17611],{"id":17610},"devops","DevOps",[19,17613,17614],{},"FlowFuse should provide the tools to enable a DevOps workflow for Node-RED applications. In particular, users of FlowFuse should have confidence in developing and experimenting with Node-RED, without fear of interfering with their production environments, and trust that it can easily be deployed to production environments when it is ready.",[239,17616,17618],{"id":17617},"remote-deployments","Remote Deployments",[19,17620,17621],{},"FlowFuse should provide a seamless experience when deploying flows to remote environments, known in FlowFuse as \"Devices\". This includes the ability to deploy to multiple devices at once.",[239,17623,17625],{"id":17624},"scale","Scale",[19,17627,17628],{},"FlowFuse users should not have to concern when scaling their own applications. FlowFuse should provide intuitive tooling to ensure that applications can scale with ease, and where possible handle this automatically.",[239,17630,17632],{"id":17631},"reliability","Reliability",[19,17634,17635],{},"FlowFuse users can trust that their applications will run reliably. This includes ensuring that applications are highly available, and that users have the tools to monitor and manage the reliability of their applications, including being alerted when things go wrong, and making the recovery as easy as possible.",{"title":75,"searchDepth":76,"depth":76,"links":17637},[17638,17643,17644],{"id":17322,"depth":76,"text":17323,"children":17639},[17640,17641,17642],{"id":17329,"depth":605,"text":17330},{"id":17336,"depth":605,"text":17337},{"id":17346,"depth":605,"text":17347},{"id":17353,"depth":76,"text":17354},{"id":17372,"depth":76,"text":17373,"children":17645},[17646,17647,17648],{"id":17491,"depth":605,"text":17492},{"id":17564,"depth":605,"text":17565},{"id":17606,"depth":605,"text":17607},"In support of our company strategy, and derived from our vision, we build our product around a single product mission statement:",{},{"title":16714,"description":17649},"handbook\u002Fengineering\u002Fproduct\u002Fstrategy","QH53NnrmEEDJi6SQ_dPHgOFQcj6G11woVu2VcYlsYTE",{"id":17655,"title":15270,"body":17656,"description":17663,"extension":81,"meta":17799,"navGroup":83,"navOrder":83,"navTitle":15270,"navigation":84,"path":15269,"seo":17800,"stem":17801,"__hash__":17802},"handbook\u002Fhandbook\u002Fengineering\u002Fproduct\u002Ftelemetry.md",{"type":7,"value":17657,"toc":17789},[17658,17661,17664,17667,17681,17685,17693,17697,17700,17709,17713,17720,17723,17727,17735,17739,17742,17750,17754,17757],[10,17659,15270],{"id":17660},"product-growth",[19,17662,17663],{},"It is important to track the growth and adoption of our product. Having our finger on the pulse of this data is critical to success, and driving conversation about product priorities and long term direction.",[19,17665,17666],{},"We track two major datasets on the adoption of FlowFuse and it's features:",[144,17668,17669,17675],{},[147,17670,17671,17674],{},[423,17672,17673],{},"FlowFuse Installations:"," This is telemetry that is emitted by each instance of FlowFuse, including our own FlowFuse Cloud, and then any self-hosted installations users are running in their own infrastructure.",[147,17676,17677,17680],{},[423,17678,17679],{},"FlowFuse Cloud Meta Snapshots:"," For FlowFuse Cloud specifically, we then get daily \"Meta Snapshots\". These snapshots capture usage data within FlowFuse Cloud of major features. The data gathered is controlled in a Node-RED flow and can be updated to icnlude more metrics as we need them, and as new features are released.",[14,17682,17684],{"id":17683},"flowfuse-installations","FlowFuse Installations",[19,17686,1375,17687,17692],{},[46,17688,17691],{"href":17689,"rel":17690},"https:\u002F\u002Fproduct-metrics.flowfuse.cloud\u002Fdashboard\u002Ftelemetry",[108],"Telemetry Data Dashboard"," displays insights into how many instances of FlowFuse are running (with telemetry enabled), and then a sum of the number of Hosted and Remote Instances ech of these instances run. We can see breakdowns by the driver these instances are using, which operating system they're running on and the number of platforms added\u002Fremoved on a given day.",[14,17694,17696],{"id":17695},"flowfuse-cloud-meta-snapshots","FlowFuse Cloud Meta Snapshots",[19,17698,17699],{},"Daily, we take snapshots that detail usage data for FlowFuse Cloud, tracking elements like the number of teams and Instances running on FlowFuse Cloud. This data allows us to gain insights into the usage of our product and how it is being used, and monitor the health of our product over time.",[19,17701,17702,17703,17708],{},"This is the data that is used to populate the Product Metrics Dashboard. The data collected can be modified in the ",[46,17704,17707],{"href":17705,"rel":17706},"https:\u002F\u002Fmain.flowforge.cloud",[108],"Main Hosted Instance"," in the FlowFuse team on FlowFuse Cloud.",[164,17710,17712],{"id":17711},"generating-snapshots","Generating Snapshots",[19,17714,17715,17716,17719],{},"These snapshots are generated inside a Node-RED flow running on FlowFuse Cloud. If you wat to update the data captured in a Snapshot, it can be added to the ",[46,17717,17707],{"href":17705,"rel":17718},[108]," and when deployed, the relevant data will be collected and added to the daily meta snapshots from the next day.",[19,17721,17722],{},"For major feature releases, e.g. MQTT Team Broker or FlowFuse Tables, it is useful to add usage\u002Fadoption data to the daily meta snapshots. This data is important to track the adoption of new features and how they are being used, especially in the earlier stages as this will impact follow-on iterations, and short-term product planning.",[164,17724,17726],{"id":17725},"product-metrics-dashboard","Product Metrics Dashboard",[19,17728,14029,17729,17734],{},[46,17730,17733],{"href":17731,"rel":17732},"https:\u002F\u002Fproduct-metrics.flowfuse.cloud\u002Fdashboard",[108],"dashboard"," that shows the summaries of the Installations and FlowFuse Cloud Meta Snapshots datasets. This is all running in a single Node-RED instance, and uses FlowFuse Dashboard for the reporting.",[14,17736,17738],{"id":17737},"week-on-week-growth","Week on Week Growth",[19,17740,17741],{},"An important metric for product adoption is week-on-week growth. This is a simple metric that shows the percentage tracks growth of adoption or provisioning of resources (e.g. number of hosted instances, number of teams).",[19,17743,14029,17744,17749],{},[46,17745,17748],{"href":17746,"rel":17747},"https:\u002F\u002Fproduct-metrics.flowfuse.cloud\u002Fdashboard\u002Fgrowth-calculator",[108],"week-on-week growth calculator"," as part of the Product Metrics Dashboard that you can use.",[164,17751,17753],{"id":17752},"example-growth","Example Growth",[19,17755,17756],{},"To give some context, if we assume a metric to be at \"100\" as of January 1st, after 12 months, with the following, sustained, week-on-week growths, the metric would be as follows:",[144,17758,17759,17762,17765,17768,17771,17774,17777,17780,17783,17786],{},[147,17760,17761],{},"20%: 1,310,463 (~1310x)",[147,17763,17764],{},"10%: 14,204 (~142x)",[147,17766,17767],{},"7%: 3,372 (~34x)",[147,17769,17770],{},"6%: 2,070 (~20x)",[147,17772,17773],{},"5%: 1,265 (~13x)",[147,17775,17776],{},"4%: 769 (~7.7x)",[147,17778,17779],{},"3%: 465 (~4.6x)",[147,17781,17782],{},"2%: 280 (~2.8x)",[147,17784,17785],{},"1%: 167 (~1.6x)",[147,17787,17788],{},"0.5%: 132 (~1.3x)",{"title":75,"searchDepth":76,"depth":76,"links":17790},[17791,17792,17796],{"id":17683,"depth":76,"text":17684},{"id":17695,"depth":76,"text":17696,"children":17793},[17794,17795],{"id":17711,"depth":605,"text":17712},{"id":17725,"depth":605,"text":17726},{"id":17737,"depth":76,"text":17738,"children":17797},[17798],{"id":17752,"depth":605,"text":17753},{},{"title":15270,"description":17663},"handbook\u002Fengineering\u002Fproduct\u002Ftelemetry","2e73Ykkc7NCckpcCuqPbxDXvZgAVnYcaKqQY5O5X8XI",{"id":17804,"title":15255,"body":17805,"description":75,"extension":81,"meta":17866,"navGroup":83,"navOrder":83,"navTitle":15255,"navigation":84,"path":15254,"seo":17867,"stem":17868,"__hash__":17869},"handbook\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fversioning.md",{"type":7,"value":17806,"toc":17862},[17807,17810,17814,17826,17829,17832,17836,17859],[10,17808,15255],{"id":17809},"versioning",[14,17811,17813],{"id":17812},"preview-features","Preview Features",[19,17815,17816,17817,17821,17822,17825],{},"As part of our ",[46,17818,17820],{"href":17819},"\u002Fhandbook\u002Fcompany\u002Fvalues\u002F#%F0%9F%94%81-iterative-improvement","continuous improvement"," process at FlowFuse, we may designate certain functionalities as Preview Features. During this phase, all of our customers are given the unique opportunity to trial and test these features. While we ensure the provision of support services, it's important to understand that standard service-level agreements do not apply to these Preview Features. We highly value ",[46,17823,17824],{"href":11663},"customer feedback"," during this period; it not only contributes to our feature refinement process, but also shapes the future development of our offerings.",[19,17827,17828],{},"There are no extra charges associated with the utilization of Preview Features. Nevertheless, we want to clarify that as these features transition from their preview status to being generally available, they may become subject to changes in pricing in subsequent releases.",[19,17830,17831],{},"Preview Features exemplify our commitment to expedited innovation and iterative development, underpinned by a strong customer-centric approach. Although these features might not always be entirely complete during this phase, user feedback plays a crucial role in our efforts to enhance them, ensuring we consistently deliver high-quality and valuable solutions to meet customer needs.",[14,17833,17835],{"id":17834},"supporting-flowfuse-versions","Supporting FlowFuse Versions",[19,17837,17838,17839,17842,17843,17846,17847,17850,17851,17854,17855,17858],{},"We utilize Semantic Versioning (SemVer) for all releases. Our version numbers follow the ",[542,17840,17841],{},"MAJOR.MINOR.PATCH"," format.\nA ",[542,17844,17845],{},"Major"," release signifies significant changes that ",[423,17848,17849],{},"may"," include breaking changes or incompatible API updates,\nwhile a ",[542,17852,17853],{},"Minor"," release introduces new features and functionality in a backward-compatible manner.\n",[542,17856,17857],{},"Patch"," releases are reserved for backward-compatible bug fixes and security improvements.",[19,17860,17861],{},"The latest released version is always considered the current stable version and receives bug fixes and security patches.\nImprovements, new features etc, will make it to the next stable release.\nCritical security patches are backported to the current stable release as well as the two previous monthly minor releases.",{"title":75,"searchDepth":76,"depth":76,"links":17863},[17864,17865],{"id":17812,"depth":76,"text":17813},{"id":17834,"depth":76,"text":17835},{},{"title":15255,"description":75},"handbook\u002Fengineering\u002Fproduct\u002Fversioning","cRCAV6fL-SvMC1Ku6LKotIredY8ZXgnkE1UkzoBr7Gc",{"id":17871,"title":17872,"body":17873,"description":18147,"extension":81,"meta":18148,"navGroup":83,"navOrder":83,"navTitle":17872,"navigation":84,"path":15234,"seo":18149,"stem":18150,"__hash__":18151},"handbook\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fverticals.md","Market Segments",{"type":7,"value":17874,"toc":18126},[17875,17878,17884,17888,17891,17894,17897,17901,17904,17913,17916,17920,17929,17932,17936,17939,17943,17972,17976,17979,17982,17990,17998,18002,18005,18008,18015,18018,18021,18035,18038,18041,18044,18047,18051,18054,18057,18064,18067,18070,18073,18076,18079,18120,18123],[10,17876,17872],{"id":17877},"market-segments",[19,17879,17880,17881,17883],{},"By understanding the various markets in which we fit, we can align our ",[46,17882,15295],{"href":11657}," to meet those specific needs. For this overview, we will focus on four distinct product markets: Enterprise-Grade Node-RED, Industrial IoT Platforms, Low-Code Tools, and Data Integration Tools.",[14,17885,17887],{"id":17886},"enterprise-grade-node-red","Enterprise Grade Node-RED",[19,17889,17890],{},"For companies who are already adopting Node-RED as the base technology, they are looking for a solution to mature their use of Node-RED.",[19,17892,17893],{},"We believe FlowFuse is the only viable commercial solution in this space. Our main competitor here is in-house built solutions; where companies are faced with building their own ways to manage Node-RED securely and at scale. This is usually not their core business, so a commercial solution is an attractive alternative.",[19,17895,17896],{},"Where companies have already invested in their own automations around Node-RED, it is important for FlowFuse to demonstrate the additional value it can bring.",[14,17898,17900],{"id":17899},"industrial-iot-platforms","Industrial IoT Platforms",[19,17902,17903],{},"An IIoT platform is a comprehensive solution that securely collects, integrates, and manages vast volumes of data from IoT endpoints. It supports various manufacturer and industry protocols, normalizing and analyzing data at the edge and in the cloud. By bridging IT and OT endpoints, it enhances asset management and promotes application development. It can supplement traditional OT functions and pivot asset-intensive industries like manufacturing or energy towards digitalization.",[19,17905,17906,17907,17912],{},"An IIoT platform should fulfill key requirements like security, automation, and sustainability. It enables interoperability with various business applications. Key capabilities include device management, integration, data management, analytics, application enablement, and security (see also ",[46,17908,17911],{"href":17909,"rel":17910},"https:\u002F\u002Fwww.gartner.com\u002Fdoc\u002Freprints?id=1-2C757S9J&ct=230105&st=sb",[108],"IIoT platform definition","). With its prowess in connecting and processing data from IIoT devices, Node-RED finds a fitting place in the sphere of IIoT platforms, becoming an integral tool in industries like manufacturing where the utility of such data is paramount for fostering operational efficacy and stimulating innovation. Further augmenting Node-RED's proficiency, FlowFuse introduces enterprise-grade features that streamline the management of remote deployments and delivery pipelines, thus amplifying Node-RED's and FlowFuse's potential as IIoT platform.",[19,17914,17915],{},"However, a potential downside is that it may currently be perceived as too general-purpose and not specialized enough for specific IIoT tasks compared to other, more narrowly focused IIoT platforms.",[164,17917,17919],{"id":17918},"market-size","Market Size",[144,17921,17922],{},[147,17923,17924,17925],{},"Source: ",[46,17926,17927],{"href":17927,"rel":17928},"https:\u002F\u002Fwww.imarcgroup.com\u002Findustrial-iot-market",[108],[19,17930,17931],{},"The Industrial IoT market is expected to reach a value of $516.6 Billion by 2028 ($221.7 Billion in 2022), with a compound annual growth rate (CAGR) of 15.49% from 2023 to 2028. About 30%, $66.5 Billion of this was in software alone in 2022.",[164,17933,17935],{"id":17934},"key-customers","Key Customers",[19,17937,17938],{},"The primary customer base in the IIoT sector includes manufacturing, energy, transportation, and utilities companies. These businesses prioritize operational efficiency, equipment monitoring, predictive maintenance, and often operate on a global scale. They require a system capable of handling large data volumes and enabling swift, insightful decision-making.",[164,17940,17942],{"id":17941},"participants-in-the-market","Participants in the market",[144,17944,17945,17948,17951,17954,17957,17960,17963,17966,17969],{},[147,17946,17947],{},"Ignition",[147,17949,17950],{},"HighByte",[147,17952,17953],{},"Tulip",[147,17955,17956],{},"FrameworX and FactoryStudio",[147,17958,17959],{},"Siemens Mindsphere (Digital Industry Software)",[147,17961,17962],{},"Microsoft IoT Hub & Edge",[147,17964,17965],{},"AWS IoT Hub & Edge (e.g. Greengras)",[147,17967,17968],{},"PTC",[147,17970,17971],{},"Hitachi",[164,17973,17975],{"id":17974},"positioning","Positioning",[19,17977,17978],{},"With its prowess in connecting and processing data from IIoT devices, Node-RED and FlowFuse find a fitting place in the sphere of IIoT platforms, becoming an integral tool in industries like manufacturing where the utility of such data is paramount for fostering operational efficacy and stimulating innovation. We exist to empower bottom-up innovation. We allow companies to professionalize their workflows to business critical applications.",[19,17980,17981],{},"Our market positioning is underpinned by two pivotal hypotheses that address pressing demands in the IIoT space:",[504,17983,17984,17987],{},[147,17985,17986],{},"The prevailing landscape of IIoT software solutions is full of off-the-shelf products that seldom meet the unique demands of specific use cases. This gap underscores a pressing need for flexible, adaptable solutions that can be tailored to fit the intricate requirements of diverse operational environments, ensuring a glove-like fit rather than a one-size-fits-all approach.",[147,17988,17989],{},"The notion that true innovation within a manufacturing landscape should emanate from a bottom-up approach is central to our philosophy. Engineers and frontline workers, immersed in the day-to-day challenges and intricacies of manufacturing processes, are uniquely positioned to identify areas ripe for innovation and improvement. By empowering these individuals with the tools and platforms to implement their insights, we can unlock a wellspring of transformative ideas and solutions that drive the industry forward.",[19,17991,17992,17997],{},[46,17993,17996],{"href":17994,"rel":17995},"https:\u002F\u002Fflowfuse.com\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fpersonas\u002F#common-use-cases",[108],"Here"," you can find the demands of specific personas and their classic use cases.",[14,17999,18001],{"id":18000},"low-code-tools","Low-Code Tools",[19,18003,18004],{},"Low-code platforms enable rapid application development with minimal hand-coding, which aligns well with Node-RED's offering of a visual, drag-and-drop interface for creating flow-based applications. Node-RED allows users with limited programming knowledge to create complex IoT applications, which fits well with FlowFuse's focus on collaborative development and management of Node-RED applications.",[19,18006,18007],{},"However, the potential disadvantage is that low-code tools can sometimes be viewed as less powerful or flexible than high-code platforms, and the target customers are challenging to define.",[164,18009,18011],{"id":18010},"market-size-1",[46,18012,17919],{"href":18013,"rel":18014},"https:\u002F\u002Fwww.gartner.com\u002Fen\u002Fnewsroom\u002Fpress-releases\u002F2022-12-13-gartner-forecasts-worldwide-low-code-development-technologies-market-to-grow-20-percent-in-2023",[108],[19,18016,18017],{},"The worldwide market for low-code development technologies is projected to total $26.9 billion in 2023, with growth of 19.6% from 2022 (Low-Code Tools totaled $22.462 Billion in 2022; Low-Code Application Platforms (LCAP) only $7.968 Billion in 2022).",[164,18019,17942],{"id":18020},"participants-in-the-market-1",[144,18022,18023,18026,18029,18032],{},[147,18024,18025],{},"Mendix",[147,18027,18028],{},"Microsoft Power Apps",[147,18030,18031],{},"OutSystems",[147,18033,18034],{},"Zoho Creator",[164,18036,17935],{"id":18037},"key-customers-1",[19,18039,18040],{},"Businesses looking to accelerate digital transformation are the primary customers here, including both large enterprises and SMBs. These organizations need to quickly develop applications to streamline their operations, improve customer experiences, or launch innovative products.",[164,18042,17975],{"id":18043},"positioning-1",[19,18045,18046],{},"FlowFuse should position itself as a comprehensive low-code platform, ideal for both novices and experienced developers. This includes emphasizing its drag-and-drop interface for application building and the ability to scale and manage applications easily. A strong focus on community-building and providing an extensive library of pre-built components can help attract a wider user base.",[14,18048,18050],{"id":18049},"data-integration-tools","Data Integration Tools",[19,18052,18053],{},"Also known as IPaaS (Integration Platform as a Service), this market serves business users looking to integrate workflows across multiple different systems. Typically, these are cloud-hosted SaaS types of systems, usually with some sort of public API. There is also the scenario of integrating between cloud systems and internal company systems or data stores.",[19,18055,18056],{},"While this is an essential function of Node-RED, it doesn't encompass all the capabilities and the broader aim of FlowFuse.",[164,18058,18060],{"id":18059},"market-size-2",[46,18061,17919],{"href":18062,"rel":18063},"https:\u002F\u002Fwww.vynzresearch.com\u002Fict-media\u002Fglobal-ipaas-market",[108],[19,18065,18066],{},"The market size for IPaaS has been reported to be at least $1.4 billion in 2021, potentially growing to $12.3 billion in 2027.",[164,18068,17935],{"id":18069},"key-customers-2",[19,18071,18072],{},"This category encompasses businesses in various sectors that deal with large data volumes, including e-commerce, financial services, healthcare, and supply chain management. They require a system that can consolidate data from multiple sources and make it accessible for analysis and decision-making.",[164,18074,17942],{"id":18075},"participants-in-the-market-2",[19,18077,18078],{},"Some of the companies that are in this market include:",[144,18080,18081,18084,18087,18090,18093,18096,18099,18102,18105,18108,18111,18114,18117],{},[147,18082,18083],{},"n8n.io",[147,18085,18086],{},"Zapier",[147,18088,18089],{},"IFTTT",[147,18091,18092],{},"Dell Boomi",[147,18094,18095],{},"OneReach.ai",[147,18097,18098],{},"Microsoft Flow",[147,18100,18101],{},"Workato",[147,18103,18104],{},"Snap Logic",[147,18106,18107],{},"tray.io",[147,18109,18110],{},"Webmethods.io",[147,18112,18113],{},"Mulesoft Anypoint",[147,18115,18116],{},"Integromat",[147,18118,18119],{},"UiPath",[164,18121,17975],{"id":18122},"positioning-2",[19,18124,18125],{},"FlowFuse should highlight its capabilities as an advanced data integration platform, emphasizing its ability to simplify data collection and transmission. Showcasing partnerships with major database providers and cloud systems could enhance its appeal as a capable and versatile data integration tool.",{"title":75,"searchDepth":76,"depth":76,"links":18127},[18128,18129,18135,18141],{"id":17886,"depth":76,"text":17887},{"id":17899,"depth":76,"text":17900,"children":18130},[18131,18132,18133,18134],{"id":17918,"depth":605,"text":17919},{"id":17934,"depth":605,"text":17935},{"id":17941,"depth":605,"text":17942},{"id":17974,"depth":605,"text":17975},{"id":18000,"depth":76,"text":18001,"children":18136},[18137,18138,18139,18140],{"id":18010,"depth":605,"text":17919},{"id":18020,"depth":605,"text":17942},{"id":18037,"depth":605,"text":17935},{"id":18043,"depth":605,"text":17975},{"id":18049,"depth":76,"text":18050,"children":18142},[18143,18144,18145,18146],{"id":18059,"depth":605,"text":17919},{"id":18069,"depth":605,"text":17935},{"id":18075,"depth":605,"text":17942},{"id":18122,"depth":605,"text":17975},"By understanding the various markets in which we fit, we can align our product strategy to meet those specific needs. For this overview, we will focus on four distinct product markets: Enterprise-Grade Node-RED, Industrial IoT Platforms, Low-Code Tools, and Data Integration Tools.",{},{"title":17872,"description":18147},"handbook\u002Fengineering\u002Fproduct\u002Fverticals","2be6cmWol6WiIPobjQpQd_EMd-5i-9MRWbw4-NdLqTY",{"id":18153,"title":18154,"body":18155,"description":75,"extension":81,"meta":18371,"navGroup":83,"navOrder":83,"navTitle":83,"navigation":84,"path":17307,"seo":18372,"stem":18373,"__hash__":18374},"handbook\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fvision.md","Vision",{"type":7,"value":18156,"toc":18358},[18157,18161,18168,18172,18181,18187,18193,18199,18205,18209,18216,18222,18225,18229,18232,18236,18241,18244,18258,18262,18267,18270,18284,18288,18293,18296,18310,18314,18319,18322,18348,18352,18355],[14,18158,18160],{"id":18159},"vision-statement","Vision Statement",[2672,18162,18163],{},[19,18164,18165],{},[423,18166,18167],{},"That platform that moves you from fragile, project-based automation to governed, distributed industrial runtime infrastructure.",[14,18169,18171],{"id":18170},"the-full-vision","The Full Vision",[19,18173,18174,18175,18180],{},"This vision follows the ",[46,18176,18179],{"href":18177,"rel":18178},"https:\u002F\u002Fwww.radicalproduct.com\u002F",[108],"Radical Product Thinking"," framework. It is the outcome of a cross-functional workshop and reflects the strongest signals from across the team.",[19,18182,18183,18186],{},[423,18184,18185],{},"Today when"," industrial engineers and maintenance crews want to evolve the systems their factories depend on, they start with ad-hoc scripts and disconnected tools that seem manageable at first — until they scale. What begins as a few flows becomes a duct-taped collection of fragile logic, where updating one machine can break five others and the only people who can safely touch the system are a handful of \"heroes\" carrying institutional knowledge in their heads. This creates brittle infrastructure, team burnout, and a ceiling on what operations can ever become.",[19,18188,18189,18192],{},[423,18190,18191],{},"This is unacceptable because"," Industrial decisions are time-bound and the systems that support them must be trusted. When logic is invisible and undocumented, when one change can cascade into failures across a plant, and when scaling from one site to fifty requires starting over — manufacturers cannot move at the speed the market demands.",[19,18194,18195,18198],{},[423,18196,18197],{},"We envision A world where"," operational change feels routine rather than dangerous — where any engineer can understand or modify a process flow without needing a hero to explain it, where intentional industrial workflows run reliably across dozens of sites, and where teams scale from one plant to a hundred in weeks, not months. A world where the industrial stack is not bespoke and locked-in, but governed, versioned, and built to last.",[19,18200,18201,18204],{},[423,18202,18203],{},"We are bringing this about"," Through a distributed industrial runtime that serves as the operational backbone for event-driven workflows across OT and IT. We execute business logic, validate and transform payloads, manage application lifecycle, and deploy across distributed device fleets — ensuring that industrial operations are intentional, visible, and governed at scale. As AI commoditizes glue code and data aggregation, we are building the durable layer: runtime control, orchestration discipline, and the infrastructure organizations can bet on.",[164,18206,18208],{"id":18207},"how-our-product-vision-helps-us","How our product vision helps us",[19,18210,18211,18212,18215],{},"This long-form product vision is the ",[423,18213,18214],{},"source code for our strategy",". It's meant to be rich in context, bold and specific.",[19,18217,18218,18219,549],{},"Our marketing, sales, and product development efforts all cascade from this product strategy, which is the result of collaborative ideation of our leadership team and grounded in ",[423,18220,18221],{},"real problems our users face every day",[19,18223,18224],{},"When we make decisions, content and goals centered on this strategy, we have confidence that those investments are in the best interest of our business and customers.",[14,18226,18228],{"id":18227},"what-this-means-for-each-team","What this means for each team",[19,18230,18231],{},"The vision is not just a statement — it is a strategic filter. Every team should be able to explain how their work moves us toward governed, distributed industrial runtime infrastructure.",[164,18233,18235],{"id":18234},"marketing","📣 Marketing",[19,18237,18238],{},[423,18239,18240],{},"Lead with the pain. Land with the infrastructure.",[19,18242,18243],{},"Decision Speed is the emotional front door — downtime, delay, and data latency are universally felt pains that open conversations. Our category position, however, is industrial runtime infrastructure. Marketing should move prospects from urgency to conviction.",[144,18245,18246,18249,18252,18255],{},[147,18247,18248],{},"Use the \"hero culture\" and \"brittle scripts\" narrative as the primary top-of-funnel hook.",[147,18250,18251],{},"Avoid positioning FlowFuse as a Node-RED wrapper or data historian. Lead with \"distributed runtime.\"",[147,18253,18254],{},"Build the AI durability angle into thought leadership — we are the layer that survives AI commoditization of glue code.",[147,18256,18257],{},"Speak to industrial engineers first, digital transformation leads second. C-Suite messaging is downstream of those relationships.",[164,18259,18261],{"id":18260},"sales","🤝 Sales",[19,18263,18264],{},[423,18265,18266],{},"Enter through speed. Close on infrastructure.",[19,18268,18269],{},"Deals open when prospects feel the Decision Speed pain. They close when they believe in the infrastructure story. Use the vision to graduate conversations from tactical urgency to strategic architecture — that is where budget gets unlocked.",[144,18271,18272,18275,18278,18281],{},[147,18273,18274],{},"\"We need faster incident response\" opens the door; walk prospects to the architecture story from there.",[147,18276,18277],{},"In Z2 and enterprise accounts, lead with governed lifecycle and distributed runtime depth.",[147,18279,18280],{},"Multi-site scale (one plant → a hundred) is a powerful proof point for expansion conversations.",[147,18282,18283],{},"Frame the AI angle as a buying signal: customers thinking about AI-driven operations need runtime control first.",[164,18285,18287],{"id":18286},"️-product","⚙️ Product",[19,18289,18290],{},[423,18291,18292],{},"Build the runtime. Not just the flows.",[19,18294,18295],{},"Every roadmap decision should be measured against the runtime infrastructure vision. FlowFuse is not building a better Node-RED. We are building the governed, distributed backbone that industrial operations run on at scale.",[144,18297,18298,18301,18304,18307],{},[147,18299,18300],{},"Prioritise lifecycle management, versioning, and deployment discipline as first-class features.",[147,18302,18303],{},"Fleet-scale orchestration (multi-site, multi-device) is the core architectural differentiator — it should be a first-class concern in every design decision.",[147,18305,18306],{},"Validate and transform payloads; manage application lifecycle. These are runtime capabilities, not just routing.",[147,18308,18309],{},"Design for the customer who starts at one site and needs to reach fifty. Scalability is table stakes, not a premium feature.",[164,18311,18313],{"id":18312},"leadership-board","🧭 Leadership & Board",[19,18315,18316],{},[423,18317,18318],{},"The durable position in a shifting market.",[19,18320,18321],{},"As AI reshapes industrial software, glue code and data aggregation will be commoditized. The durable competitive position is runtime control, orchestration discipline, and governed deployment at scale. This is where FlowFuse is structurally advantaged.",[144,18323,18324,18330,18336,18342],{},[147,18325,18326,18329],{},[423,18327,18328],{},"Category frame:"," FlowFuse is not MES, not historian, not iPaaS. We are industrial runtime infrastructure.",[147,18331,18332,18335],{},[423,18333,18334],{},"AI tailwind:"," AI commoditizes the noise in our TAM. It expands demand for our signal — governed runtime control.",[147,18337,18338,18341],{},[423,18339,18340],{},"ICP:"," Industrial engineers and digital transformation leads remain our primary buyers. C-Suite is a secondary motion.",[147,18343,18344,18347],{},[423,18345,18346],{},"Enterprise expansion thesis:"," Z2 and multi-plant deployment is the beachhead for long-term enterprise value.",[14,18349,18351],{"id":18350},"strategic-context-ai-and-the-market","Strategic context: AI and the market",[19,18353,18354],{},"AI will commoditize glue logic, integrations, and data transformations — the things many industrial software vendors currently lead with. The durable layer is runtime control, versioning, deployment discipline, and distributed orchestration.",[19,18356,18357],{},"Customers thinking about AI-driven industrial operations need the runtime foundation first. This is not a threat to FlowFuse's position — it is a demand signal. Product, marketing, and sales strategy should build toward this explicitly.",{"title":75,"searchDepth":76,"depth":76,"links":18359},[18360,18361,18364,18370],{"id":18159,"depth":76,"text":18160},{"id":18170,"depth":76,"text":18171,"children":18362},[18363],{"id":18207,"depth":605,"text":18208},{"id":18227,"depth":76,"text":18228,"children":18365},[18366,18367,18368,18369],{"id":18234,"depth":605,"text":18235},{"id":18260,"depth":605,"text":18261},{"id":18286,"depth":605,"text":18287},{"id":18312,"depth":605,"text":18313},{"id":18350,"depth":76,"text":18351},{},{"title":18154,"description":75},"handbook\u002Fengineering\u002Fproduct\u002Fvision","hacXCigmMi8qP8-tojNLU3ffwhGc82EFMnydkfQB4o0",{"id":18376,"title":11706,"body":18377,"description":75,"extension":81,"meta":19107,"navGroup":83,"navOrder":83,"navTitle":11706,"navigation":84,"path":11705,"seo":19108,"stem":19109,"__hash__":19110},"handbook\u002Fhandbook\u002Fengineering\u002Fproject-management.md",{"type":7,"value":18378,"toc":19067},[18379,18382,18384,18387,18390,18404,18407,18411,18431,18434,18437,18440,18448,18452,18454,18457,18460,18463,18467,18470,18483,18486,18494,18497,18501,18504,18512,18515,18519,18530,18533,18537,18540,18543,18546,18554,18558,18561,18572,18575,18579,18582,18585,18588,18592,18595,18598,18608,18611,18614,18618,18621,18638,18641,18644,18647,18650,18653,18667,18670,18673,18677,18680,18687,18690,18704,18707,18711,18714,18717,18720,18724,18727,18730,18744,18748,18759,18762,18766,18769,18780,18784,18787,18790,18794,18797,18800,18803,18806,18810,18814,18817,18821,18832,18835,18839,18842,18856,18859,18863,18874,18878,18890,18898,18915,18918,18922,18936,18939,18943,18946,18949,18963,18966,18969,18986,18989,18992,18995,18998,19001,19030,19033,19036,19039,19046,19049,19056,19060],[10,18380,11706],{"id":18381},"project-management",[14,18383,2167],{"id":2166},[19,18385,18386],{},"Engineering at FlowFuse operates through a small set of intentional weekly rhythms.",[19,18388,18389],{},"These rhythms help us:",[144,18391,18392,18395,18398,18401],{},[147,18393,18394],{},"surface what matters",[147,18396,18397],{},"align on shared understanding",[147,18399,18400],{},"commit to work realistically",[147,18402,18403],{},"support engineers as they execute",[19,18405,18406],{},"Meetings, boards, and labels exist to support this workflow, not replace judgment or collaboration.",[14,18408,18410],{"id":18409},"tldr","TL;DR",[144,18412,18413,18416,18419,18422,18425,18428],{},[147,18414,18415],{},"Engineering work is guided by clear weekly rhythms, not ad hoc urgency.",[147,18417,18418],{},"The Monday engineering meeting is the highest-level forum for alignment and discussion.",[147,18420,18421],{},"Sprint planning (Friday) is where we commit to already-prioritized work and assign timeboxes.",[147,18423,18424],{},"Each engineer commits to 24 hours of timeboxed work per sprint.",[147,18426,18427],{},"Issue labels make work visible and sprint-ready; anything in a sprint must be fully labeled.",[147,18429,18430],{},"We are async-first, but pragmatic about using sync time when it helps.",[14,18432,13893],{"id":18433},"cadence",[19,18435,18436],{},"Engineering work follows a consistent weekly cadence designed to create alignment and focus.",[19,18438,18439],{},"That cadence is anchored by two core meetings:",[144,18441,18442,18445],{},[147,18443,18444],{},"the Monday Engineering Meeting",[147,18446,18447],{},"Sprint Planning on Friday",[14,18449,18451],{"id":18450},"weekly-engineering-meeting-monday","Weekly Engineering Meeting (Monday)",[19,18453,18418],{},[19,18455,18456],{},"It is dedicated engineering time to talk through what is top of mind for the team, share context, and surface concerns that need collective attention.",[19,18458,18459],{},"This meeting is not about status or reporting. It exists to ensure the team starts the week on the same page.",[19,18461,18462],{},"Notes and agenda live in a running Google Doc shared with the team.",[164,18464,18466],{"id":18465},"agenda-preparation","Agenda & Preparation",[19,18468,18469],{},"The meeting follows a lightweight, repeatable agenda inspired by the Bloom meeting format, typically including:",[144,18471,18472,18475,18477,18480],{},[147,18473,18474],{},"headlines",[147,18476,15822],{},[147,18478,18479],{},"issues to discuss",[147,18481,18482],{},"follow-ups or todos",[19,18484,18485],{},"Before the meeting:",[144,18487,18488,18491],{},[147,18489,18490],{},"engineers add topics they want to discuss to the issues list in the agenda document",[147,18492,18493],{},"topics should include enough context for others to understand why they matter",[19,18495,18496],{},"This ensures the agenda reflects real concerns, not just the loudest voices.",[164,18498,18500],{"id":18499},"issue-selection-discussion","Issue Selection & Discussion",[19,18502,18503],{},"At the start of the meeting:",[144,18505,18506,18509],{},[147,18507,18508],{},"engineers vote on which issues to discuss",[147,18510,18511],{},"issues are discussed in order of most votes first",[19,18513,18514],{},"This makes priority explicit and shared.",[164,18516,18518],{"id":18517},"timeboxing-carryover","Timeboxing & Carryover",[144,18520,18521,18524,18527],{},[147,18522,18523],{},"Every agenda item is timeboxed.",[147,18525,18526],{},"When time expires, discussion stops.",[147,18528,18529],{},"Unfinished topics carry over to the next meeting.",[19,18531,18532],{},"This keeps the meeting focused and protects collective time.",[14,18534,18536],{"id":18535},"sprint-planning-friday","Sprint Planning (Friday)",[19,18538,18539],{},"Sprint planning is a one-hour weekly meeting, typically held on Fridays (or the last business day of the week if there is a holiday).",[19,18541,18542],{},"This is where engineering commits to work.",[19,18544,18545],{},"Sprint planning has two goals:",[504,18547,18548,18551],{},[147,18549,18550],{},"Close the sprint that is finishing",[147,18552,18553],{},"Commit work for the sprint that begins the next business day",[164,18555,18557],{"id":18556},"closing-the-current-sprint","Closing the Current Sprint",[19,18559,18560],{},"We review:",[144,18562,18563,18566,18569],{},[147,18564,18565],{},"what was completed",[147,18567,18568],{},"what was not",[147,18570,18571],{},"whether any work is overflowing into the next sprint",[19,18573,18574],{},"The project board is updated to reflect reality. This is about accuracy and learning, not blame.",[14,18576,18578],{"id":18577},"development-board","Development Board",[19,18580,18581],{},"We use a GitHub Project board to make work visible and to reflect sprint reality.",[19,18583,18584],{},"The board shows what work is in progress, what is blocked, and what has shipped.",[19,18586,18587],{},"It is updated during sprint planning and throughout the week as work progresses.",[164,18589,18591],{"id":18590},"prioritization-happens-outside-sprint-planning","Prioritization Happens Outside Sprint Planning",[19,18593,18594],{},"Sprint planning is not a prioritization meeting.",[19,18596,18597],{},"Prioritization happens elsewhere, in conversations involving:",[144,18599,18600,18602,18605],{},[147,18601,11640],{},[147,18603,18604],{},"Engineering Management",[147,18606,18607],{},"the CTO",[19,18609,18610],{},"Sprint planning assumes this work has already been prioritized.",[19,18612,18613],{},"If new priorities surface during sprint planning, they are handled outside the meeting and brought back later.",[164,18615,18617],{"id":18616},"planning-the-next-sprint","Planning the Next Sprint",[19,18619,18620],{},"During sprint planning:",[144,18622,18623,18626,18629,18632,18635],{},[147,18624,18625],{},"engineers select from already-prioritized work",[147,18627,18628],{},"scope is confirmed",[147,18630,18631],{},"timeboxes are assigned",[147,18633,18634],{},"blockers and dependencies are surfaced",[147,18636,18637],{},"work is committed or deferred",[19,18639,18640],{},"Each engineer commits to up to 24 hours of timeboxed work per sprint.",[19,18642,18643],{},"Timeboxes represent expected effort, not performance targets.",[14,18645,15249],{"id":18646},"feature-demos",[19,18648,18649],{},"Completing a meaningful piece of work often includes demonstrating it.",[19,18651,18652],{},"Feature demos help to:",[144,18654,18655,18658,18661,18664],{},[147,18656,18657],{},"share context across the team",[147,18659,18660],{},"validate that work delivers the intended value",[147,18662,18663],{},"surface gaps or follow-up ideas early",[147,18665,18666],{},"support release communication and storytelling",[19,18668,18669],{},"Demos should be lightweight and timely.",[19,18671,18672],{},"If questions, issues, or improvement ideas come up during a demo, they should be captured as GitHub issues and planned like any other work.",[14,18674,18676],{"id":18675},"changelog-release-communication","Changelog & Release Communication",[19,18678,18679],{},"Some completed work is communicated externally via the FlowFuse changelog and release highlights.",[19,18681,18682,18683,549],{},"For detailed guidance on writing changelog posts, see ",[46,18684,18686],{"href":18685},"\u002Fhandbook\u002Fengineering\u002Freleases\u002Fwriting-changelog\u002F","Writing Changelog Posts",[19,18688,18689],{},"Work may be changelog-worthy when it:",[144,18691,18692,18695,18698,18701],{},[147,18693,18694],{},"delivers visible user value",[147,18696,18697],{},"introduces new functionality or behavior",[147,18699,18700],{},"significantly improves an existing workflow",[147,18702,18703],{},"fixes an impactful or user-facing bug",[19,18705,18706],{},"Ownership of publishing changelog entries may evolve over time. Regardless of ownership, engineering is responsible for surfacing notable work and relevant context.",[164,18708,18710],{"id":18709},"communicating-highlights-to-product-marketing","Communicating Highlights to Product & Marketing",[19,18712,18713],{},"Engineering shares release highlights through the standing Product ↔ Marketing Sync, a fortnightly meeting held during weeks 2 and 4 of the release cycle.",[19,18715,18716],{},"The Engineering Manager represents engineering in this meeting.",[19,18718,18719],{},"Issue labels are used to help Engineering Managers identify which completed or in-flight items may be relevant to share.",[14,18721,18723],{"id":18722},"issue-labels-how-we-make-work-visible","Issue Labels (How We Make Work Visible)",[19,18725,18726],{},"Issue labels are a shared contract that support planning and execution.",[19,18728,18729],{},"From the labels alone, an engineer should be able to understand:",[144,18731,18732,18735,18738,18741],{},[147,18733,18734],{},"what kind of work an issue represents",[147,18736,18737],{},"where it lives in the system",[147,18739,18740],{},"how much effort it is expected to take",[147,18742,18743],{},"whether it is ready to be worked",[164,18745,18747],{"id":18746},"when-labels-are-applied","When Labels Are Applied",[144,18749,18750,18753,18756],{},[147,18751,18752],{},"Labels are applied before and during sprint planning.",[147,18754,18755],{},"Sprint planning is where labeling is finalized.",[147,18757,18758],{},"Any issue committed to a sprint must be fully labeled.",[19,18760,18761],{},"If required information is missing, the issue is not ready to be worked.",[164,18763,18765],{"id":18764},"effort-timeboxing","Effort & Timeboxing",[19,18767,18768],{},"Timeboxes indicate expected effort, not complexity or importance.",[144,18770,18771,18774,18777],{},[147,18772,18773],{},"Timeboxes are intentionally small.",[147,18775,18776],{},"Work larger than a few hours must be broken down.",[147,18778,18779],{},"Unclear work is marked explicitly.",[14,18781,18783],{"id":18782},"defining-done","Defining Done",[19,18785,18786],{},"An issue is considered done when it is merged and deployed, and any required follow-up (documentation, validation, or release communication) is complete.",[19,18788,18789],{},"If work is not shipped or not validated, it is not done.",[14,18791,18793],{"id":18792},"ad-hoc-collaboration-async-first-flexible","Ad Hoc Collaboration (Async-First, Flexible)",[19,18795,18796],{},"Engineering at FlowFuse is async-first by default.",[19,18798,18799],{},"We prefer written context, Slack threads, issues, and docs that preserve focus time.",[19,18801,18802],{},"At the same time, we are pragmatic and flexible.",[19,18804,18805],{},"Engineers are encouraged to use quick Slack huddles, pairing sessions, or short syncs when they are the fastest way to unblock work or align.",[14,18807,18809],{"id":18808},"worked-example","Worked Example",[164,18811,18813],{"id":18812},"scenario","Scenario",[19,18815,18816],{},"A recurring issue where Node-RED flows sometimes fail to deploy after an upgrade.",[164,18818,18820],{"id":18819},"monday-engineering-meeting","Monday Engineering Meeting",[144,18822,18823,18826,18829],{},[147,18824,18825],{},"An engineer adds the topic to the agenda issues list with brief context.",[147,18827,18828],{},"The team votes and discusses the issue.",[147,18830,18831],{},"The group agrees it needs investigation, but scope is unclear.",[19,18833,18834],{},"No sprint commitment is made. The meeting creates alignment, not assignments.",[164,18836,18838],{"id":18837},"issue-creation","Issue Creation",[19,18840,18841],{},"A GitHub issue is created with:",[144,18843,18844,18847,18850,18853],{},[147,18845,18846],{},"a clear work item type",[147,18848,18849],{},"a single work type",[147,18851,18852],{},"relevant area labels",[147,18854,18855],{},"time:TBD",[19,18857,18858],{},"The issue is visible but intentionally not sprint-ready.",[164,18860,18862],{"id":18861},"sprint-planning","Sprint Planning",[144,18864,18865,18868,18871],{},[147,18866,18867],{},"The work has been prioritized outside sprint planning.",[147,18869,18870],{},"During planning, the team agrees to break it into smaller tasks.",[147,18872,18873],{},"An investigation task is created, timeboxed, and pulled into the sprint.",[164,18875,18877],{"id":18876},"execution","Execution",[10,18879,18881,18882,18885,18886,549],{"id":18880},"headsrchandbookengineeringproject-managementmdas-per-our-product-strategy-our-product-is-broken-into-three-pillars-build-manage-and-deploy-within-these-pillars-we-have-a-collection-of-areas","\u003C\u003C\u003C\u003C\u003C\u003C\u003C HEAD:src\u002Fhandbook\u002Fengineering\u002Fproject-management.md\nAs per our ",[46,18883,16714],{"href":18884},"\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fstrategy\u002F",", our product is broken into three pillars - Build, Manage and Deploy. Within these pillars we have a collection of ",[46,18887,18889],{"href":18888},"\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fstrategy\u002F#product-pillars","Areas",[144,18891,18892,18895],{},[147,18893,18894],{},"The investigation task is worked.",[147,18896,18897],{},"Any additional work discovered is brought back through planning.",[2672,18899,18900],{},[2672,18901,18902],{},[2672,18903,18904],{},[2672,18905,18906],{},[2672,18907,18908],{},[2672,18909,18910],{},[2672,18911,18912],{},[19,18913,18914],{},"origin\u002Fmain:src\u002Fhandbook\u002Fdevelopment\u002Fproject-management.md",[19,18916,18917],{},"This keeps work small, explicit, and intentional.",[14,18919,18921],{"id":18920},"how-the-pieces-fit-together","How the Pieces Fit Together",[144,18923,18924,18927,18930,18933],{},[147,18925,18926],{},"The Monday engineering meeting builds alignment and shared understanding.",[147,18928,18929],{},"Sprint planning commits to a realistic slice of already-prioritized work.",[147,18931,18932],{},"Issue labels make that work explicit and visible.",[147,18934,18935],{},"Async-first collaboration supports day-to-day execution.",[19,18937,18938],{},"Together, these create a system that favors clarity over urgency, small work over heroic effort, and shared understanding over silent assumptions.",[14,18940,18942],{"id":18941},"engineering-kpis","Engineering KPIs",[19,18944,18945],{},"These metrics help us observe how well the engineering system described above is functioning over time.",[19,18947,18948],{},"They are used to understand trends and surface constraints, not to evaluate individual performance or enforce targets.",[144,18950,18951,18957],{},[147,18952,18953,18956],{},[423,18954,18955],{},"UI\u002FUX Work:"," This is generally work in Figma for product, website or the components library. Deliverables should be well-defined as an MVP prototype, or at least enough for engineering to get started, on which we can iterate.",[147,18958,18959,18962],{},[423,18960,18961],{},"Engineering:","  Questions that need answers should be formulated up front, and answered as the deliverable. Questions around what technology to use, how to scope down the feature set, and how to deliver the results\nare thus required before the design sprint start.",[1019,18964,18783],{"id":18965},"defining-done-1",[19,18967,18968],{},"An item should only be marked as 'Done' on the Development board when the following\ncriteria are met:",[144,18970,18971,18974,18977,18980,18983],{},[147,18972,18973],{},"All related code changes have been merged",[147,18975,18976],{},"Suitable unit\u002Fsystem level tests have been added",[147,18978,18979],{},"Documentation has been updated",[147,18981,18982],{},"Acceptance criteria identified in the Story have been met",[147,18984,18985],{},"Feature Demo",[1019,18987,15249],{"id":18988},"feature-demos-1",[19,18990,18991],{},"Part of finishing an item is being able to demonstrate it in action. This allows\nothers to see it in action, generate material for the release announcement and\nhelp identify any gaps or places for improvement.",[19,18993,18994],{},"Each feature demo is recorded by the developer responsible for the feature, detailing its functions and operations. If problems, challenges, or improvement ideas arise during the review of the demo, everyone is encouraged to post a comment under the video within the Slack channel. Additionally, a corresponding GitHub issue should be opened to track and prioritize these points for further discussion and action.",[19,18996,18997],{},"Demos must be done in good time and as early as possible to allow for any follow-up action.",[19,18999,19000],{},"Demos should consist of:",[144,19002,19003,19006,19009,19012,19021],{},[147,19004,19005],{},"A short (\u003C 5 minute where possible) screen capture walk through of the feature with commentary.",[147,19007,19008],{},"It should cover the feature from a users perspective - what value do they get from it.",[147,19010,19011],{},"The video should be uploaded to, or linked to, in the relevant issue.",[147,19013,19014,19015,19020],{},"A post in the ",[46,19016,19018],{"href":873,"rel":19017},[108],[542,19019,877],{}," Slack channel once work is ready to be delivered.",[147,19022,19023,19024,19026,19027,11585],{},"Intermediate demos used to refine scope or gather feedback during a sprint should be shared in the relevant ",[542,19025,955],{}," channel instead (see ",[46,19028,623],{"href":19029},"\u002Fhandbook\u002Fcompany\u002Fcommunication\u002F#project-channels",[19,19031,19032],{},"We no longer use Engineering Throughput as a primary metric.",[19,19034,19035],{},"Instead, we track Engineering Time to Value (median and P75) and ticket type distribution to understand delivery speed and bottlenecks.",[164,19037,6875],{"id":19038},"engineering-time-to-value-median",[19,19040,19041,19043,19045],{},[423,19042,18410],{},[9379,19044],{},"\nHow long a typical piece of engineering work takes to go from started to done.",[164,19047,6878],{"id":19048},"engineering-time-to-value-p75",[19,19050,19051,19053,19055],{},[423,19052,18410],{},[9379,19054],{},"\nHow long the slowest 25% of engineering work takes to go from started to done.",[164,19057,19059],{"id":19058},"ticket-type-distribution","Ticket Type Distribution",[19,19061,19062,19064,19066],{},[423,19063,18410],{},[9379,19065],{},"\nThe ratio of feature work to other work (bugs, chores, maintenance).",{"title":75,"searchDepth":76,"depth":76,"links":19068},[19069,19070,19071,19072,19077,19080,19084,19085,19088,19092,19093,19094,19101,19102],{"id":2166,"depth":76,"text":2167},{"id":18409,"depth":76,"text":18410},{"id":18433,"depth":76,"text":13893},{"id":18450,"depth":76,"text":18451,"children":19073},[19074,19075,19076],{"id":18465,"depth":605,"text":18466},{"id":18499,"depth":605,"text":18500},{"id":18517,"depth":605,"text":18518},{"id":18535,"depth":76,"text":18536,"children":19078},[19079],{"id":18556,"depth":605,"text":18557},{"id":18577,"depth":76,"text":18578,"children":19081},[19082,19083],{"id":18590,"depth":605,"text":18591},{"id":18616,"depth":605,"text":18617},{"id":18646,"depth":76,"text":15249},{"id":18675,"depth":76,"text":18676,"children":19086},[19087],{"id":18709,"depth":605,"text":18710},{"id":18722,"depth":76,"text":18723,"children":19089},[19090,19091],{"id":18746,"depth":605,"text":18747},{"id":18764,"depth":605,"text":18765},{"id":18782,"depth":76,"text":18783},{"id":18792,"depth":76,"text":18793},{"id":18808,"depth":76,"text":18809,"children":19095},[19096,19097,19098,19099,19100],{"id":18812,"depth":605,"text":18813},{"id":18819,"depth":605,"text":18820},{"id":18837,"depth":605,"text":18838},{"id":18861,"depth":605,"text":18862},{"id":18876,"depth":605,"text":18877},{"id":18920,"depth":76,"text":18921},{"id":18941,"depth":76,"text":18942,"children":19103},[19104,19105,19106],{"id":19038,"depth":605,"text":6875},{"id":19048,"depth":605,"text":6878},{"id":19058,"depth":605,"text":19059},{},{"title":11706,"description":75},"handbook\u002Fengineering\u002Fproject-management","TUgqMrk4vvAAHGNsWOSvKnYzHgLxECdazOLHi2q4AVE",{"id":19112,"title":19113,"body":19114,"description":19121,"extension":81,"meta":19266,"navGroup":83,"navOrder":83,"navTitle":19267,"navigation":84,"path":19268,"seo":19269,"stem":19270,"__hash__":19271},"handbook\u002Fhandbook\u002Fengineering\u002Freleases\u002Fdashboard-2.md","Dashboard 2.0 Release Process",{"type":7,"value":19115,"toc":19261},[19116,19119,19122,19126,19156,19160,19228,19232,19238,19258],[10,19117,19113],{"id":19118},"dashboard-20-release-process",[19,19120,19121],{},"The following steps are taken in order to cut a release for Node-RED Dashboard 2.0:",[14,19123,19125],{"id":19124},"code-version-updates","Code (Version) Updates",[144,19127,19128,19134,19142,19148,19153],{},[147,19129,19130,19131,19133],{},"Update the ",[542,19132,10251],{}," to the new version number",[147,19135,19136,19139,19140],{},[542,19137,19138],{},"npm install"," locally to update the ",[542,19141,10254],{},[147,19143,19144,19145],{},"Commit the changes to the two files to a new branch named ",[542,19146,19147],{},"vX.Y.X",[147,19149,19150,19151],{},"Push the changes to the branch, and open a Pull Request, titled ",[542,19152,19147],{},[147,19154,19155],{},"Have someone else review the Pull Request, and merge when approved",[14,19157,19159],{"id":19158},"github-release","GitHub Release",[144,19161,19162,19173,19180,19183,19217,19220],{},[147,19163,19164,19165,19169,19170],{},"Navigate to the Dashboard ",[46,19166,11717],{"href":19167,"rel":19168},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fnode-red-dashboard\u002Freleases",[108]," page and click ",[2562,19171,19172],{},"\"Draft a new release\"",[147,19174,19175,19176,19179],{},"In the \"Choose a tag\" dropdown, type in the new version number, and select the ",[2562,19177,19178],{},"\"Create new tag vX.Y.X\""," option",[147,19181,19182],{},"Select \"Generate release notes\", this will auto-populate with all Pull Requests contained within the release.",[147,19184,19185,19186],{},"Manually group the list of PRs in the release notes into the following categories:\n",[144,19187,19188,19194,19200,19205,19211],{},[147,19189,19190,19193],{},[423,19191,19192],{},"New Widgets & Variations:"," For any new widgets\u002Fnodes, or types of a widget, e.g. new chart types or gauge types.",[147,19195,19196,19199],{},[423,19197,19198],{},"Fixes & Improvements:"," Bug fixes and\u002For smaller improvements to existing code.",[147,19201,19202,19204],{},[423,19203,9787],{}," Any PRs dedicated to documentation improvements.",[147,19206,19207,19210],{},[423,19208,19209],{},"Dependencies:"," PRs linked to changing a version number of a dependency, or adding a new dependency.",[147,19212,19213,19216],{},[423,19214,19215],{},"Administration:"," PRs that are related to the administration of the repository, e.g. CI\u002FCD changes, etc.",[147,19218,19219],{},"Click \"Publish Release\"",[147,19221,19222,19223],{},"Doing so will automatically trigger the publication of the updates to npm via a ",[46,19224,19227],{"href":19225,"rel":19226},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fnode-red-dashboard\u002Factions",[108],"GitHub Action",[14,19229,19231],{"id":19230},"publish-to-node-red-palette-manager","Publish to Node-RED Palette Manager",[19,19233,19234,19235,19237],{},"Once the package has been updated on ",[542,19236,11160],{},", you need to update the entry for Dashboard 2.0 in Node-RED Palette Manager too:",[144,19239,19240,19248,19255],{},[147,19241,9867,19242,19247],{},[46,19243,19246],{"href":19244,"rel":19245},"https:\u002F\u002Fflows.nodered.org\u002Fadd\u002Fnode",[108],"\"Adding a node\""," section of the Node-RED Palette Manager",[147,19249,19250,19251,19254],{},"Enter ",[542,19252,19253],{},"@flowfuse\u002Fnode-red-dashboard"," into the library name field",[147,19256,19257],{},"Click \"Add Node\"",[19,19259,19260],{},"Within the next 25-30 minutes, the entry Node-RED's Palette Manager will live update for all Node-RED's worldwide.",{"title":75,"searchDepth":76,"depth":76,"links":19262},[19263,19264,19265],{"id":19124,"depth":76,"text":19125},{"id":19158,"depth":76,"text":19159},{"id":19230,"depth":76,"text":19231},{},"Dashboard 2.0 Releases","\u002Fhandbook\u002Fengineering\u002Freleases\u002Fdashboard-2",{"title":19113,"description":19121},"handbook\u002Fengineering\u002Freleases\u002Fdashboard-2","ae3QQ8Fd2z0D0q1RZwrqXdyuwucghQ44XxClIuSvnoo",{"id":19273,"title":19274,"body":19275,"description":19321,"extension":81,"meta":19322,"navGroup":83,"navOrder":83,"navTitle":19323,"navigation":84,"path":19324,"seo":19325,"stem":19326,"__hash__":19327},"handbook\u002Fhandbook\u002Fengineering\u002Freleases\u002Fdigital-ocean.md","Digital Ocean Release Process",{"type":7,"value":19276,"toc":19319},[19277,19280,19289,19292],[10,19278,19274],{"id":19279},"digital-ocean-release-process",[19,19281,19282,19283,19288],{},"When a release is tagged in the ",[46,19284,19287],{"href":19285,"rel":19286},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fdigital-ocean",[108],"Digital Ocean","\nrepository a GitHub Action will run and rebuild the image.",[19,19290,19291],{},"Once complete the Release Manager should post to the #dev slack chanel to ask somebody with\nDigital Ocean access to do the following steps.",[504,19293,19294,19297,19300,19307,19310,19313,19316],{},[147,19295,19296],{},"Log into the FlowFuse team on Digital Ocean",[147,19298,19299],{},"Navigate to the \"Backups & Snapshots\" section, from the \"Manage\" options in the left hand menu",[147,19301,19302,19303],{},"Select the new image from the \"Droplets\" list and click on \"More\"\n",[1724,19304],{"alt":19305,"src":19306},"Digital Ocean Images view","\u002Fhandbook\u002Fimages\u002Freleases\u002Fdo-update-market-place.png",[147,19308,19309],{},"Select the \"Update Marketplace 1-Click App\"",[147,19311,19312],{},"Select the FlowFuse entry, not the old FlowForge entry",[147,19314,19315],{},"Update the version numbers and any documentation in the Marketplace form",[147,19317,19318],{},"Submit the new image for review, this will take 3-4 days before the new version is on\nthe Market Place",{"title":75,"searchDepth":76,"depth":76,"links":19320},[],"When a release is tagged in the Digital Ocean\nrepository a GitHub Action will run and rebuild the image.",{},"Release Process - Digital Ocean","\u002Fhandbook\u002Fengineering\u002Freleases\u002Fdigital-ocean",{"title":19274,"description":19321},"handbook\u002Fengineering\u002Freleases\u002Fdigital-ocean","NRBcPNK8PNo1BerrDkrWRaCv6761mSUwvHYWZs99-0o",{"id":19329,"title":11717,"body":19330,"description":75,"extension":81,"meta":19375,"navGroup":83,"navOrder":83,"navTitle":11717,"navigation":84,"path":19376,"seo":19377,"stem":19378,"__hash__":19379},"handbook\u002Fhandbook\u002Fengineering\u002Freleases\u002Findex.md",{"type":7,"value":19331,"toc":19371},[19332,19334,19346,19350,19358,19362,19365,19368],[10,19333,11717],{"id":11716},[144,19335,19336,19341],{},[147,19337,19338,19340],{},[46,19339,11725],{"href":11724}," - Instructions for creating a release are found in the Release Process",[147,19342,19343,19345],{},[46,19344,19287],{"href":19324}," - How to deploy to Digital Ocean",[14,19347,19349],{"id":19348},"node-red-dashboard-20","Node-RED Dashboard 2.0",[144,19351,19352],{},[147,19353,19354,19357],{},[46,19355,19356],{"href":19268},"Dashboard Release Process"," - Release instructions for the Dashboard 2.0",[14,19359,19361],{"id":19360},"beta-release","Beta Release",[19,19363,19364],{},"FlowFuse will release features in beta when it is known to be an early version that may lack features or functions that are intended to be made available at a later date. Pricing is generally a follow up function, and thus things might be released as Beta without pricing, where later the company might charge for the feature. The goal of releasing a feature in beta is that it provides for rapid learning of how users engage with the feature, as this informs later product development.",[19,19366,19367],{},"Beta features can only be introduced in tiers where we expect them to remain once they are successful. If no clear tier can be established for a beta feature, it must be introduced in the Enterprise tier, as moving features down to lower tiers is easier than moving them up. All beta features will be introduced in the licensed, non-open source version to allow the company the freedom to change things as needed.",[19,19369,19370],{},"Features initially released as beta versions may later be deprecated entirely, drastically reconfigured, priced differently, or in other ways very significantly revised compared to their initial beta version.",{"title":75,"searchDepth":76,"depth":76,"links":19372},[19373,19374],{"id":19348,"depth":76,"text":19349},{"id":19360,"depth":76,"text":19361},{},"\u002Fhandbook\u002Fengineering\u002Freleases",{"title":11717,"description":75},"handbook\u002Fengineering\u002Freleases\u002Findex","jFNYGWeLCx5t4eYqAJh5u8lsXqxGBCqP9-d9lVOKN9s",{"id":19381,"title":11725,"body":19382,"description":19389,"extension":81,"meta":20080,"navGroup":83,"navOrder":83,"navTitle":11725,"navigation":84,"path":11724,"seo":20081,"stem":20082,"__hash__":20083},"handbook\u002Fhandbook\u002Fengineering\u002Freleases\u002Fprocess.md",{"type":7,"value":19383,"toc":20066},[19384,19387,19390,19410,19413,19420,19424,19431,19498,19501,19504,19518,19525,19531,19537,19543,19547,19551,19559,19564,19568,19575,19579,19582,19585,19687,19712,19726,19734,19738,19748,19751,19877,19881,19884,19899,19905,19909,19912,19915,19918,19925,19964,19972,19975,19978,19981,20039,20042,20049,20053,20056,20063],[10,19385,11725],{"id":19386},"release-process",[19,19388,19389],{},"We do two types of releases:",[144,19391,19392,19401],{},[147,19393,19394,3279,19398],{},[46,19395,19397],{"href":19396},"#scheduled-releases","Scheduled Releases",[2562,19399,19400],{},"for the planned release of the entire set of product repositories.",[147,19402,19403,3279,19407],{},[46,19404,19406],{"href":19405},"#fix-releases","Fix Releases",[2562,19408,19409],{},"for ad-hoc release of individual repositories.",[14,19411,19397],{"id":19412},"scheduled-releases",[19,19414,19415,19416,19419],{},"We publish a new release of FlowFuse in line with our ",[46,19417,19418],{"href":8889},"release plan",". Each\nrelease has a Release Manager who oversees the process. This role rotates around\nthe team to ensure everyone is able to do it and that we don't have any single\npoints of failure in the process.",[164,19421,19423],{"id":19422},"setup","Setup",[19,19425,19426,19427,19430],{},"The Release Manager should take the following steps at the ",[2562,19428,19429],{},"start"," of the release\niteration:",[144,19432,19433,19441,19444],{},[147,19434,19435,19436,549],{},"Create a Release checklist issue using the ",[46,19437,19440],{"href":19438,"rel":19439},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fadmin\u002Fissues\u002Fnew?assignees=&labels=&template=release.md&title=Release%3A",[108],"Release Checklist template",[147,19442,19443],{},"Assign the issue to the Release Manager",[147,19445,19446,19447],{},"Ensure the following tools are installed and working:\n",[144,19448,19449,19469,19484,19491],{},[147,19450,19451,19452],{},"git command-line tools\n",[144,19453,19454,19460],{},[147,19455,19456,19457],{},"Ensure ssh key access is setup so git interactions do not require continual\npassword typing - ",[542,19458,19459],{},"ssh -T git@github.com",[147,19461,19462,19463,2040,19466],{},"Ensure you have git configured with an appropriate ",[542,19464,19465],{},"user.name",[542,19467,19468],{},"user.email",[147,19470,19471,19476],{},[46,19472,19475],{"href":19473,"rel":19474},"https:\u002F\u002Fgithub.com\u002Fcli\u002Fcli",[108],"GitHub client",[144,19477,19478],{},[147,19479,19480,19481],{},"Ensure the client is logged in using ",[542,19482,19483],{},"gh auth login",[147,19485,19486],{},[46,19487,19490],{"href":19488,"rel":19489},"https:\u002F\u002Fstedolan.github.io\u002Fjq\u002Fdownload\u002F",[108],"jq",[147,19492,19493],{},[46,19494,19497],{"href":19495,"rel":19496},"https:\u002F\u002Fmikefarah.gitbook.io\u002Fyq\u002F#install",[108],"yq",[19,19499,19500],{},"On release day, the Release Manager takes the lead in running the release process,\nfollowing the steps in the checklist.",[19,19502,19503],{},"The release is split into four phases:",[504,19505,19506,19509,19512,19515],{},[147,19507,19508],{},"Phase One: Check parts not covered by the automation are up to date.",[147,19510,19511],{},"Phase Two: Run the release automation and verify each stage completes properly.",[147,19513,19514],{},"Phase Three: Steps to deploy the release to Staging\u002FProduction environments.",[147,19516,19517],{},"Phase Four: Publicise the release.",[19,19519,19520,19521,549],{},"The Release Manager chooses when to start the release process. We usually aim to\nstart the release process at 10am\u002F11am (UK\u002FCET) as that gets to the end of Phase\nTwo before the team ",[46,19522,19524],{"href":19523},"#launch-lunch","Launch Lunch",[19,19526,19527,19528,19530],{},"A huddle should be started in the ",[542,19529,12422],{}," channel at the start of the process to\nenable others to contribute where needed.",[19,19532,19533,19534,19536],{},"It is also useful for the wider team if the Release Manager posts status updates\nto ",[542,19535,12422],{}," throughout the process.",[19,19538,19539,19540,19542],{},"If at any point a team member identifies a problem that needs checking before the\nrelease can continue, they should post a message to ",[542,19541,12422],{}," and join the huddle\nto ensure the Release Manage is aware.",[164,19544,19546],{"id":19545},"phase-one","Phase One",[239,19548,19550],{"id":19549},"check-development-board","Check Development Board",[19,19552,19553,19554,19558],{},"Check the ",[46,19555,18578],{"href":19556,"rel":19557},"https:\u002F\u002Fgithub.com\u002Forgs\u002FFlowFuse\u002Fprojects\u002F1\u002Fviews\u002F33",[108],"\nfor any items still in the 'Verify' column. Check what actions need to be completed\nto resolve them.",[19,19560,19561,19563],{},[423,19562,8290],{}," Items should have already been verified by the engineering team before\nrelease day. Leaving verification to release day leaves no time to resolve any\nnewly discovered issues.",[239,19565,19567],{"id":19566},"check-usage-ping-collector-is-up-to-date","Check Usage Ping Collector is up to date",[19,19569,19570,19571,19574],{},"Ensure ",[46,19572,19573],{"href":75},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fusage-ping-collector"," has been updated. The CTO\ntracks this and will flag if an update is needed.",[239,19576,19578],{"id":19577},"unmanaged-repositories","Unmanaged Repositories",[19,19580,19581],{},"Not all repositories are covered by the release automation and must be published\nseparately. This is typically done by the development team in the build up to the\nfull release and should be coordinated by the CTO or Senior Engineer prior to release\nday.",[19,19583,19584],{},"The Release Manager should verify the following projects are up to date and\nhave been published as needed.",[144,19586,19587,19596,19605,19614,19623,19632,19641,19650,19659,19668,19678],{},[147,19588,19589],{},[46,19590,19593],{"href":19591,"rel":19592},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fdevice-agent",[108],[542,19594,19595],{},"flowfuse\u002Fdevice-agent",[147,19597,19598],{},[46,19599,19602],{"href":19600,"rel":19601},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fdevice-agent\u002Ftree\u002Fmain\u002Finstaller#release-process",[108],[542,19603,19604],{},"flowfuse\u002Fdevice-agent\u002Finstaller",[147,19606,19607],{},[46,19608,19611],{"href":19609,"rel":19610},"https:\u002F\u002Fwww.github.com\u002Fflowfuse\u002Fnr-project-nodes",[108],[542,19612,19613],{},"flowfuse\u002Fnr-project-nodes",[147,19615,19616],{},[46,19617,19620],{"href":19618,"rel":19619},"https:\u002F\u002Fwww.github.com\u002Fflowfuse\u002Fnr-file-nodes",[108],[542,19621,19622],{},"flowfuse\u002Fnr-file-nodes",[147,19624,19625],{},[46,19626,19629],{"href":19627,"rel":19628},"https:\u002F\u002Fwww.github.com\u002Fflowfuse\u002Fnr-tools-plugin",[108],[542,19630,19631],{},"flowfuse\u002Fnr-tools-plugin",[147,19633,19634],{},[46,19635,19638],{"href":19636,"rel":19637},"https:\u002F\u002Fwww.github.com\u002Fflowfuse\u002Fnr-assistant",[108],[542,19639,19640],{},"flowfuse\u002Fnr-assistant",[147,19642,19643],{},[46,19644,19647],{"href":19645,"rel":19646},"https:\u002F\u002Fwww.github.com\u002Fflowfuse\u002Fnr-mqtt-nodes",[108],[542,19648,19649],{},"flowfuse\u002Fnr-mqtt-nodes",[147,19651,19652],{},[46,19653,19656],{"href":19654,"rel":19655},"https:\u002F\u002Fwww.github.com\u002Fflowfuse\u002Fnr-tables-nodes",[108],[542,19657,19658],{},"flowfuse\u002Fnr-tables-nodes",[147,19660,19661],{},[46,19662,19665],{"href":19663,"rel":19664},"https:\u002F\u002Fwww.github.com\u002Fflowfuse\u002Fnr-subflow-export",[108],[542,19666,19667],{},"flowfuse\u002Fnr-subflow-export",[147,19669,19670,19677],{},[46,19671,19674],{"href":19672,"rel":19673},"https:\u002F\u002Fwww.github.com\u002Fflowfuse\u002Fverdaccio-ff-auth",[108],[542,19675,19676],{},"flowfuse\u002Fverdaccio-ff-auth"," (This is not published to npmjs at this time)",[147,19679,19680],{},[46,19681,19684],{"href":19682,"rel":19683},"https:\u002F\u002Fwww.github.com\u002Fflowfuse\u002Fmqtt-schema-agent",[108],[542,19685,19686],{},"flowfuse\u002Fmqtt-schema-agent",[19,19688,19689,19690,1755,19697,19699,19700,2038,19703,2038,19706,2038,19709,549],{},"Verify ",[46,19691,19694],{"href":19692,"rel":19693},"https:\u002F\u002Fwww.github.com\u002F\u002Fflowfuse\u002Fnr-launcher",[108],[542,19695,19696],{},"flowfuse\u002Fflowfuse-nr-launcher",[542,19698,10251],{}," has been updated to pull in the latest versions of ",[542,19701,19702],{},"file-nodes",[542,19704,19705],{},"persistent-context",[542,19707,19708],{},"project-nodes",[542,19710,19711],{},"nr-assistant",[19,19713,19714,19715,19720,19721,19725],{},"Verify that the helm\u002Fnode-red-container Dockerfiles point to the latest Node-RED release (e.g. 3.1.x) and that both the helm ",[46,19716,19719],{"href":19717,"rel":19718},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fhelm\u002Fblob\u002Fmain\u002Fflowforge-container\u002Finstall-device-cache.sh",[108],"install-device-cache.sh"," and docker-compose ",[46,19722,19719],{"href":19723,"rel":19724},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fdocker-compose\u002Fblob\u002Fmain\u002Fflowforge-docker\u002Finstall-device-cache.sh",[108]," have been updated.",[19,19727,19728,19729,19733],{},"If any need to be updated, refer to the section ",[46,19730,19732],{"href":19731},"#unmanaged-releases","Unmanaged Releases"," for releasing these.",[164,19735,19737],{"id":19736},"phase-two","Phase Two",[19,19739,19740,19741,19744,19745,5361],{},"This phase is largely automated using the ",[542,19742,19743],{},"create-release"," script in the ",[542,19746,19747],{},"admin",[19,19749,19750],{},"Follow these steps to run the script:",[504,19752,19753,19765,19870],{},[147,19754,19755,19756,19761,19762,549],{},"Clone the ",[46,19757,19759],{"href":5941,"rel":19758},[108],[542,19760,13236],{}," repository if you do not already have it.\nEnsure you have the latest with a ",[542,19763,19764],{},"git pull",[147,19766,9856,19767,19770,19771,19773,19774,19777,19778,19791,19793,19794,549,19797,19799,19800],{},[2562,19768,19769],{},"parent"," directory to where you have the ",[542,19772,19747],{}," checked out, run the\nfollowing command, replace ",[542,19775,19776],{},"1.x.y"," with the proper release version.",[557,19779,19781],{"className":11151,"code":19780,"language":11153,"meta":75,"style":75},".\u002Fadmin\u002Fcreate-release 1.x.y\n",[542,19782,19783],{"__ignoreMap":75},[2403,19784,19785,19788],{"class":2405,"line":2406},[2403,19786,19787],{"class":2758},".\u002Fadmin\u002Fcreate-release",[2403,19789,19790],{"class":2765}," 1.x.y\n",[9379,19792],{},"This will create a directory called ",[542,19795,19796],{},"release-1.x.y",[9379,19798],{},"Then, for each managed repository in turn it will:",[144,19801,19802,19805,19808,19822,19830,19836,19839,19842,19850,19853,19867],{},[147,19803,19804],{},"Checks if a matching GitHub release already exists, if so it moves on to the next repo.",[147,19806,19807],{},"Checks for any outstanding PRs and waits for confirmation to continue if it finds any.",[147,19809,19810,19811],{},"Checks to see if the repo has already been cloned into the release directory.\n",[144,19812,19813,19819],{},[147,19814,19815,19816,19818],{},"if it has been, ensures it is on ",[542,19817,1575],{}," and pulls from origin",[147,19820,19821],{},"otherwise, clones it",[147,19823,19824,19825],{},"Checks that all @flowfuse\u002F* dependencies are on npm at the matching version\n",[144,19826,19827],{},[147,19828,19829],{},"If any dependency is missing, it waits for you to ask it to check again.",[147,19831,19832,19833,1576],{},"Creates a clean ",[542,19834,19835],{},"release-x.y.z",[147,19837,19838],{},"Updates CHANGELOG, package.json and package-lock.json files and commits changes",[147,19840,19841],{},"Pushes changes back to GitHub",[147,19843,19844,19845],{},"Opens a PR\n",[144,19846,19847],{},[147,19848,19849],{},"At this point, the PR should be reviewed to ensure all updates look correct\nand all tests are passing. Once merged, the process can continue.",[147,19851,19852],{},"Checks the outstanding PRs again - waits for confirmation to continue",[147,19854,19855,19856,19858,19859],{},"Creates a ",[2562,19857,9720],{}," GitHub release and provides its url.\n",[144,19860,19861,19864],{},[147,19862,19863],{},"The Release Manager should review the draft - check the release notes look appropriate\nand take note of any first-time contributors from outside the FF team.",[147,19865,19866],{},"The script waits for you to confirm you have reviewed the draft",[147,19868,19869],{},"Publishes the release and moves onto the next repo",[147,19871,19872,19873,19876],{},"Digital Ocean Droplet requires a manual step once the GitHub Action has finished,\nfollow ",[46,19874,19875],{"href":19324},"these"," steps to have the new image reviewed and published",[164,19878,19880],{"id":19879},"phase-three","Phase Three",[19,19882,19883],{},"Once everything has been published, the Release Manager should:",[504,19885,19886,19896],{},[147,19887,19888,19889,19893,19894],{},"Raise a \"FlowFuse Cloud Change Requests\" Issue in ",[46,19890,19892],{"href":12439,"rel":19891},[108],"CloudProject Project"," to request Production to be updated to the new version. Stack update procedure can be found ",[46,19895,2011],{"href":12516},[147,19897,19898],{},"Notify the CTO\u002FSenior Engineer that the release is ready to publish to production.",[19,19900,19901,19902,19904],{},"Once Production has been updated and verified, the Release Manager should announce\nthe availability of the release in ",[542,19903,12422],{},". At this point, the marketing team\nwill take over for Phase Four",[164,19906,19908],{"id":19907},"phase-four","Phase Four",[19,19910,19911],{},"The final phase is where we tell the world about our work. This activity is led\nby the PM and Marketing team.",[14,19913,19406],{"id":19914},"fix-releases",[19,19916,19917],{},"Patch releases are done as needed and have a much lighter process to allow\nfixes to be released quickly.",[19,19919,19920,19921,19924],{},"The core ",[542,19922,19923],{},"flowfuse"," repository has some automation in place to help with this process.\nUntil that is rolled out across the other repositories, some of the backporting work\nmust be done manually.",[144,19926,19927,19933,19939,19945,19948,19958],{},[147,19928,19929,19930,19932],{},"Changes must first be PR'd to the ",[542,19931,1575],{}," branch and reviewed in the normal manner.",[147,19934,19935,19936,19938],{},"Before merging, the PR should have the label ",[542,19937,13683],{}," added.",[147,19940,19941,19942,19944],{},"If in ",[542,19943,9838],{},", when the PR is merged, an automation will run to create a new PR that backports\nthe change to the maintenance branch. Otherwise, the backport PR must be manually created.",[147,19946,19947],{},"The backport PR must be reviewed and merged in the normal manner.",[147,19949,19950,19951,19953,19954,19957],{},"Once all of the required backport PRs are merged, raise a PR on the ",[542,19952,11968],{}," branch\nto update the version and ",[542,19955,19956],{},"CHANGELOG.md"," file with suitable details.",[147,19959,19960,19961,19963],{},"Create the GitHub release with the appropriate ",[542,19962,13523],{}," tag.",[19,19965,19966,19967,19971],{},"Finally, create two ",[46,19968,19970],{"href":19969},"\u002Fhandbook\u002Foperations\u002Fchange\u002F","change requests",", one for\nstaging and one for production to upgrade to the latest version.",[164,19973,19732],{"id":19974},"unmanaged-releases",[19,19976,19977],{},"The Unmanaged Repositories have a simpler release process. They are released\nas needed in coordination with the CTO\u002FSenior Engineer.",[19,19979,19980],{},"All release activity should be highlighted in #dept-engineering so the team is aware.",[504,19982,19983,19986,19991,19996,20014,20019,20029,20036],{},[147,19984,19985],{},"Check that all changes have been merged to main",[147,19987,19130,19988,19990],{},[542,19989,10251],{}," version number",[147,19992,19993,19995],{},[542,19994,11135],{}," into the directory of the package you want to release",[147,19997,19998,19999,20002,20003,20006,20007,20010,20011,20013],{},"Run the ",[542,20000,20001],{},"generate-changelog"," script, found in the ",[542,20004,20005],{},"flowfuse\u002Fadmin"," repository. Run this\nwhilst in the folder\u002Frepository that you are releasing. This\ngenerates a list of the PRs merged since the last tagged release. Note: this\nscript require the ",[542,20008,20009],{},"gh"," cli to be installed and logged in.\nUpdate ",[542,20012,19956],{}," with the output of the script.",[147,20015,20016,20017],{},"Run ",[542,20018,19138],{},[147,20020,20021,20022,63,20024,2040,20026,20028],{},"Open a new PR with the ",[542,20023,10251],{},[542,20025,10254],{},[542,20027,19956],{}," changes. Get the PR reviewed\nby someone else and then merged.",[147,20030,20031,20032,20035],{},"Create a new GitHub Release with the appropriate version number eg ",[542,20033,20034],{},"v0.1.1",". It is\nadvised to use the \"Generate Release Notes\" option to create the release notes and title.",[147,20037,20038],{},"Once the release is created, the GitHub Action will take care of publishing to\nNPM. Check the action to ensure it completes.",[14,20040,19524],{"id":20041},"launch-lunch",[19,20043,20044,20045,549],{},"To celebrate the launch of a new version of FlowFuse, we organize a lunch on\nthe release day. See also the ",[46,20046,20048],{"href":20047},"\u002Fhandbook\u002Fpeopleops\u002Fcompensation#launch-lunch","peopleops section",[14,20050,20052],{"id":20051},"retrospective","Retrospective",[19,20054,20055],{},"The day after each release, a one hour meeting is conducted which anyone from the company can join. The purpose of this meeting is to reflect on the past four weeks of development effort, the release process and any other thoughts or comments that can help us refine processes moving forward.",[19,20057,20058,20059,20062],{},"In the retrospective, the CTO or Engineering Manager will also cover any new items that have been added to the ",[46,20060,18578],{"href":20061},"\u002Fhandbook\u002Fengineering\u002Fproject-management#development-board"," and any relevant plans for engineering resource to be assigned to that work.",[2796,20064,20065],{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":75,"searchDepth":76,"depth":76,"links":20067},[20068,20075,20078,20079],{"id":19412,"depth":76,"text":19397,"children":20069},[20070,20071,20072,20073,20074],{"id":19422,"depth":605,"text":19423},{"id":19545,"depth":605,"text":19546},{"id":19736,"depth":605,"text":19737},{"id":19879,"depth":605,"text":19880},{"id":19907,"depth":605,"text":19908},{"id":19914,"depth":76,"text":19406,"children":20076},[20077],{"id":19974,"depth":605,"text":19732},{"id":20041,"depth":76,"text":19524},{"id":20051,"depth":76,"text":20052},{},{"title":11725,"description":19389},"handbook\u002Fengineering\u002Freleases\u002Fprocess","PE0kQZR54J1xuGVL55TtBoJ7oGKtACn1DUPB_LLYtJg",{"id":20085,"title":18686,"body":20086,"description":21110,"extension":81,"meta":21111,"navGroup":83,"navOrder":83,"navTitle":21112,"navigation":84,"path":21113,"seo":21114,"stem":21115,"__hash__":21116},"handbook\u002Fhandbook\u002Fengineering\u002Freleases\u002Fwriting-changelog.md",{"type":7,"value":20087,"toc":21089},[20088,20091,20098,20101,20105,20112,20115,20118,20121,20125,20128,20140,20143,20147,20159,20165,20168,20172,20175,20258,20262,20265,20517,20521,20524,20527,20533,20539,20545,20553,20555,20562,20586,20589,20596,20600,20603,20609,20617,20622,20644,20707,20712,20715,20729,20733,20744,20757,20789,20792,20798,20801,20806,20809,20813,20816,20823,20861,20864,20870,20876,20879,20882,20885,20889,20892,20895,20934,20937,20941,20945,20953,20961,20964,20968,20987,20995,20998,21002,21010,21018,21028,21032,21049,21057,21060,21064,21071,21074,21083,21086],[10,20089,18686],{"id":20090},"writing-changelog-posts",[19,20092,1375,20093,20097],{},[46,20094,20096],{"href":20095},"\u002Fchangelog\u002F","FlowFuse Changelog"," is where users go to see what has shipped. It is a place to communicate product updates clearly and directly to FlowFuse users.",[19,20099,20100],{},"A changelog post is not a PR description or a release note. It is a short, focused announcement aimed at FlowFuse users who want to quickly understand what changed and how it impacts them.",[14,20102,20104],{"id":20103},"when-to-write-one","When to write one",[19,20106,20107,20108,20111],{},"Write a changelog post when you ship something a user would notice or benefit from. This means the change is ",[423,20109,20110],{},"live in production on FlowFuse Cloud"," and visible to users.",[19,20113,20114],{},"This includes new features, meaningful improvements to existing functionality, behaviour changes users need to be aware of, and breaking changes that require user action.",[19,20116,20117],{},"Do not write changelog posts for internal tooling changes with no user-visible impact, routine dependency bumps, minor bug fixes the average user would never encounter, or changes behind a feature flag you have not yet released to everyone.",[19,20119,20120],{},"If you are unsure, ask: \"Would a user who opens FlowFuse tomorrow notice or benefit from this?\" If the answer is no, you can likely skip it. When in doubt, make it a quick discussion with the team, involving both engineering and product.",[14,20122,20124],{"id":20123},"identifying-what-needs-a-changelog-post","Identifying what needs a changelog post",[19,20126,20127],{},"Product and engineering identify changelog posts during refinement, not after work is complete.",[144,20129,20130,20137],{},[147,20131,20132,20133,20136],{},"Product creates a ",[542,20134,20135],{},"changelog"," ticket for any work that requires a changelog post",[147,20138,20139],{},"Engineering and Product are jointly responsible for asking: \"Does this need a changelog?\" during refinement",[19,20141,20142],{},"This ensures the team plans changelog work alongside delivery, rather than remembering (or missing) them at release time.",[14,20144,20146],{"id":20145},"creating-the-file","Creating the file",[19,20148,20149,20150,20154,20155,20158],{},"Posts live in the ",[46,20151,9615],{"href":20152,"rel":20153},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fwebsite\u002Ftree\u002Fmain\u002Fsrc\u002Fchangelog",[108],". Navigate to the correct year and month folder for when the feature shipped, and create a new ",[542,20156,20157],{},".md"," file. If the folder for that month does not exist yet, create it.",[557,20160,20163],{"className":20161,"code":20162,"language":562},[560],"src\u002Fchangelog\u002FYYYY\u002FMM\u002Fyour-post-slug.md\n",[542,20164,20162],{"__ignoreMap":75},[19,20166,20167],{},"The slug should be short, lowercase, and hyphen-separated, describing the feature you are announcing.",[14,20169,20171],{"id":20170},"frontmatter","Frontmatter",[19,20173,20174],{},"Every post requires the following fields at the top of the file:",[910,20176,20177,20186],{},[913,20178,20179],{},[916,20180,20181,20184],{},[919,20182,20183],{},"Field",[919,20185,8002],{},[930,20187,20188,20197,20206,20224,20238,20249],{},[916,20189,20190,20194],{},[935,20191,20192],{},[542,20193,14103],{},[935,20195,20196],{},"The name of the feature or change. Title case. Keep it short.",[916,20198,20199,20203],{},[935,20200,20201],{},[542,20202,13786],{},[935,20204,20205],{},"One sentence summarising the change. This appears in link previews and search results, so it should make sense without any surrounding context.",[916,20207,20208,20213],{},[935,20209,20210],{},[542,20211,20212],{},"date",[935,20214,20215,20216,20219,20220,20223],{},"The date and time the feature shipped, in ",[542,20217,20218],{},"YYYY-MM-DD HH:mm:ss"," format (e.g., ",[542,20221,20222],{},"2026-03-24 17:00:00","). The timestamp ensures correct sorting when you add multiple features on the same day.",[916,20225,20226,20231],{},[935,20227,20228],{},[542,20229,20230],{},"authors",[935,20232,20233,20234,20237],{},"Your handle from ",[542,20235,20236],{},"src\u002F_data\u002Fteam",". Leave it out if there is no single clear author.",[916,20239,20240,20244],{},[935,20241,20242],{},[542,20243,14132],{},[935,20245,20246,20247,549],{},"Always include ",[542,20248,20135],{},[916,20250,20251,20255],{},[935,20252,20253],{},[542,20254,13437],{},[935,20256,20257],{},"A list of related GitHub issue URLs. Link any issues that tracked the work this post announces.",[14,20259,20261],{"id":20260},"starting-template","Starting Template",[19,20263,20264],{},"You can start a new changelog post with the following template:",[557,20266,20268],{"className":14090,"code":20267,"language":2061,"meta":75,"style":75},"---\ntitle: Short Feature Title\ndescription: One sentence summarising the change, written for a user, not an engineer.\ndate: YYYY-MM-DD HH:mm:ss\nauthors: your-handle\ntags:\n  - changelog\nissues:\n  - https:\u002F\u002Fgithub.com\u002FFlowFuse\u002F\u003Crepo>\u002Fissues\u002F\u003Cid>\n---\n\n\u003C!-- \n  WHAT CHANGED — Lead with it. One or two sentences max.\n  Bad:  \"Refactored snapshot restore logic for dev mode instances.\"\n  Good: \"You can now restore snapshots without leaving developer mode.\"\n\n  If this is a BREAKING CHANGE, say so here in bold before anything else:\n  **FlowFuse vX.Y requires [thing]. You will need to [action] before upgrading.**\n-->\n\n[What changed, stated plainly.]\n\n\u003C!-- WHY IT MATTERS — The \"so what\". Don't skip this. -->\n\n[The problem this solves or the benefit it brings.]\n\n\u003C!-- HOW TO GET STARTED — Only include this if the user needs to take action. Delete if it just works. -->\n\nTo get started:\n\n1. [First step]\n2. [Second step]\n\n\u003C!-- SCREENSHOT — Include for any visual change. Delete if not applicable. -->\n\n![Alt text describing the UI shown](.\u002Fimages\u002Fyour-image.png)\n*Caption describing what is shown in context.*\n\n\u003C!-- AVAILABILITY — Include if this is plan- or version-gated. Delete if available to everyone. -->\n\nThis feature is available to [plan\u002Ftier] users of FlowFuse Cloud and [licence type] Self Hosted users from [vX.Y].\n",[542,20269,20270,20274,20283,20292,20301,20310,20316,20323,20329,20336,20340,20344,20349,20354,20359,20364,20368,20373,20378,20383,20387,20392,20396,20401,20405,20410,20414,20419,20423,20428,20432,20439,20446,20451,20457,20462,20477,20483,20488,20494,20499],{"__ignoreMap":75},[2403,20271,20272],{"class":2405,"line":2406},[2403,20273,14098],{"class":2446},[2403,20275,20276,20278,20280],{"class":2405,"line":76},[2403,20277,14103],{"class":2686},[2403,20279,9411],{"class":2446},[2403,20281,20282],{"class":2765},"Short Feature Title\n",[2403,20284,20285,20287,20289],{"class":2405,"line":605},[2403,20286,13786],{"class":2686},[2403,20288,9411],{"class":2446},[2403,20290,20291],{"class":2765},"One sentence summarising the change, written for a user, not an engineer.\n",[2403,20293,20294,20296,20298],{"class":2405,"line":2423},[2403,20295,20212],{"class":2686},[2403,20297,9411],{"class":2446},[2403,20299,20300],{"class":2765},"YYYY-MM-DD HH:mm:ss\n",[2403,20302,20303,20305,20307],{"class":2405,"line":2465},[2403,20304,20230],{"class":2686},[2403,20306,9411],{"class":2446},[2403,20308,20309],{"class":2765},"your-handle\n",[2403,20311,20312,20314],{"class":2405,"line":2471},[2403,20313,14132],{"class":2686},[2403,20315,9403],{"class":2446},[2403,20317,20318,20320],{"class":2405,"line":3086},[2403,20319,14139],{"class":2446},[2403,20321,20322],{"class":2765},"changelog\n",[2403,20324,20325,20327],{"class":2405,"line":3092},[2403,20326,13437],{"class":2686},[2403,20328,9403],{"class":2446},[2403,20330,20331,20333],{"class":2405,"line":3098},[2403,20332,14139],{"class":2446},[2403,20334,20335],{"class":2765},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002F\u003Crepo>\u002Fissues\u002F\u003Cid>\n",[2403,20337,20338],{"class":2405,"line":3104},[2403,20339,14098],{"class":2446},[2403,20341,20342],{"class":2405,"line":3109},[2403,20343,2462],{"emptyLinePlaceholder":84},[2403,20345,20346],{"class":2405,"line":3115},[2403,20347,20348],{"class":10823},"\u003C!-- \n",[2403,20350,20351],{"class":2405,"line":3121},[2403,20352,20353],{"class":10823},"  WHAT CHANGED — Lead with it. One or two sentences max.\n",[2403,20355,20356],{"class":2405,"line":3127},[2403,20357,20358],{"class":10823},"  Bad:  \"Refactored snapshot restore logic for dev mode instances.\"\n",[2403,20360,20361],{"class":2405,"line":3132},[2403,20362,20363],{"class":10823},"  Good: \"You can now restore snapshots without leaving developer mode.\"\n",[2403,20365,20366],{"class":2405,"line":3138},[2403,20367,2462],{"emptyLinePlaceholder":84},[2403,20369,20370],{"class":2405,"line":3143},[2403,20371,20372],{"class":10823},"  If this is a BREAKING CHANGE, say so here in bold before anything else:\n",[2403,20374,20375],{"class":2405,"line":3148},[2403,20376,20377],{"class":10823},"  **FlowFuse vX.Y requires [thing]. You will need to [action] before upgrading.**\n",[2403,20379,20380],{"class":2405,"line":3154},[2403,20381,20382],{"class":10823},"-->\n",[2403,20384,20385],{"class":2405,"line":3160},[2403,20386,2462],{"emptyLinePlaceholder":84},[2403,20388,20389],{"class":2405,"line":3166},[2403,20390,20391],{"class":2446},"[What changed, stated plainly.]\n",[2403,20393,20394],{"class":2405,"line":3172},[2403,20395,2462],{"emptyLinePlaceholder":84},[2403,20397,20398],{"class":2405,"line":3177},[2403,20399,20400],{"class":10823},"\u003C!-- WHY IT MATTERS — The \"so what\". Don't skip this. -->\n",[2403,20402,20403],{"class":2405,"line":3183},[2403,20404,2462],{"emptyLinePlaceholder":84},[2403,20406,20407],{"class":2405,"line":3189},[2403,20408,20409],{"class":2446},"[The problem this solves or the benefit it brings.]\n",[2403,20411,20412],{"class":2405,"line":3195},[2403,20413,2462],{"emptyLinePlaceholder":84},[2403,20415,20416],{"class":2405,"line":3201},[2403,20417,20418],{"class":10823},"\u003C!-- HOW TO GET STARTED — Only include this if the user needs to take action. Delete if it just works. -->\n",[2403,20420,20421],{"class":2405,"line":12342},[2403,20422,2462],{"emptyLinePlaceholder":84},[2403,20424,20425],{"class":2405,"line":12353},[2403,20426,20427],{"class":2446},"To get started:\n",[2403,20429,20430],{"class":2405,"line":12359},[2403,20431,2462],{"emptyLinePlaceholder":84},[2403,20433,20434,20436],{"class":2405,"line":12370},[2403,20435,2527],{"class":2496},[2403,20437,20438],{"class":2446}," [First step]\n",[2403,20440,20441,20443],{"class":2405,"line":12376},[2403,20442,2535],{"class":2496},[2403,20444,20445],{"class":2446}," [Second step]\n",[2403,20447,20449],{"class":2405,"line":20448},33,[2403,20450,2462],{"emptyLinePlaceholder":84},[2403,20452,20454],{"class":2405,"line":20453},34,[2403,20455,20456],{"class":10823},"\u003C!-- SCREENSHOT — Include for any visual change. Delete if not applicable. -->\n",[2403,20458,20460],{"class":2405,"line":20459},35,[2403,20461,2462],{"emptyLinePlaceholder":84},[2403,20463,20465,20467,20470,20472,20475],{"class":2405,"line":20464},36,[2403,20466,2646],{"class":2446},[2403,20468,20469],{"class":2616},"Alt text describing the UI shown",[2403,20471,2619],{"class":2446},[2403,20473,20474],{"class":2622},".\u002Fimages\u002Fyour-image.png",[2403,20476,2625],{"class":2446},[2403,20478,20480],{"class":2405,"line":20479},37,[2403,20481,20482],{"class":2574},"*Caption describing what is shown in context.*\n",[2403,20484,20486],{"class":2405,"line":20485},38,[2403,20487,2462],{"emptyLinePlaceholder":84},[2403,20489,20491],{"class":2405,"line":20490},39,[2403,20492,20493],{"class":10823},"\u003C!-- AVAILABILITY — Include if this is plan- or version-gated. Delete if available to everyone. -->\n",[2403,20495,20497],{"class":2405,"line":20496},40,[2403,20498,2462],{"emptyLinePlaceholder":84},[2403,20500,20502,20505,20508,20511,20514],{"class":2405,"line":20501},41,[2403,20503,20504],{"class":2446},"This feature is available to [",[2403,20506,20507],{"class":2616},"plan\u002Ftier",[2403,20509,20510],{"class":2446},"] users of FlowFuse Cloud and [licence type] Self Hosted users from [",[2403,20512,20513],{"class":2616},"vX.Y",[2403,20515,20516],{"class":2446},"].\n",[14,20518,20520],{"id":20519},"writing-the-post","Writing the post",[19,20522,20523],{},"There is no fixed template - the right length and shape depends on the change. A small improvement might be two sentences and a screenshot. A complex feature might need steps, multiple screenshots, and an availability note. Use your judgement.",[19,20525,20526],{},"That said, every post should answer four questions:",[19,20528,20529,20532],{},[423,20530,20531],{},"What changed?"," State it plainly in the opening. Do not make the user read three paragraphs before they find out what the post is about.",[19,20534,20535,20538],{},[423,20536,20537],{},"Why does it matter?"," Explain the benefit or the problem it solves. This is the difference between a changelog post and a bare release note. Without it, users have no reason to care.",[19,20540,20541,20544],{},[423,20542,20543],{},"What do they need to do?"," If the feature requires setup or user action, explain how to get started. If it just works, you do not need this.",[19,20546,20547,20550,20551,11585],{},[423,20548,20549],{},"Where is it available?"," The change is live on FlowFuse Cloud. Self Hosted users will receive it in the next release (",[2562,20552,20513],{},[164,20554,14211],{"id":14210},[19,20556,20557,20558,20561],{},"Include a screenshot for any visual change. Reference images from ",[542,20559,20560],{},"src\u002Fimg\u002F"," like this:",[557,20563,20565],{"className":14090,"code":20564,"language":2061,"meta":75,"style":75},"![Alt text](.\u002Fimages\u002Fimage.png)\n*Caption describing what is shown*\n",[542,20566,20567,20581],{"__ignoreMap":75},[2403,20568,20569,20571,20574,20576,20579],{"class":2405,"line":2406},[2403,20570,2646],{"class":2446},[2403,20572,20573],{"class":2616},"Alt text",[2403,20575,2619],{"class":2446},[2403,20577,20578],{"class":2622},".\u002Fimages\u002Fimage.png",[2403,20580,2625],{"class":2446},[2403,20582,20583],{"class":2405,"line":76},[2403,20584,20585],{"class":2574},"*Caption describing what is shown*\n",[19,20587,20588],{},"Always add a caption in italics directly below the image. The caption should describe what the image shows in context, not just repeat the alt text.",[19,20590,20591,20592,20595],{},"Screenshots should ideally be ",[423,20593,20594],{},"1408px wide",". Height can vary depending on what you are showing.",[164,20597,20599],{"id":20598},"screen-recordings-and-videos","Screen recordings and videos",[19,20601,20602],{},"Use a video or GIF when the change is easier to show than describe.",[19,20604,20605,20608],{},[423,20606,20607],{},"GIFs"," work well for short, simple interactions where a video would be overkill. If you use one:",[144,20610,20611,20614],{},[147,20612,20613],{},"It must be sharp and legible. No blurred or low-resolution captures.",[147,20615,20616],{},"It must be under 1MB. If it is larger, use a video instead.",[19,20618,20619,20621],{},[423,20620,8809],{}," are the recommended way to show screen recordings. To add one:",[504,20623,20624,20637],{},[147,20625,20626,20627,20632,20633,20636],{},"Ask in ",[46,20628,20631],{"href":20629,"rel":20630},"https:\u002F\u002Fflowfuse.slack.com\u002Farchives\u002FC02TG4WH5PC",[108],"#dev-marketing"," to have the recording uploaded to YouTube. Give them the video title. They publish it as ",[423,20634,20635],{},"unlisted"," by default. If the recording has voiceover and refined editing, flag it for public publishing.",[147,20638,20639,20640,20643],{},"Once it's on YouTube, embed it in your post using the ",[542,20641,20642],{},"\u003Clite-youtube>"," component. No setup needed — it's already available in the website repository.",[557,20645,20647],{"className":10396,"code":20646,"language":10398,"meta":75,"style":75},"\u003Clite-youtube\n  videoid=\"YOUR_VIDEO_ID\"\n  params=\"rel=0\"\n  style=\"width: 704px; height: 100%;\"\n  title=\"Your Video Title\">\n\u003C\u002Flite-youtube>\n",[542,20648,20649,20656,20666,20676,20686,20698],{"__ignoreMap":75},[2403,20650,20651,20653],{"class":2405,"line":2406},[2403,20652,10405],{"class":2446},[2403,20654,20655],{"class":2686},"lite-youtube\n",[2403,20657,20658,20661,20663],{"class":2405,"line":76},[2403,20659,20660],{"class":2758},"  videoid",[2403,20662,10414],{"class":2446},[2403,20664,20665],{"class":2765},"\"YOUR_VIDEO_ID\"\n",[2403,20667,20668,20671,20673],{"class":2405,"line":605},[2403,20669,20670],{"class":2758},"  params",[2403,20672,10414],{"class":2446},[2403,20674,20675],{"class":2765},"\"rel=0\"\n",[2403,20677,20678,20681,20683],{"class":2405,"line":2423},[2403,20679,20680],{"class":2758},"  style",[2403,20682,10414],{"class":2446},[2403,20684,20685],{"class":2765},"\"width: 704px; height: 100%;\"\n",[2403,20687,20688,20691,20693,20696],{"class":2405,"line":2465},[2403,20689,20690],{"class":2758},"  title",[2403,20692,10414],{"class":2446},[2403,20694,20695],{"class":2765},"\"Your Video Title\"",[2403,20697,10428],{"class":2446},[2403,20699,20700,20702,20705],{"class":2405,"line":2471},[2403,20701,10456],{"class":2446},[2403,20703,20704],{"class":2686},"lite-youtube",[2403,20706,10428],{"class":2446},[504,20708,20709],{"start":605},[147,20710,20711],{},"Review closed captions for accuracy if the video includes spoken content. Auto-generated captions work, but technical terms often need manual correction.",[19,20713,20714],{},"Replace the following:",[144,20716,20717,20723],{},[147,20718,20719,20722],{},[542,20720,20721],{},"YOUR_VIDEO_ID"," with the video ID from the YouTube URL",[147,20724,20725,20728],{},[542,20726,20727],{},"Your Video Title"," with a short descriptive title for the video",[164,20730,20732],{"id":20731},"feature-catalog-and-availability","Feature catalog and availability",[19,20734,20735,20736,20743],{},"Ideally, tie each changelog post to a feature defined in ",[46,20737,20740],{"href":20738,"rel":20739},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fwebsite\u002Fblob\u002Fmain\u002Fsrc\u002F_data\u002FfeatureCatalog.yaml",[108],[542,20741,20742],{},"featureCatalog.yaml",". The catalog is the single source of truth for tier availability across FlowFuse.",[19,20745,20746,20747,20749,20750,2040,20753,20756],{},"When you ship a changelog post for a catalogued feature, update the feature's entry in ",[542,20748,20742],{}," to include the changelog ",[542,20751,20752],{},"url",[542,20754,20755],{},"release"," number:",[557,20758,20760],{"className":9391,"code":20759,"language":9393,"meta":75,"style":75},"changelog:\n  - url: \u002Fchangelog\u002F2026\u002F03\u002Fyour-post-slug\u002F\n    release: \"2.29\"\n",[542,20761,20762,20768,20779],{"__ignoreMap":75},[2403,20763,20764,20766],{"class":2405,"line":2406},[2403,20765,20135],{"class":2686},[2403,20767,9403],{"class":2446},[2403,20769,20770,20772,20774,20776],{"class":2405,"line":76},[2403,20771,14139],{"class":2446},[2403,20773,20752],{"class":2686},[2403,20775,9411],{"class":2446},[2403,20777,20778],{"class":2765},"\u002Fchangelog\u002F2026\u002F03\u002Fyour-post-slug\u002F\n",[2403,20780,20781,20784,20786],{"class":2405,"line":605},[2403,20782,20783],{"class":2686},"    release",[2403,20785,9411],{"class":2446},[2403,20787,20788],{"class":2765},"\"2.29\"\n",[19,20790,20791],{},"Once that entry is in place, the build injects tier availability badges into the changelog post automatically. You need no additional markup in the post itself.",[19,20793,20794,20795,20797],{},"If the feature does not yet exist in the catalog, add it or flag it for someone to add before the post goes live. If the feature's tier availability has changed alongside this release, update the relevant fields in the catalog too. Product must review any additions or availability changes in ",[542,20796,20742],{}," before merging.",[19,20799,20800],{},"Always write an availability note in the post as well. Tier badges communicate the tier, but prose tells the user what it means for them. Write it like this:",[2672,20802,20803],{},[19,20804,20805],{},"This feature is available to Enterprise tier users of FlowFuse Cloud and Enterprise Licensed Self Hosted users from vX.Y.",[19,20807,20808],{},"Put it at the end of the post, or immediately after the main announcement if it affects whether the user can access the feature at all.",[14,20810,20812],{"id":20811},"writing-style","Writing style",[19,20814,20815],{},"Write for the user, not the engineer. Every changelog entry can tell two stories - what changed in the code, and what improved for the user. Always tell the second one.",[19,20817,20818,20819,20822],{},"Write in ",[2562,20820,20821],{},"active voice",". Active voice puts the subject before the verb. The user is doing something, or something is now possible for them. When possible, write with “you” as the subject. It makes writing more direct, clear, and engaging. It also makes for better storytelling.",[910,20824,20825,20835],{},[913,20826,20827],{},[916,20828,20829,20832],{},[919,20830,20831],{},"Instead of this",[919,20833,20834],{},"Write this",[930,20836,20837,20845,20853],{},[916,20838,20839,20842],{},[935,20840,20841],{},"Updated authentication API response handling",[935,20843,20844],{},"Logging in is noticeably faster",[916,20846,20847,20850],{},[935,20848,20849],{},"Refactored snapshot restore logic for dev mode instances",[935,20851,20852],{},"You can now restore snapshots without leaving developer mode",[916,20854,20855,20858],{},[935,20856,20857],{},"Restart sequencing updated for HA instances",[935,20859,20860],{},"HA instances now restart one at a time, so there is no downtime during updates",[19,20862,20863],{},"Be specific. Vague entries are useless. Compare:",[19,20865,20866,20869],{},[423,20867,20868],{},"Weak:"," Minor improvements to the Expert",[19,20871,20872,20875],{},[423,20873,20874],{},"Strong:"," The Expert now has Palette Awareness - ask it about your installed nodes, available updates, or which packages are disabled, without leaving the chat interface.",[19,20877,20878],{},"Keep it short. A changelog post is not a blog post. If the feature needs more depth, link to documentation rather than expanding the post.",[19,20880,20881],{},"Avoid jargon unless it is standard FlowFuse or Node-RED vocabulary. If a technical term is unavoidable, give enough context that a non-expert can follow.",[19,20883,20884],{},"Do not paste PR titles or commit messages, as those are for our internal engineering team. Rewrite them from the user's perspective.",[14,20886,20888],{"id":20887},"drafting-with-ai","Drafting with AI",[19,20890,20891],{},"If you prefer, you can use an LLM to draft a first version of your changelog post.",[19,20893,20894],{},"Paste the following prompt into your tool of choice along with your PR description, commit messages, or technical notes:",[2672,20896,20897,20900,20925,20928],{},[19,20898,20899],{},"You are writing a FlowFuse changelog post. The audience is FlowFuse users — cloud customers and self-hosted admins. Using the content I paste below, write a changelog post that:",[144,20901,20902,20905,20908,20911,20914],{},[147,20903,20904],{},"Opens with what changed, stated plainly in active voice",[147,20906,20907],{},"Focuses on what the user can now do (use “you” where possible)",[147,20909,20910],{},"Explains the user benefit in one or two sentences",[147,20912,20913],{},"Includes a 'getting started' section only if the user needs to take action",[147,20915,20916,20917,20920,20921,20924],{},"Ends with an availability note: \"This feature is available to ",[2403,20918,20919],{},"tier"," users of FlowFuse Cloud and ",[2403,20922,20923],{},"licence type"," Self Hosted users from vX.Y.\"",[19,20926,20927],{},"Do not use PR titles or commit message language. Write for someone who just opened FlowFuse and wants to know what’s new.",[19,20929,20930,20931],{},"Here is the technical context:\n",[2403,20932,20933],{},"paste here",[19,20935,20936],{},"Always review and edit the output before publishing.",[14,20938,20940],{"id":20939},"examples","Examples",[164,20942,20944],{"id":20943},"a-small-but-useful-improvement","A small but useful improvement",[2672,20946,20947,20950],{},[19,20948,20949],{},"As of today, you can now duplicate a hosted instance into a different application within your team.",[19,20951,20952],{},"It is a small (but important) improvement that just makes things that little bit easier.",[19,20954,20955],{},[2562,20956,17924,20957],{},[46,20958,20960],{"href":20959},"\u002Fchangelog\u002F2025\u002F10\u002Fduplicate-instances-across-applications\u002F","Duplicate Instances Across Different Applications",[19,20962,20963],{},"Short, honest about the size of the change, and gets straight to the point.",[164,20965,20967],{"id":20966},"showing-what-is-now-possible","Showing what is now possible",[2672,20969,20970,20973],{},[19,20971,20972],{},"You can now ask the Expert about your installed nodes, versions, and available updates without leaving the chat interface. For example:",[144,20974,20975,20978,20981,20984],{},[147,20976,20977],{},"Do I have any nodes installed that can send emails?",[147,20979,20980],{},"Are my palette nodes up to date?",[147,20982,20983],{},"Are any nodes on my palette disabled?",[147,20985,20986],{},"Can you suggest a node package that would replace this complex function code?",[19,20988,20989],{},[2562,20990,17924,20991],{},[46,20992,20994],{"href":20993},"\u002Fchangelog\u002F2026\u002F01\u002Fff-expert-palette-queries\u002F","FlowFuse Expert: Palette Queries",[19,20996,20997],{},"Instead of describing the feature abstractly, this shows exactly how a user will interact with it. Use this approach whenever concrete examples best explain a feature — what the user can now say or do.",[164,20999,21001],{"id":21000},"translating-a-technical-change-into-a-user-benefit","Translating a technical change into a user benefit",[2672,21003,21004,21007],{},[19,21005,21006],{},"Any action that triggers a restart of the Node-RED instance will now restart them in sequence rather than in parallel. This means there should be no downtime for this instance.",[19,21008,21009],{},"This feature is available to Enterprise Licensed Self Hosted users and Enterprise tier users of FlowFuse Cloud.",[19,21011,21012],{},[2562,21013,17924,21014],{},[46,21015,21017],{"href":21016},"\u002Fchangelog\u002F2026\u002F02\u002Fha-instance-rolling-restart\u002F","HA Hosted Instance Rolling Restart",[19,21019,21020,21021,21024,21025,549],{},"The technical detail is there, but the sentence that follows immediately translates it into what the user actually cares about. Always pair the ",[2562,21022,21023],{},"what"," with the ",[2562,21026,21027],{},"so what",[164,21029,21031],{"id":21030},"a-breaking-change","A breaking change",[2672,21033,21034,21040,21043],{},[19,21035,21036,21039],{},[423,21037,21038],{},"FlowFuse v2.24.0 requires Node.js v20 or higher."," If you are running an older version, you will need to upgrade Node.js before updating FlowFuse.",[19,21041,21042],{},"Node.js v18 reached end of life in April 2025 and no longer receives security updates. This change ensures FlowFuse continues to run on a supported and secure runtime.",[19,21044,21045,21046,549],{},"To check your current version, run ",[542,21047,21048],{},"node --version",[19,21050,21051],{},[2562,21052,17924,21053],{},[46,21054,21056],{"href":21055},"\u002Fchangelog\u002F2025\u002F11\u002Fminimum-nodejs-version\u002F","Node.js v20 Minimum Version Requirement",[19,21058,21059],{},"State what is changing and who it affects in the first sentence. Then explain why. Then tell the user exactly what to do. A user who needs to act should have everything they need without leaving the page.",[14,21061,21063],{"id":21062},"raising-a-pr","Raising a PR",[19,21065,21066,21067,21070],{},"Follow the standard ",[46,21068,21069],{"href":11805},"Git workflow"," to raise a PR against the website repository.",[19,21072,21073],{},"Have at least one of the following review the post before it goes live:",[144,21075,21076,21078,21081],{},[147,21077,11640],{},[147,21079,21080],{},"Marketing",[147,21082,11608],{},[19,21084,21085],{},"Aim for 1–2 reviewers to ensure accuracy and clarity. This avoids bottlenecks if specific individuals are unavailable.",[2796,21087,21088],{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .svl0z, html code.shiki .svl0z{--shiki-default:#032F62;--shiki-default-text-decoration:underline;--shiki-dark:#DBEDFF;--shiki-dark-text-decoration:underline}html pre.shiki code .s2frl, html code.shiki .s2frl{--shiki-default:#24292E;--shiki-default-text-decoration:underline;--shiki-dark:#E1E4E8;--shiki-dark-text-decoration:underline}html pre.shiki code .s5osK, html code.shiki .s5osK{--shiki-default:#24292E;--shiki-default-font-style:italic;--shiki-dark:#E1E4E8;--shiki-dark-font-style:italic}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":75,"searchDepth":76,"depth":76,"links":21090},[21091,21092,21093,21094,21095,21096,21101,21102,21103,21109],{"id":20103,"depth":76,"text":20104},{"id":20123,"depth":76,"text":20124},{"id":20145,"depth":76,"text":20146},{"id":20170,"depth":76,"text":20171},{"id":20260,"depth":76,"text":20261},{"id":20519,"depth":76,"text":20520,"children":21097},[21098,21099,21100],{"id":14210,"depth":605,"text":14211},{"id":20598,"depth":605,"text":20599},{"id":20731,"depth":605,"text":20732},{"id":20811,"depth":76,"text":20812},{"id":20887,"depth":76,"text":20888},{"id":20939,"depth":76,"text":20940,"children":21104},[21105,21106,21107,21108],{"id":20943,"depth":605,"text":20944},{"id":20966,"depth":605,"text":20967},{"id":21000,"depth":605,"text":21001},{"id":21030,"depth":605,"text":21031},{"id":21062,"depth":76,"text":21063},"The FlowFuse Changelog is where users go to see what has shipped. It is a place to communicate product updates clearly and directly to FlowFuse users.",{},"Changelog Posts","\u002Fhandbook\u002Fengineering\u002Freleases\u002Fwriting-changelog",{"title":18686,"description":21110},"handbook\u002Fengineering\u002Freleases\u002Fwriting-changelog","zgBpgwUH3-EvVJdFU0SreXQz4iDZS_XxXNgl_c4PU_g",{"id":21118,"title":21119,"body":21120,"description":21127,"extension":81,"meta":21287,"navGroup":83,"navOrder":83,"navTitle":11683,"navigation":84,"path":5194,"seo":21288,"stem":21289,"__hash__":21290},"handbook\u002Fhandbook\u002Fengineering\u002Fsecurity.md","Security Reporting Policy",{"type":7,"value":21121,"toc":21278},[21122,21125,21128,21133,21141,21144,21147,21158,21161,21185,21189,21200,21204,21207,21218,21221,21224,21228,21231,21234,21237,21241,21244,21264,21268,21271],[10,21123,21119],{"id":21124},"security-reporting-policy",[19,21126,21127],{},"This policy relates to external disclosures of potential vulnerabilities in the\nFlowFuse platform and associated components.",[19,21129,21130,21131,549],{},"Our internal Incident Response plan is documented ",[46,21132,2011],{"href":5488},[19,21134,21135,21136,21140],{},"We recognize the benefit of 3rd party security researchers looking for potential vulnerabilities in our application (",[46,21137,21138],{"href":21138,"rel":21139},"https:\u002F\u002Fapp.flowfuse.com",[108],").\nHowever we ask researchers to do so responsibly.",[19,21142,21143],{},"Please make a good faith effort to avoid privacy violations, destruction of data, and interruption or degradation of our service. Only interact with accounts you own or with explicit permission of the account holder.",[19,21145,21146],{},"Please refrain from:",[144,21148,21149,21152,21155],{},[147,21150,21151],{},"Denial of service live\u002Frunning services",[147,21153,21154],{},"Spamming",[147,21156,21157],{},"Social engineering (including phishing) of FlowFuse staff or contractors",[19,21159,21160],{},"Out of scope assets:",[144,21162,21163,21171,21178],{},[147,21164,21165,21166,21170],{},"The marketing website (",[46,21167,21168],{"href":21168,"rel":21169},"https:\u002F\u002Fflowfuse.com",[108]," - forms, chat, etc)",[147,21172,21173,21174,1583],{},"The dashboard documentation (",[46,21175,21176],{"href":21176,"rel":21177},"https:\u002F\u002Fdashboard.flowfuse.com",[108],[147,21179,21180,21181,1583],{},"The community forum (",[46,21182,21183],{"href":21183,"rel":21184},"https:\u002F\u002Fcommunity.flowfuse.com\u002F",[108],[14,21186,21188],{"id":21187},"reporting-a-vulnerability","Reporting a Vulnerability",[19,21190,21191,21192,21194,21195,21199],{},"Please report any vulnerabilities discovered in FlowFuse products to ",[542,21193,5269],{},".\nReports must meet our ",[46,21196,21198],{"href":21197},"#reporting-requirements","reporting requirements"," otherwise they will be rejected.",[164,21201,21203],{"id":21202},"reporting-requirements","Reporting Requirements",[19,21205,21206],{},"We will evaluate all submissions made in good faith, however we do require a minimum set of information\nto be included for a report to be considered. This is intended to discourage spam submissions as they\ndo not benefit anyone involved.",[504,21208,21209,21212,21215],{},[147,21210,21211],{},"Time\u002Fdate (UTC) the issue was discovered",[147,21213,21214],{},"Username\u002Femail of any users involved with the issue",[147,21216,21217],{},"URLs involved in the issue; simply providing the home url of our website is not sufficient",[19,21219,21220],{},"The more concrete information that can be provided in the initial issue report, the quicker we will\nbe able to evaluate it.",[19,21222,21223],{},"We reserve the right to reject any submission that fails to provide sufficient details. We will also\nrecord submissions that turn out to be invalid or lack supporting evidence. Where there becomes a\npattern of such submissions from an individual, this will have a bearing on any future consideration\nof bug bounty rewards for genuine issues they submit.",[14,21225,21227],{"id":21226},"bug-bounties","Bug Bounties",[19,21229,21230],{},"At our sole discretion, we may choose to reward a responsibly disclosed issue according\nto their severity, impact and quality of report.",[19,21232,21233],{},"We also consider a reporter's history of reporting issues. We will not reward someone who spams\nus in the hope that something sticks.",[19,21235,21236],{},"Multiple reports of the same issue manifesting in different ways will be treated\nas a single report.",[164,21238,21240],{"id":21239},"ineligible-vulnerability-types","Ineligible vulnerability types",[19,21242,21243],{},"The following types of vulnerability are not eligible for any reward.",[144,21245,21246,21252,21258],{},[147,21247,21248,21251],{},[423,21249,21250],{},"Admin-initiated Stored XSS \u002F HTML Injection"," - FlowFuse administrators are considered trusted users on the system. If an issue is only exploitable by administrators, then it is not eligible.",[147,21253,21254,21257],{},[423,21255,21256],{},"Rate-limiting"," - We apply rate limiting across the whole FlowFuse platform API, with different limits applied based on the context of the API. We keep the limits under review to balance security and convenience. If an issue relates to rate-limiting, but is demonstrably within our configure rate-limits, then it will not be eligible.",[147,21259,21260,21263],{},[423,21261,21262],{},"In-App Chat"," - The in-app support chat is provided by a 3rd party and is out of scope of any reward. It allows file upload as means for users to share information when seeking support. This does not represent a vulnerability.",[164,21265,21267],{"id":21266},"payments","Payments",[19,21269,21270],{},"In the exceptional circumstances that we choose to reward a disclosure based on the criteria above you will be notified via the email used to submit the disclosure. If you have sent multiple reports we may choose to produce a combined response rather than reply to each email individually.",[19,21272,21273,21274,549],{},"Rewards are paid in accordance with our ",[46,21275,21277],{"href":21276},"\u002Fhandbook\u002Foperations\u002Fvendors\u002F#process","vendor process",{"title":75,"searchDepth":76,"depth":76,"links":21279},[21280,21283],{"id":21187,"depth":76,"text":21188,"children":21281},[21282],{"id":21202,"depth":605,"text":21203},{"id":21226,"depth":76,"text":21227,"children":21284},[21285,21286],{"id":21239,"depth":605,"text":21240},{"id":21266,"depth":605,"text":21267},{},{"title":21119,"description":21127},"handbook\u002Fengineering\u002Fsecurity","FXDWtjJLfJVlWedjqapoyIzKLCutaMNMOmutPYjEAAU",{"id":21292,"title":21293,"body":21294,"description":75,"extension":81,"meta":21352,"navGroup":83,"navOrder":83,"navTitle":21293,"navigation":84,"path":21353,"seo":21354,"stem":21355,"__hash__":21356},"handbook\u002Fhandbook\u002Fengineering\u002Fsupport\u002Findex.md","Support",{"type":7,"value":21295,"toc":21346},[21296,21299,21301,21314,21318,21326,21330,21336,21340],[10,21297,21293],{"id":21298},"support",[14,21300,14798],{"id":14797},[19,21302,21303,21304,21308,21309,549],{},"Support tickets can be opened via the ",[46,21305,21307],{"href":21306},"\u002Fsupport","FlowFuse Support Portal",". FlowFuse employees will be notified of support ticket and chat traffic via the ",[46,21310,21313],{"href":21311,"rel":21312},"https:\u002F\u002Fflowfuse.slack.com\u002Farchives\u002FC031K13FLDD",[108],"FlowFuse Support Slack channel",[14,21315,21317],{"id":21316},"slas","SLAs",[19,21319,21320,21321,21325],{},"For all FlowFuse customers, we have an ",[46,21322,21324],{"href":21323},"\u002Fhandbook\u002Fsales\u002Fsubscription-agreement-1.5","SLA"," defined as part of the Subscription Agreement. Initial responses to support tickets must be sent within the SLA time frame defined in the Subscription Agreement.",[14,21327,21329],{"id":21328},"triage-duty","Triage Duty",[19,21331,21332,21333,12830],{},"For guidance on monitoring incoming tickets and routing them to the right person, see the ",[46,21334,21329],{"href":21335},"\u002Fhandbook\u002Fengineering\u002Fsupport\u002Ftriage",[14,21337,21339],{"id":21338},"troubleshooting","Troubleshooting",[19,21341,21342,21343,13894],{},"When trying to decipher a support ticket, you can follow the guides provided in the ",[46,21344,21339],{"href":21345},"\u002Fhandbook\u002Fengineering\u002Fsupport\u002Ftroubleshooting",{"title":75,"searchDepth":76,"depth":76,"links":21347},[21348,21349,21350,21351],{"id":14797,"depth":76,"text":14798},{"id":21316,"depth":76,"text":21317},{"id":21328,"depth":76,"text":21329},{"id":21338,"depth":76,"text":21339},{},"\u002Fhandbook\u002Fengineering\u002Fsupport",{"title":21293,"description":75},"handbook\u002Fengineering\u002Fsupport\u002Findex","av3JtpMmSZuTIAYeqcRdYR5vmy9-fiv_WsnBjpCB7OY",{"id":21358,"title":21359,"body":21360,"description":75,"extension":81,"meta":21812,"navGroup":83,"navOrder":83,"navTitle":21329,"navigation":84,"path":21335,"seo":21813,"stem":21814,"__hash__":21815},"handbook\u002Fhandbook\u002Fengineering\u002Fsupport\u002Ftriage.md","Support Triage Duty",{"type":7,"value":21361,"toc":21790},[21362,21365,21367,21370,21377,21380,21384,21387,21427,21430,21434,21438,21459,21463,21471,21474,21478,21493,21501,21505,21509,21520,21525,21527,21532,21537,21540,21554,21558,21561,21564,21572,21575,21588,21592,21599,21613,21616,21620,21623,21683,21687,21695,21698,21702,21705,21708,21711,21715,21720,21736,21739,21743,21746,21750,21769,21773,21776,21779],[10,21363,21359],{"id":21364},"support-triage-duty",[14,21366,2167],{"id":2166},[19,21368,21369],{},"Support triage duty is a first-line monitoring role to ensure incoming support requests are promptly acknowledged, categorized, and routed to the right department, team, or person.",[19,21371,21372,21373,21376],{},"At FlowFuse, we do not currently have a dedicated support team. To share the support load, keep every department connected to our users, and ensure clear ownership, we operate a triage rotation for all team members outside of Engineering. Engineering provides a separate rotating expert to support this process. This reflects our commitment to ",[423,21374,21375],{},"proactive ownership as a company",", ensuring customers receive timely, thoughtful responses and that requests reach the right place quickly.",[19,21378,21379],{},"The goal of triage is not to solve every issue yourself, but to act as a connector and create forward motion.",[14,21381,21383],{"id":21382},"how-triage-reflects-our-values","How Triage Reflects Our Values",[19,21385,21386],{},"Support triage duty is not just an operational practice. It is an expression of FlowFuse’s company values in action.",[144,21388,21389,21396,21403,21411,21419],{},[147,21390,21391,21393,21395],{},[423,21392,15308],{},[9379,21394],{},"Triage emphasizes initiative and outcomes over process. The focus is on creating momentum for customer requests rather than waiting for the right moment or person.",[147,21397,21398,21400,21402],{},[423,21399,15320],{},[9379,21401],{},"Triage is a living system. As we learn more about customer needs, volume, and patterns, we expect both the process and this handbook to evolve.",[147,21404,21405,21408,21410],{},[423,21406,21407],{},"Collaborative Community",[9379,21409],{},"By rotating triage across the organization, customer ownership is shared, teams remain connected to real user needs, and ensures information flows openly.",[147,21412,21413,21416,21418],{},[423,21414,21415],{},"Constructive Candor",[9379,21417],{},"Triage relies on clear, respectful communication, whether acknowledging a customer, routing a ticket, or escalating internally to keep work moving.",[147,21420,21421,21424,21426],{},[423,21422,21423],{},"Customer Empathy",[9379,21425],{},"Even when we do not yet have answers, triage ensures customers are heard, acknowledged, and supported with appropriate urgency and care.",[19,21428,21429],{},"Triage exists as a practical extension of how we work together at FlowFuse.",[14,21431,21433],{"id":21432},"the-flow-how-it-works","The Flow: How It Works",[164,21435,21437],{"id":21436},"the-schedule","The Schedule",[144,21439,21440,21450,21456],{},[147,21441,21442,21443,21446,21447,549],{},"Each Friday, the Support Coordinator announces the next ",[423,21444,21445],{},"Triage Lead"," (from non-engineering teams) in ",[542,21448,21449],{},"#support-tickets",[147,21451,21452,21453,549],{},"Rotations last ",[423,21454,21455],{},"one week (Monday to Friday)",[147,21457,21458],{},"In parallel, a second expert from Engineering is assigned weekly to assist with technical queries. This Engineering rotation is assigned by the Engineering Manager.",[164,21460,21462],{"id":21461},"the-role","The Role",[144,21464,21465,21468],{},[147,21466,21467],{},"You are the first set of eyes, not the final owner.",[147,21469,21470],{},"Your responsibility is to acknowledge, categorize, and route requests so they reach the right place quickly.",[19,21472,21473],{},"You are not expected to be an expert, only a connector.",[14,21475,21477],{"id":21476},"where-tickets-come-from","Where Tickets Come From",[144,21479,21480,21486],{},[147,21481,21482,21485],{},[423,21483,21484],{},"Live chat"," from the website support widget",[147,21487,21488,21490,21491],{},[423,21489,832],{}," sent to ",[542,21492,2931],{},[19,21494,21495,21496,549],{},"All tickets appear in the ",[46,21497,21500],{"href":21498,"rel":21499},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Fhelp-desk\u002F26586079\u002F",[108],"HubSpot Helpdesk",[14,21502,21504],{"id":21503},"what-to-monitor","What to Monitor",[164,21506,21508],{"id":21507},"hubspot","HubSpot",[19,21510,21511,21512,21519],{},"Keep the ",[46,21513,21516],{"href":21514,"rel":21515},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Fhelp-desk\u002F26586079\u002Fview\u002F236761036\u002Flist-view",[108],[423,21517,21518],{},"Unassigned Triage"," view open during the day. If you don't have access to HubSpot, only focus on the Slack Channel noted below.",[2672,21521,21522],{},[19,21523,21524],{},"To note: Chatbot tickets don’t go into triage and don't appear in Slack. Only in HubSpot.",[164,21526,825],{"id":842},[19,21528,21529,21530,549],{},"New tickets trigger notifications in ",[542,21531,21449],{},[2672,21533,21534],{},[19,21535,21536],{},"Tip: To receive badge notifications, configure the channel’s notification settings rather than relying on the bell icon.",[19,21538,21539],{},"Configuration steps:",[144,21541,21542,21545,21548,21551],{},[147,21543,21544],{},"Open the Slack channel #support-tickets",[147,21546,21547],{},"Click on the channel name",[147,21549,21550],{},"Click on the second icon at the top of the screen (bell icon)",[147,21552,21553],{},"Choose \"All new posts\"",[14,21555,21557],{"id":21556},"sla-awareness-important","SLA Awareness (Important)",[19,21559,21560],{},"Some customers have response-time SLAs based on their subscription.",[19,21562,21563],{},"Triage leads are not responsible for enforcing SLAs directly, but are responsible for ensuring tickets are routed and acknowledged in a way that supports them.",[19,21565,21566,21567,549],{},"Current SLA definitions and response expectations are documented in the ",[46,21568,21571],{"href":21569,"rel":21570},"https:\u002F\u002Fflowfuse.com\u002Fhandbook\u002Fsales\u002Fsubscription-agreement-1.5\u002F",[108],"Subscription Agreement",[19,21573,21574],{},"When triaging:",[144,21576,21577,21580,21583],{},[147,21578,21579],{},"Be especially attentive to Enterprise customer tickets",[147,21581,21582],{},"Prioritize routing and visibility for time-sensitive issues",[147,21584,21585,21586],{},"When unsure whether an SLA applies, escalate early in ",[542,21587,21449],{},[14,21589,21591],{"id":21590},"severity-guide","Severity Guide",[19,21593,21594,21595,21598],{},"A ticket is considered ",[423,21596,21597],{},"urgent"," if it involves:",[144,21600,21601,21604,21607,21610],{},[147,21602,21603],{},"Production outages or blocked deployments",[147,21605,21606],{},"Security or data concerns",[147,21608,21609],{},"Enterprise customers reporting downtime or business impact",[147,21611,21612],{},"Anything that risks breaching an SLA",[19,21614,21615],{},"When in doubt, escalate rather than waiting.",[14,21617,21619],{"id":21618},"categorization-routing","Categorization & Routing",[19,21621,21622],{},"To route the Slack message, the triage person should follow the instructions below.",[910,21624,21625,21635],{},[913,21626,21627],{},[916,21628,21629,21632],{},[919,21630,21631],{},"Category",[919,21633,21634],{},"Action",[930,21636,21637,21645,21652,21660,21667,21675],{},[916,21638,21639,21642],{},[935,21640,21641],{},"Sales inquiry",[935,21643,21644],{},"Tag @sales in the Slack thread of the ticket",[916,21646,21647,21650],{},[935,21648,21649],{},"Billing inquiry",[935,21651,21644],{},[916,21653,21654,21657],{},[935,21655,21656],{},"Product support (Enterprise)",[935,21658,21659],{},"Tag @engineering in the Slack thread of the ticket",[916,21661,21662,21665],{},[935,21663,21664],{},"Product support (Team)",[935,21666,21659],{},[916,21668,21669,21672],{},[935,21670,21671],{},"Product support (OSS or Community)",[935,21673,21674],{},"Tag @product in the Slack thread of the ticket",[916,21676,21677,21680],{},[935,21678,21679],{},"Spam (e.g. booth design offers)",[935,21681,21682],{},"Comment spam in the Slack thread of the ticket",[14,21684,21686],{"id":21685},"replying-vs-routing","Replying vs Routing",[144,21688,21689,21692],{},[147,21690,21691],{},"If you can confidently answer a simple question, or you are part of the team the ticket would be routed to, you may reply directly in HubSpot if you have access.",[147,21693,21694],{},"If the issue requires investigation or follow-up, route it to the appropriate team.",[19,21696,21697],{},"Whoever replies first in HubSpot becomes the ticket owner and will receive future notifications for that ticket. The owner can be re-assigned when appropriate.",[14,21699,21701],{"id":21700},"ownership-after-routing","Ownership After Routing",[19,21703,21704],{},"Once a ticket has been replied to in HubSpot or routed in Slack, ownership sits with the assigned ticket owner or team.",[19,21706,21707],{},"If a ticket stalls after assignment\u002Ftriage, responsibility for follow-up and resolution lies with the owner or owning team, not the triage role.",[19,21709,21710],{},"Triage exists to create initial clarity and forward motion, not to monitor or enforce ongoing progress.",[14,21712,21714],{"id":21713},"slack-workflow","Slack Workflow",[19,21716,21717,21718,10656],{},"Use emoji reactions on ticket notifications in ",[542,21719,21449],{},[144,21721,21722,21729],{},[147,21723,21724,21725,21728],{},"Add 👀 ",[542,21726,21727],{},":eyes:"," on the main Slack message to let the team know that:\nYou are on it",[147,21730,21731,21732,21735],{},"Add ✅ ",[542,21733,21734],{},":white_check_mark:"," on the main Slack message to let the team know that:\nIssue has been dealt with",[19,21737,21738],{},"This keeps the channel readable and avoids unnecessary status messages.",[14,21740,21742],{"id":21741},"vacation-ooo-coverage","Vacation & OOO Coverage",[19,21744,21745],{},"The Support Coordinator reviews the rotation against Deel each week and proactively swaps anyone who is out of office.",[14,21747,21749],{"id":21748},"rules-of-engagement","Rules of Engagement",[144,21751,21752,21760,21763],{},[147,21753,21754,21757,21759],{},[423,21755,21756],{},"Do not merge tickets in HubSpot",[9379,21758],{},"\nMerged tickets become unsearchable due to a HubSpot limitation.",[147,21761,21762],{},"Internal emails may still represent customer requests. Read carefully.",[147,21764,21765,21766,21768],{},"When unsure, ask in ",[542,21767,21449],{}," or the relevant department channel.",[14,21770,21772],{"id":21771},"handling-spam","Handling Spam",[19,21774,21775],{},"Common spam includes booth design offers and unsolicited sales pitches.",[19,21777,21778],{},"For these:",[144,21780,21781,21787],{},[147,21782,4410,21783,21786],{},[423,21784,21785],{},"Mark as spam"," in the HubSpot Actions menu, or",[147,21788,21789],{},"Delete the ticket",{"title":75,"searchDepth":76,"depth":76,"links":21791},[21792,21793,21794,21798,21799,21803,21804,21805,21806,21807,21808,21809,21810,21811],{"id":2166,"depth":76,"text":2167},{"id":21382,"depth":76,"text":21383},{"id":21432,"depth":76,"text":21433,"children":21795},[21796,21797],{"id":21436,"depth":605,"text":21437},{"id":21461,"depth":605,"text":21462},{"id":21476,"depth":76,"text":21477},{"id":21503,"depth":76,"text":21504,"children":21800},[21801,21802],{"id":21507,"depth":605,"text":21508},{"id":842,"depth":605,"text":825},{"id":21556,"depth":76,"text":21557},{"id":21590,"depth":76,"text":21591},{"id":21618,"depth":76,"text":21619},{"id":21685,"depth":76,"text":21686},{"id":21700,"depth":76,"text":21701},{"id":21713,"depth":76,"text":21714},{"id":21741,"depth":76,"text":21742},{"id":21748,"depth":76,"text":21749},{"id":21771,"depth":76,"text":21772},{},{"title":21359,"description":75},"handbook\u002Fengineering\u002Fsupport\u002Ftriage","2CN5S6ODm4cq-EYKUV6JA5-GlUQZ3JmhS3_3b-74xqI",{"id":21817,"title":21339,"body":21818,"description":21824,"extension":81,"meta":22064,"navGroup":83,"navOrder":83,"navTitle":21339,"navigation":84,"path":21345,"seo":22065,"stem":22066,"__hash__":22067},"handbook\u002Fhandbook\u002Fengineering\u002Fsupport\u002Ftroubleshooting.md",{"type":7,"value":21819,"toc":22054},[21820,21822,21825,21829,21832,21836,21840,21855,21859,21862,21870,21874,21878,21881,21889,21896,21900,21909,21913,21916,21948,21952,21955,21971,21975,21979,21986,21989,21993,22005,22013,22017,22021,22024,22033,22036,22039,22042,22051],[10,21821,21339],{"id":21338},[19,21823,21824],{},"This page is a guide for how to deal with incoming support tickets related to FlowFuse.",[14,21826,21828],{"id":21827},"common-issues","Common Issues",[19,21830,21831],{},"Below are sections for common areas that we see in support tickets. Whilst it is not exhaustive, it should provide a good starting point for troubleshooting, and ensuring we have enough details from the customer in order to help them.",[164,21833,21835],{"id":21834},"flowfuse-platform","FlowFuse Platform",[239,21837,21839],{"id":21838},"flowfuse-cloud","FlowFuse Cloud",[19,21841,21842,21843,21848,21849,21854],{},"Any outages or major issues on FlowFuse Cloud are tracked, and automatically logged in the ",[46,21844,21847],{"href":21845,"rel":21846},"https:\u002F\u002Fflowfuse.slack.com\u002Farchives\u002FC03BXLH9HP1",[108],"#ops-cloud"," Slack channel. You can then consult the ",[46,21850,21853],{"href":21851,"rel":21852},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1NMPWEFgHkVNN7RqHXUgijEGdNwZH-SlaAspOQr9Vg9k\u002Fedit?tab=t.0#heading=h.a7jq4bkz66hv",[108],"FlowFuse Cloud Incident Playbook"," in order to take the relevant actions in debugging the raised issues.",[239,21856,21858],{"id":21857},"flowfuse-self-hosted","FlowFuse Self-Hosted",[19,21860,21861],{},"Most support tickets we receive here are generally down to configuration options for installing and hosting FlowFuse, and enabling particular features.",[19,21863,21864,21865,21869],{},"For configuration-based support, the best place to start is consulting the ",[46,21866,21868],{"href":21867},"\u002Fdocs\u002Finstall\u002Fconfiguration\u002F","Configuring FlowFuse"," documentation.",[164,21871,21873],{"id":21872},"hosted-instances","Hosted Instances",[239,21875,21877],{"id":21876},"memory-issues","Memory Issues",[19,21879,21880],{},"An issue we have seen is where a Hosted Instance is running out of memory. This is normally seen either:",[504,21882,21883,21886],{},[147,21884,21885],{},"When the Instance is first being spun up due to the memory required to install dependencies.",[147,21887,21888],{},"A memory leak within the Node-RED instance, whereby memory usage gradually increases over a longer period of time.",[19,21890,21891,21892,549],{},"The best way to diagnose which of these is the cause, you can check the \"Performance\" tab of the affected Hosted Instance. More information available ",[46,21893,2011],{"href":21894,"rel":21895},"https:\u002F\u002Fflowfuse.com\u002Fchangelog\u002F2025\u002F06\u002Finstance-performance-memory\u002F",[108],[239,21897,21899],{"id":21898},"restarting-in-safe-mode","Restarting in Safe Mode",[19,21901,21902,21903,21908],{},"Any problems caused by the Node-RED flows themselves are best diagnosed by putting the Hosted Instance into safe mode. Please consult the ",[46,21904,21907],{"href":21905,"rel":21906},"https:\u002F\u002Fflowfuse.com\u002Fdocs\u002Fdebugging\u002F",[108],"Node-RED Safe Mode"," documentation for more information.",[164,21910,21912],{"id":21911},"remote-instances","Remote Instances",[19,21914,21915],{},"In any situation whereby a customer is having an issue with a Remote Instance, you should establish the following details:",[144,21917,21918,21921,21942,21945],{},[147,21919,21920],{},"What hardware is the Remote Instance running on?",[147,21922,21923,21924,21927,21928],{},"What version of ",[46,21925,21926],{"href":15404},"Device Agent"," is Remote Instance running?\n",[144,21929,21930],{},[147,21931,21932,21933,9328,21935,9328,21937,9328,21940],{},"Note: You can see this in the Device Overview in ",[2562,21934,21839],{},[2562,21936,21912],{},[2562,21938,21939],{},"Device",[2562,21941,2167],{},[147,21943,21944],{},"What version of NodeJS is the Remote Instance using?",[147,21946,21947],{},"Does the Remote Instance have public network access?",[239,21949,21951],{"id":21950},"connectivity-issues","Connectivity Issues",[19,21953,21954],{},"If we are seeing intermittent connectivity issues, then the most likely cause is:",[504,21956,21957,21968],{},[147,21958,21959,21960,21963,21964],{},"The Remote Instance is running an old Node-RED version, before we introduced the device caching. This will be any Node-RED versions older than ",[542,21961,21962],{},"v4.0.0",". You can see a full list ",[46,21965,2011],{"href":21966,"rel":21967},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fhelm\u002Fblob\u002Fmain\u002Fflowforge-container\u002Finstall-device-cache.sh#L3",[108],[147,21969,21970],{},"Physical network issues on the client's end. This is a last resort for \"blame\", but is an important factor we have to consider. If the Remote Instance is unable to check in with FlowFuse, then remote access will not be effective.",[164,21972,21974],{"id":21973},"account-management","Account Management",[239,21976,21978],{"id":21977},"deleting-an-account","Deleting an Account",[19,21980,21981,21982,549],{},"If a user wishes to delete their account, you can point them to the relevant section of the documentation ",[46,21983,2011],{"href":21984,"rel":21985},"https:\u002F\u002Fflowfuse.com\u002Fdocs\u002Fcloud\u002Fbilling\u002F#cancelling-your-subscription",[108],[19,21987,21988],{},"You should also, always ask, the reasons for wanting to delete the account. Understanding user churn is very important information to help us improve our product and service.",[164,21990,21992],{"id":21991},"flowfuse-dashboard","FlowFuse Dashboard",[19,21994,21995,21996,21999,22000,549],{},"When debugging FlowFuse Dashboard issues a very useful tool is the ",[542,21997,21998],{},"_debug"," view which is served up with every FlowFuse Dashboard. You can read more about it in the ",[46,22001,22004],{"href":22002,"rel":22003},"https:\u002F\u002Fdashboard.flowfuse.com\u002Fcontributing\u002Fwidgets\u002Fdebugging",[108],"FlowFuse Dashboard documentation",[19,22006,22007,22008,549],{},"Any bugs found for FlowFuse Dashboard should be logged as an issue in the ",[46,22009,22012],{"href":22010,"rel":22011},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fnode-red-dashboard\u002Fissues",[108],"FlowFuse Dashboard repository",[164,22014,22016],{"id":22015},"pricing","Pricing",[239,22018,22020],{"id":22019},"_2025-pricing-tier-changes","2025 Pricing & Tier Changes",[19,22022,22023],{},"In summer of 2025, FlowFuse deprecated the Free tier and changed the pricing structure of the Starter tier.",[19,22025,22026,22027,22032],{},"The Free tier was built to enable remote device management and provided for two remote instances, ",[46,22028,22031],{"href":22029,"rel":22030},"https:\u002F\u002Fflowfuse.com\u002Fblog\u002F2024\u002F12\u002Fflowfuse-release-2-12\u002F",[108],"free of charge.",". As we found that users were looking for cloud-hosted Node-RED instances, the Free tier did not meet this expectation, and was deprecated.",[19,22034,22035],{},"To support users seeking cloud-hosted Node-RED, the Starter tier was revised to provide a more powerful hosted instance, with greater CPU and memory than before. In addition, the tier went from offering two hosted instances and two remote instances, to only a single, more powerful hosted instance.",[19,22037,22038],{},"Existing Starter customers were notified of the change via emails on July 28 and August 15 (reminder)",[19,22040,22041],{},"Existing Free users were notified of the change via emails on August 4 and August 19.",[19,22043,22044,22045,22050],{},"To ease the transition of Free users to Starter, and Starter users to the revised pricing structure, ",[46,22046,22049],{"href":22047,"rel":22048},"https:\u002F\u002Fdashboard.stripe.com\u002Facct_1KJbS4J6VWAujNoL\u002Fcoupons\u002Fn9TR0YgU",[108],"a coupon"," was offered. The coupon will give a customer a free month of Starter with one hosted instance (included with Starter) and one remote instance (because they're used to this when migrating from Free).",[19,22052,22053],{},"In addition, users were informed that they could receive an additional free month by choosing Annual billing at checkout.",{"title":75,"searchDepth":76,"depth":76,"links":22055},[22056],{"id":21827,"depth":76,"text":21828,"children":22057},[22058,22059,22060,22061,22062,22063],{"id":21834,"depth":605,"text":21835},{"id":21872,"depth":605,"text":21873},{"id":21911,"depth":605,"text":21912},{"id":21973,"depth":605,"text":21974},{"id":21991,"depth":605,"text":21992},{"id":22015,"depth":605,"text":22016},{},{"title":21339,"description":21824},"handbook\u002Fengineering\u002Fsupport\u002Ftroubleshooting","w2OU23_54nCwscIMuM5efsvzgXQFwhfpa5LY8qVBxNg",{"id":22069,"title":8804,"body":22070,"description":75,"extension":81,"meta":22124,"navGroup":83,"navOrder":83,"navTitle":83,"navigation":84,"path":11712,"seo":22125,"stem":22126,"__hash__":22127},"handbook\u002Fhandbook\u002Fengineering\u002Ftools.md",{"type":7,"value":22071,"toc":22118},[22072,22074,22076,22085,22089,22092,22095,22106,22110],[10,22073,8804],{"id":8939},[14,22075,1047],{"id":1046},[19,22077,22078,22079,22084],{},"This is at the heart of how we work. Everyone in the company will be made part of\nthe ",[46,22080,22083],{"href":22081,"rel":22082},"https:\u002F\u002Fgithub.com\u002FFlowFuse",[108],"FlowFuse organization"," as part of their on-boarding\nactivities.",[14,22086,22088],{"id":22087},"llm-programming-assists","LLM Programming assists",[19,22090,22091],{},"FlowFuse recognizes the potential of LLM (AI) tools to increase productivity and\ninnovation. When using these tools, understand that the author and committer of\nany work remains fully responsible for its quality, functionality, and\nsecurity. AI-assisted work must meet the same high standards as work written\nentirely by a human. Review each line of code before committing.",[19,22093,22094],{},"When using AI tools for development, never share:",[504,22096,22097,22100,22103],{},[147,22098,22099],{},"Personal Identifiable Information (PII)",[147,22101,22102],{},"Company secrets like API keys, private credentials, etc, etc.",[147,22104,22105],{},"Customer code or other assets under NDA",[164,22107,22109],{"id":22108},"claude-code","Claude Code",[19,22111,22112,22113,22117],{},"Claude Code is available to team members by raising an ",[46,22114,22116],{"href":3791,"rel":22115},[108],"access request issue"," and assigning it to the CTO.",{"title":75,"searchDepth":76,"depth":76,"links":22119},[22120,22121],{"id":1046,"depth":76,"text":1047},{"id":22087,"depth":76,"text":22088,"children":22122},[22123],{"id":22108,"depth":605,"text":22109},{},{"title":8804,"description":75},"handbook\u002Fengineering\u002Ftools","aWtAjn_rjNwbLSRCUdfyslmxbztPi2D6hhzPgym0vcI",{"id":22129,"title":22130,"body":22131,"description":22467,"extension":81,"meta":22468,"navGroup":83,"navOrder":83,"navTitle":1518,"navigation":84,"path":6195,"seo":22469,"stem":22470,"__hash__":22471},"handbook\u002Fhandbook\u002Findex.md","FlowFuse Handbook",{"type":7,"value":22132,"toc":22456},[22133,22136,22143,22147,22162,22165,22168,22172,22175,22186,22190,22198,22200,22213,22219,22224,22228,22231,22234,22248,22252,22255,22342,22346,22405,22409],[10,22134,22130],{"id":22135},"flowfuse-handbook",[19,22137,22138,22139,22142],{},"This handbook contains all the information about how FlowFuse is run. It's a\nliving set of documents - collectively we'll ",[46,22140,22141],{"href":17819},"iterate","\non it as we learn and discover new things.",[14,22144,22146],{"id":22145},"about-the-handbook","About the Handbook",[19,22148,22149,22150,22155,22156,22161],{},"The FlowFuse handbook is inspired by the ",[46,22151,22154],{"href":22152,"rel":22153},"https:\u002F\u002Fabout.gitlab.com\u002Fhandbook\u002Fabout\u002F",[108],"GitLab handbook",".\nAs an all-remote company, we share ",[46,22157,22160],{"href":22158,"rel":22159},"https:\u002F\u002Fabout.gitlab.com\u002Fhandbook\u002Fabout\u002F#advantages",[108],"their rationale"," for having a handbook.",[19,22163,22164],{},"The aim is to avoid institutional knowledge building up inside our heads without\nalso being written down for others to share. We could do that all on the internal\nGoogle Drive, but by publishing in the handbook it allows for an open and honest\nconversation about what we do.",[19,22166,22167],{},"Our handbook is more than just a collection of policies; it is the living embodiment of our core values. We believe that documenting our work and culture is essential to our success, and this handbook is how we put our values into practice every single day.\nIt's how we ensure that information wants to be free, and that our collaborative community can thrive.",[14,22169,22171],{"id":22170},"why-the-handbook-matters","Why the Handbook Matters",[19,22173,22174],{},"It's All About Our Values.",[144,22176,22177,22180,22183],{},[147,22178,22179],{},"Results & Iterative Improvement: Our handbook is the ultimate tool for achieving results and making fast progress. When we write things down in the handbook first, we create a single, universally accessible source of truth for solutions and processes. This prevents the \"torturous loop of interruptions, meetings, and suboptimal knowledge transfers\" that happens when people have to constantly re-ask for information.  By making the handbook a living document that is never finished, we embrace the idea that \"everything is a draft\" and can be improved with small, iterative steps.",[147,22181,22182],{},"Collaborative Community: The handbook is the central hub for our community. We default to storing information in the handbook and on GitHub issues because information wants to be free. This asynchronous way of working ensures that discussions and decisions are not lost in private chats or forgotten after a meeting. This allows anyone to get the full context of a project and contribute, empowering our team members and fostering a shared sense of ownership.",[147,22184,22185],{},"Constructive Candor & Customer Empathy: A public handbook is a powerful way to demonstrate constructive candor and customer empathy. By making our processes and culture transparent, we show our commitment to improving. A public handbook is open to suggestions from both our internal team and the wider community, allowing us to incorporate new perspectives and improve on our own ideas. This also helps us attract people who are already aligned with our values, as they can see our culture and mission firsthand.",[14,22187,22189],{"id":22188},"internal-information","Internal information",[19,22191,22192,22193,22197],{},"Whilst instinctively we want to be open in all we do, there will inevitably be\ncontent that is ",[46,22194,22196],{"href":22195},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fdata-management\u002F#data-classification","not appropriate to make public",". That content is not\nshared in this handbook.",[14,22199,9520],{"id":9525},[19,22201,22202,22203,22207,22208,549],{},"The handbook is maintained on ",[46,22204,1047],{"href":22205,"rel":22206},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fwebsite\u002Ftree\u002Fmain\u002Fsrc\u002Fhandbook",[108],"\nand contributions can be made through pull-requests. How to contribute\nis captured ",[46,22209,22212],{"href":22210,"rel":22211},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fwebsite#flowfuse-website",[108],"in a guide",[19,22214,22215,22216,549],{},"The handbook is here for the whole company to help maintain. ",[423,22217,22218],{},"Pull-requests are welcome and strongly encouraged",[19,22220,22221,22222,793],{},"To follow the latest changes in the Handbook, join the ",[542,22223,894],{},[14,22225,22227],{"id":22226},"handbook-first","Handbook-first",[19,22229,22230],{},"Being handbook-first means that our handbook is not a static document we update after a decision is made. It is the very place where our proposals and discussions happen. We believe that this approach is the most effective way to live our values and ensure that our communication is clear, efficient, and transparent.",[19,22232,22233],{},"Instead of starting a discussion on Slack or in a meeting, we start it in the handbook. Here’s how we do it:",[144,22235,22236,22239,22242,22245],{},[147,22237,22238],{},"Start with a Proposal, not a Chat: When you have an idea for a new process, a change to an existing one, or a solution to a problem, you don't send a message on Slack. You create a proposal directly in the handbook. This proposal is a merge request that includes your suggested changes, allowing everyone to see and comment on the content directly. This ensures the full context of a discussion is preserved and universally accessible.",[147,22240,22241],{},"Integrate Discussion and Documentation: The discussion about your proposal happens right there in the merge request. Team members can provide feedback, ask questions, and suggest edits. This allows us to disagree and commit in a transparent way. Once a consensus is reached or a decision is made, the final version is merged into the handbook, and the entire discussion trail is saved for future reference.",[147,22243,22244],{},"Empower Everyone to Contribute: This system allows anyone at FlowFuse—from a new hire to a senior leader—to contribute directly to our company's culture and processes. It generates a shared responsibility to maintain the pace of documentation through a pay-it-forward mentality. The history of every change is visible, showing how learning happens and how iteration shapes proposals.",[147,22246,22247],{},"Eliminate Wasted Effort: By making the handbook the hub of our collaborative work, we ensure that the information we need is always where it should be. This prevents us from having to document something after the fact—a step that is often skipped—and avoids the \"torturous pattern of people pinging people for updates\". This is how we prioritize results and stay focused on what matters.",[14,22249,22251],{"id":22250},"how-flowfuse-is-run","How FlowFuse is run",[19,22253,22254],{},"To run our company we provide a comprehensive guide outlining policies, procedures, and expectations, fostering consistency, clarity, and effective communication within the organization.",[910,22256,22257,22265],{},[913,22258,22259],{},[916,22260,22261,22263],{},[919,22262],{"align":921},[919,22264],{"align":921},[930,22266,22267,22280,22294,22308,22323,22336],{},[916,22268,22269,22278],{},[935,22270,22271,22273,22275],{"align":921},[46,22272,2845],{"href":2844},[9379,22274],{},[19,22276,22277],{},"The core principles guiding and driving the whole company",[935,22279],{"align":921},[916,22281,22282,22292],{},[935,22283,22284,22287,22289],{"align":921},[46,22285,6717],{"href":22286},"\u002Fhandbook\u002Fcompany\u002Fstrategy\u002F",[9379,22288],{},[19,22290,22291],{},"The high level plan for our objectives at FlowFuse",[935,22293],{"align":921},[916,22295,22296,22306],{},[935,22297,22298,22301,22303],{"align":921},[46,22299,11765],{"href":22300},"\u002Fhandbook\u002Foperations\u002F",[9379,22302],{},[19,22304,22305],{},"The day to day operations, tactical bizzops",[935,22307],{"align":921},[916,22309,22310,22321],{},[935,22311,22312,22316,22318],{"align":921},[46,22313,22315],{"href":22314},"\u002Fhandbook\u002Fpeopleops\u002F","PeopleOps",[9379,22317],{},[19,22319,22320],{},"Humans aren't resources, so people ops",[935,22322],{"align":921},[916,22324,22325,22334],{},[935,22326,22327,22329,22331],{"align":921},[46,22328,623],{"href":2855},[9379,22330],{},[19,22332,22333],{},"Increase signal, decrease noise.",[935,22335],{"align":921},[916,22337,22338,22340],{},[935,22339],{"align":921},[935,22341],{"align":921},[164,22343,22345],{"id":22344},"how-we-build-the-product","How we build the product",[910,22347,22348,22356],{},[913,22349,22350],{},[916,22351,22352,22354],{},[919,22353],{"align":921},[919,22355],{"align":921},[930,22357,22358,22372,22386,22399],{},[916,22359,22360,22370],{},[935,22361,22362,22365,22367],{"align":921},[46,22363,11608],{"href":22364},"\u002Fhandbook\u002Fengineering\u002F",[9379,22366],{},[19,22368,22369],{},"Product management, development, and how features are delivered with velocity and quality",[935,22371],{"align":921},[916,22373,22374,22384],{},[935,22375,22376,22379,22381],{"align":921},[46,22377,8769],{"href":22378},"\u002Fhandbook\u002Fdesign\u002F",[9379,22380],{},[19,22382,22383],{},"How information is presented through UX\u002FUI to users, prospects, and internally.",[935,22385],{"align":921},[916,22387,22388,22397],{},[935,22389,22390,22392,22394],{"align":921},[46,22391,2914],{"href":61},[9379,22393],{},[19,22395,22396],{},"Keeping what's private private, and what needs protecting protected.",[935,22398],{"align":921},[916,22400,22401,22403],{},[935,22402],{"align":921},[935,22404],{"align":921},[164,22406,22408],{"id":22407},"bringing-the-built-product-to-market","Bringing the built product to market",[910,22410,22411,22419],{},[913,22412,22413],{},[916,22414,22415,22417],{},[919,22416],{"align":921},[919,22418],{"align":921},[930,22420,22421,22435,22450],{},[916,22422,22423,22433],{},[935,22424,22425,22428,22430],{"align":921},[46,22426,21080],{"href":22427},"\u002Fhandbook\u002Fmarketing\u002F",[9379,22429],{},[19,22431,22432],{},"How we reach companies that can benefit from FlowFuse.",[935,22434],{"align":921},[916,22436,22437,22448],{},[935,22438,22439,22443,22445],{"align":921},[46,22440,22442],{"href":22441},"\u002Fhandbook\u002Fsales\u002Fcustomer-success\u002F","Customer Success",[9379,22444],{},[19,22446,22447],{},"Happy customers is what makes FlowFuse a sustainable business.",[935,22449],{"align":921},[916,22451,22452,22454],{},[935,22453],{"align":921},[935,22455],{"align":921},{"title":75,"searchDepth":76,"depth":76,"links":22457},[22458,22459,22460,22461,22462,22463],{"id":22145,"depth":76,"text":22146},{"id":22170,"depth":76,"text":22171},{"id":22188,"depth":76,"text":22189},{"id":9525,"depth":76,"text":9520},{"id":22226,"depth":76,"text":22227},{"id":22250,"depth":76,"text":22251,"children":22464},[22465,22466],{"id":22344,"depth":605,"text":22345},{"id":22407,"depth":605,"text":22408},"This handbook contains all the information about how FlowFuse is run. It's a\nliving set of documents - collectively we'll iterate\non it as we learn and discover new things.",{},{"title":22130,"description":22467},"handbook\u002Findex","CPUImOs2QzCHVM8MmSof1UlHV76OMbnqWQXlEWr5RaU",{"id":22473,"title":22474,"body":22475,"description":75,"extension":81,"meta":23652,"navGroup":83,"navOrder":83,"navTitle":83,"navigation":84,"path":23653,"seo":23654,"stem":23655,"__hash__":23656},"handbook\u002Fhandbook\u002Fmarketing\u002Fblog.md","Blog",{"type":7,"value":22476,"toc":23627},[22477,22480,22484,22504,22593,22597,22600,22603,22607,22610,22621,22625,22671,22675,22681,22685,22701,22705,22721,22725,22728,22731,22735,22741,22747,22751,22754,22867,22869,22872,22876,22879,22881,22888,22891,22894,22904,22907,22910,22919,22926,22944,22946,22952,22974,22981,22995,23007,23015,23019,23025,23074,23078,23088,23093,23108,23110,23115,23118,23123,23145,23150,23190,23193,23197,23200,23203,23209,23213,23220,23254,23257,23286,23290,23293,23307,23313,23315,23362,23365,23369,23372,23397,23403,23406,23409,23448,23451,23455,23458,23462,23474,23478,23485,23488,23513,23537,23541,23547,23551,23561,23565,23573,23577,23580,23587,23590,23596,23599,23603,23609,23612,23618,23621,23624],[10,22478,22474],{"id":22479},"blog",[14,22481,22483],{"id":22482},"blogging-process","Blogging Process",[19,22485,22486,22487,22492,22493,22497,22498,22503],{},"Content creation and blogging are effective ways to communicate with our community and are tied to our SEO performance (that we track in this ",[46,22488,22491],{"href":22489,"rel":22490},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Freports-dashboard\u002F26586079\u002Fview\u002F110361885",[108],"dedicated dashboard"," and our ",[46,22494,22496],{"href":22495},"\u002Fhandbook\u002Fmarketing\u002Fsocial-media\u002F#strategy-for-increasing-reach","Social Media Strategy"," and GEO that we track in this ",[46,22499,22502],{"href":22500,"rel":22501},"https:\u002F\u002Fanalytics.google.com\u002Fanalytics\u002Fweb\u002F#\u002Fanalysis\u002Fa221166832p304634214",[108],"Google Analytics report",". The process for publishing a blog is as follows:",[504,22505,22506,22514,22521,22532,22540,22547,22550,22553,22561,22564,22575,22578,22581,22584,22587],{},[147,22507,22508,22509,549],{},"Program your blog post content aligned with the content strategy and schedule it in the Marketing team's ",[46,22510,22513],{"href":22511,"rel":22512},"https:\u002F\u002Fapp.asana.com\u002F1\u002F1213818720452348\u002Fproject\u002F1214069528696432\u002Fcalendar\u002F1214069573785519",[108],"Content Calendar",[147,22515,22516,22517,549],{},"Create an initial issue or tie your blog to one of your scheduled issues ",[46,22518,2011],{"href":22519,"rel":22520},"https:\u002F\u002Fgithub.com\u002Forgs\u002FFlowFuse\u002Fprojects\u002F21\u002Fviews\u002F1",[108],[147,22522,22523,22524,22527,22528,549],{},"Issues should be assigned a date, which should be posted here in this ",[46,22525,13245],{"href":22519,"rel":22526},[108],". The target date for review should be at least three working days before the planned posting date on social media. Check the ",[46,22529,22531],{"href":22530},"\u002Fhandbook\u002Fmarketing\u002Fsocial-media\u002F#planning-and-posting","social media planning and posting section",[147,22533,22534,22535,22539],{},"Create an ",[46,22536,22538],{"href":22537},"\u002Fhandbook\u002Fdesign\u002Fart-requests\u002F#creating-an-art-request","art request"," for a blog tile to go with your article and share a deadline for when you're planning it to go live. This image will be used not only on the web, but also when the content is promoted on socials.",[147,22541,22542,22543,22546],{},"Create a Pull Request on the ",[46,22544,9615],{"href":1714,"rel":22545},[108]," with your Blog Content.",[147,22548,22549],{},"Assign yourself as an Assignee.",[147,22551,22552],{},"Convert to Draft",[147,22554,22555,22556,22560],{},"Generate a temporary, ",[46,22557,22559],{"href":22558},"\u002Fhandbook\u002Fmarketing\u002Fblog\u002F#blog-tile-creation-process","AI-generated blog tile"," for your article to ensure the content is publish-ready from the start.",[147,22562,22563],{},"No Reviews shall be done until the PR is “Ready for Review”",[147,22565,22566,22567],{},"Assign two reviewers\n",[144,22568,22569,22572],{},[147,22570,22571],{},"One Reviewer for Content",[147,22573,22574],{},"One Reviewer for SEO.",[147,22576,22577],{},"If the content is time-sensitive, please make sure everyone involved is aware of this.",[147,22579,22580],{},"Content will be reviewed first.",[147,22582,22583],{},"SEO will be reviewed second.",[147,22585,22586],{},"When both reviews are done*, the Author or SEO reviewer can merge. In the event of an external author, SEO\u002Fcontent review will merge.",[147,22588,22589,22590,22592],{},"Once merged, the article can be promoted on FlowFuse social channels by either the author or the Social Media Manager. Check the ",[46,22591,22531],{"href":22530}," for guidance and considerations.",[14,22594,22596],{"id":22595},"blog-tile-creation-process","Blog Tile Creation Process",[19,22598,22599],{},"The blog tile is generated with AI to ensure fast, unblocked publishing and visual consistency across all articles.",[19,22601,22602],{},"This allows every post to move through review and publication without depending on design availability.",[164,22604,22606],{"id":22605},"generate-a-tile-with-nano-banana-pro","Generate a Tile With Nano Banana Pro",[19,22608,22609],{},"By generating a tile immediately, we ensure:",[144,22611,22612,22615,22618],{},[147,22613,22614],{},"Fast turnaround",[147,22616,22617],{},"Asynchronous, non-blocking content flow",[147,22619,22620],{},"Consistent visual completeness across all new posts",[239,22622,22624],{"id":22623},"requirements","Requirements",[144,22626,22627,22636,22656,22659],{},[147,22628,22629,22630,2040,22633,549],{},"Enable both modes: ",[423,22631,22632],{},"thinking",[423,22634,22635],{},"Nano Banana",[147,22637,22638,22639,22642,22643,22648],{},"Always attach at least three ",[423,22640,22641],{},"PNG or JPG"," reference images from ",[46,22644,22647],{"href":22645,"rel":22646},"https:\u002F\u002Fdrive.google.com\u002Fopen?id=1mbJ-PFuAuhUpsR3hRYxwZM_-WrwF6PIU&usp=drive_fs",[108],"the curated reference folder",[144,22649,22650,22653],{},[147,22651,22652],{},"Only use images from this folder as references.",[147,22654,22655],{},"❗ Do not use AI-generated images as references, as this degrades visual consistency, colour accuracy, and style over time.",[147,22657,22658],{},"All attached reference images must use the same background color (light indigo or dark indigo).",[147,22660,22661,22662,9403,22666],{},"To choose the correct background color, check the ",[46,22663,22665],{"href":22664},"\u002Fblog\u002F","most recently published article",[144,22667,22668],{},[147,22669,22670],{},"If the latest tile uses a light background, generate a dark one next, and vice versa.",[239,22672,22674],{"id":22673},"basic-prompt-recommended-for-speed","Basic Prompt (Recommended for Speed)",[557,22676,22679],{"className":22677,"code":22678,"language":562},[560],"Create a 1600 × 900 px image for this article:  \n[insert the article’s Netlify preview URL]\n\nUse the attached images as a style reference. It should include:\n\n- A background using the same colour palette  \n- The image title, using Heebo Regular and the same colour used for titles in the reference images  \n- An image, diagram, or isometric illustration that represents the content of the article  \n",[542,22680,22678],{"__ignoreMap":75},[239,22682,22684],{"id":22683},"optional-prompt-refinement","Optional Prompt Refinement",[144,22686,22687,22690],{},[147,22688,22689],{},"You may refine the prompt if you already know the desired visual direction.",[147,22691,22692,22693],{},"For example, if you want a diagram-style tile:\n",[144,22694,22695,22698],{},[147,22696,22697],{},"Attach only diagram-based reference images.",[147,22699,22700],{},"Provide a description of the diagram or include Mermaid code.",[239,22702,22704],{"id":22703},"storing-generated-images","Storing Generated Images",[144,22706,22707,22715,22718],{},[147,22708,22709,22710,549],{},"All AI-generated tiles must be uploaded to the ",[46,22711,22714],{"href":22712,"rel":22713},"https:\u002F\u002Fdrive.google.com\u002Fopen?id=10FMVkHMwCEf1zc80t8J-4sY2xtggYQ6G&usp=drive_fs",[108],"this folder",[147,22716,22717],{},"This folder is for reference and organization only.",[147,22719,22720],{},"Images in this folder must NOT be reused as reference images for future generations.",[239,22722,22724],{"id":22723},"about-the-watermark","About the Watermark",[19,22726,22727],{},"Images generated with Nano Banana Pro will include the Gemini watermark.",[19,22729,22730],{},"This is acceptable and supports fast publishing.",[164,22732,22734],{"id":22733},"design-team-visibility","Design Team Visibility",[19,22736,22737,22738,22740],{},"After generating the temporary tile, be sure to open an ",[46,22739,22538],{"href":22537}," and attach the generated tile, so the design team is aware of the asset.",[19,22742,22743,22744,22746],{},"This does ",[423,22745,6916],{}," block publishing — it simply allows designers to review the temporary tile later and update it if a final, on-brand version is needed.",[14,22748,22750],{"id":22749},"blog-cms","Blog CMS",[19,22752,22753],{},"When creating a blog post there are several headers which are used by the CMS to populate the blogs as well as the blog index page. e.g:",[557,22755,22758],{"className":22756,"code":22757,"language":9581,"meta":75,"style":75},"language-njk shiki shiki-themes github-light github-dark","---\ntitle: The title\nsubtitle: The subtitle\ndescription: The description\ndate: 2022-12-20\nauthors: [\"rob-marcer\"]\nimage: \u002Fblog\u002F2022\u002F12\u002Fimages\u002Ftile-image.png\nvideo: dteXgcBXUnk  # Optional: YouTube video ID to use instead of image in hero section\ntldr: \"A short summary of the article's main takeaway.\"  # Optional\ncta:\n  type: pricing\n  title: Ready to compare plans?\n  description: Explore the available options and choose the best fit for your team.\ntags:\n    - posts\n    - node-red\n    - how-to\n---\n\nabove more\n\u003C!--more-->\nbelow more\n",[542,22759,22760,22764,22769,22774,22779,22784,22789,22794,22799,22804,22809,22814,22819,22824,22829,22834,22839,22844,22848,22852,22857,22862],{"__ignoreMap":75},[2403,22761,22762],{"class":2405,"line":2406},[2403,22763,14098],{},[2403,22765,22766],{"class":2405,"line":76},[2403,22767,22768],{},"title: The title\n",[2403,22770,22771],{"class":2405,"line":605},[2403,22772,22773],{},"subtitle: The subtitle\n",[2403,22775,22776],{"class":2405,"line":2423},[2403,22777,22778],{},"description: The description\n",[2403,22780,22781],{"class":2405,"line":2465},[2403,22782,22783],{},"date: 2022-12-20\n",[2403,22785,22786],{"class":2405,"line":2471},[2403,22787,22788],{},"authors: [\"rob-marcer\"]\n",[2403,22790,22791],{"class":2405,"line":3086},[2403,22792,22793],{},"image: \u002Fblog\u002F2022\u002F12\u002Fimages\u002Ftile-image.png\n",[2403,22795,22796],{"class":2405,"line":3092},[2403,22797,22798],{},"video: dteXgcBXUnk  # Optional: YouTube video ID to use instead of image in hero section\n",[2403,22800,22801],{"class":2405,"line":3098},[2403,22802,22803],{},"tldr: \"A short summary of the article's main takeaway.\"  # Optional\n",[2403,22805,22806],{"class":2405,"line":3104},[2403,22807,22808],{},"cta:\n",[2403,22810,22811],{"class":2405,"line":3109},[2403,22812,22813],{},"  type: pricing\n",[2403,22815,22816],{"class":2405,"line":3115},[2403,22817,22818],{},"  title: Ready to compare plans?\n",[2403,22820,22821],{"class":2405,"line":3121},[2403,22822,22823],{},"  description: Explore the available options and choose the best fit for your team.\n",[2403,22825,22826],{"class":2405,"line":3127},[2403,22827,22828],{},"tags:\n",[2403,22830,22831],{"class":2405,"line":3132},[2403,22832,22833],{},"    - posts\n",[2403,22835,22836],{"class":2405,"line":3138},[2403,22837,22838],{},"    - node-red\n",[2403,22840,22841],{"class":2405,"line":3143},[2403,22842,22843],{},"    - how-to\n",[2403,22845,22846],{"class":2405,"line":3148},[2403,22847,14098],{},[2403,22849,22850],{"class":2405,"line":3154},[2403,22851,2462],{"emptyLinePlaceholder":84},[2403,22853,22854],{"class":2405,"line":3160},[2403,22855,22856],{},"above more\n",[2403,22858,22859],{"class":2405,"line":3166},[2403,22860,22861],{},"\u003C!--more-->\n",[2403,22863,22864],{"class":2405,"line":3172},[2403,22865,22866],{},"below more\n",[164,22868,253],{"id":14103},[19,22870,22871],{},"The title of the page can be seen on both the blog index and the articles.",[164,22873,22875],{"id":22874},"subtitle","Subtitle",[19,22877,22878],{},"The subtitle is only shown on the articles.",[164,22880,15152],{"id":13786},[19,22882,22883,22884,22887],{},"Provides the (OpenGraph) description for social media sharing and may appear on search engine results pages. Also used on the ",[542,22885,22886],{},"\u002Fblog"," page for past articles. Keep it unique, simple, and concise, capturing the essence of the content within 80 to 220 characters, ideally around 160.",[164,22889,22890],{"id":20212},"Date",[19,22892,22893],{},"The data can be seen on both the blog index and the articles.",[19,22895,1375,22896,22898,22899,22903],{},[542,22897,20212],{}," field in the blog post front matter serves a crucial role in determining when a blog post is published. You can set this field to a future date if you wish to schedule your blog post for publication on a specific day. See the ",[46,22900,22902],{"href":22901},"#scheduling-a-blog-post","Scheduling a blog post"," section for more details.",[164,22905,22906],{"id":20230},"Authors",[19,22908,22909],{},"The author can be seen on both the blog index and the articles. If you need to add multiple authors, it can be achieved in this way:",[557,22911,22913],{"className":22756,"code":22912,"language":9581,"meta":75,"style":75},"authors: [\"rob-marcer\", \"joe-pavitt\"]\n",[542,22914,22915],{"__ignoreMap":75},[2403,22916,22917],{"class":2405,"line":2406},[2403,22918,22912],{},[19,22920,22921,22922],{},"If the authors are FlowFuse team members, the names need to be formatted inline with the file names found ",[46,22923,2011],{"href":22924,"rel":22925},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fwebsite\u002Ftree\u002Fmain\u002Fsrc\u002F_data\u002Fteam",[108],[19,22927,22928,22929,22934,22935,22937,22938,22943],{},"If they're not FlowFuse team members, they need to be added to the ",[46,22930,22933],{"href":22931,"rel":22932},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fwebsite\u002Ftree\u002Fmain\u002Fsrc\u002F_data\u002Fguests",[108],"guests list",". Duplicate any of the files already in that folder, proceed to change the name of the file and update the info inside the ",[542,22936,13371],{}," file. You'll also need to add a headshot in the images\u002Fteam ",[46,22939,22942],{"href":22940,"rel":22941},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fwebsite\u002Ftree\u002Fmain\u002Fsrc\u002Fimages\u002Fteam",[108],"folder"," following the same name convention as the rest of the files.",[164,22945,9202],{"id":9115},[19,22947,22948,22949,22951],{},"You can include a YouTube video as the hero content instead of an image by adding a ",[542,22950,9115],{}," field with the YouTube video ID:",[557,22953,22955],{"className":22756,"code":22954,"language":9581,"meta":75,"style":75},"---\ntitle: The title\nvideo: dteXgcBXUnk\n---\n",[542,22956,22957,22961,22965,22970],{"__ignoreMap":75},[2403,22958,22959],{"class":2405,"line":2406},[2403,22960,14098],{},[2403,22962,22963],{"class":2405,"line":76},[2403,22964,22768],{},[2403,22966,22967],{"class":2405,"line":605},[2403,22968,22969],{},"video: dteXgcBXUnk\n",[2403,22971,22972],{"class":2405,"line":2423},[2403,22973,14098],{},[19,22975,22976,22977,22980],{},"The video ID is the part after ",[542,22978,22979],{},"v="," in a YouTube URL. For example:",[144,22982,22983,22989],{},[147,22984,22985,22986],{},"URL: ",[542,22987,22988],{},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=dteXgcBXUnk",[147,22990,22991,22992],{},"Video ID: ",[542,22993,22994],{},"dteXgcBXUnk",[19,22996,22997,22998,23000,23001,23003,23004,23006],{},"When a ",[542,22999,9115],{}," field is present, it takes precedence over the ",[542,23002,14122],{}," field in the hero section of the blog post. The video will be embedded using the ",[542,23005,20704],{}," component for better performance and faster page load times.",[19,23008,23009,23011,23012,23014],{},[423,23010,8290],{}," You should still provide an ",[542,23013,14122],{}," field as a fallback for social media previews and RSS feeds.",[239,23016,23018],{"id":23017},"embedding-videos-in-article-body","Embedding Videos in Article Body",[19,23020,23021,23022,23024],{},"To embed a YouTube video within the body of a blog post, use the ",[542,23023,20642],{}," web component:",[557,23026,23028],{"className":10396,"code":23027,"language":10398,"meta":75,"style":75},"\u003Clite-youtube videoid=\"VIDEO_ID\" params=\"rel=0\" style=\"width: 704px; height: 100%;\" title=\"Video title\">\u003C\u002Flite-youtube>\n",[542,23029,23030],{"__ignoreMap":75},[2403,23031,23032,23034,23036,23039,23041,23044,23047,23049,23052,23055,23057,23060,23063,23065,23068,23070,23072],{"class":2405,"line":2406},[2403,23033,10405],{"class":2446},[2403,23035,20704],{"class":2686},[2403,23037,23038],{"class":2758}," videoid",[2403,23040,10414],{"class":2446},[2403,23042,23043],{"class":2765},"\"VIDEO_ID\"",[2403,23045,23046],{"class":2758}," params",[2403,23048,10414],{"class":2446},[2403,23050,23051],{"class":2765},"\"rel=0\"",[2403,23053,23054],{"class":2758}," style",[2403,23056,10414],{"class":2446},[2403,23058,23059],{"class":2765},"\"width: 704px; height: 100%;\"",[2403,23061,23062],{"class":2758}," title",[2403,23064,10414],{"class":2446},[2403,23066,23067],{"class":2765},"\"Video title\"",[2403,23069,10447],{"class":2446},[2403,23071,20704],{"class":2686},[2403,23073,10428],{"class":2446},[19,23075,22976,23076,22980],{},[542,23077,22979],{},[144,23079,23080,23084],{},[147,23081,22985,23082],{},[542,23083,22988],{},[147,23085,22991,23086],{},[542,23087,22994],{},[19,23089,1375,23090,23092],{},[542,23091,20642],{}," component is included globally on all pages — no additional imports needed. It shows a static thumbnail and only loads the YouTube player when the user clicks play.",[2672,23094,23095],{},[19,23096,23097,23104,23105,23107],{},[423,23098,23099,23100,23103],{},"Do not use raw ",[542,23101,23102],{},"\u003Ciframe>"," tags to embed YouTube videos."," Iframes load YouTube's scripts and set tracking cookies as soon as the page renders, before any user consent — which is not GDPR-compliant. Always use ",[542,23106,20642],{}," instead.",[164,23109,18410],{"id":18409},[19,23111,1375,23112,23114],{},[542,23113,18409],{}," field adds a highlighted summary block that appears at the top of the article body, before the content. It helps readers quickly decide whether to read the full article and improves engagement for longer posts. It also supports AEO\u002FGEO — answer engines (AI overviews, ChatGPT, Perplexity) prefer content that leads with the answer, and the TL;DR is the right place to do that. Write it as a direct, self-contained conclusion to the article's main question.",[19,23116,23117],{},"It can be a single string or a list of bullet points:",[19,23119,23120],{},[423,23121,23122],{},"Single paragraph:",[557,23124,23126],{"className":9391,"code":23125,"language":9393,"meta":75,"style":75},"---\ntldr: \"A one-sentence or short paragraph summary of the article's key takeaway.\"\n---\n",[542,23127,23128,23132,23141],{"__ignoreMap":75},[2403,23129,23130],{"class":2405,"line":2406},[2403,23131,14098],{"class":2758},[2403,23133,23134,23136,23138],{"class":2405,"line":76},[2403,23135,18409],{"class":2686},[2403,23137,9411],{"class":2446},[2403,23139,23140],{"class":2765},"\"A one-sentence or short paragraph summary of the article's key takeaway.\"\n",[2403,23142,23143],{"class":2405,"line":605},[2403,23144,14098],{"class":2758},[19,23146,23147],{},[423,23148,23149],{},"Bullet list:",[557,23151,23153],{"className":9391,"code":23152,"language":9393,"meta":75,"style":75},"---\ntldr:\n  - First key point.\n  - Second key point.\n  - Third key point.\n---\n",[542,23154,23155,23159,23165,23172,23179,23186],{"__ignoreMap":75},[2403,23156,23157],{"class":2405,"line":2406},[2403,23158,14098],{"class":2758},[2403,23160,23161,23163],{"class":2405,"line":76},[2403,23162,18409],{"class":2686},[2403,23164,9403],{"class":2446},[2403,23166,23167,23169],{"class":2405,"line":605},[2403,23168,14139],{"class":2446},[2403,23170,23171],{"class":2765},"First key point.\n",[2403,23173,23174,23176],{"class":2405,"line":2423},[2403,23175,14139],{"class":2446},[2403,23177,23178],{"class":2765},"Second key point.\n",[2403,23180,23181,23183],{"class":2405,"line":2465},[2403,23182,14139],{"class":2446},[2403,23184,23185],{"class":2765},"Third key point.\n",[2403,23187,23188],{"class":2405,"line":2471},[2403,23189,14098],{"class":2758},[19,23191,23192],{},"The block renders with an indigo left border and a \"TL;DR\" label. It is optional — omit it if the article is short or the introduction already serves as a clear summary.",[164,23194,23196],{"id":23195},"cta","CTA",[19,23198,23199],{},"The CTA renders a call-to-action block at the end of the article body, just before the closing content.",[19,23201,23202],{},"If no CTA is defined, the default \"contact\" variant is shown.",[19,23204,23205,23206,23208],{},"To customize it, add a ",[542,23207,23195],{}," object to the front matter.",[239,23210,23212],{"id":23211},"cta-type","CTA Type",[19,23214,23215,23216,23219],{},"Set ",[542,23217,23218],{},"cta.type"," to one of the following values:",[144,23221,23222,23231,23240,23248],{},[147,23223,23224,23227,23228],{},[542,23225,23226],{},"demo"," - renders the \"Book a Demo\" CTA and always links to ",[542,23229,23230],{},"\u002Fbook-demo",[147,23232,23233,23236,23237],{},[542,23234,23235],{},"contact"," - renders the default \"Contact Us\" CTA and always links to ",[542,23238,23239],{},"\u002Fcontact-us",[147,23241,23242,23244,23245],{},[542,23243,22015],{}," - renders the \"Pricing\" CTA and always links to ",[542,23246,23247],{},"\u002Fpricing",[147,23249,23250,23253],{},[542,23251,23252],{},"sign-up"," - renders the sign-up CTA and always links to the hosted sign-up URL",[19,23255,23256],{},"Example:",[557,23258,23260],{"className":9391,"code":23259,"language":9393,"meta":75,"style":75},"---\ncta:\n  type: demo\n---\n",[542,23261,23262,23266,23272,23282],{"__ignoreMap":75},[2403,23263,23264],{"class":2405,"line":2406},[2403,23265,14098],{"class":2758},[2403,23267,23268,23270],{"class":2405,"line":76},[2403,23269,23195],{"class":2686},[2403,23271,9403],{"class":2446},[2403,23273,23274,23277,23279],{"class":2405,"line":605},[2403,23275,23276],{"class":2686},"  type",[2403,23278,9411],{"class":2446},[2403,23280,23281],{"class":2765},"demo\n",[2403,23283,23284],{"class":2405,"line":2423},[2403,23285,14098],{"class":2758},[239,23287,23289],{"id":23288},"cta-content","CTA Content",[19,23291,23292],{},"You can optionally override the CTA title and description:",[144,23294,23295,23301],{},[147,23296,23297,23300],{},[542,23298,23299],{},"cta.title"," — The headline displayed in the CTA block. Keep it short and relevant to the article.",[147,23302,23303,23306],{},[542,23304,23305],{},"cta.description"," — A brief supporting message that explains the value or relevance of the CTA in the context of the article.",[19,23308,23309,23310,23312],{},"The button label and destination are fixed by ",[542,23311,23218],{}," and should not be customized.",[19,23314,23256],{},[557,23316,23318],{"className":9391,"code":23317,"language":9393,"meta":75,"style":75},"---\ncta:\n  type: pricing\n  title: Planning to deploy this in production?\n  description: Explore which plans support your infrastructure, scaling, and security requirements.\n---\n",[542,23319,23320,23324,23330,23339,23348,23358],{"__ignoreMap":75},[2403,23321,23322],{"class":2405,"line":2406},[2403,23323,14098],{"class":2758},[2403,23325,23326,23328],{"class":2405,"line":76},[2403,23327,23195],{"class":2686},[2403,23329,9403],{"class":2446},[2403,23331,23332,23334,23336],{"class":2405,"line":605},[2403,23333,23276],{"class":2686},[2403,23335,9411],{"class":2446},[2403,23337,23338],{"class":2765},"pricing\n",[2403,23340,23341,23343,23345],{"class":2405,"line":2423},[2403,23342,20690],{"class":2686},[2403,23344,9411],{"class":2446},[2403,23346,23347],{"class":2765},"Planning to deploy this in production?\n",[2403,23349,23350,23353,23355],{"class":2405,"line":2465},[2403,23351,23352],{"class":2686},"  description",[2403,23354,9411],{"class":2446},[2403,23356,23357],{"class":2765},"Explore which plans support your infrastructure, scaling, and security requirements.\n",[2403,23359,23360],{"class":2405,"line":2471},[2403,23361,14098],{"class":2758},[19,23363,23364],{},"The CTA should be relevant to the article's topic. Tailor these variables to match the subject matter.",[239,23366,23368],{"id":23367},"tracking","Tracking",[19,23370,23371],{},"The CTA button automatically fires an event when clicked. No additional setup is required from the author. The event captures:",[144,23373,23374,23382],{},[147,23375,23376,1755,23379],{},[423,23377,23378],{},"Event name:",[542,23380,23381],{},"blog-cta",[147,23383,23384,1755,23390,23393,23394,23396],{},[423,23385,23386,23387,10656],{},"Property ",[542,23388,23389],{},"reference",[542,23391,23392],{},"\"Blog: \u003Carticle title>\""," — populated automatically from the page's ",[542,23395,14103],{}," front matter field.",[19,23398,23399,23400,23402],{},"This allows you to track which blog posts are driving CTA clicks in your analytics, filtered by the ",[542,23401,23389],{}," property.",[164,23404,23405],{"id":14132},"Tags",[19,23407,23408],{},"Tag your content appropriately from the collection of tags that help us manage our blog content. They include:",[144,23410,23411,23416,23420,23425,23429,23433,23438,23443],{},[147,23412,23413],{},[542,23414,23415],{},"node-red",[147,23417,23418],{},[542,23419,19923],{},[147,23421,23422],{},[542,23423,23424],{},"how-to",[147,23426,23427],{},[542,23428,17733],{},[147,23430,23431],{},[542,23432,11716],{},[147,23434,23435],{},[542,23436,23437],{},"news",[147,23439,23440],{},[542,23441,23442],{},"unified-namespace",[147,23444,23445],{},[542,23446,23447],{},"ai",[19,23449,23450],{},"There's a page with a collection of posts for each tag in that list.",[239,23452,23454],{"id":23453},"custom-tags","Custom Tags",[19,23456,23457],{},"You can also add your own custom tags. While these won't create a new page with a collection of posts, they will help suggest related articles. Keep in mind that for an article to be considered related, the majority of tags must match, with allowance for a difference in one tag.",[239,23459,23461],{"id":23460},"meta-keywords","Meta Keywords",[19,23463,23464,23465,23469,23470,549],{},"Additionally, the tags you assign to your content will also be used as ",[46,23466,23468],{"href":23467},"\u002Fhandbook\u002Fmarketing\u002Fwebsite\u002F#meta-keywords","meta keywords"," for each article, alongside the ",[46,23471,23473],{"href":23472},"\u002Fhandbook\u002Fmarketing\u002Fwebsite#default-keywords","default keywords",[164,23475,23477],{"id":23476},"adding-images","Adding Images",[19,23479,23480,23481,23484],{},"Images can be added into the respective ",[542,23482,23483],{},"\u002Fblog\u002F\u003Cyear>\u002F\u003Cmonth>\u002Fimages"," folder.",[19,23486,23487],{},"The image can then be referenced in the markdown file like so:",[557,23489,23491],{"className":2398,"code":23490,"language":81,"meta":75,"style":75},"![Alt Text](.\u002Fimages\u002F\u003Cimage>.png){data-zoomable}\n\u003Cfigcaption>Caption Here\u003C\u002Ffigcaption>\n",[542,23492,23493,23508],{"__ignoreMap":75},[2403,23494,23495,23497,23500,23502,23505],{"class":2405,"line":2406},[2403,23496,2646],{"class":2446},[2403,23498,23499],{"class":2616},"Alt Text",[2403,23501,2619],{"class":2446},[2403,23503,23504],{"class":2622},".\u002Fimages\u002F\u003Cimage>.png",[2403,23506,23507],{"class":2446},"){data-zoomable}\n",[2403,23509,23510],{"class":2405,"line":76},[2403,23511,23512],{"class":2446},"\u003Cfigcaption>Caption Here\u003C\u002Ffigcaption>\n",[144,23514,23515,23520,23525,23531],{},[147,23516,23517,23519],{},[542,23518,23499],{}," is the text that will be displayed if the image fails to load.",[147,23521,23522,23524],{},[542,23523,23504],{}," is the path to the image.",[147,23526,23527,23530],{},[542,23528,23529],{},"{data-zoomable}"," is an optional attribute that allows the image to be zoomed in when clicked. It is recommended to use this as users can often explore images in more detail.",[147,23532,23533,23536],{},[542,23534,23535],{},"\u003Cfigcaption>Caption Here\u003C\u002Ffigcaption>"," is an optional caption that will be displayed below the image. It is recommended to use these, as it makes the article easier to read.",[164,23538,23540],{"id":23539},"more-tag","More tag",[19,23542,1375,23543,23546],{},[542,23544,23545],{},"\u003C!--more-->"," tag is used to define the text shown in the blog index from each article.",[164,23548,23550],{"id":23549},"example-blog-index-item-based-on-the-header-above","Example blog index item based on the header above",[19,23552,23553],{},[1724,23554],{"alt":23555,"className":23556,"src":23560},"Example of how the headers are shown on the blog index",[23557,23558,23559],"border","border-gray-200","max-w-[400px]","\u002Fhandbook\u002Fmarketing\u002Fimages\u002Fblog-index.png",[164,23562,23564],{"id":23563},"example-blogs-based-on-the-header-above","Example blogs based on the header above",[19,23566,23567],{},[1724,23568],{"alt":23569,"className":23570,"src":23572},"Example of how the headers are shown on blogs",[23557,23558,23571],"max-w-[600px]","\u002Fhandbook\u002Fmarketing\u002Fimages\u002Fblog-article.png",[164,23574,23576],{"id":23575},"rendering-node-red-flows","Rendering Node-RED Flows",[19,23578,23579],{},"The blog uses a flow renderer to make it easier for users to understand what the\nflow looks like and how to use them. Furthermore it automatically provides a\ndownload and copy button too for users to use what they've learned.",[19,23581,23582,23583,23586],{},"To render a flow you'll need to export it to JSON in Node-RED and paste it in a\n",[542,23584,23585],{},"renderFlow"," shortcode:",[19,23588,23589],{},"{% raw %}",[557,23591,23594],{"className":23592,"code":23593,"language":562},[560],"{% renderFlow %}\n\u003CflowJSONHere>\n{% endrenderFlow %}\n",[542,23595,23593],{"__ignoreMap":75},[19,23597,23598],{},"{% endraw %}",[164,23600,23602],{"id":23601},"writing-content","Writing content",[19,23604,23605,23606],{},"FlowFuse blog posts are written in markdown. To learn how to style content and\nhave a nice markup for your content, please read the ",[46,23607,23608],{"href":11810},"markdown guide",[164,23610,22902],{"id":23611},"scheduling-a-blog-post",[19,23613,23614,23615,23617],{},"By setting a future date, the blog post will be automatically scheduled for publication on the specified date. This allows contributors to plan ahead and coordinate blog posts with events or marketing strategies. The post will be published at the next deploy after the ",[542,23616,20212],{}," is set, a daily deploy is done at noon GMT.",[19,23619,23620],{},"Feel free to request reviews and merge your blog post when it's ready, even if the publication date is set in the future. This provides the flexibility to collaborate, make revisions, and ensure the content is polished well before it goes live.\nThe post, to be published in the future, will be rendered when developing locally and on deployment previews.",[19,23622,23623],{},"By utilizing the scheduling feature, we can maintain a consistent and organized publishing schedule without the need for last-minute adjustments.",[2796,23625,23626],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .svl0z, html code.shiki .svl0z{--shiki-default:#032F62;--shiki-default-text-decoration:underline;--shiki-dark:#DBEDFF;--shiki-dark-text-decoration:underline}html pre.shiki code .s2frl, html code.shiki .s2frl{--shiki-default:#24292E;--shiki-default-text-decoration:underline;--shiki-dark:#E1E4E8;--shiki-dark-text-decoration:underline}",{"title":75,"searchDepth":76,"depth":76,"links":23628},[23629,23630,23634],{"id":22482,"depth":76,"text":22483},{"id":22595,"depth":76,"text":22596,"children":23631},[23632,23633],{"id":22605,"depth":605,"text":22606},{"id":22733,"depth":605,"text":22734},{"id":22749,"depth":76,"text":22750,"children":23635},[23636,23637,23638,23639,23640,23641,23642,23643,23644,23645,23646,23647,23648,23649,23650,23651],{"id":14103,"depth":605,"text":253},{"id":22874,"depth":605,"text":22875},{"id":13786,"depth":605,"text":15152},{"id":20212,"depth":605,"text":22890},{"id":20230,"depth":605,"text":22906},{"id":9115,"depth":605,"text":9202},{"id":18409,"depth":605,"text":18410},{"id":23195,"depth":605,"text":23196},{"id":14132,"depth":605,"text":23405},{"id":23476,"depth":605,"text":23477},{"id":23539,"depth":605,"text":23540},{"id":23549,"depth":605,"text":23550},{"id":23563,"depth":605,"text":23564},{"id":23575,"depth":605,"text":23576},{"id":23601,"depth":605,"text":23602},{"id":23611,"depth":605,"text":22902},{},"\u002Fhandbook\u002Fmarketing\u002Fblog",{"title":22474,"description":75},"handbook\u002Fmarketing\u002Fblog","bUi3aJ-UgXWtQCzL7kWyYGrbdrLc5CZrMKsznT6GBt4",{"id":23658,"title":23659,"body":23660,"description":75,"extension":81,"meta":24081,"navGroup":83,"navOrder":83,"navTitle":24082,"navigation":84,"path":24083,"seo":24084,"stem":24085,"__hash__":24086},"handbook\u002Fhandbook\u002Fmarketing\u002Fbrand-voice.md","Brand Personality, Tone of Voice & Character",{"type":7,"value":23661,"toc":24065},[23662,23665,23669,23672,23678,23682,23685,23748,23755,23758,23762,23765,23770,23809,23816,23837,23841,23844,23851,23854,23858,23861,23899,23903,23906,23912,23916,23921,23926,23931,23936,23940,23943,23946,23950,23953,23967,23970,23981,23985,23990,23994,23997,24000,24011,24015,24020,24027,24031,24034,24036,24047,24051,24056,24062],[10,23663,23659],{"id":23664},"brand-personality-tone-of-voice-character",[14,23666,23668],{"id":23667},"why-this-matters","Why This Matters",[19,23670,23671],{},"The brand personality and tone of voice reflect who we are as a company — not just in what we say, but in how we say it. Defining these attributes ensures that all internal and external communication is aligned, consistent, and memorable. This foundation helps FlowFuse build trust, foster engagement, and stand apart in the industrial and low-code software landscape.",[19,23673,23674,23675,23677],{},"Our tone of voice should also embody the ",[46,23676,6733],{"href":2844}," — from customer empathy and constructive candor to iterative improvement and delivering results.",[14,23679,23681],{"id":23680},"brand-personality","Brand Personality",[19,23683,23684],{},"Our brand should feel like a trusted partner for industrial engineers and developers navigating digital transformation. We stand for empowerment, transparency, and progressive thinking — always grounded in practical reality.",[910,23686,23687,23696],{},[913,23688,23689],{},[916,23690,23691,23694],{},[919,23692,23693],{},"Trait",[919,23695,15152],{},[930,23697,23698,23708,23718,23728,23738],{},[916,23699,23700,23705],{},[935,23701,23702],{},[423,23703,23704],{},"Reliable",[935,23706,23707],{},"Like a well-designed system, we are dependable and consistent.",[916,23709,23710,23715],{},[935,23711,23712],{},[423,23713,23714],{},"Approachable & Close",[935,23716,23717],{},"We speak plainly and treat people with empathy, respect, and inclusion — no matter their role or experience level.",[916,23719,23720,23725],{},[935,23721,23722],{},[423,23723,23724],{},"Innovative",[935,23726,23727],{},"We are always moving forward and encouraging users to do the same.",[916,23729,23730,23735],{},[935,23731,23732],{},[423,23733,23734],{},"Pragmatic",[935,23736,23737],{},"Grounded in real-world use cases and needs, not buzzwords.",[916,23739,23740,23745],{},[935,23741,23742],{},[423,23743,23744],{},"Community-minded",[935,23746,23747],{},"We believe in open-source, shared learning, and mutual success.",[19,23749,23750,23751,23754],{},"| ",[423,23752,23753],{},"Candid & Constructive"," | We give honest, helpful feedback and appreciate the same in return. |",[19,23756,23757],{},"We are the engineer’s enabler — technical enough to be respected, accessible enough to be adopted.",[14,23759,23761],{"id":23760},"tone-of-voice","Tone of Voice",[19,23763,23764],{},"FlowFuse communicates in a tone that reflects clarity, competence, and collaboration. Our audience is highly technical, but often stretched for time or new to low-code development. We want to make their experience as easy and empowering as possible.",[19,23766,23767],{},[423,23768,23769],{},"Our tone is:",[144,23771,23772,23779,23785,23791,23797,23803],{},[147,23773,23774,23775,23778],{},"✅ ",[423,23776,23777],{},"Straightforward"," — No jargon for the sake of it. We explain things simply and get to the point.",[147,23780,23774,23781,23784],{},[423,23782,23783],{},"Helpful"," — We speak like an expert colleague who wants to make your work easier.",[147,23786,23774,23787,23790],{},[423,23788,23789],{},"Confident but humble"," — We know our value, but never talk down to users.",[147,23792,23774,23793,23796],{},[423,23794,23795],{},"Optimistic"," — Our tone encourages innovation, without hype.",[147,23798,23774,23799,23802],{},[423,23800,23801],{},"Precise"," — Industrial solutions require accuracy. We avoid fluff.",[147,23804,23774,23805,23808],{},[423,23806,23807],{},"Close and human"," — We sound like real people. Friendly and respectful, never robotic or distant.",[19,23810,23811],{},[423,23812,23813,23814,10656],{},"Our tone is ",[2562,23815,6916],{},[144,23817,23818,23825,23828,23831,23834],{},[147,23819,23820,23821,23824],{},"❌ ",[423,23822,23823],{},"Overly"," casual (\"Yo, wazzup!\") or humorous",[147,23826,23827],{},"❌ Marketing-speak (“synergy”, “transformative”, “next-gen”)",[147,23829,23830],{},"❌ Boastful or arrogant",[147,23832,23833],{},"❌ Ambiguous or vague",[147,23835,23836],{},"❌ Cold or corporate",[14,23838,23840],{"id":23839},"the-flowfuse-character","The FlowFuse “Character”",[19,23842,23843],{},"If FlowFuse were a person, it would be:",[2672,23845,23846],{},[19,23847,23848],{},[423,23849,23850],{},"A smart, hands-on engineer who builds practical solutions — and helps others do the same. They understand complex systems, but don’t overcomplicate. They’re calm under pressure, solution-focused, and enjoy solving real problems with real tools. They’re approachable, transparent, and always willing to lend a hand.",[19,23852,23853],{},"This “character” comes through in everything we do: product design, documentation, social media, sales calls, webinars, support, and community interactions.",[14,23855,23857],{"id":23856},"how-to-apply-this","How to Apply This",[19,23859,23860],{},"Whether writing an email, blog post, tweet, UI message, or sales pitch:",[144,23862,23863,23869,23875,23881,23887,23893],{},[147,23864,23865,23868],{},[423,23866,23867],{},"Lead with clarity."," Avoid intros that bury the point. Say what matters, early.",[147,23870,23871,23874],{},[423,23872,23873],{},"Support with value."," Back up claims with real features, use cases, or customer wins.",[147,23876,23877,23880],{},[423,23878,23879],{},"Reflect empathy."," Know your audience’s context and pain points.",[147,23882,23883,23886],{},[423,23884,23885],{},"Use consistent terminology."," Refer to our features, solutions, and mission the same way across channels.",[147,23888,23889,23892],{},[423,23890,23891],{},"Avoid filler."," If a sentence doesn’t help communicate value, cut it.",[147,23894,23895,23898],{},[423,23896,23897],{},"Sound human."," Write like someone who’s been in the room — and understands.",[14,23900,23902],{"id":23901},"terminology-style-guidelines","Terminology & Style Guidelines",[164,23904,23905],{"id":23415},"Node-RED",[19,23907,23908,23909,23911],{},"Node-RED should always be written with a hyphen and this specific capitalization: ",[423,23910,23905],{},". Never \"node-red\", \"NodeRED\", or \"Node Red\". This applies everywhere where applicable, especially in external communications: documentation, blog posts, social media, and emails.",[14,23913,23915],{"id":23914},"examples-of-tone-in-action","Examples of Tone in Action",[19,23917,23918],{},[423,23919,23920],{},"✅ Aligned Example:",[2672,23922,23923],{},[19,23924,23925],{},"“Connect your PLCs, Raspberry Pis, and dashboards — all in one place. FlowFuse makes it easy to build, deploy, and monitor Node-RED applications at scale.”",[19,23927,23928],{},[423,23929,23930],{},"❌ Not Aligned Example:",[2672,23932,23933],{},[19,23934,23935],{},"“Unlock the power of cutting-edge automation with our revolutionary, industry-defining platform. The future of IIoT starts here!”",[14,23937,23939],{"id":23938},"context-matters-adapting-the-voice-not-the-values","Context Matters: Adapting the Voice, Not the Values",[19,23941,23942],{},"Just like people adjust how they speak depending on where they are, our brand voice should adapt depending on the context — without ever losing its core personality.",[19,23944,23945],{},"FlowFuse always sounds like the same person, but that person knows how to read the room.",[164,23947,23949],{"id":23948},"owned-channels-eg-newsletter-linkedin-blog","Owned channels (e.g. newsletter, LinkedIn, blog)",[19,23951,23952],{},"In these spaces, people follow us because they want to hear from us. It’s okay to be a little more promotional or curated. These are good places to:",[144,23954,23955,23958,23961,23964],{},[147,23956,23957],{},"Share product news, updates, and wins",[147,23959,23960],{},"Use slightly more polished or brand-focused language",[147,23962,23963],{},"Highlight what makes FlowFuse special",[147,23965,23966],{},"Speak on behalf of the company voice",[19,23968,23969],{},"Tone can be:",[144,23971,23972,23975,23978],{},[147,23973,23974],{},"Professional, but warm",[147,23976,23977],{},"Informative, confident",[147,23979,23980],{},"Occasionally light, if appropriate",[19,23982,23983],{},[423,23984,23256],{},[2672,23986,23987],{},[19,23988,23989],{},"FlowFuse 3.0 is live — and brings dashboarding for Node-RED to a whole new level. See what’s new and what it means for your team.",[164,23991,23993],{"id":23992},"participating-in-community-spaces-eg-node-red-forum-github-discord","Participating in community spaces (e.g. Node-RED forum, GitHub, Discord)",[19,23995,23996],{},"When FlowFuse team members engage from personal accounts, they bring their own voice — but still represent the values of the company.",[19,23998,23999],{},"Tone should be:",[144,24001,24002,24005,24008],{},[147,24003,24004],{},"Friendly, humble, and helpful",[147,24006,24007],{},"Empathetic and patient",[147,24009,24010],{},"Focused on offering value",[19,24012,24013],{},[423,24014,23256],{},[2672,24016,24017],{},[19,24018,24019],{},"Hey, good question! I’ve seen a similar issue when deploying on Docker — it might be worth checking your volume permissions. Let me know if that helps or if you want to try another approach.",[19,24021,24022,24023,549],{},"For broader principles on interacting with the community as a FlowFuse team member, see our ",[46,24024,24026],{"href":24025},"\u002Fhandbook\u002Fmarketing\u002Fcommunity\u002Fcommunity-guidelines.md","Community Guidelines",[164,24028,24030],{"id":24029},"commenting-on-third-party-content-eg-posts-by-others","Commenting on third-party content (e.g. posts by others)",[19,24032,24033],{},"Whether responding from our company profile or a personal one, the focus here should be adding value to the conversation. Less “selling”, more listening, supporting, and acknowledging.",[19,24035,23999],{},[144,24037,24038,24041,24044],{},[147,24039,24040],{},"Respectful and considered",[147,24042,24043],{},"Informed, but not promotional",[147,24045,24046],{},"Open to dialogue",[19,24048,24049],{},[423,24050,23256],{},[2672,24052,24053],{},[19,24054,24055],{},"This is a great point about deployment at scale. We've seen similar needs from our users — especially when managing mixed environments. Curious how you're handling OTA updates?",[19,24057,24058,24059,24061],{},"Our voice flexes with the context, but never breaks character.",[9379,24060],{},"\nWe stay approachable, helpful, and professional — everywhere we show up.",[19,24063,24064],{},"This section should evolve as our brand evolves. Keep it close when creating content or communicating with prospects. Consistency builds trust, and personality builds connection.",{"title":75,"searchDepth":76,"depth":76,"links":24066},[24067,24068,24069,24070,24071,24072,24075,24076],{"id":23667,"depth":76,"text":23668},{"id":23680,"depth":76,"text":23681},{"id":23760,"depth":76,"text":23761},{"id":23839,"depth":76,"text":23840},{"id":23856,"depth":76,"text":23857},{"id":23901,"depth":76,"text":23902,"children":24073},[24074],{"id":23415,"depth":605,"text":23905},{"id":23914,"depth":76,"text":23915},{"id":23938,"depth":76,"text":23939,"children":24077},[24078,24079,24080],{"id":23948,"depth":605,"text":23949},{"id":23992,"depth":605,"text":23993},{"id":24029,"depth":605,"text":24030},{},"Brand Voice","\u002Fhandbook\u002Fmarketing\u002Fbrand-voice",{"title":23659,"description":75},"handbook\u002Fmarketing\u002Fbrand-voice","kB4gWuJIhHCzQS9II12Jpt8v50xYuYWP_2nZWW_crhg",{"id":24088,"title":24026,"body":24089,"description":75,"extension":81,"meta":24124,"navGroup":83,"navOrder":83,"navTitle":24026,"navigation":84,"path":24125,"seo":24126,"stem":24127,"__hash__":24128},"handbook\u002Fhandbook\u002Fmarketing\u002Fcommunity\u002Fcommunity-guidelines.md",{"type":7,"value":24090,"toc":24118},[24091,24095,24098,24102,24111,24115],[14,24092,24094],{"id":24093},"node-red-is-flowfuse","Node-RED is FlowFuse",[19,24096,24097],{},"We strongly encourage the belief that the Node-RED and FlowFuse communities are the same. Whether you are a FlowFuse community member or an employee, you should treat both community members equally. Remember, the success of FlowFuse lies in the success of Node-RED.",[164,24099,24101],{"id":24100},"general-guidelines","General Guidelines",[19,24103,24104,24105,24110],{},"We recommend reading the ",[46,24106,24109],{"href":24107,"rel":24108},"https:\u002F\u002Fnodered.org\u002Fabout\u002Fconduct\u002F",[108],"Contributor Covenant Code of Conduct"," to help ensure that our community remains respectful, collaborative, and supportive. These principles are grounded in common sense and shared values. By adhering to them, we can create a welcoming environment for all members and foster a culture of mutual respect and growth.",[14,24112,24114],{"id":24113},"community-interactions","Community interactions.",[19,24116,24117],{},"As an employee of FlowFuse, when we interact with the OSS Node-RED community we must be mindful of our position. For example, when offering advice on the Node-RED forum or the Node-RED slack, the first answer we offer should be how a solution can be achieved using Node-RED. If a native Node-RED solution is not possible or the user would benefit from the advantages that FlowFuse offers, then, like any other person or company, we can offer FlowFuse as a potential solution.",{"title":75,"searchDepth":76,"depth":76,"links":24119},[24120,24123],{"id":24093,"depth":76,"text":24094,"children":24121},[24122],{"id":24100,"depth":605,"text":24101},{"id":24113,"depth":76,"text":24114},{},"\u002Fhandbook\u002Fmarketing\u002Fcommunity\u002Fcommunity-guidelines",{"description":75},"handbook\u002Fmarketing\u002Fcommunity\u002Fcommunity-guidelines","ivjelcNekE0a4SLoEfUzAegbqTl_yVWJwOxvo2ygSKU",{"id":24130,"title":24131,"body":24132,"description":75,"extension":81,"meta":24318,"navGroup":83,"navOrder":83,"navTitle":24319,"navigation":84,"path":24320,"seo":24321,"stem":24322,"__hash__":24323},"handbook\u002Fhandbook\u002Fmarketing\u002Fcommunity\u002Fforums-and-support.md","Forums And Support",{"type":7,"value":24133,"toc":24311},[24134,24138,24142,24145,24151,24155,24158,24190,24193,24202,24206,24209,24308],[14,24135,24137],{"id":24136},"flowfuse-support-and-forums","FlowFuse Support and Forums",[164,24139,24141],{"id":24140},"introduction","Introduction",[19,24143,24144],{},"We provide a comprehensive support and community platform for FlowFuse users, developers, and enthusiasts. Our forums and support resources are designed to empower you with the knowledge, assistance, and collaboration you need to make the most out of FlowFuse and Node-RED.",[19,24146,24147,24148,24150],{},"At FlowFuse, we believe in fostering a community that is knowledgeable, supportive, and inclusive. We encourage you to explore our ",[46,24149,24026],{"href":24125}," to understand how you can contribute positively to this dynamic ecosystem.",[164,24152,24154],{"id":24153},"forums","Forums",[19,24156,24157],{},"The FlowFuse forums are key places for discussions, problem-solving, and community support. To maintain a structured and detailed forum, community members should adhere to the following guidelines:",[144,24159,24160,24166,24172,24178,24184],{},[147,24161,24162,24165],{},[423,24163,24164],{},"Stay On Topic",": Keep your posts relevant to the discussion topic. If you have a new question or issue, start a new thread rather than diverting an existing one.",[147,24167,24168,24171],{},[423,24169,24170],{},"Use Clear Titles",": Make your thread titles clear and descriptive to help others understand the topic at a glance.",[147,24173,24174,24177],{},[423,24175,24176],{},"Provide Details",": When asking for help, provide as much detail as possible about your issue, including flows, error messages, and steps to reproduce the problem.",[147,24179,24180,24183],{},[423,24181,24182],{},"Search Before Posting",": Before starting a new thread, use the search functionality to see if your question has already been answered. This helps keep the forum organized and reduces duplicate posts.",[147,24185,24186,24189],{},[423,24187,24188],{},"Follow Up",": If you receive help, follow up to let others know if the solution worked or if you need further assistance. This feedback helps improve the community knowledge base.",[19,24191,24192],{},"You can access the forum here:",[144,24194,24195],{},[147,24196,24197],{},[46,24198,24201],{"href":24199,"rel":24200},"https:\u002F\u002Fdiscourse.nodered.org\u002Fc\u002Fvendors\u002Fflowfuse\u002F24\u002F",[108],"FlowFuse Forum",[164,24203,24205],{"id":24204},"other-support","Other Support",[19,24207,24208],{},"In addition to the forum, we also offer:",[144,24210,24211,24224,24237,24251,24265,24280,24294],{},[147,24212,24213,24215,24216],{},[423,24214,5355],{},": Extensive documentation is available on the FlowFuse websites. This should be your first stop for information on features, configuration, and troubleshooting.",[144,24217,24218],{},[147,24219,24220],{},[46,24221,24223],{"href":24222},"\u002Fdocs\u002F","FlowFuse Documentation",[147,24225,24226,24229,24230],{},[423,24227,24228],{},"Tutorials and Guides",": Detailed tutorials and guides to help you get started and master advanced topics.",[144,24231,24232],{},[147,24233,24234],{},[46,24235,24236],{"href":22664},"FlowFuse Tutorials and Guides",[147,24238,24239,24242,24243],{},[423,24240,24241],{},"Ebook",": The ultimate beginner guide to professional Node-RED.",[144,24244,24245],{},[147,24246,24247],{},[46,24248,24250],{"href":24249},"\u002Febooks\u002Fbeginner-guide-to-a-professional-nodered\u002F","The Ultimate Beginner Guide to a Professional Node-RED",[147,24252,24253,24256,24257],{},[423,24254,24255],{},"Webinars",": These are live webinars during which experts share their knowledge, provide updates on FlowFuse, and allow community members to ask questions directly.",[144,24258,24259],{},[147,24260,24261],{},[46,24262,24264],{"href":24263},"\u002Fhandbook\u002Fmarketing\u002Fwebinars","FlowFuse Webinars",[147,24266,24267,24270,24271],{},[423,24268,24269],{},"Community Discord",": This is a channel for users to discuss FlowFuse and Node-RED, share resources, and ask questions.",[144,24272,24273],{},[147,24274,24275],{},[46,24276,24279],{"href":24277,"rel":24278},"https:\u002F\u002Fdiscord.gg\u002F2RrvW8dkrF",[108],"Discord Channel",[147,24281,24282,24285,24286],{},[423,24283,24284],{},"Ticket Support and Instant Chat",": Personalized and real-time support through our help center.",[144,24287,24288],{},[147,24289,24290],{},[46,24291,24293],{"href":24292},"\u002Fsupport\u002F","FlowFuse Help Center",[147,24295,24296,24299,24300],{},[423,24297,24298],{},"GitHub Issues",": This is a platform for submitting issues for new features or bug reports. Provide detailed information to help our developers understand and address your issue.",[144,24301,24302],{},[147,24303,24304],{},[46,24305,24307],{"href":22081,"rel":24306},[108],"FlowFuse GitHub",[19,24309,24310],{},"Utilizing these forums and support resources allows you to effectively resolve issues, learn new skills, and contribute to the community's collective knowledge. Remember always to engage respectfully and constructively to maintain a positive and supportive environment for all members.",{"title":75,"searchDepth":76,"depth":76,"links":24312},[24313],{"id":24136,"depth":76,"text":24137,"children":24314},[24315,24316,24317],{"id":24140,"depth":605,"text":24141},{"id":24153,"depth":605,"text":24154},{"id":24204,"depth":605,"text":24205},{},"Forums and Support","\u002Fhandbook\u002Fmarketing\u002Fcommunity\u002Fforums-and-support",{"description":75},"handbook\u002Fmarketing\u002Fcommunity\u002Fforums-and-support","FiH9oi3zTg5_eOheRZQ4XCB04BASNkf-GwexrO6A0VA",{"id":24325,"title":24326,"body":24327,"description":24334,"extension":81,"meta":24357,"navGroup":83,"navOrder":83,"navTitle":24326,"navigation":84,"path":24358,"seo":24359,"stem":24360,"__hash__":24361},"handbook\u002Fhandbook\u002Fmarketing\u002Fcommunity\u002Findex.md","Community",{"type":7,"value":24328,"toc":24355},[24329,24332,24335],[10,24330,24326],{"id":24331},"community",[19,24333,24334],{},"We provide comprehensive details in this section of our handbook regarding our community interaction at FlowFuse. From addressing inquiries to assisting with problem-solving and more, it also encompasses information about initiatives for engaging with the community and addressing queries live.",[144,24336,24337,24341,24345,24351],{},[147,24338,24339],{},[46,24340,24026],{"href":24125},[147,24342,24343],{},[46,24344,24319],{"href":24320},[147,24346,24347],{},[46,24348,24350],{"href":24349},"\u002Fhandbook\u002Fmarketing\u002Fevents","Events",[147,24352,24353],{},[46,24354,24255],{"href":24263},{"title":75,"searchDepth":76,"depth":76,"links":24356},[],{},"\u002Fhandbook\u002Fmarketing\u002Fcommunity",{"title":24326,"description":24334},"handbook\u002Fmarketing\u002Fcommunity\u002Findex","FIG0xgyvs8tzss0GnxiTf9DPO2jjNi4I5Q47oe4YDx4",{"id":24363,"title":24364,"body":24365,"description":75,"extension":81,"meta":24717,"navGroup":83,"navOrder":83,"navTitle":24364,"navigation":84,"path":24718,"seo":24719,"stem":24720,"__hash__":24721},"handbook\u002Fhandbook\u002Fmarketing\u002Fcustomer-stories.md","Customer Stories",{"type":7,"value":24366,"toc":24703},[24367,24370,24374,24377,24510,24514,24517,24610,24612,24615,24618,24621,24623,24626,24628,24631,24633,24637,24640,24643,24647,24650,24653,24656,24659,24662,24666,24669,24673,24676,24680,24685,24689,24695,24697,24701],[10,24368,24364],{"id":24369},"customer-stories",[14,24371,24373],{"id":24372},"creating-a-story","Creating a story",[19,24375,24376],{},"A customer story is the same as a case study, these are helpful in illustrating how Node-RED and FlowFuse can be useful for our potential customers. The process would be as follows:",[504,24378,24379,24386,24395,24402,24407,24410,24419,24422,24425,24465,24488,24500,24503],{},[147,24380,24381,24382,549],{},"Raise an issue for the content in our private ",[46,24383,24385],{"href":7370,"rel":24384},[108],"GitHub repository",[147,24387,24388,24389,24394],{},"Add it to the ",[46,24390,24393],{"href":24391,"rel":24392},"https:\u002F\u002Fgithub.com\u002Forgs\u002FFlowFuse\u002Fprojects\u002F21",[108],"Content Calendar Project"," and schedule it.",[147,24396,24397,24398,549],{},"If you want to work on the content immediately please triage the issue into our ",[46,24399,24401],{"href":19556,"rel":24400},[108],"development board",[147,24403,24404,24405,549],{},"Conduct an interview call with the customer using Google Meet to record and transcribe the conversation. Record interviews using Fathom as outlined in the ",[46,24406,720],{"href":719},[147,24408,24409],{},"Consider that the readers of the story may have little knowledge of the industry discussed in the story. Try to explain industry specific terms or avoid using language which excludes any potential FlowFuse customer from understanding altogether.",[147,24411,24412,24413,24418],{},"Create the draft customer story in a Google Doc. The document should be stored in the ",[46,24414,24417],{"href":24415,"rel":24416},"https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Ffolders\u002F13A3UWjXdC7a13CVi1nQOMHvTb8MCLd-K?usp=drive_link",[108],"Marketing -> Case Study"," folder. Everyone at FlowFuse should be given access to comment on the document.  Add a link to the document in the GitHub issue.",[147,24420,24421],{},"Leave a comment on the doc for each reviewer to request a review.",[147,24423,24424],{},"As a document reviewer, you should leave red-line edits in the document or add comments to the document.",[147,24426,24427,24428],{},"When the final version of the story is done, follow these steps to create a PDF version:\n",[144,24429,24430,24439,24442,24449,24457],{},[147,24431,24432,24433,24438],{},"Go to our ",[46,24434,24437],{"href":24435,"rel":24436},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fu\u002F0\u002F?ftv=1&folder=1QXCso0HQPbShrB5_8N0n_sDnIlluUaaI&tgif=d",[108],"Template gallery"," and select 'FlowFuse Customer Story - Template'.",[147,24440,24441],{},"Change the file name by replacing 'Template' with the customer's name.",[147,24443,24444,24445,24448],{},"Replace all the template information with your story. Ensure you paste using ",[542,24446,24447],{},"ctrl + shift + v"," to maintain the template format.",[147,24450,24451,24452,23484],{},"Confirm that the file is saved in the ",[46,24453,24456],{"href":24454,"rel":24455},"https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Ffolders\u002F1SbZ7ISJaYcxcJ_00Y_CwdY5gd9_uOTHP?usp=drive_link",[108],"Google Docs version",[147,24458,24459,24460,549],{},"Once ready, you can either print or download it as a PDF and then place it in the ",[46,24461,24464],{"href":24462,"rel":24463},"https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Ffolders\u002F1QXCso0HQPbShrB5_8N0n_sDnIlluUaaI?usp=drive_link",[108],"PDFs folder",[147,24466,24467,24468],{},"Create a download form in HubSpot specifically for the PDF you just created:\n",[144,24469,24470,24473,24476,24479,24482,24485],{},[147,24471,24472],{},"Upload the PDF file to HubSpot under 'Files and Templates' and copy the public URL.",[147,24474,24475],{},"In HubSpot, navigate to Marketing -> Lead Capture -> Forms, then 'Create Form' or clone an existing case study download form.",[147,24477,24478],{},"The form should include fields for first name, last name, email, and company (not mandatory).",[147,24480,24481],{},"Set the PDF URL as the action after submission, under 'Redirect to another page.'",[147,24483,24484],{},"Update and publish the form.",[147,24486,24487],{},"Copy the form ID from the script generated when you click on publish.",[147,24489,24490,24491,24494,24495,549],{},"Create a new branch of the website repository. Follow our standard ",[46,24492,24493],{"href":20061},"development processes",". Google Docs has an ",[46,24496,24499],{"href":24497,"rel":24498},"https:\u002F\u002Fworkspace.google.com\u002Fmarketplace\u002Fapp\u002Fdocs_to_markdown\u002F700168918607?hl=en&pann=docs_addon_widget",[108],"extension to convert the reviewed draft document to markdown",[147,24501,24502],{},"Add the HubSpot formId to your story's front matter, so anyone can download the PDF version of the case study.",[147,24504,24505,24506,24509],{},"It is OK for you to merge your own PR to main without review where the content is urgent or has been reviewed outside of Git but where it is practical to follow the\n",[46,24507,24508],{"href":20061},"standard process"," we encourage you to do so.",[14,24511,24513],{"id":24512},"customer-story-cms","Customer Story CMS",[19,24515,24516],{},"When creating a case study there are several headers which are used by the CMS to populate the story as well as the customer stories index page. e.g:",[557,24518,24520],{"className":22756,"code":24519,"language":9581,"meta":75,"style":75},"---\ntitle: World Meteorological Organization (WMO) Uses Node-RED to Modernize Sharing of Earth-System Data\nimage: \u002Fimages\u002Fstories\u002Fun-wmo.jpg\ndate: 2023-09-07\nlogo: \u002Fimages\u002Fstories\u002Flogos\u002Flogo_wmo.png\nhubspot:\n    formId: 37f86f46-62d1-4203-bce9-0318ce993710\nstory:\n    brand: WMO\n    url: https:\u002F\u002Fwmo.int\u002F\n    logo: \u002Fimages\u002Fstories\u002Flogos\u002Flogo_wmo.png\n    quote: Node-RED was the right platform to use to build the AntiLoop part of the Global Broker... Node-RED has proven to be a very reliable platform.\n    challenge: Modernize global weather data sharing protocol to be meet higher demand for real-time data\n    solution: Using the Node-RED platform to address these challenges.\n    results:\n        - Node-RED's MQTT nodes used to implement AntiLoop part of the Global Broker\n        - Pilot system handling 45,000 message \u002F 15 minutes; Production system will handle 30,000\u002Fminute \n---\n",[542,24521,24522,24526,24531,24536,24541,24546,24551,24556,24561,24566,24571,24576,24581,24586,24591,24596,24601,24606],{"__ignoreMap":75},[2403,24523,24524],{"class":2405,"line":2406},[2403,24525,14098],{},[2403,24527,24528],{"class":2405,"line":76},[2403,24529,24530],{},"title: World Meteorological Organization (WMO) Uses Node-RED to Modernize Sharing of Earth-System Data\n",[2403,24532,24533],{"class":2405,"line":605},[2403,24534,24535],{},"image: \u002Fimages\u002Fstories\u002Fun-wmo.jpg\n",[2403,24537,24538],{"class":2405,"line":2423},[2403,24539,24540],{},"date: 2023-09-07\n",[2403,24542,24543],{"class":2405,"line":2465},[2403,24544,24545],{},"logo: \u002Fimages\u002Fstories\u002Flogos\u002Flogo_wmo.png\n",[2403,24547,24548],{"class":2405,"line":2471},[2403,24549,24550],{},"hubspot:\n",[2403,24552,24553],{"class":2405,"line":3086},[2403,24554,24555],{},"    formId: 37f86f46-62d1-4203-bce9-0318ce993710\n",[2403,24557,24558],{"class":2405,"line":3092},[2403,24559,24560],{},"story:\n",[2403,24562,24563],{"class":2405,"line":3098},[2403,24564,24565],{},"    brand: WMO\n",[2403,24567,24568],{"class":2405,"line":3104},[2403,24569,24570],{},"    url: https:\u002F\u002Fwmo.int\u002F\n",[2403,24572,24573],{"class":2405,"line":3109},[2403,24574,24575],{},"    logo: \u002Fimages\u002Fstories\u002Flogos\u002Flogo_wmo.png\n",[2403,24577,24578],{"class":2405,"line":3115},[2403,24579,24580],{},"    quote: Node-RED was the right platform to use to build the AntiLoop part of the Global Broker... Node-RED has proven to be a very reliable platform.\n",[2403,24582,24583],{"class":2405,"line":3121},[2403,24584,24585],{},"    challenge: Modernize global weather data sharing protocol to be meet higher demand for real-time data\n",[2403,24587,24588],{"class":2405,"line":3127},[2403,24589,24590],{},"    solution: Using the Node-RED platform to address these challenges.\n",[2403,24592,24593],{"class":2405,"line":3132},[2403,24594,24595],{},"    results:\n",[2403,24597,24598],{"class":2405,"line":3138},[2403,24599,24600],{},"        - Node-RED's MQTT nodes used to implement AntiLoop part of the Global Broker\n",[2403,24602,24603],{"class":2405,"line":3143},[2403,24604,24605],{},"        - Pilot system handling 45,000 message \u002F 15 minutes; Production system will handle 30,000\u002Fminute \n",[2403,24607,24608],{"class":2405,"line":3148},[2403,24609,14098],{},[164,24611,253],{"id":14103},[19,24613,24614],{},"The title of the story can be seen on both the customer stories index and the case study.",[164,24616,24617],{"id":14122},"Image",[19,24619,24620],{},"The story's image is visible on both the customer stories index and at the top of the case study, behind the title. Please note that this is a responsive image, and only a portion is displayed inside the case study. The recommended image type is photography.",[164,24622,22890],{"id":20212},[19,24624,24625],{},"The date is useful to order the stories in the customer stories index. The newest are shown first.",[164,24627,7524],{"id":7523},[19,24629,24630],{},"Image of the logo to be included in the customer stories index, on top of the image, ideally a png file with transparent background. This is an optional field, if it's covering an important part of the image or if the image already includes a logo, there's no need to add it.",[164,24632,21508],{"id":21507},[1019,24634,24636],{"id":24635},"formid","formId",[19,24638,24639],{},"Download form ID code provided by HubSpot.",[164,24641,24642],{"id":13568},"Story",[1019,24644,24646],{"id":24645},"brand","Brand",[19,24648,24649],{},"Name of the client, this is displayed in the customer stories index.",[1019,24651,24652],{"id":20752},"URL",[19,24654,24655],{},"URL address to the client's website. This is added to the logo in the case study.",[1019,24657,7524],{"id":24658},"logo-1",[19,24660,24661],{},"Image of the logo displayed inside the story, in the right section.",[1019,24663,24665],{"id":24664},"quote","Quote",[19,24667,24668],{},"This highlighted comment appears below the title in the case study.",[1019,24670,24672],{"id":24671},"challenge-solution-and-results","Challenge, solution and results",[19,24674,24675],{},"A short summary of the challenge they faced, the implemented solution and a list of results.",[164,24677,24679],{"id":24678},"example-customer-stories-index-item-based-on-the-header-above","Example customer stories index item based on the header above",[1724,24681],{"style":24682,"alt":24683,"src":24684},"max-width: 300px;","Example of how the headers are shown on the customer stories index",".\u002Fimages\u002Fstory-index.png",[164,24686,24688],{"id":24687},"example-customer-story-based-on-the-header-above","Example customer story based on the header above",[19,24690,24691],{},[1724,24692],{"alt":24693,"src":24694},"Example of how the headers are shown on case studies","\u002Fhandbook\u002Fmarketing\u002Fimages\u002Fstory-page.png",[164,24696,23602],{"id":23601},[19,24698,23605,24699],{},[46,24700,23608],{"href":11810},[2796,24702,3285],{},{"title":75,"searchDepth":76,"depth":76,"links":24704},[24705,24706],{"id":24372,"depth":76,"text":24373},{"id":24512,"depth":76,"text":24513,"children":24707},[24708,24709,24710,24711,24712,24713,24714,24715,24716],{"id":14103,"depth":605,"text":253},{"id":14122,"depth":605,"text":24617},{"id":20212,"depth":605,"text":22890},{"id":7523,"depth":605,"text":7524},{"id":21507,"depth":605,"text":21508},{"id":13568,"depth":605,"text":24642},{"id":24678,"depth":605,"text":24679},{"id":24687,"depth":605,"text":24688},{"id":23601,"depth":605,"text":23602},{},"\u002Fhandbook\u002Fmarketing\u002Fcustomer-stories",{"title":24364,"description":75},"handbook\u002Fmarketing\u002Fcustomer-stories","3-0iYxujEMMbxbtsD0Jv9PjC--jIvjVPrL5BHW0UgCc",{"id":24723,"title":24724,"body":24725,"description":24732,"extension":81,"meta":24775,"navGroup":83,"navOrder":83,"navTitle":24724,"navigation":84,"path":24776,"seo":24777,"stem":24778,"__hash__":24779},"handbook\u002Fhandbook\u002Fmarketing\u002Feducation.md","FlowFuse for Education",{"type":7,"value":24726,"toc":24772},[24727,24730,24733,24737,24744,24747],[10,24728,24724],{"id":24729},"flowfuse-for-education",[19,24731,24732],{},"The purpose of FlowFuse for Education is to support non-profit education by allowing educators to use FlowFuse Starter for free.",[14,24734,24736],{"id":24735},"approval-process","Approval Process",[19,24738,24739,24740,549],{},"Interested educators should complete ",[46,24741,24743],{"href":24742},"\u002Feducation","the request form",[19,24745,24746],{},"When receiving an educational license request, follow this process.",[504,24748,24749,24757,24764],{},[147,24750,24751,24752,24756],{},"Ensure that the contact has provided enough information to show that they really are using FlowFuse to teach not-for-profit courses. The paradigm of a legitimate application is an instructor or department head at an accredited university using FlowFuse to teach IIoT or similar. If the contact completed the form at ",[46,24753,24755],{"href":24754},"\u002Feducation\u002F","flowfuse.com\u002Feducation",", they should have already provided this information.",[147,24758,24759,24760],{},"Email the instructor or organizer the education coupon code. This file contains the code and email copy: ",[46,24761,832],{"href":24762,"rel":24763},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1HXmnGi5yxpd6yHFvfDAXhbKTq1UuWBuz4ifJQ0Dkk24\u002Fedit?tab=t.0",[108],[147,24765,24766,24767],{},"Log the recipient's information in this file: ",[46,24768,24771],{"href":24769,"rel":24770},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1nfvSGDC6Dw3aYxwSQnc50nn9L-nFyWaEAtFQugZ5fVI\u002Fedit?gid=0#gid=0",[108],"FlowFuse for Education log",{"title":75,"searchDepth":76,"depth":76,"links":24773},[24774],{"id":24735,"depth":76,"text":24736},{},"\u002Fhandbook\u002Fmarketing\u002Feducation",{"title":24724,"description":24732},"handbook\u002Fmarketing\u002Feducation","jNzGCpSV0-umOAq6IDfg0CEk-JovtK5_0RMT-jvm8Fc",{"id":24781,"title":24782,"body":24783,"description":24790,"extension":81,"meta":24923,"navGroup":83,"navOrder":83,"navTitle":83,"navigation":84,"path":24924,"seo":24925,"stem":24926,"__hash__":24927},"handbook\u002Fhandbook\u002Fmarketing\u002Femail.md","Marketing Email",{"type":7,"value":24784,"toc":24915},[24785,24788,24791,24794,24798,24802,24805,24808,24812,24815,24823,24827,24830,24833,24836,24842,24846,24849,24852,24863,24866,24869,24886,24889,24892],[10,24786,24782],{"id":24787},"marketing-email",[19,24789,24790],{},"Email marketing is an effective way to communicate with community members, potential customers, and existing customers. Marketing, sales, customer success, and support all have a role in sending emails.",[19,24792,24793],{},"The following guidelines are meant to document the roles and responsibilities of sending emails to ensure we have a consistent and well defined approach.",[14,24795,24797],{"id":24796},"types-of-email","Types of Email",[164,24799,24801],{"id":24800},"transactional-email-with-prospective-customers-and-current-customers","Transactional email with prospective customers and current customers",[19,24803,24804],{},"The sales team, customer success, and support team will be required to send email to communicate with specific potential customers and customers. These types of email are typically between the FlowFuse employee and an individual customer to accomplish a task or transaction. For instance, handling a support request or further a sales process.",[19,24806,24807],{},"These types of email should be stored in HubSpot using the HubSpot interface or the HubSpot Chrome plugin.\nThe goal should be that all transactional email is associated with the contact in Hubspot to have a history of the interaction.",[164,24809,24811],{"id":24810},"community-email","Community email",[19,24813,24814],{},"The marketing team is responsible for sending email to all community members, potential customers and customers that provide updates on FlowFuse and events organized by FlowFuse. Examples of these email include monthly newsletter, webinar promotion, product release, major company announcements, etc.",[19,24816,24817,24818,549],{},"These types of emails should be sent via HubSpot. To ensure consistency and continuity, the marketing team should be the only team sending community emails via HubSpot. Anyone can request an email to be sent by opening a ",[46,24819,24822],{"href":24820,"rel":24821},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fwebsite\u002Fissues",[108],"GitHub issue on the website repository",[164,24824,24826],{"id":24825},"flowfuse-cloud-user-emails","FlowFuse Cloud User emails",[19,24828,24829],{},"The marketing team, in collaboration with the customer success team, is responsible for defining and creating an email campaign to encourage the successful usage and adoption of FlowFuse Cloud.",[19,24831,24832],{},"These emails will be sent from HubSpot using data based on the user interaction with FlowFuse Cloud. A system has been put in place to query the FF Cloud database to create events that are added to HubSpot. HubSpot workflows will trigger the emails based on these events.",[19,24834,24835],{},"The expectation is that the marketing and customer success team will continuously test different types of email, and email content to improve the conversion rate of the trial period and adoption of FlowFuse Cloud.",[19,24837,24838,24839,549],{},"FlowFuse Cloud Trial emails should only be sent by the marketing team via HubSpot. Requesting changes to these emails is done by opening a\n",[46,24840,24822],{"href":24820,"rel":24841},[108],[164,24843,24845],{"id":24844},"essential-communications-with-customers-and-users","Essential communications with customers and users",[19,24847,24848],{},"HubSpot is designed to send only marketing emails. Under GDPR and similar laws, as well as best practices, marketing messages can be sent only to people who have explicitly consented to receive such messages. Such explicit consent is typically given by choosing to opt-in to marketing messages upon signing up for a product.",[19,24850,24851],{},"Sometimes users must receive information about a product regardless of whether they have explicitly consented to receive such messages. Some examples are:",[144,24853,24854,24857,24860],{},[147,24855,24856],{},"When a product’s functionality is changing",[147,24858,24859],{},"When action must be taken to continue using a service",[147,24861,24862],{},"To confirm that a user has performed a certain action (e.g. adding a user)",[19,24864,24865],{},"HubSpot is not equipped to send such messages. Some non-marketing emails are sent directly from the backend.",[19,24867,24868],{},"When we need to create and send a non-marketing email, follow these steps:",[504,24870,24871,24874,24877,24880,24883],{},[147,24872,24873],{},"Confirm that the message is not a marketing message. There is no hint of an attempt to get the customer to buy something.",[147,24875,24876],{},"Log into Brevo.com",[147,24878,24879],{},"Navigate to Contacts",[147,24881,24882],{},"Import a .csv file of the contacts you wish to reach by clicking Import Contacts",[147,24884,24885],{},"Assign the contacts to a list when prompted",[19,24887,24888],{},"You have now created a list of contacts that you can message.",[19,24890,24891],{},"To send your contacts a message, follow these steps:",[504,24893,24894,24897,24900,24903,24906,24909,24912],{},[147,24895,24896],{},"Choose Campaigns",[147,24898,24899],{},"Click Email",[147,24901,24902],{},"Click Create Campaign",[147,24904,24905],{},"Name your campaign",[147,24907,24908],{},"Confirm each of the details that follow and design your message.",[147,24910,24911],{},"Preview your message and send your preview to another FlowFuse employee for a second pair of eyes.",[147,24913,24914],{},"When you are satisfied with your message, choose Schedule to send your message immediately or at a designated time.",{"title":75,"searchDepth":76,"depth":76,"links":24916},[24917],{"id":24796,"depth":76,"text":24797,"children":24918},[24919,24920,24921,24922],{"id":24800,"depth":605,"text":24801},{"id":24810,"depth":605,"text":24811},{"id":24825,"depth":605,"text":24826},{"id":24844,"depth":605,"text":24845},{},"\u002Fhandbook\u002Fmarketing\u002Femail",{"title":24782,"description":24790},"handbook\u002Fmarketing\u002Femail","-XG-DAc9mYbr3AmuOkEnI17M2koG19r98i_4C5QP2y4",{"id":24929,"title":24350,"body":24930,"description":24937,"extension":81,"meta":25268,"navGroup":83,"navOrder":83,"navTitle":24350,"navigation":84,"path":24349,"seo":25269,"stem":25270,"__hash__":25271},"handbook\u002Fhandbook\u002Fmarketing\u002Fevents.md",{"type":7,"value":24931,"toc":25249},[24932,24935,24938,24942,24945,24965,24969,24972,24992,24995,24998,25009,25013,25016,25018,25022,25034,25038,25041,25052,25063,25067,25078,25082,25099,25105,25115,25119,25125,25131,25135,25140,25145,25151,25155,25169,25173,25190,25194,25203,25206,25209,25213,25216,25218,25222,25228,25234,25240],[10,24933,24350],{"id":24934},"events",[19,24936,24937],{},"Events and trade shows let us connect with the industry, showcase FlowFuse in action, gather feedback, and build relationships that online calls can't replicate. They require significant investment and coordinated team effort.",[14,24939,24941],{"id":24940},"event-strategy","Event Strategy",[19,24943,24944],{},"We treat trade shows as comprehensive marketing platforms with three goals:",[504,24946,24947,24953,24959],{},[147,24948,24949,24952],{},[423,24950,24951],{},"Thought Leadership"," — establish FlowFuse as an industry authority through scheduled talks, roundtables, and demos. Every booth team member should be able to deliver a consistent, well-crafted pitch.",[147,24954,24955,24958],{},[423,24956,24957],{},"Highly Qualified Leads"," — run targeted pre-event campaigns for our ICP, drive advance registrations, and enable meeting bookings before the event starts.",[147,24960,24961,24964],{},[423,24962,24963],{},"Sales and POC Opportunities"," — convert qualified leads into sales conversations and proof-of-concept engagements.",[164,24966,24968],{"id":24967},"partner-strategy","Partner Strategy",[19,24970,24971],{},"Partners can dilute our brand. If included, their participation must be structured:",[144,24973,24974,24980,24986],{},[147,24975,24976,24979],{},[423,24977,24978],{},"Cost model:"," Partners sponsor daily content featuring FlowFuse case studies, at no cost to us.",[147,24981,24982,24985],{},[423,24983,24984],{},"Content scope:"," Limited to case studies or roundtable participation.",[147,24987,24988,24991],{},[423,24989,24990],{},"Booth concept:"," FlowFuse-only stand with an amphitheater setup.",[164,24993,6854],{"id":24994},"kpis",[19,24996,24997],{},"Quality over quantity:",[504,24999,25000,25003,25006],{},[147,25001,25002],{},"Booth\u002Fevent registrations",[147,25004,25005],{},"Generated leads with phone numbers",[147,25007,25008],{},"Follow-up sales conversations",[164,25010,25012],{"id":25011},"booth-and-demo-principles","Booth and Demo Principles",[19,25014,25015],{},"The demo should be interactive and visual, creating immediate cause-and-effect moments (e.g., a flow-controlled coffee dispenser). Our narrative around the demo should connect a cause and value for the individual user - e.g. you want the best coffee possible, and the value of FlowFuse is getting there as efficiently as possible.",[3601,25017],{},[14,25019,25021],{"id":25020},"exhibitor-planning-timeline","Exhibitor Planning Timeline",[19,25023,25024,25025,25028,25029,549],{},"Planning should begin ",[423,25026,25027],{},"at least six months before the event",". Budget is set by the CEO and tracked in HubSpot Campaigns. All logistics (hotel details, travel times, team assignments) go in the relevant Drive folder under ",[46,25030,25033],{"href":25031,"rel":25032},"https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Ffolders\u002F1kfbJy6H3DXYlKDd0RZx-psK7ghDmN4BI",[108],"Fairs",[164,25035,25037],{"id":25036},"team","Team",[19,25039,25040],{},"The CEO and CTO propose the on-site team. For a 4–5 person team, aim for:",[144,25042,25043,25046,25049],{},[147,25044,25045],{},"Two sales or customer success reps",[147,25047,25048],{},"One technical member for demo setup and teardown",[147,25050,25051],{},"One additional member for support or learning",[19,25053,25054,25055,25058,25059,25062],{},"Create a Slack channel named ",[542,25056,25057],{},"#proj-[event-name]-[year]"," (e.g. ",[542,25060,25061],{},"#proj-hannover-25",") for all event comms.",[164,25064,25066],{"id":25065},"six-months-out","Six Months Out",[144,25068,25069,25072,25075],{},[147,25070,25071],{},"Confirm team availability",[147,25073,25074],{},"Book accommodation (near the venue, breakfast included if possible)",[147,25076,25077],{},"Most team members arrive the day before the event; the demo lead arrives two days early and leaves one day after",[164,25079,25081],{"id":25080},"four-months-out","Four Months Out",[19,25083,25084,25087,25088,25093,25094,25098],{},[423,25085,25086],{},"Logistics:"," Begin booth vendor search (get at least three quotes). Share the ",[46,25089,25092],{"href":25090,"rel":25091},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1I2IBOe3gO4B0KEmAUglFWP1aKDMqLsUdzWPFTvbMwQk\u002Fedit?usp=sharing",[108],"vendor list",". Prefer vendors near the venue. Handle invoices per the ",[46,25095,25097],{"href":25096},"\u002Fhandbook\u002Foperations\u002Fvendors\u002F","vendor handbook",". Order booth services (electricity, wi-fi, leads app) as early as possible.",[19,25100,25101,25104],{},[423,25102,25103],{},"Demo:"," The demo owner - typically either a domain expert or a marketing leader - leads demo planning and shares specs with the booth vendor by this deadline.",[19,25106,25107,25110,25111,25114],{},[423,25108,25109],{},"Marketing:"," Create a landing page under ",[542,25112,25113],{},"\u002Fevents\u002F"," with: what's being showcased, a video, a contact form, free pass links (if available), booth location, giveaways, contests, and special events. Begin posting on social media once a week. Research attendee and exhibitor lists and share with sales for outreach.",[164,25116,25118],{"id":25117},"three-months-out","Three Months Out",[19,25120,25121,25124],{},[423,25122,25123],{},"Marketing\u002FSales:"," Define booth messaging with sales and marketing. Use this to brief design on taglines, artwork, and handout content.",[19,25126,25127,25130],{},[423,25128,25129],{},"Design:"," Following the vendor's specs and the confirmed messaging, produce booth artwork.",[164,25132,25134],{"id":25133},"two-months-out","Two Months Out",[19,25136,25137,25139],{},[423,25138,25086],{}," Order giveaways and marketing materials (flyers, business cards, branded attire). Typical vendors: Vistaprint, Stickermule. Confirm whether delivery to venue or hotel is possible; otherwise coordinate with the nearest team member. Create the booth schedule.",[19,25141,25142,25144],{},[423,25143,25109],{}," Led with marketing content designed to generate booth interest and attract in-person conversation. Define the leads strategy with sales, defining success metrics, the general approach, and a long-term follow-up plan.",[19,25146,25147,25150],{},[423,25148,25149],{},"Team:"," Plan and book travel based on the booth schedule.",[164,25152,25154],{"id":25153},"one-month-out","One Month Out",[144,25156,25157,25160,25163,25166],{},[147,25158,25159],{},"Prepare a social media content plan covering pre-event, live, and post-event content",[147,25161,25162],{},"Assign a DRI for on-site content creation",[147,25164,25165],{},"Finalize and deliver all print materials to production",[147,25167,25168],{},"Update the video loop for booth screens (logos, taglines, upcoming events)",[164,25170,25172],{"id":25171},"two-weeks-out","Two Weeks Out",[144,25174,25175,25178,25181,25184,25187],{},[147,25176,25177],{},"Event owner creates the retrospective document and sets the structure for note taking at event",[147,25179,25180],{},"Hold a team briefing and distribute the event checklist",[147,25182,25183],{},"Sales sends personal (non-newsletter) emails to contacts who redeemed free tickets, inviting them to book meetings",[147,25185,25186],{},"Each rep does outbound to target accounts; goal is meetings booked before the event",[147,25188,25189],{},"Team members practice and record their pitch; share to the Slack channel",[164,25191,25193],{"id":25192},"during-the-event","During the Event",[19,25195,25196,25197,25202],{},"The team follows the booth schedule, leads strategy, and booth messaging. Professional etiquette applies — see ",[46,25198,25201],{"href":25199,"rel":25200},"https:\u002F\u002Fwww.esntradeshow.com\u002Fdos-and-donts-of-trade-show-exhibiting\u002F",[108],"ESN's dos and don'ts"," for reference.",[19,25204,25205],{},"The on-site team must include at least one marketing team member to own content capture and lead follow-up alignment.",[19,25207,25208],{},"As ideas, issues, or concerns come up, make sure you document immediately in the retrospective document. Ideas are ephemeral and will vanish into thin air if you don't write them down, so write them down.",[164,25210,25212],{"id":25211},"after-the-event","After the Event",[19,25214,25215],{},"Sales and marketing follow up with leads per the pre-defined strategy. Hold the retrospective the week after.",[3601,25217],{},[14,25219,25221],{"id":25220},"attending-as-a-visitor","Attending as a Visitor",[19,25223,25224,25227],{},[423,25225,25226],{},"Prepare before you go."," Review the exhibitor list, note who you want to visit, and order your stops by booth location to avoid unnecessary backtracking. Bring business cards.",[19,25229,25230,25233],{},[423,25231,25232],{},"At each stand:"," Know who you want to talk to and what you want from the conversation. Keep your phone in your pocket and give the person your full attention.",[19,25235,25236,25239],{},[423,25237,25238],{},"Exchange cards:"," When you hand one out, ask for one in return.",[19,25241,25242,25245,25246,549],{},[423,25243,25244],{},"After the event:"," Follow up with every contact you met. Thank them for the conversation, offer to answer any outstanding questions, and consider adding them to ",[46,25247,21508],{"href":25248},"\u002Fhandbook\u002Fsales\u002Fhubspot\u002F",{"title":75,"searchDepth":76,"depth":76,"links":25250},[25251,25256,25267],{"id":24940,"depth":76,"text":24941,"children":25252},[25253,25254,25255],{"id":24967,"depth":605,"text":24968},{"id":24994,"depth":605,"text":6854},{"id":25011,"depth":605,"text":25012},{"id":25020,"depth":76,"text":25021,"children":25257},[25258,25259,25260,25261,25262,25263,25264,25265,25266],{"id":25036,"depth":605,"text":25037},{"id":25065,"depth":605,"text":25066},{"id":25080,"depth":605,"text":25081},{"id":25117,"depth":605,"text":25118},{"id":25133,"depth":605,"text":25134},{"id":25153,"depth":605,"text":25154},{"id":25171,"depth":605,"text":25172},{"id":25192,"depth":605,"text":25193},{"id":25211,"depth":605,"text":25212},{"id":25220,"depth":76,"text":25221},{},{"title":24350,"description":24937},"handbook\u002Fmarketing\u002Fevents","Aoi0adjUtg-HJBLxO20ruktrC1bd_XfYxTNIXKGiEWM",{"id":25273,"title":25274,"body":25275,"description":75,"extension":81,"meta":25588,"navGroup":83,"navOrder":83,"navTitle":25589,"navigation":84,"path":25590,"seo":25591,"stem":25592,"__hash__":25593},"handbook\u002Fhandbook\u002Fmarketing\u002Fhow-we-work.md","How the marketing team works at FlowFuse",{"type":7,"value":25276,"toc":25578},[25277,25280,25284,25287,25298,25302,25305,25309,25312,25315,25318,25322,25325,25351,25354,25358,25360,25363,25367,25380,25384,25387,25391,25425,25429,25455,25459,25485,25489,25515,25519,25545,25549,25552,25569],[10,25278,25274],{"id":25279},"how-the-marketing-team-works-at-flowfuse",[14,25281,25283],{"id":25282},"what-to-work-on","What to work on",[19,25285,25286],{},"Due to the broad range of functions in the marketing functions at FlowFuse,\nthere's a large degree of freedom what to pick up, and when to pick it up.",[19,25288,25289,25290,25292,25293,549],{},"To keep the company updated and remove the need for lots of status reporting\nduring meetings each individual is responsible for keeping ",[2562,25291,9562],{}," tasks one works\non that take more than two hours in the ",[46,25294,25297],{"href":25295,"rel":25296},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fmarketing\u002Fissues",[108],"marketing issue tracker",[14,25299,25301],{"id":25300},"scheduling-and-planning","Scheduling and Planning",[19,25303,25304],{},"The marketing team creates tasks, stories, and epics just like our engineering\nteam. The CEO currently does planning in 1:1s with each individual\ncontributor.",[14,25306,25308],{"id":25307},"team-performance-and-collaboration","Team Performance and Collaboration",[19,25310,25311],{},"The marketing team holds a weekly meeting focused on performance review and KPIs. These sessions emphasize each team member’s needs and provide visibility into ongoing work, ensuring that individual contributions are recognized even in a fast-paced environment. They also serve as a space to identify where teammates can support one another when workloads become challenging.",[19,25313,25314],{},"Additionally, the Product Marketing Manager and the CEO host a monthly meeting to review overall departmental performance based on HubSpot dashboards and other ad hoc reports.",[19,25316,25317],{},"When required, the marketing team also leverages external vendors to maintain quality and momentum. Engaging vendors can be especially valuable when additional resources are needed to meet deadlines, sustain output levels, or enhance the team’s effectiveness with CEO approval.",[14,25319,25321],{"id":25320},"requesting-marketing-support","Requesting Marketing support",[19,25323,25324],{},"If you would like to see the Marketing team create and publish content as a demo, blog post, or social media post, follow these steps:",[504,25326,25327,25337,25340,25343],{},[147,25328,25329,25330,25332,25333,549],{},"Create issues in the ",[542,25331,18234],{}," repo and put them in the Marketing Department Work Schedule project with 'No Status'. If your request is for a social post, ensure that it follows the structure outlined ",[46,25334,2011],{"href":25335,"rel":25336},"https:\u002F\u002Fflowfuse.com\u002Fhandbook\u002Fmarketing\u002Fsocial-media\u002F#requesting-a-social-post",[108],[147,25338,25339],{},"Discuss the issues with the Product Marketing Manager to ensure that expectations are in line with Marketing priorities and timelines.",[147,25341,25342],{},"Change the status of the issue to 'Todo', add an assignee, and the suggested target date. This ensures the person responsible is notified and has the necessary info to plan their work effectively.",[147,25344,25345,25346,549],{},"Add these items to the ",[46,25347,25350],{"href":25348,"rel":25349},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1YGaP62WBqtfYsYGSgp2HA9i6u29SFHkow8tYzQwC_uU\u002Fedit?usp=sharing",[108],"Content Planner spreadsheet",[19,25352,25353],{},"The Product Marketing Manager will validate timelines and deliverables.",[14,25355,25357],{"id":25356},"monthly-marketing-performance-tracking","Monthly Marketing Performance Tracking",[164,25359,2167],{"id":2166},[19,25361,25362],{},"Every first Thursday of the month, FlowFuse's CEO and product marketing manager conduct a monthly performance review to track progress, optimize campaigns, and ensure alignment with our marketing plan objectives. This systematic approach enables data-driven decision-making and continuous improvement of our marketing efforts.\nThe monthly marketing performance review is conducted through a structured two-part assessment combining automated dashboard metrics with manual campaign and channel analysis.",[239,25364,25366],{"id":25365},"part-1-dashboard-metrics-hubspot-dynamic-dashboard","Part 1: Dashboard Metrics (HubSpot Dynamic Dashboard)",[19,25368,25369,25370,25375,25376],{},"We utilize our ",[46,25371,25374],{"href":25372,"rel":25373},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Freports-dashboard\u002F26586079\u002Fview\u002F105576103",[108],"HubSpot dashboard"," to track ",[46,25377,25379],{"href":25378},"\u002Fhandbook\u002Fmarketing\u002F#marketing-kpi","core marketing performance indicators",[239,25381,25383],{"id":25382},"part-2-manual-performance-analysis","Part 2: Manual Performance Analysis",[19,25385,25386],{},"The second component involves a detailed manual analysis across multiple marketing channels and activities in a Spreadsheet:",[1019,25388,25390],{"id":25389},"paid-campaign-performance","Paid Campaign Performance",[144,25392,25393,25399,25405],{},[147,25394,25395,25398],{},[423,25396,25397],{},"Campaign-by-campaign analysis",": Detailed review of each active paid campaign's performance",[147,25400,25401,25404],{},[423,25402,25403],{},"ROI assessment",": Evaluation of campaign return on investment and cost-effectiveness",[147,25406,25407,25410,25411],{},[423,25408,25409],{},"Resource allocation decisions",": Data-driven recommendations on whether to:\n",[144,25412,25413,25416,25419,25422],{},[147,25414,25415],{},"Continue campaigns as-is",[147,25417,25418],{},"Pause underperforming campaigns",[147,25420,25421],{},"Increase budget allocation for high-performing campaigns",[147,25423,25424],{},"Optimize targeting or creative elements",[1019,25426,25428],{"id":25427},"community-and-social-media-evolution","Community and Social Media Evolution",[144,25430,25431,25437,25443,25449],{},[147,25432,25433,25436],{},[423,25434,25435],{},"Growth metrics",": Follower count, engagement rates, and community expansion",[147,25438,25439,25442],{},[423,25440,25441],{},"Content performance",": Analysis of post reach, engagement, and conversion",[147,25444,25445,25448],{},[423,25446,25447],{},"Platform-specific insights",": Performance breakdown across different social channels",[147,25450,25451,25454],{},[423,25452,25453],{},"Community health",": Assessment of community engagement quality and sentiment",[1019,25456,25458],{"id":25457},"content-performance-tracking","Content Performance Tracking",[144,25460,25461,25467,25473,25479],{},[147,25462,25463,25466],{},[423,25464,25465],{},"Content calendar adherence",": Progress against planned content creation and publication",[147,25468,25469,25472],{},[423,25470,25471],{},"Cross-channel analysis",": Performance measurement across all content distribution channels",[147,25474,25475,25478],{},[423,25476,25477],{},"Reach and engagement metrics",": Individual post performance and audience response",[147,25480,25481,25484],{},[423,25482,25483],{},"Content type effectiveness",": Analysis of which content formats drive best results",[1019,25486,25488],{"id":25487},"seo-performance-monitoring","SEO Performance Monitoring",[144,25490,25491,25497,25503,25509],{},[147,25492,25493,25496],{},[423,25494,25495],{},"Monthly SEO evolution",": Tracking organic search performance trends",[147,25498,25499,25502],{},[423,25500,25501],{},"Keyword ranking changes",": Monitoring target keyword position movements",[147,25504,25505,25508],{},[423,25506,25507],{},"Technical SEO health",": Assessment of site performance and technical issues",[147,25510,25511,25514],{},[423,25512,25513],{},"Actionable insights",": Identification of specific optimization opportunities",[1019,25516,25518],{"id":25517},"budget-management","Budget Management",[144,25520,25521,25527,25533,25539],{},[147,25522,25523,25526],{},[423,25524,25525],{},"Spend tracking",": Monthly expenditure against approved marketing budget",[147,25528,25529,25532],{},[423,25530,25531],{},"Budget allocation efficiency",": Analysis of spend distribution across channels and campaigns",[147,25534,25535,25538],{},[423,25536,25537],{},"Variance analysis",": Identification and explanation of budget deviations",[147,25540,25541,25544],{},[423,25542,25543],{},"Future planning",": Budget reallocation recommendations based on performance data",[164,25546,25548],{"id":25547},"success-metrics","Success Metrics",[19,25550,25551],{},"The effectiveness of our monthly tracking process is measured by:",[144,25553,25554,25557,25560,25563,25566],{},[147,25555,25556],{},"Consistent month-over-month improvement in key metrics",[147,25558,25559],{},"Timely identification and resolution of performance issues",[147,25561,25562],{},"Successful optimization of underperforming campaigns",[147,25564,25565],{},"Adherence to budget targets and efficient resource allocation",[147,25567,25568],{},"Achievement of quarterly and annual marketing plan objectives",[19,25570,25571,25572,25577],{},"This approach ensures our marketing efforts remain aligned with our business objectives set up in our ",[46,25573,25576],{"href":25574,"rel":25575},"https:\u002F\u002Fflowfuse.com\u002Fhandbook\u002Fcompany\u002Fstrategy\u002F#growth-strategy",[108],"Growth Strategy"," while maintaining the agility to adapt to changing market conditions and performance insights.",{"title":75,"searchDepth":76,"depth":76,"links":25579},[25580,25581,25582,25583,25584],{"id":25282,"depth":76,"text":25283},{"id":25300,"depth":76,"text":25301},{"id":25307,"depth":76,"text":25308},{"id":25320,"depth":76,"text":25321},{"id":25356,"depth":76,"text":25357,"children":25585},[25586,25587],{"id":2166,"depth":605,"text":2167},{"id":25547,"depth":605,"text":25548},{},"How we work","\u002Fhandbook\u002Fmarketing\u002Fhow-we-work",{"title":25274,"description":75},"handbook\u002Fmarketing\u002Fhow-we-work","zQNXEmbphBMlRuCMr9bnAbAvTGmT5KScWjnSvZfWtXI",{"id":25595,"title":25596,"body":25597,"description":75,"extension":81,"meta":25852,"navGroup":25596,"navOrder":83,"navTitle":21080,"navigation":84,"path":25853,"seo":25854,"stem":25855,"__hash__":25856},"handbook\u002Fhandbook\u002Fmarketing\u002Findex.md","Marketing department",{"type":7,"value":25598,"toc":25844},[25599,25602,25606,25609,25630,25639,25643,25646,25669,25672,25674,25735,25739,25747,25751],[10,25600,25596],{"id":25601},"marketing-department",[14,25603,25605],{"id":25604},"what-we-do","What we do",[19,25607,25608],{},"We're the team that promotes our company and product of FlowFuse to the core audience\nof FlowFuse. This includes:",[504,25610,25611,25614,25617,25620,25627],{},[147,25612,25613],{},"Generating brand awareness.",[147,25615,25616],{},"Publishing high-quality content such as blog posts, video, and infographics.",[147,25618,25619],{},"Engaging with the Node-RED and nascent FlowFuse communities",[147,25621,25622,25623],{},"Event planning, such as ",[46,25624,25626],{"href":25625},"\u002Fhandbook\u002Fmarketing\u002Fevents\u002F","trade shows",[147,25628,25629],{},"Growth hacking; always be innovating when finding the audience and engaging with\nthem in a cost effective way.",[19,25631,25632,25633,25638],{},"The ultimate goal for the department is to ",[46,25634,25637],{"href":25635,"rel":25636},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Freports-list\u002F26586079\u002F198880430\u002F",[108],"generate sales pipeline","\nfor the sales team.\nThe monthly budget of the department including headcount and program budget should be equal to 50-60% of monthly pipeline generated.",[164,25640,25642],{"id":25641},"marketing-kpi","Marketing KPI",[19,25644,25645],{},"Our North Star metric is pipeline generated, the metric is supported by key input metrics that we track and measure:",[144,25647,25648,25655,25662],{},[147,25649,25650],{},[46,25651,25654],{"href":25652,"rel":25653},"https:\u002F\u002Fproduct-metrics.flowfuse.cloud\u002Fdashboard\u002Fproduct",[108],"FFC trial signups",[147,25656,25657],{},[46,25658,25661],{"href":25659,"rel":25660},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Fsubmissions\u002F26586079\u002Fform\u002F734455e5-4cda-4329-97da-07e40cda791c\u002Fperformance\u002F",[108],"Contact Sales form completions",[147,25663,25664],{},[46,25665,25668],{"href":25666,"rel":25667},"https:\u002F\u002Feu.posthog.com\u002Fproject\u002F2209\u002Finsights\u002FPXeb0YSF",[108],"Unique website visitors",[19,25670,25671],{},"Each of these metrics is reported on weekly during our Marketing Team Meeting to ensure we're tracking progress toward our North Star.",[14,25673,25037],{"id":25036},[910,25675,25676,25685],{},[913,25677,25678],{},[916,25679,25680,25682],{},[919,25681,5814],{},[919,25683,25684],{},"Contributors",[930,25686,25687,25703,25719],{},[916,25688,25689,25692],{},[935,25690,25691],{},"Marketing Manager, Product",[935,25693,25694,1755,25698],{},[46,25695,25697],{"href":25696},"\u002Fabout#pablo-filomeno","Pablo Filomeno",[46,25699,25702],{"href":25700,"rel":25701},"https:\u002F\u002Fgithub.com\u002FPabloFilomeno83",[108],"@PabloFilomeno83",[916,25704,25705,25708],{},[935,25706,25707],{},"Marketing Manager, Website & Social Media",[935,25709,25710,1755,25714],{},[46,25711,25713],{"href":25712},"\u002Fabout#yndira-escobar","Yndira Escobar",[46,25715,25718],{"href":25716,"rel":25717},"https:\u002F\u002Fgithub.com\u002FYndira-E",[108],"@Yndira-E",[916,25720,25721,25724],{},[935,25722,25723],{},"Technical Writer",[935,25725,25726,1755,25730],{},[46,25727,25729],{"href":25728},"\u002Fabout#sumit-shinde","Sumit Shinde",[46,25731,25734],{"href":25732,"rel":25733},"https:\u002F\u002Fgithub.com\u002Fsumitshinde-84",[108],"@sumitshinde-88",[14,25736,25738],{"id":25737},"contact-us","Contact us",[19,25740,25741,25742,549],{},"Questions can be asked in the ",[46,25743,25746],{"href":25744,"rel":25745},"https:\u002F\u002Fflowfuse.slack.com\u002Farchives\u002FC05GYH95NJZ",[108],"#dept-marketing",[14,25748,25750],{"id":25749},"further-reading","Further Reading",[910,25752,25753,25761],{},[913,25754,25755],{},[916,25756,25757,25759],{},[919,25758],{"align":921},[919,25760],{"align":921},[930,25762,25763,25772,25783,25793,25803,25812,25823,25833],{},[916,25764,25765,25769],{},[935,25766,25767],{"align":921},[46,25768,22474],{"href":23653},[935,25770,25771],{"align":921},"How to write new content for the FlowFuse Blog",[916,25773,25774,25780],{},[935,25775,25776],{"align":921},[46,25777,25779],{"href":25778},"\u002Fhandbook\u002Fmarketing\u002Fsocial-media","Social Media",[935,25781,25782],{"align":921},"Our online presence and how we engage with our community on various platforms",[916,25784,25785,25790],{},[935,25786,25787],{"align":921},[46,25788,25789],{"href":24349},"Trade shows",[935,25791,25792],{"align":921},"How to get the most out of visiting a trade fair",[916,25794,25795,25800],{},[935,25796,25797],{"align":921},[46,25798,7815],{"href":25799},"\u002Fhandbook\u002Fmarketing\u002Fwebsite",[935,25801,25802],{"align":921},"How to contribute to the FlowFuse marketing website",[916,25804,25805,25809],{},[935,25806,25807],{"align":921},[46,25808,24255],{"href":24263},[935,25810,25811],{"align":921},"Webinars are a key way FlowFuse interacts with the Node-RED community.",[916,25813,25814,25820],{},[935,25815,25816],{"align":921},[46,25817,25819],{"href":25818},"\u002Fhandbook\u002Fmarketing\u002Fmessaging","Messaging",[935,25821,25822],{"align":921},"Marketing messaging",[916,25824,25825,25830],{},[935,25826,25827],{"align":921},[46,25828,25829],{"href":24924},"Emails",[935,25831,25832],{"align":921},"How to engage with customers through email",[916,25834,25835,25841],{},[935,25836,25837],{"align":921},[46,25838,25840],{"href":25839},"\u002Fhandbook\u002Fmarketing\u002Flead-activation","Lead Activation",[935,25842,25843],{"align":921},"Definitions of inbound vs. outbound lead sources and MQL activation process",{"title":75,"searchDepth":76,"depth":76,"links":25845},[25846,25849,25850,25851],{"id":25604,"depth":76,"text":25605,"children":25847},[25848],{"id":25641,"depth":605,"text":25642},{"id":25036,"depth":76,"text":25037},{"id":25737,"depth":76,"text":25738},{"id":25749,"depth":76,"text":25750},{},"\u002Fhandbook\u002Fmarketing",{"title":25596,"description":75},"handbook\u002Fmarketing\u002Findex","v98XxWn609KTWlw16EfPvRlacHp9m7OAug_cculyurM",{"id":25858,"title":25840,"body":25859,"description":25866,"extension":81,"meta":26021,"navGroup":83,"navOrder":83,"navTitle":25840,"navigation":84,"path":25839,"seo":26022,"stem":26023,"__hash__":26024},"handbook\u002Fhandbook\u002Fmarketing\u002Flead-activation.md",{"type":7,"value":25860,"toc":26014},[25861,25864,25867,25871,25875,25878,25881,25898,25901,25905,25908,25912,25915,25918,25935,25938,25942,25945,25947,25964,25967,25971,25974,25976,25990,25993,25997,26007],[10,25862,25840],{"id":25863},"lead-activation",[19,25865,25866],{},"This page defines how FlowFuse categorizes and activates leads for the sales\nprocess. Understanding these definitions ensures alignment between marketing and\nsales on lead sources and qualification criteria.",[14,25868,25870],{"id":25869},"activation-categories","Activation Categories",[164,25872,25874],{"id":25873},"inbound-pull","Inbound (Pull)",[19,25876,25877],{},"Prospects who actively express interest in FlowFuse through self-service actions.",[19,25879,25880],{},"For example:",[144,25882,25883,25886,25889,25892,25895],{},[147,25884,25885],{},"Form submissions on the website",[147,25887,25888],{},"Opt-ins and hand raises",[147,25890,25891],{},"Contact sales requests",[147,25893,25894],{},"Gated content downloads",[147,25896,25897],{},"Webinar registrations",[19,25899,25900],{},"These leads have shown an interest and are ready for direct sales follow-up\nbased on their qualification level.",[164,25902,25904],{"id":25903},"outbound-push","Outbound (Push)",[19,25906,25907],{},"Prospects contacted proactively by FlowFuse without prior hand raising. Outbound\nleads are further categorized into three sub-types based on the strength of the signal:",[239,25909,25911],{"id":25910},"intent-outbound-push-based-on-behavior","Intent Outbound (Push Based on Behavior)",[19,25913,25914],{},"Prospects showing behavioral signals of interest without explicit hand raise.",[19,25916,25917],{},"For example",[144,25919,25920,25923,25926,25929,25932],{},[147,25921,25922],{},"Website visits tracked via intent tools (HubSpot Intent, Warmly)",[147,25924,25925],{},"Ad interaction data from platforms like ZenABM",[147,25927,25928],{},"Content engagement patterns",[147,25930,25931],{},"Product page visits",[147,25933,25934],{},"Pricing page views",[19,25936,25937],{},"Engage based on their intent signals, lead with relevant content or use cases\naligned to their browsing behavior.",[239,25939,25941],{"id":25940},"warm-outbound-push-based-on-relationship","Warm Outbound (Push Based on Relationship)",[19,25943,25944],{},"Prospects with existing relationship or prior interaction history.",[19,25946,25880],{},[144,25948,25949,25952,25955,25958,25961],{},[147,25950,25951],{},"Previous conversations or meetings",[147,25953,25954],{},"Referrals from existing customers or partners",[147,25956,25957],{},"Past event attendees",[147,25959,25960],{},"Former trial users who didn't convert",[147,25962,25963],{},"Contacts from partner organizations",[19,25965,25966],{},"Reference the existing relationship or prior interaction to re-engage the\nconversation.",[239,25968,25970],{"id":25969},"cold-outbound-push-based-on-fit","Cold Outbound (Push Based on Fit)",[19,25972,25973],{},"Prospects contacted solely based on contextual fit (being an ICP)\nwithout prior signal or relationship.",[19,25975,25880],{},[144,25977,25978,25981,25984,25987],{},[147,25979,25980],{},"No hand raise or opt-in",[147,25982,25983],{},"No behavioral intent signals",[147,25985,25986],{},"No prior relationship or interaction",[147,25988,25989],{},"Matches ICP criteria (industry, company size, role, etc.)",[19,25991,25992],{},"Lead with education and our value proposition, focusing on pain points common to\ntheir ICP segment.",[14,25994,25996],{"id":25995},"tracking-in-hubspot","Tracking in HubSpot",[19,25998,1375,25999,26002,26003,26006],{},[542,26000,26001],{},"Activation Outbound"," property in HubSpot is set to ",[542,26004,26005],{},"Yes"," when the first\nmeeting with a contact originated from any outbound category (Intent, Warm, or\nCold). This includes contacts who may have been in HubSpot through marketing\nactivities but were not yet nurtured to the point of a meeting.",[19,26008,26009,26010,549],{},"For more details on lifecycle stages and MQL requirements, see ",[46,26011,26013],{"href":26012},"\u002Fhandbook\u002Fsales\u002Fhubspot\u002F#lifecycle-stage","HubSpot Contact Management",{"title":75,"searchDepth":76,"depth":76,"links":26015},[26016,26020],{"id":25869,"depth":76,"text":25870,"children":26017},[26018,26019],{"id":25873,"depth":605,"text":25874},{"id":25903,"depth":605,"text":25904},{"id":25995,"depth":76,"text":25996},{},{"title":25840,"description":25866},"handbook\u002Fmarketing\u002Flead-activation","v2zFRpccme75e7bm6xrl6pyoffjAe-t_FAdvp_CB3kc",{"id":26026,"title":26027,"body":26028,"description":26035,"extension":81,"meta":26086,"navGroup":83,"navOrder":83,"navTitle":26027,"navigation":84,"path":26087,"seo":26088,"stem":26089,"__hash__":26090},"handbook\u002Fhandbook\u002Fmarketing\u002Fleads.md","Lead Generation",{"type":7,"value":26029,"toc":26083},[26030,26033,26036,26042,26046],[10,26031,26027],{"id":26032},"lead-generation",[19,26034,26035],{},"Lead generation helps expand FlowFuse's user base and drive revenue. By providing useful content, you can convert website visitors to leads for nurturing. Leads also provide a focused audience for marketing efforts, allowing for more effective communication and conversion strategies. Lead generation content includes whitepapers, ebooks, webinar slides, guides etc.",[19,26037,26038,26039,549],{},"For definitions of inbound vs. outbound lead sources and the MQL activation process, see ",[46,26040,25840],{"href":26041},"\u002Fhandbook\u002Fmarketing\u002Flead-activation\u002F",[14,26043,26045],{"id":26044},"setting-up","Setting up",[144,26047,26048,26051,26054,26057,26065,26068],{},[147,26049,26050],{},"Once the content has been finalized, create a PDF version and upload it to HubSpot (Library -> files).",[147,26052,26053],{},"Create a new Form to capture lead information such as name, email, company and title. Add a campaign where relevant. (You can clone an existing form). Set the form submission action to link directly to the PDF or to a thank you page (thank you pages help track conversions in ad campaigns).",[147,26055,26056],{},"Create a Thank you mail which includes the link to the PDf and request to \"contact us\" for further information\u002Fhelp.",[147,26058,26059,26060,549],{},"Create a workflow to send the email upon form submission and to add the lead to a topic interest group list (",[46,26061,26064],{"href":26062,"rel":26063},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Fworkflows\u002F26586079\u002Fplatform\u002Fflow\u002F1472559590\u002Fedit",[108],"Example",[147,26066,26067],{},"Add the Form ID to the relevant Website page.",[147,26069,26070,26071,26076,26077,26082],{},"Add the Form to the ",[46,26072,26075],{"href":26073,"rel":26074},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Fcontacts\u002F26586079\u002FobjectLists\u002F322\u002Ffilters",[108],"Content downloads list"," and create a report for Form submissions for the ",[46,26078,26081],{"href":26079,"rel":26080},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Freports-dashboard\u002F26586079\u002Fview\u002F107434040",[108],"content performance dashboard"," for tracking purposes.",{"title":75,"searchDepth":76,"depth":76,"links":26084},[26085],{"id":26044,"depth":76,"text":26045},{},"\u002Fhandbook\u002Fmarketing\u002Fleads",{"title":26027,"description":26035},"handbook\u002Fmarketing\u002Fleads","wXQV5bBN_h0jZEvtchoWZvR09YBUCNPuHWV3GRlGoOE",{"id":26092,"title":25819,"body":26093,"description":26102,"extension":81,"meta":26345,"navGroup":83,"navOrder":83,"navTitle":26346,"navigation":84,"path":25818,"seo":26347,"stem":26348,"__hash__":26349},"handbook\u002Fhandbook\u002Fmarketing\u002Fmessaging.md",{"type":7,"value":26094,"toc":26331},[26095,26100,26103,26106,26109,26114,26122,26126,26132,26143,26147,26150,26153,26156,26159,26162,26187,26194,26198,26201,26204,26236,26239,26242,26245,26249,26254,26258,26263,26267,26270,26274,26277,26280,26283,26286,26290,26293,26296],[10,26096,26097],{"id":75},[3234,26098],{"value":26099},"navTitle",[19,26101,26102],{},"Clear and consistent messaging serves as a cornerstone for our company to\nachieve growth and a bigger market presence. The messaging framework is\nessential for the company to communicate its value, purpose, and\ndifferentiation, to in turn effectively acquire and retain our customer base.",[19,26104,26105],{},"Consistency of messaging is important; with our growing company we’ve got\nlimited resources and thus it’s imperative to make a significant impact quickly.\nIf that fails, the company must learn quickly and iterate. When the messaging is\nconsistent the company can learn faster and have a structured approach to these\niterations.",[19,26107,26108],{},"This is an iterative process - as of May 2026, following work at the Athens Summit in Greece, this messaging will be evolving based on company feedback. When this messaging is finalised, this page will be updated.",[19,26110,26111,26112],{},"For guidance on how to express our brand in writing and communication style, see\n",[46,26113,23659],{"href":15466},[19,26115,26116,26117,26121],{},"Please also read the\n",[46,26118,26120],{"href":26119},"\u002Fhandbook\u002Fcompany\u002Fstrategy\u002F#flowfuse%27s-mission","Company Mission"," before\ndiving into the messaging.",[14,26123,26125],{"id":26124},"product-pillars-alignment","Product Pillars Alignment",[19,26127,26128,26129,10656],{},"Our core product messaging should reflect FlowFuse’s three ",[46,26130,26131],{"href":18888},"product pillars",[144,26133,26134,26137,26140],{},[147,26135,26136],{},"Operational Scaling; delivering consistency at scale instead of one-off “snowflake” projects",[147,26138,26139],{},"System Agility; extending and adapting rigid vendor systems without rip-and-replace",[147,26141,26142],{},"Event-Driven Data Bridge; acting as a lightweight, event-based bridge that intelligently\nroutes data between the shop floor and the top floor.",[14,26144,26146],{"id":26145},"audience","Audience",[19,26148,26149],{},"FlowFuse is a business to business (B2B) company in the industrial markets to\ninnovate with software through low-code development. The end user is a skilled\nworker, but not always skilled in automation through software.",[19,26151,26152],{},"FlowFuse often sells to IT teams that want to enable the OT teams to participate\nin digital solution building.",[19,26154,26155],{},"FlowFuse focusses on the engineer for messaging, this is due to the adoption of\nour software being grass-roots.",[164,26157,6779],{"id":26158},"ideal-customer-profile-icp",[19,26160,26161],{},"FlowFuse appeals to a broad range of customers, many of which do not fall into\nour 'ICP'. That's not to say FlowFuse shouldn't cater to this audience, but does",[504,26163,26164,26178,26181,26184],{},[147,26165,26166,26167],{},"Manufacturing or industrial company\n",[504,26168,26169,26172,26175],{},[147,26170,26171],{},"Tier 1: Automotive, Pharma, Renewable energy",[147,26173,26174],{},"Tier 2: Electronics, Semiconductor, Chemical, Oil & Gas",[147,26176,26177],{},"Tier 3: Food & Beverage, Mining, Water & Wastewater",[147,26179,26180],{},"Greater than $500 million in annual revenue. The need to have sufficiently\nlarge budgets to purchase FlowFuse.",[147,26182,26183],{},"Greater than 500 employees. The company needs to be large enough to have\ninternal IT and\u002For OT people on staff.",[147,26185,26186],{},"Established Digitalization strategy",[19,26188,26189,26190,549],{},"See also the description of\n",[46,26191,26193],{"href":26192},"\u002Fhandbook\u002Fcompany\u002Fstrategy\u002F#the-market","our market",[164,26195,26197],{"id":26196},"prospect-stages-node-red-awareness","Prospect Stages (Node-RED Awareness)",[19,26199,26200],{},"When considering messaging, sales conversations and how we communicate our value\nas a product and company, wan important factor for us at this stage is how aware\nof Node-RED the prospect\u002Fcustomer is.",[19,26202,26203],{},"We classify a customer into one of five \"stages\":",[144,26205,26206,26212,26218,26224,26230],{},[147,26207,26208,26211],{},[423,26209,26210],{},"Stage 0: Unaware of Node-RED"," No knowledge of Node-RED and what is does",[147,26213,26214,26217],{},[423,26215,26216],{},"Stage 1: Node-RED Discovery"," Aware of what Node-RED is, and may have\ndabbled with it a little, without using it in-depth",[147,26219,26220,26223],{},[423,26221,26222],{},"Stage 2: Value of Node-RED"," User has used Node-RED in their own personal\nprojects, or for professional proof-of-concepts",[147,26225,26226,26229],{},[423,26227,26228],{},"Stage 3: Node-RED in Production"," Person has built and deployed Node-RED in\na professional, production, environment",[147,26231,26232,26235],{},[423,26233,26234],{},"Stage 4: Node-RED at Scale"," User has over 5 x Node-RED instances running in\na production environment",[19,26237,26238],{},"Independent of the stage a customer is at, we need to ensure we have consistent\nmessaging around the value of FlowFuse, but be aware of other value (e.g. the\npure value of Node-RED) which can still be factored into the conversation.",[14,26240,25819],{"id":26241},"messaging",[19,26243,26244],{},"FlowFuse is the open-source Industrial Application Platform.",[164,26246,26248],{"id":26247},"tagline","Tagline",[19,26250,26251],{},[3234,26252],{"value":26253},"site.messaging.tagLine",[164,26255,26257],{"id":26256},"flowfuse-in-one-sentence-under-150-characters","FlowFuse in one sentence - Under 150 characters",[19,26259,26260],{},[3234,26261],{"value":26262},"site.messaging.subtitle",[164,26264,26266],{"id":26265},"about-flowfuse-short-form","About FlowFuse - Short form",[19,26268,26269],{},"FlowFuse is the enterprise platform that bridges the gap between physical assets and enterprise IT, delivering consistency at scale instead of one-off project \"snowflakes.\" Powered by Node-RED, teams unify real-time data through workflows, AI agents, and industrial applications, extending rigid vendor systems with a low-code agility layer that adapts without rip-and-replace. FlowFuse orchestrates lightweight, event-based data flows between the shop floor and the top floor only when real-world events occur, giving organizations the confidence to innovate and unlock new value in industrial automation.",[14,26271,26273],{"id":26272},"flowfuse-in-depth","FlowFuse in-depth",[19,26275,26276],{},"FlowFuse is the industrial platform built for speed, intelligence, and operational\nconfidence—enabling organizations to orchestrate their most critical applications, data,\nand automation at scale with consistency rather than one-off project “snowflakes.” Founded\nin 2021 by Nick O’Leary, the visionary behind Node-RED, FlowFuse takes the best of low-code\nintegration and supercharges it with enterprise governance, robust security, and built-in AI.",[19,26278,26279],{},"FlowFuse’s platform puts advanced automation and artificial intelligence at the heart of\nindustrial innovation—empowering teams to connect any machine or system, unify diverse data\nstreams, and deploy automated logic and visualizations in record time. By acting as a low-code\nagility layer on top of existing MES, SCADA, and other vendor systems, FlowFuse turns rigid\nsoftware into a flexible business asset that can be extended and adapted without rip-and-replace.",[19,26281,26282],{},"With our AI-driven FlowFuse Expert, domain experts and engineers can transform, structure, and\nanalyze industrial data—simply and intuitively—accelerating solution development beyond traditional\napproaches. Security and reliability are never compromised: from audit trails and access controls to\nblueprint-driven deployments and version automation, FlowFuse is engineered for mission-critical,\nproduction environments. Whether you choose cloud, self-hosted, or hybrid, FlowFuse gives you complete\ncontrol while driving the agility you need to lead the market.",[19,26284,26285],{},"By blending trusted open-source roots with relentless product innovation and a clear focus on tangible\noutcomes, FlowFuse becomes a lightweight, event-based bridge between the shop floor and the top\nfloor—triggering data movement, transformation, and storage only when real-world events occur, and\navoiding the “dump everything to the cloud” cost trap. This makes FlowFuse the competitive advantage\nfor industrial teams ready to deliver results faster, more securely, and smarter than ever before.",[14,26287,26289],{"id":26288},"selection-criteria-our-messaging-commandments","Selection Criteria: Our messaging commandments",[19,26291,26292],{},"This captures how we believe an ICP team is thinking about how to choose their next generation software platform for digitalizing their industrial process. This captures the following questions and our answers.",[19,26294,26295],{},"These are the FlowFuse Messaging Commandments.\nEvery message that comes out from the team has to stick to one or many of these commandments. Otherwise it is wrong, because it’s not really helping sales.",[504,26297,26298,26312,26323],{},[147,26299,26300,26301,549,26304],{},"Connect all your machines and assets in my industrial process to make it ",[2562,26302,26303],{},"fully observable",[144,26305,26306,26309],{},[147,26307,26308],{},"FlowFuse can be extended with over 5,000 plug-ins for collecting data from any machine, protocol, ERP, MES, or other services.",[147,26310,26311],{},"FlowFuse enables scalable agent deployment to unify data from any source or protocol across the industrial edge.",[147,26313,26314,26315],{},"Convert all data across any protocol so separate systems work as a cohesive unit.",[144,26316,26317,26320],{},[147,26318,26319],{},"FlowFuse unifies separate systems and industrial protocols on a single, low-code platform.",[147,26321,26322],{},"Accelerated by an AI assistant, FlowFuse makes it faster than ever to build and deploy logic for real-time data transport between any source and destination.",[147,26324,26325,26326],{},"Easy tag and store data collected in any data platform",[144,26327,26328],{},[147,26329,26330],{},"Transform raw data into a structured and unified information model with our AI-assisted low-code tools. Simply describe the data transformation you need in plain English, and our platform will help generate the necessary logic, from SQL queries to JavaScript functions.",{"title":75,"searchDepth":76,"depth":76,"links":26332},[26333,26334,26338,26343,26344],{"id":26124,"depth":76,"text":26125},{"id":26145,"depth":76,"text":26146,"children":26335},[26336,26337],{"id":26158,"depth":605,"text":6779},{"id":26196,"depth":605,"text":26197},{"id":26241,"depth":76,"text":25819,"children":26339},[26340,26341,26342],{"id":26247,"depth":605,"text":26248},{"id":26256,"depth":605,"text":26257},{"id":26265,"depth":605,"text":26266},{"id":26272,"depth":76,"text":26273},{"id":26288,"depth":76,"text":26289},{},"Company Messaging",{"description":26102},"handbook\u002Fmarketing\u002Fmessaging","nmeRe8Hm4zcYuP3uGGmTf3vHEfVw63Y_DvtRxk99beA",{"id":26351,"title":26352,"body":26353,"description":26360,"extension":81,"meta":27108,"navGroup":83,"navOrder":83,"navTitle":26352,"navigation":84,"path":27109,"seo":27110,"stem":27111,"__hash__":27112},"handbook\u002Fhandbook\u002Fmarketing\u002Fprograms.md","Marketing Programs",{"type":7,"value":26354,"toc":27094},[26355,26358,26361,26365,26368,26406,26410,26413,26459,26463,26466,26509,26513,26516,26536,26540,26546,26549,26578,26581,26598,26601,26605,26608,26619,26625,26631,26637,26643,26649,26660,26665,26668,26671,26674,26691,26695,26701,26705,26709,26716,26719,26760,26764,26829,26833,26854,26860,26863,26876,26879,26882,26902,26905,26925,26929,26932,26935,26944,26947,26988,26993,26997,27000,27010,27017,27022,27053,27058,27089],[10,26356,26352],{"id":26357},"marketing-programs",[19,26359,26360],{},"Our marketing efforts are organized into several core programs. These are not\nrigid silos but interconnected strategic areas designed to support the entire\ncustomer journey, from initial awareness to long-term advocacy. Each program\nconsists of various ongoing activities and campaigns aimed at achieving specific\nbusiness goals.",[14,26362,26364],{"id":26363},"_1-demand-generation","1. Demand Generation",[19,26366,26367],{},"This area focuses on creating pipeline by attracting new prospects and capturing\nqualified leads.",[144,26369,26370,26380,26389,26398],{},[147,26371,26372,26375,26376,26379],{},[423,26373,26374],{},"Paid Advertising Campaigns",": We run targeted digital ad campaigns (e.g.,\nABM on LinkedIn, Google Ads) to reach specific audiences, drive traffic to our\nkey content, and generate MQLs (Marketing Qualified Leads). See ",[46,26377,26378],{"href":26041},"Lead\nActivation"," for definitions of inbound\nvs. outbound lead sources.",[147,26381,26382,26388],{},[423,26383,26384],{},[46,26385,26387],{"href":26386},"\u002Fhandbook\u002Fmarketing\u002Fleads\u002F","Gated Resources",": We create and promote\nin-depth content such as whitepapers, ebooks, and guides. This content is\ngated, serving as a key tool for capturing new marketing qualified leads.",[147,26390,26391,26397],{},[423,26392,26393],{},[46,26394,26396],{"href":26395},"\u002Fhandbook\u002Fmarketing\u002Fwebinars\u002F","Monthly Webinars",": We host regular\nwebinars to educate our audience, showcase our product, and generate new\nleads. They also serve as a valuable touchpoint for existing prospects and\ncustomers.",[147,26399,26400,26405],{},[423,26401,26402],{},[46,26403,26404],{"href":25625},"Trade Shows & Industry Events",": We\nparticipate in key industry events to build brand presence, network with\npotential customers and partners, and generate leads.",[14,26407,26409],{"id":26408},"_2-content-community-marketing","2. Content & Community Marketing",[19,26411,26412],{},"This area focuses on building our brand's authority and fostering a loyal\ncommunity through valuable content and engagement.",[144,26414,26415,26424,26433,26444,26450],{},[147,26416,26417,26423],{},[423,26418,26419],{},[46,26420,26422],{"href":26421},"\u002Fhandbook\u002Fmarketing\u002Fblog\u002F","Content Marketing (Blog)",": Our blog is the\nengine of our content strategy, focused on providing educational and\ninsightful articles to drive organic traffic, establish thought leadership,\nand support our other marketing initiatives.",[147,26425,26426,26432],{},[423,26427,26428],{},[46,26429,26431],{"href":26430},"\u002Fhandbook\u002Fmarketing\u002Femail\u002F#community-email","Monthly Newsletters",": We\nengage our community and customer base with regular email updates, sharing\nproduct news, valuable content, and upcoming events.",[147,26434,26435,26440,26441,549],{},[423,26436,26437],{},[46,26438,25779],{"href":26439},"\u002Fhandbook\u002Fmarketing\u002Fsocial-media\u002F",": We maintain an active\npresence on key social platforms to engage with our community, amplify our\ncontent, and build our ",[46,26442,26443],{"href":15466},"brand's voice",[147,26445,26446,26449],{},[423,26447,26448],{},"Podcast \"Industrial Visionaries\"",": Our podcast features conversations with\nindustry leaders to explore key trends, provide unique insights, and expand\nour brand's reach to new audiences.",[147,26451,26452,26458],{},[423,26453,26454],{},[46,26455,26457],{"href":26456},"\u002Fhandbook\u002Fmarketing\u002Fcommunity\u002F","Community Engagement & Sponsorships",":\nWe actively support and participate in the broader community, including\nsponsoring key events like the Node-RED conference, to strengthen our\nconnection with developers and users.",[14,26460,26462],{"id":26461},"_3-brand-product-marketing","3. Brand & Product Marketing",[19,26464,26465],{},"This area focuses on shaping our brand perception and effectively communicating\nthe value of our product.",[144,26467,26468,26476,26501],{},[147,26469,26470,26475],{},[423,26471,26472],{},[46,26473,7815],{"href":26474},"\u002Fhandbook\u002Fmarketing\u002Fwebsite\u002F",": While the website is a\nfoundational platform rather than a program, its continuous improvement,\ncontent management, and optimization are a core marketing responsibility. It\nis the central hub for our brand and all our digital activities.",[147,26477,26478,26481,26482],{},[423,26479,26480],{},"Product Evaluation (Trials & PoCs)",": We offer two primary paths for\ncustomers to evaluate FlowFuse, representing our joint Product-Led and\nSales-Led growth motions.\n",[144,26483,26484,26490],{},[147,26485,26486,26489],{},[423,26487,26488],{},"Self-Service Free Trial",": The cornerstone of our Product-Led Growth (PLG)\nstrategy is the FlowFuse Cloud free trial. This program is driven by\nMarketing to acquire new users and optimized by the Product team to deliver\nan excellent in-app experience.",[147,26491,26492,26495,26496,26500],{},[423,26493,26494],{},"Sales-Led Proof of Concept (PoC)",": For larger or more complex\ndeployments, prospective customers may engage in a structured Proof of\nConcept. This is a ",[46,26497,26499],{"href":26498},"\u002Fhandbook\u002Fsales\u002Fmeetings\u002Fpoc\u002F","sales-led process","\ndesigned to validate specific use cases. Marketing supports this motion by\nproviding relevant content and materials like customer stories and technical\ndocumentation.",[147,26502,26503,26508],{},[423,26504,26505],{},[46,26506,24364],{"href":26507},"\u002Fhandbook\u002Fmarketing\u002Fcustomer-stories\u002F",": This program\nfocuses on creating compelling case studies and stories that provide social\nproof, showcase real-world use cases, and demonstrate the value of FlowFuse to\nprospects.",[14,26510,26512],{"id":26511},"_4-customer-marketing-advocacy","4. Customer Marketing & Advocacy",[19,26514,26515],{},"This area focuses on empowering our existing customers to become advocates for\nour brand.",[144,26517,26518,26524],{},[147,26519,26520,26523],{},[423,26521,26522],{},"Voice of the Customer (Satisfaction Surveys)",": We systematically collect\nfeedback through in-product surveys, post-webinar forms, and documentation\nsections. This continuous feedback loop is crucial for improving our product\nand overall customer experience.",[147,26525,26526,26529,26530,26535],{},[423,26527,26528],{},"Customer Reviews Program",": We actively encourage satisfied customers to\nshare their experiences on platforms like\n",[46,26531,26534],{"href":26532,"rel":26533},"https:\u002F\u002Fwww.g2.com\u002Fproducts\u002Fflowfuse\u002Freviews",[108],"G2",". This program helps build\ntrust and social proof for new potential customers.",[14,26537,26539],{"id":26538},"_5-strategic-partnerships","5. Strategic Partnerships",[19,26541,26542,26543,549],{},"We engage in strategic partnerships to expand our reach, validate our solutions, and create co-marketing opportunities that align with ",[46,26544,26545],{"href":22286},"FlowFuse’s strategy",[19,26547,26548],{},"Strategic partnerships can take different forms:",[144,26550,26551,26562,26572],{},[147,26552,26553,26556,26557,26561],{},[423,26554,26555],{},"Technology and solution partners"," led by sales through the ",[46,26558,26560],{"href":26559},"\u002Fhandbook\u002Fsales\u002Fpartnerships\u002F","Partners Program",". This program focuses on building and nurturing relationships with technology partners and solution providers to expand our reach, enter new markets, and create co-marketing opportunities.",[147,26563,26564,26567,26568,549],{},[423,26565,26566],{},"Customers",", where joint marketing initiatives are occasionally included as part of a sales negotiation. These initiatives are aimed at demonstrating that FlowFuse provides a suited solution for our ",[46,26569,26571],{"href":26570},"\u002Fhandbook\u002Fmarketing\u002Fmessaging\u002F#ideal-customer-profile-(icp)","ICP",[147,26573,26574,26577],{},[423,26575,26576],{},"Influencers or vendors"," with whom we may collaborate for sponsored content to reach audiences that value their expertise on topics relevant to our ICP.",[19,26579,26580],{},"When evaluating co-marketing opportunities, we consider:",[144,26582,26583,26586,26589,26592,26595],{},[147,26584,26585],{},"Relevance: Alignment with FlowFuse’s editorial calendar, strategic themes, and target audience.",[147,26587,26588],{},"Value exchange: Clear deliverables such as published articles, videos, webinars, or social media posts, with measurable outcomes (reach, engagement, leads).",[147,26590,26591],{},"Ownership: The Product Marketing Manager leads assessment and planning of co-marketing initiatives, in collaboration with the Marketing team and Sales as needed.",[147,26593,26594],{},"Execution: DevRel validates externally created content to ensure quality, accuracy and consistency of deliverables.",[147,26596,26597],{},"Measurement: Success is measured through defined KPIs such as reach, engagement, and lead generation.",[19,26599,26600],{},"All inbound proposals for co-marketing or sponsored content must be shared with the Product Marketing Manager for assessment before any commitments are made.",[14,26602,26604],{"id":26603},"_6-new-marketing-campaigns-process","6. New Marketing Campaigns Process",[19,26606,26607],{},"Any team member can propose a new marketing campaign. This process ensures all\nproposals are evaluated consistently and that approved campaigns align with our\nstrategic objectives.",[19,26609,26610,26613,26614,10656],{},[423,26611,26612],{},"Required Elements for All Campaign Proposals"," Every campaign proposal must\ninclude the following 5 components that will complete using ",[46,26615,26618],{"href":26616,"rel":26617},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fmarketing\u002Fissues\u002Fnew?template=06-marketing-campaign.yaml",[108],"this GitHub issue template",[19,26620,26621,26624],{},[423,26622,26623],{},"a. Objective and Rationale"," Clearly define what you want to achieve with this\ncampaign Explain why this campaign is needed now Connect the proposal to current\nbusiness objectives or challenges",[19,26626,26627,26630],{},[423,26628,26629],{},"b. Target Audience"," Describe specifically who the campaign is targeting\nInclude relevant demographics, behaviors, or characteristics Explain why this\naudience is important to our business",[19,26632,26633,26636],{},[423,26634,26635],{},"c. Key Message and Value Proposition"," Articulate the main message we want to\ncommunicate Explain what benefit or value we're offering to the target audience\nDefine the proposed tone and communication style",[19,26638,26639,26642],{},[423,26640,26641],{},"d. Suggested Channels and Tactics"," Specify which marketing channels you\nrecommend using Suggest specific tactics (social media, email, events, content,\netc.) Justify why these channels are most appropriate for this campaign",[19,26644,26645,26648],{},[423,26646,26647],{},"e. Resources and Budget Estimate"," Provide an estimated budget (can be\napproximate) Identify what human resources would be needed Specify if external\ntools, services, or vendors are required",[19,26650,26651,26654,26655,549],{},[423,26652,26653],{},"f. Campaigns performance tracking"," All campaigns will be trackes using the ",[46,26656,26659],{"href":26657,"rel":26658},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Fmarketing\u002F26586079\u002Fcampaigns\u002Fviews\u002Fall",[108],"Campaigns feature on HubSpot (internal)",[19,26661,26662],{},[423,26663,26664],{},"Submission Process",[19,26666,26667],{},"Complete the proposal template with all required elements above. Then submit\nyour proposal to the marketing team via the department Slack channel.",[19,26669,26670],{},"The team will evaluate around each marketing team meeting for full review and\ndiscussion. You'll receive feedback and approval status. If approved, the\nmarketing team will work with you on implementation planning.",[19,26672,26673],{},"The marketing team will evaluate proposals based on:",[144,26675,26676,26679,26682,26685,26688],{},[147,26677,26678],{},"Alignment with company goals and brand strategy",[147,26680,26681],{},"Feasibility within current resources and timeline",[147,26683,26684],{},"Potential ROI and impact",[147,26686,26687],{},"Audience relevance and market opportunity",[147,26689,26690],{},"Integration with existing marketing initiatives",[164,26692,26694],{"id":26693},"new-marketing-campaign-template","New Marketing Campaign Template",[557,26696,26699],{"className":26697,"code":26698,"language":562},[560],"Campaign Name: [Proposed name]\n\nProposed by: [Your name and department]\n\nDate: [Submission date]\n\n1. Objective and Rationale\n[Your response here]\n\n2. Target Audience\n[Your response here]\n\n3. Key Message and Value Proposition\n[Your response here]\n\n4. Suggested Channels and Tactics\n[Your response here]\n\n5. Resources and Budget Estimate\n[Your response here]\n",[542,26700,26698],{"__ignoreMap":75},[14,26702,26704],{"id":26703},"_7-analytics-tag-management","7. Analytics & Tag Management",[164,26706,26708],{"id":26707},"adding-tags-in-google-tag-manager-gtm","Adding Tags in Google Tag Manager (GTM)",[19,26710,26711,26712,26715],{},"When creating or updating tags in GTM, always configure the ",[423,26713,26714],{},"Consent Settings"," for each tag before publishing. Without this, a tag may fire as soon as the page loads — before the user has had a chance to accept or decline cookies — which is a GDPR compliance issue.",[19,26717,26718],{},"Use this sequence every time you create or update a tag:",[504,26720,26721,26724,26736,26743,26754],{},[147,26722,26723],{},"Identify the tag category.",[147,26725,26726,26727,26732,26733,11585],{},"Configure ",[46,26728,26730],{"href":26729},"#required-consent-type-by-tag-category",[423,26731,26714],{}," in GTM (",[542,26734,26735],{},"Advanced Settings → Consent Settings",[147,26737,26738,26739,549],{},"Select the correct ",[46,26740,26742],{"href":26741},"#primary-trigger-selection","primary trigger type",[147,26744,26745,26746,1755,26750,26753],{},"Add the shared ",[46,26747,26749],{"href":26748},"#shared-consent-change-trigger-(ff-consent-update)","consent-change trigger",[542,26751,26752],{},"FF Consent Update"," where required.",[147,26755,26756,549],{},[46,26757,26759],{"href":26758},"#validation-in-tag-assistant-before-publishing","Validate in Tag Assistant before publishing",[239,26761,26763],{"id":26762},"required-consent-type-by-tag-category","Required consent type by tag category",[910,26765,26766,26776],{},[913,26767,26768],{},[916,26769,26770,26773],{},[919,26771,26772],{},"Tag category",[919,26774,26775],{},"Required consent type",[930,26777,26778,26788,26798,26808,26818],{},[916,26779,26780,26783],{},[935,26781,26782],{},"Analytics (e.g. Google Analytics, HubSpot, PostHog)",[935,26784,26785],{},[542,26786,26787],{},"analytics_storage",[916,26789,26790,26793],{},[935,26791,26792],{},"Advertising & remarketing (e.g. Google Tag AW (Google Ads base tag), LinkedIn InsightTag, Conversion Linker, Meta Pixel)",[935,26794,26795],{},[542,26796,26797],{},"ad_storage",[916,26799,26800,26803],{},[935,26801,26802],{},"Functional tools (non-essential UX features that do not perform analytics\u002Fadvertising tracking)",[935,26804,26805],{},[542,26806,26807],{},"functionality_storage",[916,26809,26810,26813],{},[935,26811,26812],{},"Personalization & A\u002FB testing (e.g. tools that remember user preferences or show tailored content)",[935,26814,26815],{},[542,26816,26817],{},"personalization_storage",[916,26819,26820,26823],{},[935,26821,26822],{},"Security (e.g. fraud prevention, bot detection)",[935,26824,26825,26828],{},[542,26826,26827],{},"security_storage"," — typically strictly necessary; no consent required in most cases",[239,26830,26832],{"id":26831},"primary-trigger-selection","Primary trigger selection",[144,26834,26835,26848],{},[147,26836,26837,26840,26841,26844,26845,549],{},[423,26838,26839],{},"Google Tag type tags (Google Tag AW, Google Analytics 4) and base tracking\u002Fpixel tags"," (for example LinkedIn InsightTag): use ",[542,26842,26843],{},"All Pages"," (Page View), not ",[542,26846,26847],{},"Initialization - All Pages",[147,26849,26850,26853],{},[423,26851,26852],{},"Conversion tags"," (thank-you page, button click, form submit, custom conversion event): use a scoped trigger tied to the conversion action.",[239,26855,26857,26858,1583],{"id":26856},"shared-consent-change-trigger-ff-consent-update","Shared consent-change trigger (",[542,26859,26752],{},[19,26861,26862],{},"The website emits one Data Layer event for consent changes:",[144,26864,26865,26870],{},[147,26866,26867,26868],{},"Trigger name in GTM: ",[542,26869,26752],{},[147,26871,26872,26873],{},"Event name: ",[542,26874,26875],{},"ff_consent_updated",[19,26877,26878],{},"Use this trigger to support in-session firing immediately after consent changes, without requiring a page reload.",[19,26880,26881],{},"How to apply it:",[504,26883,26884,26887,26896,26899],{},[147,26885,26886],{},"Open the tag.",[147,26888,26889,26890,26893,26894,549],{},"In ",[423,26891,26892],{},"Triggering",", add ",[542,26895,26752],{},[147,26897,26898],{},"Keep the tag's existing primary trigger.",[147,26900,26901],{},"Save and test in Tag Assistant.",[19,26903,26904],{},"When to use it:",[144,26906,26907,26916,26919],{},[147,26908,26909,26910,26913,26914,11585],{},"Add it to consent-aware ",[423,26911,26912],{},"sitewide Page View tags"," (typically tags that use ",[542,26915,26843],{},[147,26917,26918],{},"Do not add it to action-scoped conversion tags by default.",[147,26920,26921,26922,26924],{},"Do not add it to ",[542,26923,26847],{}," Google Tag AW.",[239,26926,26928],{"id":26927},"validation-in-tag-assistant-before-publishing","Validation in Tag Assistant before publishing",[19,26930,26931],{},"Use GTM Preview\u002FTag Assistant to verify consent behavior before publishing container changes.",[19,26933,26934],{},"Recommended references:",[144,26936,26937],{},[147,26938,26939],{},[46,26940,26943],{"href":26941,"rel":26942},"https:\u002F\u002Fdevelopers.google.com\u002Ftag-platform\u002Fsecurity\u002Fguides\u002Fconsent-debugging",[108],"Troubleshoot consent mode with Tag Assistant",[19,26945,26946],{},"Validation steps:",[504,26948,26949,26956,26959,26969,26975,26985],{},[147,26950,26951,26952,26955],{},"In GTM, click ",[423,26953,26954],{},"Preview"," and connect to the website URL.",[147,26957,26958],{},"Trigger the consent flow on the site (accept\u002Freject categories).",[147,26960,26961,26962,2040,26965,26968],{},"In Tag Assistant, verify consent signals (",[542,26963,26964],{},"default",[542,26966,26967],{},"update",") are present.",[147,26970,26971,26972,26974],{},"Verify the custom event ",[542,26973,26875],{}," appears when consent changes.",[147,26976,26977,26978,685,26981,26984],{},"For each tag under test, confirm it is ",[423,26979,26980],{},"Fired",[423,26982,26983],{},"Blocked"," according to its configured consent requirement.",[147,26986,26987],{},"Publish only after expected behavior is confirmed.",[2672,26989,26990],{},[19,26991,26992],{},"If you're unsure which consent type applies to a new tag, check with the team before publishing.",[164,26994,26996],{"id":26995},"adding-new-third-party-tracking-tools","Adding new third-party tracking tools",[19,26998,26999],{},"To avoid compliance gaps, all third-party tracking scripts, pixels, and analytics tools must follow this process before being deployed.",[19,27001,27002,27005,27006,27009],{},[423,27003,27004],{},"Rule: GTM is the single point of control.","\nNo tracking scripts should be added directly to HTML templates, ",[542,27007,27008],{},"\u003Chead>"," tags, layout files, or JavaScript bundles. GTM is the only approved deployment path for third-party tracking tools. This ensures every tool is subject to consent enforcement and can be audited or disabled without a code deployment.",[19,27011,27012,27013,27016],{},"This also applies to integrations available inside third-party platforms. For example, HubSpot offers a built-in pixel integration (under Marketing → Ads → Settings → Pixels) that can deploy scripts like the Meta Pixel directly through HubSpot's own script. ",[423,27014,27015],{},"Do not use this."," Pixels deployed through HubSpot fire outside of GTM's consent mode, making it impossible to enforce the correct consent type or audit them independently. Always deploy pixels through GTM instead.",[19,27018,27019],{},[423,27020,27021],{},"Before adding any new tool, answer these questions:",[504,27023,27024,27030,27036,27047],{},[147,27025,27026,27029],{},[423,27027,27028],{},"What data does it collect?"," Does it collect personal data (IP addresses, user IDs, behavioral data)?",[147,27031,27032,27035],{},[423,27033,27034],{},"Does it set cookies?"," Check the tool's privacy policy or cookie documentation. If the answer is yes — or unclear — assume it requires user consent.",[147,27037,27038,27041,27042,63,27044,27046],{},[423,27039,27040],{},"What consent type applies?"," Use the table above to determine whether the tool requires ",[542,27043,26787],{},[542,27045,26797],{},", or another consent type.",[147,27048,27049,27052],{},[423,27050,27051],{},"Is it strictly necessary?"," Only tools that are essential for the site to function (e.g. security, authentication) may be exempt from consent — and these are rare. If in doubt, require consent.",[19,27054,27055],{},[423,27056,27057],{},"Checklist before publishing a new tag in GTM:",[144,27059,27060,27063,27068,27075,27083,27086],{},[147,27061,27062],{},"Tag is deployed via GTM — not hardcoded in any template or layout file",[147,27064,27065,27066],{},"Consent requirement is set in ",[423,27067,26735],{},[147,27069,27070,27071,27074],{},"Trigger type follows the guidance in the ",[46,27072,27073],{"href":26741},"primary trigger selection"," section above",[147,27076,27077,27079,27080,27082],{},[542,27078,26752],{}," is attached to consent-aware sitewide ",[542,27081,26843],{}," tags that should react immediately after consent changes",[147,27084,27085],{},"The tool and its consent category are documented in the table above in this handbook section",[147,27087,27088],{},"A team member with context on GDPR has reviewed the setup before the first publish",[2672,27090,27091],{},[19,27092,27093],{},"Any new tracking tool that cannot be deployed through GTM (e.g. it requires a code-level integration) must be reviewed and approved before implementation. Reach out in the marketing Slack channel before proceeding.",{"title":75,"searchDepth":76,"depth":76,"links":27095},[27096,27097,27098,27099,27100,27101,27104],{"id":26363,"depth":76,"text":26364},{"id":26408,"depth":76,"text":26409},{"id":26461,"depth":76,"text":26462},{"id":26511,"depth":76,"text":26512},{"id":26538,"depth":76,"text":26539},{"id":26603,"depth":76,"text":26604,"children":27102},[27103],{"id":26693,"depth":605,"text":26694},{"id":26703,"depth":76,"text":26704,"children":27105},[27106,27107],{"id":26707,"depth":605,"text":26708},{"id":26995,"depth":605,"text":26996},{},"\u002Fhandbook\u002Fmarketing\u002Fprograms",{"title":26352,"description":26360},"handbook\u002Fmarketing\u002Fprograms","zjF_RZgRJzaBqQRLyxh8FJzMSJyQWlTXNfdcWdc6lrs",{"id":27114,"title":27115,"body":27116,"description":27123,"extension":81,"meta":27926,"navGroup":83,"navOrder":83,"navTitle":25779,"navigation":84,"path":25778,"seo":27927,"stem":27928,"__hash__":27929},"handbook\u002Fhandbook\u002Fmarketing\u002Fsocial-media.md","Social Media Channels",{"type":7,"value":27117,"toc":27917},[27118,27121,27124,27361,27365,27407,27409,27414,27418,27422,27427,27431,27537,27541,27595,27599,27603,27691,27695,27720,27724,27728,27770,27776,27780,27785,27795,27800,27808,27812,27862,27866,27869,27887,27890,27894,27897,27914],[10,27119,27115],{"id":27120},"social-media-channels",[19,27122,27123],{},"Each content type has channels which are appropriate, this table sets out which content should be posted on each channel, but always mindful of the topic of the content. We should share content relevant to the each channel audience.",[910,27125,27126,27152],{},[913,27127,27128],{},[916,27129,27130,27132,27134,27137,27140,27143,27146,27149],{},[919,27131,13306],{},[919,27133,15990],{},[919,27135,27136],{},"Facebook",[919,27138,27139],{},"Youtube",[919,27141,27142],{},"Discord",[919,27144,27145],{},"Reddit",[919,27147,27148],{},"Node-RED Slack",[919,27150,27151],{},"Node-RED Discourse",[930,27153,27154,27173,27192,27211,27230,27248,27267,27286,27305,27324,27342],{},[916,27155,27156,27159,27161,27163,27165,27167,27169,27171],{},[935,27157,27158],{},"Blog Posts",[935,27160,7837],{},[935,27162,7837],{},[935,27164],{},[935,27166],{},[935,27168],{},[935,27170],{},[935,27172],{},[916,27174,27175,27178,27180,27182,27184,27186,27188,27190],{},[935,27176,27177],{},"Release Post",[935,27179,7837],{},[935,27181,7837],{},[935,27183],{},[935,27185,7837],{},[935,27187],{},[935,27189,7837],{},[935,27191,7837],{},[916,27193,27194,27197,27199,27201,27203,27205,27207,27209],{},[935,27195,27196],{},"Product updates",[935,27198,7837],{},[935,27200,7837],{},[935,27202],{},[935,27204],{},[935,27206,7837],{},[935,27208,7837],{},[935,27210,7837],{},[916,27212,27213,27216,27218,27220,27222,27224,27226,27228],{},[935,27214,27215],{},"Curated content",[935,27217,7837],{},[935,27219,7837],{},[935,27221],{},[935,27223],{},[935,27225],{},[935,27227],{},[935,27229],{},[916,27231,27232,27234,27236,27238,27240,27242,27244,27246],{},[935,27233,24350],{},[935,27235,7837],{},[935,27237,7837],{},[935,27239,7837],{},[935,27241,7837],{},[935,27243,7837],{},[935,27245,7837],{},[935,27247,7837],{},[916,27249,27250,27253,27255,27257,27259,27261,27263,27265],{},[935,27251,27252],{},"Short videos",[935,27254,7837],{},[935,27256,7837],{},[935,27258,7837],{},[935,27260],{},[935,27262],{},[935,27264],{},[935,27266],{},[916,27268,27269,27272,27274,27276,27278,27280,27282,27284],{},[935,27270,27271],{},"Long format videos",[935,27273],{},[935,27275,7837],{},[935,27277,7837],{},[935,27279],{},[935,27281],{},[935,27283],{},[935,27285],{},[916,27287,27288,27291,27293,27295,27297,27299,27301,27303],{},[935,27289,27290],{},"Downloadable content",[935,27292,7837],{},[935,27294,7837],{},[935,27296],{},[935,27298,7837],{},[935,27300],{},[935,27302,7837],{},[935,27304],{},[916,27306,27307,27310,27312,27314,27316,27318,27320,27322],{},[935,27308,27309],{},"New roles opening",[935,27311,7837],{},[935,27313,7837],{},[935,27315],{},[935,27317,7837],{},[935,27319,7837],{},[935,27321,7837],{},[935,27323,7837],{},[916,27325,27326,27328,27330,27332,27334,27336,27338,27340],{},[935,27327,452],{},[935,27329,7837],{},[935,27331],{},[935,27333],{},[935,27335,7837],{},[935,27337],{},[935,27339],{},[935,27341],{},[916,27343,27344,27347,27349,27351,27353,27355,27357,27359],{},[935,27345,27346],{},"Memes",[935,27348,7837],{},[935,27350,7837],{},[935,27352,7837],{},[935,27354,7837],{},[935,27356,7837],{},[935,27358],{},[935,27360],{},[14,27362,27364],{"id":27363},"strategy-for-increasing-reach","Strategy for increasing reach",[144,27366,27367,27381,27384,27387,27398,27401],{},[147,27368,27369,27370,27372,27373,2040,27376,549],{},"Share quality content aligned with the ",[46,27371,17303],{"href":22286}," and of interest to our ",[46,27374,15454],{"href":27375},"\u002Fhandbook\u002Fengineering\u002Fproduct\u002Fpersonas\u002F#personas",[46,27377,27380],{"href":27378,"rel":27379},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1krMIUJvosw8xUQog_iq_FEvI9R5WEo9ZyWUCdTb9XnQ\u002Fedit#heading=h.3rr2wuny55dl",[108],"ideal customer profile",[147,27382,27383],{},"Position ourselves as thought leaders.",[147,27385,27386],{},"Adapt content frequency and type to each channel.",[147,27388,27389,27390],{},"Be social:\n",[144,27391,27392,27395],{},[147,27393,27394],{},"Respond promptly to comments and messages.",[147,27396,27397],{},"Like and share relevant content from other sources.",[147,27399,27400],{},"Leverage trending topics and holidays.",[147,27402,27403,549],{},[46,27404,27406],{"href":27405},"\u002Fhandbook\u002Fmarketing\u002Fsocial-media\u002F#leveraging-the-team-network-on-linkedin","Leverage our team network",[164,27408,3419],{"id":3418},[144,27410,27411],{},[147,27412,27413],{},"Channels: LinkedIn, Facebook, Youtube.",[164,27415,27417],{"id":27416},"tactics","Tactics",[239,27419,27421],{"id":27420},"frequency","Frequency",[144,27423,27424],{},[147,27425,27426],{},"Our standard practice is a single post per day, though we can increase this frequency to cover timely and urgent events.",[239,27428,27430],{"id":27429},"type-of-content","Type of content",[144,27432,27433,27473,27479,27513,27519,27530],{},[147,27434,27435,27438,27439],{},[423,27436,27437],{},"Own content:"," 2-3x week. Mondays, Wednesdays, and Thursdays.\n",[144,27440,27441,27447,27453],{},[147,27442,27443,27446],{},[423,27444,27445],{},"Fresh blogs:"," Every new piece of content will be shared on social media as a link to the article.",[147,27448,27449,27452],{},[423,27450,27451],{},"Clips form our podcast:"," Industrial Visionaries, announcing new episodes.",[147,27454,27455,27458,27459,27470,27472],{},[423,27456,27457],{},"Product updates:"," Release announcement every four weeks on Thursdays. Additionally, we’ll share quick, dev-driven product highlights whenever available. These are:",[144,27460,27461,27464,27467],{},[147,27462,27463],{},"Faster to publish: Engineers or other team members can send a short video or screenshot with a quick explanation. The marketing team will handle editing and posting.",[147,27465,27466],{},"Less polished: Raw demos, internal tools, experiments, early features — even work-in-progress — are welcome. These should feel more like dev logs than polished announcements.",[147,27468,27469],{},"More collaborative: Engineers only need 1–2 minutes to hand off the content. Marketing takes care of the rest.",[9379,27471],{},"These posts help us share fast-moving progress, spark community interest, and highlight how FlowFuse evolves day-to-day.",[147,27474,27475,27478],{},[423,27476,27477],{},"New hire:"," On Monday's during their first or second week working at FlowFuse.",[147,27480,27481,27484,27485],{},[423,27482,27483],{},"Curated content from other sources:"," 1x week. Fridays.\n",[144,27486,27487,27510],{},[147,27488,27489,27490],{},"Articles relevant to our ideal customer \u002F industry related \u002F news \u002F posts.\n",[144,27491,27492,27495,27498,27501,27504,27507],{},[147,27493,27494],{},"Avoid competitor mentions.",[147,27496,27497],{},"Must be industry-related and of interest to our audience.",[147,27499,27500],{},"Choose reliable sources.",[147,27502,27503],{},"Fresh, up-to-date, and informative.",[147,27505,27506],{},"Include our POV in the post.",[147,27508,27509],{},"Tag the original source.",[147,27511,27512],{},"Follow partners and customers on each channel for shareable content.",[147,27514,27515,27518],{},[423,27516,27517],{},"Memes:"," Once per month, during the first week, on Saturdays.",[147,27520,27521,27524,27525],{},[423,27522,27523],{},"Other content types:"," 1x week. Any day.\n",[144,27526,27527],{},[147,27528,27529],{},"Quick tips, clips of longer video formats, customer stories, surveys, events, downloads, FAQs, best practices, testimonials, quizzes, challenges.",[147,27531,27532,549],{},[46,27533,27536],{"href":27534,"rel":27535},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1Ifz6f7D_ZxCxJkAS9LbdvdnEAae0tGFEqkGVHcnn2TU\u002Fedit?usp=sharing",[108],"Detailed list here",[239,27538,27540],{"id":27539},"planning-and-posting","Planning and posting",[144,27542,27543,27550,27575,27589,27592],{},[147,27544,27545,27546,27549],{},"We'll plan ",[423,27547,27548],{},"two weeks ahead",", to give us time to prepare content and the associated materials.",[147,27551,27552,27553,27557,27558,11853,27563],{},"We'll keep the planning on our ",[46,27554,27556],{"href":22511,"rel":27555},[108],"Social Content Calendar project in Asana"," and handle scheduling through the ",[46,27559,27562],{"href":27560,"rel":27561},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Fsocial\u002F26586079\u002Fmanage\u002Fcalendar",[108],"HubSpot social calendar",[144,27564,27565,27572],{},[147,27566,27567,27568,27571],{},"Each assignee will get reminders to post in the ",[542,27569,27570],{},"#social-post-reminders"," Slack channel starting two days before the scheduled date and continuing until one day after if it hasn’t been scheduled.",[147,27573,27574],{},"Make sure to mark the Asana task as done once the post is scheduled. Otherwise, you’ll keep getting reminders, or it will show up as a missed deadline.",[147,27576,27577,27580,27581],{},[423,27578,27579],{},"Posting hours:"," Aligned with USA Eastern Time before work hours and during lunch, aiming to coincide with Germany's lunch and after work hours.\n",[144,27582,27583,27586],{},[147,27584,27585],{},"USA before work (6:00 am EDT - 12 pm CEST).",[147,27587,27588],{},"USA lunch hours (11:30 am EDT -  5:30 pm CEST).",[147,27590,27591],{},"While we have a planned schedule, it's crucial to remain flexible. If more impactful or relevant content emerges, we'll adapt our plan accordingly to ensure the best possible engagement.",[147,27593,27594],{},"If the post is part of a campaign, add it as a campaign asset in HubSpot. If the campaign doesn't exist yet, create it with a descriptive name for easy identification.",[239,27596,27598],{"id":27597},"posts-format","Posts format",[1019,27600,27602],{"id":27601},"regular","Regular",[144,27604,27605,27660,27663,27666,27669,27677,27688],{},[147,27606,27607,27608],{},"Descriptive text:\n",[144,27609,27610,27613,27655],{},[147,27611,27612],{},"Align with post purpose and audience goals. Think about relevance to the audience.",[147,27614,27615,27616,27619,27620,2040,27622,11853,27625],{},"Ideally, ",[423,27617,27618],{},"content should be written from the personal perspective of the author",". Posts written in first person may allow more room for individual perspective and personality while still generally aligning with our ",[46,27621,24082],{"href":15466},[46,27623,27624],{"href":2844},"FlowFuse values",[144,27626,27627,27645],{},[147,27628,27629,27630,27633,27634],{},"Any post written in first person ",[423,27631,27632],{},"must be signed by the author"," at the end of the post, including:\n",[144,27635,27636,27639,27642],{},[147,27637,27638],{},"Full name",[147,27640,27641],{},"Job title",[147,27643,27644],{},"Personal profile tag when supported by the platform",[147,27646,27647,27648],{},"And using the following format:\n",[144,27649,27650],{},[147,27651,27652],{},[2562,27653,27654],{},"— Name, Role",[147,27656,27657,27658,549],{},"Without author attribution, posts should be written in a neutral company voice and fully reflect our ",[46,27659,24082],{"href":15466},[147,27661,27662],{},"Emoji",[147,27664,27665],{},"Only one CTA",[147,27667,27668],{},"Hashtags, ideally three.",[147,27670,27671,27672],{},"Link to article \u002F website.\n",[144,27673,27674],{},[147,27675,27676],{},"In HubSpot, delete the link from the \"Add media\" section to keep full-size image.",[147,27678,27679,27680],{},"If you're attaching a video to the post:\n",[144,27681,27682,27685],{},[147,27683,27684],{},"Click the “Edit Thumbnail” button and choose a frame from the video or select\u002Fupload an image that better reflects what the content is about. Otherwise, the first frame of the video will be used by default.",[147,27686,27687],{},"If the attachment is a clip and the content links to the full version, prioritize website URLs over other channels like YouTube. Only use those when the full video isn’t available on the website.",[147,27689,27690],{},"Select the corresponding campaign if applicable.",[1019,27692,27694],{"id":27693},"new-hire","New Hire",[144,27696,27697,27700,27703,27706,27709,27712,27714,27717],{},[147,27698,27699],{},"Welcome message highlighting the new team member's role",[147,27701,27702],{},"Tag the new team member",[147,27704,27705],{},"Brief background (2-3 key points about their experience or expertise)",[147,27707,27708],{},"What they'll be working on at FlowFuse",[147,27710,27711],{},"Include a photo they feel comfortable with (professional or casual, their choice)",[147,27713,27662],{},[147,27715,27716],{},"A message encouraging community to say hi in the comments",[147,27718,27719],{},"2-3 relevant hashtags",[239,27721,27723],{"id":27722},"leveraging-the-team-network-on-linkedin","Leveraging the team network on LinkedIn",[1019,27725,27727],{"id":27726},"page-admins","Page admins*",[144,27729,27730,27741,27763],{},[147,27731,27732,27733,27736,27737,27740],{},"Use the ",[423,27734,27735],{},"“Invite to follow”"," feature on the company page. The page has a ",[423,27738,27739],{},"monthly pool of 250 invitation credits",". Each admin can send invitations to their connections using these credits, but the total number of invitations sent by all admins cannot exceed 250 per month. We should make sure to use our full quota every month, as this directly contributes to growing our audience.",[147,27742,27743,27744],{},"When selecting people to invite, focus on relevant industries and roles. This ensures new followers are more likely to engage with our content and convert into qualified leads.\n",[144,27745,27746,27756],{},[147,27747,27748,27749,27752,27753,549],{},"To identify industries where FlowFuse already has traction, go to ",[423,27750,27751],{},"Analytics → Followers → Follower demographics",", and filter by ",[2562,27754,27755],{},"Industry",[147,27757,27758,27759,27762],{},"Also see our ",[46,27760,27761],{"href":26570},"Ideal Customer Profile"," to prioritize the right contacts.",[147,27764,27765,27766,27769],{},"This activity should be completed ",[423,27767,27768],{},"monthly"," as part of our ongoing LinkedIn growth strategy.",[19,27771,27772,27773,27775],{},"*If you're not a page admin but have a strong network within our ICP industries, reach out to the Social Media Manager.",[9379,27774],{},"\nYou can be granted temporary admin access once a month to send your invites.",[1019,27777,27779],{"id":27778},"entire-team","Entire team",[19,27781,27782],{},[423,27783,27784],{},"Team member engagement",[19,27786,27787,27788,27790,27791,27794],{},"LinkedIn's algorithm currently rewards ",[423,27789,13451],{}," over reposts or likes. Team members are encouraged to leave ",[423,27792,27793],{},"insightful comments"," on FlowFuse posts — this significantly increases visibility and helps us reach new audiences through personal networks.",[19,27796,27797],{},[423,27798,27799],{},"Company account actions",[19,27801,27802,27803,27807],{},"We'll share a ",[46,27804,27806],{"href":27805},"\u002Fhandbook\u002Fmarketing\u002Fsocial-media\u002F#new-hire","new hire post"," when new members join the team and encourage them to share, comment, and engage with responses. This aims to welcome them, expand reach through their networks, and showcase company culture.",[14,27809,27811],{"id":27810},"content-ownership-real-time-decisions","Content Ownership & Real-Time Decisions",[144,27813,27814,27828,27836,27839,27842,27849],{},[147,27815,27816,27817,1511,27820,27824,27825,549],{},"In general, everyone is encouraged to post on social media, as long as they follow our proposed ",[46,27818,27819],{"href":15466},"guidelines and tone",[46,27821,27823],{"href":27560,"rel":27822},[108],"The HubSpot social calendar"," serves as our central planning hub for publishing content. If you choose to publish on your own, please make sure to follow the guidelines and refer to the ",[46,27826,27827],{"href":22530},"recommended publishing times",[147,27829,27830,27831,27835],{},"If you prefer not to post yourself and would like to delegate, you can do so ",[46,27832,27834],{"href":27833},"\u002Fhandbook\u002Fmarketing\u002Fsocial-media\u002F#requesting-a-social-post","Requesting a Social Post",". The Social Media owner will manage it following the regular posting track.",[147,27837,27838],{},"This is to ensure we never block or delay a post that could be urgent or highly relevant in the moment. While our handbook provides structure, it should not prevent us from responding quickly to breaking news or important events.",[147,27840,27841],{},"When an author posts to social media, posts do not need to be reviewed by another person before posting.",[147,27843,1375,27844,27848],{},[46,27845,27847],{"href":25716,"rel":27846},[108],"Social Media Manager"," remains ultimately responsible for both the distribution and the content published across FlowFuse channels.",[147,27850,27851,27852,27855,27856,27861],{},"Any publication made by someone outside the marketing team must always be communicated to the Social Media Manager. This allows them to keep the post in the established (",[46,27853,27560],{"href":27560,"rel":27854},[108],") and review it if any stylistic adjustments are needed to align with ",[46,27857,27860],{"href":27858,"rel":27859},"https:\u002F\u002Fflowfuse.com\u002Fhandbook\u002Fmarketing\u002Fbrand-voice\u002F#brand-personality",[108],"our tone and brand voice"," — something they may do whenever considered necessary.",[14,27863,27865],{"id":27864},"requesting-a-social-post","Requesting a social post",[19,27867,27868],{},"If you’d like something shared on FlowFuse’s social channels, please follow this process:",[504,27870,27871,27878,27881,27884],{},[147,27872,27873,27874,549],{},"Create an issue in the ",[46,27875,27877],{"href":25295,"rel":27876},[108],"customer GitHub repository",[147,27879,27880],{},"Use the Social Post Request template to make sure all relevant information is included.",[147,27882,27883],{},"Assign the issue to the social media manager.",[147,27885,27886],{},"Provide as much context as possible, including links, visual ideas, and deadlines if applicable.",[19,27888,27889],{},"This process helps ensure we can create content that matches your intent and our audience’s expectations.",[14,27891,27893],{"id":27892},"other-social-channels-recommendations","Other social channels recommendations",[19,27895,27896],{},"For Reddit, Node-RED Slack, and Node-RED Discourse:",[144,27898,27899,27905,27911],{},[147,27900,27901,27902,549],{},"Follow the tone and behaviour defined in our ",[46,27903,24026],{"href":27904},"\u002Fhandbook\u002Fmarketing\u002Fcommunity\u002Fcommunity-guidelines\u002F",[147,27906,27907,27908,549],{},"Use your own voice, you're talking from a personal account after all, but also remember that you represent the brand and company values. Blend your tone with our ",[46,27909,24082],{"href":27910},"\u002Fhandbook\u002Fmarketing\u002Fbrand-voice\u002F#participating-in-community-spaces-(e.g.-node-red-forum%2C-github%2C-discord)",[147,27912,27913],{},"Copy should remain informal, honest, and useful — without sounding like a sales pitch.",[19,27915,27916],{},"Keep it factual. Keep it human.",{"title":75,"searchDepth":76,"depth":76,"links":27918},[27919,27923,27924,27925],{"id":27363,"depth":76,"text":27364,"children":27920},[27921,27922],{"id":3418,"depth":605,"text":3419},{"id":27416,"depth":605,"text":27417},{"id":27810,"depth":76,"text":27811},{"id":27864,"depth":76,"text":27865},{"id":27892,"depth":76,"text":27893},{},{"title":27115,"description":27123},"handbook\u002Fmarketing\u002Fsocial-media","sfT6Tt5yyNDTl-kVsDBLLZ9DsNYKTTW8MNaxOoB_Geg",{"id":27931,"title":24264,"body":27932,"description":27939,"extension":81,"meta":28602,"navGroup":9201,"navOrder":83,"navTitle":24255,"navigation":84,"path":24263,"seo":28603,"stem":28604,"__hash__":28605},"handbook\u002Fhandbook\u002Fmarketing\u002Fwebinars.md",{"type":7,"value":27933,"toc":28591},[27934,27937,27940,27943,27946,27949,27953,28184,28188,28226,28230,28233,28237,28256,28260,28263,28284,28287,28293,28296,28302,28306,28310,28335,28344,28348,28359,28363,28472,28475,28588],[10,27935,24264],{"id":27936},"flowfuse-webinars",[19,27938,27939],{},"FlowFuse organizes monthly webinars on topics about Node-RED, FlowFuse and the general IoT industry. The topics are typically educational and technical in content. The goal is to become the source of great content for learning about these topics.",[19,27941,27942],{},"The FlowFuse webinar is typically scheduled during the last week of the month, but be mindful of trade-shows and company in-person events, as webinars should not be scheduled during those weeks.",[19,27944,27945],{},"The webinar typically starts at 17:00CET or 11amET, to allow for European and Pacific coast of North America attendees.  All webinars are recorded and the recording is made available on the FlowFuse Youtube channel.",[19,27947,27948],{},"The following are the steps to produce a montly webinar.",[14,27950,27952],{"id":27951},"webinar-preparation","Webinar Preparation",[504,27954,27955,27958,27961,28017,28020,28027,28058,28110,28113,28116],{},[147,27956,27957],{},"Identify the webinar topic and speaker two weeks before the previous webinar.",[147,27959,27960],{},"Confirm the date with the speaker and send calendar invites to block time for the event and for a dry run (recommended one week before the event).",[147,27962,27963,27964],{},"Send an email to the speaker requesting:\n",[144,27965,27966,27969,27972,27988,28001,28014],{},[147,27967,27968],{},"A short bio (around 350 characters)",[147,27970,27971],{},"A headshot",[147,27973,27974,27975,27979,27980],{},"A draft title and abstract using ",[46,27976,14793],{"href":27977,"rel":27978},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1Ovh-X87OW5uFFFQXlCob3KMoLybLhL1h3qKLLyIe9FY\u002Fedit?usp=sharing",[108]," (please duplicate the document and save it in the corresponding folder before sharing it with the speaker), focusing on the use of FlowFuse. The host then reviews it to ensure it aligns with our messaging.\n",[144,27981,27982,27985],{},[147,27983,27984],{},"Set the deadline for all the above to the week before the previous webinar to ensure we have a defined title by the day of the previous session, so it can be promoted during it and in follow-up emails.",[147,27986,27987],{},"If the speaker is unable to commit to this timeline, or does not meet the deadline, the session should be rescheduled for the following month. In that case, an internal webinar should be planned instead.",[147,27989,27990,27991,27995,27996],{},"A recording of a ",[46,27992,27994],{"href":27993},"#promo-video","promo video",", linking to the referred handbook section for details on format and script.\n",[144,27997,27998],{},[147,27999,28000],{},"Set the deadline to two weeks before the session.",[147,28002,28003,28004,28008,28009],{},"Slides for the presentation using ",[46,28005,28007],{"href":28006},"\u002Fhandbook\u002Fdesign\u002Fbranding\u002F#presentations","our template",". Create a copy and save it in the corresponding folder before sharing it with the speaker.\n",[144,28010,28011],{},[147,28012,28013],{},"Set the deadline to the week before the session so it can be reviewed during the dry run.",[147,28015,28016],{},"A list of channels where they could support the event promotion, this would lead to a conversation about joint promotion.",[147,28018,28019],{},"When there's a demo involved, provide the speaker with a non-trial FlowFuse account so they can work on it with an official account",[147,28021,28022,28026],{},[46,28023,28025],{"href":28024},"#creating-a-webinar-page","Create a webinar page"," for the website",[147,28028,28029,28030],{},"Create a Zoom webinar page\n",[144,28031,28032,28035,28038,28041,28044,28052,28055],{},[147,28033,28034],{},"Login to zoom and select the Webinars tab. There is a webinar template that will help getting going.",[147,28036,28037],{},"Use the same description and topic that was used for the web page.",[147,28039,28040],{},"Turn on Q&A, Enable Practice Session and Automatically record webinar to the cloud, require registration.",[147,28042,28043],{},"Under Branding, for the banner add the graphic created for the web site.",[147,28045,28046,28047],{},"Under Invitations, invite the speaker as a Panelist.\n",[144,28048,28049],{},[147,28050,28051],{},"Panelist receive a unique url to join the webinar that grants them access before the webinar starts. It is important the speaker knows to use this url.",[147,28053,28054],{},"Under Email Setting ensure the following: Confirmation email sent to panelist, Reminder sent 1 hour and 1 day before.  Turn off email for follow-up since we do that inside HubSpot.",[147,28056,28057],{},"Under Survey, you can decide if you want to do a survey at the end of the webinar. We ask if someone wants to be contacted by FlowFuse to discuss our services. These become MQLs in HubSpot.",[147,28059,28060,28061],{},"Setup HubSpot to accept webinar registrations.\n",[144,28062,28063,28080,28086,28093],{},[147,28064,28065,28066,28073,28074,2040,28077,549],{},"Create a marketing campaign for the webinar. Name it like this: ",[2562,28067,28068,28069,28072],{},"‘Webinar ",[2403,28070,28071],{},"year month keyword","’",", resulting in something like ",[2562,28075,28076],{},"Webinar 2025 11 Rev Pi",[423,28078,28079],{},"add every related asset to it",[147,28081,28082,28083],{},"Create a new static segment (list) called ‘Webinar Registrations ",[2403,28084,28085],{},"\u003Cmonth> Edition",[147,28087,28088,28089,28092],{},"Create a new form - clone an existing webinar registration form and rename it. Under ",[423,28090,28091],{},"options"," make sure to update the thank you message with the event date.",[147,28094,28095,28096],{},"Edit Workflow called ‘Webinar Registration Integration with Zoom’. Three changes are required:\n",[144,28097,28098,28101,28104,28107],{},[147,28099,28100],{},"Edit enrollment criteria to the new registration form submission. Make sure to check the box next to the form name under the 'Settings' tab to allow contacts to re-enroll in this workflow, otherwise, previous webinar attendees won’t be able to register.",[147,28102,28103],{},"Edit ‘Add Contact to Zoom Webinar’ to update the new Webinar ID. Replace the current number with the number from the webinar you just created for this month. You find the Webinar ID on the main page of the Zoom webinar. NOTE: you need to  hyphens to replace the spaces in the ID number.",[147,28105,28106],{},"Edit ‘Add to static list’ to change the list to the new list for this month’s webinar.",[147,28108,28109],{},"Remember to Save the changes.",[147,28111,28112],{},"Test the web page for the webinar to see if a new registrant gets added to the HubSpot list.",[147,28114,28115],{},"Page is now ready to be published.",[147,28117,28118,28119],{},"Setting up the survey on HubSpot.\n",[144,28120,28121,28133,28136,28139,28149,28156,28167],{},[147,28122,775,28123,28126,28127,549],{},[423,28124,28125],{},"Service > Feedback Surveys",", you'll find the latest one called ",[2562,28128,28129,28130,28072],{},"‘Webinar Survey - ",[2403,28131,28132],{},"\u003Cmonth> \u003Cyear>",[147,28134,28135],{},"Clone it, update the survey name to match the month and year of the upcoming webinar, and update the header to match the webinar's name.",[147,28137,28138],{},"Publish the survey and copy the shareable link.",[147,28140,775,28141,28144,28145,28148],{},[423,28142,28143],{},"Automations > Workflows",", look for ",[2562,28146,28147],{},"‘New Contact Us Form Completion - MQLs’",". You'll need to update the trigger enrollment for contacts in that workflow",[147,28150,28151,28152,28155],{},"Look for the group with the criteria: ",[2562,28153,28154],{},"‘Contact is associated to: Any Feedback submission’"," and update the survey name to the one you just created.",[147,28157,28158,28159,28162,28163,28166],{},"Save the change and when it asks ",[2562,28160,28161],{},"'Do you want to enroll existing contacts?'"," click on the button that says ",[423,28164,28165],{},"'Save and don't enroll existing contacts'",". You should pay close attention to this step, because if you choose the other option, all of the contacts that have ever requested to be contacted will re-enroll and sales will get notifications and tasks to contact all of them again.",[147,28168,769,28169,28172,28173,28175,28176,28179,28180,28183],{},[423,28170,28171],{},"Zoom",", and in the ",[423,28174,24255],{}," section, under ",[423,28177,28178],{},"Survey",", choose ",[2562,28181,28182],{},"'Use a 3rd party survey'"," and paste the shareable link you obtained when the survey was published.",[14,28185,28187],{"id":28186},"webinar-promotion","Webinar Promotion",[144,28189,28190,28193,28210,28218],{},[147,28191,28192],{},"Week 1: Added to the newsletter (note to also promote on-demand version of the previous month's webinar in the newsletter)",[147,28194,28195,28196],{},"Week 2: Social media promotion on all channels:\n",[144,28197,28198,28204,28207],{},[147,28199,28200,28201,28203],{},"LinkedIn, Twitter, Facebook, Node-RED Forum Event category, Redit Node-RED, Node-RED slack. For socials a ",[46,28202,27994],{"href":27993}," recorded by the speaker is recommended.",[147,28205,28206],{},"Encourage FlowFuse employees to promote their network",[147,28208,28209],{},"Dedicated email to all in the community outreach list",[147,28211,28212,28213],{},"Week 3 (1 week before webinar): Email to HubSpot list (Send to those you didn't open previous week's email and new leads in DB. Exclude registered leads)\n",[144,28214,28215],{},[147,28216,28217],{},"Typically clone a previous email as the starting point.",[147,28219,28220,28221],{},"Week 4: Another social media promotion and email.\n",[144,28222,28223],{},[147,28224,28225],{},"Typically this is sent 1 day before the webinar as a reminder that its not too late to join.",[164,28227,28229],{"id":28228},"promo-video","Promo video",[19,28231,28232],{},"This asset allow us to post on YouTube and it gives the audience a chance to see who's going to present.",[239,28234,28236],{"id":28235},"technical-specifications","Technical specifications",[144,28238,28239,28242,28250,28253],{},[147,28240,28241],{},"If the presenter has an interesting background, like a shop floor, or a wall with devices, use that for the video. Otherwise, use a solid, contrasting background to make it easier to crop the video and replace the background in post-production.",[147,28243,28244,28245],{},"Frame the speaker from the chest up with space around the head and shoulders for both landscape and portrait formats.\n",[1724,28246],{"alt":28247,"src":28248,"width":28249},"Video framing examples","\u002Fhandbook\u002Fmarketing\u002Fimages\u002Fvideo-framing.png",600,[147,28251,28252],{},"Ensure the video is in HD quality or higher.",[147,28254,28255],{},"Keep the video under one minute to allow for YouTube Shorts.",[239,28257,28259],{"id":28258},"recommended-script-structure","Recommended script structure",[19,28261,28262],{},"We encourage the speaker to create their own script for a natural delivery. However, the following points should be covered:",[144,28264,28265,28268,28271,28274,28281],{},[147,28266,28267],{},"Speaker's name, job title, and company.",[147,28269,28270],{},"Webinar date and title.",[147,28272,28273],{},"Brief description of what the audience will learn or gain.",[147,28275,28276,28277,28280],{},"A call to action (e.g., \"Register now and join me for ",[2403,28278,28279],{},"what the session will cover","\").",[147,28282,28283],{},"A phrase that encourages engagement, such as \"I look forward to having you join us!\" or \"I hope to see you there!\"",[19,28285,28286],{},"Here's a template to help you get started:",[557,28288,28291],{"className":28289,"code":28290,"language":562},[560],"Hi, I'm [Name], [Job Title] at [Company Name].\nI'll be presenting in our upcoming webinar on [Date], titled “[Webinar Title]”.\nIn this session, we’ll cover [Brief Overview of the Webinar's Focus\u002FKey Topics].\nIf you're interested in [Relevant Topic or Pain Point], this is the perfect session for you.\nDon’t miss out, register now and join me as we dive into [What You’ll Learn or Discuss in the Session].\nI look forward to seeing you there!\n",[542,28292,28290],{"__ignoreMap":75},[19,28294,28295],{},"And here are a couple of samples of our past promo videos:",[20704,28297],{"videoid":28298,"params":28299,"style":28300,"title":28301},"mfihdh336bw","rel=0","width: 704px; height: 100%; margin-bottom: 1.5rem;","YouTube video player",[20704,28303],{"videoid":28304,"params":28299,"style":28305,"title":28301},"bgJNk0x_sMs","width: 704px; height: 100%;",[14,28307,28309],{"id":28308},"post-webinar","Post Webinar",[144,28311,28312,28320,28323,28326,28329,28332],{},[147,28313,28314,28315],{},"Upload webinar recording to FlowFuse Youtube channel\n",[144,28316,28317],{},[147,28318,28319],{},"Trim out the dead air waiting to start the webinar",[147,28321,28322],{},"Publish webinar recording",[147,28324,28325],{},"Social media post with link to webinar recording",[147,28327,28328],{},"In HubSpot send follow-up email to the registration list created in HubSpot that includes a link to the recording on YouTube.",[147,28330,28331],{},"Download the attendee list from Zoom and upload it to HubSpot. The filter that captures attendees in HubSpot isn't reliable and might cause non-attendee emails to be sent to actual attendees.",[147,28333,28334],{},"For those who wanted to be contacted, change Life Cycle Stage property to MQL",[19,28336,28337,28338,28343],{},"This ",[46,28339,28342],{"href":28340,"rel":28341},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fmarketing\u002Fissues\u002F271",[108],"webinar prep issue"," can be cloned and updated to keep track of activities.",[14,28345,28347],{"id":28346},"creating-a-webinar-page","Creating a Webinar Page",[19,28349,28350,28351,28355,28356,28358],{},"Webinar pages follow a fixed structure, you can see plenty of examples ",[46,28352,2011],{"href":28353,"rel":28354},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fwebsite\u002Ftree\u002Fmain\u002Fsrc\u002Fwebinars",[108]," in our website repository. Importantly, they must define the following properties at the top of the ",[542,28357,20157],{}," file:",[164,28360,28362],{"id":28361},"properties","Properties",[910,28364,28365,28374],{},[913,28366,28367],{},[916,28368,28369,28372],{},[919,28370,28371],{},"Property",[919,28373,15152],{},[930,28375,28376,28385,28394,28403,28412,28421,28431,28441,28462],{},[916,28377,28378,28382],{},[935,28379,28380],{},[542,28381,14103],{},[935,28383,28384],{},"The title of the webinar, this will also be what shows as the \"title\" when shared on socials",[916,28386,28387,28391],{},[935,28388,28389],{},[542,28390,22874],{},[935,28392,28393],{},"More context on what the webinar will involve",[916,28395,28396,28400],{},[935,28397,28398],{},[542,28399,9115],{},[935,28401,28402],{},"Once you have an available video recording of the session, you can include the videos' YouTube id here to include the recording in the webinar's page",[916,28404,28405,28409],{},[935,28406,28407],{},[542,28408,14122],{},[935,28410,28411],{},"Absolute file path to the image to show for the Webinar's tile",[916,28413,28414,28418],{},[935,28415,28416],{},[542,28417,20212],{},[935,28419,28420],{},"The date that the webinar will take place",[916,28422,28423,28428],{},[935,28424,28425],{},[542,28426,28427],{},"time",[935,28429,28430],{},"The time that the webinar will take place, in both GMT & ET",[916,28432,28433,28438],{},[935,28434,28435],{},[542,28436,28437],{},"duration",[935,28439,28440],{},"How long, in minutes with the webinar last for",[916,28442,28443,28448],{},[935,28444,28445],{},[542,28446,28447],{},"hosts",[935,28449,28450,28451,28454,28455,28458,28459,22943],{},"A list of the webinar hosts, the names need to be formatted inline with the file names found ",[46,28452,2011],{"href":22924,"rel":28453},[108],". If they're not part of the FlowFuse team, then you can find a list of guests in ",[46,28456,2011],{"href":22931,"rel":28457},[108],", feel free to add any guest you need and remember to add the headshot image in the images\u002Fteam ",[46,28460,22942],{"href":22940,"rel":28461},[108],[916,28463,28464,28469],{},[935,28465,28466],{},[542,28467,28468],{},"hubspot.formId",[935,28470,28471],{},"The formId from HubSpot to handle the event registration",[164,28473,26064],{"id":28474},"example",[557,28476,28478],{"className":11203,"code":28477,"language":11205,"meta":75,"style":75},"---\ntitle: \"DevOps for Node-RED: An Introduction to FlowFuse\"\nsubtitle: Join FlowFuse's CTO Nick O'Leary for an introduction to FlowFuse and how it provides DevOps for Node-RED.\nvideo: 47EvfmJji-k\nimage: \u002Fimages\u002Fwebinars\u002Fintro-to-node-red-5-minutes-to-your-first-program-webinar-feb-2023.jpg\ndate: YYYY-MM-DD\ntime: HH:MM GMT (HH:MM ET) \nduration: MM\nhosts: [\"rob-marcer\", \"joe-pavitt\"]\nhubspot:\n    formId: \u003Cform-id>\n---\n",[542,28479,28480,28484,28493,28502,28511,28520,28529,28541,28550,28568,28574,28584],{"__ignoreMap":75},[2403,28481,28482],{"class":2405,"line":2406},[2403,28483,14098],{"class":2758},[2403,28485,28486,28488,28490],{"class":2405,"line":76},[2403,28487,14103],{"class":2686},[2403,28489,9411],{"class":2446},[2403,28491,28492],{"class":2765},"\"DevOps for Node-RED: An Introduction to FlowFuse\"\n",[2403,28494,28495,28497,28499],{"class":2405,"line":605},[2403,28496,22874],{"class":2686},[2403,28498,9411],{"class":2446},[2403,28500,28501],{"class":2765},"Join FlowFuse's CTO Nick O'Leary for an introduction to FlowFuse and how it provides DevOps for Node-RED.\n",[2403,28503,28504,28506,28508],{"class":2405,"line":2423},[2403,28505,9115],{"class":2686},[2403,28507,9411],{"class":2446},[2403,28509,28510],{"class":2765},"47EvfmJji-k\n",[2403,28512,28513,28515,28517],{"class":2405,"line":2465},[2403,28514,14122],{"class":2686},[2403,28516,9411],{"class":2446},[2403,28518,28519],{"class":2765},"\u002Fimages\u002Fwebinars\u002Fintro-to-node-red-5-minutes-to-your-first-program-webinar-feb-2023.jpg\n",[2403,28521,28522,28524,28526],{"class":2405,"line":2471},[2403,28523,20212],{"class":2686},[2403,28525,9411],{"class":2446},[2403,28527,28528],{"class":2765},"YYYY-MM-DD\n",[2403,28530,28531,28533,28535,28538],{"class":2405,"line":3086},[2403,28532,28427],{"class":2686},[2403,28534,9411],{"class":2446},[2403,28536,28537],{"class":2765},"HH:MM GMT (HH:MM ET)",[2403,28539,28540],{"class":2446}," \n",[2403,28542,28543,28545,28547],{"class":2405,"line":3092},[2403,28544,28437],{"class":2686},[2403,28546,9411],{"class":2446},[2403,28548,28549],{"class":2765},"MM\n",[2403,28551,28552,28554,28557,28560,28562,28565],{"class":2405,"line":3098},[2403,28553,28447],{"class":2686},[2403,28555,28556],{"class":2446},": [",[2403,28558,28559],{"class":2765},"\"rob-marcer\"",[2403,28561,63],{"class":2446},[2403,28563,28564],{"class":2765},"\"joe-pavitt\"",[2403,28566,28567],{"class":2446},"]\n",[2403,28569,28570,28572],{"class":2405,"line":3104},[2403,28571,21507],{"class":2686},[2403,28573,9403],{"class":2446},[2403,28575,28576,28579,28581],{"class":2405,"line":3109},[2403,28577,28578],{"class":2686},"    formId",[2403,28580,9411],{"class":2446},[2403,28582,28583],{"class":2765},"\u003Cform-id>\n",[2403,28585,28586],{"class":2405,"line":3115},[2403,28587,14098],{"class":2758},[2796,28589,28590],{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":75,"searchDepth":76,"depth":76,"links":28592},[28593,28594,28597,28598],{"id":27951,"depth":76,"text":27952},{"id":28186,"depth":76,"text":28187,"children":28595},[28596],{"id":28228,"depth":605,"text":28229},{"id":28308,"depth":76,"text":28309},{"id":28346,"depth":76,"text":28347,"children":28599},[28600,28601],{"id":28361,"depth":605,"text":28362},{"id":28474,"depth":605,"text":26064},{},{"title":24264,"description":27939},"handbook\u002Fmarketing\u002Fwebinars","7pgENfpwAMFnsl14ikjCe4ZJ48J1QUAivGf6ucBcDaA",{"id":28607,"title":28608,"body":28609,"description":75,"extension":81,"meta":29075,"navGroup":83,"navOrder":83,"navTitle":7815,"navigation":84,"path":25799,"seo":29076,"stem":29077,"__hash__":29078},"handbook\u002Fhandbook\u002Fmarketing\u002Fwebsite.md","Marketing Website",{"type":7,"value":28610,"toc":29060},[28611,28614,28653,28657,28660,28669,28675,28685,28692,28695,28698,28704,28707,28709,28718,28721,28724,28727,28772,28776,28783,28802,28805,28809,28815,28855,28872,28874,28877,28881,28890,28894,28897,28943,28947,28950,28989,28993,29002,29005,29016,29019,29022,29029,29033,29036,29047,29050,29054,29057],[10,28612,28608],{"id":28613},"marketing-website",[144,28615,28616,28619,28627,28636,28644],{},[147,28617,28618],{},"All written content should be in US English.",[147,28620,28621,28622,549],{},"All page titles should summarise the content, keep the URL length as short as practical and use ",[46,28623,28626],{"href":28624,"rel":28625},"https:\u002F\u002Fen.wiktionary.org\u002Fwiki\u002Fkebab_case",[108],"Kebab Case",[147,28628,28629,28630,28635],{},"All images should use informative ",[46,28631,28634],{"href":28632,"rel":28633},"https:\u002F\u002Fwww.w3.org\u002FWAI\u002Ftutorials\u002Fimages\u002Ftips\u002F",[108],"alt tags"," which clearly describe the point of an image rather than all the details. Alt tags should be no longer than 60 characters.",[147,28637,28638,28639,28643],{},"When mentioning ",[46,28640,28642],{"href":28641},"\u002Fdocs\u002Fuser\u002Fconcepts\u002F","FlowFuse Concepts"," (terminology) where possible we should link to an explanation of that concept.",[147,28645,28646,28647,28652],{},"All written content should use the ",[46,28648,28651],{"href":28649,"rel":28650},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSerial_comma",[108],"Oxford Comma",". We believe the Oxford Comma reduces the ambiguity of written technical content.",[14,28654,28656],{"id":28655},"events-banner","Events Banner",[19,28658,28659],{},"The event banner at the top of the website can display more than one event or announcement.",[19,28661,28662,28663,28668],{},"To add or update an event, you'll need to modify the ",[46,28664,28667],{"href":28665,"rel":28666},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fwebsite\u002Fblob\u002Fmain\u002Fsrc\u002F_data\u002Fevents.yaml",[108],"following file",". The information should be formatted as follows for each banner:",[557,28670,28673],{"className":28671,"code":28672,"language":562},[560],"- type: \"Webinar\"\n  title: \"Deploy FlowFuse on Industrial IoT with NCD.io\"\n  buttonText: \"Learn more\"\n  link: \"\u002Fwebinars\u002F2024\u002Fdeploy-flowfuse-on-industrial-iot-with-ncd-io\u002F\"\n  expire: \"2024-05-29T16:00:00Z\"\n",[542,28674,28672],{"__ignoreMap":75},[19,28676,1375,28677,28680,28681,28684],{},[542,28678,28679],{},"expire"," field is used to set the date and time when the event should stop being displayed on the banner. The date and time are set in the ISO 8601 format: ",[542,28682,28683],{},"YYYY-MM-DDTHH:MM:SSZ",", and the time is in Coordinated Universal Time (UTC).",[19,28686,28687,28688,28691],{},"For example, ",[542,28689,28690],{},"expire: \"2024-05-29T15:00:00Z\""," means that the event will stop being displayed on the banner at 16:00 UTC on May 29, 2024.",[19,28693,28694],{},"Please note that the website is built once a day at 9:30 AM UTC, and also on Wednesdays and Thursdays at 16:05 UTC. This means that if an event expires at some point during the day, it will still be displayed until the next time the website is built.",[19,28696,28697],{},"If there were more than one event, then duplicating that and updating the info will create the second banner for rotation. It would look like this:",[557,28699,28702],{"className":28700,"code":28701,"language":562},[560],"- type: \"Webinar\"\n  title: \"Deploy FlowFuse on Industrial IoT with NCD.io\"\n  buttonText: \"Learn more\"\n  link: \"\u002Fwebinars\u002F2024\u002Fdeploy-flowfuse-on-industrial-iot-with-ncd-io\u002F\"\n  expire: \"2024-05-29T15:00:00Z\"\n- type: \"New Release\"\n  title: \"FlowFuse 2.4: making it easier to work with Snapshots, Blueprints & Devices \"\n  buttonText: \"See blog post\"\n  link: \"\u002Fblog\u002F2024\u002F05\u002Fflowfuse-2-4-release\u002F\"\n  expire: \"2024-05-20T15:00:00Z\"\n",[542,28703,28701],{"__ignoreMap":75},[19,28705,28706],{},"If there is only one event, the banner will continuously display that event. If there are multiple events, the banner will rotate through them, displaying each one for a few seconds at a time.",[14,28708,2629],{"id":2628},[19,28710,28711,28712,28717],{},"All images on the website, whether part of the blog or otherwise, are run though an ",[46,28713,28716],{"href":28714,"rel":28715},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fwebsite\u002Fblob\u002Fmain\u002Flib\u002Fimage-handler.js",[108],"image pipeline",", that compresses, resizes and converts the images to reduce file size and improve page loading speed.",[19,28719,28720],{},"That pipeline also generates x2 versions of images for high DPI screens if the provided image is large enough.",[19,28722,28723],{},"The first build locally will take roughly a minute, while the cache remains intact, all future builds should take only a few seconds.",[19,28725,28726],{},"Guidelines for including images:",[144,28728,28729,28732,28735,28769],{},[147,28730,28731],{},"Downsize the image to at maximum two times the width it will be displayed (1300px for blog prose)",[147,28733,28734],{},"Ideally use JPEG for lossy ok images, and PNG for others (they will be converted to AVIF and WebP regardless)",[147,28736,28737,28738],{},"Wherever possible use:\n",[144,28739,28740,28757],{},[147,28741,28742,28743,28746],{},"The markdown image include tag in blog prose: ",[542,28744,28745],{},"![Name of Image](..\u002Frelative-path-to-image.jpeg)",[144,28747,28748],{},[147,28749,28750,28751,28753,28754],{},"You can use the ",[542,28752,1780],{}," tag to disable the image pipeline entirely for an image ",[542,28755,28756],{},"![Name of Image](..\u002Frelative-path-to-image.jpeg \"@skip\")",[147,28758,28759,28760,28763,28764],{},"The NJK shortcode in website body: {% raw %} ",[542,28761,28762],{},"{% image \".\u002Frelative-path-to-image.png\", \"Image alt tag for screen readers\", [150] %}","{% endraw %}\n",[144,28765,28766],{},[147,28767,28768],{},"Where 150 is the maximum width the image will be displayed on the page (source image should be two times this width)",[147,28770,28771],{},"GIFs can grow incredibly large, consider using a video in a modern format if the animation is longer than a few seconds",[14,28773,28775],{"id":28774},"non-image-assets","Non-Image Assets",[19,28777,28778,28779,28782],{},"If you need to include things other than images, e.g. Video or resource bundles (zip files), these should be uploaded to the ",[542,28780,28781],{},"website-data"," S3 bucket in the Production AWS account.",[19,28784,28785,28786,63,28790,63,28794,685,28798,549],{},"This can be done by ",[46,28787,28789],{"href":28788},"\u002Fabout#ben-hardill","Ben",[46,28791,28793],{"href":28792},"\u002Fabout#nick-oleary","Nick",[46,28795,28797],{"href":28796},"\u002Fabout#piotr-pawlowski","Piotr",[46,28799,28801],{"href":28800},"\u002Fabout#zeger-jan-van-de-weg","ZJ",[19,28803,28804],{},"A URL will be made available to include in the post.",[164,28806,28808],{"id":28807},"youtube-videos","YouTube Videos",[19,28810,28811,28812,28814],{},"YouTube videos can be embedded directly in pages using the ",[542,28813,20642],{}," web component — no S3 upload needed:",[557,28816,28817],{"className":10396,"code":23027,"language":10398,"meta":75,"style":75},[542,28818,28819],{"__ignoreMap":75},[2403,28820,28821,28823,28825,28827,28829,28831,28833,28835,28837,28839,28841,28843,28845,28847,28849,28851,28853],{"class":2405,"line":2406},[2403,28822,10405],{"class":2446},[2403,28824,20704],{"class":2686},[2403,28826,23038],{"class":2758},[2403,28828,10414],{"class":2446},[2403,28830,23043],{"class":2765},[2403,28832,23046],{"class":2758},[2403,28834,10414],{"class":2446},[2403,28836,23051],{"class":2765},[2403,28838,23054],{"class":2758},[2403,28840,10414],{"class":2446},[2403,28842,23059],{"class":2765},[2403,28844,23062],{"class":2758},[2403,28846,10414],{"class":2446},[2403,28848,23067],{"class":2765},[2403,28850,10447],{"class":2446},[2403,28852,20704],{"class":2686},[2403,28854,10428],{"class":2446},[2672,28856,28857],{},[19,28858,28859,28864,28865,28867,28868,28871],{},[423,28860,23099,28861,28863],{},[542,28862,23102],{}," tags"," to embed YouTube videos. Iframes load YouTube's scripts and set tracking cookies on page load, before any user consent, which is not GDPR-compliant. The ",[542,28866,20642],{}," component only loads the YouTube player when the user explicitly clicks play. See ",[46,28869,23018],{"href":28870},"\u002Fhandbook\u002Fmarketing\u002Fblog\u002F#embedding-videos-in-article-body"," for more detail.",[14,28873,23461],{"id":23460},[19,28875,28876],{},"Meta keywords are a type of metadata that provide information about the content of a webpage. They are commonly used by search engines to understand the topics covered in a page and improve its visibility in search results.",[164,28878,28880],{"id":28879},"default-keywords","Default Keywords",[19,28882,28883,28884,28889],{},"By default, each webpage on the FlowFuse website includes a set of predefined keywords: ",[423,28885,28886],{},[3234,28887],{"value":28888},"site.messaging.keywords",". These default keywords are relevant to the overall theme of the website and help categorize the content.",[164,28891,28893],{"id":28892},"priority-of-keywords","Priority of Keywords",[19,28895,28896],{},"When adding meta keywords to the website pages, a specific priority order is followed:",[504,28898,28899,28905,28919,28937],{},[147,28900,28901,28904],{},[423,28902,28903],{},"Meta Keywords:"," These are the keywords specified in the front matter of the webpage. They are specifically defined for each page and offer additional context.",[147,28906,28907,28910,28911,28914,28915,28918],{},[423,28908,28909],{},"Keywords:"," If no ",[542,28912,28913],{},"meta.keywords"," are found, the ",[542,28916,28917],{},"keywords"," specified in the front matter of the webpage are used.",[147,28920,28921,28927,28928,28930,28931,28933,28934,28936],{},[46,28922,28924],{"href":28923},"\u002Fhandbook\u002Fmarketing\u002Fblog\u002F#tags",[423,28925,28926],{},"Tags:"," If neither ",[542,28929,28913],{}," nor ",[542,28932,28917],{}," are assigned, the ",[542,28935,14132],{}," assigned to the content are included as meta keywords. These tags are used to categorize the content and provide relevant context.",[147,28938,28939,28942],{},[423,28940,28941],{},"Default Keywords:"," These are always included and provide general information about the website's content. They can be appended to the keywords obtained from previous points, or, if neither of the previous conditions are met, the default keywords are used as a fallback option.",[164,28944,28946],{"id":28945},"adding-meta-keywords","Adding Meta Keywords",[19,28948,28949],{},"To specify meta keywords for a webpage, include them in the front matter of the Markdown file. Here's an example:",[557,28951,28953],{"className":9391,"code":28952,"language":9393,"meta":75,"style":75},"---\ntitle: Example Page\nmeta:\n  keywords: flowfuse, flows, manufacturing\n---\n",[542,28954,28955,28959,28968,28975,28985],{"__ignoreMap":75},[2403,28956,28957],{"class":2405,"line":2406},[2403,28958,14098],{"class":2758},[2403,28960,28961,28963,28965],{"class":2405,"line":76},[2403,28962,14103],{"class":2686},[2403,28964,9411],{"class":2446},[2403,28966,28967],{"class":2765},"Example Page\n",[2403,28969,28970,28973],{"class":2405,"line":605},[2403,28971,28972],{"class":2686},"meta",[2403,28974,9403],{"class":2446},[2403,28976,28977,28980,28982],{"class":2405,"line":2423},[2403,28978,28979],{"class":2686},"  keywords",[2403,28981,9411],{"class":2446},[2403,28983,28984],{"class":2765},"flowfuse, flows, manufacturing\n",[2403,28986,28987],{"class":2405,"line":2465},[2403,28988,14098],{"class":2758},[14,28990,28992],{"id":28991},"requesting-new-website-pages","Requesting New Website Pages",[19,28994,28995,28996,29001],{},"New pages or significant page updates should start with a ",[46,28997,29000],{"href":28998,"rel":28999},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fwebsite\u002Fissues\u002Fnew\u002Fchoose",[108],"Website Page Request"," issue in the website repository.",[19,29003,29004],{},"The request should include a draft (Google Doc) with:",[144,29006,29007,29010,29013],{},[147,29008,29009],{},"full copy for all sections",[147,29011,29012],{},"CTA destinations and links",[147,29014,29015],{},"any relevant context for the page",[19,29017,29018],{},"Starting with a draft copy is often the fastest way to get feedback and move into implementation.",[19,29020,29021],{},"In many cases, this helps keep changes focused and iterations small when the page is built.",[19,29023,29024,29025,549],{},"For design-related considerations, see the ",[46,29026,29028],{"href":29027},"\u002Fhandbook\u002Fdesign\u002Fprocess\u002F#design-review","Design Review process",[14,29030,29032],{"id":29031},"pull-request-scope","Pull Request Scope",[19,29034,29035],{},"To support fast iteration:",[144,29037,29038,29041,29044],{},[147,29039,29040],{},"prefer small, focused PRs",[147,29042,29043],{},"avoid mixing content updates with layout or functional changes",[147,29045,29046],{},"split larger changes into separate PRs where possible",[19,29048,29049],{},"This makes changes easier to review, test, and iterate on, and helps keep iterations small.",[14,29051,29053],{"id":29052},"reviewing-pull-requests","Reviewing Pull Requests",[19,29055,29056],{},"When creating a PR and requesting a review from a FlowFuse team member, please consider if\nthe content is ready to be released ASAP or if its release should be to a particular schedule. If you\ndon't want the reviewer to merge the content (in effect put it live on the website) mark the PR as a draft in GitHub.\nIf you are reviewing a website PR and it is not marked as draft you can merge it, otherwise simply review and where appropriate approve the PR.",[2796,29058,29059],{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":75,"searchDepth":76,"depth":76,"links":29061},[29062,29063,29064,29067,29072,29073,29074],{"id":28655,"depth":76,"text":28656},{"id":2628,"depth":76,"text":2629},{"id":28774,"depth":76,"text":28775,"children":29065},[29066],{"id":28807,"depth":605,"text":28808},{"id":23460,"depth":76,"text":23461,"children":29068},[29069,29070,29071],{"id":28879,"depth":605,"text":28880},{"id":28892,"depth":605,"text":28893},{"id":28945,"depth":605,"text":28946},{"id":28991,"depth":76,"text":28992},{"id":29031,"depth":76,"text":29032},{"id":29052,"depth":76,"text":29053},{},{"title":28608,"description":75},"handbook\u002Fmarketing\u002Fwebsite","pHpFQYxRQR80UG9Y_INY-V-0Y9UfK_5qyMaag8_DoUI",{"id":29080,"title":29081,"body":29082,"description":29089,"extension":81,"meta":29184,"navGroup":83,"navOrder":83,"navTitle":29185,"navigation":84,"path":29186,"seo":29187,"stem":29188,"__hash__":29189},"handbook\u002Fhandbook\u002Foperations\u002Faccounting.md","Tax & Compliance",{"type":7,"value":29083,"toc":29181},[29084,29087,29090,29160,29168,29172],[10,29085,29081],{"id":29086},"tax-compliance",[19,29088,29089],{},"FlowFuse partners with external specialists to ensure global and domestic tax compliance.",[910,29091,29092,29103],{},[913,29093,29094],{},[916,29095,29096,29098,29101],{},[919,29097,21631],{},[919,29099,29100],{},"Responsibility \u002F Provider",[919,29102,27421],{},[930,29104,29105,29116,29127,29138,29149],{},[916,29106,29107,29110,29113],{},[935,29108,29109],{},"Payroll Tax",[935,29111,29112],{},"Managed via Deel",[935,29114,29115],{},"Per pay cycle",[916,29117,29118,29121,29124],{},[935,29119,29120],{},"Income Tax",[935,29122,29123],{},"Tax Consultants (filing in all states with physical presence\u002Fnexus)",[935,29125,29126],{},"Annual \u002F Quarterly",[916,29128,29129,29132,29135],{},[935,29130,29131],{},"Tax R&D Credit",[935,29133,29134],{},"Tax Consultants (specialized study and filing)",[935,29136,29137],{},"Annual",[916,29139,29140,29143,29146],{},[935,29141,29142],{},"USA Sales Tax",[935,29144,29145],{},"TBC",[935,29147,29148],{},"Monthly\u002FQuarterly",[916,29150,29151,29154,29157],{},[935,29152,29153],{},"UK Sales Tax",[935,29155,29156],{},"Calculated and filled by third party",[935,29158,29159],{},"Quarterly",[19,29161,29162,29163,549],{},"To find out the names of the providers, please visit our ",[46,29164,29167],{"href":29165,"rel":29166},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1ro77wy0cRK6gpzVv_iq4vpdmbdMq61X5-tTwI_F3hXM\u002Fedit?gid=0#gid=0",[108],"vendor sheet",[14,29169,29171],{"id":29170},"internal-documentation-storage","Internal Documentation & Storage",[19,29173,29174,29175,29180],{},"All finalized tax filings, monthly financial packages, and signed vendor contracts are stored in ",[46,29176,29179],{"href":29177,"rel":29178},"https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Ffolders\u002F1xtrbFJaAmwgF9VdWnvzztevXi1MUJDMR",[108],"this folder in Google Drive",". Access is limited to the Accounting Team and Executive Leadership.",{"title":75,"searchDepth":76,"depth":76,"links":29182},[29183],{"id":29170,"depth":76,"text":29171},{},"Accounting","\u002Fhandbook\u002Foperations\u002Faccounting",{"title":29081,"description":29089},"handbook\u002Foperations\u002Faccounting","3iUnq2-ywYV-0currBlqEOmV4sJiabcIBxO5KPOs04Y",{"id":29191,"title":29192,"body":29193,"description":29200,"extension":81,"meta":29286,"navGroup":83,"navOrder":83,"navTitle":29192,"navigation":84,"path":29287,"seo":29288,"stem":29289,"__hash__":29290},"handbook\u002Fhandbook\u002Foperations\u002Faccounts.md","Accounts",{"type":7,"value":29194,"toc":29280},[29195,29198,29201,29208,29215,29222,29224,29227,29230,29234,29241,29244,29248,29251,29254,29266,29269,29277],[10,29196,29192],{"id":29197},"accounts",[19,29199,29200],{},"As a company we use a variety of online services in our day-to-day business.",[19,29202,29203,29204,549],{},"Access to the services is subject to our ",[46,29205,29207],{"href":29206},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Faccess-control\u002F","access control policy",[19,29209,29210,29211,549],{},"When new team members join the company, access will be provided to the core services in accordance with our ",[46,29212,29214],{"href":29213},"\u002Fhandbook\u002Fpeopleops\u002Fhiring\u002F#onboarding","onboarding process",[19,29216,29217,29218,549],{},"To request additional access to any service, follow the ",[46,29219,29221],{"href":29220},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Faccess-control\u002F#how-to-request-access-or-permission-to-a-system","guide here",[14,29223,21839],{"id":21838},[19,29225,29226],{},"These are the principles of how we setup and use accounts on the FlowFuse Cloud platform.",[19,29228,29229],{},"Shared accounts should be avoided wherever possible, particularly on our own systems as this removes the ability to track which individual made a change.",[164,29231,29233],{"id":29232},"user-accounts","User Accounts",[19,29235,29236,29237,29240],{},"All employees of FlowFuse should have a user account on FlowFuse Cloud and be added to the ",[542,29238,29239],{},"FlowFuse Team"," in order to access our own company projects. This is part of the onboarding checklist.",[19,29242,29243],{},"The email address for this account should be their normal @flowfuse.com address and will make use of single-sign on.",[239,29245,29247],{"id":29246},"internal-teams-and-contracted-revenue","Internal Teams and Contracted revenue",[19,29249,29250],{},"Any teams created by employees must have billing disabled to avoid polluting our\nrevenue tracking. This is achieved by placing the team into 'manual' billing mode.",[19,29252,29253],{},"For customers on contracted revenue, e.g. an annual deal made by an account\nexecutive, the team too is put into manual billing mode.",[504,29255,29256,29263],{},[147,29257,29258,29259,29262],{},"Raise a ",[46,29260,14617],{"href":29261},"\u002Fhandbook\u002Foperations\u002Fchange"," with the name of the team and a request to move it to manual billing mode",[147,29264,29265],{},"The request can be actioned by anyone with admin access to the platform. They will have access to admin-only\ntools on the Team Settings\u002FDanger page, including the option to 'Setup Manual Billing'. As part of this process,\nthey can pick what Team Type should be applied. Unless specifically requested otherwise, teams should always be\nupgrade to Enterprise to ensure they have full access to all features.",[164,29267,29268],{"id":19747},"Admin",[19,29270,29271,29272,29276],{},"Where their role requires it, an employee's account may be provided admin level access. This can be achieved by raising\nan ",[46,29273,29275],{"href":12778,"rel":29274},[108],"access request"," with details of the request.",[19,29278,29279],{},"A dedicated Admin account also exists - details are available in 1Password.",{"title":75,"searchDepth":76,"depth":76,"links":29281},[29282],{"id":21838,"depth":76,"text":21839,"children":29283},[29284,29285],{"id":29232,"depth":605,"text":29233},{"id":19747,"depth":605,"text":29268},{},"\u002Fhandbook\u002Foperations\u002Faccounts",{"title":29192,"description":29200},"handbook\u002Foperations\u002Faccounts","wzRQdmmJseYFhJ6q2cQ7YFCB9KB2tUNmCLNwQBaGGcM",{"id":29292,"title":17600,"body":29293,"description":29299,"extension":81,"meta":29603,"navGroup":83,"navOrder":83,"navTitle":17600,"navigation":84,"path":29604,"seo":29605,"stem":29606,"__hash__":29607},"handbook\u002Fhandbook\u002Foperations\u002Fbilling.md",{"type":7,"value":29294,"toc":29588},[29295,29297,29300,29304,29311,29314,29318,29321,29324,29328,29331,29361,29365,29398,29402,29407,29422,29427,29435,29439,29447,29457,29461,29464,29467,29470,29505,29508,29512,29515,29532,29536,29539,29543,29553,29557,29560,29563,29566,29573,29577],[10,29296,17600],{"id":17599},[19,29298,29299],{},"Subscriptions and their invoices are all stored in HubSpot, and Stripe is used for payment processing for contracted\nrevenue. For FlowFuse's montly self-service customers Stripe also tracks the subscription instead of HubSpot.\nTeam members will be given a login to the relevant Stripe and HubSpot dashboard as required for\ntheir role with an appropriate level of access.",[14,29301,29303],{"id":29302},"providing-support","Providing support",[19,29305,29306,29307,29310],{},"The main use of the Stripe dashboard will be to answer queries on a customers subscription, this should only be in relation to a ticket raised by the customer and we ",[2562,29308,29309],{},"must"," confirm that the customer team in question on the support ticket is the same one you are looking at it Stripe. Remember that the email address in Stripe may not match that of the FlowFuse user as this is a \"billing email\". You should use the team ID numbers in the metadata field to confirm.",[19,29312,29313],{},"The customer must first configure their billing details within their FlowFuse account for Stripe to recognize that the customer exists in the system.",[14,29315,29317],{"id":29316},"invoices","Invoices",[19,29319,29320],{},"Monthly subscriptions will be automatically generated in Stripe\nand charge customers based on their payment method filed with Stripe. Customers can access their invoices via the 'Stripe Customer Portal' link on their Team's billing page.",[19,29322,29323],{},"Annual subscriptions and invoices are managed in HubSpot, please see instructions below.",[164,29325,29327],{"id":29326},"creating-a-subscription","Creating a subscription",[19,29329,29330],{},"To generate a subscription, the corresponding deal and quote must first be in place in HubSpot.",[504,29332,29333,29336,29339,29342,29345,29348,29351,29354],{},[147,29334,29335],{},"Ensure the company details are updated, and include an address and country.",[147,29337,29338],{},"On the Deal page, find the Subscription section on the right-hand side, then click Add and Convert Deal to Subscription.",[147,29340,29341],{},"Change the dates, terms, products, discounts, contact, and company information if required (most will be correct, since it is pulling from the signed quote).",[147,29343,29344],{},"Under Invoice Settings, uncheck the box that automatically emails customers. There will still be an invoice created by HubSpot, but it won't be automatically send to the customer.",[147,29346,29347],{},"If additional information is needed on the invoice, you'll void the invoice and follow the steps mentioned under 'creating an invoice'.",[147,29349,29350],{},"Click the Create button on the top right.",[147,29352,29353],{},"If no additional information is needed on the invoice, directly send the automated invoice to the customer.",[147,29355,29356],{},[46,29357,29360],{"href":29358,"rel":29359},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1UtRYUv7Wjb7CjON4DnNgv-nD-Gt4Bytymgtv1y9eLWY\u002Fedit?usp=sharing",[108],"Structuring Subscriptions and Invoicing in HubSpot",[164,29362,29364],{"id":29363},"creating-an-invoice","Creating an invoice",[504,29366,29367,29370,29378,29381,29384,29387,29390],{},[147,29368,29369],{},"On the Deal page, find the Invoices section on the right-hand side, then click Create Blank Invoice.",[147,29371,29372,29373],{},"Add the corresponding products, start and end date per product line, discounts to reflect their first invoice as agreed in the order form.\n",[144,29374,29375],{},[147,29376,29377],{},"If they require a PO number, add the PO number on the Deal.",[147,29379,29380],{},"For customers outside of North America, add the customer's VAT idenfication number to the Invoice Comments section. This number can normally be found through Internet search or requesting from the customer directly.",[147,29382,29383],{},"Make sure both ACH and Credit Card options are checked for payment.",[147,29385,29386],{},"It will prompt to send the invoice automatically to the billing contact you designated, change date of send if needed.",[147,29388,29389],{},"Finalize this manual invoice, then void the automatically created one from the subscription conversion and send an email to accounting.",[147,29391,29392,29393],{},"If you need to void the invoice, send an email with the invoice number and reason to our accounting team through Slack for their administration.\n",[144,29394,29395],{},[147,29396,29397],{},"Make sure to void the invoices in all necessary places in HubSpot",[239,29399,29401],{"id":29400},"roles-and-responsibilities-csm-vs-accounting-in-accounts-receivable","Roles and Responsibilities: CSM vs. Accounting in Accounts Receivable",[19,29403,29404],{},[423,29405,29406],{},"CSM (Customer Success Manager):",[504,29408,29409,29412,29419],{},[147,29410,29411],{},"Payment Follow-up: Proactively monitor outstanding invoices and follow up with customers to ensure timely payment. If an invoice reaches 30 days past due, the CSM must flag the account as \"At Risk\" in HubSpot.",[147,29413,29414,29415,11585],{},"Banking Updates: Notify customers of any changes to FlowFuse’s banking information or payment instructions. In the event of an invoice dispute (e.g., wrong amount), the CSM is responsible for validating the claim against the contract before modifying the invoice and notifying Accounting (",[46,29416,29418],{"href":29417},"mailto:billing@flowfuse.com","billing@flowfuse.com",[147,29420,29421],{},"Proof of Payment: Collect payment confirmations (wire receipts, etc.) from customers and forward them to the Accounting team for reconciliation.",[19,29423,29424],{},[423,29425,29426],{},"Accounting:",[504,29428,29429,29432],{},[147,29430,29431],{},"Payment Application: Process and apply all received payments (Wire, ACH, Stripe) within HubSpot to ensure accurate balance records.",[147,29433,29434],{},"Stripe Reconciliation: Reconcile Stripe transactions and update the platform status to reflect completed payments.",[164,29436,29438],{"id":29437},"creating-a-ps-invoice","Creating a PS invoice",[19,29440,29441,29442,549],{},"For new customers an invoice should be generated in ",[46,29443,29446],{"href":29444,"rel":29445},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Fcontacts\u002F26586079\u002Fobjects\u002F0-53\u002Fviews\u002Fall\u002Flist",[108],"HubSpot's Invoice section",[504,29448,29449,29451,29454],{},[147,29450,29335],{},[147,29452,29453],{},"Ensure the customer provided a PO number if they require one.",[147,29455,29456],{},"Create a one-time invoice through HubSpot -- If the customer already is used to paying through Stripe, use best judgement when to switch them over",[14,29458,29460],{"id":29459},"adding-a-coupon","Adding a Coupon",[19,29462,29463],{},"From time to time we may wish to provide a user with some free access to\nthe managed FlowFuse platform. In this situation we will create a coupon code\nin Stripe which can be shared with the users. You should always use list price to calculate coupons.",[19,29465,29466],{},"Please note that only 1 coupon can be applied to an account at a time, so in order to add additional coupons you need to stack their amounts into one large coupon.",[19,29468,29469],{},"To create a couple on Stripe:",[504,29471,29472,29475,29478,29481,29484,29487,29490,29493,29496,29499,29502],{},[147,29473,29474],{},"Log into Stripe.",[147,29476,29477],{},"Use the top search bar to 'Create a coupon'.",[147,29479,29480],{},"Give it a name you will remember, ideally descrbing the reason for issuing the coupon.",[147,29482,29483],{},"Select fixed amount discount.",[147,29485,29486],{},"Don't add more credit than you need.",[147,29488,29489],{},"Set the Duration as the shortest amount of time this coupon is needed.",[147,29491,29492],{},"Select 'Limit the total number of times this coupon can be redeemed'.",[147,29494,29495],{},"Input 1 time.",[147,29497,29498],{},"Toggle 'Use customer-facing codes'.",[147,29500,29501],{},"Add a code which cannot be easily guessed, ideally a password type format, at least 8 characters with a mix of upper and lower case letters, and numbers.",[147,29503,29504],{},"Press 'Create coupon' which is bottom right of the page.",[19,29506,29507],{},"That coupon code can now be used when you are asked to provide payment card details.",[14,29509,29511],{"id":29510},"removing-a-coupon","Removing a Coupon",[19,29513,29514],{},"The preferred course of action is to create coupons that will expire on their own. However, in the event that a coupon needs to be removed manually, follow these steps.",[504,29516,29517,29520,29523,29526,29529],{},[147,29518,29519],{},"Find the customer's subscription.",[147,29521,29522],{},"Click 'Actions' in the upper-right corner.",[147,29524,29525],{},"Choose 'Update a Subscription'. The customer's subscription details are now open.",[147,29527,29528],{},"Locate the coupon and remove it.",[147,29530,29531],{},"Click 'Update Subscription' to save the changes.",[14,29533,29535],{"id":29534},"credits","Credits",[19,29537,29538],{},"Occasionally we may need to apply a credit to a customers account as a goodwill gesture to cover an issue they have experienced, this should be the exception and must be approved by either CTO or CEO. We will also check to see if the customer has received any previous credits on their account.",[14,29540,29542],{"id":29541},"refunds","Refunds",[19,29544,29545,29546,29548,29549,29552],{},"For customers using self service we will occasionally need issue a refund via Stripe. This can be done by looking the user up, normally via their email address, in the Stripe dashboard. On the customers page there is a section labelled ",[2562,29547,21267],{}," which will list recent payments. Select the 3 dots at the end of the last payment line and from the menu select ",[2562,29550,29551],{},"Refund",". This will present a dialog to adjust the value to be refunded (the last invoice for a closed team will show the remaining credit) and to initiate the refund. You will be prompted to re-enter your password to confirm the refund.",[14,29554,29556],{"id":29555},"failed-payments","Failed Payments",[19,29558,29559],{},"In the event that a scheduled payment does not go through, Stripe will retry collecting the payment four times within one week. After all retries fail, Stripe will automatically cancel the subscription and suspend all instances for the team.",[19,29561,29562],{},"When a payment does not go through, an email is sent from @flowfuse.com. This also applies to cards that are on file with an upcoming expiration date.",[19,29564,29565],{},"For customers paying an invoice, once a payment has been incomplete for 15 days, the invoice is marked as uncollectible.",[19,29567,29568,29569,549],{},"These settings are configurable by Stripe administrators, here: ",[46,29570,29571],{"href":29571,"rel":29572},"https:\u002F\u002Fdashboard.stripe.com\u002Fsettings\u002Fbilling\u002Fautomatic",[108],[164,29574,29576],{"id":29575},"escalation-process-past-due-invoices","Escalation Process (Past Due Invoices)",[144,29578,29579,29582,29585],{},[147,29580,29581],{},"1–15 Days Past Due: CSM sends a friendly check-in via email to the primary contact to confirm the invoice was received and scheduled for payment.",[147,29583,29584],{},"16–30 Days Past Due: CSM follows up with the customer’s Accounts Payable (AP) department directly. If no response, the CSM requests an internal update from the customer champion. (The invoice at this stage is marked as uncollectible)",[147,29586,29587],{},"31–45 Days Past Due: Executive Escalation: CSM alerts the #past-due Slack channel of the past due invoice to review with the Sales & Executive team and decide if we need to send a formal \"Overdue Notice\" and agree on service suspension.",{"title":75,"searchDepth":76,"depth":76,"links":29589},[29590,29591,29596,29597,29598,29599,29600],{"id":29302,"depth":76,"text":29303},{"id":29316,"depth":76,"text":29317,"children":29592},[29593,29594,29595],{"id":29326,"depth":605,"text":29327},{"id":29363,"depth":605,"text":29364},{"id":29437,"depth":605,"text":29438},{"id":29459,"depth":76,"text":29460},{"id":29510,"depth":76,"text":29511},{"id":29534,"depth":76,"text":29535},{"id":29541,"depth":76,"text":29542},{"id":29555,"depth":76,"text":29556,"children":29601},[29602],{"id":29575,"depth":605,"text":29576},{},"\u002Fhandbook\u002Foperations\u002Fbilling",{"title":17600,"description":29299},"handbook\u002Foperations\u002Fbilling","RD68yu7m5KsHiQgHDode5rXz4OPoNFCri3BglU-1t0o",{"id":29609,"title":29610,"body":29611,"description":29615,"extension":81,"meta":29895,"navGroup":83,"navOrder":83,"navTitle":29610,"navigation":84,"path":29896,"seo":29897,"stem":29898,"__hash__":29899},"handbook\u002Fhandbook\u002Foperations\u002Fceo-ops\u002Fcalendar-management.md","Calendar Management",{"type":7,"value":29612,"toc":29882},[29613,29616,29619,29622,29639,29643,29646,29695,29699,29702,29705,29708,29712,29715,29718,29722,29725,29728,29782,29786,29790,29805,29812,29815,29823,29828,29840,29843,29847,29850,29853,29858,29862,29865],[19,29614,29615],{},"This guide outlines how to manage the CEO’s calendar to ensure clarity,\nefficiency, and alignment with priorities. The goal is to maintain a predictable\nschedule, reduce unnecessary context switching, and support asynchronous work.",[19,29617,29618],{},"Time is a finite resource, treat it as such.",[14,29620,29621],{"id":15012},"Core principles",[144,29623,29624,29627,29630,29633,29636],{},[147,29625,29626],{},"Accuracy: The calendar must always reflect the CEO’s true availability.",[147,29628,29629],{},"Clarity: Every meeting requires a purpose, agenda, and supporting context.",[147,29631,29632],{},"Protection of time: Buffers, OOO blocks, and focus periods must be respected.",[147,29634,29635],{},"Prioritization: The calendar is optimized around the CEO’s highest-impact work.",[147,29637,29638],{},"Timezone-aware: All scheduling must account for working hours and current timezone.",[14,29640,29642],{"id":29641},"daily-workflow","Daily Workflow",[19,29644,29645],{},"Every day, audit the calendar and agenda for the next 7 days. For each event\nplease:",[144,29647,29648,29656,29664,29671,29674,29677,29680,29683,29686,29689,29692],{},[147,29649,29650,29651],{},"Ensure there's no overlapping meetings\n",[144,29652,29653],{},[147,29654,29655],{},"Or when there's overlap in events, it's clear which one the CEO participates in and which meeting won't be attended.",[147,29657,29658,29659,29663],{},"Block times, by creating events, to travel to meetings on-site (see ",[46,29660,29662],{"href":29661},"\u002Fhandbook\u002Foperations\u002Fceo-ops\u002Ftravel-booking\u002F","Travel Booking"," for CEO preferences)",[147,29665,19553,29666,29670],{},[46,29667,29669],{"href":29668},"#calendar-event-anatomy","event anatomy"," for meetings",[147,29672,29673],{},"Confirm hiring blocks, recurring syncs, and investor meetings are correctly placed.",[147,29675,29676],{},"Ensure all Out-of-Office (OOO) blocks remain intact.",[147,29678,29679],{},"Flag days that appear overloaded and raise concerns with the CEO.",[147,29681,29682],{},"Remove unused holds and outdated calendar blocks.",[147,29684,29685],{},"Check if excercise time are scheduled",[147,29687,29688],{},"Honor family time",[147,29690,29691],{},"Identify any sessions requiring CEO approval or rescheduling.",[147,29693,29694],{},"Check the week ahead for high-effort, investor-related, or time-sensitive commitments.",[164,29696,29698],{"id":29697},"exercise-blocks","Exercise blocks",[19,29700,29701],{},"To remain fit and sane, the CEO tries to excercise about 6 times a week. Generally\nWednesday has no excercise. Time requirements are different for the type of\nexcercise is scheduled. While altering the excercise type is advised for physical\nrecovery it's more important to excercise and have an opportunity to clear the\nmind and rethink problems during excercise.",[19,29703,29704],{},"Ensure that these blocks are scheduled, but note; are flexible blocks. Move them\naround during the day to make the most of the day, or change the type of excercise\nif we need more or less time in that day.",[19,29706,29707],{},"Excercise is a blocked calendar event, like all other events, to ensure it happens.",[164,29709,29711],{"id":29710},"personal-time","Personal time",[19,29713,29714],{},"The executive assistant is generally not involved in making personal appointments.\nPlease respect personal commitments made, eventhough these could be during meeting\nhours.",[19,29716,29717],{},"Occasional exceptions may be made for important calls.",[14,29719,29721],{"id":29720},"calendar-event-anatomy","Calendar Event Anatomy",[19,29723,29724],{},"When creating or updating events, always include the agenda in the calendar\ninvite to maintain clarity and preserve context. Add any relevant background\ninformation, and ensure the agenda is shared with all (external)\nparticipants.",[19,29726,29727],{},"Further, please check:",[504,29729,29730,29733,29747,29755,29763],{},[147,29731,29732],{},"Title and formatting of it",[147,29734,29735,29736],{},"Participants\n",[144,29737,29738,29741,29744],{},[147,29739,29740],{},"Where all participants invited?",[147,29742,29743],{},"Can participants make the meeting?",[147,29745,29746],{},"Mark optional guests as such.",[147,29748,29749,29750],{},"Timezone\n",[144,29751,29752],{},[147,29753,29754],{},"Put the timezone in the area the meeting is in, or the CEO lives in at the\ntime of the meeting.",[147,29756,29757,29758],{},"Meeting location: either a virtual room (Google Meet \u002F Huddle) or physical location\n",[144,29759,29760],{},[147,29761,29762],{},"Verify one of these is set, and for each participant it's clear where to be when.",[147,29764,29765,29766],{},"Agenda and (internal) tasks\n",[144,29767,29768,29771],{},[147,29769,29770],{},"Verify each meeting includes all context, a purpose, agenda, and relevant links.",[147,29772,29773,29777],{},[46,29774,29776],{"href":29775},"\u002Fhandbook\u002Fcompany\u002Fcommunication\u002F#no-agenda%2C-no-attenda","No agenda, no attenda",[144,29778,29779],{},[147,29780,29781],{},"If there's nothing to discuss, bail out of the meeting.",[14,29783,29785],{"id":29784},"meeting-booking-process","Meeting Booking Process",[164,29787,29789],{"id":29788},"hiring-booking","Hiring Booking",[19,29791,29792,29793,29796,29797,29800,29801,29804],{},"All applicant bookings ",[423,29794,29795],{},"must be done through Greenhouse"," to keep the hiring\nworkflow fully centralized.\nEnsure both the ",[423,29798,29799],{},"interviewer’s email"," and the ",[423,29802,29803],{},"candidate’s email"," are accurate before scheduling.",[19,29806,29807,29808,29811],{},"Always ",[423,29809,29810],{},"book the interview inside Greenhouse"," and send the meeting invite\nthrough Greenhouse so Google Calendar events and email notifications are\nautomatically generated for both parties.",[19,29813,29814],{},"When creating interview events, make sure the calendar title clearly indicates:",[144,29816,29817,29820],{},[147,29818,29819],{},"The position the candidate is applying for",[147,29821,29822],{},"The stage of the interview (simple numbering is fine: 1, 2, etc.)",[19,29824,29825],{},[423,29826,29827],{},"Event title examples:",[144,29829,29830,29835],{},[147,29831,29832],{},[542,29833,29834],{},"[Candidate] x [Interviewer] – Frontend Engineer – Stage 1",[147,29836,29837],{},[542,29838,29839],{},"[Candidate] x [Interviewer] – Customer Success Manager – Stage 2",[19,29841,29842],{},"This helps the CEO or next interviewer quickly understand the context and prepare.",[14,29844,29846],{"id":29845},"_11-request-link","1:1 Request Link",[19,29848,29849],{},"Internal meetings will be requested by the CEO through Slack. Open the calendar\nfor both participants, find a time when both are available, confirm availability\nwith each participant, and then proceed to book the meeting.",[19,29851,29852],{},"For external 1:1 meetings, a meeting booking link is available. These links don't\nchange, beware who these links are provided to.",[144,29854,29855],{},[147,29856,29857],{},"If a meeting schedule is received through email and not reflected in the calendar, notify the CEO of the incoming invite and confirm whether they will attend before adding to the calendar.",[14,29859,29861],{"id":29860},"rescheduling-protocol","Rescheduling Protocol",[19,29863,29864],{},"When a meeting needs to be moved:",[144,29866,29867,29870,29873,29876,29879],{},[147,29868,29869],{},"Notify all participants.",[147,29871,29872],{},"Provide alternative time options (in CEO timezone).",[147,29874,29875],{},"Ensure buffer times remain intact.",[147,29877,29878],{},"Investor or board meetings may not be moved without direct CEO approval.",[147,29880,29881],{},"OOO boundaries must be respected unless the matter is urgent or board-related.",{"title":75,"searchDepth":76,"depth":76,"links":29883},[29884,29885,29889,29890,29893,29894],{"id":15012,"depth":76,"text":29621},{"id":29641,"depth":76,"text":29642,"children":29886},[29887,29888],{"id":29697,"depth":605,"text":29698},{"id":29710,"depth":605,"text":29711},{"id":29720,"depth":76,"text":29721},{"id":29784,"depth":76,"text":29785,"children":29891},[29892],{"id":29788,"depth":605,"text":29789},{"id":29845,"depth":76,"text":29846},{"id":29860,"depth":76,"text":29861},{},"\u002Fhandbook\u002Foperations\u002Fceo-ops\u002Fcalendar-management",{"description":29615},"handbook\u002Foperations\u002Fceo-ops\u002Fcalendar-management","625qiHRQNNQWOoG6vqx98F6xyyi6mV1Gg3L4-8L0NdE",{"id":29901,"title":29902,"body":29903,"description":30127,"extension":81,"meta":30128,"navGroup":83,"navOrder":83,"navTitle":29902,"navigation":84,"path":30129,"seo":30130,"stem":30131,"__hash__":30132},"handbook\u002Fhandbook\u002Foperations\u002Fceo-ops\u002Finbox-management.md","Inbox Management",{"type":7,"value":29904,"toc":30115},[29905,29912,29916,29919,29933,29936,29940,29943,29946,29954,29999,30005,30009,30013,30016,30041,30044,30048,30051,30071,30074,30078,30081,30085,30088,30105,30109,30112],[19,29906,29907,29908,29911],{},"The goal of the CEO inbox is to operate at ",[423,29909,29910],{},"Inbox Zero",": every message is\neither acted on, delegated, archived, or deleted. The CEO inbox acts as a task\nlist until work is migrated to a dedicated task management system. The inbox has\nmultiple readers; sending emails is done by the CEO.",[14,29913,29915],{"id":29914},"inbox-messages","Inbox messages",[19,29917,29918],{},"If an email remains in the inbox, it requires attention from the company. This\nincludes:",[144,29920,29921,29924,29927,29930],{},[147,29922,29923],{},"Pending actions",[147,29925,29926],{},"Replies still needed",[147,29928,29929],{},"Follow-ups awaiting confirmation",[147,29931,29932],{},"Tasks not yet completed or delegated",[19,29934,29935],{},"An email in the inbox is considered an open item.",[14,29937,29939],{"id":29938},"message-processing","Message processing",[164,29941,29942],{"id":29641},"Daily workflow",[19,29944,29945],{},"Before the CEO starts work (5am when in US, or about 8am when in the EU) follow\nthe steps below to review the CEO's inbox. Repeat these steps halfway your\nworkday, and just before you sign off. This ensures urgent items are surfaced,\ndiscussions retain context, and all pending work remains visible.",[19,29947,29948,29949,29953],{},"The aim is to establish situational awareness and take immediate action when you\nhave high confidence on what the next step is (creating an event,\n",[46,29950,29952],{"href":29951},"#drafting-messages","staging a reply",", etc.).",[504,29955,29956,29979,29982,29985,29988,29996],{},[147,29957,29958,29959],{},"Check new messages and process each one:\n",[144,29960,29961,29973],{},[147,29962,29963,29964,29968,29969,549],{},"Determine whether to act, delegate, ",[46,29965,29967],{"href":29966},"#items-in-archive","archive",", or ",[46,29970,29972],{"href":29971},"#items-to-delete","delete",[147,29974,29975,29976,29978],{},"Cold outbound messages: ",[46,29977,29972],{"href":29971}," (not archive).",[147,29980,29981],{},"Identify urgent or time-sensitive items.",[147,29983,29984],{},"Note any messages that require a direct CEO response.",[147,29986,29987],{},"Identify items that can be delegated or require coordination.",[147,29989,29990,29991,29995],{},"Match inbox items with ",[46,29992,29994],{"href":29993},"\u002Fhandbook\u002Foperations\u002Fceo-ops\u002Ftask-managment","open tasks",", and keep tasks updated with context.",[147,29997,29998],{},"Prepare a short summary for the daily touch-base, including all emails that contain meeting requests.",[19,30000,30001,30004],{},[423,30002,30003],{},"Please note:"," When creating meetings, always include the agenda in the\ncalendar invite to maintain clarity and preserve context. Add any relevant\nbackground information, and ensure the agenda is shared with external\nparticipants.",[14,30006,30008],{"id":30007},"inbox-logic","Inbox logic",[164,30010,30012],{"id":30011},"items-in-archive","Items in Archive",[19,30014,30015],{},"An archived email is considered fully resolved. This means:",[144,30017,30018,30021,30024,30027,30030,30033],{},[147,30019,30020],{},"All required actions were completed",[147,30022,30023],{},"Replies were sent",[147,30025,30026],{},"Follow-ups were delegated or closed",[147,30028,30029],{},"No further attention is required",[147,30031,30032],{},"Meeting invites have been accepted",[147,30034,30035,30036,30040],{},"Receipts have been forwarded per the ",[46,30037,30039],{"href":30038},"\u002Fhandbook\u002Fpeopleops\u002Fexpenses\u002F#company-credit-card","Expenses"," handbook",[19,30042,30043],{},"Archiving reflects our commitment to maintaining a clear, trustworthy system of\nrecord. This practice enables the CEO inbox to operate with an Inbox Zero\nmindset, minimizing noise and ensuring focus remains on the work that matters.",[164,30045,30047],{"id":30046},"items-to-delete","Items to Delete",[19,30049,30050],{},"Some items don't need to be kept and will only create noise long term. These can\nbe deleted rather than archived. Examples include:",[144,30052,30053,30056,30059,30062,30065,30068],{},[147,30054,30055],{},"Cold outbound emails",[147,30057,30058],{},"Generic marketing or sales blasts",[147,30060,30061],{},"Auto-generated notifications with no relevance",[147,30063,30064],{},"Duplicate messages",[147,30066,30067],{},"System alerts that require no action",[147,30069,30070],{},"Thank-you confirmations or acknowledgments with no follow-up needed",[19,30072,30073],{},"Delete anything that provides no lasting value, does not inform future\ndecisions, and does not need to be part of the CEO's system of record.",[164,30075,30077],{"id":30076},"drafting-messages","Drafting Messages",[19,30079,30080],{},"While the CEO inbox is read by multiple people, sending of messages is done by\nthe CEO. Drafting replies or new messages, however, is a shared responsibility.\nIf an executive assistant feels over 80% certain what the CEO's reply would be,\nbe optimistic, and draft a reply.",[239,30082,30084],{"id":30083},"guidelines-for-drafting-messages","Guidelines for Drafting Messages",[19,30086,30087],{},"When drafting any email for CEO review:",[144,30089,30090,30093,30096,30099,30102],{},[147,30091,30092],{},"Use a short, clear, and appropriate subject line that reflects the purpose of the email.",[147,30094,30095],{},"Ensure all recipient email addresses are accurate and verified.",[147,30097,30098],{},"Keep the message concise, clear, and straight to the point.",[147,30100,30101],{},"Include proper links where necessary (documents, calendar invites, reference materials, etc.).",[147,30103,30104],{},"Maintain a professional and context-preserving tone consistent with FlowFuse standards.",[14,30106,30108],{"id":30107},"introductions","Introductions",[19,30110,30111],{},"When investors, advisors, or stakeholders leverage their network to introduce the\ncompany to a potential partner or client, they should always utilize the double\nopt-in method, which involves privately asking both parties for permission and\nproviding brief context before making the connection.",[19,30113,30114],{},"Once both sides agree, the stakeholder sends a concise introductory email\nhighlighting the value of the connection and formally handing over the reins.\nThe recipient (usually the company founder or representative) should reply\npromptly to take control of the thread. In this reply, it is standard\nprofessional etiquette to first thank the introducer and explicitly state that\nthey are being moved to BCC (e.g., \"Thanks so much for the introduction, Sarah!\nMoving you to BCC to spare your inbox.\"); this acknowledges the favor while\nfreeing the stakeholder from the ensuing back-and-forth.\nFinally, the response should pivot directly to the new contact by briefly\nreiterating the purpose of the connection and providing a clear, frictionless\ncall to action to book a meeting, typically by suggesting two or three specific\ntime slots or providing a direct calendar scheduling link.",{"title":75,"searchDepth":76,"depth":76,"links":30116},[30117,30118,30121,30126],{"id":29914,"depth":76,"text":29915},{"id":29938,"depth":76,"text":29939,"children":30119},[30120],{"id":29641,"depth":605,"text":29942},{"id":30007,"depth":76,"text":30008,"children":30122},[30123,30124,30125],{"id":30011,"depth":605,"text":30012},{"id":30046,"depth":605,"text":30047},{"id":30076,"depth":605,"text":30077},{"id":30107,"depth":76,"text":30108},"The goal of the CEO inbox is to operate at Inbox Zero: every message is\neither acted on, delegated, archived, or deleted. The CEO inbox acts as a task\nlist until work is migrated to a dedicated task management system. The inbox has\nmultiple readers; sending emails is done by the CEO.",{},"\u002Fhandbook\u002Foperations\u002Fceo-ops\u002Finbox-management",{"description":30127},"handbook\u002Foperations\u002Fceo-ops\u002Finbox-management","lwcHCkssUjJH7kKojTjThjFB1WGAAqZfJsKoRc4YEb0",{"id":30134,"title":75,"body":30135,"description":30139,"extension":81,"meta":30219,"navGroup":30220,"navOrder":83,"navTitle":30221,"navigation":84,"path":30222,"seo":30223,"stem":30224,"__hash__":30225},"handbook\u002Fhandbook\u002Foperations\u002Fceo-ops\u002Findex.md",{"type":7,"value":30136,"toc":30211},[30137,30140,30142,30145,30148,30150,30153,30178,30182,30185,30189,30192,30197,30201,30203],[19,30138,30139],{},"For CEO assistance, as personal assistant, there's a couple of high level tasks\nto be aware of and how these are handled.",[14,30141,8804],{"id":8939},[164,30143,12802],{"id":30144},"_1password",[19,30146,30147],{},"A shared 1Password vault is available to the CEO and the exec assistant. All passwords relevant to CEO operations should be stored there.",[14,30149,29642],{"id":29641},[19,30151,30152],{},"The P.A.s tasks is to run complete certain tasks every day. For some, even\nmultiple times a day.",[504,30154,30155,30160,30165,30171,30175],{},[147,30156,30157],{},[46,30158,29902],{"href":30159},"\u002Fhandbook\u002Foperations\u002Fceo-ops\u002Finbox-management\u002F",[147,30161,30162],{},[46,30163,29610],{"href":30164},"\u002Fhandbook\u002Foperations\u002Fceo-ops\u002Fcalendar-management\u002F",[147,30166,30167],{},[46,30168,30170],{"href":30169},"\u002Fhandbook\u002Foperations\u002Fceo-ops\u002Ftask-managment\u002F","CEO Task Management",[147,30172,30173],{},[46,30174,29662],{"href":29661},[147,30176,30177],{},"Other tasks to pick up (Peopleops, bizops, etc)",[164,30179,30181],{"id":30180},"ceo-meeting-hours","CEO meeting hours",[19,30183,30184],{},"While tasks might be scheduled outside the meeting hours, these meeting hours\nallow the CEO to also remain operationally productive. If a slot is available\nduring the meeting hours, it is generally bookable.",[239,30186,30188],{"id":30187},"pacific-time-zone","Pacific time zone",[19,30190,30191],{},"Core meeting hours:",[144,30193,30194],{},[147,30195,30196],{},"Monday–Friday, 05:00 - 14:00 PT.",[239,30198,30200],{"id":30199},"amsterdam-time-zone","Amsterdam time zone",[19,30202,30191],{},[144,30204,30205,30208],{},[147,30206,30207],{},"Monday-Friday, 09:00 - 17:00",[147,30209,30210],{},"Tuesday-Thursday, 19:30 - 21:30",{"title":75,"searchDepth":76,"depth":76,"links":30212},[30213,30216],{"id":8939,"depth":76,"text":8804,"children":30214},[30215],{"id":30144,"depth":605,"text":12802},{"id":29641,"depth":76,"text":29642,"children":30217},[30218],{"id":30180,"depth":605,"text":30181},{},"Internal Operations","CEO Ops","\u002Fhandbook\u002Foperations\u002Fceo-ops",{"description":30139},"handbook\u002Foperations\u002Fceo-ops\u002Findex","xxSfPn1cxdpJWbWyaKKWtaSj1nZw6Yb4TlYL-YNjHCs",{"id":30227,"title":30228,"body":30229,"description":30390,"extension":81,"meta":30391,"navGroup":83,"navOrder":83,"navTitle":30392,"navigation":84,"path":29993,"seo":30393,"stem":30394,"__hash__":30395},"handbook\u002Fhandbook\u002Foperations\u002Fceo-ops\u002Ftask-managment.md","Task Managment",{"type":7,"value":30230,"toc":30383},[30231,30238,30241,30245,30248,30265,30268,30270,30273,30319,30323,30326,30337,30341,30344,30347,30358,30362,30365],[19,30232,30233,30234,30237],{},"Tasks are the primary way to track work that needs to happen on behalf of the\nCEO. The goal is to keep all tasks ",[423,30235,30236],{},"self-contained",": every task should hold\nenough context that anyone picking it up can act on it without needing to dig\nthrough email threads or ask for background.",[19,30239,30240],{},"High-priority items must always be surfaced, even when the CEO is operating at\na higher strategic level and less involved in day-to-day execution.",[14,30242,30244],{"id":30243},"task-anatomy","Task anatomy",[19,30246,30247],{},"A well-formed task includes:",[144,30249,30250,30253,30256,30259,30262],{},[147,30251,30252],{},"A clear, action-oriented title",[147,30254,30255],{},"The relevant context — links to emails, documents, or calendar events",[147,30257,30258],{},"A due date or target timeline",[147,30260,30261],{},"An owner (the CEO, a delegate, or the executive assistant)",[147,30263,30264],{},"Any dependencies or blockers",[19,30266,30267],{},"When new context arrives (e.g. a reply in a related email thread), update the\ntask immediately. The task is the source of truth — not the inbox.",[14,30269,29942],{"id":29641},[19,30271,30272],{},"Each workday, review all open tasks. Run through the following checks:",[504,30274,30275,30285,30291,30297,30303,30313],{},[147,30276,30277,30280,30281,30284],{},[423,30278,30279],{},"Match inbox items to tasks."," Cross-reference the ",[46,30282,30283],{"href":30129},"inbox"," with open tasks. If an email relates to an existing task, add the context to that task and note any updates.",[147,30286,30287,30290],{},[423,30288,30289],{},"Check scheduled tasks."," For each task with a due date or scheduled start: is the timeline still realistic? Does anything need to be moved earlier or later?",[147,30292,30293,30296],{},[423,30294,30295],{},"Assess readiness."," Is the task ready to be executed today — or is it blocked? If blocked, note what is needed and by whom.",[147,30298,30299,30302],{},[423,30300,30301],{},"Identify delegation opportunities."," Which tasks can be handled without the CEO? Reassign where appropriate and update the owner on the task.",[147,30304,30305,30308,30309,30312],{},[423,30306,30307],{},"Flag tasks that need time blocked."," If a task requires focused CEO time (e.g. writing, reviewing, a decision), create a ",[46,30310,30311],{"href":29896},"calendar event"," for it and link the task in the event description.",[147,30314,30315,30318],{},[423,30316,30317],{},"Surface urgent or high-priority items."," Any task that is overdue, at risk, or requires an imminent CEO decision should be flagged in the daily touch-base.",[14,30320,30322],{"id":30321},"scheduling-and-timelines","Scheduling and timelines",[19,30324,30325],{},"A task on the list without a realistic timeline creates noise. When reviewing\ntasks:",[144,30327,30328,30331,30334],{},[147,30329,30330],{},"If a task has no due date, assign one or flag it for prioritization.",[147,30332,30333],{},"If a due date has passed without completion, either reschedule it with a new\ndate and a note explaining the delay, or escalate to the CEO.",[147,30335,30336],{},"Avoid piling too many tasks on a single day — spread work to match the CEO's\navailable focus time.",[14,30338,30340],{"id":30339},"delegating-tasks","Delegating tasks",[19,30342,30343],{},"Not every task requires the CEO. Before keeping a task assigned to the CEO,\nask: can this be handled fully or partially by someone else?",[19,30345,30346],{},"When delegating:",[144,30348,30349,30352,30355],{},[147,30350,30351],{},"Update the task owner.",[147,30353,30354],{},"Include enough context in the task that the delegate can act without a\nhandoff call.",[147,30356,30357],{},"Set a follow-up date to check on completion.",[14,30359,30361],{"id":30360},"blocking-time-on-the-calendar","Blocking time on the calendar",[19,30363,30364],{},"Some tasks require uninterrupted focus time. When a task needs a dedicated\nblock on the CEO's calendar:",[144,30366,30367,30374,30377,30380],{},[147,30368,30369,30370,30373],{},"Create a calendar event following the ",[46,30371,29669],{"href":30372},"\u002Fhandbook\u002Foperations\u002Fceo-ops\u002Fcalendar-management#calendar-event-anatomy"," guidelines.",[147,30375,30376],{},"Link the task directly in the event description so context is one click away.",[147,30378,30379],{},"Keep the block appropriately sized — avoid over- or under-allocating time.",[147,30381,30382],{},"If the task is completed before the block, release the time.",{"title":75,"searchDepth":76,"depth":76,"links":30384},[30385,30386,30387,30388,30389],{"id":30243,"depth":76,"text":30244},{"id":29641,"depth":76,"text":29942},{"id":30321,"depth":76,"text":30322},{"id":30339,"depth":76,"text":30340},{"id":30360,"depth":76,"text":30361},"Tasks are the primary way to track work that needs to happen on behalf of the\nCEO. The goal is to keep all tasks self-contained: every task should hold\nenough context that anyone picking it up can act on it without needing to dig\nthrough email threads or ask for background.",{},"Task Management",{"description":30390},"handbook\u002Foperations\u002Fceo-ops\u002Ftask-managment","oA68O0AXVV_yKIwD6BklyHqdIp4hcIPWGvGqgQxu75o",{"id":30397,"title":29662,"body":30398,"description":30605,"extension":81,"meta":30606,"navGroup":30221,"navOrder":83,"navTitle":29662,"navigation":84,"path":30607,"seo":30608,"stem":30609,"__hash__":30610},"handbook\u002Fhandbook\u002Foperations\u002Fceo-ops\u002Ftravel-booking.md",{"type":7,"value":30399,"toc":30590},[30400,30407,30411,30414,30425,30429,30437,30441,30460,30464,30472,30480,30484,30487,30526,30530,30533,30536,30540,30543,30546,30557,30561,30565,30572,30576,30579,30583],[19,30401,30402,30403,549],{},"This page captures the CEO's travel preferences to guide the E.A. when booking\nflights, trains, and hotels. General employee travel policies — including what\nFlowFuse covers for flights and accommodation — are documented in the\n",[46,30404,30406],{"href":30405},"\u002Fhandbook\u002Fpeopleops\u002Ftravel\u002F","Travel handbook",[14,30408,30410],{"id":30409},"flights","Flights",[19,30412,30413],{},"Flying and being away from home should be optimized in following order:",[504,30415,30416,30419,30422],{},[147,30417,30418],{},"Ability to get results on site",[147,30420,30421],{},"Limit disruptions to family routines",[147,30423,30424],{},"Reduce Jetlags for long-haul flights\nPrefer overnight flights on eastbound journeys and daytime flights westbound.",[164,30426,30428],{"id":30427},"seating","Seating",[144,30430,30431,30434],{},[147,30432,30433],{},"Aisle seat has the strong prefference. Window seat is ok, never a middle seat.",[147,30435,30436],{},"As close to the front of the cabin as possible.",[164,30438,30440],{"id":30439},"airline-preferences","Airline preferences",[144,30442,30443,30449,30454],{},[147,30444,30445,30448],{},[423,30446,30447],{},"Preferred",": KLM (top tier).",[147,30450,30451,30453],{},[423,30452,6420],{},": United Airlines — it's the US equivalent of Ryanair.",[147,30455,30456,30459],{},[423,30457,30458],{},"EU travel",": No Ryanair.",[164,30461,30463],{"id":30462},"upgrades","Upgrades",[19,30465,30466,30467,30471],{},"The company at this time doesn't pay for any upgrades, this means that for some\njourneys the CEO will order flights with upgrades and pay the difference back to\nthe company. See the ",[46,30468,30470],{"href":30469},"\u002Fhandbook\u002Fpeopleops\u002Fexpenses\u002F","Expenses handbook"," for how\nreimbursement works.",[144,30473,30474,30477],{},[147,30475,30476],{},"For flights over 3 hours, ensure extra leg-room is order.",[147,30478,30479],{},"For flights over 6 hours, discuss how expensive the upgrades to Premium economy or Business class are.",[14,30481,30483],{"id":30482},"loyalty-programs","Loyalty Programs",[19,30485,30486],{},"When booking, please ensure the credit to the right program is set up. Details are\nin 1Password.",[910,30488,30489,30502],{},[913,30490,30491],{},[916,30492,30493,30496,30499],{},[919,30494,30495],{},"Alliance",[919,30497,30498],{},"Airlines",[919,30500,30501],{},"Program",[930,30503,30504,30515],{},[916,30505,30506,30509,30512],{},[935,30507,30508],{},"SkyTeam",[935,30510,30511],{},"KLM, Delta, etc.",[935,30513,30514],{},"Flying Blue (KLM)",[916,30516,30517,30520,30523],{},[935,30518,30519],{},"Star Alliance",[935,30521,30522],{},"United, Turkish, etc.",[935,30524,30525],{},"Miles & More (United)",[14,30527,30529],{"id":30528},"trains","Trains",[19,30531,30532],{},"For countries where the trains are well organized, like most of the EU and parts\nof Asia, prefer the train to flying. Trains generally have better door-to-door\ntravel times, better internet, and less stress.",[19,30534,30535],{},"When booking a train, reserve a seat where possible (Deutsche Bahn!) — saves\ntime finding one on board and ensure this time can be used to work.",[14,30537,30539],{"id":30538},"hotels","Hotels",[19,30541,30542],{},"Location of the hotel relative to work engagements trump the follow list to optimize for.\nHowever, when there's options, please consider the preferences.",[19,30544,30545],{},"In order, optimize for:",[144,30547,30548,30551,30554],{},[147,30549,30550],{},"A quiet room. Request an interior-facing or courtyard room away from street noise.",[147,30552,30553],{},"A park or safe running route in the area is a plus.",[147,30555,30556],{},"Hotels that provide shaving products are preferred; traveling with shaving gear is inconvenient.",[14,30558,30560],{"id":30559},"booking-standards","Booking Standards",[164,30562,30564],{"id":30563},"escalation-threshold","Escalation Threshold",[19,30566,30567,30568,30571],{},"If a booking issue is unresolved after ",[423,30569,30570],{},"1 hour",", stop troubleshooting independently. Notify CEO immediately and hand off any relevant contact details (e.g., a direct phone number) so CEO can take action. Do not continue working the problem silently beyond this window.",[164,30573,30575],{"id":30574},"communication-standard","Communication Standard",[19,30577,30578],{},"Surface blockers to CEO in real time, do not wait for a scheduled call to flag that progress has stalled. A short Slack message is sufficient; the goal is no surprises.",[164,30580,30582],{"id":30581},"carrier-selection","Carrier Selection",[19,30584,30585,30586,30589],{},"Always book directly with the ",[423,30587,30588],{},"operating carrier"," the airline physically executing the flight. Avoid bookings where the ticketing carrier differs from the operating carrier (codeshares, partner airline tickets). When in doubt, confirm which carrier will be operating the flight before completing the booking.",{"title":75,"searchDepth":76,"depth":76,"links":30591},[30592,30597,30598,30599,30600],{"id":30409,"depth":76,"text":30410,"children":30593},[30594,30595,30596],{"id":30427,"depth":605,"text":30428},{"id":30439,"depth":605,"text":30440},{"id":30462,"depth":605,"text":30463},{"id":30482,"depth":76,"text":30483},{"id":30528,"depth":76,"text":30529},{"id":30538,"depth":76,"text":30539},{"id":30559,"depth":76,"text":30560,"children":30601},[30602,30603,30604],{"id":30563,"depth":605,"text":30564},{"id":30574,"depth":605,"text":30575},{"id":30581,"depth":605,"text":30582},"This page captures the CEO's travel preferences to guide the E.A. when booking\nflights, trains, and hotels. General employee travel policies — including what\nFlowFuse covers for flights and accommodation — are documented in the\nTravel handbook.",{},"\u002Fhandbook\u002Foperations\u002Fceo-ops\u002Ftravel-booking",{"description":30605},"handbook\u002Foperations\u002Fceo-ops\u002Ftravel-booking","_qcuHoYWx229yiqiLcaHpceA8HcovVgKHgk4t8AV6G0",{"id":30612,"title":9663,"body":30613,"description":30715,"extension":81,"meta":30716,"navGroup":83,"navOrder":83,"navTitle":30717,"navigation":84,"path":29261,"seo":30718,"stem":30719,"__hash__":30720},"handbook\u002Fhandbook\u002Foperations\u002Fchange.md",{"type":7,"value":30614,"toc":30713},[30615,30621,30624,30628,30631,30634,30656,30660,30663,30666,30675,30678,30682,30691,30695,30707],[19,30616,17816,30617,30620],{},[46,30618,30619],{"href":61},"secure operations policies"," we implement a Change Control process for certain operations in order to provide auditable, reviewable changes to key systems.",[19,30622,30623],{},"The following tasks should be completed under change control.",[10,30625,30627],{"id":30626},"flowfuse-cloud-change-control","FlowFuse Cloud Change Control",[19,30629,30630],{},"We track changes made to either the Staging or Production environments of FlowFuse Cloud\nthrough issues on the CloudProject repository.",[19,30632,30633],{},"The issues should record the nature of the change required, which environment it applies to\nand provide all of the necessary details to enact the change and to verify the change was successful.",[504,30635,30636,30644,30647,30650,30653],{},[147,30637,30638,30639,549],{},"Create a Change Request issue on the ",[46,30640,30643],{"href":30641,"rel":30642},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002FCloudProject\u002Fissues\u002Fnew?assignees=&labels=change-request&template=change-request.yml&title=Change%3A+",[108],"CloudProject repository",[147,30645,30646],{},"Obtain a review and approval to make the change from Engineering leadership",[147,30648,30649],{},"Assign the issue to the person making the change.",[147,30651,30652],{},"Once the change has been applied, verify the change is complete",[147,30654,30655],{},"Close the issue once verified",[10,30657,30659],{"id":30658},"flowfuse-dedicated-instance-change-control","FlowFuse Dedicated Instance Change Control",[19,30661,30662],{},"Changes to customer dedicated instances managed by FlowFuse should follow the same process\nas listed above for FlowFuse Cloud. The one difference is that the details of exactly which\ninstance the changes should be applied to.",[10,30664,3793],{"id":30665},"access-permission-request",[19,30667,30668,30669,30671,30672,549],{},"Where access is required to a system, a ",[542,30670,3793],{}," issue should be created in the ",[46,30673,5943],{"href":3791,"rel":30674},[108],[19,30676,30677],{},"Note: when onboarding\u002Foffboarding a new employee, this is managed via the Onboarding\u002FOffboarding change request.",[10,30679,30681],{"id":30680},"new-github-repository","New GitHub Repository",[19,30683,30684,30685,30671,30687,549],{},"If a new repository is required within our GitHub organisation, a ",[542,30686,13240],{},[46,30688,5943],{"href":30689,"rel":30690},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fadmin\u002Fissues\u002Fnew?template=new-repo.md",[108],[10,30692,30694],{"id":30693},"onboardingoffboarding","Onboarding\u002FOffboarding",[19,30696,30697,30698,685,30701,30671,30704,549],{},"When bringing a new employee into the company, or saying goodbye to an existing one, the appropriate ",[542,30699,30700],{},"Onboarding",[542,30702,30703],{},"Offboarding",[46,30705,5943],{"href":12778,"rel":30706},[108],[19,30708,30709,30710,13894],{},"More details around Onboarding is available in the ",[46,30711,30712],{"href":29213},"Hiring and Onboarding",{"title":75,"searchDepth":76,"depth":76,"links":30714},[],"As part of our secure operations policies we implement a Change Control process for certain operations in order to provide auditable, reviewable changes to key systems.",{},"Change Control",{"description":30715},"handbook\u002Foperations\u002Fchange","KthYju_erd8F85snjOpEk5A4ST14kAG11x8-h7DaCdg",{"id":30722,"title":30723,"body":30724,"description":30732,"extension":81,"meta":30985,"navGroup":83,"navOrder":83,"navTitle":30723,"navigation":84,"path":30986,"seo":30987,"stem":30988,"__hash__":30989},"handbook\u002Fhandbook\u002Foperations\u002Fcommission-payment.md","Commission Payment",{"type":7,"value":30725,"toc":30970},[30726,30730,30733,30737,30740,30747,30751,30754,30763,30771,30774,30803,30806,30815,30818,30821,30824,30827,30830,30833,30836,30840,30843,30846,30849,30853,30859,30865,30869,30872,30876,30887,30890,30894,30897,30900,30903,30906,30909,30913,30921,30925,30942,30946,30949,30960,30964],[10,30727,30728],{"id":75},[3234,30729],{"value":26099},[19,30731,30732],{},"FlowFuse has some employees that are compensated through a bonus or commission\nstructure. This structure reduces their base compensation, and rewards them when\ngoals are met and for taking a risk with their base compensation.",[14,30734,30736],{"id":30735},"processing-sales-commission","Processing Sales Commission",[19,30738,30739],{},"The company processes the commission payment for sales reps on a monthly basis\nto create a short feedback loop between closing and the reward. Currently that's\na very manual process, some day to be moved to a Node-RED workflow. Follow the\nnext steps to process the commission calculations and setup for payment.",[19,30741,30742,30743,549],{},"Note: all sales commissions are advances under the assumption customers pay the\ninvoice. FlowFuse might withhold commission payments or claw back payments if\npayments aren't made within 60 days after the\n",[46,30744,30746],{"href":30745},"\u002Fhandbook\u002Fsales\u002Fengagements\u002F#closing-a-deal","deal was closed",[164,30748,30750],{"id":30749},"calculating-team-commissions","Calculating Team Commissions",[19,30752,30753],{},"In the first week after the month has passed, commission payments are\ncalculated. Only closed won deals that have gone through the full process of\nclosing a deal are considered.",[19,30755,30756,30757,30762],{},"Download all the deals from hubspot by going to the\n",[46,30758,30761],{"href":30759,"rel":30760},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Fcontacts\u002F26586079\u002Fobjects\u002F0-3\u002Fviews\u002Fall\u002Flist",[108],"deal board",",\nconfirm that under the \"Pipelines\" list you are looking at the \"Sales Pipeline\" (not All Pipeline or other options),\nand add two filters:",[504,30764,30765,30768],{},[147,30766,30767],{},"Closed \"Last Month\"",[147,30769,30770],{},"Deal stage is \"All closed won\"; note: there is a different stage called Closed won. This is not that.",[19,30772,30773],{},"You need to have the following columns enabled:",[144,30775,30776,30779,30782,30785,30788,30791,30794,30797,30800],{},[147,30777,30778],{},"Deal Name",[147,30780,30781],{},"Deal Stage",[147,30783,30784],{},"Close Date",[147,30786,30787],{},"Deal owner",[147,30789,30790],{},"Amount",[147,30792,30793],{},"Is Closed Won",[147,30795,30796],{},"Deal Type",[147,30798,30799],{},"Annual recurring revenue",[147,30801,30802],{},"Annual contract value",[19,30804,30805],{},"When the deal board is updated with on the won deals of last month,\nclick \"Export View\" and export as CSV. Download this file\nto your machine.",[19,30807,30808,30809,30814],{},"Make a copy of\n",[46,30810,30813],{"href":30811,"rel":30812},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1fBq4g4W26M3k-uUOg5p4D2mYUyBPP8EbdtPLwuQ5RPI\u002F",[108],"this Google Sheet template","\nand import the CSV just downloaded from HubSpot into the \"All Deals\" sheet.\n\"File\" -> \"Import\" -> \"Upload\" -> \"Replace Current Sheet\".",[19,30816,30817],{},"Now \"All Deals\" have been listed, that adds all the deal closers to the \"Team\"\ntab. Fill out all the cells for team members with their yearly quota, etc.",[19,30819,30820],{},"You will need to visually inspect that the names to ensure that the mapping\nfrom team member to \"Deal Closers\" is correct. This may be a little bit more\ndifficult in months where not everyone closes a deal.",[19,30822,30823],{},"You will also need to update the template if any new sales folks have started\nin the last month.",[19,30825,30826],{},"Finally, go to the \"Commissions\" tab and select the employee to calculate the\npayment for.",[19,30828,30829],{},"Do not manually override any formulas in the commission tab, make sure that all calculations should be driven by the sheet's logic.",[19,30831,30832],{},"Copy the relevant details for the employee into an email and tell them what\ntheir performance was like and what commission they'll receive. It's important\nto get a written agreement to the commission number.",[19,30834,30835],{},"The email should be sent to the team member's personal email address so they retain access to the commission confirmation post-employment, as compensation records are considered personal. Make sure the CEO and the manager of the team member receiving the bonus both receive a copy by including them in the cc on the email.",[164,30837,30839],{"id":30838},"additional-notes-for-commission-processing","Additional Notes for Commission Processing",[19,30841,30842],{},"To avoid errors, copy and paste all numerical amounts directly from the spreadsheet whenever possible instead of typing them manually. Carefully double-check all details before saving the email as a draft. Once the draft is finalized and verified, inform the CEO that it is ready for review and sending.",[19,30844,30845],{},"After processing commission, update the Ops Plan spreadsheet (AE productivity tab) with the finalized commission details.",[19,30847,30848],{},"Add this task as a recurring calendar reminder on the first Monday or Tuesday of each month.",[164,30850,30852],{"id":30851},"email-template-that-should-be-used","Email template that should be used:",[19,30854,30855,30856,549],{},"Subject line: ",[542,30857,30858],{},"Commission for [Month] [YYYY]",[557,30860,30863],{"className":30861,"code":30862,"language":562},[560],"Dear [first_name],\n\nThis email is to confirm your estimated commissions for [Month and Year]. \nYour commission percentage for this quarter is [X]. \n\nIn the aforementioned period, you closed:\n\n- [Y] number of deals\n- [cARR] new Contracted ARR\n\nYour commission is USD $[XX].\n\nPlease remember: FlowFuse might withhold commission payments, or claw back\npayments if payments aren't made within 60 days after the quote is signed.\n\nPlease confirm the numbers in this email for the commission payment to be issued.\n\nBest,\n\n[Manager sending email]\n",[542,30864,30862],{"__ignoreMap":75},[164,30866,30868],{"id":30867},"update-sales-representative-productivity","Update Sales Representative Productivity",[19,30870,30871],{},"Once commission numbers are finalized for the month, rep productivity should be updated in the Ops Plan spreadsheet using the finalized data.",[164,30873,30875],{"id":30874},"wiring-the-money","Wiring the money",[19,30877,30878,30879,30882,30883,30886],{},"If the employee agrees to the commission, process the payment in Deel as USD payment.\nSign into Deel and browse to the profile of the commission receiver. For contractors\nthe commission is a ",[423,30880,30881],{},"Payment Adjustment",", and mark it as a ",[423,30884,30885],{},"commission"," payment not as a bonus.\nFor EOR team members, you'll need to add an item under \"Payments and Submissions\" manually.",[19,30888,30889],{},"In both cases be explicit about this being a bonus or commission for achievements for a certain\ntime period and what the achievement was.",[14,30891,30893],{"id":30892},"processing-non-commission-bonuses","Processing non-commission Bonuses",[19,30895,30896],{},"FlowFuse processes other bonuses on a quarterly basis. These bonuses are agreed upon between the employee and their manager.",[19,30898,30899],{},"At the start of each quarter, the employee should send an email to both their manager and the CEO outlining the agreed goals and bonus structure. The manager must reply to that email confirming the agreement. This ensures that all parties have written confirmation of the goals and conditions.",[19,30901,30902],{},"All goals must be achieved within the agreed quarter. Data or outcomes generated outside of the quarter will not be counted toward the results, even if reports need to be finalized or generated after the quarter has ended. Some reporting may require data collection after the quarter, but this does not extend the performance period.",[19,30904,30905],{},"When the goal has been fully achieved or the quarter has ended with results within the agreed performance threshold, the employee should send a follow-up email to both their manager and the CEO summarizing the achieved outcome.",[19,30907,30908],{},"The bonus payment will be included in the next payroll after the goal completion or report is submitted.",[14,30910,30912],{"id":30911},"processing-csm-commission","Processing CSM Commission",[19,30914,30915,30916,549],{},"Following the end of each quarter, the Operations team processes CSM commissions based on the performance metrics outlined in the ",[46,30917,30920],{"href":30918,"rel":30919},"https:\u002F\u002Fflowfuse.com\u002Fhandbook\u002Fsales\u002Fcustomer-success\u002F",[108],"CS Handbook",[164,30922,30924],{"id":30923},"payout-timeline-submission","Payout Timeline & Submission",[504,30926,30927,30936,30939],{},[147,30928,30929,30930,30935],{},"Submission: CSMs must complete and submit the Commission Calculation ",[46,30931,30934],{"href":30932,"rel":30933},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1QruPv_EmC3o0OPTipSxqKIWy0mMxMB8asWupdA8N_X8\u002Fedit?gid=1622984334#gid=1622984334",[108],"Template"," by the 5th business day of the new quarter. Duplicate the workbook and complete the necessary fields following the legend.",[147,30937,30938],{},"Validation: Operations will cross-reference the template against HubSpot data, specifically verifying the Effective Dates for all transactions.",[147,30940,30941],{},"Payment: Once validated, commissions are included in the next available payroll cycle.",[164,30943,30945],{"id":30944},"data-requirements","Data Requirements",[19,30947,30948],{},"The calculation template must include:",[144,30950,30951,30954,30957],{},[147,30952,30953],{},"Company Name & Transaction Amount (ARR Delta).",[147,30955,30956],{},"Notice Date: When the customer informed us of the change. Or when we actually closed won the change in HubSpot",[147,30958,30959],{},"Effective Date: When the change actually takes place in the contract.",[164,30961,30963],{"id":30962},"currency-of-payout","Currency of Payout",[19,30965,30966,30967],{},"Commission is paid in the currency specified in your initial employment contract (e.g., USD or EUR). ",[2562,30968,30969],{},"Note: Please confirm your specific payout currency with the Operations team during your first quarter.",{"title":75,"searchDepth":76,"depth":76,"links":30971},[30972,30979,30980],{"id":30735,"depth":76,"text":30736,"children":30973},[30974,30975,30976,30977,30978],{"id":30749,"depth":605,"text":30750},{"id":30838,"depth":605,"text":30839},{"id":30851,"depth":605,"text":30852},{"id":30867,"depth":605,"text":30868},{"id":30874,"depth":605,"text":30875},{"id":30892,"depth":76,"text":30893},{"id":30911,"depth":76,"text":30912,"children":30981},[30982,30983,30984],{"id":30923,"depth":605,"text":30924},{"id":30944,"depth":605,"text":30945},{"id":30962,"depth":605,"text":30963},{},"\u002Fhandbook\u002Foperations\u002Fcommission-payment",{"description":30732},"handbook\u002Foperations\u002Fcommission-payment","LV5JOE05j-VwEvmx4F6JM8-8GyWi2lywB7PWraQ5aIE",{"id":30991,"title":30992,"body":30993,"description":31000,"extension":81,"meta":31061,"navGroup":83,"navOrder":83,"navTitle":30992,"navigation":84,"path":31062,"seo":31063,"stem":31064,"__hash__":31065},"handbook\u002Fhandbook\u002Foperations\u002Fdata.md","Data at FlowFuse",{"type":7,"value":30994,"toc":31056},[30995,30998,31001,31005,31028,31032,31040,31044,31050],[10,30996,30992],{"id":30997},"data-at-flowfuse",[19,30999,31000],{},"At FlowFuse we're trying to leverage data obtained to make better decisions.",[164,31002,31004],{"id":31003},"data-sources","Data sources",[504,31006,31007,31010,31016],{},[147,31008,31009],{},"Telemetry from self-managed installations",[147,31011,31012],{},[46,31013,21508],{"href":31014,"rel":31015},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Freports-dashboard\u002F26586079\u002Fview\u002F106501027",[108],[147,31017,31018,31019,2040,31024],{},"Analytics - ",[46,31020,31023],{"href":31021,"rel":31022},"https:\u002F\u002Fanalytics.google.com\u002Fanalytics\u002Fweb\u002F#\u002F",[108],"Google Analytics",[46,31025,10383],{"href":31026,"rel":31027},"https:\u002F\u002Feu.posthog.com\u002Fproject\u002F2209",[108],[164,31029,31031],{"id":31030},"data-visualization","Data visualization",[19,31033,31034,31035,31039],{},"FlowFuse uses ",[46,31036,31038],{"href":21176,"rel":31037},[108],"our own Dashboard"," to obtain insights\nfrom the data.",[164,31041,31043],{"id":31042},"determine-which-instances-are-on-which-kubernetes-nodes","Determine which Instances are on which Kubernetes Nodes",[19,31045,31046,31047,11585],{},"From time to time it will be required to migrate Instances from certain Kubernetes nodes as we\nupgrade the cluster. The following command can be run by a cluster admin to get the list of\nInstances on a given node group (in this case the node group name is ",[542,31048,31049],{},"instance-t4g-static-23",[557,31051,31054],{"className":31052,"code":31053,"language":562},[560],"for node in $(kubectl get nodes -l alpha.eksctl.io\u002Fnodegroup-name=instance-t4g-static-23 --no-headers | cut -d \" \" -f1) ; do   kubectl get pods -n flowforge --no-headers --field-selector spec.nodeName=${node} -o json | jq '.items[].spec | .containers[].env[] | select(.name == \"FORGE_PROJECT_ID\") | .value' ; done\n",[542,31055,31053],{"__ignoreMap":75},{"title":75,"searchDepth":76,"depth":76,"links":31057},[31058,31059,31060],{"id":31003,"depth":605,"text":31004},{"id":31030,"depth":605,"text":31031},{"id":31042,"depth":605,"text":31043},{},"\u002Fhandbook\u002Foperations\u002Fdata",{"title":30992,"description":31000},"handbook\u002Foperations\u002Fdata","uTvTIpncslXr051zXvA5GqPgT2_n2fX1FUD3-BwdjGE",{"id":31067,"title":11765,"body":31068,"description":31074,"extension":81,"meta":31375,"navGroup":2817,"navOrder":83,"navTitle":11765,"navigation":84,"path":31376,"seo":31377,"stem":31378,"__hash__":31379},"handbook\u002Fhandbook\u002Foperations\u002Findex.md",{"type":7,"value":31069,"toc":31368},[31070,31072,31075,31106,31110,31113,31211,31215,31218,31223,31226,31237,31242,31246,31254,31256,31259,31261,31264,31267,31361],[10,31071,11765],{"id":67},[19,31073,31074],{},"This covers how we run our business and deliver service to our customers.",[144,31076,31077,31082,31086,31090,31094,31099],{},[147,31078,31079],{},[46,31080,31081],{"href":31062},"Data",[147,31083,31084],{},[46,31085,17600],{"href":29604},[147,31087,31088],{},[46,31089,29192],{"href":29287},[147,31091,31092],{},[46,31093,30717],{"href":29261},[147,31095,31096],{},[46,31097,31098],{"href":5609},"Vendors",[147,31100,31101],{},[46,31102,31105],{"href":31103,"rel":31104},"https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Ffolders\u002F1Q2UqEmusDIpBD4-4Km1eFksHaRkVzl7O?usp=drive_link",[108],"Insurance",[164,31107,31109],{"id":31108},"services-used-at-flowfuse","Services used at FlowFuse",[19,31111,31112],{},"At FlowFuse there's a couple of services that are vital to the operation of the\nbusiness. As a matter of having a plan before these services are taken offline\nor go bankrupt a table is maintained with where to go in case of service disruption.",[910,31114,31115,31130],{},[913,31116,31117],{},[916,31118,31119,31122,31124,31127],{},[919,31120,31121],{},"Primary service",[919,31123,6966],{},[919,31125,31126],{},"Backup Service",[919,31128,31129],{},"Do not use",[930,31131,31132,31145,31158,31170,31187,31200],{},[916,31133,31134,31136,31139,31142],{},[935,31135,825],{},[935,31137,31138],{},"Emphemeral internal communication",[935,31140,31141],{},"Google Spaces (in Gmail)",[935,31143,31144],{},"Email (only for legal items)",[916,31146,31147,31150,31153,31156],{},[935,31148,31149],{},"Slack Huddles",[935,31151,31152],{},"Internal face to face commuication",[935,31154,31155],{},"Google Meet",[935,31157,1125],{},[916,31159,31160,31163,31166,31168],{},[935,31161,31162],{},"Google Meet \u002F Zoom",[935,31164,31165],{},"External video calls",[935,31167,31162],{},[935,31169,1125],{},[916,31171,31172,31179,31182,31185],{},[935,31173,31174],{},[46,31175,31178],{"href":31176,"rel":31177},"https:\u002F\u002Fsupport.google.com\u002Fcalendar\u002Fanswer\u002F10729749?hl=en",[108],"Google Appointment Schedules",[935,31180,31181],{},"Scheduling meetings with external parties",[935,31183,31184],{},"Calendly",[935,31186,1125],{},[916,31188,31189,31192,31195,31198],{},[935,31190,31191],{},"AWS",[935,31193,31194],{},"Hosting for FlowFuse Cloud",[935,31196,31197],{},"?",[935,31199,1125],{},[916,31201,31202,31204,31207,31209],{},[935,31203,1047],{},[935,31205,31206],{},"Task management, planning and code development",[935,31208,1125],{},[935,31210,1125],{},[14,31212,31214],{"id":31213},"calendar-conventions","Calendar Conventions",[19,31216,31217],{},"To help team members quickly identify meeting types in calendar apps and menubar tools, use these emoji conventions when creating calendar entries:",[144,31219,31220],{},[147,31221,31222],{},"🎥 - Google Meet meetings (add this emoji to the event title for quick visual identification)",[19,31224,31225],{},"This convention is particularly helpful for:",[144,31227,31228,31231,31234],{},[147,31229,31230],{},"Quick visual scanning in menubar calendar apps",[147,31232,31233],{},"Distinguishing Google Meet from Slack Huddles at a glance",[147,31235,31236],{},"Identifying external-facing meetings quickly",[19,31238,31239,31241],{},[423,31240,8290],{}," For internal face-to-face discussions, prefer Slack Huddles in public channels over Google Meet when possible, as noted in the services table above.",[14,31243,31245],{"id":31244},"mail-handling","Mail Handling",[19,31247,31034,31248,31253],{},[46,31249,31252],{"href":31250,"rel":31251},"https:\u002F\u002Fwww.earthclassmail.com\u002F",[108],"Earthclass Mail"," to handle physical mail. Earthclass Mail receives all incoming mail on our behalf, scans it, and makes it available digitally. By default, physical mail is shredded after scanning — if a piece of mail needs to be retained physically, shredding must be cancelled before it occurs. Any checks that need to be cashed cannot be processed automatically and must be handled manually; the CEO typically takes care of this.",[14,31255,832],{"id":831},[19,31257,31258],{},"While there are a number of email aliases and google groups used throughout the organization, there is some activities across operations, people operations, and finance management that requires that activities be done with external parties. As a redundancy, rather than use a person's individual email (e.g. zj@), we use a google group to avoid the risk of information getting lost. For example, for some government filings, we use ops@.",[14,31260,1047],{"id":1046},[19,31262,31263],{},"We use GitHub for task management, planning and code development across the company. The following is a high-level guide to the core repositories.",[19,31265,31266],{},"The Engineering team maintains a large number of repositories related to individual components of the product.",[910,31268,31269,31281],{},[913,31270,31271],{},[916,31272,31273,31276,31278],{},[919,31274,31275],{},"Repository",[919,31277,928],{},[919,31279,31280],{},"Public\u002FPrivate",[930,31282,31283,31293,31302,31312,31322,31332,31341,31351],{},[916,31284,31285,31287,31290],{},[935,31286,13236],{},[935,31288,31289],{},"Company Admin tasks; onboarding\u002Foffboarding employees, access requests, release checklists",[935,31291,31292],{},"private",[916,31294,31295,31297,31300],{},[935,31296,7364],{},[935,31298,31299],{},"The FlowFuse Website, including handbook",[935,31301,4701],{},[916,31303,31304,31307,31310],{},[935,31305,31306],{},"FlowFuse\u002FCloudProject",[935,31308,31309],{},"Task management for FlowFuse Cloud platform",[935,31311,31292],{},[916,31313,31314,31317,31320],{},[935,31315,31316],{},"FlowFuse\u002Fmarketing",[935,31318,31319],{},"Task management for events and customer-specific work; webinars, artwork requests",[935,31321,31292],{},[916,31323,31324,31327,31330],{},[935,31325,31326],{},"FlowFuse\u002Fdev-env",[935,31328,31329],{},"FlowFuse development environment tooling",[935,31331,4701],{},[916,31333,31334,31336,31339],{},[935,31335,7357],{},[935,31337,31338],{},"The core product code repository",[935,31340,4701],{},[916,31342,31343,31346,31349],{},[935,31344,31345],{},"FlowFuse\u002Fproduct",[935,31347,31348],{},"A higher level planning and strategising repository for FlowFuse",[935,31350,31292],{},[916,31352,31353,31356,31359],{},[935,31354,31355],{},"FlowFuse\u002Fnode-red",[935,31357,31358],{},"A planning repository for upstream Node-RED tasks",[935,31360,31292],{},[19,31362,31363,31364,31367],{},"To create a new repository, first open an issue in the ",[46,31365,29268],{"href":5941,"rel":31366},[108]," repository using the New Repository checklist. This ensures all required security controls are applied.",{"title":75,"searchDepth":76,"depth":76,"links":31369},[31370,31371,31372,31373,31374],{"id":31108,"depth":605,"text":31109},{"id":31213,"depth":76,"text":31214},{"id":31244,"depth":76,"text":31245},{"id":831,"depth":76,"text":832},{"id":1046,"depth":76,"text":1047},{},"\u002Fhandbook\u002Foperations",{"title":11765,"description":31074},"handbook\u002Foperations\u002Findex","PMdP26EcxX-oDAcR4U5zrvk7wFlS9Ep4O4cVgmvUNz0",{"id":31381,"title":31382,"body":31383,"description":31421,"extension":81,"meta":31422,"navGroup":83,"navOrder":83,"navTitle":31382,"navigation":84,"path":31423,"seo":31424,"stem":31425,"__hash__":31426},"handbook\u002Fhandbook\u002Foperations\u002Fsignatures.md","Signatures",{"type":7,"value":31384,"toc":31418},[31385,31388,31396,31400,31403],[10,31386,31382],{"id":31387},"signatures",[19,31389,31390,31391,549],{},"FlowFuse uses HubSpot for generating quotes, and requesting the signatures on\nthem. For other legal documents we're using\n",[46,31392,31395],{"href":31393,"rel":31394},"https:\u002F\u002Fsupport.google.com\u002Fdocs\u002Fanswer\u002F12315692?hl=en",[108],"Google eSignatures",[14,31397,31399],{"id":31398},"signature-circulation-requirements","Signature Circulation Requirements",[19,31401,31402],{},"Before requesting a signature on any document, the following must be in place and\ncommunicated.",[504,31404,31405,31408,31411],{},[147,31406,31407],{},"Context: What is the document being signed, and why are we signing this agreement? What does it support?",[147,31409,31410],{},"Confirm all required signatures upfront — both internal and counterparty.",[147,31412,31413,31414,31417],{},"The document must be fully filled out before circulation. No placeholder text (e.g., ",[2403,31415,31416],{},"INSERT DESCRIPTION",") or incomplete fields should remain.",{"title":75,"searchDepth":76,"depth":76,"links":31419},[31420],{"id":31398,"depth":76,"text":31399},"FlowFuse uses HubSpot for generating quotes, and requesting the signatures on\nthem. For other legal documents we're using\nGoogle eSignatures.",{},"\u002Fhandbook\u002Foperations\u002Fsignatures",{"title":31382,"description":31421},"handbook\u002Foperations\u002Fsignatures","uvANeVQPnJI5P2oBntrqKMTGxbopfQbw1utg5m2zRZ8",{"id":31428,"title":31098,"body":31429,"description":31569,"extension":81,"meta":31570,"navGroup":83,"navOrder":83,"navTitle":31098,"navigation":84,"path":5609,"seo":31571,"stem":31572,"__hash__":31573},"handbook\u002Fhandbook\u002Foperations\u002Fvendors.md",{"type":7,"value":31430,"toc":31562},[31431,31434,31441,31448,31455,31462,31466,31472,31474,31480,31483,31500,31504,31510,31534,31537,31541,31548,31551,31555,31559],[10,31432,31098],{"id":31433},"vendors",[19,31435,31436,31437,31440],{},"In accordance with our\n",[46,31438,31439],{"href":5549},"Third-Party Risk Management policy","\nall vendors should be reviewed to ensure their suitability for handling FlowFuse\ndata.",[19,31442,31443,31444,549],{},"A list of approved vendors is available internally\n",[46,31445,2011],{"href":31446,"rel":31447},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1ro77wy0cRK6gpzVv_iq4vpdmbdMq61X5-tTwI_F3hXM\u002Fedit?usp=sharing",[108],[19,31449,31450,31451,549],{},"For new vendors not on the list, get CEO approval and add any signed agreements\nto\n",[46,31452,22714],{"href":31453,"rel":31454},"https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Fu\u002F0\u002Ffolders\u002F1r6u1MNHZFAM1uhHmX-XtQs_bRcFVxQ25",[108],[19,31456,31457,31458,549],{},"For the legal procedures and terms for our own customers, please\n",[46,31459,31461],{"href":31460},"\u002Fhandbook\u002Fsales\u002Flegal\u002F","read the corresponding handbook page",[164,31463,31465],{"id":31464},"vendor-selection-and-evaluation","Vendor Selection and Evaluation",[19,31467,31468,31469,31471],{},"When selecting a new vendor, ensure that the choice is made deliberately to address the specific and immediate needs of each department. Conduct appropriate interviews and record them using Fathom to share with relevant stakeholders and interested parties involved in the decision-making process. Review the contract and budget and share your thoughts and opinion with the CEO. The final vendor selection will be approved by the CEO or CTO.\nAfter the first 21 days of collaboration, request a performance review to evaluate alignment and satisfaction. FlowFuse encourages agile termination of contracts if the vendor’s performance or results do not meet expectations, allowing quick adjustments when necessary.",[9379,31470],{},"\nTeam members are also encouraged to seek external support whenever workload or capacity issues might slow down company progress, as a qualified vendor can help accelerate results and maintain growth momentum.",[164,31473,8792],{"id":8867},[19,31475,31476,31477,31479],{},"To initiate the approval and payment process for invoices, suppliers should send\na PDF of the invoice to ",[46,31478,29418],{"href":29417}," from a company email. FlowFuse pays\ninvoices 30 days after filing unless specifically agreed otherwise prior to\nfiling the invoice.",[19,31481,31482],{},"The invoice should include:",[144,31484,31485,31488,31491,31494,31497],{},[147,31486,31487],{},"Vendor Invoice ID",[147,31489,31490],{},"Vendor address",[147,31492,31493],{},"Vendor contact details",[147,31495,31496],{},"Details of services rendered",[147,31498,31499],{},"Amount of dollars due",[239,31501,31503],{"id":31502},"internal-processing-approval-accounts-payables","Internal Processing & Approval (Accounts Payables)",[19,31505,31506,31507,31509],{},"Once an invoice is received at ",[46,31508,29418],{"href":29417},", the following workflow is initiated:",[504,31511,31512,31518,31521,31524,31531],{},[147,31513,31514,31515,31517],{},"Forwarding: The ",[542,31516,29418],{}," Google Group routes all incoming bills the Zeni team.",[147,31519,31520],{},"System Entry: The accounting team, Zeni, enters the invoice into Bill.com and invites the vendor to the BILL network to facilitate secure e-payments.",[147,31522,31523],{},"Verification: Accounting will contact the vendor directly if any additional information is required to process the payment.",[147,31525,31526,31527,31530],{},"Approval Chain: Each invoice requires a minimum of ",[423,31528,31529],{},"two approvers",", with the CEO (ZJ) serving as the final approver. Noubar will serve as the first approver. We can also get approval from the invoice's DRI if the person is outside the scope of the BizOps team.",[147,31532,31533],{},"Payment Release: The accounting team reviews Bill.com at least twice per week to release payments for all fully approved invoices.",[19,31535,31536],{},"When verifications are finalised, typically within a couple of business days,\nthe vendor will receive an email with details and next steps.",[239,31538,31540],{"id":31539},"fraud-prevention","Fraud prevention",[19,31542,31543,31544,31547],{},"We do not diverge from this process regardless of the urgency of the payment. We\nwill ",[2562,31545,31546],{},"never"," make a payment request through direct email or text messages.",[19,31549,31550],{},"If in any doubt, reach out through Slack and request a call to validate.",[14,31552,31554],{"id":31553},"legal-review-process","Legal Review Process",[164,31556,31558],{"id":31557},"governing-law-requirements","Governing Law Requirements",[19,31560,31561],{},"FlowFuse only accepts governing law to be in Delaware, California, or Dutch\n(Amsterdam) for any vendor agreement. We cannot agree to agreements with\ngoverning law in other jurisdictions.",{"title":75,"searchDepth":76,"depth":76,"links":31563},[31564,31565,31566],{"id":31464,"depth":605,"text":31465},{"id":8867,"depth":605,"text":8792},{"id":31553,"depth":76,"text":31554,"children":31567},[31568],{"id":31557,"depth":605,"text":31558},"In accordance with our\nThird-Party Risk Management policy\nall vendors should be reviewed to ensure their suitability for handling FlowFuse\ndata.",{},{"title":31098,"description":31569},"handbook\u002Foperations\u002Fvendors","tlkV5QD6e67XrhIlhc52OsiK9EMspvO-ElIpbD2_Zn0",{"id":31575,"title":31576,"body":31577,"description":31584,"extension":81,"meta":31773,"navGroup":83,"navOrder":83,"navTitle":31576,"navigation":84,"path":31774,"seo":31775,"stem":31776,"__hash__":31777},"handbook\u002Fhandbook\u002Fpeopleops\u002Fcoaching-plans.md","Coaching Plans",{"type":7,"value":31578,"toc":31763},[31579,31582,31585,31589,31592,31595,31599,31602,31625,31629,31632,31670,31674,31678,31681,31698,31702,31705,31734,31738,31741],[10,31580,31576],{"id":31581},"coaching-plans",[19,31583,31584],{},"A Coaching Plan is a tool managers use to support a team member’s development.\nIt helps them grow in their role through a structured plan, built and completed together with their manager’s mentorship.\nmembers, helping them grow in their role and improve their performance through a\nCoaching Plans can be used proactively for career development and role growth, and they can also be used to address performance concerns with support and clear expectations.",[14,31586,31588],{"id":31587},"purpose-and-philosophy","Purpose and Philosophy",[19,31590,31591],{},"Coaching Plans are built on the belief that all team members have potential for growth — in their job skills, alignment with company values, or execution of their role.",[19,31593,31594],{},"Coaching Plans are a positive, intentional investment. They are used to help team members prepare for career advancement, role changes, and evolving expectations as the company grows.",[14,31596,31598],{"id":31597},"when-to-use-a-coaching-plan","When to Use a Coaching Plan",[19,31600,31601],{},"A Coaching Plan may be initiated by a team member’s manager when:",[144,31603,31604,31607,31610,31613,31616,31619,31622],{},[147,31605,31606],{},"A team member shows potential for growth or expanded impact",[147,31608,31609],{},"The growth area is specific, observable, and coachable",[147,31611,31612],{},"Expectations need to be clarified and supported through structured development",[147,31614,31615],{},"One or more performance areas would benefit from focused improvement",[147,31617,31618],{},"A team member expresses interest in expanding responsibilities or transitioning to a role with additional scope",[147,31620,31621],{},"A team member is preparing for future role progression",[147,31623,31624],{},"A manager observes behaviors or skills that could benefit from intentional development",[14,31626,31628],{"id":31627},"coaching-plan-characteristics","Coaching Plan Characteristics",[19,31630,31631],{},"FlowFuse's Coaching Plans are designed to be:",[144,31633,31634,31640,31646,31652,31658,31664],{},[147,31635,31636,31639],{},[423,31637,31638],{},"Development-focused"," — Centered on growth and learning, whether proactive or in response to changing expectations",[147,31641,31642,31645],{},[423,31643,31644],{},"Supportive"," — Emphasize mentorship, guidance, and partnership from managers",[147,31647,31648,31651],{},[423,31649,31650],{},"Opportunity-based"," — Frame areas for improvement as opportunities for growth and skill-building",[147,31653,31654,31657],{},[423,31655,31656],{},"Growth-oriented"," — Aimed at expanding capabilities and supporting team members in meeting and exceeding role expectations",[147,31659,31660,31663],{},[423,31661,31662],{},"Collaborative"," — Team members actively participate in goal-setting and development activities",[147,31665,31666,31669],{},[423,31667,31668],{},"Clear and structured"," — Shared expectations with documented goals, milestones, and review points",[14,31671,31673],{"id":31672},"creating-a-coaching-plan","Creating a Coaching Plan",[164,31675,31677],{"id":31676},"identify-the-opportunity","Identify the Opportunity",[19,31679,31680],{},"Managers should:",[144,31682,31683,31686,31689,31692,31695],{},[147,31684,31685],{},"Observe areas where the employee could grow or develop",[147,31687,31688],{},"Consider the employee's career aspirations and interests",[147,31690,31691],{},"Assess skills that would benefit from strengthening",[147,31693,31694],{},"Identify opportunities that align with business needs",[147,31696,31697],{},"Discuss and align with their own manager on the growth opportunity",[164,31699,31701],{"id":31700},"develop-the-coaching-plan","Develop the Coaching Plan",[19,31703,31704],{},"The coaching plan should include:",[504,31706,31707,31710,31713,31722,31725,31728,31731],{},[147,31708,31709],{},"Development area: What skill or such is to be improved.",[147,31711,31712],{},"Current state: Managers' assesment of the current level.",[147,31714,31715,31716,31721],{},"Goal state: A ",[46,31717,31720],{"href":31718,"rel":31719},"https:\u002F\u002Fwww.atlassian.com\u002Fblog\u002Fproductivity\u002Fhow-to-write-smart-goals",[108],"SMART goal"," goal to collectly aim for. This is the result that you're aiming for.",[147,31723,31724],{},"Activities: What actions, training, experience are to be done to achieve the\nset goal. This is the inputs to the goal. Team members should be active participants in trying to craft the activities. A manager's proposal in the coaching plan is just a proposal.",[147,31726,31727],{},"Timeline: Start and end date, typically 30 days apart.",[147,31729,31730],{},"Support assets: What tools, meeting, or manager assitances will be provided",[147,31732,31733],{},"Update Cadence: How manager and team member align on progress, and how to\ncollectively achieve goals.",[14,31735,31737],{"id":31736},"documentation-and-tracking","Documentation and Tracking",[19,31739,31740],{},"While coaching plans are less formal than PIPs, it's important to:",[144,31742,31743,31746,31749,31752,31755],{},[147,31744,31745],{},"Document the coaching plan and goals",[147,31747,31748],{},"Track progress and development activities",[147,31750,31751],{},"Note feedback and adjustments made",[147,31753,31754],{},"Record achievements and milestones",[147,31756,31757,31758],{},"Maintain confidentiality while sharing appropriate updates with HR and\nmanagement\n",[144,31759,31760],{},[147,31761,31762],{},"Coaching Plans are only shared with the team member, their manager, the manager’s manager, and HR",{"title":75,"searchDepth":76,"depth":76,"links":31764},[31765,31766,31767,31768,31772],{"id":31587,"depth":76,"text":31588},{"id":31597,"depth":76,"text":31598},{"id":31627,"depth":76,"text":31628},{"id":31672,"depth":76,"text":31673,"children":31769},[31770,31771],{"id":31676,"depth":605,"text":31677},{"id":31700,"depth":605,"text":31701},{"id":31736,"depth":76,"text":31737},{},"\u002Fhandbook\u002Fpeopleops\u002Fcoaching-plans",{"title":31576,"description":31584},"handbook\u002Fpeopleops\u002Fcoaching-plans","ngxkOIL8tIKhnIuXqgmt0tWyACWO37wL-ZLZ3O2W3iM",{"id":31779,"title":49,"body":31780,"description":31787,"extension":81,"meta":31983,"navGroup":83,"navOrder":83,"navTitle":49,"navigation":84,"path":31984,"seo":31985,"stem":31986,"__hash__":31987},"handbook\u002Fhandbook\u002Fpeopleops\u002Fcode-of-conduct.md",{"type":7,"value":31781,"toc":31973},[31782,31785,31788,31791,31794,31796,31799,31802,31813,31816,31819,31823,31826,31832,31861,31865,31868,31885,31889,31892,31936,31940,31943,31946,31949,31953,31956,31959,31963,31966,31970],[10,31783,49],{"id":31784},"code-of-conduct",[19,31786,31787],{},"The primary goal of our Code of Conduct is to foster inclusive, collaborative,\nand safe working conditions for all FlowFuse staff and community members who\nparticipate in our open core projects.",[19,31789,31790],{},"As such, FlowFuse is committed to providing a friendly, safe and welcoming\nenvironment regardless of gender, sexual orientation, ability, ethnicity,\nsocioeconomic status, or religion (or lack thereof).",[19,31792,31793],{},"This code of conduct outlines our expectations for the FlowFuse community, as\nwell as the consequences for unacceptable behavior.",[14,31795,3419],{"id":3418},[19,31797,31798],{},"The Code of Conduct applies to all FlowFuse staff. This includes employees\nand contractors at every seniority level. It also applies to contributors who\nengage with our open core projects.",[19,31800,31801],{},"The Code of Conduct is to be upheld during all professional functions and events,\nincluding but not limited to:",[144,31803,31804,31807,31810],{},[147,31805,31806],{},"Working remotely and communicating on FlowFuse resources with other team members.",[147,31808,31809],{},"At FlowFuse-related extracurricular activities and events.",[147,31811,31812],{},"While attending conferences and other professional events on behalf of FlowFuse.",[19,31814,31815],{},"We expect all FlowFuse staff to abide by this Code of Conduct in all business\nmatters -- online and in-person -- as well as in all one-on-one communications\nwith customers and staff pertaining to FlowFuse business.",[19,31817,31818],{},"This Code of Conduct also applies to unacceptable behavior occurring outside the\nscope of business activities when such behavior has the potential to adversely\naffect the safety and well-being of FlowFuse staff and clients.",[14,31820,31822],{"id":31821},"culture-and-belonging","Culture and Belonging",[19,31824,31825],{},"A supplemental goal of this Code of Conduct is to increase open community by\nencouraging participants to recognize the relationships between our actions and\ntheir effects within FlowFuse culture.",[19,31827,31828,31829,31831],{},"At the core are our ",[46,31830,6733],{"href":7304},". This Code of Conduct\nmakes explicit how we should behave whilst uphold our values.",[144,31833,31834,31842,31850],{},[147,31835,31836,31841],{},[46,31837,31839],{"href":31838},"\u002Fhandbook\u002Fcompany\u002Fvalues#%F0%9F%91%A5-collaborative-community",[423,31840,7177],{},". We strive\nto be a company that welcomes and supports people of all backgrounds and identities.",[147,31843,31844,31849],{},[46,31845,31847],{"href":31846},"\u002Fhandbook\u002Fcompany\u002Fvalues#%F0%9F%A4%9D-customer-empathy",[423,31848,7219],{},". Your work at\nFlowFuse will be used by other people, and you in turn will depend on the\nwork of others. Any decision you take will affect users and colleagues, and\nyou should take those consequences into account when making decisions.",[147,31851,31852,31855,31856,549],{},[423,31853,31854],{},"Be respectful",". Not all of us will agree all the time, but disagreement is\nno excuse for poor behavior and poor manners. We expect everyone to remain polite\nand to keep conversations healthy and constructive. We do not allow our frustrations\nto turn in ",[46,31857,31860],{"href":31858,"rel":31859},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAd_hominem",[108],"personal attacks",[14,31862,31864],{"id":31863},"acceptable-and-expected-behavior","Acceptable and Expected Behavior",[19,31866,31867],{},"The following behaviors are expected and requested of all FlowFuse staff:",[144,31869,31870,31873,31876,31879,31882],{},[147,31871,31872],{},"Participate in an authentic and active way. In doing so, you contribute to the\nhealth and longevity of FlowFuse.",[147,31874,31875],{},"Exercise consideration and respect in your speech and actions at all times.",[147,31877,31878],{},"Attempt collaboration before conflict.",[147,31880,31881],{},"Refrain from demeaning, discriminatory, or harassing behavior and speech.",[147,31883,31884],{},"Be mindful of your surroundings and of your fellow participants. Alert FlowFuse\nleaders if you notice a dangerous situation, someone in distress, or violations\nof this Code of Conduct, even if they seem inconsequential.",[14,31886,31888],{"id":31887},"unacceptable-behavior","Unacceptable Behavior",[19,31890,31891],{},"The following behaviors are considered harassment and are unacceptable within our community:",[144,31893,31894,31897,31906,31909,31912,31915,31918,31921,31924,31927,31930,31933],{},[147,31895,31896],{},"Violence, threats of violence, or violent language directed against another person.",[147,31898,31899,31900,31905],{},"Sexist, racist, homophobic, transphobic, ",[46,31901,31904],{"href":31902,"rel":31903},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FAbleism",[108],"ableist"," or otherwise discriminatory jokes and language.",[147,31907,31908],{},"Posting or displaying sexually explicit or violent material.",[147,31910,31911],{},"Posting or threatening to post other people’s personally identifying information (\"doxing\").",[147,31913,31914],{},"Personal insults, particularly those related to gender, sexual orientation, race, religion, or disability.",[147,31916,31917],{},"Inappropriate photography or recording.",[147,31919,31920],{},"Inappropriate physical contact. You should have someone’s consent before touching them in any manner.",[147,31922,31923],{},"Unwelcome sexual attention. This includes sexualized comments or jokes; inappropriate touching, groping, and unwelcome sexual advances.",[147,31925,31926],{},"Deliberate intimidation, stalking or following (online or in person).",[147,31928,31929],{},"Advocating for, or encouraging, any of the above behavior.",[147,31931,31932],{},"Repeated harassment of others. In general, if someone asks you to stop, then stop.",[147,31934,31935],{},"Other conduct which could reasonably be considered inappropriate in a professional setting.",[14,31937,31939],{"id":31938},"consequences-of-unacceptable-behavior","Consequences of Unacceptable Behavior",[19,31941,31942],{},"Unacceptable behavior from any FlowFuse staff, including those with\ndecision-making authority, will not be tolerated.",[19,31944,31945],{},"Anyone asked to stop unacceptable behavior is expected to comply immediately.",[19,31947,31948],{},"If a staff member engages in unacceptable behavior, FlowFuse leadership may take\nany action deemed appropriate, up to and including suspension or termination.",[14,31950,31952],{"id":31951},"reporting-violations","Reporting Violations",[19,31954,31955],{},"If you are subject to or witness unacceptable behavior, or have any other concerns,\nplease notify an appropriate member of FlowFuse leadership (Peopleops manager, CTO, and\u002For CEO) as soon as possible.",[19,31957,31958],{},"It is a violation of this policy to retaliate against any person making a\ncomplaint of Unacceptable Behavior or against any person participating in the\ninvestigation of (including testifying as a witness to) any such allegation. Any\nretaliation or intimidation may be subject to punitive action up to and including\ntermination.",[14,31960,31962],{"id":31961},"disciplinary-action","Disciplinary Action",[19,31964,31965],{},"Employees who violate this policy may face disciplinary consequences in proportion\nto their violation. FlowFuse management will determine how serious an employee's\noffense is and take the appropriate action.",[14,31967,31969],{"id":31968},"responsibility","Responsibility",[19,31971,31972],{},"Everyone has a responsibility to ensure this policy is followed.",{"title":75,"searchDepth":76,"depth":76,"links":31974},[31975,31976,31977,31978,31979,31980,31981,31982],{"id":3418,"depth":76,"text":3419},{"id":31821,"depth":76,"text":31822},{"id":31863,"depth":76,"text":31864},{"id":31887,"depth":76,"text":31888},{"id":31938,"depth":76,"text":31939},{"id":31951,"depth":76,"text":31952},{"id":31961,"depth":76,"text":31962},{"id":31968,"depth":76,"text":31969},{},"\u002Fhandbook\u002Fpeopleops\u002Fcode-of-conduct",{"title":49,"description":31787},"handbook\u002Fpeopleops\u002Fcode-of-conduct","eszIuG8ZpOLrcglxUUoy0e6PFoieyuOp-SVFBbE1sn4",{"id":31989,"title":31990,"body":31991,"description":31998,"extension":81,"meta":32653,"navGroup":83,"navOrder":83,"navTitle":31990,"navigation":84,"path":32654,"seo":32655,"stem":32656,"__hash__":32657},"handbook\u002Fhandbook\u002Fpeopleops\u002Fcompensation.md","Compensation",{"type":7,"value":31992,"toc":32626},[31993,31996,31999,32003,32006,32010,32024,32028,32034,32038,32041,32044,32048,32051,32072,32076,32083,32087,32090,32094,32097,32105,32109,32112,32115,32118,32121,32125,32128,32131,32135,32154,32158,32166,32168,32176,32179,32182,32186,32189,32193,32202,32205,32214,32218,32221,32225,32228,32239,32242,32245,32274,32277,32280,32283,32287,32290,32294,32303,32306,32310,32313,32330,32333,32337,32340,32344,32370,32374,32377,32382,32385,32387,32395,32399,32438,32442,32445,32458,32461,32465,32468,32492,32495,32499,32505,32508,32512,32515,32519,32522,32527,32541,32544,32555,32560,32574,32577,32591,32595,32598,32600,32611,32615],[10,31994,31990],{"id":31995},"compensation",[19,31997,31998],{},"FlowFuse provides a comprehensive compensation package with base salary, augmented\ndepending on the role with stock options (equity), and\u002For performance bonus structure.\nFlowFuse aims to be competitive with similar companies. Factors like\ncompany stage, market conditions, role, and level influence salary\ndetermination during the hiring process. FlowFuse typically pays in the local\ncurrency, unless there are explicit discussions stating otherwise, taking\ninto account location and company context.",[14,32000,32002],{"id":32001},"pay-frequency","Pay Frequency",[19,32004,32005],{},"FlowFuse uses different pay schedules depending on the employee's region. This ensures payroll, taxation, and benefits deductions follow local standards.",[164,32007,32009],{"id":32008},"united-states","United States",[19,32011,32012,32013,32016,32017,32020,32021,549],{},"Employees in the United States are paid ",[423,32014,32015],{},"semi-monthly",", meaning ",[423,32018,32019],{},"twice per month"," for a total of ",[423,32022,32023],{},"24 pay periods per year",[164,32025,32027],{"id":32026},"europe","Europe",[19,32029,32030,32031,32033],{},"Employees in Europe are paid ",[423,32032,27768],{},", on a schedule aligned with local payroll requirements.",[164,32035,32037],{"id":32036},"canada","Canada",[19,32039,32040],{},"Pay frequency for Canadian employees is managed through Deel and may vary depending on provincial requirements. Team members in Canada should refer to Deel for the most current information.",[19,32042,32043],{},"All payroll deductions—including taxes, retirement contributions, and voluntary benefit premiums—are taken according to the employee’s regional pay schedule.",[14,32045,32047],{"id":32046},"compensation-increase-cycle","Compensation Increase Cycle",[19,32049,32050],{},"FlowFuse follows a single-point increase cycle for salary adjustments. These\nadjustments take place once a year, aligning with the company's budgeting\nand planning process. When determining compensation changes, FlowFuse considers\nthree factors: performance, inflation, and market standards. These factors are\ntaken into account together to make decisions about adjusting employee compensation.",[19,32052,32053,32054,32059,32060,32065,32066,32071],{},"For sales functions, these conversations are held once a year with each individual.\nThese conversations include quota negotiation, base and performance compensation.\nThe ",[46,32055,32058],{"href":32056,"rel":32057},"https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1gAf6DuFnd20Ny_Ere5WnB6u63feB1lEE\u002Fview",[108],"compensation plan"," is\naccompanied by an ",[46,32061,32064],{"href":32062,"rel":32063},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1kYxnzVR0lh0GIZ1FHsPjq3QvggxN0hiVGLgwZMMKHo0\u002Fedit",[108],"exhibit",".\nWhen the terms of the next years compensation plan are signed they should be put\ninto this ",[46,32067,32070],{"href":32068,"rel":32069},"https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Ffolders\u002F1yVryN4Kir7n8TLbM_cEttXb_rDC2ORn2",[108],"private Google Drive directory"," by managment.",[14,32073,32075],{"id":32074},"sales-commissions","Sales Commissions",[19,32077,32078,32079,549],{},"FlowFuse pays out commissions to sales reps, the terms of which are to be found\nin the ",[46,32080,32082],{"href":32081},"\u002Fhandbook\u002Fsales\u002Fcommission-plan\u002F","Sales Compensation Plan",[14,32084,32086],{"id":32085},"performance-review","Performance Review",[19,32088,32089],{},"Performance reviews will be carried out annually, in September. Any employee or\ncontractor who has completed more than six months of service at FlowFuse is eligible\nto participate in the performance review process.",[164,32091,32093],{"id":32092},"adjustment","Adjustment",[19,32095,32096],{},"FlowFuse can choose to increase compensation based on varying situations:",[144,32098,32099,32102],{},[147,32100,32101],{},"Past year performance, as evaluated during the September performance review.",[147,32103,32104],{},"Market positioning, aiming to align compensation within the 50-75th percentile range for companies at the same stage.",[164,32106,32108],{"id":32107},"equity","Equity",[19,32110,32111],{},"FlowFuse intends to offers equity for key roles. The level of stock compensation\ncan vary based on when an employee joined, their performance, and the variables\nthat decide salary. Equity is offered as stock options, which upon\nexecution will be transformed in the underlying stock. Stock compensation is\nawarded on a 5-year monthly vesting schedule with a 1 year cliff.",[19,32113,32114],{},"Employees might be taxed personally when accepting or executing stock options.\nFlowFuse does not provide any advice on financial decisions for employees. For\ndetails on the Stock Options like the 409A valuation or otherwise, please consult\nCarta.",[19,32116,32117],{},"FlowFuse offers ISOs to US employees. Contractors and other forms of employment\nfor US personnel will receive NSOs. Non-US employees will also receive NSOs.",[19,32119,32120],{},"Equity grants are subject to board approval. Grants are presented to the Board\nfour times per year at official Board Meetings.",[164,32122,32124],{"id":32123},"benefits","Benefits",[19,32126,32127],{},"The final component of our total compensation is the benefits package. While our intention is to keep these benefits as location independent as possible and practical, we also strive to provide all employees with a decent standard of living. Therefore, in certain cases, we may offer location-dependent benefits to ensure that appropriate standards are met.",[19,32129,32130],{},"Please note that the benefits offered may be subject to change during your employment. These changes may occur due to evolving legislation, fluctuations in the costs associated with providing the benefits, situations where the costs outweigh the benefits for team members, or other relevant reasons. We aim to ensure that any adjustments made to the benefits package are made with careful consideration and the best interests of our employees in mind.",[239,32132,32134],{"id":32133},"for-everyone","For everyone",[144,32136,32137,32143,32148],{},[147,32138,32139],{},[46,32140,32142],{"href":32141},"\u002Fhandbook\u002Fpeopleops\u002Fleave#holiday-policy","Unlimited PTO",[147,32144,32145],{},[46,32146,19524],{"href":32147},"\u002Fhandbook\u002Fengineering\u002Freleases\u002Fprocess#launch-lunch",[147,32149,32150],{},[46,32151,32153],{"href":32152},"#dinner-bonus","Dinner Bonus",[1019,32155,32157],{"id":32156},"_1password-family","1Password Family",[19,32159,32160,32161,549],{},"As business users of 1Password each team member gets a free 1Password Family\naccount. You'll need to link your family, see also ",[46,32162,32165],{"href":32163,"rel":32164},"https:\u002F\u002Fsupport.1password.com\u002Flink-family\u002F",[108],"their docs",[1019,32167,19524],{"id":20041},[19,32169,32170,32171,32175],{},"A lunch is organized to celebrate every release, and team members participating in a social Zoom call are encouraged to order a meal. You can ",[46,32172,32174],{"href":32173},"\u002Fhandbook\u002Fpeopleops\u002Fexpenses","expense"," the lunch, up to a maximum of $25, and all reimbursements must be processed through Deel.",[1019,32177,32153],{"id":32178},"dinner-bonus",[19,32180,32181],{},"The company wide goal for closed business per month is set by the CEO. When the\ngrowth target is met a $100 bonus is awarded to be expensed for a dinner out.\nThe bonus is awarded per quarter.",[239,32183,32185],{"id":32184},"retirement-or-pension-plans","Retirement or Pension Plans",[19,32187,32188],{},"Retirement and Pension plans are country-specific. If you have questions during the interview process, reach out to the hiring manager for clarity.",[1019,32190,32192],{"id":32191},"us-401k","US - 401K",[19,32194,32195,32196,32201],{},"At FlowFuse, we offer a 401K through ",[46,32197,32200],{"href":32198,"rel":32199},"http:\u002F\u002Fhumaninterest.com\u002F",[108],"Human Interest",". There is not a company match at this time.",[19,32203,32204],{},"All new team members are auto-enrolled at 8% of their salary, with a 1% increase per year. Of course, team members can also make changes by logging into their human interest dashboard.",[19,32206,32207,32208,32213],{},"Human Interest also provides ",[46,32209,32212],{"href":32210,"rel":32211},"https:\u002F\u002Fhumaninterest.com\u002Fsolutions\u002Fkickstart\u002F",[108],"a reward of 3% cash back to team members who enroll in their 401K plan and meet certain criteria",". We do not administer this benefit. Questions should be addressed to Human Interest.",[239,32215,32217],{"id":32216},"health-care","Health Care",[19,32219,32220],{},"FlowFuse offers a health care package for all employees in the United States, Canada, and India. Reach out to the hiring manager if you believe your country should be\nadded to the list, especially when you're considering a job offer at FlowFuse.",[1019,32222,32224],{"id":32223},"us","US",[19,32226,32227],{},"For employees located in the United States, FlowFuse offers health insurance coverage through Deel; since this changes regularly, please see Deel for accurate information.",[19,32229,32230,32231,32234,32235,32238],{},"Health insurance benefits do not begin immediately. Employees have until ",[423,32232,32233],{},"mid-month of the month they start"," to enroll, with coverage beginning on the ",[423,32236,32237],{},"1st of the following month",". For example, if you start on March 2nd and enroll by mid-March, coverage will begin April 1st.",[19,32240,32241],{},"We commit to offering at least one medical plan, one dental plan, and one vision plan with 100% coverage for team members. We also subsidize some level of coverage for dependants, as well, but specifics are tied to plan details.",[19,32243,32244],{},"In our health benefits for US employees, we offer:",[144,32246,32247,32250,32253,32256,32259,32262,32265,32268,32271],{},[147,32248,32249],{},"multiple medical plan options, including an HSA-compatible plan",[147,32251,32252],{},"multiple dental plan options",[147,32254,32255],{},"multiple vision plan options",[147,32257,32258],{},"short-term disability options",[147,32260,32261],{},"long-term disability options",[147,32263,32264],{},"employee FSA",[147,32266,32267],{},"employee HSA",[147,32269,32270],{},"commuter benefits",[147,32272,32273],{},"EAP",[19,32275,32276],{},"For US Employees who choose not to participate in the health insurance provided by FlowFuse have the option to opt out. This can be done by declining coverage during the enrollment process on the platform. It is important to note that if an employee decides to opt out, they must have alternative qualified coverage to ensure compliance with the ACA (Affordable Care Act).",[1019,32278,32037],{"id":32279},"canada-1",[19,32281,32282],{},"For employees located in Canada, FlowFuse hires through Deel as Employer of Record (EOR), with benefits that may change over time. Canadian employees currently receive Manulife Bronze health coverage and a Wealthsimple pension; for the most up-to-date details, please refer to Deel.",[10,32284,32286],{"id":32285},"bonus-processing","Bonus Processing",[19,32288,32289],{},"FlowFuse compensates some employees through bonuses tied to role-specific goals, quarterly MBOs (Management By Objectives), or company performance. Bonus eligibility and maximum amounts are defined in the employee’s contract. This guide outlines how bonuses are tracked, reviewed, approved, and paid.",[14,32291,32293],{"id":32292},"bonus-tracking","Bonus Tracking",[19,32295,32296,32297,32302],{},"All active bonuses must be listed in the ",[46,32298,32301],{"href":32299,"rel":32300},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1VI3iaqkOtLGYKJ_dNshjjyYJPCxDg3pnNJT46X1URFI\u002Fedit?usp=sharing",[108],"Employee Bonus Tracker"," (🔒 access only for BizzOps team members).",[19,32304,32305],{},"Each manager is responsible for ensuring the BizzOps team is informed timely, before the start of a quarter, what bonus triggers and MBOs are in play, clear, measurable, and time-bound. Explicit approval from the CEO is required for each bonus structure.",[14,32307,32309],{"id":32308},"quarterly-period-based-bonuses-mbos","Quarterly & Period-Based Bonuses (MBOs)",[19,32311,32312],{},"For bonuses tied to quarterly or period-based MBOs:",[144,32314,32315,32318,32321,32324,32327],{},[147,32316,32317],{},"MBOs must be defined at the start of the period.",[147,32319,32320],{},"MBOs must be communicated in writing (email is sufficient) between:",[147,32322,32323],{},"The manager",[147,32325,32326],{},"The employee",[147,32328,32329],{},"The CEO (cc)",[19,32331,32332],{},"Bonuses will not be processed if MBOs are defined or changed after the period has started.",[164,32334,32336],{"id":32335},"bonus-calculation-mbo-attainment","Bonus Calculation (MBO Attainment)",[19,32338,32339],{},"When an MBO is defined as a growth target, attainment is measured based on the proportion of growth achieved, not the absolute value reached.",[239,32341,32343],{"id":32342},"definitions","Definitions",[144,32345,32346,32352,32358,32364],{},[147,32347,32348,32351],{},[423,32349,32350],{},"Baseline",": the starting value at the beginning of the period",[147,32353,32354,32357],{},[423,32355,32356],{},"Target",": the expected value after applying the growth objective",[147,32359,32360,32363],{},[423,32361,32362],{},"Required growth",": target minus baseline",[147,32365,32366,32369],{},[423,32367,32368],{},"Achieved growth",": actual result minus baseline",[239,32371,32373],{"id":32372},"calculation","Calculation",[19,32375,32376],{},"Attainment is calculated as:",[2672,32378,32379],{},[19,32380,32381],{},"Attainment = achieved growth ÷ required growth",[19,32383,32384],{},"The baseline is only used to determine the growth and is not included in the attainment itself.",[239,32386,8002],{"id":7882},[144,32388,32389,32392],{},[147,32390,32391],{},"Being close to the target in absolute terms does not imply high attainment",[147,32393,32394],{},"All growth-based MBOs follow this approach unless explicitly defined otherwise",[14,32396,32398],{"id":32397},"bonus-review-end-of-period","Bonus Review (End of Period)",[144,32400,32401,32421,32424],{},[147,32402,32403,32404],{},"Within 5 business days after period end, the employee sends a final MBO summary to the Manager covering:\n",[144,32405,32406,32409,32412,32415,32418],{},[147,32407,32408],{},"Bonus period (quarter or dates)",[147,32410,32411],{},"Agreed MBO goals",[147,32413,32414],{},"Results achieved per goal",[147,32416,32417],{},"Completion status",[147,32419,32420],{},"Supporting artifacts or links",[147,32422,32423],{},"The Manager sends reminders at period end and 2 business days before the deadline, if needed.",[147,32425,32426,32427],{},"The Manager reviews the submission and confirms:\n",[144,32428,32429,32432,32435],{},[147,32430,32431],{},"Thresholds met",[147,32433,32434],{},"Attainment percentage (if applicable)",[147,32436,32437],{},"Final bonus amount for CEO approval",[14,32439,32441],{"id":32440},"ceo-confirmation","CEO Confirmation",[19,32443,32444],{},"Before any bonus is processed, the manager must email the CEO confirming:",[144,32446,32447,32449,32452,32455],{},[147,32448,250],{},[147,32450,32451],{},"Performance period",[147,32453,32454],{},"Results achieved",[147,32456,32457],{},"Final bonus amount",[19,32459,32460],{},"Only results achieved within the defined period are considered, even if reporting is finalized later.",[14,32462,32464],{"id":32463},"processing-the-bonus-payment","Processing the Bonus Payment",[19,32466,32467],{},"Once approved in writing by the CEO:",[144,32469,32470,32481],{},[147,32471,32472,32473],{},"Process the bonus in Deel:",[144,32474,32475,32478],{},[147,32476,32477],{},"Contractors: add as Bonuses and Incentives",[147,32479,32480],{},"EOR employees: add under Payments and Submissions",[147,32482,32483,32484],{},"Clearly label the payment as a Bonus, including:",[144,32485,32486,32489],{},[147,32487,32488],{},"Performance period (e.g. “Q4 2025”)",[147,32490,32491],{},"Reason for payment (e.g. “Quarterly MBO attainment”)",[19,32493,32494],{},"Bonuses are paid in the next payroll cycle after approval.",[14,32496,32498],{"id":32497},"template-email-bonus-confirmation-to-employee","Template Email — Bonus Confirmation to Employee",[557,32500,32503],{"className":32501,"code":32502,"language":562},[560],"Subject: Bonus Confirmation for [Period]\n\nHi [Name],\n\nThis email is to confirm your bonus outcome for [Quarter \u002F Year \u002F Period], based on the goals agreed at the start of the period.\n\nSummary:\nAgreed goals \u002F MBOs: [brief summary]\nResults achieved: [brief summary]\nBonus attainment: [percentage or threshold met]\n\nBased on this, your approved bonus for this period is [currency + amount]. Please reply to confirm so we can include this in the next payroll run.\n\nBest,\n[Manager Name]\n",[542,32504,32502],{"__ignoreMap":75},[19,32506,32507],{},"CC: CEO",[14,32509,32511],{"id":32510},"controls-reminders","Controls & Reminders",[19,32513,32514],{},"Bonus processing is strictly time-bound. Managers are responsible for ensuring bonuses are defined, reviewed, approved, and submitted on time.",[164,32516,32518],{"id":32517},"mandatory-manager-reminders","Mandatory Manager Reminders",[19,32520,32521],{},"Managers must set two recurring calendar reminders for each quarter.",[504,32523,32524],{},[147,32525,32526],{},"Start of Quarter — Define MBOs\nDue dates:",[144,32528,32529,32532,32535,32538],{},[147,32530,32531],{},"Q1: January 1",[147,32533,32534],{},"Q2: April 1",[147,32536,32537],{},"Q3: July 1",[147,32539,32540],{},"Q4: October 1",[19,32542,32543],{},"Purpose:",[144,32545,32546,32549,32552],{},[147,32547,32548],{},"Define bonus MBOs",[147,32550,32551],{},"Email employee + CEO",[147,32553,32554],{},"Update Bonus Tracker",[504,32556,32557],{"start":76},[147,32558,32559],{},"End of Quarter — Review & Process Bonuses\nPerformance period ends:",[144,32561,32562,32565,32568,32571],{},[147,32563,32564],{},"Q1: March 31",[147,32566,32567],{},"Q2: June 30",[147,32569,32570],{},"Q3: September 30",[147,32572,32573],{},"Q4: December 31",[19,32575,32576],{},"Review start dates (mandatory):",[144,32578,32579,32582,32585,32588],{},[147,32580,32581],{},"Q1: April 1",[147,32583,32584],{},"Q2: July 1",[147,32586,32587],{},"Q3: October 1",[147,32589,32590],{},"Q4: January 1",[164,32592,32594],{"id":32593},"review-approval-window","Review & approval window",[19,32596,32597],{},"Bonus review and CEO approval must be completed within 5 business days from the review start date.",[19,32599,32543],{},[144,32601,32602,32605,32608],{},[147,32603,32604],{},"Review results",[147,32606,32607],{},"Confirm final bonus amount",[147,32609,32610],{},"Email CEO for approval",[14,32612,32614],{"id":32613},"enforcement-rules","Enforcement Rules",[144,32616,32617,32620,32623],{},[147,32618,32619],{},"Bonuses not submitted by the payroll cutoff will be deferred to the next cycle or rejected.",[147,32621,32622],{},"Any bonus issue discovered after the period ends must be flagged as a process gap, not resolved retroactively.",[147,32624,32625],{},"Delays in review or approval do not justify retroactive changes to bonus criteria or amounts.",{"title":75,"searchDepth":76,"depth":76,"links":32627},[32628,32633,32634,32635,32640,32641,32644,32645,32646,32647,32648,32652],{"id":32001,"depth":76,"text":32002,"children":32629},[32630,32631,32632],{"id":32008,"depth":605,"text":32009},{"id":32026,"depth":605,"text":32027},{"id":32036,"depth":605,"text":32037},{"id":32046,"depth":76,"text":32047},{"id":32074,"depth":76,"text":32075},{"id":32085,"depth":76,"text":32086,"children":32636},[32637,32638,32639],{"id":32092,"depth":605,"text":32093},{"id":32107,"depth":605,"text":32108},{"id":32123,"depth":605,"text":32124},{"id":32292,"depth":76,"text":32293},{"id":32308,"depth":76,"text":32309,"children":32642},[32643],{"id":32335,"depth":605,"text":32336},{"id":32397,"depth":76,"text":32398},{"id":32440,"depth":76,"text":32441},{"id":32463,"depth":76,"text":32464},{"id":32497,"depth":76,"text":32498},{"id":32510,"depth":76,"text":32511,"children":32649},[32650,32651],{"id":32517,"depth":605,"text":32518},{"id":32593,"depth":605,"text":32594},{"id":32613,"depth":76,"text":32614},{},"\u002Fhandbook\u002Fpeopleops\u002Fcompensation",{"title":31990,"description":31998},"handbook\u002Fpeopleops\u002Fcompensation","6Id5hmn2mDca6GmwrIjdZVMV3mgsgoRMzrw6OaVCaYg",{"id":32659,"title":32660,"body":32661,"description":32668,"extension":81,"meta":32804,"navGroup":83,"navOrder":83,"navTitle":32805,"navigation":84,"path":32806,"seo":32807,"stem":32808,"__hash__":32809},"handbook\u002Fhandbook\u002Fpeopleops\u002Fcompliance.md","Compliance & Training (Mineral)",{"type":7,"value":32662,"toc":32793},[32663,32666,32669,32673,32681,32685,32699,32703,32714,32718,32732,32736,32739,32743,32746,32757,32761,32764,32775,32779,32782,32786],[10,32664,32660],{"id":32665},"compliance-training-mineral",[19,32667,32668],{},"FlowFuse uses the Mineral Portal (accessed via Deel) to manage state-specific mandatory training. Every new PEO employee must complete a compliance track tailored to their state of residence.",[164,32670,32672],{"id":32671},"for-admins-managing-training-tracks","For Admins: Managing Training Tracks",[144,32674,32675,32678],{},[147,32676,32677],{},"Access: Admins are currently members of the BizOps team.",[147,32679,32680],{},"Adding Admins: Access cannot be granted self-serve. To add a new admin, you must contact our Payroll Provider HR Resource (refer to the Vendor Sheet for contact info).",[164,32682,32684],{"id":32683},"how-to-access-mineral","How to Access Mineral:",[504,32686,32687,32690,32693,32696],{},[147,32688,32689],{},"Log in to Deel.",[147,32691,32692],{},"Navigate to the People Tab.",[147,32694,32695],{},"Go to the Documents tab and scroll to the \"Request by Deel\" section.",[147,32697,32698],{},"Click View on \"Employee handbook and required HR training.\"",[164,32700,32702],{"id":32701},"creating-a-track","Creating a Track:",[504,32704,32705,32708,32711],{},[147,32706,32707],{},"Hover over Training > Click Dashboard.",[147,32709,32710],{},"In the top right, click Action > Create New Track.",[147,32712,32713],{},"Need help? Hover over Help > Help Center > Training Videos for step-by-step tutorials.",[14,32715,32717],{"id":32716},"annual-compliance-cycle","Annual Compliance Cycle",[504,32719,32720,32723,32726,32729],{},[147,32721,32722],{},"Verification: Each year, the BizOps Manager must email our Payroll HR contact to confirm which states require renewed training (schedules vary by state).",[147,32724,32725],{},"Assignment: Assign new tracks based on HR guidance.",[147,32727,32728],{},"Timeline: Employees are given 3 months to complete assigned courses. All training must be finalized before the end of the calendar year.",[147,32730,32731],{},"Employee Notification: Employees will receive an automated link to their Mineral account to complete the training.",[10,32733,32735],{"id":32734},"handbook-maintenance","Handbook Maintenance",[19,32737,32738],{},"Our Main Handbook must stay compliant as we expand our geographic footprint.",[14,32740,32742],{"id":32741},"new-state-hires","New State Hires",[19,32744,32745],{},"When hiring an employee in a new state, the BizOps team must:",[504,32747,32748,32751,32754],{},[147,32749,32750],{},"Alert HR: Email our Payroll HR contact to notify them of the new state.",[147,32752,32753],{},"Addendum: HR will confirm if a new state-specific addendum is required.",[147,32755,32756],{},"Updates: BizOps will update the Main Handbook with the provided language.",[164,32758,32760],{"id":32759},"handbook-editing-guidelines","Handbook Editing Guidelines",[19,32762,32763],{},"When the HR contact shares a template\u002Faddendum, follow these color-coding rules:",[144,32765,32766,32769,32772],{},[147,32767,32768],{},"Yellow: Fill in these sections with FlowFuse-specific info.",[147,32770,32771],{},"Red: DO NOT REMOVE. These are legal requirements.",[147,32773,32774],{},"Blue: Can be edited to better fit FlowFuse culture\u002Ftone.",[164,32776,32778],{"id":32777},"re-signatures","Re-signatures",[19,32780,32781],{},"Significant changes to the handbook may require a company-wide re-signature. If required, coordinate with the Payroll HR contact to distribute the updated handbook to all employees for digital signature.",[14,32783,32785],{"id":32784},"hr-resource-contact","HR Resource Contact",[19,32787,32788,32789,549],{},"To find out the contact information, please visit our vendor ",[46,32790,32792],{"href":29165,"rel":32791},[108],"sheet",{"title":75,"searchDepth":76,"depth":76,"links":32794},[32795,32796,32797,32798,32799,32803],{"id":32671,"depth":605,"text":32672},{"id":32683,"depth":605,"text":32684},{"id":32701,"depth":605,"text":32702},{"id":32716,"depth":76,"text":32717},{"id":32741,"depth":76,"text":32742,"children":32800},[32801,32802],{"id":32759,"depth":605,"text":32760},{"id":32777,"depth":605,"text":32778},{"id":32784,"depth":76,"text":32785},{},"Compliance & Regulatory","\u002Fhandbook\u002Fpeopleops\u002Fcompliance",{"title":32660,"description":32668},"handbook\u002Fpeopleops\u002Fcompliance","rLJFN9B2dHnDREgKa0y0WhYutCD0loew2MBQ0uiMrn4",{"id":32811,"title":30039,"body":32812,"description":33284,"extension":81,"meta":33285,"navGroup":83,"navOrder":83,"navTitle":30039,"navigation":84,"path":32173,"seo":33286,"stem":33287,"__hash__":33288},"handbook\u002Fhandbook\u002Fpeopleops\u002Fexpenses.md",{"type":7,"value":32813,"toc":33261},[32814,32817,32824,32832,32839,32843,32852,32855,32867,32871,32874,32885,32888,32896,32928,32932,32935,32958,32962,32965,32968,32971,32974,32977,32980,32984,32987,32991,32994,32998,33001,33036,33039,33043,33046,33070,33078,33082,33085,33089,33122,33126,33129,33133,33142,33146,33149,33153,33156,33159,33162,33166,33169,33173,33176,33179,33186,33189,33196,33200,33203,33206,33210,33213,33217,33220,33222,33240,33243,33247,33250],[10,32815,30039],{"id":32816},"expenses",[19,32818,32819,32820,32823],{},"FlowFuse will reimburse you for any work-related expenses that are considered\nreasonable. The general principle to follow is to treat work-related expenses\n",[423,32821,32822],{},"as if they were your own money",". It is important to seek good value for your\npurchases and use common sense when making decisions.",[19,32825,32826,32827,32831],{},"Whenever spending company money, you should expect to pay for the expense yourself and seek\n",[46,32828,32830],{"href":32829},"#reimbursement","reimbursement",". For all reimbursement requests,\nplease ensure to submit the required documentation and proofs through Deel.",[19,32833,32834,32835,32838],{},"If neither of the methods previously described is feasible (e.g., when a vendor\ndoesn't accept card payments or you don't have the means to pay from your own\nfunds and seek reimbursement), please refer to the instructions provided in our\n",[46,32836,32837],{"href":5609},"vendors section"," for guidance.",[14,32840,32842],{"id":32841},"company-credit-card","Company Credit Card",[19,32844,32845,32846,32851],{},"Some managers have access to ",[46,32847,32850],{"href":32848,"rel":32849},"https:\u002F\u002Fwww.brex.com\u002F",[108],"Brex"," cards to manage reoccuring monthly subscriptions for their team. If you are a manager and have such subscriptions to consider, please speak to the Head of Operations and your manager to explain your use case.",[19,32853,32854],{},"Brex is also used to create vendor cards that allow for reoccurring payment\nfor a monthly subscription with a vendor. Contact the Head of Operations if you require a\nvendor card.",[19,32856,32857,32858,32861,32862,549],{},"Expenses on Brex require a memo and receipts. Memos explain the purpose of the\nexpense. Receipts can be attached via the web UI, email (",[542,32859,32860],{},"receipts@brex.com","), or Slack. Please\n",[46,32863,32866],{"href":32864,"rel":32865},"https:\u002F\u002Fwww.brex.com\u002Fsupport\u002Fhow-do-i-attach-receipts-to-brex-transactions\u002F",[108],"read their docs",[164,32868,32870],{"id":32869},"oops-misused-your-brex-card-for-personal-expenses-heres-how-to-handle-the-situation-like-a-pro","Oops! Misused Your Brex Card for Personal Expenses? Here's How to Handle the Situation Like a Pro",[19,32872,32873],{},"Needless to say, Brex cards should not be used for personal expenses. However,\nsometimes we make a mistake and checkout with the wrong card. If you realize\nthat you have used your Brex card for personal purposes by mistake, here is what\nyou should do next:",[504,32875,32876,32879,32882],{},[147,32877,32878],{},"In Brex, open the expense entry and click the 'repay' button and follow the\ninstructions. This will create a new expense for the amount owed back and\nmark the original expense as 'Denied'.",[147,32880,32881],{},"Notify the CEO\u002FCTO, who will advise on how to reimburse the company the cost\nof the expense. This can be done via bank transfer to the company account.\nNote that any fees associated with the transfer will need to be met by you.",[147,32883,32884],{},"Once payment has been confirmed, the Brex expense entry can be marked as\n'Paid'.",[14,32886,32887],{"id":32830},"Reimbursement",[19,32889,32890,32891,549],{},"If you use your own means to purchase something that ought to be covered by the\ncompany, you can claim back the money through\n",[46,32892,32895],{"href":32893,"rel":32894},"https:\u002F\u002Fhelp.letsdeel.com\u002Fhc\u002Fen-gb\u002Farticles\u002F16801667118353-How-Do-I-Add-an-Expense-to-my-Pay",[108],"Deel",[144,32897,32898,32905,32908,32919,32922,32925],{},[147,32899,32900,32901],{},"Create a new expense by clicking ",[32902,32903,32904],"kbd",{},"Add Expense on the Quick Actions tab on\nyour Deel homepage",[147,32906,32907],{},"Enter the type of adjustment and select the Expense Category",[147,32909,32910,32911,32914],{},"Enter a description, expense name, price and attach an invoice, then click\n",[32902,32912,32913],{},"Submit",[144,32915,32916],{},[147,32917,32918],{},"Make sure it's an invoice and not a screenshot of the invoice",[147,32920,32921],{},"This expense will now appear in your \"Pending\" list",[147,32923,32924],{},"Adjustments approved before the payroll cut-off date will be processed in the\ncurrent month's payroll. Any adjustment approved after the payroll cut-off\ndate will be processed in the next month's payroll",[147,32926,32927],{},"Your manager is authorized to approve expenses that are $250 or less. However,\nif an expense exceeds $250, both the CEO and your manager will need to review\nand approve it.",[164,32929,32931],{"id":32930},"manager-checklist","Manager Checklist",[19,32933,32934],{},"Before approving an expense in Deel, please verify:",[144,32936,32937,32940,32943,32952,32955],{},[147,32938,32939],{},"The receipt is a final Proof of Payment (not a quote)",[147,32941,32942],{},"That the attachment is an invoice and not a screenshot",[147,32944,32945,32946,32951],{},"Asset purchases >$500 are logged in the ",[46,32947,32950],{"href":32948,"rel":32949},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1sHJmUGG-m7y9TGrFrtqiZ6ubioLf1ySSam_cL-cmiRo\u002Fedit?gid=0#gid=0",[108],"Asset"," Tracker. If not, flag with operations",[147,32953,32954],{},"The description clearly states the business justification",[147,32956,32957],{},"For expenses >$250, ensure the CEO is looped in for co-approval",[14,32959,32961],{"id":32960},"equipment","Equipment",[19,32963,32964],{},"As an all-remote company, FlowFuse provides a budget to cover the cost of\nequipment for a home office environment.",[19,32966,32967],{},"The budget is available for essential items needed to perform your role at\nFlowFuse.",[19,32969,32970],{},"For most team members, essential items include: chair, desk, monitor, headset,\nkeyboard, and mouse. Items such as an external microphone, external webcam,\nadditional monitors, laptop stands, lighting or laptop bag\u002Fcase can also be\nconsidered, depending on your role. For example, if 100% of your role is\ninternal-facing, you probably don't need an external microphone, especially if\nyou have a new laptop with high-quality audio and headphones.",[19,32972,32973],{},"Any items outside this will fall under an exception to the policy and require\nmanagement review and approval. The following items are not reimbursable:\nphones, watches, smart speakers, and tablets.",[19,32975,32976],{},"New hires should submit a list of the items they need to their manager for first\nline approval before making any purchases.",[19,32978,32979],{},"Existing team members should also ask their manager for approval for any items\nthat might need to be upgraded or replaced as part of their home office\nmaintenance. Existing team members can spend up to $500 per year.",[164,32981,32983],{"id":32982},"laptops","Laptops",[19,32985,32986],{},"Laptops are covered separately and are provided as needed when a new hire joins\nthe team. If you choose to order a laptop by yourself, we generally recommend\nthe following devices:",[239,32988,32990],{"id":32989},"laptop-capitalization-and-refresh-schedule","Laptop Capitalization and Refresh Schedule",[19,32992,32993],{},"Laptops are capitalized and depreciated in our accounting system over 3 years. Once the 3 years are up, the employee can replace their equipment with a newer model. Request a direct refresh of your equipment from your manager for approval before buying a new one.",[239,32995,32997],{"id":32996},"developers","Developers",[19,32999,33000],{},"We recognize that developers will have slightly more demanding requirements for\ntheir laptops. As such, the following devices are recommended:",[910,33002,33003,33013],{},[913,33004,33005],{},[916,33006,33007,33010],{},[919,33008,33009],{},"Operating System",[919,33011,33012],{},"Recommended Device",[930,33014,33015,33028],{},[916,33016,33017,33020],{},[935,33018,33019],{},"MacOS",[935,33021,33022,33027],{},[46,33023,33026],{"href":33024,"rel":33025},"https:\u002F\u002Fwww.apple.com\u002Fshop\u002Fbuy-mac\u002Fmacbook-pro",[108],"MacBook Pro 16\" - 32 GB RAM"," (~$2,499 ex VAT)",[916,33029,33030,33033],{},[935,33031,33032],{},"Windows\u002FLinux",[935,33034,33035],{},"No recommendation at this time",[19,33037,33038],{},"If you require an alternative device, please discuss with your manager.",[239,33040,33042],{"id":33041},"other-employees","Other Employees",[19,33044,33045],{},"For any other employee within the company, the following devices are\nrecommended:",[910,33047,33048,33056],{},[913,33049,33050],{},[916,33051,33052,33054],{},[919,33053,33009],{},[919,33055,33012],{},[930,33057,33058],{},[916,33059,33060,33062],{},[935,33061,33019],{},[935,33063,33064,33069],{},[46,33065,33068],{"href":33066,"rel":33067},"https:\u002F\u002Fwww.apple.com\u002Fshop\u002Fbuy-mac\u002Fmacbook-air\u002F15-inch-midnight-m5-chip-10-core-cpu-10-core-gpu-24gb-memory-512gb-storage",[108],"MacBook Air 15\""," (~$1499 ex VAT)",[19,33071,33072,33073,33077],{},"Unless circumstances require otherwise, laptops will be considered for a\nrefresh after 3 years. In some cases, depending on the specific requirements of the\nrole, a different device may be more appropriate. For example, roles that require\nhigher performance or processing power may opt for a ",[46,33074,33076],{"href":33024,"rel":33075},[108],"MacBook Pro"," instead of the standard\nrecommendation. Any such variation should be discussed with and approved by the\nemployee’s manager.\nPlease discuss with your manager if you need to refresh\nyour laptop.",[164,33079,33081],{"id":33080},"audio-and-video","Audio and Video",[19,33083,33084],{},"We recommend everyone has a quality microphone and web-cam, even if they are\nonly communicating with other FlowFuse team members. Being able to clearly see\nand hear each other makes video calls more effective, by minimising\nmisunderstandings and the need for us to repeat ourselves.",[239,33086,33088],{"id":33087},"suggested-setup","Suggested Setup",[144,33090,33091,33099,33107,33115],{},[147,33092,33093,33098],{},[46,33094,33097],{"href":33095,"rel":33096},"https:\u002F\u002Ffifinemicrophone.com\u002Fcollections\u002Fusb-mics\u002Fproducts\u002Ffifine-k669-669b",[108],"FiFine USB Microphone","\n(~$30)",[147,33100,33101,33106],{},[46,33102,33105],{"href":33103,"rel":33104},"https:\u002F\u002Fwww.amazon.co.uk\u002FAokeo-AK-35-Microphone-Suspension-Scissor\u002Fdp\u002FB01MZ99Y67",[108],"Microphone Stand","\n(~$25)",[147,33108,33109,33114],{},[46,33110,33113],{"href":33111,"rel":33112},"https:\u002F\u002Fwww.logitech.com\u002Fen-gb\u002Fproducts\u002Fwebcams\u002Fc920-pro-hd-webcam.960-001055.html",[108],"Logitech C920 Webcam","\n(~$100)",[147,33116,33117],{},[46,33118,33121],{"href":33119,"rel":33120},"https:\u002F\u002Fwww.backmarket.es\u002Fes-es\u002Fp\u002Fairpods-pro-con-estuche-de-carga-magsafe-blanco\u002F0900e1dc-f9c4-4646-b62e-43bc66335110?l=10#",[108],"Airpods Pro 2021",[239,33123,33125],{"id":33124},"mouse-keyboard","Mouse & Keyboard",[19,33127,33128],{},"Pick whatever mouse and keyboard setup you’re most comfortable with — wired or\nwireless, compact or full-size — as long as it’s reasonable and within budget.\nComfort and reliability matter more than brand or style.",[164,33130,33132],{"id":33131},"asset-purchases-over-500","Asset purchases over $500",[19,33134,33135,33136,33141],{},"Any asset purchase over $500 (laptops, devices etc) needs to be centrally\nrecorded. This is done in\n",[46,33137,33140],{"href":33138,"rel":33139},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1sHJmUGG-m7y9TGrFrtqiZ6ubioLf1ySSam_cL-cmiRo\u002Fedit#gid=0",[108],"this Google Sheet","\nand shared with the Finance team. Send details of the purchase to your manager\nso it can be recorded.",[164,33143,33145],{"id":33144},"return-of-equipment","Return of equipment",[19,33147,33148],{},"When a team member leaves the company, they will be required to return any\ncompany assets such as laptops. This should be discussed with their manager as\npart of the off-boarding process.",[239,33150,33152],{"id":33151},"buying-equipment","Buying Equipment",[19,33154,33155],{},"If you want to retain your laptop when departing FlowFuse, we do offer a\nbuy-back scheme.",[19,33157,33158],{},"Laptop deprecation is considered to be 25% per calendar year from purchase. The\nbuy-back price is calculated as the original cost paid by FlowFuse price minus\nthe deprecation. The buy-back price is subject to approval by the CEO.",[19,33160,33161],{},"For example, if you have a laptop that was purchased for $2,000 and you have had\nit for 1.5 years (1 full calendar year), the buy-back price would be $1,500.",[14,33163,33165],{"id":33164},"education-conferences","Education & Conferences",[19,33167,33168],{},"Continual professional development is very important, and FlowFuse will support\nyou in any activities you wish to undertake. Speak to your manager if you have\nparticular material you would like to study, or an event you would like to\nattend. FlowFuse will help cover reasonable costs associated with the activity -\nsuch as travel and ticket fees.",[14,33170,33172],{"id":33171},"software-licenses","Software Licenses",[19,33174,33175],{},"Licenses and software assets can be purchased for third-party software will be\nuseful for particular tasks, efforts and processes at FlowFuse.",[19,33177,33178],{},"If you are seeking a license of software that we do not currently use, put\ntogether a short summary as to the costs associated with the licenses and\ndescribe the value that the software would provide. If it would modify the way\nin which the company operates, then the best place to present this is as a PR to\nthe Handbook. With approval from the CEO and CTO you can proceed with the\nacquisition of the licenses.",[19,33180,33181,33182,33185],{},"When seeking an additional license for existing software we pay for, file an\nissue in the ",[46,33183,20005],{"href":5941,"rel":33184},[108]," project to request it\nto be provisioned with a justification on the expenditure. Assign this issue to\nthe CEO or CTO.",[164,33187,28171],{"id":33188},"zoom",[19,33190,33191,33192,33195],{},"When your role at FlowFuse requires you to have calls with external parties, a\nZoom pro license can be requested by opening an issue to provision you one in\nthe ",[46,33193,20005],{"href":5941,"rel":33194},[108]," GitHub project. Assign this issue\nto the CTO or CEO, who will provision it for you.",[14,33197,33199],{"id":33198},"workspace-location","Workspace & Location",[19,33201,33202],{},"As an all remote company we don't have offices. It is envisaged that most people\nwill work from their home the majority of the time. Equipment and furniture\nrequired for a home workspace should be discussed with your manager as part of\nthe hiring process. The company covering certain costs can have tax implications\ndepending on your local legislation. You should consult an independent advisor\nin your location for your particular situation.",[19,33204,33205],{},"Employees can work from different countries or cities as long as their tax\nresidency remains the same at the time of hiring. Please inform your manager\nbefore making such arrangements.",[164,33207,33209],{"id":33208},"coworking-space-allowance","Coworking space allowance",[19,33211,33212],{},"If you want to occasionally use a separate workspace to your home, the company\nwill cover up to $150 a month in charges for renting a desk in a co-working\nspace after manager approval.",[164,33214,33216],{"id":33215},"mileage","Mileage",[19,33218,33219],{},"Use of a personal vehicle for business purposes, other than commuting to a\npermanent workplace, is covered according to the employees local laws.",[19,33221,25880],{},[144,33223,33224,33232],{},[147,33225,33226,33231],{},[46,33227,33230],{"href":33228,"rel":33229},"https:\u002F\u002Fwww.gov.uk\u002Fgovernment\u002Fpublications\u002Frates-and-allowances-travel-mileage-and-fuel-allowances\u002Ftravel-mileage-and-fuel-rates-and-allowances",[108],"UK"," -\n45p per Mile",[147,33233,33234,33239],{},[46,33235,33238],{"href":33236,"rel":33237},"https:\u002F\u002Fwww.belastingdienst.nl\u002Fwps\u002Fwcm\u002Fconnect\u002Fbldcontentnl\u002Fbelastingdienst\u002Fzakelijk\u002Fauto_en_vervoer\u002Fauto_van_de_onderneming\u002Fautokosten\u002Fu_rijdt_in_uw_eigen_auto",[108],"Netherlands"," -\n€0.19 per Km",[19,33241,33242],{},"A screenshot of the route and the total distance travelled should be included\nwith any expense claim.",[14,33244,33246],{"id":33245},"personal-expenses","Personal expenses",[19,33248,33249],{},"We expect team members to take ownership of their personal expenses without the\nexpectation of reimbursement. This approach is all about acknowledging personal\npreferences and recognising the individual benefits that come with these\nexpenses. Here are some examples, but are not limited to:",[504,33251,33252,33255,33258],{},[147,33253,33254],{},"Coffee at your home office",[147,33256,33257],{},"Passport for travel",[147,33259,33260],{},"Daycare for your children",{"title":75,"searchDepth":76,"depth":76,"links":33262},[33263,33266,33269,33275,33276,33279,33283],{"id":32841,"depth":76,"text":32842,"children":33264},[33265],{"id":32869,"depth":605,"text":32870},{"id":32830,"depth":76,"text":32887,"children":33267},[33268],{"id":32930,"depth":605,"text":32931},{"id":32960,"depth":76,"text":32961,"children":33270},[33271,33272,33273,33274],{"id":32982,"depth":605,"text":32983},{"id":33080,"depth":605,"text":33081},{"id":33131,"depth":605,"text":33132},{"id":33144,"depth":605,"text":33145},{"id":33164,"depth":76,"text":33165},{"id":33171,"depth":76,"text":33172,"children":33277},[33278],{"id":33188,"depth":605,"text":28171},{"id":33198,"depth":76,"text":33199,"children":33280},[33281,33282],{"id":33208,"depth":605,"text":33209},{"id":33215,"depth":605,"text":33216},{"id":33245,"depth":76,"text":33246},"FlowFuse will reimburse you for any work-related expenses that are considered\nreasonable. The general principle to follow is to treat work-related expenses\nas if they were your own money. It is important to seek good value for your\npurchases and use common sense when making decisions.",{},{"title":30039,"description":33284},"handbook\u002Fpeopleops\u002Fexpenses","f2pRGJK-DtEuLsU9urU1Cq-Me8sDN9WfuhepHaD7I-g",{"id":33290,"title":33291,"body":33292,"description":33299,"extension":81,"meta":34061,"navGroup":83,"navOrder":83,"navTitle":33291,"navigation":84,"path":5024,"seo":34062,"stem":34063,"__hash__":34064},"handbook\u002Fhandbook\u002Fpeopleops\u002Fhiring\u002Findex.md","Hiring",{"type":7,"value":33293,"toc":34028},[33294,33297,33300,33330,33337,33340,33344,33347,33362,33365,33397,33400,33411,33415,33422,33429,33433,33436,33447,33450,33453,33456,33460,33463,33467,33470,33474,33486,33490,33493,33500,33504,33538,33542,33555,33559,33562,33566,33577,33581,33584,33588,33596,33600,33607,33611,33614,33625,33628,33632,33639,33643,33646,33659,33662,33687,33701,33705,33712,33823,33827,33830,33834,33837,33841,33849,33852,33860,33863,33872,33887,33890,33894,33897,33900,33917,33920,33923,33926,33930,33933,33936,33939,33943,33946,33950,33953,33957,33966,33970,33973,33976,33996,33999,34002,34007,34011,34018,34021],[10,33295,33291],{"id":33296},"hiring",[19,33298,33299],{},"When hiring a new role, the process is generally as follows:",[144,33301,33302,33305,33308,33317,33320,33327],{},[147,33303,33304],{},"Write a job description and add it to the handbook to get it approved by any necessary people",[147,33306,33307],{},"FlowFuse always sources candidates directly — we do not rely solely on inbound applications or recruiters to build our pipeline",[147,33309,33310,33311,33316],{},"A good starting point is the ",[46,33312,33315],{"href":33313,"rel":33314},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1LP9iT0n1GM5-WzjCj3nDzh16VDWaNv1PtlaAbUiTrKY\u002F",[108],"list of 50 similar companies"," we use as a talent map. Browse LinkedIn profiles of people at those companies who match the role's requirements and add them to the outreach list",[147,33318,33319],{},"The hiring manager is expected to source at least 20 profiles that we can do outreach to that fit the profile of the candidates we would want to hire",[147,33321,33322,33323],{},"Add the role to ",[46,33324,33326],{"href":33325},"\u002Fhandbook\u002Fpeopleops\u002Fhiring\u002F#greenhouse","Greenhouse",[147,33328,33329],{},"Create a private slack channel for key people on the interview loop called #hiring-role (e.g. #hiring-ae for hiring an account executive)",[19,33331,33332,33333,549],{},"For information about working with external recruiters, see ",[46,33334,33336],{"href":33335},"\u002Fhandbook\u002Fpeopleops\u002Fhiring\u002Frecruiters\u002F","Working with Recruiters",[14,33338,33326],{"id":33339},"greenhouse",[164,33341,33343],{"id":33342},"opening-a-job","Opening a Job",[19,33345,33346],{},"When opening a job post, you'll need a couple of things:",[504,33348,33349,33356,33359],{},[147,33350,33351,33352],{},"The Job Description that is already merged into the handbook ",[46,33353,33355],{"href":33354},"\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002F","with all of the requisite parts",[147,33357,33358],{},"Access to the handbook",[147,33360,33361],{},"Access to Greenhouse (our ATS)",[19,33363,33364],{},"The process in Greenhouse is as-follows:",[144,33366,33367,33370,33373,33376,33379,33382,33385,33388,33391,33394],{},[147,33368,33369],{},"On the main screen, in the top nav, select \"Add\", then \"Create a Job\".",[147,33371,33372],{},"Then, \"Copy an Existing Job\"",[147,33374,33375],{},"Then select, \"FlowFuse Sample Job\"",[147,33377,33378],{},"Add the internal and external job names, and then move to the next screen (Create job and continue on bottom right)",[147,33380,33381],{},"Add the key people for the role- hiring managers especially",[147,33383,33384],{},"Skip sending the email to the hiring manager for the job kickoff as that process is already done in the process of completing the full job description",[147,33386,33387],{},"Pull the Skills & Qualifications for the Candidate Scorecard from the Job Description",[147,33389,33390],{},"There is a default interview plan of three calls: Screening call, Hiring Manager Interview, and STAR Interview. If you need to add more, you can do so in the upper right with the \"Add Stage\" button. Note: DO NOT name multiple stages the same thing. It will break other functionality in the app. Don't do it.",[147,33392,33393],{},"On the job post, make sure to change the location type of the role to Remote. Enter the post description (from the handbook) and any additional custom application questions. The handbook question does a really good job of screening out AI applications. If you're obligated to select a location, we usually use \"Remote, Oregon, US\"",[147,33395,33396],{},"Select the default notifications and \"Finish\" the role.",[19,33398,33399],{},"Now that you've created the job, you must actually post the role.",[144,33401,33402,33405,33408],{},[147,33403,33404],{},"From the job page, on the left sidebar, select \"Job Setup\".",[147,33406,33407],{},"Go to the \"Job Posts\" box, and hit \"Edit\"",[147,33409,33410],{},"Turn on the toggle to see the role on the careers page.",[239,33412,33414],{"id":33413},"accepting-applications","Accepting applications",[19,33416,33417,33418,549],{},"When you open the role on Greenhouse to accept applications, please ",[46,33419,33421],{"href":33420},"\u002Fhandbook\u002Fpeopleops\u002Fhiring\u002F#advertising-a-role","follow the advertisement instructions",[19,33423,33424,33425,33428],{},"Applicants for a job are required to submit their resume, and it is optional for them to include a cover letter.\nAdditionally, it is recommended to include one or two acceptance questions that are relevant to the specific position.\nThese questions should be thought-provoking, yet not overly time-consuming, and they should allow skilled candidates to provide a response within a minute or two. For example, for a developer position, a question could be: \"What happens if someone types '",[46,33426,21168],{"href":21168,"rel":33427},[108],"' in their browser and presses enter?\" The intention is to engage candidates and assess their problem-solving skills.",[239,33430,33432],{"id":33431},"rejecting-candidates","Rejecting Candidates",[19,33434,33435],{},"We will interview candidates at every stage of the interviewing process. When we reject candidates, there are three kinds of rejections:",[144,33437,33438,33441,33444],{},[147,33439,33440],{},"pre-interview",[147,33442,33443],{},"post-screen",[147,33445,33446],{},"after candidates have done multiple interviews",[19,33448,33449],{},"Pre-interview, we use the template in Greenhouse to reject candidates. We want candidates to know that we are not moving forward with them.\nNote: Some candidates who apply through LinkedIn do not attach valid emails to their application, in which case we reject without emailing, but otherwise we always try to let them know.",[19,33451,33452],{},"Post-screen, we use a different template in Greenhouse to reject candidates. This template recognizes that candidates have spent time with us.",[19,33454,33455],{},"After candidates have done multiple interviews, we may want to write a more personal email letting them move on. This is up to hiring manager's discretion. In this case, we should make sure to reject via Greenhouse but not send emails.",[1019,33457,33459],{"id":33458},"candidate-feedback","Candidate Feedback",[19,33461,33462],{},"At times candidates may request feedback on why we are not moving forward with their candidacy. By default, we do not provide feedback, but in some circumstances a hiring manager may be open to discussing further with the candidate.",[164,33464,33466],{"id":33465},"closing-a-job","Closing a job",[19,33468,33469],{},"As soon as there's a pipeline that would support at least three strong candidates\nfor the open position, take the job posting offline. Candidates applying for a job\nthat's no longer available is a waste of their time, a bad experience with\nFlowFuse, and hurts our reputation.",[14,33471,33473],{"id":33472},"internal-communication-of-the-job","Internal Communication of the job",[19,33475,33476,33477,33481,33482,549],{},"Once a new headcount request has been approved, it must be announced in the company’s Slack channel ",[46,33478,641],{"href":33479,"rel":33480},"https:\u002F\u002Fflowfuse.slack.com\u002Farchives\u002FC06EQCXUGA3",[108]," so that the entire team is aware of the open position and our current hiring needs. This ensures transparency and encourages involvement in the hiring process.\nTeam members are invited to share the job posting within their personal networks if they know someone who matches the role’s requirements and embodies the FlowFuse culture. Referrals are highly encouraged and, if the recommended candidate is hired and successfully completes three months in the role, the referring employee ",[46,33483,33485],{"href":33484},"\u002Fhandbook\u002Fpeopleops\u002Fhiring\u002F#referrals","will earn a bonus",[14,33487,33489],{"id":33488},"advertising-a-role","Advertising a Role",[19,33491,33492],{},"When advertising for a role on Social Media, engagement is improved (and therefore,\nwe reach a higher audience) with custom social tiles.",[19,33494,33495,33496,549],{},"We can add URLs to our site that provide a nice tile, whilst then redirecting to\nthe job advert on Greenhouse. This was introduced ",[46,33497,2011],{"href":33498,"rel":33499},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fwebsite\u002Fpull\u002F728",[108],[164,33501,33503],{"id":33502},"adding-a-new-role-to-the-website","Adding a new role to the website",[504,33505,33506,33513,33524,33530],{},[147,33507,33508,33509,33512],{},"Add the job as a redirect in ",[542,33510,33511],{},"src\u002F_data\u002Fsite.json"," under \"openings\"",[147,33514,33515,33516,33519,33520,33523],{},"Add a new ",[542,33517,33518],{},"\u003Cjob-short-title>.njk"," file to the ",[542,33521,33522],{},"\u002Fsrc\u002Fjobs"," directory (use an existing job as a template)",[147,33525,33526,33527,33529],{},"Update the redirect URL in the ",[542,33528,9581],{}," file to match that added in Step 1.",[147,33531,33532,33533,33537],{},"Open an ",[46,33534,33536],{"href":33535},"\u002Fhandbook\u002Fdesign\u002Fart-requests\u002F","Art Request"," to have a new Social Tile designed & attach it to the relevant page",[239,33539,33541],{"id":33540},"welcome-to-the-jungle-integration","Welcome to the Jungle Integration",[19,33543,33544,33545,33550,33551,33554],{},"We have an automated integration setup with ",[46,33546,33549],{"href":33547,"rel":33548},"https:\u002F\u002Fhire.welcometothejungle.com",[108],"Welcome to the Jungle",". When a job is posted to our Greenhouse account, it ",[2562,33552,33553],{},"should"," appear on Welcome to the Jungle within 24 hours. We have to pay to actually post the role. We will only consider paying to post Individual Contributor Eng roles.",[164,33556,33558],{"id":33557},"referrals","Referrals",[19,33560,33561],{},"To participate in FlowFuse's employee referral program, kindly send all referral\nresumes to the People Ops Manager. If your recommended candidate gets hired and\nsuccessfully completes 3 months, you will receive a $1000 reward. Alternatively,\nyou can choose a charitable foundation of your liking, and we will double the\nreferral amount donated to that organization.",[164,33563,33565],{"id":33564},"sharing-an-existing-role","Sharing an Existing Role",[19,33567,33568,33569,33573,33574],{},"The URLs for the existing roles we have on the website are any files found in ",[46,33570,2011],{"href":33571,"rel":33572},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fwebsite\u002Ftree\u002Fmain\u002Fsrc\u002Fjobs",[108],".\nThe URL will be structured accordingly: ",[542,33575,33576],{},"\u002Fjobs\u002F\u003Cjob-short-title>",[14,33578,33580],{"id":33579},"interviews","Interviews",[19,33582,33583],{},"Hiring plans are role specific and should be included in the job posting.",[164,33585,33587],{"id":33586},"screening-interview","Screening Interview",[19,33589,33590,33591,33595],{},"All candidates will experience a ",[46,33592,33594],{"href":33593},"\u002Fhandbook\u002Fpeopleops\u002Fhiring\u002Fscreening-call\u002F","Screening Call"," as the first stage in the interview.",[164,33597,33599],{"id":33598},"star-interviews","STAR interviews",[19,33601,33590,33602,33606],{},[46,33603,33605],{"href":33604},"\u002Fhandbook\u002Fpeopleops\u002Fhiring\u002Fstar-questions\u002F","STAR Interview"," at some point in the interview process.",[239,33608,33610],{"id":33609},"skills-assessment","Skills assessment",[19,33612,33613],{},"For each role a skills assessment will be performed. This stage will be different for most roles. This is the main stage to asses the capabilities.",[19,33615,33616,33617,33620,33621,33624],{},"This round will again result in a scorecard, but also an indication what level this candidate would suit in.\nFor example ",[542,33618,33619],{},"intermediate"," vs ",[542,33622,33623],{},"senior"," for developers.",[19,33626,33627],{},"When in doubt, reject the candidate.",[239,33629,33631],{"id":33630},"offer-stage","Offer stage",[19,33633,33634,33635,549],{},"Read about ",[46,33636,33638],{"href":33637},"#extending-an-offer","extending offers",[14,33640,33642],{"id":33641},"extending-an-offer","Extending an offer",[19,33644,33645],{},"Before extending any offer, note that any offer when the total compensation package\nexceeds $250000 per annum requires the board to be informed, and approval from the\nmajority to be obtained.",[19,33647,33648,33649,33653,33654,33658],{},"When a candidate goes through the full hiring process an offer might be extended\nto them. At such a time it's good to understand that the offer at that time is\nconditional on ",[46,33650,33652],{"href":33651},"\u002Fhandbook\u002Fpeopleops\u002Fhiring\u002F#background-screening","background checks",".\nThe offer might include an ",[46,33655,33657],{"href":33656},"\u002Fhandbook\u002Fpeopleops\u002Fcompensation\u002F#equity","equity component",".\nThis part is conditional on board approval of such a grant. Be sure to be\nexplicit about these conditions.",[19,33660,33661],{},"At the offer stage all scorecards will be re-evaluated to understand what the\ncandidate strengths and challenges are. Before the hiring manager extends an offer,\nexplicit approval is required from the CEO to:",[144,33663,33664,33672,33675,33678,33681,33684],{},[147,33665,33666,33667],{},"Check we hire in their location\n",[144,33668,33669],{},[147,33670,33671],{},"If we haven't hired in their location, alert Business Operations to do a review before extending the offer",[147,33673,33674],{},"If a candidate is based in France, Germany, Belgium, Denmark, Sweden, Finland, Norway, Netherlands, Spain, Italy, Portugal, Austria, or the Czech Republic, please verify with BizOps before proceeding with the hiring process",[147,33676,33677],{},"Confirm candidate is seeking full-time employment (FlowFuse only offers full-time positions)",[147,33679,33680],{},"Notice period aligns with internal processes",[147,33682,33683],{},"Total compensation is in FlowFuse's range",[147,33685,33686],{},"The new manager of the candidate agrees with extending this offer to the candidate",[19,33688,33689,33690,33694,33695,33700],{},"Please use ",[46,33691,14793],{"href":33692,"rel":33693},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1rY0gLLpkOPBVGlMy7PVhnVjmRF53MhkeDET4TkfPJIs",[108]," to stage an email.\nEquity in the company is offered to some roles, the CEO has access to ",[46,33696,33699],{"href":33697,"rel":33698},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1iFf7D-_6lzyYiC0_e3BKxzn3TGjyHMIiG3bZ-jChgoE\u002F",[108],"the calculator","\ndetermining how many options to offer.",[14,33702,33704],{"id":33703},"after-an-offer-is-accepted","After an offer is accepted",[19,33706,33707,33708,33711],{},"Onboarding on our EOR provider, Deel, takes up to 3 weeks. For contractors or US\nemployees the start date can be within 48 hours. Otherwise, do not offer anything\nwithin 2 weeks. When a ",[46,33709,33710],{"href":33637},"conditional offer"," has been accepted\nyou should immediately:",[504,33713,33714,33741,33744,33753,33760,33767,33797,33809,33815],{},[147,33715,33716,33717,549,33721],{},"Create the contract in Deel, and purchase the ",[46,33718,33720],{"href":33719},"\u002Fhandbook\u002Fcompany\u002Fsecurity\u002Fhuman-resources\u002F#screening","background check",[144,33722,33723,33726,33729,33732,33735],{},[147,33724,33725],{},"Create or add the their job title to Deel.",[147,33727,33728],{},"Copy the \"Job Description\" from the handbook as \"Scope of work\" on Deel (and save it as a template for this role).",[147,33730,33731],{},"Important note: If the EOR with Deel is a new one, we need to ask Deel to initiate the IP Transfer process. The existing EORs include: India, Germany, Canada, UK, and Spain. We also have it in place in the US, but as of October 1, 2025 US team members are employed via a PEO.",[147,33733,33734],{},"Note: If we are hiring via PEO in a state where we do not currently have any employees, notify Operations immediately to begin the registered agent filing through CorpNet. Corpnet login information can be found in 1Password in the finance Vault.",[147,33736,33737,33738],{},"Add Equity to the offer according to ",[46,33739,33740],{"href":33656},"the Equity guidelines",[147,33742,33743],{},"Invite the prospective employee to join Deel, assign them to their designated department, and deliver their offer letters through the Deel platform.",[147,33745,33746,33747,33752],{},"If the hire is an independent contractor located outside the US, send the PDF ",[46,33748,33751],{"href":33749,"rel":33750},"https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F16nyoUMyCO-VebGAaJCKJ9VCzr8k7m9yB\u002Fview?usp=sharing",[108],"“Working Together: Your Guide to Joining FlowFuse as an Independent Contractor”"," via email prior to the start date.",[147,33754,33755,33756],{},"Announce it to the rest of the team on Slack in the ",[46,33757,33759],{"href":33479,"rel":33758},[108],"#announcements channel",[147,33761,33762,33766],{},[46,33763,33765],{"href":12778,"rel":33764},[108],"Create an onboarding issue"," on the admin GitHub project",[147,33768,33769,33770,33772,33773],{},"Send the candidates the Modified PIIAA Agreement. It is stored in the FlowFuse Admin Drive in the Legal > IP Folder. There are different templates for different countries. If it is the first time hiring in the country, we will need to engage Legal to create the template. Make sure to ask them to have local counsel review.",[9379,33771],{},"Signing Requirements: The PIIAA must be signed on or before the candidate's first day. Use the template that corresponds to their state\u002Fcountry. After execution, save the signed document in Legal → IP → Signed PIIAA.",[144,33774,33775,33786],{},[147,33776,33777,33778],{},"Contractors who DO NOT need PIIAA:\n",[144,33779,33780,33783],{},[147,33781,33782],{},"Direct contractors with FlowFuse",[147,33784,33785],{},"Their existing contract already includes IP assignment",[147,33787,33788,33789],{},"Contractors who DO need PIIAA:\n",[144,33790,33791,33794],{},[147,33792,33793],{},"Contractors hired through Deel Shield",[147,33795,33796],{},"Because their IP assignment is NOT automatically transferred",[147,33798,33799,33800],{},"Add their stock options to the stock option request spreadsheets",[144,33801,33802],{},[147,33803,33804,33805],{},"Copy or create a new monthly request sheet from ",[46,33806,14793],{"href":33807,"rel":33808},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1AG75qONjObto3g2oJH_SC4gjgRsYJmKUI3fjrZuktm0\u002Fedit#gid=1970623412",[108],[147,33810,33811],{},[46,33812,33814],{"href":33813},"\u002Fhandbook\u002Fpeopleops\u002Fhiring\u002F#closing-a-job","Close the role",[147,33816,33817,33818,1583],{},"Update the handbooks so that the role isn't listed as an opening on the website (",[46,33819,33822],{"href":33820,"rel":33821},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fwebsite\u002Fpull\u002F3300",[108],"Reference PR",[164,33824,33826],{"id":33825},"background-screening","Background Screening",[19,33828,33829],{},"FlowFuse will utilize Deel to conduct background checks on individuals in the\nUnited States. These checks are essential for compliance purposes, particularly\nfor employees located in the US.",[164,33831,33833],{"id":33832},"tax-residency","Tax Residency",[19,33835,33836],{},"During the onboarding process on our EOR provider platform, candidates must either be citizens of the country where they will be working or possess a valid visa. Any requests for changes in tax residency should be communicated to the HR department and CEO at least 2 months in advance. This includes changing States within the US.",[239,33838,33840],{"id":33839},"deposits","Deposits",[19,33842,33843,33844,549],{},"Our partnership with Deel as an Employer of Record involves a standard security deposit to ensure compliance with local labor laws and to guarantee the seamless administration of international payroll and benefits. To read more about it, regarding deposit amounts, refunds, etc, authorized personnel may access the following ",[46,33845,33848],{"href":33846,"rel":33847},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1bjGI2JOLUuH_IvtEHOJiNacrCYKCMCAANzLoluaF9c8\u002Fedit?usp=sharing",[108],"document",[14,33850,30700],{"id":33851},"onboarding",[19,33853,33854,33855,33859],{},"Before your first day of work at FlowFuse, you will receive an email requesting your GitHub username\nand preferred company email address. An issue will be created on our ",[46,33856,33858],{"href":12778,"rel":33857},[108],"internal issue tracker"," with steps for you and\nthe team to complete once you start.",[19,33861,33862],{},"On the day you start, a message will be sent to your personal email address to grant you access to your FlowFuse email address.\nThis process ensures that all new joiners receive access either on their first day or up to 24 hours before their official start date.",[19,33864,33865,33866,33871],{},"Upon setting up your password, it is essential to ",[46,33867,33870],{"href":33868,"rel":33869},"https:\u002F\u002Fsupport.google.com\u002Faccounts\u002Fanswer\u002F185839?hl=en&co=GENIE.Platform%3DDesktop",[108],"turn on the 2-Step Verification",". Failure to do so may result in being locked out of your account after a few days, requiring assistance from an admin to regain access.",[19,33873,33874,33875,33880,33881,33886],{},"Once your FlowFuse email is set up, you will have access to invitations to other services and platforms, including 1Password. ",[46,33876,33879],{"href":33877,"rel":33878},"https:\u002F\u002Fsupport.1password.com\u002Fexplore\u002Fteam-member\u002F",[108],"Set this up"," as soon as possible to add a security layer to all your FlowFuse accounts. ",[46,33882,33885],{"href":33883,"rel":33884},"https:\u002F\u002Fflowfuse.1password.com\u002Fteamjoin\u002Finvitation\u002FWQYIVEIMHJF43IHHS2LALG4SKQ",[108],"Use this link"," to get access to your 1Password account by entering your new flowfuse email.",[19,33888,33889],{},"On your first day, once your email and 1Password accounts are set up, it is important to prioritize\ngaining access to Slack, the FlowFuse GitHub organization, and completing your onboarding issue.\nAdditionally, your manager will assign tasks for you to begin working on during\nyour first week. Further details on Onboarding will be available in your Onboarding issue.",[164,33891,33893],{"id":33892},"onboarding-buddy","Onboarding Buddy",[19,33895,33896],{},"As part of your onboarding, you'll be assigned an onboarding buddy who is there to help make you successful.\nThe onboarding buddy should be a person outside of your team. This helps ensure we're building a culture across the company.\nYou should reach out to your onboarding buddy regularly in your first 90 days.",[19,33898,33899],{},"The onboarding buddy’s responsibilities are:",[144,33901,33902,33905,33908,33911,33914],{},[147,33903,33904],{},"Welcome the new team member and act as a primary point of contact during the first 90 days.",[147,33906,33907],{},"Introduce themselves in Slack on the new team member’s first day to establish an immediate connection.",[147,33909,33910],{},"Help the team member navigate internal tools, processes, and communication channels.",[147,33912,33913],{},"Check in periodically to ensure the team member is settling in and answer basic questions.",[147,33915,33916],{},"Direct the team member to the right documentation or people when needed.",[14,33918,30703],{"id":33919},"offboarding",[19,33921,33922],{},"The purpose of the offboarding section in the handbook is to provide a clear and structured framework for employees at FlowFuse to follow during the offboarding process. The offboarding process is managed by the People Ops Manager in close collaboration with the CEO, Reporting Managers, and Deel for Payroll at FlowFuse.",[19,33924,33925],{},"When a team member or contractor decides to leave FlowFuse, they will receive a detailed email before their final date of employment. The email will include information regarding the impact on benefits coverage, stocks, final pay, and the process for returning any company assets.",[164,33927,33929],{"id":33928},"voluntary-resignation","Voluntary Resignation",[19,33931,33932],{},"If a team member decides to leave FlowFuse, they're expected to continue working to facilitate a smooth handover and enable us to find a suitable replacement. Please note that we generally expect the team member to work for the entire notice period.",[19,33934,33935],{},"If you are considering resigning from your position at FlowFuse, we highly recommend discussing your reasons with your manager or the People Ops manager. We are always open to improving and making changes that benefit our team members. While we understand that sometimes leaving is the best option, we encourage you to explore all possible solutions before making a final decision.",[19,33937,33938],{},"Once you have discussed your concerns with your manager and the People Ops team and determined that resigning from FlowFuse is the only option, please notify both your manager and the People Ops team of your intention to resign via email. Afterward, we will commence a discussion to establish the steps required to ensure a seamless handover.",[164,33940,33942],{"id":33941},"involuntary-resignation","Involuntary Resignation",[19,33944,33945],{},"When a team member is being let go, it is usually due to either performance issues or a change in the company's needs that no longer justifies their role. If the decision is due to performance issues, we will have already provided feedback and given the team member an opportunity to improve. Unfortunately, if the issues cannot be resolved, termination of employment may be necessary. In most cases, we will ask the team member to stop working immediately. The final payment will be made according to the terms of their employment contract.",[164,33947,33949],{"id":33948},"communicating-departures","Communicating Departures",[19,33951,33952],{},"When a team member voluntarily departs, we may ask if they would like to share their plans with the team. If the departure is involuntary, reasons of the departure will be at the sole discretion of the FlowFuse management.",[14,33954,33956],{"id":33955},"offboarding-process","Offboarding process",[19,33958,33959,33960,33965],{},"At FlowFuse, we conduct Exit Interviews for employees who choose to leave the company voluntarily.\nThis provides us with valuable feedback on their experience, reasons for leaving, and areas for\nimprovement. Their manager schedules these interviews during the employee's last week to ensure\nthey have an opportunity to share their insights. Our aim is to use this feedback to enhance our\nworkplace culture and practices. Please follow the ",[46,33961,33964],{"href":33962,"rel":33963},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1az9PddrvVk1TH1TPXJGXmavxBpo9OpcWbylN4gQBoe8\u002Fedit",[108],"predefined questions"," to guide the conversation.",[164,33967,33969],{"id":33968},"equipment-return-or-buyback","Equipment return or buyback",[19,33971,33972],{},"All company-issued devices must either be returned or may be purchased by the employee. Devices remain company property for the first three (3) years of an employee’s tenure and must be returned unless the employee chooses to purchase them. A buyback amount will be established by the team. Once the buyback amount is confirmed, the employee may choose to purchase the device.",[19,33974,33975],{},"If the employee chooses to buy the device:",[144,33977,33978,33987,33993],{},[147,33979,33980,33981,33986],{},"Share the ",[46,33982,33985],{"href":33983,"rel":33984},"https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1943zVMYXA7B-EfjM4GRwN_lsAGQFHQj5\u002Fview?usp=sharing",[108],"SVB wiring"," details with the employee:",[147,33988,33989,33990,33992],{},"Notify Finance in advance by emailing ",[46,33991,29418],{"href":29417}," that a wire transfer is expected.",[147,33994,33995],{},"Instruct the employee to send a copy of the wire transfer confirmation once the payment has been completed.",[19,33997,33998],{},"US employees should follow these instructions:\nIf they would prefer to send a check instead of a wire transfer, mail the check to the SVB address as shown in the wire instructions, with Attn: Branch Operations. In the memo line for the check, include FlowFuse and the FlowFuse account number. Mail the check via Certified Mail, and message the CEO with the tracking number.",[19,34000,34001],{},"If the employee chooses to return the device:",[144,34003,34004],{},[147,34005,34006],{},"This should be discussed with their manager.",[164,34008,34010],{"id":34009},"offboarding-issue","Offboarding Issue",[19,34012,34013,34014,549],{},"After announcing the departure in Slack, the manager will create a new offboarding issue for each instance of a team member leaving.\nThe template maintained on GitHub, create a new issue though ",[46,34015,34017],{"href":12778,"rel":34016},[108],"this link",[19,34019,34020],{},"Final pay consists of the statutory minimal payment dictated by our payroll provider Deel, and an optional extra severance package.\nSuch a package might be dependent on business requirements, standing of the employee, among other factors.",[19,34022,34023,34024],{},"The company will reimburse any outstanding expenses that comply with ",[46,34025,34027],{"href":34026},"\u002Fhandbook\u002Fpeopleops\u002Fexpenses\u002F#reimbursement","our handbook",{"title":75,"searchDepth":76,"depth":76,"links":34029},[34030,34034,34035,34040,34044,34045,34049,34052,34057],{"id":33339,"depth":76,"text":33326,"children":34031},[34032,34033],{"id":33342,"depth":605,"text":33343},{"id":33465,"depth":605,"text":33466},{"id":33472,"depth":76,"text":33473},{"id":33488,"depth":76,"text":33489,"children":34036},[34037,34038,34039],{"id":33502,"depth":605,"text":33503},{"id":33557,"depth":605,"text":33558},{"id":33564,"depth":605,"text":33565},{"id":33579,"depth":76,"text":33580,"children":34041},[34042,34043],{"id":33586,"depth":605,"text":33587},{"id":33598,"depth":605,"text":33599},{"id":33641,"depth":76,"text":33642},{"id":33703,"depth":76,"text":33704,"children":34046},[34047,34048],{"id":33825,"depth":605,"text":33826},{"id":33832,"depth":605,"text":33833},{"id":33851,"depth":76,"text":30700,"children":34050},[34051],{"id":33892,"depth":605,"text":33893},{"id":33919,"depth":76,"text":30703,"children":34053},[34054,34055,34056],{"id":33928,"depth":605,"text":33929},{"id":33941,"depth":605,"text":33942},{"id":33948,"depth":605,"text":33949},{"id":33955,"depth":76,"text":33956,"children":34058},[34059,34060],{"id":33968,"depth":605,"text":33969},{"id":34009,"depth":605,"text":34010},{},{"title":33291,"description":33299},"handbook\u002Fpeopleops\u002Fhiring\u002Findex","xXKT6Trwmhhy2vVTkX8WxW69D6bmOAOcI8M9i41htNM",{"id":34066,"title":33336,"body":34067,"description":34074,"extension":81,"meta":34125,"navGroup":83,"navOrder":83,"navTitle":33336,"navigation":84,"path":34126,"seo":34127,"stem":34128,"__hash__":34129},"handbook\u002Fhandbook\u002Fpeopleops\u002Fhiring\u002Frecruiters.md",{"type":7,"value":34068,"toc":34121},[34069,34072,34075,34079,34082,34103,34107,34110],[10,34070,33336],{"id":34071},"working-with-recruiters",[19,34073,34074],{},"FlowFuse works with external recruiters to help identify and attract qualified\ncandidates for open positions. The way the company works with recruiters is\nthis way to have transparency, pay the recruiter and candidate (when hired), and\nkeep the hiring process aligned with our values.",[14,34076,34078],{"id":34077},"non-exclusive-recruitment","Non-Exclusive Recruitment",[19,34080,34081],{},"FlowFuse does not grant exclusive recruitment rights to any single recruiter.\nWhen we open a role:",[144,34083,34084,34087,34090,34093,34096],{},[147,34085,34086],{},"The position is posted publicly and remains accessible to all candidates",[147,34088,34089],{},"Multiple recruiters may work on the same job posting simultaneously",[147,34091,34092],{},"Candidates can apply directly or be referred by any recruiter",[147,34094,34095],{},"All recruiters have equal opportunity to submit qualified candidates",[147,34097,34098,34099,34102],{},"Candidates are assigned to recruiters or inbound channels at the time they ",[2562,34100,34101],{},"first"," apply",[14,34104,34106],{"id":34105},"recruiter-compensation","Recruiter Compensation",[19,34108,34109],{},"Recruiters are compensated with a fixed rate based on the average candidate's\nfirst-year base compensation package. The target compensation range for each\nrole is established before recruiters begin submitting candidates. This\nstructure:",[144,34111,34112,34115,34118],{},[147,34113,34114],{},"Provides predictable costs for FlowFuse",[147,34116,34117],{},"Eliminates potential conflicts of interest during salary negotiations",[147,34119,34120],{},"Ensures recruiters focus on finding the right fit, anywhere in the world",{"title":75,"searchDepth":76,"depth":76,"links":34122},[34123,34124],{"id":34077,"depth":76,"text":34078},{"id":34105,"depth":76,"text":34106},{},"\u002Fhandbook\u002Fpeopleops\u002Fhiring\u002Frecruiters",{"title":33336,"description":34074},"handbook\u002Fpeopleops\u002Fhiring\u002Frecruiters","V4tHR7Nm4OmxGisY91ncTddjcdl6QJcbLUFbp4_TI4s",{"id":34131,"title":33594,"body":34132,"description":34136,"extension":81,"meta":34232,"navGroup":83,"navOrder":83,"navTitle":33594,"navigation":84,"path":34233,"seo":34234,"stem":34235,"__hash__":34236},"handbook\u002Fhandbook\u002Fpeopleops\u002Fhiring\u002Fscreening-call.md",{"type":7,"value":34133,"toc":34230},[34134,34137,34140,34155,34158,34161,34164,34227],[19,34135,34136],{},"The first stage in almost every interview process is a 15-20 minute screening call.\nThis is usually done over a video call, but a phone call can be acceptable in certain circumstances.",[19,34138,34139],{},"The structure of this call is as follows:",[504,34141,34142,34145,34152],{},[147,34143,34144],{},"Set the agenda for the call, and goals for FlowFuse.",[147,34146,34147,34148,549],{},"Go through ",[46,34149,34151],{"href":34150},"#screening-call","the list of questions",[147,34153,34154],{},"Leave at least 5 minutes at the end for the candidate to ask their questions.",[239,34156,33594],{"id":34157},"screening-call",[19,34159,34160],{},"This screening call serves as a filter for both the company to align with the candidate on mutual expectations and the details of the role.",[19,34162,34163],{},"During this call FlowFuse should understand:",[504,34165,34166,34172,34175,34178,34189,34192,34212,34215,34218,34221,34224],{},[147,34167,34168,34169,549],{},"Alignment to ",[46,34170,2845],{"href":34171},"\u002Fhandbook\u002Fcompany\u002Fvalues.md",[147,34173,34174],{},"The candidate is enthusiastic about the company and the open role.",[147,34176,34177],{},"The candidate is seeking full-time employment (FlowFuse only offers full-time positions).",[147,34179,34180,34181],{},"To get that information and make the candidate feels comfortable, use ice-braker questions like:\n",[144,34182,34183,34186],{},[147,34184,34185],{},"\"What did you think of the job posting? Is this what you're looking for in your next career move?\"",[147,34187,34188],{},"\"I'd love to hear about your journey, especially the last 3-5 years. What led you here and what have you learned along the way?\"",[147,34190,34191],{},"Compensation range for the candidate.",[147,34193,34194,34195],{},"The candidate's current location.\n",[144,34196,34197,34200,34203,34206,34209],{},[147,34198,34199],{},"Timezone and any overlap information.",[147,34201,34202],{},"Any visa requirements to work in their current location.",[147,34204,34205],{},"If they service customers, can they travel to the full geography they serve? (Note that any roles with significant travel requirements will have specific details in the job posting.)",[147,34207,34208],{},"Can travel to the US and EU with one week's notice? (For events, get-togethers, etc.)",[147,34210,34211],{},"Any plans to change location in the near future.",[147,34213,34214],{},"Notice period, or time from offer to start.",[147,34216,34217],{},"What's the biggest hot-take you have about the field of your job role?",[147,34219,34220],{},"How did Generative AI change your role and job?",[147,34222,34223],{},"Do you have experience at start ups? What does it mean for you to operate in a start up?",[147,34225,34226],{},"Do you have experience with Industrial or Manufacturing sectors of the market?",[19,34228,34229],{},"Generally half of all candidates in the screening stage will not move to the next stage of the interview process.",{"title":75,"searchDepth":76,"depth":76,"links":34231},[],{},"\u002Fhandbook\u002Fpeopleops\u002Fhiring\u002Fscreening-call",{"description":34136},"handbook\u002Fpeopleops\u002Fhiring\u002Fscreening-call","OiNocatwvuIKktxDpHqx6wkrv2Db3yfeitKEvd73Mp8",{"id":34238,"title":34239,"body":34240,"description":34244,"extension":81,"meta":34445,"navGroup":83,"navOrder":83,"navTitle":34446,"navigation":84,"path":34447,"seo":34448,"stem":34449,"__hash__":34450},"handbook\u002Fhandbook\u002Fpeopleops\u002Fhiring\u002Fstar-questions.md","Star Questions",{"type":7,"value":34241,"toc":34441},[34242,34245,34253,34257,34260,34264,34268,34272,34276,34280,34284,34290,34294,34298,34304,34308,34312,34318,34322,34326,34332,34336,34340,34346,34350,34354,34360,34364,34368,34374,34378,34382,34388,34392,34396,34404,34408,34412,34418,34422,34429,34433],[19,34243,34244],{},"Every candidate hiring plan includes at least one STAR Interview.",[19,34246,1388,34247,34252],{},[46,34248,34251],{"href":34249,"rel":34250},"https:\u002F\u002Fwww.themuse.com\u002Fadvice\u002Fstar-interview-method",[108],"STAR interview"," is aimed at discussing the candidates past performance in certain situations and is meant to given an indication if the way they have behaved in the past is in line with FlowFuse expectations.",[14,34254,34256],{"id":34255},"questions","Questions",[19,34258,34259],{},"Below are some questions that can be used and how answers are evaluated.",[14,34261,34263],{"id":34262},"star-interview-questions","STAR Interview Questions",[239,34265,34267],{"id":34266},"_1-how-do-you-build-connection-and-strengthen-relationships-on-a-distributed-team-beyond-just-getting-the-work-done","1. How do you build connection and strengthen relationships on a distributed team, beyond just getting the work done?",[19,34269,34270],{},[423,34271,2845],{},[144,34273,34274],{},[147,34275,21407],{},[239,34277,34279],{"id":34278},"_2-in-an-async-environment-we-rely-heavily-on-written-communication-have-you-ever-had-written-communication-go-wrong","2. In an async environment, we rely heavily on written communication. Have you ever had written communication go wrong?",[19,34281,34282],{},[423,34283,2845],{},[144,34285,34286,34288],{},[147,34287,21415],{},[147,34289,15320],{},[239,34291,34293],{"id":34292},"_3-walk-me-through-a-situation-where-you-shipped-something-that-wasnt-right-the-first-time-what-happened-next","3. Walk me through a situation where you shipped something that wasn’t right the first time. What happened next?",[19,34295,34296],{},[423,34297,2845],{},[144,34299,34300,34302],{},[147,34301,15320],{},[147,34303,15308],{},[239,34305,34307],{"id":34306},"_4-when-did-understanding-the-customers-perspective-change-how-you-approached-a-problem-what-happened-as-a-result","4. When did understanding the customer’s perspective change how you approached a problem? What happened as a result?",[19,34309,34310],{},[423,34311,2845],{},[144,34313,34314,34316],{},[147,34315,21423],{},[147,34317,15308],{},[239,34319,34321],{"id":34320},"_5-has-someones-input-changed-your-perspective-during-a-discussion","5. Has someone’s input changed your perspective during a discussion?",[19,34323,34324],{},[423,34325,2845],{},[144,34327,34328,34330],{},[147,34329,21415],{},[147,34331,21407],{},[239,34333,34335],{"id":34334},"_6-have-you-ever-noticed-a-problem-and-decided-to-jump-in-what-happened","6. Have you ever noticed a problem and decided to jump in? What happened?",[19,34337,34338],{},[423,34339,2845],{},[144,34341,34342,34344],{},[147,34343,15308],{},[147,34345,15320],{},[239,34347,34349],{"id":34348},"_7-whats-an-example-of-helping-someone-through-a-blocker-rather-than-solving-it-for-them","7. What’s an example of helping someone through a blocker rather than solving it for them?",[19,34351,34352],{},[423,34353,2845],{},[144,34355,34356,34358],{},[147,34357,21407],{},[147,34359,15320],{},[239,34361,34363],{"id":34362},"_8-when-was-the-last-time-you-disagreed-with-someone-at-work-and-how-did-you-handle-it","8. When was the last time you disagreed with someone at work, and how did you handle it?",[19,34365,34366],{},[423,34367,2845],{},[144,34369,34370,34372],{},[147,34371,21415],{},[147,34373,21407],{},[239,34375,34377],{"id":34376},"_9-whats-a-situation-where-you-had-to-navigate-difficult-feedback-either-giving-or-receiving-it","9. What’s a situation where you had to navigate difficult feedback, either giving or receiving it?",[19,34379,34380],{},[423,34381,2845],{},[144,34383,34384,34386],{},[147,34385,21415],{},[147,34387,15320],{},[239,34389,34391],{"id":34390},"_10-when-have-you-acted-quickly-and-been-wrong-what-did-you-do-afterward","10. When have you acted quickly and been wrong? What did you do afterward?",[19,34393,34394],{},[423,34395,2845],{},[144,34397,34398,34400,34402],{},[147,34399,15308],{},[147,34401,15320],{},[147,34403,21415],{},[239,34405,34407],{"id":34406},"_11-think-of-your-past-managers-what-qualities-did-you-appreciate-about-them","11. Think of your past managers. What qualities did you appreciate about them?",[19,34409,34410],{},[423,34411,2845],{},[144,34413,34414,34416],{},[147,34415,21407],{},[147,34417,21415],{},[239,34419,34421],{"id":34420},"_12-in-a-perfect-world-we-have-all-the-data-in-our-world-we-dont-tell-me-about-a-time-you-chose-to-force-a-decision-even-though-your-peers-or-bosses-wanted-to-wait-for-more-information-what-was-the-risk-of-acting-and-what-was-the-risk-of-waiting","12. In a perfect world, we have all the data. In our world, we don't. Tell me about a time you chose to force a decision even though your peers or bosses wanted to wait for more information. What was the risk of acting, and what was the risk of waiting",[144,34423,34424,34426],{},[147,34425,7135],{},[147,34427,34428],{},"Conviction Over Consensus",[239,34430,34432],{"id":34431},"_13-follow-up-to-the-previous-question-when-you-realized-that-decision-was-wrong-what-was-the-specific-trigger-that-told-you-it-was-failing-how-much-time-passed-between-that-trigger-and-you-taking-action-to-fix-it","13. Follow-up to the previous question: When you realized that decision was wrong, what was the specific 'trigger' that told you it was failing? How much time passed between that trigger and you taking action to fix it?",[144,34434,34435,34438],{},[147,34436,34437],{},"Intellectual Honesty",[147,34439,34440],{},"Correction Velocity",{"title":75,"searchDepth":76,"depth":76,"links":34442},[34443,34444],{"id":34255,"depth":76,"text":34256},{"id":34262,"depth":76,"text":34263},{},"STAR Questions","\u002Fhandbook\u002Fpeopleops\u002Fhiring\u002Fstar-questions",{"description":34244},"handbook\u002Fpeopleops\u002Fhiring\u002Fstar-questions","e-GtdaH_jdRox1BqJCRLXhSRMmY1zaBm4ssh1KvoIF4",{"id":34452,"title":34453,"body":34454,"description":34461,"extension":81,"meta":34500,"navGroup":30220,"navOrder":83,"navTitle":34501,"navigation":84,"path":34502,"seo":34503,"stem":34504,"__hash__":34505},"handbook\u002Fhandbook\u002Fpeopleops\u002Findex.md","People Operations",{"type":7,"value":34455,"toc":34498},[34456,34459,34462],[10,34457,34453],{"id":34458},"people-operations",[19,34460,34461],{},"People operations contains information on HR related policies at FlowFuse.",[144,34463,34464,34468,34472,34476,34480,34486,34492],{},[147,34465,34466],{},[46,34467,49],{"href":31984},[147,34469,34470],{},[46,34471,31990],{"href":32654},[147,34473,34474],{},[46,34475,30039],{"href":32173},[147,34477,34478],{},[46,34479,33291],{"href":5024},[147,34481,34482],{},[46,34483,34485],{"href":34484},"\u002Fhandbook\u002Fpeopleops\u002Forganization","PeopleOps Policies",[147,34487,34488],{},[46,34489,34491],{"href":34490},"\u002Fhandbook\u002Fpeopleops\u002Fleave","Vacation & Leave",[147,34493,34494],{},[46,34495,34497],{"href":34496},"\u002Fhandbook\u002Fpeopleops\u002Fsummit","Summits",{"title":75,"searchDepth":76,"depth":76,"links":34499},[],{},"People Ops","\u002Fhandbook\u002Fpeopleops",{"title":34453,"description":34461},"handbook\u002Fpeopleops\u002Findex","_JmqkfVrE2gMScXxkpqD6kn9gthPsQcjOTzzRXIvsLE",{"id":34507,"title":34508,"body":34509,"description":75,"extension":81,"meta":34728,"navGroup":34729,"navOrder":83,"navTitle":34508,"navigation":84,"path":34730,"seo":34731,"stem":34732,"__hash__":34733},"handbook\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Faccount-executive.md","Account Executive",{"type":7,"value":34510,"toc":34718},[34511,34514,34518,34521,34544,34548,34577,34581,34637,34641,34652,34656,34667,34671,34694,34698,34701],[10,34512,34508],{"id":34513},"account-executive",[14,34515,34517],{"id":34516},"job-description","Job Description",[19,34519,34520],{},"We are seeking a highly motivated, driven, and self-sufficient Account Executive (a \"Sales Explorer\") to join our team and drive growth in the local region. In this early-stage growth opportunity, you will be responsible for identifying and closing new business opportunities, building strong customer relationships, and contributing to the overall success of FlowFuse. This role requires someone who can build pipeline, refine messaging, and optimize our sales motion based on real conversations, demonstrating a willingness to experiment and a comfort level with ambiguity.",[144,34522,34523,34526,34529,34532,34535,34538,34541],{},[147,34524,34525],{},"Expand FlowFuse's customer base and revenue in the regional market, targeting key accounts using an Account-Based Marketing (ABM) approach.",[147,34527,34528],{},"Identify and engage new prospects, and drive deals from initial contact to close.",[147,34530,34531],{},"Test and refine our sales motion to optimize effectiveness in the regional market.",[147,34533,34534],{},"Generate pipeline through proactive prospecting and creative outreach, going beyond traditional cold emails.",[147,34536,34537],{},"Effectively communicate the value proposition of FlowFuse to both technical and business stakeholders.",[147,34539,34540],{},"Collaborate cross-functionally with marketing, product, and customer success to align on go-to-market strategy.",[147,34542,34543],{},"Gather and communicate market feedback to inform product development and sales enablement.",[14,34545,34547],{"id":34546},"skills","Skills",[144,34549,34550,34553,34556,34559,34562,34565,34568,34571,34574],{},[147,34551,34552],{},"Startup Sales DNA: Experience working in an early-stage company (or have the mindset to thrive in one). Embraces ambiguity, iteration, and autonomy.",[147,34554,34555],{},"Full-Cycle Sales Experience: Proven experience selling B2B SaaS or enterprise technology and navigating complex sales cycles with multiple stakeholders.",[147,34557,34558],{},"Curiosity & Adaptability: A passion for testing new approaches, learning from data, and evolving sales strategies to match market needs.",[147,34560,34561],{},"Creative Prospecting Skills: Ability to go beyond cold emails and find innovative ways to connect with buyers.",[147,34563,34564],{},"Communication Skills: Excellent verbal and written communication skills with the ability to present complex information clearly.  ",[147,34566,34567],{},"Technical Acumen: Comfortable understanding and explaining technical solutions such as Node-RED, industrial automation, IoT, or DevOps tooling.",[147,34569,34570],{},"Cultural Awareness: Strong understanding of cultural nuances and business practices within the region.",[147,34572,34573],{},"Familiarity with AI tools to enhance sales processes is a plus.",[147,34575,34576],{},"A strong attitude match with the existing team is critical, as is experience managing both inbound leads and creating outbound strategies.",[14,34578,34580],{"id":34579},"_90-day-plan","90-Day Plan",[144,34582,34583,34603,34620],{},[147,34584,34585,34586],{},"Week 1-4:\n",[144,34587,34588,34591,34594,34597,34600],{},[147,34589,34590],{},"Immerse yourself in FlowFuse’s product, strategy, and market with a focus on enterprise-readiness, applications on the edge, and enhanced integration capabilities.",[147,34592,34593],{},"By week 2, you should be driving sales pitches with a supportive shadow.",[147,34595,34596],{},"Familiarize yourself with the Node-RED ecosystem, competitive landscape, and specific regional market dynamics.",[147,34598,34599],{},"Meet with key stakeholders across sales, marketing, product, and customer success.",[147,34601,34602],{},"Review existing sales materials and processes, and roll out iterative improvements.",[147,34604,34605,34606],{},"Week 5-8:\n",[144,34607,34608,34611,34614,34617],{},[147,34609,34610],{},"Develop a deep understanding of our target customer personas and their specific needs within the region.",[147,34612,34613],{},"Begin refining key messaging and positioning for FlowFuse in the regional market.",[147,34615,34616],{},"Start building pipeline through proactive prospecting and outreach.",[147,34618,34619],{},"Analyze initial sales activity and identify key metrics for tracking success.",[147,34621,34622,34623],{},"Week 9-13:\n",[144,34624,34625,34628,34631,34634],{},[147,34626,34627],{},"Actively manage and progress sales opportunities.",[147,34629,34630],{},"Refine and iterate on sales strategies and playbooks based on market feedback and results.",[147,34632,34633],{},"Collaborate with marketing to develop targeted campaigns for the regional market.",[147,34635,34636],{},"Provide feedback to the product team on market needs and requirements.",[14,34638,34640],{"id":34639},"emea-specific-information","EMEA Specific information",[144,34642,34643,34646,34649],{},[147,34644,34645],{},"Expand FlowFuse's customer base and revenue in the EMEA market, targeting key accounts using an Account-Based Marketing (ABM) approach.",[147,34647,34648],{},"Test and refine our sales motion to optimize effectiveness in the EMEA market.",[147,34650,34651],{},"Multilingual & Culturally Fluent (Bonus): Fluency in French, German, or another European language is a significant plus.",[14,34653,34655],{"id":34654},"us-specific-information","US Specific information",[144,34657,34658,34661,34664],{},[147,34659,34660],{},"Expand FlowFuse's customer base and revenue in the US market, targeting key accounts using an Account-Based Marketing (ABM) approach.",[147,34662,34663],{},"Test and refine our sales motion to optimize effectiveness in the US market.",[147,34665,34666],{},"Multilingual & Culturally Fluent (Bonus): Fluency in Spanish language is a significant plus.",[14,34668,34670],{"id":34669},"hiring-plan","Hiring Plan",[144,34672,34673,34676,34679,34682,34685,34688,34691],{},[147,34674,34675],{},"Initial Screening: Review resumes and cover letters to assess candidate qualifications and experience.",[147,34677,34678],{},"First Interview: Conduct a phone or video interview to further evaluate candidate skills, experience, and cultural fit.",[147,34680,34681],{},"Second Interview: In-depth interview with the hiring manager and other team members to discuss specific experience, skills, and how the candidate aligns with the product strategy and pillars.",[147,34683,34684],{},"STAR Interview (45mins): A behavioral interview to understand past experiences and assess alignment with FlowFuse's values, initiative, and collaboration style. Conducted by the CEO.",[147,34686,34687],{},"Assessment\u002FPresentation: May require a work sample, case study, or presentation to demonstrate the candidate's abilities.",[147,34689,34690],{},"Final Interview: A final interview with key stakeholders.",[147,34692,34693],{},"Offer: Extend an offer to the selected candidate.",[164,34695,34697],{"id":34696},"assessment","Assessment",[19,34699,34700],{},"Prepare a 10-minute discovery + pitch presentation to a hypothetical industrial automation prospect who is evaluating options for managing hundreds of Node-RED instances across many remote sites. Assume the audience includes an OT leader and an IT architect. Your goal is to identify key pain points and position FlowFuse’s value. Please spend no more than 90 minutes on this task.\nWhat are we looking for?",[144,34702,34703,34706,34709,34712,34715],{},[147,34704,34705],{},"Messaging skills",[147,34707,34708],{},"Ability to tailor pitch to personas",[147,34710,34711],{},"Business acumen",[147,34713,34714],{},"Clarity",[147,34716,34717],{},"Storytelling",{"title":75,"searchDepth":76,"depth":76,"links":34719},[34720,34721,34722,34723,34724,34725],{"id":34516,"depth":76,"text":34517},{"id":34546,"depth":76,"text":34547},{"id":34579,"depth":76,"text":34580},{"id":34639,"depth":76,"text":34640},{"id":34654,"depth":76,"text":34655},{"id":34669,"depth":76,"text":34670,"children":34726},[34727],{"id":34696,"depth":605,"text":34697},{},"Job Descriptions","\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Faccount-executive",{"title":34508,"description":75},"handbook\u002Fpeopleops\u002Fjob-descriptions\u002Faccount-executive","SIBHDQ5GGHYMTVg-z6MdPMzBDMdcu-tOXXb4J183quk",{"id":34735,"title":5243,"body":34736,"description":75,"extension":81,"meta":34826,"navGroup":34729,"navOrder":83,"navTitle":5243,"navigation":84,"path":34827,"seo":34828,"stem":34829,"__hash__":34830},"handbook\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fceo.md",{"type":7,"value":34737,"toc":34822},[34738,34741,34743,34746,34749,34794,34796],[10,34739,5243],{"id":34740},"ceo",[14,34742,34517],{"id":34516},[19,34744,34745],{},"As the Chief Executive Officer (CEO) of FlowFuse, you will be the driving force behind the company's vision, strategy, and overall success. You will be responsible for providing strong leadership, setting strategic direction, fostering a high-performance culture, and ensuring the company achieves its growth objectives. This role requires a dynamic and visionary leader focused on scaling the businesses, building strong teams, and navigating the complexities of a rapidly evolving technology landscape. You will be the primary point of contact for investors, key partners, and the broader market, representing FlowFuse's mission and values. Your leadership will be instrumental in shaping the future of FlowFuse and solidifying its position as a leader in its market.",[19,34747,34748],{},"Key responsibilities include:",[144,34750,34751,34756,34759,34762,34765,34768,34771,34778,34781,34784,34787],{},[147,34752,34753,34754],{},"Epitomizing the company's ",[46,34755,7062],{"href":2844},[147,34757,34758],{},"Developing and executing the company's overall strategic plan, ensuring alignment across all departments.",[147,34760,34761],{},"Providing strong and inspirational leadership to the executive team and the entire organization.",[147,34763,34764],{},"Building and nurturing a high-performance, collaborative, and inclusive company culture.",[147,34766,34767],{},"Overseeing the company's financial performance, ensuring sustainable growth, setting and achieving the funding strategy.",[147,34769,34770],{},"Driving revenue growth and market share expansion through strategic partnerships, sales initiatives, and product innovation.",[147,34772,34773,34774,34777],{},"Representing FlowFuse to investors, ",[46,34775,34776],{"href":56},"the board of directors",", customers, partners, and the public.",[147,34779,34780],{},"Attracting, developing, and retaining top talent across all levels of the organization.",[147,34782,34783],{},"Ensuring compliance with all legal and regulatory requirements.",[147,34785,34786],{},"Staying abreast of industry trends, competitive landscape, and emerging technologies to inform strategic decisions.",[147,34788,34789,34790,34793],{},"Fostering innovation and ",[46,34791,34792],{"href":17819},"iterative improvement"," across all aspects of the business.",[14,34795,34547],{"id":34546},[144,34797,34798,34801,34804,34807,34810,34813,34816,34819],{},[147,34799,34800],{},"Strong financial acumen with experience in managing budgets, fundraising (preferred), and driving profitability.",[147,34802,34803],{},"Exceptional leadership and interpersonal skills, with the ability to inspire and motivate teams, build strong relationships, and influence stakeholders.",[147,34805,34806],{},"Excellent communication, presentation, and public speaking skills.",[147,34808,34809],{},"Strategic thinker with the ability to analyze complex situations, identify opportunities, and make sound decisions.",[147,34811,34812],{},"Strong understanding of software development lifecycles, cloud technologies, and open-source ecosystems (familiarity with Node-RED and related technologies is a significant plus).",[147,34814,34815],{},"Experience in building and scaling high-performing teams and fostering a positive company culture.",[147,34817,34818],{},"Ability to navigate and thrive in a fast-paced and dynamic environment.",[147,34820,34821],{},"Strong ethical compass and commitment to FlowFuse's values.",{"title":75,"searchDepth":76,"depth":76,"links":34823},[34824,34825],{"id":34516,"depth":76,"text":34517},{"id":34546,"depth":76,"text":34547},{},"\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fceo",{"title":5243,"description":75},"handbook\u002Fpeopleops\u002Fjob-descriptions\u002Fceo","x_QkftMP-2upuZjoZLQFNvXXUb0OQeYfQaBlVV08maM",{"id":34832,"title":7035,"body":34833,"description":75,"extension":81,"meta":34993,"navGroup":34729,"navOrder":83,"navTitle":7035,"navigation":84,"path":34994,"seo":34995,"stem":34996,"__hash__":34997},"handbook\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fchief-of-staff.md",{"type":7,"value":34834,"toc":34987},[34835,34838,34840,34843,34846,34849,34852,34872,34874,34906,34908,34961,34963],[10,34836,7035],{"id":34837},"chief-of-staff",[14,34839,34517],{"id":34516},[19,34841,34842],{},"The Chief of Staff (or Founder's Associate, as the role is often known in Europe) is the trusted right-hand person to our CEO. This pivotal role offers unparalleled exposure to all facets of our business, rapid professional growth, and the chance to significantly impact our strategic direction and operational efficiency.",[19,34844,34845],{},"This role is ideal for someone who thrives in a fast-paced environment, can seamlessly switch between high-level strategic thinking and hands-on execution, and possesses exceptional interpersonal and communication skills. This role provides a holistic view of building and scaling a successful company. This role is not an extension of an Executive Assistant role.",[19,34847,34848],{},"The Chief of Staff is always located in the CEO's timezone. This is always a hard requirement for the role.",[19,34850,34851],{},"You:",[144,34853,34854,34857,34860,34863,34866,34869],{},[147,34855,34856],{},"Lead and manage key strategic projects from conception to completion, often cross-departmental and high-priority, on behalf of the CEO",[147,34858,34859],{},"Streamline internal workflows to enhance organizational effectiveness and productivity",[147,34861,34862],{},"Act as a central point of contact for internal and external stakeholders, filtering and prioritizing information flow to the CEO",[147,34864,34865],{},"Draft and prepare internal and external communications, presentations, and reports for the CEO, including investor communications and tech communication",[147,34867,34868],{},"Act as a thought partner and sounding board for the CEO on various business challenges and opportunities",[147,34870,34871],{},"Undertake ad-hoc projects and assignments as required, demonstrating flexibility and adaptability",[14,34873,34547],{"id":34546},[144,34875,34876,34879,34882,34885,34888,34891,34894,34897,34900,34903],{},[147,34877,34878],{},"Experience in a high-growth startup, management consulting, investment banking, venture capital, or a similar fast-paced environment",[147,34880,34881],{},"Proven experience in project management, strategic planning, and operational execution",[147,34883,34884],{},"Prior experience in a Chief of Staff or Founder's Associate role is helpful",[147,34886,34887],{},"AI Native: Constantly looking for opportunities to improve organizational efficiency with AI and other tools",[147,34889,34890],{},"Strategic & Analytical Thinking: Ability to quickly grasp complex concepts, synthesize information, and develop actionable insights",[147,34892,34893],{},"Exceptional Communication: Superior written and verbal communication skills, with the ability to articulate complex ideas clearly and concisely to diverse audiences",[147,34895,34896],{},"Project Management: Strong organizational skills with the ability to manage multiple projects simultaneously, prioritize effectively, and meet tight deadlines",[147,34898,34899],{},"Proactivity & Initiative: Self-starter with a strong sense of ownership and the ability to anticipate needs and act independently",[147,34901,34902],{},"Interpersonal Savvy: High emotional intelligence and the ability to build rapport and influence across all levels of an organization",[147,34904,34905],{},"Adaptability & Resilience: Comfortable navigating ambiguity and change in a dynamic environment",[14,34907,34580],{"id":34579},[144,34909,34910,34929,34945],{},[147,34911,34585,34912],{},[144,34913,34914,34917,34920,34923,34926],{},[147,34915,34916],{},"Immerse yourself in the company's product, strategy, and market landscape",[147,34918,34919],{},"Build foundational relationships with key stakeholders, including the leadership team, department heads, and direct reports to the CEO",[147,34921,34922],{},"Familiarize yourself with current operational processes, key strategic initiatives, and immediate priorities of the CEO",[147,34924,34925],{},"Review existing dashboards and reporting structures to understand key metrics",[147,34927,34928],{},"Take over any existing recruiting processes",[147,34930,34605,34931],{},[144,34932,34933,34936,34939,34942],{},[147,34934,34935],{},"Begin to take ownership of specific projects outside recruiting, acting as a direct liaison for the CEO",[147,34937,34938],{},"Identify and propose initial improvements to communication flows, meeting cadences, or operational efficiencies",[147,34940,34941],{},"Start preparing materials for executive meetings and assist in follow-up and accountability tracking",[147,34943,34944],{},"Conduct initial deep dives into areas identified as high-priority by the CEO",[147,34946,34622,34947],{},[144,34948,34949,34952,34955,34958],{},[147,34950,34951],{},"Fully integrate into the executive team's rhythm, proactively identifying opportunities to add value and streamline work",[147,34953,34954],{},"Lead at least one cross-functional initiative from planning to initial execution",[147,34956,34957],{},"Establish a clear system for prioritizing and managing the CEO's key strategic initiatives",[147,34959,34960],{},"Develop a deeper understanding of the company's financial health and strategic partnerships",[14,34962,34670],{"id":34669},[144,34964,34965,34968,34973,34981,34984],{},[147,34966,34967],{},"Resume Screening: Review resumes and cover letters to assess candidate qualifications and experience",[147,34969,34970,34972],{},[46,34971,33587],{"href":33593},": Conduct a video interview to further evaluate candidate skills, experience, and cultural fit with the Chief of Staff role",[147,34974,34975,34976],{},"Second Interview: In-depth interview with the hiring manager to discuss specific experience, strategic thinking, and alignment with the leader's working style\n",[144,34977,34978],{},[147,34979,34980],{},"STAR Interview: Behavioral interview focusing on past situations, tasks, actions, and results to understand problem-solving abilities and value alignment",[147,34982,34983],{},"Assessment\u002FPresentation: Candidates may be asked to complete a case study, analyze a business problem, or prepare a brief presentation to demonstrate strategic thinking and communication skills",[147,34985,34986],{},"Offer: Extend an offer to the selected candidate",{"title":75,"searchDepth":76,"depth":76,"links":34988},[34989,34990,34991,34992],{"id":34516,"depth":76,"text":34517},{"id":34546,"depth":76,"text":34547},{"id":34579,"depth":76,"text":34580},{"id":34669,"depth":76,"text":34670},{},"\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fchief-of-staff",{"title":7035,"description":75},"handbook\u002Fpeopleops\u002Fjob-descriptions\u002Fchief-of-staff","8zEmWou2vOIV-zBCWgHX5Bs3t8YT3yZapTV9WU4tWBw",{"id":34999,"title":5240,"body":35000,"description":75,"extension":81,"meta":35070,"navGroup":34729,"navOrder":83,"navTitle":5240,"navigation":84,"path":35071,"seo":35072,"stem":35073,"__hash__":35074},"handbook\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fcto.md",{"type":7,"value":35001,"toc":35066},[35002,35004,35006,35009,35012,35015,35041,35043,35046],[10,35003,5240],{"id":6067},[14,35005,34517],{"id":34516},[19,35007,35008],{},"The Chief Technology Officer (CTO) at FlowFuse holds ultimate responsibility for the technical strategy, product engineering, and operational excellence of the FlowFuse platform. This senior leadership role demands a blend of deep technical expertise, strategic foresight, and exceptional cross-functional collaboration.",[19,35010,35011],{},"The CTO plays a pivotal role in shaping FlowFuse's technical direction, ensuring the product not only meets current demands but also anticipates future needs and drives growth. The CTO's responsibilities extend beyond direct engineering management to encompass broader technical stewardship, strategic partnerships, and fostering a culture of innovation across the organization.",[19,35013,35014],{},"Key Responsibilities:",[144,35016,35017,35020,35023,35026,35029,35032,35035,35038],{},[147,35018,35019],{},"Technical Vision & Strategy: The CTO defines the overall technical vision and strategy for FlowFuse, including architectural choices, technology stack decisions, and operational best practices. This role provides essential input and context for all major technical initiatives.",[147,35021,35022],{},"Product Engineering & Operations: The CTO has ultimate accountability for the successful development, delivery, and operational stability of the FlowFuse product. The CTO guides the product engineering teams to achieve high performance and maintain robust systems",[147,35024,35025],{},"Future-Proofing & Innovation: The CTO continuously monitors emerging technologies, particularly in areas like AI, to identify opportunities for their application within FlowFuse's product and internal operations. The CTO drives efforts to keep FlowFuse's engineering practices and technological foundations at the forefront.",[147,35027,35028],{},"Node-RED Ecosystem Stewardship: The CTO acts as the primary bridge between FlowFuse's product requirements and the Node-RED open-source project. This includes providing guidance and stewardship to the Node-RED community, ensuring FlowFuse lives up to its commitments, and identifying mutually beneficial paths forward in areas of potentially competing interests.",[147,35030,35031],{},"Product Vision Alignment: The CTO holds ultimate responsibility for the overarching product vision at a strategic level, collaborating closely with product leadership to ensure technical feasibility and alignment with business goals.",[147,35033,35034],{},"Security Leadership: The CTO oversees the security posture of FlowFuse, including secure engineering practices and ensuring compliance with relevant standards such as SOC2.",[147,35036,35037],{},"Cross-Functional Collaboration: The CTO works closely with sales, marketing, and customer success teams to understand customer needs, contribute to product growth strategies, and effectively communicate FlowFuse's technical value.",[147,35039,35040],{},"Team Enablement: The CTO partners with Engineering Managers or a VP of Engineering counterpart to translate strategic technical goals into actionable plans for the engineering teams, fostering an environment of continuous learning and excellence.",[14,35042,34547],{"id":34546},[19,35044,35045],{},"What the CTO Brings to the Role:",[144,35047,35048,35051,35054,35057,35060,35063],{},[147,35049,35050],{},"Deep Technical Expertise: The CTO possesses a strong engineering background with a profound understanding of modern software development, core technologies, and best practices. While this is a leadership role, the CTO remains a hands-on engineer with a solid grasp of complex technical challenges.",[147,35052,35053],{},"Strategic Technical Leadership: The CTO demonstrates proven experience in a senior technical leadership role, showcasing the ability to set technical direction, influence architectural decisions, and drive large-scale technical initiatives.",[147,35055,35056],{},"Cross-Organizational Collaboration: The CTO has a track record of successfully working across diverse teams and functions (e.g., product, sales, marketing, customers) to achieve shared objectives.",[147,35058,35059],{},"Continuous Learner: The CTO exhibits an insatiable curiosity and hunger to continuously learn new technologies, adapt to evolving landscapes, and expand personal skill sets to set a long-term vision for the company's technical trajectory.",[147,35061,35062],{},"Product & Business Acumen: The CTO has the ability to understand how technical decisions impact product capabilities and overall business growth, contributing to strategic conversations beyond just engineering.",[147,35064,35065],{},"Open Source Engagement: The CTO is familiar with open-source communities and demonstrates a commitment to nurturing strategic open-source projects, particularly Node-RED.",{"title":75,"searchDepth":76,"depth":76,"links":35067},[35068,35069],{"id":34516,"depth":76,"text":34517},{"id":34546,"depth":76,"text":34547},{},"\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fcto",{"title":5240,"description":75},"handbook\u002Fpeopleops\u002Fjob-descriptions\u002Fcto","zBxJF4FapNY0zqLHs4Az3nbQWbhmqkJ7zbMiOfsBUz8",{"id":35076,"title":35077,"body":35078,"description":75,"extension":81,"meta":35325,"navGroup":34729,"navOrder":83,"navTitle":35077,"navigation":84,"path":35326,"seo":35327,"stem":35328,"__hash__":35329},"handbook\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fdeveloper-relations-advocate.md","Developer Relations Advocate",{"type":7,"value":35079,"toc":35317},[35080,35083,35085,35088,35091,35093,35110,35112,35115,35144,35148,35168,35170,35295,35297],[10,35081,35077],{"id":35082},"developer-relations-advocate",[14,35084,34517],{"id":34516},[19,35086,35087],{},"The Developer Relations Advocate at FlowFuse serves as a crucial bridge between the company and the global community of Node-RED developers, industrial engineers, and automation professionals. This role combines technical evangelism, community building, and business development to drive adoption of the FlowFuse platform.",[19,35089,35090],{},"The Developer Relations Advocate is responsible for building relationships with key stakeholders in the industrial automation and IIoT ecosystems, creating compelling and engaging technical content, and identifying business opportunities within developer communities. This position requires a unique blend of technical depth, communication skills, and business acumen to effectively advocate for FlowFuse's solutions while understanding the real-world challenges the target users face.",[19,35092,35014],{},[144,35094,35095,35098,35101,35104,35107],{},[147,35096,35097],{},"Technical Evangelism & Content Creation: Develop and deliver compelling technical presentations at industry conferences, meetups, hackathons, and webinars focused on Node-RED, industrial automation, and IIoT applications. Create high-quality content including videos, webinars, social media posts, articles, tutorials, case studies, and technical documentation that demonstrates FlowFuse's value proposition.",[147,35099,35100],{},"Community Engagement & Relationship Building: Actively participate in and contribute to Node-RED, IIoT, and industrial automation communities, forums, and open-source projects. Identify and cultivate relationships with key influencers, community leaders, and potential advocates in the industrial automation space.",[147,35102,35103],{},"Business Development & Lead Generation: Identify and qualify business opportunities through community engagement and relationship building activities. Collaborate with sales and marketing teams to develop lead generation strategies targeting developers and technical decision-makers.",[147,35105,35106],{},"Product Advocacy & Feedback: Serve as the voice of the developer community within FlowFuse, providing product feedback and feature requests based on community needs. Work closely with product and engineering teams to ensure FlowFuse addresses real-world challenges faced by Node-RED developers and industrial engineers.",[147,35108,35109],{},"Strategic Partnerships & Ecosystem Development: Identify and develop strategic partnerships with complementary technology providers, system integrators, and industrial equipment manufacturers. Collaborate with partner organizations to create joint content, co-marketing opportunities, and technical integrations.",[14,35111,34547],{"id":34546},[19,35113,35114],{},"The Developer Relations Advocate skill set includes:",[144,35116,35117,35120,35123,35126,35129,35132,35135,35138,35141],{},[147,35118,35119],{},"Technical Content Creation: Demonstrated ability to create content that resonates with technical buyer personas in the form of articles, tutorials, webinars, conference presentations, workshop materials, and documentation.",[147,35121,35122],{},"Communication & Content Creation Excellence: Experience communicating with diverse audiences using various media formats. Proven ability to create engaging content through video, audio, and written formats that resonates with technical and business stakeholders.",[147,35124,35125],{},"Business Development Experience: Demonstrated experience in business relationship development or lead generation, preferably in technology or B2B SaaS environments. Understanding of sales processes and ability to identify and nurture business opportunities.",[147,35127,35128],{},"Cross-functional Collaboration: Proven ability to collaborate closely with digital marketing, sales, product, and engineering teams to optimize campaigns, processes, and product development initiatives.",[147,35130,35131],{},"Digital Marketing Knowledge: Understanding of engagement and retargeting strategies, as well as experience with platforms like Google Ads, LinkedIn ABM, content marketing, and social media engagement.",[147,35133,35134],{},"Results-Driven Approach: Strong project management skills with the ability to manage multiple priorities simultaneously. Experience measuring the impact of developer relations activities through metrics and analytics.",[147,35136,35137],{},"Community Involvement: Active participation in online and offline developer communities and ecosystems, including open-source platforms, technical blogs, social channels, forums, and professional networks.",[147,35139,35140],{},"Node-RED Experience: Hands-on experience with Node-RED, ideally in industrial settings with deep understanding of its capabilities and limitations in real-world applications.",[147,35142,35143],{},"Domain Expertise: Firsthand experience as a user, project lead, or decision-maker in roles similar to FlowFuse's core buyer personas (e.g., IIoT Project Lead, IT Operations Manager, Manufacturing Engineer, Plant Manager). Must have faced the pain points FlowFuse solves in deploying, managing, or scaling Node-RED-based solutions in industrial environments.",[164,35145,35147],{"id":35146},"nice-to-have","Nice to Have",[144,35149,35150,35153,35156,35159,35162,35165],{},[147,35151,35152],{},"Open-Source & Low-Code Background: Experience working in open-source software companies or with low-code\u002Fno-code development platforms, understanding of open-source community dynamics",[147,35154,35155],{},"Marketing Automation: Familiarity with marketing automation tools such as HubSpot, Marketo, Pardot, or similar platforms for lead nurturing and campaign management",[147,35157,35158],{},"Global Team Experience: Experience working effectively in remote and multicultural teams, with understanding of different regional markets and developer communities",[147,35160,35161],{},"Industrial Protocol Knowledge: Understanding of industrial communication protocols such as OPC-UA, Modbus, MQTT, or similar technologies used in manufacturing and automation",[147,35163,35164],{},"Technical Background: Software development experience in JavaScript\u002FNode.js, Python, or other relevant programming languages",[147,35166,35167],{},"CRM & Analytics Proficiency: Ability to identify and qualify business opportunities using CRM tools such as HubSpot, Salesforce, or similar platforms. Experience with lead scoring, pipeline management, and opportunity tracking.",[14,35169,34580],{"id":34579},[144,35171,35172,35213,35254],{},[147,35173,35174,35175],{},"Week 1-4: Foundation & FlowFuse Immersion",[144,35176,35177,35183,35189,35195,35201,35207],{},[147,35178,35179,35182],{},[423,35180,35181],{},"Product Deep Dive:"," Familiarize yourself with the FlowFuse product, platform capabilities, Node-RED ecosystem, and target customer profiles",[147,35184,35185,35188],{},[423,35186,35187],{},"Internal Alignment:"," Meet with key internal stakeholders across Marketing, Sales, Product, and Engineering teams to understand positioning, messaging, and go-to-market strategies",[147,35190,35191,35194],{},[423,35192,35193],{},"Content Audit:"," Review existing marketing materials, technical documentation, blog content, and community engagement efforts to identify gaps and opportunities",[147,35196,35197,35200],{},[423,35198,35199],{},"Community Research:"," Map the Node-RED and industrial automation community landscape, identifying key influencers, forums, events, and content creators",[147,35202,35203,35206],{},[423,35204,35205],{},"Marketing Integration:"," Begin collaborating with the marketing team on content calendar planning and campaign alignment",[147,35208,35209,35212],{},[423,35210,35211],{},"Initial Content Creation:"," Start producing introductory content (blog posts, social media content) to establish your voice within the FlowFuse brand",[147,35214,35215,35216],{},"Week 5-8: Community Engagement & Content Production",[144,35217,35218,35224,35230,35236,35242,35248],{},[147,35219,35220,35223],{},[423,35221,35222],{},"Active Community Participation:"," Begin engaging actively in Node-RED forums, Discord channels, GitHub discussions, and industrial automation communities",[147,35225,35226,35229],{},[423,35227,35228],{},"Content Creation Acceleration:"," Develop and publish technical tutorials, demo videos, and case studies showcasing FlowFuse's industrial applications",[147,35231,35232,35235],{},[423,35233,35234],{},"Speaking Opportunities:"," Identify and apply for speaking slots at upcoming conferences, webinars, and meetups",[147,35237,35238,35241],{},[423,35239,35240],{},"Partnership Exploration:"," Research potential strategic partnerships with complementary tools, system integrators, and technology providers",[147,35243,35244,35247],{},[423,35245,35246],{},"Lead Generation Integration:"," Work with marketing to develop lead magnets and technical content that supports demand generation efforts",[147,35249,35250,35253],{},[423,35251,35252],{},"Community Feedback Collection:"," Start gathering feedback from community interactions to inform product and marketing strategies",[147,35255,35256,35257],{},"Week 9-13: Strategic Impact & Growth Initiatives",[144,35258,35259,35265,35271,35277,35283,35289],{},[147,35260,35261,35264],{},[423,35262,35263],{},"Conference Speaking & Events:"," Deliver your first technical presentations representing FlowFuse at industry events or webinars",[147,35266,35267,35270],{},[423,35268,35269],{},"Content Strategy Optimization:"," Analyze performance metrics of your content and optimize based on engagement data and lead generation results",[147,35272,35273,35276],{},[423,35274,35275],{},"Strategic Partnership Development:"," Initiate conversations with identified strategic partners for content collaboration and co-marketing opportunities",[147,35278,35279,35282],{},[423,35280,35281],{},"Community Leadership:"," Take on leadership roles in relevant communities, potentially organizing meetups or contributing to open-source projects",[147,35284,35285,35288],{},[423,35286,35287],{},"Marketing Campaign Support:"," Collaborate on multi-channel marketing campaigns that integrate developer relations activities with broader marketing initiatives",[147,35290,35291,35294],{},[423,35292,35293],{},"Success Metrics Establishment:"," Develop and implement tracking systems for DevRel-specific KPIs including community growth, content engagement, and qualified lead generation",[14,35296,34670],{"id":34669},[504,35298,35299,35302,35313,35315],{},[147,35300,35301],{},"Screening: Review resumes and cover letters to assess candidate qualifications and experience.",[147,35303,35304,35305],{},"Technical Depth & Case study:\n",[144,35306,35307,35310],{},[147,35308,35309],{},"Conduct a video interview to assess technical proficiency -  experience scaling teams, and alignment with FlowFuse's \"sports team\" culture.",[147,35311,35312],{},"Technical Assessment \u002F Case Study: Candidates will be presented with a real-world scenario or problem relevant to FlowFuse's engineering challenges and asked to propose solutions or provide a code sample.",[147,35314,34684],{},[147,35316,34693],{},{"title":75,"searchDepth":76,"depth":76,"links":35318},[35319,35320,35323,35324],{"id":34516,"depth":76,"text":34517},{"id":34546,"depth":76,"text":34547,"children":35321},[35322],{"id":35146,"depth":605,"text":35147},{"id":34579,"depth":76,"text":34580},{"id":34669,"depth":76,"text":34670},{},"\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fdeveloper-relations-advocate",{"title":35077,"description":75},"handbook\u002Fpeopleops\u002Fjob-descriptions\u002Fdeveloper-relations-advocate","UYvjw--Mhc3asQwtXDA_Q74-PWkVRfVxDJnsFKwudu4",{"id":35331,"title":35332,"body":35333,"description":75,"extension":81,"meta":35530,"navGroup":34729,"navOrder":83,"navTitle":35332,"navigation":84,"path":35531,"seo":35532,"stem":35533,"__hash__":35534},"handbook\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fengineering-manager.md","Engineering Manager",{"type":7,"value":35334,"toc":35522},[35335,35338,35340,35343,35346,35349,35381,35383,35386,35418,35420,35473,35475,35492,35496,35499],[10,35336,35332],{"id":35337},"engineering-manager",[14,35339,34517],{"id":34516},[19,35341,35342],{},"At FlowFuse, an Engineering Manager leads and grows our team of engineers. You'll need a strong technical background to effectively guide the team and make informed decisions, but your primary focus will be on leadership, coaching, and scaling the team to drive higher performance and faster innovation.",[19,35344,35345],{},"We believe in running our engineering team like a sports team. You'll be responsible for fostering a culture of high performance, continuous improvement, and a relentless drive to win.",[19,35347,35348],{},"As an Engineering Manager, you'll be shaping our engineering culture and driving the execution of our product roadmap. You will:",[144,35350,35351,35357,35363,35369,35375],{},[147,35352,35353,35356],{},[423,35354,35355],{},"Coach and Develop Your Team",": You'll be responsible for the growth and development of your engineers. This includes conducting regular one-on-ones, providing constructive feedback, identifying areas for improvement, managing performance, and creating opportunities for career advancement. You'll know your team's strengths and weaknesses and how to best utilize their talents.",[147,35358,35359,35362],{},[423,35360,35361],{},"Drive Performance and Velocity",": You’ll do whatever is in your power to increase team performance and velocity. You'll establish clear goals and metrics, track progress, and implement strategies to help the team move faster and more efficiently without sacrificing quality. You will analyze the team's current performance, identify bottlenecks, and implement solutions to optimize our development processes.",[147,35364,35365,35368],{},[423,35366,35367],{},"Build a Winning Culture",": You will cultivate a high-performance, results-oriented environment. This means fostering a sense of ownership, accountability, and a shared commitment to our goals.",[147,35370,35371,35374],{},[423,35372,35373],{},"Strategize and Execute",": You'll work closely with other stakeholders to translate business objectives into a clear technical roadmap. You will be responsible for the successful and timely delivery of user-valuable software.",[147,35376,35377,35380],{},[423,35378,35379],{},"Provide Technical Leadership",": Your engineering background enables you to guide technical decisions, conduct code reviews, and mentor the team effectively. While writing code isn't your primary responsibility, your hands-on experience allows you to understand the technical challenges your team faces and make informed architectural decisions.",[14,35382,34547],{"id":34546},[19,35384,35385],{},"To be successful in this role, you'll need a blend of technical prowess and leadership skills. You should bring to the table:",[144,35387,35388,35394,35400,35406,35412],{},[147,35389,35390,35393],{},[423,35391,35392],{},"Solid Engineering Background",": You've walked the walk and have hands-on experience building software. Your background in software development gives you credibility with the team and enables you to make informed technical decisions. Familiarity with our tech stack (Node.js, Node-RED, Vue.js, DevOps tooling) is valuable but not essential—what matters most is that you've been in the trenches and understand what engineers face daily.",[147,35395,35396,35399],{},[423,35397,35398],{},"A Growth-Oriented Leader",": You have startup experience, and a track record of building and scaling high-performing engineering teams.",[147,35401,35402,35405],{},[423,35403,35404],{},"A Performance-Driven Mindset",": You are data-driven and have experience implementing and tracking metrics to improve team performance. You're constantly looking for ways to optimize processes and increase efficiency.",[147,35407,35408,35411],{},[423,35409,35410],{},"An Excellent Communicator",": You can clearly articulate technical concepts to both technical and non-technical audiences. You are a great listener and can build strong relationships with your team and other stakeholders.",[147,35413,35414,35417],{},[423,35415,35416],{},"A \"Sports Team\" Captain",": You understand the dynamics of a high-performing team. You know how to foster collaboration, healthy competition, and a shared will to win. You lead by example and inspire your team to perform at their best.",[14,35419,34580],{"id":34579},[144,35421,35422,35439,35459],{},[147,35423,35424,35425],{},"Week 1-4: Immerse & Understand\n",[144,35426,35427,35430,35433,35436],{},[147,35428,35429],{},"Familiarize yourself with FlowFuse's product vision, engineering strategy, and current roadmap.",[147,35431,35432],{},"Conduct initial one-on-ones with all direct reports, setting up regular cadences for feedback and development. Get to know your team, understand their strengths, career aspirations, and current projects.",[147,35434,35435],{},"Review existing engineering processes, tools, and codebase to identify initial areas of opportunity.",[147,35437,35438],{},"Meet with key stakeholders across product, sales, and leadership to understand their expectations and challenges related to engineering.",[147,35440,35441,35442],{},"Week 5-8: Assess and Plan\n",[144,35443,35444,35447,35450,35453,35456],{},[147,35445,35446],{},"Begin to analyze team performance metrics and identify potential bottlenecks or areas for improvement in velocity and quality. Set goals for expected improvements.",[147,35448,35449],{},"Collaborate with product and other engineering leads to refine the immediate technical roadmap and priorities.",[147,35451,35452],{},"Participate in code reviews and observe the developer workflow to understand the team's technical processes and challenges.",[147,35454,35455],{},"Implement initial process improvements to increase team efficiency and output.",[147,35457,35458],{},"Begin to define and track key performance indicators (KPIs) for your team, regularly reviewing progress.",[147,35460,35461,35462],{},"Week 9-13: Execute and Optimize\n",[144,35463,35464,35467,35470],{},[147,35465,35466],{},"Lead the planning and execution of a significant feature or project, demonstrating effective project management and technical leadership.",[147,35468,35469],{},"Identify and start addressing any performance management or development needs within the team, creating individual growth plans.",[147,35471,35472],{},"Develop plan to drive 20% throughput improvement in engineering org, leveraging AI and other tools to get there in the next 90 days.",[14,35474,34670],{"id":34669},[504,35476,35477,35479,35482,35485,35488,35490],{},[147,35478,34675],{},[147,35480,35481],{},"First Interview (Technical Background & Leadership): Conduct a video interview to assess technical background, understanding of software development practices, and leadership\u002Fmanagement experience. Past hands-on engineering experience is essential for credibility and decision-making.",[147,35483,35484],{},"Second Interview (Team Leadership & Culture Fit): In-depth interview with the CEO and other relevant team leads to discuss leadership philosophy, experience scaling teams, and alignment with FlowFuse's \"sports team\" culture.",[147,35486,35487],{},"Leadership Assessment \u002F Case Study: Candidates will be presented with a real-world scenario or problem relevant to FlowFuse's engineering challenges (e.g., team scaling, performance optimization, technical decision-making) and asked to propose solutions.",[147,35489,34684],{},[147,35491,34693],{},[164,35493,35495],{"id":35494},"first-interview","First interview",[19,35497,35498],{},"Questions to consider:",[144,35500,35501,35504,35507,35510,35513,35516,35519],{},[147,35502,35503],{},"What is your experience with remote work and remote-first environments?",[147,35505,35506],{},"Talk me through your EM experience.",[147,35508,35509],{},"Tell me about a time you handled an underperforming engineer on your team.",[147,35511,35512],{},"Why are you not an engineer but an EM?",[147,35514,35515],{},"What's the best KPI for an EM?",[147,35517,35518],{},"What's the best way to measure that an engineering team is delivering customer value?",[147,35520,35521],{},"What metrics do you want to start monitoring in your first week?",{"title":75,"searchDepth":76,"depth":76,"links":35523},[35524,35525,35526,35527],{"id":34516,"depth":76,"text":34517},{"id":34546,"depth":76,"text":34547},{"id":34579,"depth":76,"text":34580},{"id":34669,"depth":76,"text":34670,"children":35528},[35529],{"id":35494,"depth":605,"text":35495},{},"\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fengineering-manager",{"title":35332,"description":75},"handbook\u002Fpeopleops\u002Fjob-descriptions\u002Fengineering-manager","6DQI2D1h4c9VXfe07999t7PazJeMa_KX8dscl5crzM0",{"id":35536,"title":35537,"body":35538,"description":75,"extension":81,"meta":35696,"navGroup":34729,"navOrder":83,"navTitle":35537,"navigation":84,"path":35697,"seo":35698,"stem":35699,"__hash__":35700},"handbook\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Ffullstack-engineer.md","Fullstack Engineer",{"type":7,"value":35539,"toc":35689},[35540,35543,35545,35548,35551,35554,35586,35589,35609,35613,35627,35629,35632,35652,35654],[10,35541,35537],{"id":35542},"fullstack-engineer",[14,35544,34517],{"id":34516},[19,35546,35547],{},"At FlowFuse, a Fullstack Engineer builds end-to-end product features across frontend and backend systems. This role is for an engineer who is comfortable working across the stack and who understands that technical decisions directly impact how users experience the product.",[19,35549,35550],{},"You will collaborate closely with Product, Design, and other engineers to deliver reliable, scalable features. While this role is not a design position, we expect Fullstack Engineers at FlowFuse to consider usability, clarity, and user workflows when building product features.",[19,35552,35553],{},"A Fullstack Engineer is primarily responsible for:",[144,35555,35556,35562,35568,35574,35580],{},[147,35557,35558,35561],{},[423,35559,35560],{},"End-to-End Feature Delivery",": Building and maintaining fullstack product features from frontend to backend.",[147,35563,35564,35567],{},[423,35565,35566],{},"User-Aware Engineering",": Considering user experience, workflows, and clarity when implementing solutions.",[147,35569,35570,35573],{},[423,35571,35572],{},"Frontend and Backend Contribution",": Contributing meaningfully across UI, APIs, and services.",[147,35575,35576,35579],{},[423,35577,35578],{},"Incremental Delivery",": Shipping small, well-scoped changes frequently.",[147,35581,35582,35585],{},[423,35583,35584],{},"Collaboration",": Working closely with Product, Design, and Engineering peers.",[19,35587,35588],{},"Core Tasks and Responsibilities:",[144,35590,35591,35594,35597,35600,35603,35606],{},[147,35592,35593],{},"Implement frontend features using Vue and TypeScript.",[147,35595,35596],{},"Build and extend backend services and APIs using Node.js.",[147,35598,35599],{},"Participate in code reviews, planning, and technical discussions.",[147,35601,35602],{},"Identify usability improvements and raise them proactively.",[147,35604,35605],{},"Ensure code is secure, observable, and maintainable.",[147,35607,35608],{},"Contribute to improving architecture, tooling, and developer experience.",[164,35610,35612],{"id":35611},"what-is-the-fullstack-engineer-not-responsible-for","What is the Fullstack Engineer not responsible for?",[144,35614,35615,35618,35621,35624],{},[147,35616,35617],{},"Defining product strategy or roadmap priorities.",[147,35619,35620],{},"Owning visual design or branding decisions.",[147,35622,35623],{},"Managing people or performance.",[147,35625,35626],{},"Sales, pricing, or go-to-market decisions.",[14,35628,34547],{"id":34546},[19,35630,35631],{},"What a Fullstack Engineer brings to the table:",[144,35633,35634,35637,35640,35643,35646,35649],{},[147,35635,35636],{},"Strong experience working across the full stack.",[147,35638,35639],{},"Experience with modern frontend frameworks (Vue preferred, React acceptable).",[147,35641,35642],{},"Working knowledge of backend development with Node.js and APIs.",[147,35644,35645],{},"Ability to consider user workflows and usability while building features.",[147,35647,35648],{},"Comfort working in a remote, async-first environment across multiple time zones.",[147,35650,35651],{},"Comfort using AI tools to accelerate development and reduce manual effort.",[14,35653,34670],{"id":34669},[504,35655,35656,35659,35662,35665,35679,35682,35684,35687],{},[147,35657,35658],{},"Resume Review: Review resumes and relevant experience. Done by the hiring manager.",[147,35660,35661],{},"Screening Call (15m): Initial screener focused on role fit, communication, and alignment with how FlowFuse works. Conducted by the hiring manager or recruiter.",[147,35663,35664],{},"Engineering Manager Call (45m): A deeper alignment conversation covering where FlowFuse is today, where it is going, how the team works, and mutual expectations for the role.",[147,35666,35667,35668],{},"Take-Home Assignment (2–3 hours, unpaid): Candidates choose one of the following options. Both are explicitly timeboxed to 2–3 hours.\n",[144,35669,35670,35673,35676],{},[147,35671,35672],{},"Option A: Contribute a small, scoped pull request to Node-RED or a related open-source project.",[147,35674,35675],{},"Option B: Build a small fullstack application (pizza ordering app).",[147,35677,35678],{},"Note: AI tools are explicitly allowed and encouraged where appropriate.",[147,35680,35681],{},"Technical Interview (60m): Review the take-home work with 2–3 team members from engineering and, where relevant, product or design. The discussion focuses on problem understanding, decisions and tradeoffs, structure and clarity, and how the solution would evolve over time rather than feature completeness. There will be explicit discussion of where AI was used, how it was used, and why those choices were made.",[147,35683,34684],{},[147,35685,35686],{},"Team Interview (45m): Conversation focused on team collaboration, communication style, and culture fit.",[147,35688,34693],{},{"title":75,"searchDepth":76,"depth":76,"links":35690},[35691,35694,35695],{"id":34516,"depth":76,"text":34517,"children":35692},[35693],{"id":35611,"depth":605,"text":35612},{"id":34546,"depth":76,"text":34547},{"id":34669,"depth":76,"text":34670},{},"\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Ffullstack-engineer",{"title":35537,"description":75},"handbook\u002Fpeopleops\u002Fjob-descriptions\u002Ffullstack-engineer","7tjchclM9-fe_60aBE3vbZX7o4rYTMJoB-7Eew-LjkQ",{"id":35702,"title":35703,"body":35704,"description":75,"extension":81,"meta":35876,"navGroup":34729,"navOrder":83,"navTitle":35703,"navigation":84,"path":35877,"seo":35878,"stem":35879,"__hash__":35880},"handbook\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Ffullstack-engineer-ai.md","Fullstack Engineer (AI-Focused)",{"type":7,"value":35705,"toc":35869},[35706,35709,35711,35717,35723,35726,35729,35760,35762,35785,35789,35803,35805,35808,35835,35837],[10,35707,35703],{"id":35708},"fullstack-engineer-ai-focused",[14,35710,34517],{"id":34516},[19,35712,35713,35714,549],{},"At FlowFuse, a Fullstack Engineer (AI-Focused) builds real product features and internal tooling that apply artificial intelligence to practical user and engineering problems. This role is for a strong fullstack engineer with ",[423,35715,35716],{},"deep, hands-on experience shipping AI-powered features to production",[19,35718,35719,35720,35722],{},"This is ",[423,35721,6916],{}," a research role. You will focus on applied AI: integrating large language models, embeddings, and automation into FlowFuse in a way that is reliable, observable, secure, and valuable to users. This role will be a foundational contributor to establishing FlowFuse’s initial AI patterns, tooling, and best practices.",[19,35724,35725],{},"You will collaborate closely with Product, Design, and other engineers to identify high-impact AI use cases and deliver them end to end, while remaining a fullstack contributor across the platform.",[19,35727,35728],{},"A Fullstack Engineer (AI-Focused) is primarily responsible for:",[144,35730,35731,35737,35743,35749,35755],{},[147,35732,35733,35736],{},[423,35734,35735],{},"Applied AI Feature Development",": Designing and building AI-powered features and tooling used by customers and internal teams.",[147,35738,35739,35742],{},[423,35740,35741],{},"End-to-End Delivery",": Owning fullstack solutions that include frontend, backend, and AI components.",[147,35744,35745,35748],{},[423,35746,35747],{},"Capability Building",": Establishing patterns, guardrails, and examples that other engineers can safely build on.",[147,35750,35751,35754],{},[423,35752,35753],{},"Reliability and Safety",": Ensuring AI features behave predictably in production, including fallback behavior and observability.",[147,35756,35757,35759],{},[423,35758,35584],{},": Working closely with Product, Design, and Engineering peers to scope and deliver AI-driven solutions.",[19,35761,35588],{},[144,35763,35764,35767,35770,35773,35776,35779,35782],{},[147,35765,35766],{},"Integrate LLM APIs and AI services into FlowFuse features and tooling.",[147,35768,35769],{},"Build backend services and frontend interfaces that support AI-powered workflows.",[147,35771,35772],{},"Prototype, evaluate, and productionize AI features with clear scope and guardrails.",[147,35774,35775],{},"Design for AI failure modes, latency, cost, and operational constraints.",[147,35777,35778],{},"Ensure AI features align with privacy, security, and SOC2 requirements.",[147,35780,35781],{},"Share best practices and patterns for applied AI across the engineering team.",[147,35783,35784],{},"Contribute to broader fullstack product work as priorities evolve.",[164,35786,35788],{"id":35787},"what-is-the-fullstack-engineer-ai-focused-not-responsible-for","What is the Fullstack Engineer (AI-Focused) not responsible for?",[144,35790,35791,35794,35797,35800],{},[147,35792,35793],{},"Training or fine-tuning foundational models.",[147,35795,35796],{},"Conducting academic or exploratory ML research.",[147,35798,35799],{},"Owning company-wide AI strategy.",[147,35801,35802],{},"Replacing sound engineering judgment with automation.",[14,35804,34547],{"id":34546},[19,35806,35807],{},"What a Fullstack Engineer (AI-Focused) brings to the table:",[144,35809,35810,35812,35815,35818,35821,35824,35827,35830,35832],{},[147,35811,35636],{},[147,35813,35814],{},"Demonstrated experience shipping AI-powered features to production.",[147,35816,35817],{},"Hands-on experience integrating LLM APIs into real systems.",[147,35819,35820],{},"Familiarity with embeddings, vector search, or retrieval-augmented generation.",[147,35822,35823],{},"Strong judgment around AI tradeoffs, failure modes, cost, and observability.",[147,35825,35826],{},"Ability to design AI systems that others can safely extend.",[147,35828,35829],{},"Experience shipping small, well-scoped changes incrementally.",[147,35831,35648],{},[147,35833,35834],{},"Pragmatic use of AI tools to accelerate development and improve outcomes.",[14,35836,34670],{"id":34669},[504,35838,35839,35842,35844,35847,35859,35862,35864,35867],{},[147,35840,35841],{},"Resume Review: Review resumes and relevant AI-related experience. Done by the hiring manager.",[147,35843,35661],{},[147,35845,35846],{},"Engineering Manager Call (45m): A deeper alignment conversation covering FlowFuse’s direction, applied AI use cases, how the team works, and expectations for this role.",[147,35848,35667,35849],{},[144,35850,35851,35854,35857],{},[147,35852,35853],{},"Option A: Build a small AI-powered feature or tool (for example: intelligent search, summarization, validation, or an assistant-style workflow) using an LLM API.",[147,35855,35856],{},"Option B: Contribute a small, scoped AI-related pull request or prototype demonstrating applied AI integration in an existing codebase.",[147,35858,35678],{},[147,35860,35861],{},"Technical Interview (60m): Review the take-home work with 2–3 team members. The discussion focuses on problem understanding, AI design decisions and tradeoffs, system structure, reliability considerations, and how the solution would evolve over time rather than feature completeness. There will be explicit discussion of where AI was used, how it was used, and why those choices were made.",[147,35863,34684],{},[147,35865,35866],{},"Team Interview (45m): Conversation focused on collaboration, communication style, and working cross-functionally.",[147,35868,34693],{},{"title":75,"searchDepth":76,"depth":76,"links":35870},[35871,35874,35875],{"id":34516,"depth":76,"text":34517,"children":35872},[35873],{"id":35787,"depth":605,"text":35788},{"id":34546,"depth":76,"text":34547},{"id":34669,"depth":76,"text":34670},{},"\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Ffullstack-engineer-ai",{"title":35703,"description":75},"handbook\u002Fpeopleops\u002Fjob-descriptions\u002Ffullstack-engineer-ai","sD1zfwjpgon6V_ZpsfGP0Ko36fK88BGNTQHZOHeaeME",{"id":35882,"title":35883,"body":35884,"description":75,"extension":81,"meta":36165,"navGroup":83,"navOrder":83,"navTitle":35883,"navigation":84,"path":36166,"seo":36167,"stem":36168,"__hash__":36169},"handbook\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fhead-of-marketing.md","Head of Marketing",{"type":7,"value":35885,"toc":36145},[35886,35889,35891,35894,35897,35900,35904,35908,35919,35923,35934,35938,35949,35953,35964,35968,35979,35981,35985,36005,36009,36026,36030,36034,36048,36053,36061,36065,36079,36083,36091,36095,36109,36113,36121,36123],[10,35887,35883],{"id":35888},"head-of-marketing",[14,35890,34517],{"id":34516},[19,35892,35893],{},"The Head of Marketing is responsible for building and executing a measurable, outcome-driven marketing engine that directly supports company growth. This role is not purely strategic — it is delivery-oriented, KPI-led, and deeply connected to revenue, pipeline, and product adoption.",[19,35895,35896],{},"A leader who understands how to translate complex industrial and technical products into compelling narratives, while also owning execution across content, campaigns, and events. This person will balance strategic direction with hands-on leadership, ensuring marketing initiatives are delivered on time, measured rigorously, and continuously improved.",[19,35898,35899],{},"The Head of Marketing will work closely with Sales, Product, and Leadership to align go-to-market execution with FlowFuse’s growth objectives, supporting the full funnel from awareness through expansion.",[14,35901,35903],{"id":35902},"core-responsibilities","Core Responsibilities",[164,35905,35907],{"id":35906},"marketing-strategy-execution","Marketing Strategy & Execution",[144,35909,35910,35913,35916],{},[147,35911,35912],{},"Own the end-to-end marketing strategy with a strong focus on execution and measurable outcomes.",[147,35914,35915],{},"Translate company and revenue goals into clear marketing plans, campaigns, and initiatives.",[147,35917,35918],{},"Ensure marketing efforts are tightly aligned with Sales, Product, and GTM priorities.",[164,35920,35922],{"id":35921},"kpi-ownership-performance-management","KPI Ownership & Performance Management",[144,35924,35925,35928,35931],{},[147,35926,35927],{},"Define, track, and report on core marketing KPIs.",[147,35929,35930],{},"Use data to prioritize initiatives, adjust campaigns, and improve overall marketing effectiveness.",[147,35932,35933],{},"Establish clear accountability for results across all marketing programs.",[164,35935,35937],{"id":35936},"content-thought-leadership","Content & Thought Leadership",[144,35939,35940,35943,35946],{},[147,35941,35942],{},"Oversee content-driven marketing efforts, including blogs, case studies, product narratives, and thought leadership.",[147,35944,35945],{},"Ensure content supports awareness, consideration, adoption, and expansion use cases.",[147,35947,35948],{},"Partner with Product and Engineering to translate technical capabilities into clear, outcome-oriented messaging.",[164,35950,35952],{"id":35951},"events-field-marketing","Events & Field Marketing",[144,35954,35955,35958,35961],{},[147,35956,35957],{},"Plan and execute industry events, conferences, webinars, and partnerships that support pipeline and brand credibility.",[147,35959,35960],{},"Own event strategy from planning through post-event follow-up and ROI measurement.",[147,35962,35963],{},"Coordinate closely with Sales on event-driven opportunities and account engagement.",[164,35965,35967],{"id":35966},"cross-functional-collaboration","Cross-Functional Collaboration",[144,35969,35970,35973,35976],{},[147,35971,35972],{},"Act as a key partner to Sales on enablement, campaign alignment, and feedback loops.",[147,35974,35975],{},"Collaborate with Product on launches, messaging, and market insights.",[147,35977,35978],{},"Feed structured learnings back into Leadership to inform GTM and company strategy.",[14,35980,34547],{"id":34546},[164,35982,35984],{"id":35983},"what-were-looking-for","What We’re Looking For",[144,35986,35987,35990,35993,35996,35999,36002],{},[147,35988,35989],{},"Proven experience leading marketing in a B2B SaaS or technology startup environment.",[147,35991,35992],{},"Strong KPIs orientation and ability to drive measurable impact on funnel and revenue metrics.",[147,35994,35995],{},"Demonstrated success with content-based marketing, GTM campaigns, and event execution.",[147,35997,35998],{},"Experience managing a small team with a focus on execution, mentorship, and performance.",[147,36000,36001],{},"Excellent communication skills, with ability to influence cross-functional partners.",[147,36003,36004],{},"Comfortable iterating rapidly and adjusting tactics based on data and real-time feedback.",[164,36006,36008],{"id":36007},"nice-to-haves","Nice to Haves",[144,36010,36011,36014,36017,36020,36023],{},[147,36012,36013],{},"Background in industrial automation, IIoT, manufacturing, or complex technical domains.",[147,36015,36016],{},"Deep familiarity with HubSpot (Marketing & Sales Hubs) for workflows, lead scoring, campaigns, and reporting.",[147,36018,36019],{},"Experience with long sales cycles, multi-stakeholder buying journeys, and enterprise GTM.",[147,36021,36022],{},"Experience working in fully remote startup environments.",[147,36024,36025],{},"Familiarity with developer communities or technical content ecosystems.",[14,36027,36029],{"id":36028},"_90-day-plan-13-week-plan","90-Day Plan (13-Week Plan)",[164,36031,36033],{"id":36032},"week-14","Week 1–4",[144,36035,36036,36039,36042,36045],{},[147,36037,36038],{},"Immerse in the FlowFuse product, customer personas, market landscape, and existing marketing KPIs.",[147,36040,36041],{},"Audit HubSpot setup (lead lifecycle, scoring, automation, dashboards) and key marketing workflows.",[147,36043,36044],{},"Meet with core stakeholders across Sales, Product, and Leadership to align on priorities.",[147,36046,36047],{},"Identify quick wins and define Day 1 content and campaign optimizations.",[19,36049,36050],{},[423,36051,36052],{},"Deliverables",[144,36054,36055,36058],{},[147,36056,36057],{},"Summary of marketing gaps, opportunities, and quick wins.",[147,36059,36060],{},"Initial KPI framework aligned with Sales and Leadership.",[164,36062,36064],{"id":36063},"week-58","Week 5–8",[144,36066,36067,36070,36073,36076],{},[147,36068,36069],{},"Refine messaging, positioning, and content strategy based on audit insights.",[147,36071,36072],{},"Optimize content production pipelines and collaboration with internal contributors.",[147,36074,36075],{},"Establish weekly KPI monitoring cadence and HubSpot dashboards for visibility.",[147,36077,36078],{},"Launch initial campaign experiments and iterative tests.",[19,36080,36081],{},[423,36082,36052],{},[144,36084,36085,36088],{},[147,36086,36087],{},"Updated marketing plan with clear KPIs and ownership.",[147,36089,36090],{},"Initial improvements to content, campaigns, or events based on data.",[164,36092,36094],{"id":36093},"week-913","Week 9–13",[144,36096,36097,36100,36103,36106],{},[147,36098,36099],{},"Take ownership of pipeline targets with clear execution plans to hit them.",[147,36101,36102],{},"Scale and iterate on successful campaigns, experiments, and content formats.",[147,36104,36105],{},"Strengthen processes for event follow-up, lead qualification, and sales handoffs.",[147,36107,36108],{},"Draft a long-term marketing roadmap tied to company growth goals.",[19,36110,36111],{},[423,36112,36052],{},[144,36114,36115,36118],{},[147,36116,36117],{},"Demonstrable impact on pipeline, engagement, or conversion metrics.",[147,36119,36120],{},"Clear roadmap for the next 6–12 months of marketing execution.",[14,36122,34670],{"id":34669},[144,36124,36125,36128,36131,36134,36137,36140,36143],{},[147,36126,36127],{},"Initial Screening: Resume and background review by the hiring manager.",[147,36129,36130],{},"First Interview (Role & Experience): Evaluate marketing leadership experience, KPI ownership, and startup fit.",[147,36132,36133],{},"Second Interview (Deep Dive & Execution): Discussion with cross-functional stakeholders on execution approach, content, events, and GTM alignment.",[147,36135,36136],{},"Assessment \u002F Case Discussion: Candidate presents a high-level marketing approach or past example demonstrating KPI-driven execution.",[147,36138,36139],{},"STAR Interview (Behavioral Alignment): Evaluate values alignment, ownership, and collaboration style. Conducted by the CEO.",[147,36141,36142],{},"Final Interview: Final alignment with leadership on expectations and impact.",[147,36144,34693],{},{"title":75,"searchDepth":76,"depth":76,"links":36146},[36147,36148,36155,36159,36164],{"id":34516,"depth":76,"text":34517},{"id":35902,"depth":76,"text":35903,"children":36149},[36150,36151,36152,36153,36154],{"id":35906,"depth":605,"text":35907},{"id":35921,"depth":605,"text":35922},{"id":35936,"depth":605,"text":35937},{"id":35951,"depth":605,"text":35952},{"id":35966,"depth":605,"text":35967},{"id":34546,"depth":76,"text":34547,"children":36156},[36157,36158],{"id":35983,"depth":605,"text":35984},{"id":36007,"depth":605,"text":36008},{"id":36028,"depth":76,"text":36029,"children":36160},[36161,36162,36163],{"id":36032,"depth":605,"text":36033},{"id":36063,"depth":605,"text":36064},{"id":36093,"depth":605,"text":36094},{"id":34669,"depth":76,"text":34670},{},"\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fhead-of-marketing",{"title":35883,"description":75},"handbook\u002Fpeopleops\u002Fjob-descriptions\u002Fhead-of-marketing","GVRrXq04msnFGNW7N0t6MQNMkNN3Ghm7SzatqH9XSP4",{"id":36171,"title":34729,"body":36172,"description":36179,"extension":81,"meta":36205,"navGroup":83,"navOrder":83,"navTitle":34729,"navigation":84,"path":36206,"seo":36207,"stem":36208,"__hash__":36209},"handbook\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Findex.md",{"type":7,"value":36173,"toc":36203},[36174,36177,36180,36183,36200],[10,36175,34729],{"id":36176},"job-descriptions",[19,36178,36179],{},"At FlowFuse, job descriptions are the first step in hiring. They are an important tool in helping manage expectations with candidates on what role they're applying for and, because like all other documents, are kept up-to-date in the handbook, they also become the basis for performance reviews.",[19,36181,36182],{},"Job Descriptions have a few standard parts to them:",[144,36184,36185,36188,36191,36194,36197],{},[147,36186,36187],{},"Job Description- an overview of the role and the resposibilities that we will expect this candidate to fulfill",[147,36189,36190],{},"Skills- requirements and nice-to-have experience sets of candidates; we never expect a candidate to have 100% of the requirements",[147,36192,36193],{},"90 Day Plan- (technically a 13 week plan) expectations for onboarding and how a candidate can expect their first 3 months to go",[147,36195,36196],{},"About FlowFuse- this is our chance to sell candidates on why they want to work here; this is not required in the handbook, just on the actual job posting",[147,36198,36199],{},"Hiring Plan- what will the interview path for this candidate look like",[19,36201,36202],{},"There may be other fields or add-ons included in the job posting via Greenhouse that may not be in the job description in the handbook, inlcuding geographic or timezone requirements, salary ranges, or other details specific to that particular hire that are not specific to the role.",{"title":75,"searchDepth":76,"depth":76,"links":36204},[],{},"\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions",{"title":34729,"description":36179},"handbook\u002Fpeopleops\u002Fjob-descriptions\u002Findex","t77sVVq18fftw6tVCKUAaRvkfHgPf8l-huH_lJk3xSA",{"id":36211,"title":5249,"body":36212,"description":75,"extension":81,"meta":36350,"navGroup":34729,"navOrder":83,"navTitle":5249,"navigation":84,"path":36351,"seo":36352,"stem":36353,"__hash__":36354},"handbook\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fproduct-manager.md",{"type":7,"value":36213,"toc":36343},[36214,36217,36219,36222,36225,36228,36239,36241,36264,36268,36282,36284,36287,36307,36309],[10,36215,5249],{"id":36216},"product-manager",[14,36218,34517],{"id":34516},[19,36220,36221],{},"At FlowFuse, the Product Manager (PM) is the strategic engine driving our product's triumph in the market. This individual is a relentless advocate for our users and customers, obsessed with transforming their challenges into market-leading solutions. The PM isn't just defining features; they're architecting the future of our platform, ensuring every innovation propels FlowFuse ahead of the competition and directly contributes to our aggressive growth objectives.",[19,36223,36224],{},"This role demands a highly competitive individual who thrives on understanding complex problems and translating them into tangible, user-loved products. The Product Manager is the key orchestrator aligning product strategy with FlowFuse's core strategic objectives, anticipating future trends, and ensuring our product not only meets but shapes market demands.",[19,36226,36227],{},"The Product Manager is primarily responsible for:",[144,36229,36230,36233,36236],{},[147,36231,36232],{},"Understanding and Communicating the Problem: A deep-seated commitment to uncovering and articulating the core problems faced by our users and customers, turning insights into actionable strategies.",[147,36234,36235],{},"Defining Winning Solutions: Spearheading the definition of requirements for solutions that are not just functional, but truly loved by our users, customers, and the broader community, ensuring market dominance.",[147,36237,36238],{},"Strategic Product Alignment: Continuously aligning the product strategy with FlowFuse's core strategic objectives, ensuring the product is always positioned to conquer current market demands and aggressively anticipate future trends.",[19,36240,35588],{},[144,36242,36243,36246,36249,36252,36255,36258,36261],{},[147,36244,36245],{},"Maintain and Update Product Strategy: The PM is the strategic custodian, responsible for maintaining and relentlessly updating the product strategy to ensure unwavering alignment with the company's aggressive goals and dynamic market demands.",[147,36247,36248],{},"Release Planning for Every Milestone: The PM is the DRI (Directly Responsible Individual) for meticulous planning and ruthless prioritization of work for the engineering group, ensuring maximum impact with every release.",[147,36250,36251],{},"Create Release Changelog Entries: The PM is responsible for ensuring that compelling changelog items are created, thoroughly reviewed, and effectively broadcast to showcase every victory and feature launched.",[147,36253,36254],{},"Connect User and Customer Insights with Product Prioritization: The PM is a data-driven powerhouse, conducting impactful customer interviews, extracting critical insights about customer adoption and pain points, and then aggressively reprioritizing the \"Backlog\" and \"Roadmap.\" The goal is to continuously refine the most important features, bugs, and technical debt to secure and expand market relevance.",[147,36256,36257],{},"Triage New Issues: The PM is the gatekeeper, responsible for rapidly prioritizing incoming issues (features, bugs, security vulnerabilities, etc.) based on their strategic importance and impact.",[147,36259,36260],{},"Determine Pricing Tier for Features: While the CEO and Sales team lead the pricing strategy, the PM is strategically responsible for determining which features belong to specific tiers, ensuring optimal product positioning and monetization.",[147,36262,36263],{},"Product-Related Decisions: The PM holds the critical authority for making strategic decisions that sculpt the overall direction and future success of the product.",[164,36265,36267],{"id":36266},"what-is-the-product-manager-not-responsible-for","What is the Product Manager not responsible for?",[144,36269,36270,36273,36276,36279],{},[147,36271,36272],{},"Technical decisions on how the product is built or architected.",[147,36274,36275],{},"A team of engineers: The PM will take the lead in decisions about the product, but not manage the people implementing it.",[147,36277,36278],{},"Shipping in time.",[147,36280,36281],{},"Effort estimations, the Product Manager provides effort estimation when creating issues. However, the DRI for this process is the CTO.",[14,36283,34547],{"id":34546},[19,36285,36286],{},"What the Product Manager brings to the table:",[144,36288,36289,36292,36295,36298,36301,36304],{},[147,36290,36291],{},"Relentless Problem Solver: A proven ability to deeply understand complex user and customer problems, translating them into clear, actionable product requirements.",[147,36293,36294],{},"Strategic Visionary: A track record of developing and executing product strategies that align with business objectives and anticipate market shifts.",[147,36296,36297],{},"Data-Driven Prioritizer: Strong analytical skills with experience using data and customer insights to drive prioritization and make tough decisions that optimize for impact.",[147,36299,36300],{},"Exceptional Communicator: The ability to clearly articulate product vision, requirements, and value propositions to diverse audiences, from engineers to executives and customers.",[147,36302,36303],{},"Competitive Drive: A natural ambition to push boundaries, innovate, and ensure FlowFuse's product leads the market.",[147,36305,36306],{},"Cross-Functional Leader: Proven experience collaborating effectively with engineering, sales, marketing, and customer success teams to deliver outstanding products.",[14,36308,34670],{"id":34669},[504,36310,36311,36314,36322,36325,36328,36331,36334,36341],{},[147,36312,36313],{},"Resume Screening: Review resumes and cover letters to assess candidate qualifications, experience, and domain expertise. Done by the hiring manager.",[147,36315,36316,36321],{},[46,36317,36320],{"href":36318,"rel":36319},"https:\u002F\u002Fflowfuse.com\u002Fhandbook\u002Fpeopleops\u002Fhiring\u002Fscreening-call\u002F",[108],"Screening call"," for 20 minutes. Done by recruiter.",[147,36323,36324],{},"CEO Interview (STAR, Technical, and Role Fit) for 45m: Conduct a video interview to evaluate technical knowledge relevant to industrial automation, IIoT, and Product Management, as well as communication skills. Ask candidate about the proposed roadmap for the next year.",[147,36326,36327],{},"CTO Interview (Technical) for 45m: A video interview that covers their technical knowledge, background and approach to the role.",[147,36329,36330],{},"GTM Interview (Role fit, GTM compatibility) for 30m: Understand how the candidate thinks they can influence GTM and create more growth. Done by the VP of Sales.",[147,36332,36333],{},"90 day play Presentation: Candidate will be discussing the future of FlowFuse's product and deliver ideas for their first 90 days. The company will discuss and judge this based on how the ideas were formed, put forward, and defended against probing.",[147,36335,36336,36337,36340],{},"Final Interview (",[423,36338,36339],{},"optional","): A final interview with key stakeholders, potentially including a sales leader or executive, to assess strategic alignment and executive presence.",[147,36342,34693],{},{"title":75,"searchDepth":76,"depth":76,"links":36344},[36345,36348,36349],{"id":34516,"depth":76,"text":34517,"children":36346},[36347],{"id":36266,"depth":605,"text":36267},{"id":34546,"depth":76,"text":34547},{"id":34669,"depth":76,"text":34670},{},"\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fproduct-manager",{"title":5249,"description":75},"handbook\u002Fpeopleops\u002Fjob-descriptions\u002Fproduct-manager","DYWGrJEhqlG9mt497lK9IgUJ83yQMwFElDKuAdg3OvI",{"id":36356,"title":36357,"body":36358,"description":75,"extension":81,"meta":36590,"navGroup":34729,"navOrder":83,"navTitle":36357,"navigation":84,"path":36591,"seo":36592,"stem":36593,"__hash__":36594},"handbook\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fproduct-marketer.md","Product Marketer",{"type":7,"value":36359,"toc":36584},[36360,36363,36365,36368,36371,36427,36429,36461,36463,36560,36562],[10,36361,36357],{"id":36362},"product-marketer",[14,36364,34517],{"id":34516},[19,36366,36367],{},"We are seeking a highly motivated and experienced Product Marketer to join our team. In this role, you will be responsible for developing and executing marketing strategies that drive adoption and growth of the FlowFuse platform. You will work closely with product, engineering, and sales to understand and shape our product roadmap, target audience, and market trends. Your primary focus will be to effectively communicate the value of FlowFuse to our target audience, drive demand, and support our overall business growth through both strategic product marketing and tactical demand generation execution.",[19,36369,36370],{},"As we scale, this role will evolve to include demand generation responsibilities, covering the full marketing funnel from awareness to conversion. Initially focused on product marketing fundamentals, you will eventually take ownership of lead generation programs, email nurture campaigns, webinar management, and funnel optimization.",[144,36372,36373,36376,36379,36382,36385,36388,36391,36394,36397,36400,36403,36406,36409,36412,36415,36418,36421,36424],{},[147,36374,36375],{},"Define and refine product positioning and messaging for FlowFuse and key use cases, grounded in customer and market insights",[147,36377,36378],{},"Translate complex technical capabilities into clear, outcome-oriented narratives that resonate with target personas in industrial and IoT contexts",[147,36380,36381],{},"Develop and execute comprehensive product marketing strategies to drive product adoption and achieve revenue targets",[147,36383,36384],{},"Coordinate cross-functional launch execution with Product, Engineering, Sales, and Marketing teams",[147,36386,36387],{},"Measure launch performance, capture learnings, and iterate on GTM playbooks",[147,36389,36390],{},"Create and maintain high-impact assets such as product pages, one-pagers, decks, case studies, demos, and release notes",[147,36392,36393],{},"Enable Sales with talk tracks, battlecards, objection-handling guides, and competitive positioning materials",[147,36395,36396],{},"Design and execute multi-channel email nurture campaigns to move prospects through the buyer journey",[147,36398,36399],{},"Build and manage webinar programs from concept to execution, including promotion, delivery, and follow-up sequences",[147,36401,36402],{},"Develop and optimize lead scoring models and qualification frameworks in HubSpot",[147,36404,36405],{},"Build and maintain lead lifecycle workflows, including automated triggers, scoring adjustments, and sales notifications",[147,36407,36408],{},"Manage content syndication partnerships and evaluate ROI of third-party lead generation programs",[147,36410,36411],{},"Analyze campaign and funnel performance data to optimize programs and improve lead-to-opportunity conversion rates",[147,36413,36414],{},"Coordinate event follow-up campaigns to maximize ROI from conference attendance, sponsorships, and webinars",[147,36416,36417],{},"Develop a deep understanding of target personas, segments, and buying journeys through customer conversations, analytics, and research",[147,36419,36420],{},"Maintain a view of the competitive landscape and adjacent tools, and ensure insights are reflected in messaging and enablement",[147,36422,36423],{},"Partner with Content to plan thought-leadership and educational content that supports awareness, consideration, and expansion",[147,36425,36426],{},"Feed structured insights back into Product and Sales to refine strategy, ICPs, and GTM plays",[14,36428,34547],{"id":34546},[144,36430,36431,36434,36437,36440,36443,36446,36449,36452,36455,36458],{},[147,36432,36433],{},"Proven experience in product marketing, preferably in a B2B SaaS environment",[147,36435,36436],{},"Familiarity with the industrial sector, IIoT, IoT or similar domains",[147,36438,36439],{},"Strong understanding of software development, deployment, and management",[147,36441,36442],{},"Excellent written and verbal communication skills, with the ability to translate technical features into clear benefits",[147,36444,36445],{},"Experience in B2B demand generation, marketing operations, or funnel management",[147,36447,36448],{},"Proficiency with HubSpot, including workflows, lead scoring, email automation, and reporting",[147,36450,36451],{},"Strong analytical skills to measure effectiveness, analyze funnel metrics, identify bottlenecks, and optimize campaigns",[147,36453,36454],{},"Experience designing and executing email nurture campaigns with proven lead-to-opportunity conversion results",[147,36456,36457],{},"Collaborative and able to work effectively across different teams",[147,36459,36460],{},"Node-RED knowledge and familiarity is a plus",[14,36462,34580],{"id":34579},[144,36464,36465,36505,36534,36544],{},[147,36466,34585,36467],{},[144,36468,36469,36480,36488,36491,36494],{},[147,36470,36471,36472],{},"Immerse yourself in FlowFuse's product, strategy, and market.\n",[144,36473,36474,36477],{},[147,36475,36476],{},"Watch 15+ sales calls (Fathom) to hear from prospects where the product marketing can improve.",[147,36478,36479],{},"Interview 5 prospects or customers to learn what problems they're solving and what they like about FlowFuse.",[147,36481,36482,36483],{},"Familiarize yourself with the Node-RED ecosystem and competitive landscape.\n",[144,36484,36485],{},[147,36486,36487],{},"Set up a team of FlowFuse, and go through the onboarding and build a small application",[147,36489,36490],{},"Meet with key stakeholders across product, sales, and engineering.",[147,36492,36493],{},"Review existing marketing materials, map them to sales stages, and identify areas for improvement.",[147,36495,36496,36497],{},"Deliverables:\n",[504,36498,36499,36502],{},[147,36500,36501],{},"Update the sales deck to reflect your findings and improve first meeting conversion",[147,36503,36504],{},"Create \"Cheat Sheets\" for the second sales meeting, handle the top 3 objections, and the current pricing.",[147,36506,34605,36507],{},[144,36508,36509,36512,36520,36531],{},[147,36510,36511],{},"Develop a deep understanding of our target personas and their needs.",[147,36513,36514,36515],{},"Start developing key messaging and positioning for FlowFuse.\n",[144,36516,36517],{},[147,36518,36519],{},"Update the handbook as you learn on messaging and positioning. Communicate changes with Sales, Marketing, and Product.",[147,36521,36522,36523],{},"Begin working on content for upcoming product launches or feature releases.\n",[144,36524,36525,36528],{},[147,36526,36527],{},"Take a 30 minute session per release to train Sales and CSM roles on them",[147,36529,36530],{},"Write and maintain documention, blogs, and other customer communication",[147,36532,36533],{},"Analyze current marketing & sales performance.",[147,36535,36496,36536],{},[504,36537,36538,36541],{},[147,36539,36540],{},"2 Battlecards against our main competition",[147,36542,36543],{},"Create a plan to reduce sales cycle length, increase win rate, and conversions.",[147,36545,34622,36546],{},[144,36547,36548,36551,36554,36557],{},[147,36549,36550],{},"Develop and begin executing on initial marketing campaigns.",[147,36552,36553],{},"Create sales enablement materials to support the sales team.",[147,36555,36556],{},"Gather customer feedback and market insights to refine messaging and strategy.",[147,36558,36559],{},"Establish processes for ongoing market analysis and competitive intelligence.",[14,36561,34670],{"id":34669},[144,36563,36564,36566,36568,36570,36572,36580,36582],{},[147,36565,34675],{},[147,36567,34678],{},[147,36569,34681],{},[147,36571,34684],{},[147,36573,36574,36575,549],{},"Assessment\u002FPresentation: Will require a work sample, case study, or presentation to demonstrate the candidate's abilities. ",[46,36576,36579],{"href":36577,"rel":36578},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1AXja3R-SRl5KLNqB-8emMuYgnRp8cAOtkVKVD207szo\u002Fedit?tab=t.0",[108],"Internal doc with assessment guidance",[147,36581,34690],{},[147,36583,34693],{},{"title":75,"searchDepth":76,"depth":76,"links":36585},[36586,36587,36588,36589],{"id":34516,"depth":76,"text":34517},{"id":34546,"depth":76,"text":34547},{"id":34579,"depth":76,"text":34580},{"id":34669,"depth":76,"text":34670},{},"\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fproduct-marketer",{"title":36357,"description":75},"handbook\u002Fpeopleops\u002Fjob-descriptions\u002Fproduct-marketer","lzTufraim11WitPgBRfykPyGUsK4O2kSiVhUx-RFbBQ",{"id":36596,"title":36597,"body":36598,"description":75,"extension":81,"meta":36867,"navGroup":34729,"navOrder":83,"navTitle":36597,"navigation":84,"path":36868,"seo":36869,"stem":36870,"__hash__":36871},"handbook\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fsolutions-engineer.md","Solutions Engineer",{"type":7,"value":36599,"toc":36859},[36600,36603,36605,36608,36611,36614,36617,36631,36634,36651,36653,36656,36679,36682,36696,36698,36748,36750,36771,36775,36825,36829],[10,36601,36597],{"id":36602},"solutions-engineer",[14,36604,34517],{"id":34516},[19,36606,36607],{},"This is a senior, customer-facing role requiring strong domain expertise in industrial automation and a proven ability to guide both technical implementation and strategic solution expansion.",[19,36609,36610],{},"We’re looking for someone who not only enables the initial deployment but also identifies additional opportunities to expand value across the customer’s organization - be it new use cases, integrations, or system-wide architecture improvements.",[19,36612,36613],{},"You’ll be a key technical advisor and trusted partner to both prospective and existing customers.",[19,36615,36616],{},"Pre-Sales Support:",[144,36618,36619,36622,36625,36628],{},[147,36620,36621],{},"Partner with Account Executives during discovery to understand customer goals and technical environments.",[147,36623,36624],{},"Deliver tailored demos, solution architecture walkthroughs, and lead technical proof-of-concepts (PoCs).",[147,36626,36627],{},"Help prospects align FlowFuse to their broader industrial and digital transformation goals.",[147,36629,36630],{},"Collaborate on pricing proposals and technical responses to RFPs and security reviews.",[19,36632,36633],{},"Post-Sales Engagement:",[144,36635,36636,36639,36642,36645,36648],{},[147,36637,36638],{},"Lead technical onboarding and early solution implementation.",[147,36640,36641],{},"Partner with customers to assess results, resolve blockers, and optimize solution design.",[147,36643,36644],{},"Actively explore and surface additional use cases within the customer organization.",[147,36646,36647],{},"Facilitate roadmap alignment and strategic planning discussions with technical champions.",[147,36649,36650],{},"Deliver ongoing best practices, architecture reviews, and training to ensure long-term success.",[14,36652,34547],{"id":34546},[19,36654,36655],{},"What We’re Looking For:",[144,36657,36658,36661,36664,36667,36670,36673,36676],{},[147,36659,36660],{},"5+ years in a Solutions Engineering, Sales Engineering, or Customer Success Engineering role.",[147,36662,36663],{},"Deep industry expertise in industrial automation, IIoT, smart manufacturing, or related fields.",[147,36665,36666],{},"Track record of identifying additional solution opportunities within enterprise accounts.",[147,36668,36669],{},"Experience with technologies such as Node-RED, MQTT, OPC-UA, SCADA systems, PLCs, or edge computing.",[147,36671,36672],{},"Strong communication skills - comfortable engaging engineers, architects, and executive stakeholders.",[147,36674,36675],{},"High degree of initiative and ability to manage customer relationships across the lifecycle.",[147,36677,36678],{},"Willingness to travel occasionally for key customer engagements.",[19,36680,36681],{},"Nice to Haves:",[144,36683,36684,36687,36690,36693],{},[147,36685,36686],{},"Hands-on experience deploying Node-RED at scale.",[147,36688,36689],{},"Familiarity with Unified Namespace or other modern industrial data architectures.",[147,36691,36692],{},"Experience with containerization, cloud (AWS\u002FAzure), or Linux-based edge devices.",[147,36694,36695],{},"Multilingual skills (e.g., German, French, Spanish).",[14,36697,34580],{"id":34579},[144,36699,36700,36722,36738],{},[147,36701,34585,36702],{},[144,36703,36704,36707,36710,36713,36716,36719],{},[147,36705,36706],{},"Familiarize yourself with the FlowFuse product, platform capabilities, and target customer profiles.",[147,36708,36709],{},"Understand existing sales processes, customer success methodologies, and relevant internal tools.",[147,36711,36712],{},"Meet with key internal stakeholders across Sales, Product, and Engineering teams.",[147,36714,36715],{},"Begin shadowing customer calls, demos, and technical engagements to learn our approach.",[147,36717,36718],{},"Review and provide feedback on existing solution architecture documentation and sales enablement materials.",[147,36720,36721],{},"Start leading portions of customer demos and technical discussions with guidance.",[147,36723,34605,36724],{},[144,36725,36726,36729,36732,36735],{},[147,36727,36728],{},"Develop a deep technical understanding of FlowFuse and its integration points within industrial environments.",[147,36730,36731],{},"Engage in your first set of technical PoCs, contributing to design and execution",[147,36733,36734],{},"Take ownership of specific pre-sales and post-sales customer engagements, leading technical discussions and solution design.",[147,36736,36737],{},"Proactively identify and propose opportunities for expanding FlowFuse's value within customer accounts.",[147,36739,34622,36740],{},[144,36741,36742,36745],{},[147,36743,36744],{},"Contribute to internal knowledge sharing, developing best practices or technical guides based on customer interactions.",[147,36746,36747],{},"Start building relationships with customer technical champions to facilitate long-term success and strategic alignment.",[14,36749,34670],{"id":34669},[144,36751,36752,36755,36758,36761,36764,36766,36769],{},[147,36753,36754],{},"Initial Screening: Review resumes and cover letters to assess candidate qualifications, experience, and domain expertise.",[147,36756,36757],{},"First Interview (Technical & Role Fit): Conduct a phone or video interview to evaluate technical knowledge relevant to industrial automation, IIoT, and solutions engineering, as well as communication skills. Conducted by the hiring manager.",[147,36759,36760],{},"Second Interview (Deep Dive & Customer Experience): In-depth interview with the hiring manager and other team members to discuss specific experience in customer-facing technical roles, complex problem-solving, and managing customer lifecycles. Conducted by the Head of Professional Services.",[147,36762,36763],{},"Technical Presentation \u002F Case Study: Candidate will prepare and deliver a presentation on a technical solution or a case study of a past customer engagement demonstrating their problem-solving and communication skills.",[147,36765,34684],{},[147,36767,36768],{},"Final Interview: A final interview with key stakeholders, potentially including a sales leader or executive, to assess strategic alignment and executive presence.",[147,36770,34693],{},[164,36772,36774],{"id":36773},"screening-questions","Screening Questions",[144,36776,36777,36785,36793,36801,36809,36817],{},[147,36778,36779,36780],{},"Can you briefly walk me through your recent experience in a customer-facing engineering or solutions role?\n",[144,36781,36782],{},[147,36783,36784],{},"Goal: Confirm they have relevant experience in pre-sales or post-sales technical roles (e.g., Solutions Engineer, Sales Engineer, Customer Success Engineer).",[147,36786,36787,36788],{},"Have you worked with industrial technologies like SCADA, PLCs, MQTT, or Node-RED?\n",[144,36789,36790],{},[147,36791,36792],{},"Goal: Confirm basic exposure to the industrial automation ecosystem. If not Node-RED specifically, check for adjacent tech like OPC-UA or IIoT platforms.",[147,36794,36795,36796],{},"Can you share an example of a time when you helped a customer expand or deepen their use of a solution over time?\n",[144,36797,36798],{},[147,36799,36800],{},"Goal: Gauge if they’ve played a role in post-sale expansion, solution discovery, or upsell enablement—key traits for this hybrid SE role.",[147,36802,36803,36804],{},"How comfortable are you leading technical conversations with both engineers and business stakeholders?\n",[144,36805,36806],{},[147,36807,36808],{},"Goal: Evaluate communication range and confidence in dealing with mixed audiences—an essential skill for FlowFuse’s customer base.",[147,36810,36811,36812],{},"Have you ever delivered a proof of concept (PoC) or demo as part of a sales process?\n",[144,36813,36814],{},[147,36815,36816],{},"Goal: Validate they’ve led or contributed to technical pre-sales motions.",[147,36818,36819,36820],{},"Do you have experience working remotely and managing your own schedule across multiple customers?\n",[144,36821,36822],{},[147,36823,36824],{},"Goal: Confirm self-management and comfort with autonomy in a remote startup environment.",[239,36826,36828],{"id":36827},"evaluation-criteria","Evaluation Criteria",[144,36830,36831,36845],{},[147,36832,36833,36834],{},"Go Forward if they:\n",[144,36835,36836,36839,36842],{},[147,36837,36838],{},"Have customer-facing technical experience (especially in IIoT or automation)",[147,36840,36841],{},"Can communicate clearly across technical and business audiences",[147,36843,36844],{},"Show signs of proactivity and comfort with ambiguity",[147,36846,36847,36848],{},"No-Go if they:\n",[144,36849,36850,36853,36856],{},[147,36851,36852],{},"Lack relevant experience (pure dev, sysadmin, etc.)",[147,36854,36855],{},"Struggle to articulate impact in customer engagements",[147,36857,36858],{},"Are uncomfortable with remote work or startup dynamics",{"title":75,"searchDepth":76,"depth":76,"links":36860},[36861,36862,36863,36864],{"id":34516,"depth":76,"text":34517},{"id":34546,"depth":76,"text":34547},{"id":34579,"depth":76,"text":34580},{"id":34669,"depth":76,"text":34670,"children":36865},[36866],{"id":36773,"depth":605,"text":36774},{},"\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fsolutions-engineer",{"title":36597,"description":75},"handbook\u002Fpeopleops\u002Fjob-descriptions\u002Fsolutions-engineer","uWC-6qB1QrrVKq8Y3liJHzQFHfwdif6BB9nwh9hwoww",{"id":36873,"title":36874,"body":36875,"description":75,"extension":81,"meta":37311,"navGroup":34729,"navOrder":83,"navTitle":36874,"navigation":84,"path":37312,"seo":37313,"stem":37314,"__hash__":37315},"handbook\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Ftechnical-product-manager.md","Technical Product Manager",{"type":7,"value":36876,"toc":37298},[36877,36880,36882,36885,36888,36891,36902,36904,36927,36931,36942,36944,36947,36951,36956,36962,36966,36977,36981,36989,36993,37001,37005,37013,37018,37029,37033,37047,37049,37053,37058,37063,37067,37070,37074,37082,37086,37094,37098,37106,37111,37122,37126,37140,37142,37146,37151,37156,37160,37163,37167,37175,37179,37182,37186,37189,37194,37205,37209,37223,37228,37230,37233,37259,37261],[10,36878,36874],{"id":36879},"technical-product-manager",[14,36881,34517],{"id":34516},[19,36883,36884],{},"At FlowFuse, the Technical Product Manager (TPM) bridges product strategy and technical execution. They turn complex technical challenges into measurable product outcomes, ensuring engineering delivers solutions that meet customer needs and quality standards.",[19,36886,36887],{},"This role blends technical depth and product acumen. The TPM dives into architecture, weighs trade-offs, and uses data to guide decisions on debt, scalability, and performance.",[19,36889,36890],{},"The Technical Product Manager reports to the Director of Product and is primarily responsible for:",[144,36892,36893,36896,36899],{},[147,36894,36895],{},"Bridging strategy and execution: Translate product strategy into clear, measurable technical outcomes and objectives.",[147,36897,36898],{},"Defining requirements: Partner with engineering to balance user needs, feasibility, and business impact.",[147,36900,36901],{},"Delivering outcomes: Set success metrics\u002FKPIs, measure progress, and connect decisions to results.",[164,36903,35588],{"id":15139},[144,36905,36906,36909,36912,36915,36918,36921,36924],{},[147,36907,36908],{},"Own metrics: Define, track, and report adoption, performance, reliability, and business impact.",[147,36910,36911],{},"Plan sprints and releases: Align roadmap, priorities, debt, and infrastructure with product strategy.",[147,36913,36914],{},"Shape specs\u002Farchitecture: Co-create technical specs and provide architectural input.",[147,36916,36917],{},"Translate across teams: Bridge product, engineering, sales, and customer success.",[147,36919,36920],{},"Prioritize with data: Use usage data, customer feedback, and capacity signals.",[147,36922,36923],{},"Assess feasibility: Evaluate complexity, approaches, and technical risk.",[147,36925,36926],{},"Advocate quality: Set and monitor quality, performance, and reliability targets.",[164,36928,36930],{"id":36929},"what-is-the-technical-product-manager-not-responsible-for","What is the Technical Product Manager not responsible for?",[144,36932,36933,36936,36939],{},[147,36934,36935],{},"Writing production code or implementing features directly.",[147,36937,36938],{},"Managing engineers or individual performance.",[147,36940,36941],{},"Final technical architecture decisions (owned by CTO\u002Fengineering leadership).",[14,36943,34580],{"id":34579},[19,36945,36946],{},"We believe setting clear expectations enables new teammates to thrive. Here's what success looks like in your first 90 days at FlowFuse:",[164,36948,36950],{"id":36949},"days-030-learn-map-build-trust","Days 0–30: Learn, Map, Build Trust",[19,36952,36953],{},[423,36954,36955],{},"Theme: Context before control",[19,36957,36958,36961],{},[423,36959,36960],{},"Primary Objective",": Build deep understanding of product, users, architecture, and team dynamics.",[239,36963,36965],{"id":36964},"product-customer-immersion","Product + Customer Immersion",[144,36967,36968,36971,36974],{},[147,36969,36970],{},"Review positioning and roadmap",[147,36972,36973],{},"Understand core personas",[147,36975,36976],{},"Join customer calls or review recordings",[239,36978,36980],{"id":36979},"technical-architecture-familiarity","Technical Architecture Familiarity",[144,36982,36983,36986],{},[147,36984,36985],{},"Walk through platform components",[147,36987,36988],{},"Identify leverage vs fragility",[239,36990,36992],{"id":36991},"team-integration-operating-rhythm","Team Integration + Operating Rhythm",[144,36994,36995,36998],{},[147,36996,36997],{},"Build relationships via 1:1s",[147,36999,37000],{},"Observe planning, refinement, release",[239,37002,37004],{"id":37003},"backlog-current-state-review","Backlog Current State Review",[144,37006,37007,37010],{},[147,37008,37009],{},"Audit backlog structure and hygiene",[147,37011,37012],{},"Identify quick wins",[19,37014,37015,10656],{},[423,37016,37017],{},"Success Signals by Day 30",[144,37019,37020,37023,37026],{},[147,37021,37022],{},"Trusted relationships with engineering leads",[147,37024,37025],{},"Clear product\u002Fcustomer value understanding",[147,37027,37028],{},"Backlog structure understood",[19,37030,37031,10656],{},[423,37032,36052],{},[144,37034,37035,37038,37041,37044],{},[147,37036,37037],{},"✅ FlowFuse User + Value Map",[147,37039,37040],{},"✅ Architecture mental model + glossary",[147,37042,37043],{},"✅ \"How FlowFuse Ships\" overview",[147,37045,37046],{},"✅ Backlog health assessment",[3601,37048],{},[164,37050,37052],{"id":37051},"days-3160-align-clarify-priorities-start-driving","Days 31–60: Align, Clarify Priorities, Start Driving",[19,37054,37055],{},[423,37056,37057],{},"Theme: From understanding → influence",[19,37059,37060,37062],{},[423,37061,36960],{},": Shape execution via alignment, backlog clarity, and problem definition.",[239,37064,37066],{"id":37065},"define-whats-important-now-win","Define \"What's Important Now\" (WIN)",[19,37068,37069],{},"Partner with leadership and engineering to set top quarterly priorities in your swimlanes.",[239,37071,37073],{"id":37072},"establish-execution-cadence","Establish Execution Cadence",[144,37075,37076,37079],{},[147,37077,37078],{},"Weekly backlog refinement",[147,37080,37081],{},"Sprint goal alignment and dependency surfacing",[239,37083,37085],{"id":37084},"improve-discovery-delivery-flow","Improve Discovery → Delivery Flow",[144,37087,37088,37091],{},[147,37089,37090],{},"Problem framing before solutioning",[147,37092,37093],{},"Clear acceptance criteria and feedback loops",[239,37095,37097],{"id":37096},"lead-backlog-refinement","Lead Backlog Refinement",[144,37099,37100,37103],{},[147,37101,37102],{},"Break initiatives into deliverable slices",[147,37104,37105],{},"Ensure tickets are actionable",[19,37107,37108,10656],{},[423,37109,37110],{},"Success Signals by Day 60",[144,37112,37113,37116,37119],{},[147,37114,37115],{},"TPM drives clarity, not just observing",[147,37117,37118],{},"Engineering trusts prioritization inputs",[147,37120,37121],{},"Backlog is execution-ready",[19,37123,37124,10656],{},[423,37125,36052],{},[144,37127,37128,37131,37134,37137],{},[147,37129,37130],{},"✅ WIN priorities + narrative",[147,37132,37133],{},"✅ Shared working agreement + operating rhythm",[147,37135,37136],{},"✅ Updated Epic\u002FPRD template",[147,37138,37139],{},"✅ Engineering-ready epic(s) owned end-to-end",[3601,37141],{},[164,37143,37145],{"id":37144},"days-6190-execute-own-backlog-drive-delivery","Days 61–90: Execute, Own Backlog, Drive Delivery",[19,37147,37148],{},[423,37149,37150],{},"Theme: Shared ownership and momentum",[19,37152,37153,37155],{},[423,37154,36960],{},": Own execution: prioritize, manage backlog, and ship with engineering.",[239,37157,37159],{"id":37158},"backlog-ownership-with-engineering-leads","Backlog Ownership with Engineering Leads",[19,37161,37162],{},"Co-own priority ordering, sprint readiness, and tradeoff decisions.",[239,37164,37166],{"id":37165},"roadmap-execution-visibility","Roadmap Execution Visibility",[144,37168,37169,37172],{},[147,37170,37171],{},"Sprint goal tracking",[147,37173,37174],{},"Outcome-based roadmap updates",[239,37176,37178],{"id":37177},"ship-meaningful-customer-value","Ship Meaningful Customer Value",[19,37180,37181],{},"Drive at least one major platform or customer-facing improvement to release.",[239,37183,37185],{"id":37184},"institutionalize-collaboration","Institutionalize Collaboration",[19,37187,37188],{},"Solidify operating model and learning loops.",[19,37190,37191,10656],{},[423,37192,37193],{},"Success Signals by Day 90",[144,37195,37196,37199,37202],{},[147,37197,37198],{},"TPM + engineering leads run backlog prioritization",[147,37200,37201],{},"Sprint planning is outcome-driven",[147,37203,37204],{},"Execution cadence is faster and clearer",[19,37206,37207,10656],{},[423,37208,36052],{},[144,37210,37211,37214,37217,37220],{},[147,37212,37213],{},"✅ Backlog actively managed weekly",[147,37215,37216],{},"✅ Now \u002F Next \u002F Later execution view",[147,37218,37219],{},"✅ Release + feedback capture",[147,37221,37222],{},"✅ FlowFuse Product Delivery Playbook v1",[19,37224,37225,37227],{},[423,37226,6966],{},": By day 90, the TPM has moved from learning → alignment → execution → shared backlog ownership, with clarity on WIN priorities and active backlog management.",[14,37229,34547],{"id":34546},[19,37231,37232],{},"What the Technical Product Manager brings to the table:",[144,37234,37235,37238,37241,37244,37247,37250,37253,37256],{},[147,37236,37237],{},"Technical depth: Understand architecture, APIs, databases, and SDLC; low-code\u002FNode-RED is a plus.",[147,37239,37240],{},"Outcome orientation: Define KPIs and use data to drive decisions and impact.",[147,37242,37243],{},"Product\u002Fengineering fluency: Comfortable with user stories and technical implementation.",[147,37245,37246],{},"Strategic to tactical: Convert strategy into deliverables and milestones.",[147,37248,37249],{},"Analytical: Use qualitative and quantitative inputs for prioritization.",[147,37251,37252],{},"Technical communication: Translate across technical and non-technical audiences.",[147,37254,37255],{},"Collaborative problem solving: Partner with engineering to find pragmatic solutions.",[147,37257,37258],{},"Trade-off judgment: Balance debt, features, performance, scalability, and business priorities.",[14,37260,34670],{"id":34669},[504,37262,37263,37266,37274,37277,37280,37283,37286,37289,37295],{},[147,37264,37265],{},"Resume screening by hiring manager.",[147,37267,37268,37269,37273],{},"20‑minute ",[46,37270,37272],{"href":36318,"rel":37271},[108],"screening call"," with recruiter.",[147,37275,37276],{},"Director of Product interview (45m): product, technical fit, outcomes, communication.",[147,37278,37279],{},"CTO interview (45m): technical depth, collaboration, trade-offs.",[147,37281,37282],{},"Engineering Manager interview (30m): technical collaboration and requirements clarity.",[147,37284,37285],{},"STAR Interview (45m): A behavioral interview to understand past experiences and assess alignment with FlowFuse's values, initiative, and collaboration style. Conducted by the CEO.",[147,37287,37288],{},"Technical case study presentation with metrics and lessons learned.",[147,37290,37291,37292,37294],{},"Final interview (",[423,37293,36339],{},") with VP of Sales or stakeholder.",[147,37296,37297],{},"Offer.",{"title":75,"searchDepth":76,"depth":76,"links":37299},[37300,37304,37309,37310],{"id":34516,"depth":76,"text":34517,"children":37301},[37302,37303],{"id":15139,"depth":605,"text":35588},{"id":36929,"depth":605,"text":36930},{"id":34579,"depth":76,"text":34580,"children":37305},[37306,37307,37308],{"id":36949,"depth":605,"text":36950},{"id":37051,"depth":605,"text":37052},{"id":37144,"depth":605,"text":37145},{"id":34546,"depth":76,"text":34547},{"id":34669,"depth":76,"text":34670},{},"\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Ftechnical-product-manager",{"title":36874,"description":75},"handbook\u002Fpeopleops\u002Fjob-descriptions\u002Ftechnical-product-manager","4L12SiKHieIhLIEYpD3Bk8AToyz1nx_IAB6JaWmTyJU",{"id":37317,"title":37318,"body":37319,"description":75,"extension":81,"meta":37411,"navGroup":34729,"navOrder":83,"navTitle":37318,"navigation":84,"path":37412,"seo":37413,"stem":37414,"__hash__":37415},"handbook\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fvp-sales.md","VP of Sales",{"type":7,"value":37320,"toc":37408},[37321,37324,37326,37329,37332,37334,37360,37363,37377,37380,37391,37394],[10,37322,37318],{"id":37323},"vp-of-sales",[14,37325,34517],{"id":34516},[19,37327,37328],{},"The VP of Sales leads FlowFuse’s unified commercial team, driving revenue growth and building scalable go-to-market (GTM) motions. This role is responsible for establishing repeatable sales processes, expanding customer adoption, and ensuring long-term success through trusted partnerships.",[19,37330,37331],{},"The VP of Sales reports directly to the CEO and manages Sales, Solutions Engineering, Customer Success, Professional Services, and GTM Partnerships.",[19,37333,35014],{},[144,37335,37336,37339,37342,37345,37348,37351,37354,37357],{},[147,37337,37338],{},"Own revenue growth across new business, expansions, and renewals.",[147,37340,37341],{},"Build and lead the global commercial team (Sales, SE, CS, GTM Partnerships, Professional Services).",[147,37343,37344],{},"Establish scalable, repeatable GTM processes for pipeline generation, qualification, forecasting, and deal closure.",[147,37346,37347],{},"Personally engage in key customer opportunities while developing the team.",[147,37349,37350],{},"Drive partner strategy, including GTM alliances and service delivery partners.",[147,37352,37353],{},"Ensure smooth customer lifecycle handoffs and land-and-expand motions.",[147,37355,37356],{},"Collaborate with Product and Marketing to align messaging, market feedback, and growth strategy.",[147,37358,37359],{},"Instill a culture of transparency, accountability, and cross-functional teamwork.",[19,37361,37362],{},"Success Metrics:",[144,37364,37365,37368,37371,37374],{},[147,37366,37367],{},"New ARR and bookings growth.",[147,37369,37370],{},"Pipeline coverage and forecast accuracy.",[147,37372,37373],{},"Customer acquisition cost (CAC) Ratio - sales & marketing spend required to generate $1 of new ARR.",[147,37375,37376],{},"Net revenue retention (NRR) and customer churn rate.",[19,37378,37379],{},"Collaboration & Scope",[144,37381,37382,37385,37388],{},[147,37383,37384],{},"Works closely with Product on roadmap alignment and customer feedback loops.",[147,37386,37387],{},"Partners with Marketing on demand generation, campaigns, and messaging and pipeline growth.",[147,37389,37390],{},"Aligns with Engineering and Solutions Engineering on technical validation.",[19,37392,37393],{},"Values & Culture",[144,37395,37396,37399,37402,37405],{},[147,37397,37398],{},"Transparency and trust in all customer and team interactions.",[147,37400,37401],{},"Ownership and accountability in delivering outcomes.",[147,37403,37404],{},"GTM is a team sport — collaboration across functions is expected.",[147,37406,37407],{},"Customer empathy and long-term partnership drive every decision.",{"title":75,"searchDepth":76,"depth":76,"links":37409},[37410],{"id":34516,"depth":76,"text":34517},{},"\u002Fhandbook\u002Fpeopleops\u002Fjob-descriptions\u002Fvp-sales",{"title":37318,"description":75},"handbook\u002Fpeopleops\u002Fjob-descriptions\u002Fvp-sales","_vwNNjBXztwD0KjeAqmn9kb5yEB4L5YnDbMfuFEPPpg",{"id":37417,"title":37418,"body":37419,"description":75,"extension":81,"meta":37656,"navGroup":83,"navOrder":83,"navTitle":37657,"navigation":84,"path":34490,"seo":37658,"stem":37659,"__hash__":37660},"handbook\u002Fhandbook\u002Fpeopleops\u002Fleave.md","Holiday and Leave",{"type":7,"value":37420,"toc":37647},[37421,37424,37428,37431,37437,37549,37553,37556,37559,37573,37576,37604,37607,37611,37614,37617,37621,37624,37627,37631,37634,37637,37640,37644],[10,37422,37418],{"id":37423},"holiday-and-leave",[14,37425,37427],{"id":37426},"logging-time-off","Logging time off",[19,37429,37430],{},"When taking more than 3 days off consecutively, tell (don't ask) your manager.\nThis ensures scheduling of work and operations can continue to run smoothly\nwithout you. When taking more than 2 consecutive weeks off, seek approval from\nyour manager.",[19,37432,37433,37434,10656],{},"Before you can take time off you should ",[2562,37435,37436],{},"always",[144,37438,37439,37462,37465,37476,37546],{},[147,37440,37441,37442,37447],{},"Log your time off\n",[46,37443,37446],{"href":37444,"rel":37445},"https:\u002F\u002Fhelp.letsdeel.com\u002Fhc\u002Fen-gb\u002Farticles\u002F4409044013201-How-do-I-request-time-off-",[108],"in Deel",[144,37448,37449],{},[147,37450,37451,37452,37456,37457],{},"Deel disallows ",[46,37453,37455],{"href":37454},"#holiday-policy","overages on the contracted days off",". If\nyou cannot file the complete length, file up to the allowance.\n",[144,37458,37459],{},[147,37460,37461],{},"This is a limitation in Deel and does not limit the amount of time off you may take.",[147,37463,37464],{},"Add an 'Out of Office' appointment in your personal Google Calendar, and\ndecline all meetings automatically.",[147,37466,37467,37468,37472,37473,549],{},"Add your Out of Office to your ",[46,37469,37471],{"href":37470},"#team-calendars","team calendar"," as ",[542,37474,37475],{},"Name OOO",[147,37477,37478,37479],{},"Add a 'Vacation responder' to your Gmail account, and provide another contact\nperson within your team.\n",[504,37480,37481,37487,37496,37506],{},[147,37482,4393,37483,37486],{},[423,37484,37485],{},"Gmail"," in your browser.",[147,37488,9900,37489,37492,37493],{},[423,37490,37491],{},"gear icon (⚙️)"," in the top-right corner, then choose ",[423,37494,37495],{},"“See\nall settings.”",[147,37497,37498,37499,37502,37503,37505],{},"Scroll down to the ",[423,37500,37501],{},"“Vacation responder”"," section in the ",[423,37504,11676],{}," tab.",[147,37507,37508,37509],{},"Set:\n",[144,37510,37511,37519,37528],{},[147,37512,37513,2040,37516],{},[423,37514,37515],{},"First day",[423,37517,37518],{},"Last day",[147,37520,37521,37524,37525,1583],{},[423,37522,37523],{},"Subject"," (e.g., ",[2562,37526,37527],{},"\"Out of Office\"",[147,37529,37530,37524,37533,1583],{},[423,37531,37532],{},"Message",[2562,37534,37535,37536,63,37539,37541,37542,37545],{},"\"I am out of the office and without email access\nthrough ",[2403,37537,37538],{},"Day",[2403,37540,22890],{},". Please contact ",[2403,37543,37544],{},"team member"," in my absence.\"",[147,37547,37548],{},"Inform fellow team members of your time off, and hand over work that’s distributed.",[164,37550,37552],{"id":37551},"team-calendars","Team Calendars",[19,37554,37555],{},"We use team-specific calendars to track team meetings, events, and team-level availability.",[19,37557,37558],{},"Out of Office time should be visible in two places:",[144,37560,37561,37568],{},[147,37562,37563,37564,37567],{},"Your ",[423,37565,37566],{},"personal calendar"," so collaborators across the company can see your availability.",[147,37569,37563,37570,37572],{},[423,37571,37471],{}," so your immediate team has clear visibility into coverage and capacity.",[19,37574,37575],{},"This is intentional and not considered duplication. Each calendar serves a different audience.",[144,37577,37578,37584,37590,37597],{},[147,37579,37580],{},[46,37581,11608],{"href":37582,"rel":37583},"https:\u002F\u002Fcalendar.google.com\u002Fcalendar\u002Fu\u002F0?cid=Y19iMTZjMTdjYzlmNmZiMTYyZmI0NmUxMDIyNzNkNTFmMWQ4ZjI0MThkMzVmZTc5ZmExNGU0NTE3M2NkMDE5NTVlQGdyb3VwLmNhbGVuZGFyLmdvb2dsZS5jb20",[108],[147,37585,37586],{},[46,37587,21080],{"href":37588,"rel":37589},"https:\u002F\u002Fcalendar.google.com\u002Fcalendar\u002Fu\u002F0?cid=Y19iY2UwZjY2NzE3ZTQ3YjAzZjgxZjliNTdjNWNhYTkyYTZlOTM1ZTg5NGU5MDdiOTZjNmY5N2I4ODA3MjllMDQ5QGdyb3VwLmNhbGVuZGFyLmdvb2dsZS5jb20",[108],[147,37591,37592],{},[46,37593,37596],{"href":37594,"rel":37595},"https:\u002F\u002Fcalendar.google.com\u002Fcalendar\u002Fu\u002F0?cid=Y19lNThhNThlZDlmNjMyOGQ2YzcwN2VmMWM1MWYxMGU0MzAwMWY4NzhlY2Y0MTI2NTRmY2QzNDYyY2QwMjhiYzFlQGdyb3VwLmNhbGVuZGFyLmdvb2dsZS5jb20",[108],"Sales",[147,37598,37599],{},[46,37600,37603],{"href":37601,"rel":37602},"https:\u002F\u002Fcalendar.google.com\u002Fcalendar\u002Fu\u002F0?cid=Y18wMGU5ZjcyZDE2ZTg0YzU1OTY2ODYxMTAxNmVlMjY2YmRlNzlmMDU3ZjAyMWJjNmU4ZTQ3ZjE0YzE2YjYyZGZiQGdyb3VwLmNhbGVuZGFyLmdvb2dsZS5jb20",[108],"BizOps",[19,37605,37606],{},"If you own a recurring event, place it on the most appropriate calendar for visibility. In some cases, this may still be the FlowFuse Team Events calendar.",[14,37608,37610],{"id":37609},"holiday-policy","Holiday Policy",[19,37612,37613],{},"FlowFuse has an unlimited time off policy. Taking vacation is encouraged for all\nteam members. To prevent an undefined number of vacation days to start a race to\nthe bottom, we recommend each team member to take a minimum of 25 days a year,\nand at least 5 days a quarter.",[19,37615,37616],{},"Due to legal limitations, Canadian employees can not be offered unlimited PTO\nand will have the aforementioned 25 days instead.",[14,37618,37620],{"id":37619},"sick-leave","Sick leave",[19,37622,37623],{},"Sick leave, or having limited availability, is not recorded currently. Keep your\nmanager updated on your health, and let them know what FlowFuse can do for you\nto aid in your recovery.",[19,37625,37626],{},"Please log the days you're out in the team calendar so the rest of the company\nunderstands you're unavailable.",[14,37628,37630],{"id":37629},"parental-leave","Parental Leave",[19,37632,37633],{},"If you live in a country where a statutory Parental Leave benefit is available,\nyou will be required to claim statutory Parental Leave pay (if you are\neligible).",[19,37635,37636],{},"Any employee can take up to 6 weeks if they wish without requiring manager\napproval. We recommend a minimum of 4 weeks, but recognize it's a personal\nchoice to make. Further leave can be requested, but should be discussed with\nyour manager. Inform your manager of the expected new family member at least 16\nweeks before the due date to qualify for the extended parental leave.",[19,37638,37639],{},"If you live in a country that offers statutory leave longer than this, then\nFlowFuse will abide by this.",[14,37641,37643],{"id":37642},"bereavement-leave","Bereavement Leave",[19,37645,37646],{},"Our company understands the profound impact that the loss of a loved one can\nhave on an employee, and we are committed to supporting our team members during\ndifficult times. Therefore, FlowFuse has a bereavement leave policy. Employees\nwho experience the death of an immediate family member, such as a spouse, child,\nparent, or sibling, are eligible for up to five consecutive days of paid leave.",{"title":75,"searchDepth":76,"depth":76,"links":37648},[37649,37652,37653,37654,37655],{"id":37426,"depth":76,"text":37427,"children":37650},[37651],{"id":37551,"depth":605,"text":37552},{"id":37609,"depth":76,"text":37610},{"id":37619,"depth":76,"text":37620},{"id":37629,"depth":76,"text":37630},{"id":37642,"depth":76,"text":37643},{},"Holiday & Leave",{"title":37418,"description":75},"handbook\u002Fpeopleops\u002Fleave","hnPP7XAWutAdH2C8qrHjbujICwn0MkRIfzm6oV2CRgo",{"id":37662,"title":37663,"body":37664,"description":37671,"extension":81,"meta":37862,"navGroup":83,"navOrder":83,"navTitle":34485,"navigation":84,"path":34484,"seo":37863,"stem":37864,"__hash__":37865},"handbook\u002Fhandbook\u002Fpeopleops\u002Forganization.md","PeopleOps policies",{"type":7,"value":37665,"toc":37842},[37666,37669,37672,37676,37679,37682,37686,37689,37693,37696,37700,37703,37707,37710,37714,37717,37721,37724,37728,37731,37735,37738,37741,37745,37748,37751,37755,37758,37775,37778,37782,37785,37788,37791,37795,37803,37809,37812,37815,37819,37822,37826,37829,37832,37835,37839],[10,37667,37663],{"id":37668},"peopleops-policies",[19,37670,37671],{},"All employees at FlowFuse will find PeopleOps policies in this section of the handbook. Please note that this section of the handbook will be continuously updated to reflect the evolving needs of our organization. As FlowFuse is actively in the process of developing and incorporating additional policies, we encourage you to check back regularly for the latest updates. Your familiarity with these policies ensures that you stay informed and aligned with our company's values and practices.",[14,37673,37675],{"id":37674},"grievance-procedure","Grievance Procedure",[19,37677,37678],{},"We're all about making FlowFuse a great place to work for everyone. However, if you ever run into any concerns while you're here, these guidelines are here to help you out in raising a grievance.",[19,37680,37681],{},"This procedure applies to all employees and contractors regardless of length of service. It does not apply to ad-hoc freelancers.",[164,37683,37685],{"id":37684},"step-1-informal-resolution","Step 1: Informal Resolution",[19,37687,37688],{},"Should an employee have a grievance, we encourage them to first attempt an informal resolution by discussing the matter with their immediate manager. If your manager is not aware or if the matter requires escalation, our CEO is available to assist. This step is intended to achieve a swift and amicable resolution.",[164,37690,37692],{"id":37691},"step-2-submitting-grievance-via-email","Step 2: Submitting Grievance via Email",[19,37694,37695],{},"If the employee is not satisfied with the result of the informal resolution or is hesitant to approach their immediate manager, they can escalate the matter by sending a formal grievance via email to the CEO. The email should comprehensively outline the problem, include pertinent details, and provide any available evidence that support the grievance.",[164,37697,37699],{"id":37698},"step-3-investigation","Step 3: Investigation",[19,37701,37702],{},"Upon receipt of a formal grievance, the CEO will initiate an unbiased investigation. This might entail conversations with the concerned employee, pertinent witnesses, and a review of relevant documentation.",[164,37704,37706],{"id":37705},"step-4-resolution","Step 4: Resolution",[19,37708,37709],{},"After the investigation, the CEO will focus on finding a fitting solution. This might include making things right, changing policies, or taking other steps to address the concern. FlowFuse aims to provide a solution within 10 days from when the employee submits their first formal grievance. Please be aware that sometimes, unforeseen circumstances can cause delays in the investigation. However, rest assured that FlowFuse is committed to resolving it as soon as possible.",[164,37711,37713],{"id":37712},"step-5-appeal","Step 5: Appeal",[19,37715,37716],{},"If the grievance has not been resolved to your satisfaction you may appeal in\nwriting an email to the CEO, stating your full grounds of appeal including any\nadditional information or arguments, within one week of the date on which the\ndecision was sent or given to you.",[164,37718,37720],{"id":37719},"step-6-final-review","Step 6: Final Review",[19,37722,37723],{},"We'll schedule an appeal meeting, typically within two weeks of receiving your appeal. This meeting will be conducted impartially by someone who was not previously engaged with the case. Following the appeal hearing, we'll provide our final decision, usually within one week. Unfortunately, there won't be any additional opportunity for appeal beyond this point.",[164,37725,37727],{"id":37726},"confidentiality","Confidentiality",[19,37729,37730],{},"FlowFuse is firmly committed to preserving the confidentiality of all parties involved throughout the grievance process. This commitment holds while conducting a comprehensive investigation and implementing any required corrective actions.",[164,37732,37734],{"id":37733},"non-retaliation","Non-Retaliation",[19,37736,37737],{},"FlowFuse strictly prohibits any form of retaliation against employees who raise grievances in good faith. Any acts of retaliation will be treated as distinct violations of company policy.",[19,37739,37740],{},"This Grievance Policy is designed to ensure that employee concerns are treated fairly and promptly. FlowFuse is unwavering in its dedication to fostering an inclusive and respectful workplace and will consistently refine its policies and practices based on feedback and evolving industry standards.",[14,37742,37744],{"id":37743},"underperformance-policy","Underperformance Policy",[19,37746,37747],{},"The purpose of this policy is to establish a clear and consistent process for\naddressing employee underperformance in a timely and effective manner. This\npolicy is designed to ensure that all employees are aware of FlowFuse's\nexpectations and have the opportunity to improve their performance.",[19,37749,37750],{},"Addressing underperformance effectively and promptly is crucial for building\na high-performing team and is instrumental to the company's overall success.",[164,37752,37754],{"id":37753},"defining-underperformance","Defining underperformance",[19,37756,37757],{},"Underperformance is defined as failure to meet the company's expectations for performance, conduct, or attendance. It can manifest in various ways, including, but not limited to:",[504,37759,37760,37763,37766,37769,37772],{},[147,37761,37762],{},"Failing to meet job expectations. This encompasses not achieving set goals,\ntargets, or objectives, consistently producing substandard work, or lacking the\nnecessary skills or expertise to perform assigned tasks effectively.",[147,37764,37765],{},"Inconsistent or unpredictable performance. Fluctuating performance levels,\ndemonstrating occasional bursts of good work followed by periods of subpar\nperformance, or failing to maintain a consistent level of work quality can\nindicate underperformance.",[147,37767,37768],{},"Negative work attitude or demeanor. A consistently negative attitude,\ndisplaying disinterest or apathy towards work, exhibiting poor teamwork skills,\nor creating a disruptive work environment can be considered underperformance.",[147,37770,37771],{},"Attendance issues. Excessive absenteeism or tardiness without valid reasons\ncan signal underperformance, as it disrupts workflow and impacts productivity.",[147,37773,37774],{},"Non-compliance with company policies. Failure to adhere to company policies,\nprocedures, or ethical standards can constitute underperformance, as it\nundermines the company's culture and values.",[19,37776,37777],{},"It's important to note that underperformance is not limited to a single category;\nit can be a combination of factors that hinder an employee's ability to\ncontribute effectively to the organization.",[164,37779,37781],{"id":37780},"identification-of-underperformance","Identification of Underperformance",[19,37783,37784],{},"Either the manager or the employee in questions can identify underperformance.\nIdentification is always discussed in the first 1:1 meeting between the manager\nand employee.\nThe manager is tasked with addressing the underperformance, and may\nformulate a plan to remedy the situation. All plans cover at most the next\nfour weeks.",[19,37786,37787],{},"When the employee self identified underperformance, the manager must create a\nplan for at least the next two weeks.",[19,37789,37790],{},"All cases of underperformance must be documented by the manager through email to\nthe CEO and CTO with the timespan of a potential plan created by the employee's\nmanager.",[164,37792,37794],{"id":37793},"coaching-plan-for-performance-support","Coaching Plan for Performance Support",[19,37796,37797,37798,37802],{},"When additional structure or support is needed to help a team member meet the\nexpectations of their role, the manager may create a ",[46,37799,37801],{"href":37800},"\u002Fhandbook\u002Fpeopleops\u002Fcoaching-plans\u002F","Coaching Plan"," in partnership\nwith the employee.",[19,37804,37805,37808],{},[423,37806,37807],{},"A Coaching Plan is a genuine investment by FlowFuse in supporting a team member’s success.","\nFlowFuse believes in supporting team members through structured development and clear expectations.\nA Coaching Plan sets shared expectations for both the manager and team member, while providing the support, feedback, and mentorship needed to succeed.",[19,37810,37811],{},"The Coaching Plan will outline the areas for improvement, the actions to be taken, the support and resources provided, and the expected review timeline.",[19,37813,37814],{},"If an employee has previously completed a Coaching Plan for the same concerns and re-enters\nthis stage, the company may determine that a different approach is appropriate.\nThis helps ensure Coaching Plans remain a meaningful tool for growth.",[164,37816,37818],{"id":37817},"termination","Termination",[19,37820,37821],{},"If performance does not improve despite sustained coaching and support, or if serious\npolicy violations occur, termination may be considered.\nTermination will be based on a documented pattern of underperformance or unacceptable behavior.",[14,37823,37825],{"id":37824},"ceo-underperformance","CEO underperformance",[19,37827,37828],{},"As with all employees in the company the CEO can underperform. Generally speaking\nthe CEO does get performance reviews, though these are provided by the Board of\nDirectors.",[19,37830,37831],{},"All employees are free to provide feedback or input to the board of directors\nthrough email. This venue is to be used in all cases where you'd usually also go to someone's manager\nto discuss a reports underperformance. It's advised not to include the CEO in such an email.",[19,37833,37834],{},"If the board agrees with the CEO underperforming a seperate process will be followed\ntailored to the sitation and the bylaws of FlowFuse.",[14,37836,37838],{"id":37837},"role-changes","Role changes",[19,37840,37841],{},"If a team member experiences a role change because they are promoted, demoted, or taking on new responsibilities, their new role should be announced to the whole company via the \"announcements\" Slack channel so that all team members are aware. The \"why\" behind the change does not need to be explained unless it's celebratory.",{"title":75,"searchDepth":76,"depth":76,"links":37843},[37844,37854,37860,37861],{"id":37674,"depth":76,"text":37675,"children":37845},[37846,37847,37848,37849,37850,37851,37852,37853],{"id":37684,"depth":605,"text":37685},{"id":37691,"depth":605,"text":37692},{"id":37698,"depth":605,"text":37699},{"id":37705,"depth":605,"text":37706},{"id":37712,"depth":605,"text":37713},{"id":37719,"depth":605,"text":37720},{"id":37726,"depth":605,"text":37727},{"id":37733,"depth":605,"text":37734},{"id":37743,"depth":76,"text":37744,"children":37855},[37856,37857,37858,37859],{"id":37753,"depth":605,"text":37754},{"id":37780,"depth":605,"text":37781},{"id":37793,"depth":605,"text":37794},{"id":37817,"depth":605,"text":37818},{"id":37824,"depth":76,"text":37825},{"id":37837,"depth":76,"text":37838},{},{"title":37663,"description":37671},"handbook\u002Fpeopleops\u002Forganization","WxIE8rbJqiQxiGyilhfab5JPHPTFtnwTM_6dLtSCtwc",{"id":37867,"title":32086,"body":37868,"description":37977,"extension":81,"meta":37978,"navGroup":83,"navOrder":83,"navTitle":37979,"navigation":84,"path":5032,"seo":37980,"stem":37981,"__hash__":37982},"handbook\u002Fhandbook\u002Fpeopleops\u002Fperformance-review.md",{"type":7,"value":37869,"toc":37969},[37870,37872,37879,37882,37888,37890,37904,37907,37909,37912,37932,37935,37938,37942,37945,37949,37961,37964,37966],[10,37871,32086],{"id":32085},[19,37873,37874,37875,37878],{},"In September a performance review is done for all employees. The performance\nreview is based on ",[46,37876,37877],{"href":7304},"our values"," and meeting role\nexpectations. A review is held by the direct manager of each employeee. The\nmanager will write down their expectations, where these were met, and where the\nemployee can still grow. This text is shared with each individual employee.",[19,37880,37881],{},"While this performance review is written down, each manager should be communicating\nfeedback regularly to minimize the chance for surprises during the written review.",[19,37883,37884,37885,37887],{},"The performance review process will be skipped in the following circumstances: new employees who have been with the company for fewer than 6 months at the time of the review cycle, employees who have been on extended leave, and employees who are currently engaged in a  ",[46,37886,37801],{"href":37800}," where focused development work is already underway.\nIn cases where the formal review is skipped, managers should still provide informal feedback and check-ins to ensure ongoing communication and support.",[14,37889,201],{"id":200},[19,37891,1388,37892,37897,37898,37903],{},[46,37893,37896],{"href":37894,"rel":37895},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1E_Ni5kIcgRAvx9ZxFECOxJkFzzvDoUSpb5YfzKd1zCk\u002F",[108],"template document"," is available to structure the review.\nPlease be sure to duplicate ",[2562,37899,37900],{},[423,37901,37902],{},"and move"," the document before filling it out as to not share employee performance reviews with others unintentionally.",[19,37905,37906],{},"The template consists of the following:",[164,37908,2845],{"id":7062},[19,37910,37911],{},"Each of the Company Values will be rated as one of the following:",[144,37913,37914,37920,37926],{},[147,37915,37916,37919],{},[423,37917,37918],{},"Exceeds:"," Employee consistently goes above and beyond in this area.",[147,37921,37922,37925],{},[423,37923,37924],{},"Achieves:"," Employee meets expectations for their seniority in this area.",[147,37927,37928,37931],{},[423,37929,37930],{},"Room for Growth:"," This is an area where the employee could improve.",[19,37933,37934],{},"Details and examples should be provided with each instance. It is also important that employees are not disheartened\nif given \"Room for Growth\" feedback. In fact, managers are encouraged to assign this rating to at least one of the\ncompany values, although this should not be forced.",[19,37936,37937],{},"It is almost impossible to achieve\u002Fexceed all values perfectly, sometimes particular employees are more focus on\ncustomer\u002Fcommunity engagement, others may be more focused on specific technical requirements. This is normal and should be embraced.",[164,37939,37941],{"id":37940},"highlights","Highlights",[19,37943,37944],{},"A chance to focus on the best things that the employee has contributed to FlowFuse since their last review (or first day\nif this is their first review). Highlights should come from both employees and their managers, and are a chance to reflect\non the positive aspects of the employee's work, great contributions made and the impact it's had on the company's success.",[164,37946,37948],{"id":37947},"compensation-changes","Compensation Changes",[19,37950,37951,37952,37955,37956,37960],{},"As per the ",[46,37953,37954],{"href":32654},"\"Compensation\""," section of the Handbook, FlowFuse can opt to adjust your compensation\nat the same time your performance reviews are delivered. Please see the ",[46,37957,37959],{"href":37958},"\u002Fhandbook\u002Fpeopleops\u002Fcompensation#adjustment","\"Adjustments\"","\nsection for more details on the factors driving those changes.",[19,37962,37963],{},"This section of the review should clearly state the Employee's existing compensation, the change (if any) to that compensation, and the net\nsalary after the change.",[164,37965,8002],{"id":7882},[19,37967,37968],{},"This section should be used to capture employee thoughts, feedback, and any other topics that come up during the review.",{"title":75,"searchDepth":76,"depth":76,"links":37970},[37971],{"id":200,"depth":76,"text":201,"children":37972},[37973,37974,37975,37976],{"id":7062,"depth":605,"text":2845},{"id":37940,"depth":605,"text":37941},{"id":37947,"depth":605,"text":37948},{"id":7882,"depth":605,"text":8002},"In September a performance review is done for all employees. The performance\nreview is based on our values and meeting role\nexpectations. A review is held by the direct manager of each employeee. The\nmanager will write down their expectations, where these were met, and where the\nemployee can still grow. This text is shared with each individual employee.",{},"Performance review",{"title":32086,"description":37977},"handbook\u002Fpeopleops\u002Fperformance-review","xSWyuTVqf_P7MJP3PRSDzT2LCMXKNm8LqjgtM5RvYyc",{"id":37984,"title":37985,"body":37986,"description":37993,"extension":81,"meta":38412,"navGroup":83,"navOrder":83,"navTitle":37985,"navigation":84,"path":34496,"seo":38413,"stem":38414,"__hash__":38415},"handbook\u002Fhandbook\u002Fpeopleops\u002Fsummit.md","Summit",{"type":7,"value":37987,"toc":38395},[37988,37991,37994,37996,37999,38002,38004,38007,38013,38021,38025,38028,38032,38035,38042,38045,38083,38087,38090,38128,38131,38135,38138,38141,38155,38158,38161,38165,38170,38173,38176,38187,38191,38194,38197,38201,38204,38208,38211,38215,38218,38221,38225,38228,38231,38239,38242,38253,38256,38259,38262,38285,38288,38291,38294,38297,38314,38317,38321,38324,38327,38331,38334,38337,38340,38344,38347,38350,38354,38357,38359,38362,38365,38369,38372,38375,38379,38382,38386,38389,38392],[10,37989,37985],{"id":37990},"summit",[19,37992,37993],{},"FlowFuse intends to host an annual summit bringing together all employees in one place.\nThis summit aims to create an occasion where we can gather the company in person,\nfostering connections, and facilitating collaborative discussions on a range of\nsubjects.",[14,37995,201],{"id":200},[19,37997,37998],{},"Summits normally last for three full days, with an additional day\nallocated either side of the summit designated for travel.",[19,38000,38001],{},"The day before the company summit, senior leadership can assemble for a strategy day or board meeting,\nmaking the most of the time in-person.",[14,38003,30039],{"id":32816},[19,38005,38006],{},"FlowFuse will be responsible for booking the accommodation, activities and communal\ndinners and lunches. Each employee is then responsible for booking their own flights\nand travel arrangements. Please check in with the summit organizer on your own personal\nbudget, as this will differ person-to-person and be a factor of each employee's location.",[19,38008,38009,38010,38012],{},"See the ",[46,38011,30406],{"href":30405}," for policies on flights, visas, extended stays, and bringing family.",[19,38014,38015,38016,38020],{},"Other expenses whilst performing duties as employee ",[46,38017,38019],{"href":38018},"\u002Fhandbook\u002Fpeopleops\u002Fexpenses\u002F#expenses","are reimbursed"," if within the scope of the summit.",[164,38022,38024],{"id":38023},"alcohol","Alcohol",[19,38026,38027],{},"Expensing of alcohol purchases should be considered on a case-by-case basis, and\nis at the discretion of senior leadership. This should be checked before making purchases.",[14,38029,38031],{"id":38030},"organizing-summits","Organizing Summits",[164,38033,16699],{"id":38034},"budget",[19,38036,38037,38038,38041],{},"Budget will be allocated by the CEO for each summit and will be designated on a ",[2562,38039,38040],{},"per\nperson"," basis, rather than a singular amount. This will be communicated to the\nSummit organizer upfront.",[19,38043,38044],{},"The most important elements to consider for budgeting are:",[144,38046,38047,38053,38059,38065,38071,38077],{},[147,38048,38049,38052],{},[423,38050,38051],{},"Accommodation:"," This will be the most expensive aspect of organizing a summit.\nA balance should be considered of the practicality of the location vs. the overall cost.",[147,38054,38055,38058],{},[423,38056,38057],{},"Travel:"," This will be the second most expensive component of the summit. Whilst\nbudget is an important factor here, also consider ease\u002Flogistics of travel.",[147,38060,38061,38064],{},[423,38062,38063],{},"Entertainment:"," Entertainment is a very important part of the summit. These are\ngenerally competitive, team-building focussed or tourism-focussed activities.",[147,38066,38067,38070],{},[423,38068,38069],{},"Venue:"," For the working part of the summit, a venue is required to host meetings,\nworkshops, presentations, etc.",[147,38072,38073,38076],{},[423,38074,38075],{},"Food:"," Costs associated to lunches and dinners should be considered. Generally,\nbreakfast costs are included in the hotel rates.",[147,38078,38079,38082],{},[423,38080,38081],{},"Swag:"," FlowFuse-branded goodies should be distributed to attendees. Take\nconsideration of the last time the swag was distributed, and ensure there is limited\noverlap.",[239,38084,38086],{"id":38085},"example-budget","Example Budget",[19,38088,38089],{},"At the time of writing this, the budget for each person for the most recent summit in London was split as such:",[144,38091,38092,38098,38104,38110,38116,38122],{},[147,38093,38094,38097],{},[423,38095,38096],{},"Accommodation",": ~37%",[147,38099,38100,38103],{},[423,38101,38102],{},"Travel",": ~22%",[147,38105,38106,38109],{},[423,38107,38108],{},"Entertainment",": ~17%",[147,38111,38112,38115],{},[423,38113,38114],{},"Food",": ~10%",[147,38117,38118,38121],{},[423,38119,38120],{},"Venue",": ~5% (Note, the summit was hosted at the hotel, so there were limited additional costs here)",[147,38123,38124,38127],{},[423,38125,38126],{},"Swag",": ~8%",[19,38129,38130],{},"It is advised to leave a 1-2% margin for overheads and unexpected costs.",[164,38132,38134],{"id":38133},"location-travel","Location & Travel",[19,38136,38137],{},"Location will vary from summit to summit, and will be communicated at least three months\nahead of time, ensuring everyone has sufficient time to make their travel arrangements.",[19,38139,38140],{},"Past summits have been held in the following locations:",[144,38142,38143,38146,38149,38152],{},[147,38144,38145],{},"London, UK",[147,38147,38148],{},"Utrecht, Netherlands",[147,38150,38151],{},"Barcelona, Spain",[147,38153,38154],{},"Winchester, UK",[19,38156,38157],{},"We have employees all over the world. Consider the average travel time for each of them,\nand the logistics they have to undergo in order to get to the summit. There is a balance\nof expense, and ease of travel to be had, especially as, whilst we explicitly pay for\nflights, we are also then losing time on the travel days when employees would otherwise\nbe working.",[19,38159,38160],{},"The Organizer should also factor in the ease of getting Visas for team members who need\nto travel outside of their country.",[164,38162,38164],{"id":38163},"flights-accommodation","Flights & Accommodation",[19,38166,38167,38168,549],{},"As the summit organizer, research rough flight costs for each employee based on their location, add a 10–15% buffer, and communicate that as their personal budget. General employee travel policies — including flights, accommodation, visas, extended stays, and bringing family — are documented in the ",[46,38169,30406],{"href":30405},[164,38171,38096],{"id":38172},"accommodation",[19,38174,38175],{},"Key considerations for where to hold the accommodation and required amenities:",[144,38177,38178,38181,38184],{},[147,38179,38180],{},"The whole company should be able to attend the summit, so the venue should be\nable to accommodate everyone.",[147,38182,38183],{},"Breakfast should be available at the accommodation, and included in the cost. This\nmakes morning logistics smoother.",[147,38185,38186],{},"Location of the accommodation is an important consideration. The time taken to\ntravel from the accommodation to the summit venue and other social activities will\nmake the summit days themselves smoother, and more enjoyable.",[239,38188,38190],{"id":38189},"room-share","Room Share",[19,38192,38193],{},"In the past, we have had a room share arrangement for a summit, and whilst it\nreduced cost, the feedback was that in the future we should avoid this where possible.",[164,38195,38114],{"id":38196},"food",[239,38198,38200],{"id":38199},"breakfast","Breakfast",[19,38202,38203],{},"Breakfast is typically provided at the accommodation, as this will save time on\nmorning logistics.",[239,38205,38207],{"id":38206},"lunch","Lunch",[19,38209,38210],{},"Where possible, it is recommended to arrange for lunches to be provided at the summit venue.\nThis does not have to be a fixed plan for every day though, and can be mixed with\nwalking\u002Ftraveling lunches if afternoon activities make this necessary.",[239,38212,38214],{"id":38213},"dinner","Dinner",[19,38216,38217],{},"Dinner should be a community affair. Whilst a full company dinner does not need to be arranged for every day,\nit is recommended to have at least two of the nights being full company dinners. This helps with\nbonding and gives a more relaxed atmosphere over which to discuss the day's activities, and to\nget to know each other better.",[19,38219,38220],{},"Providing one night of flexibility also gives an opportunity for people to explore the locations\na little more, and try out food from the local area that they may otherwise miss out on.",[164,38222,38224],{"id":38223},"summit-venue","Summit Venue",[19,38226,38227],{},"The purpose of the \"venue\" is to host working sessions during the summit.",[19,38229,38230],{},"Minimum requirements:",[144,38232,38233,38236],{},[147,38234,38235],{},"Space for the whole company to watch presentations and be in the same space.",[147,38237,38238],{},"Provided refreshments (e.g. Tea, Coffee, Water, Juices)",[19,38240,38241],{},"Additional, preferred, requirements:",[144,38243,38244,38247,38250],{},[147,38245,38246],{},"Space for breakout rooms for smaller groups to meet in.",[147,38248,38249],{},"Space for individual work, and to take calls with prospects.",[147,38251,38252],{},"Lunch provided.",[164,38254,38108],{"id":38255},"entertainment",[19,38257,38258],{},"Entertainment is a very important part of the summit. To-date, we have generally split\nthe daytime of the summit into two halves, mornings being work-focussed, and then the\nafternoons and evenings being entirely focussed on entertainment, social and team\nbuilding activities.",[19,38260,38261],{},"Example social activities from past summits include:",[144,38263,38264,38267,38270,38273,38276,38279,38282],{},[147,38265,38266],{},"City segway tours",[147,38268,38269],{},"Cooking class (& dinner)",[147,38271,38272],{},"Escape rooms",[147,38274,38275],{},"Pub quiz",[147,38277,38278],{},"Visiting tourist attractions",[147,38280,38281],{},"Baking competitions",[147,38283,38284],{},"Social darts & crazy golf",[19,38286,38287],{},"Consider too that many employees will be traveling to the parts of the world they've\nnever been to before. Designing some of the entertainment and social activities to let employees\nexperience local culture is strongly encouraged.",[164,38289,38126],{"id":38290},"swag",[19,38292,38293],{},"FlowFuse-branded swag should be distributed to attendees upon arrival. Take consideration of the\nlast time the swag was distributed, and ensure there is limited overlap.",[19,38295,38296],{},"Past swag has included:",[144,38298,38299,38302,38305,38308,38311],{},[147,38300,38301],{},"Clothing (e.g. t-shirts, hoodies, hats)",[147,38303,38304],{},"Laptop Bags",[147,38306,38307],{},"Mugs",[147,38309,38310],{},"Notepads & Pens",[147,38312,38313],{},"Drones",[19,38315,38316],{},"When packing, please do keep in mind that will likely go home with more than you brought!",[164,38318,38320],{"id":38319},"designing-an-agenda","Designing an Agenda",[19,38322,38323],{},"The agenda should represent a balance of work, and fun, they should be designed\nto be as inclusive as possible, and to ensure that all employees have the\nopportunity to participate in the summit. As the company grows, running multiple, adjacent\nactivities in parallel can be a great way to ensure that everyone has the opportunity to\nparticipate in the summit, and so that employees can have more choice over what they do.",[19,38325,38326],{},"One key thing, that can easily be overlooked is to account fo travel between events.\nDon't pack the agenda too full, account for time to get from A to B with spare time.",[239,38328,38330],{"id":38329},"agenda-timings","Agenda Timings",[19,38332,38333],{},"Days should start 08:30\u002F09:00. Evenings should be considered as social\u002Fentertainment\ntime only. Outside of this, the format of the agenda can be very flexible.",[19,38335,38336],{},"Historically, we have split the daytime into two parts, mornings for working sessions\nuntil about 1-2pm, then afternoons for social\u002Fteam-building activities. Alternatively,\nit is possible to have a full day of working sessions, with a break for lunch, and\nthen a full day of social\u002Fteam-building activities.",[19,38338,38339],{},"Ensure you have accounted for regular breaks, and that there is time to get between\nvenues and activities.",[239,38341,38343],{"id":38342},"ice-breakers","Ice Breakers",[19,38345,38346],{},"For many attendees, this will be the first time they have met each other in person,\nice breakers are an excellent way of getting people comfortable with each other, and\nto start building in-person relationships.",[19,38348,38349],{},"Ice breakers should make up about an hour on the morning of the first day. They're designed to be a\nlittle silly, and get people relaxed in their environment.",[239,38351,38353],{"id":38352},"keynote","Keynote",[19,38355,38356],{},"One of the first items on the agenda should be a keynote from the CEO or another\nsenior leader. This should be a chance to set the tone for the summit, and to\nprovide an overview of the company's progress since the last summit, as well as\nlooking forward over the next few days and beyond.",[239,38358,8295],{"id":8294},[19,38360,38361],{},"Ahead of the summit, a notice should be put out for any employees who would like to\npresent at the summit. This could be a presentation on a new product, a new feature,\na new process, or anything else that they would like to share with the company. Focus\nshould be given on knowledge sharing, giving the chance for one part of the business\nto educate other areas on their own learnings and experiences.",[19,38363,38364],{},"In addition to voluntary presentations, there should be a few key presentations that\nare organized by the CEO and other senior leaders. These can be strategy-focussed,\neducation-focussed (e.g. teaching people about a particular industry), or\nany other topic that is relevant to the company.",[239,38366,38368],{"id":38367},"workshops","Workshops",[19,38370,38371],{},"Workshops are a great alternative format to mix in with presentations. They should\nencourage collaboration, and can be a very effective vehicle for knowledge sharing\nand improving skills. Workshops can be anything from a training session, to a\nbrainstorming session.",[19,38373,38374],{},"It is common to have at least one Node-RED themed workshop, whether this be a\nhands-on workshop, or ideation session. Everyone at the company being exposed to\nNode-RED assists with employees gaining empathy for our end-users.",[239,38376,38378],{"id":38377},"breakout-sessions","Breakout Sessions",[19,38380,38381],{},"As the company grows there are benefits to having smaller breakout sessions at the summit,\nwhere members of the company can be silo into functional areas, e.g. sales, marketing,\nengineering. These breakout sessions can allow teams to have more focussed discussions,\nand ensure everyone present can actively engage in conversations in a productive manner.",[239,38383,38385],{"id":38384},"open-working-sessions","Open-Working Sessions",[19,38387,38388],{},"Not every minute of the working sessions has to be structured. In making the most of the\nin-person time, open-working sessions can be a great way to break up the day, and provide\nemployees an opportunity to chat with their colleagues and work through problems and\nhave 1:1 conversations.",[239,38390,38108],{"id":38391},"entertainment-1",[19,38393,38394],{},"Summits should be a good balance of hard-work and fun. Social and team-building activities\nshould make up evenings, as well as time during the day too.",{"title":75,"searchDepth":76,"depth":76,"links":38396},[38397,38398,38401],{"id":200,"depth":76,"text":201},{"id":32816,"depth":76,"text":30039,"children":38399},[38400],{"id":38023,"depth":605,"text":38024},{"id":38030,"depth":76,"text":38031,"children":38402},[38403,38404,38405,38406,38407,38408,38409,38410,38411],{"id":38034,"depth":605,"text":16699},{"id":38133,"depth":605,"text":38134},{"id":38163,"depth":605,"text":38164},{"id":38172,"depth":605,"text":38096},{"id":38196,"depth":605,"text":38114},{"id":38223,"depth":605,"text":38224},{"id":38255,"depth":605,"text":38108},{"id":38290,"depth":605,"text":38126},{"id":38319,"depth":605,"text":38320},{},{"title":37985,"description":37993},"handbook\u002Fpeopleops\u002Fsummit","JYKGm0N_71BlAKQ6-sQ-LJZsQzUgKQN_6KZcMPbqU0E",{"id":38417,"title":38102,"body":38418,"description":38501,"extension":81,"meta":38502,"navGroup":83,"navOrder":83,"navTitle":38102,"navigation":84,"path":38503,"seo":38504,"stem":38505,"__hash__":38506},"handbook\u002Fhandbook\u002Fpeopleops\u002Ftravel.md",{"type":7,"value":38419,"toc":38493},[38420,38423,38432,38434,38441,38443,38446,38449,38452,38454,38457,38461,38468,38471,38475,38483,38487,38490],[10,38421,38102],{"id":38422},"travel",[19,38424,38425,38426,2040,38429,38431],{},"FlowFuse team members travel for company events, including the annual ",[46,38427,37990],{"href":38428},"\u002Fhandbook\u002Fpeopleops\u002Fsummit\u002F",[46,38430,25626],{"href":25625},". The policies below apply to all company-related travel.",[14,38433,30039],{"id":32816},[19,38435,38436,38437,38440],{},"Travel expenses are reimbursed in accordance with the ",[46,38438,38439],{"href":30469},"expenses policy",". The general principle is to treat work-related expenses as if they were your own money.",[14,38442,30410],{"id":30409},[19,38444,38445],{},"Each employee is responsible for booking their own flights. A per-person budget will be communicated by the event organizer in advance, typically based on estimated costs plus a 10–15% buffer.",[19,38447,38448],{},"FlowFuse accommodates reasonable journey durations and departure times.",[19,38450,38451],{},"FlowFuse does not cover business class flights.",[14,38453,38096],{"id":38172},[19,38455,38456],{},"Hotels near the event venue are preferred over city-central options. Accommodation that includes breakfast is preferred to simplify morning logistics.",[14,38458,38460],{"id":38459},"visas-invitation-letters","Visas & Invitation Letters",[19,38462,38463,38464,38467],{},"If a letter of invitation is required, please reach out to the BizzOps team to generate one. Allow a minimum of ",[423,38465,38466],{},"60 days"," lead time to process documentation and account for embassy wait times.",[19,38469,38470],{},"If a visa application is required, the employee is responsible for covering the associated fees. Visa costs are personal expenses, as they are part of standard travel screening that applies to all employees individually.",[14,38472,38474],{"id":38473},"extended-stays","Extended Stays",[19,38476,38477,38478,38482],{},"Traveling is a privilege. Many employees will visit places they otherwise would not have the opportunity to see, and FlowFuse fully encourages extending a stay either side of a company event, whether to work remotely or as ",[46,38479,38481],{"href":38480},"\u002Fhandbook\u002Fpeopleops\u002Fleave\u002F","paid leave",". Any costs during an extended stay are at the employee's own expense.",[14,38484,38486],{"id":38485},"bringing-family","Bringing Family",[19,38488,38489],{},"Family members are welcome to join for company travel and are encouraged to attend social events. Where an event is booked at a fixed group cost, family members may join for free. Where costs are directly proportional to the number of attendees, additional family members will be charged accordingly.",[19,38491,38492],{},"For accommodation, if an upgrade is needed (e.g., moving from a twin or single room to a double), the additional cost is at the employee's expense.",{"title":75,"searchDepth":76,"depth":76,"links":38494},[38495,38496,38497,38498,38499,38500],{"id":32816,"depth":76,"text":30039},{"id":30409,"depth":76,"text":30410},{"id":38172,"depth":76,"text":38096},{"id":38459,"depth":76,"text":38460},{"id":38473,"depth":76,"text":38474},{"id":38485,"depth":76,"text":38486},"FlowFuse team members travel for company events, including the annual summit and trade shows. The policies below apply to all company-related travel.",{},"\u002Fhandbook\u002Fpeopleops\u002Ftravel",{"title":38102,"description":38501},"handbook\u002Fpeopleops\u002Ftravel","tt_ZFh86ibA_PP8jWChtDAFLtwGjxiQEPYvujV2bp48",{"id":38508,"title":38509,"body":38510,"description":75,"extension":81,"meta":39255,"navGroup":83,"navOrder":83,"navTitle":32082,"navigation":84,"path":39256,"seo":39257,"stem":39258,"__hash__":39259},"handbook\u002Fhandbook\u002Fsales\u002Fcommission-plan\u002Findex.md","FY 2026 SALES COMPENSATION PLAN",{"type":7,"value":38511,"toc":39216},[38512,38515,38519,38522,38526,38532,38538,38544,38551,38557,38563,38569,38578,38584,38597,38603,38609,38615,38621,38627,38633,38639,38643,38646,38649,38652,38656,38663,38666,38669,38672,38676,38679,38682,38686,38689,38692,38696,38699,38702,38705,38709,38712,38716,38727,38730,38733,38736,38739,38743,38746,38773,38777,38780,38784,38787,38791,38794,38798,38801,38804,38808,38811,38814,38817,38820,38823,38826,38843,38847,38850,38854,38857,38861,38864,38868,38871,38875,38878,38883,38886,38891,38895,38900,38904,38914,38918,38921,38925,38928,38932,38934,38938,38941,38949,38953,38956,38964,38967,38971,38974,38978,38981,38984,38987,38990,39017,39020,39024,39027,39045,39049,39052,39056,39059,39064,39112,39120,39188,39192,39195,39199,39202,39206,39209,39213],[10,38513,38509],{"id":38514},"fy-2026-sales-compensation-plan",[14,38516,38518],{"id":38517},"_1-introduction","1. Introduction",[19,38520,38521],{},"The purpose of the FlowFuse’s Sales Compensation Plan (“Plan”) is to establish a sales incentive program that rewards the performance of eligible sales employees in return for meeting pre-established sales goals.  Specific sales territory, quotas, bonus, and commission rates are set forth in Exhibit A.",[14,38523,38525],{"id":38524},"_2-definitions","2. Definitions",[19,38527,38528,38531],{},[423,38529,38530],{},"“Agreement”"," means a written contract for goods and\u002For services entered into by and between a Customer and the Company.",[19,38533,38534,38537],{},[423,38535,38536],{},"“Authorized Official”"," means the Company executives listed in Exhibit A, or any member of senior management who is a manager of the executives listed in Exhibit A.",[19,38539,38540,38543],{},[423,38541,38542],{},"“Base Salary”"," means the wages paid to a Salesperson each payroll period, regardless of Salesperson’s performance under the Plan.",[19,38545,38546,38547,38550],{},"“",[423,38548,38549],{},"Booked","” means the satisfaction of all of the following conditions:  (1) a written Agreement is executed by a Customer on a Qualifying Sale, (2) the executed Agreement is accepted and approved by the Company, (3) the executed agreement and related quote and PO (if any) are attached to the opportunity in HubSpot.com and (4) the Company has shipped software or delivered services, (5) the “Closing a Deal” process as described in the company handbook has been completed.",[19,38552,38546,38553,38556],{},[423,38554,38555],{},"Booking Date","” means the date a sale was Booked.",[19,38558,38559,38562],{},[423,38560,38561],{},"“Chargeback”"," means the Company’s recovery of previously paid but unearned incentive payments from a Salesperson.",[19,38564,38565,38568],{},[423,38566,38567],{},"“Commissionable Value”"," means the amount upon which a Salesperson’s commission is calculated. For all Qualifying Sales, the Commissionable Value is: Commissionable Value = Incremental ARR + (5% × Non-Recurring Revenue)",[19,38570,38571,38574,38575,38577],{},[423,38572,38573],{},"“Company”"," or “",[423,38576,14441],{},"” means FlowFuse Inc and any of its affiliates, subsidiaries, successors, or assigns.",[19,38579,38580,38583],{},[423,38581,38582],{},"“Customer”"," means a customer that purchases products or services from the Company pursuant to the terms of an Agreement.",[19,38585,38586,38589,38590,1755,38593,38596],{},[423,38587,38588],{},"“Commissions”"," means Incentive Compensation relating to a Salesperson’s sale of qualifying products and services on authorized accounts in his or her sales territories.  As described in Section 9, Commissions are not deemed Earned until the satisfaction of a number of conditions, including the customer’s payment of the invoice in full.  However, except as provided by Section 9 or Section 15 of the Plan, Commissions will be advanced when the applicable sale or order is Booked (a “",[423,38591,38592],{},"Booking",[423,38594,38595],{},"Advance","”).",[19,38598,38599,38602],{},[423,38600,38601],{},"\"Draw Payment\""," means advance payments made against anticipated future Commissions.",[19,38604,38605,38608],{},[423,38606,38607],{},"\"Incentive Compensation\""," means the compensation, in excess of Base Salary, earned upon meeting specific individual and\u002For Company performance goals. Incentive Compensation for a particular Salesperson is set forth in Exhibit A.",[19,38610,38611,38614],{},[423,38612,38613],{},"\"Incremental ARR\""," means the incremental Annual Recurring Revenue generated from a sale. For new business, this is the total Annual Recurring Revenue (ARR) of the first contract. For upsells and renewals, this refers onlly to the increase in the annual recurring revenue relative to the prior contract.",[19,38616,38617,38620],{},[423,38618,38619],{},"“Recoverable Draw”"," is a Draw Payment offset by Earned Commissions.  Once Commissions are calculated, there will be a true up to recover the Draw Payment and pay the balance due (if any). If the value of the Draw Payment exceeds the Earned Commissions, the Company reserves the right to continue to deduct the value of Draw Payments from future Commissions until the full Draw Payment amount is recovered. This is referred to as a negative carry forward balance.",[19,38622,38623,38626],{},[423,38624,38625],{},"“Non-Recoverable Draw”"," is a Draw Payment offset by Earned Commissions.  However, if the Non-Recoverable Draw Payment exceeds the value of Earned Commissions, the difference is not recovered by the Company. If Earned Commissions exceed the value of the Non-Recoverable Draw, the Company will pay the greater of the two.",[19,38628,38629,38632],{},[423,38630,38631],{},"\"Non-Recurring Revenue\""," means revenue from one-time or non-renewing products or services, including but not limited to professional services, onboarding fees, training packages, and any other non-subscription charges.",[19,38634,38635,38638],{},[423,38636,38637],{},"“Salesperson”"," means an employee of the Company who works in the position identified in Exhibit A.",[14,38640,38642],{"id":38641},"_3-effective-date","3. Effective Date",[19,38644,38645],{},"Duration of Plan:  The Plan is effective as of term outlined in Exhibit A (“Plan Term”), unless earlier revoked or modified in writing by the Company.",[19,38647,38648],{},"Modification:  The Company reserves the right, in its sole discretion, to change the Plan to increase or decrease Incentive Compensation during the Plan Term or to revoke the Plan altogether. If the Company changes the Plan, such changes will not affect a Salesperson’s Incentive Compensation earned prior to the effective date of the Plan modification or revocation.",[19,38650,38651],{},"Expiration:  The Plan automatically expires at the expiration of the Plan Term.  The Company, in its sole discretion, shall determine the continuation, modification or cancellation of the Plan upon expiration of the Plan Term.",[14,38653,38655],{"id":38654},"_4-eligibility","4. Eligibility",[19,38657,38658,38659,38662],{},"Eligibility:  A Salesperson is eligible to participate in the Plan upon Salesperson’s commencement of employment with the Company as an active employee in the position identified in Exhibit A, and execution of the Company’s current form of At-Will Employment and Proprietary Information and Inventions Agreement (“",[423,38660,38661],{},"At-Will and Confidentiality Agreement","”). Eligibility to participate in the Plan terminates upon a Salesperson’s employment. The Company reserves the right to suspend participation in the Plan in the event of a Salesperson’s misconduct or violation of Company policy.  A Salesperson shall not be eligible for Commissions in connection with (1) sales occurring outside of such Salesperson’s territory, except as set forth in Section 10 below regarding open territories; (2) sales of products or services other than those specifically set forth in Exhibit A; (3) sales on unauthorized accounts; (4) sales made outside the Company’s discounting guidelines that have not been pre approved by an Authorized Official; or (5) sales involving side contracts or agreements containing terms outside of the Agreement between the Company and the customer.",[19,38664,38665],{},"Pro-rata annual calculation:  For annual bonus calculations, a Salesperson who starts after January 1 is eligible for Plan participation on a pro-rata basis. The pro-ration is n\u002F12 of annual entitlement where n equals the number of full months employed during the Plan Term.",[19,38667,38668],{},"Pro-rata quarterly calculation:  For quarterly bonus calculations, a Salesperson who joins the Company after the first day of the quarter will be eligible for participation on a pro-rata basis. The pro-ration for bonus calculations will be n\u002F3 of quarterly entitlement where n equals the number of full months employed during the quarter.",[19,38670,38671],{},"Unpaid status:  A Salesperson whose status changes to unpaid leave of absence will be ineligible for incentive compensation during the unpaid leave (A Salesperson will be paid all earned incentive compensation for the period before and after the unpaid leave of absence.)",[14,38673,38675],{"id":38674},"_5-quota","5. Quota",[19,38677,38678],{},"Quota assignment:  A Salesperson’s quota for sales is set forth in Exhibit A.",[19,38680,38681],{},"Requirement to achieve quota; at-will employment:  A Salesperson is required to achieve quota.  Failure to achieve quota may cause discipline up to and including immediate termination of employment, with or without prior notice.  Salespersons are employed at-will, meaning that either the Company or Salesperson may terminate the employment relationship at any time, with or without cause or prior notice. Accordingly, achievement of quota is not a guarantee or an implied promise of continued employment or an alteration of a Salesperson’s at-will status.",[14,38683,38685],{"id":38684},"_6-responsibilities-and-duties","6. Responsibilities and Duties",[19,38687,38688],{},"Responsibilities and assignments:  Salesperson agrees to perform diligently the duties and responsibilities assigned by the Company to the best of his or her ability.  Exhibit A sets forth the sales territories, accounts, products and services for which the Salesperson is eligible to earn Commissions (a “Qualifying Sale”).  Territories, accounts, prices of products or services are subject to change at any time at the sole discretion of Company management.",[19,38690,38691],{},"Responsibility for credit check and collection of revenue:  The Salesperson is responsible, with the assistance and cooperation of Company management and the accounting department, for evaluating the creditworthiness of new Customers, and for collection of revenue after obtaining a sale.",[14,38693,38695],{"id":38694},"_7-customer-terms-and-orders","7. Customer Terms and Orders",[19,38697,38698],{},"Company policies:  All terms and conditions of sales are to be made in accordance with Company policies, procedures and price lists.  Any exceptions must be pre-approved in writing by an Authorized Official.",[19,38700,38701],{},"Prior approval of discounts:  Salespersons will only make discounted offers to Customers that fall within the Company’s discounting guidelines or that have been pre-approved in writing by an Authorized Official.  In the event that a discounted offer falls outside the Company’s discounting guidelines and has not been pre-approved in writing by an Authorized Official, Company management may, in its sole discretion, may elect to reduce or eliminate any unearned Incentive Compensation for a sale resulting from the discounted offer.",[19,38703,38704],{},"Conflict of interest:  Salespersons must refuse gratuities, gifts or any property of value greater than nominal value from a Customer or prospective Customer. Salespersons must also avoid any other conduct that may create an actual or potential conflict of interest with a Customer or other third-party that is dealing with the Company.",[14,38706,38708],{"id":38707},"_8-termination-of-employment","8. Termination of Employment",[19,38710,38711],{},"Upon termination of employment or a transfer out of sales, Salesperson will be entitled to all earned Incentive Compensation, including Earned Commissions, unpaid as of the termination or transfer date.  Booking Advances will be made through the date of termination or transfer out of sales consistent with the timing of payment rules set forth in Section 15, subject to the Company’s right to recover any overpayments as set forth in Section 15 below.   In addition, following termination of employment or a transfer out of sales, Salesperson will continue to be eligible to earn Commissions on multi-year agreements and Commissions on large sales as the revenues\u002Fsales payments are received from the Company as provided in Section 9. For quarterly or annual bonus, the Salesperson must be employed through the last day of the applicable measurement period (i.e., the quarter or the year) to earn the bonus.  Earned Incentive Compensation will be paid as soon as such amounts are reasonably ascertainable and calculable after the termination or transfer but no later than the last day of the next month following the date of termination or transfer (and, in all events, no later than March 15 of the year following the end of the calendar year in which such amount was earned).  Commissions on multi-year agreements and large sales (as described in Section 9) Earned after termination of employment or a transfer out of sales will be paid as provided in Section 15.",[14,38713,38715],{"id":38714},"_9-when-sales-commissions-are-considered-earned","9. When Sales Commissions are Considered Earned",[19,38717,38718,38719,38722,38723,38726],{},"When Commission is earned: A Commission is deemed earned only if all of the following conditions are satisfied:  (1) the sales is Booked, and (2) the Company has collected the revenue (“",[423,38720,38721],{},"Earned","” or “",[423,38724,38725],{},"Earned Commissions","”).  However, Commissions will be advanced when the applicable sale is booked (Booking Advance) and will be paid as provided under Section 15 in accordance with the timing of payment rules for Booking Advances.",[19,38728,38729],{},"Multi-year Agreement:  Except as otherwise provided in Exhibit A, if the sale is a multi-year Agreement providing for installment payments, the Salesperson will earn a pro-rata commission as revenue installments are collected by the Company.  Upon each installment of the sale being booked, a Booking Advance will be made with respect to such installment as provided under Section 15 in accordance with the timing of payment rules for Booking Advances; provided, however, that if any single installment constitutes a “Commission on Large Sales” as provided in the following paragraph, Commissions and Booking Advances, if any, on such installment will be treated in accordance with such paragraph.",[19,38731,38732],{},"Commissions on Large Sales:  If a sale is greater than $500,000, Commissions on the first $500,000 of the sale will be advanced as Booking Advances in accordance with Section 15.  Commissions on the amount of the sale exceeding $500,000 will not be advanced and instead will be paid in the payroll period following the date such Commissions are Earned (i.e., the date the Company collects the revenue, if all other earning requirements have been met), as provided under Section 15.",[19,38734,38735],{},"Split: Two or more Salespersons who participated in a sale may split the commission with prior written approval of the appropriate Authorized Officials. The Company management in its sole discretion will determine any split.",[19,38737,38738],{},"Dispute resolution:  In the event a dispute arises among Salespersons regarding credit for a sale, Company management, in its sole direction, will evaluate the circumstances of the sale and assign the appropriate credit to a Salesperson or divide the credit among Salespersons.",[14,38740,38742],{"id":38741},"_10-open-territories","10. Open Territories",[19,38744,38745],{},"Open territory:  Upon following circumstances the Company may have and assign territory or territories:",[144,38747,38748],{},[147,38749,38750,38751,38759,38761,38762,38764,38765],{},"There is an open position in the account team of a specific territory that carries incremental quota.",[144,38752,38753,38756],{},[147,38754,38755],{},"The assigned account manager to the specific territory is on a leave of absence.",[147,38757,38758],{},"Any other situation that has the Company's approval.",[9379,38760],{},"Assignment:  Open Territories will be assigned on a case-to-case basis deemed by the Chief Executive Officer.",[9379,38763],{},"Compensation:",[144,38766,38767,38770],{},[147,38768,38769],{},"Booked Agreements in the open territory will be eligible for standard commission credit",[147,38771,38772],{},"Booked Agreements in the open territory will not be eligible for quota credit without management approval",[14,38774,38776],{"id":38775},"_11-presidents-club-achievers","11. President’s Club & Achievers",[19,38778,38779],{},"[Intentionally Left Blank.]",[14,38781,38783],{"id":38782},"_12-chargeback","12. Chargeback",[19,38785,38786],{},"In the event that a Salesperson is provided a Booking Advance, but the Customer later cancels all or part of an Agreement before collection of revenue, the Salesperson’s account will be subject to a Chargeback, by deducting the unearned Booking Advances against future Commissions. The Company also reserves the right to adjust any future Booking Advances, Recoverable Draw or Non-Recoverable Draw payments to reflect a Chargeback. In the event that the Salesperson’s employment terminates prior to the full recovery of a Chargeback from future commissions, such outstanding Chargeback will be recovered as an overpayment as set forth in Section 15.",[14,38788,38790],{"id":38789},"_13-prohibition-of-side-agreements","13. Prohibition of Side Agreements",[19,38792,38793],{},"All terms and conditions of the Company’s relationship with the Customer shall be included in the Agreement. A Salesperson may not enter into any side agreements or contracts, letters of intent, verbal agreements or other tacit understandings with a Customer that are not included in the final version of the Agreement executed by the Customer and approved by the Company. Violation of this prohibition on side agreements may result in discipline, up to and including immediate termination, with or without prior notice.",[14,38795,38797],{"id":38796},"_14-confidential-and-proprietary-informationnon-competition-during-employment","14. Confidential and Proprietary Information\u002FNon-Competition During Employment",[19,38799,38800],{},"Confidentiality: The Plan is confidential and proprietary.",[19,38802,38803],{},"Competition: During employment, Salesperson agrees not to promote the business, products or services of any other company or organization in competition with the Company and not to engage in any other outside business activity without the express written authorization of an Authorized Official. In addition, Salesperson acknowledges the restrictions on the use of Customer proprietary data.",[14,38805,38807],{"id":38806},"_15-administration","15. Administration",[19,38809,38810],{},"Draws and Advances: The Company may in its sole discretion provide a Non-Recoverable or Recoverable Draw or other advance to Salespersons. If the Company chooses to do this, the Authorized Officials will document and authorize the arrangement. Once authorized, any Non-Recoverable or Recoverable draw or other advance will be paid at the agreed-upon intervals for the authorized period (but no later than March 15 of the year following the end of the calendar year in which the Company authorized such draw or advance).  The Company reserves the right to modify or discontinue any authorized Non-Recoverable or Recoverable Draws or other advances.",[19,38812,38813],{},"Pay Days: The Company will pay earned Incentive Compensation, including Earned Commissions, in the final pay cycle of the payroll period following that in which it was earned. (In all events, earned Incentive Compensation, including Earned Commissions, will be paid no later than March 15 of the year following the end of the calendar year in which such payment was earned).  Booking Advances, if any, are generally advanced within 30 days (2nd pay cycle of each month) after the close of the month in which the booking date for such sale occurred. (Notwithstanding the foregoing or anything in the Plan to the contrary, to the extent Booking Advances are advanced, they will be paid no later than March 15 of the year following the end of the calendar year in which the sale was Booked.)",[19,38815,38816],{},"Advance of Commissions:  The Company may in its sole discretion advance commissions prior to the date upon which they are Earned. Booking Advances are subject to a chargeback if payment is not received within ninety (90) days of the booking date of the order, or 30 days after the payment term was due, whichever date is later.  The Company may determine, in its sole discretion, that Booking Advances will no longer be available and Commissions will instead be paid when Earned in accordance with the timing of payment rules above for Earned Commissions.",[19,38818,38819],{},"Overpayment. The Salesperson acknowledges that in the event of an inadvertent overpayment, or in the event that commissions advanced to Employee exceed Earned Commissions as of the Salesperson’s termination date, he or she will owe the overpaid amount as a debt to the Company, and will repay that debt by personal check or equivalent instrument. The Salesperson further acknowledges and understands that a failure to return the overpayment may result in legal action by the Company to recover the overpayment.  In the event that the Salesperson is terminated and there is an overpayment balance, the Salesperson may elect to have the overpayment deducted from the Salesperson’s final check, rather than repaying the debt by personal check. If the deduction from the final check is insufficient to cover the overpayment balance, the Salesperson will be responsible to pay back any remaining balance to the Company by personal check or equivalent instrument.  If Salesperson fails to repay the balance, Salesperson agrees that the Company may recover its reasonable attorneys’ fees and costs incurred in recovering said debt from him or her.",[19,38821,38822],{},"Adjustment for Windfalls and Unforeseen Events: At the first indication of a sale that was not forecast or that unexpectedly and substantially exceeds the Salesperson’s forecast (hereinafter referred to as a “windfall”), but no later than the end of the Plan Term, sales management, in its sole discretion, will evaluate whether an unreasonable commission will result to a Salesperson under the current compensation plan from the particular sale.",[19,38824,38825],{},"In order for a sale to not be considered a windfall, it must meet the following requirements:",[504,38827,38828,38831,38834,38837],{},[147,38829,38830],{},"It must be forecasted in the Company CRM system.",[147,38832,38833],{},"Size must be reasonably represented (within 60% of the final amount).",[147,38835,38836],{},"It must be specified as a channel or channel originated sale if a partner is involved.",[147,38838,38839,38840,38842],{},"A sale of $400,000 or less will not be considered a windfall.",[9379,38841],{},"If a sale is considered a windfall, sales management will communicate with the Salesperson about making, and may thereafter make, an equitable adjustment to the commission.  Such an equitable adjustment will be made no later than 30 days after the end of the Plan Term. If in sales management’s discretion a change to the sales employee’s individual compensation plan is warranted to avoid this or additional windfall events, a new compensation plan will be issued. In no event will such an adjustment be made after the commission is Earned, as defined above.",[14,38844,38846],{"id":38845},"_16-modification","16. Modification",[19,38848,38849],{},"Modification: The Company reserves the right to amend, supersede or terminate the Plan, in whole or in part, at any time as it deems fit in its sole discretion, with or without prior notice.   Any change shall be prospective in application and shall not cause a forfeiture of already earned Incentive Compensation.",[14,38851,38853],{"id":38852},"_17-at-will-employment","17. At-Will Employment",[19,38855,38856],{},"The Plan does not alter the at-will status of a Salesperson’s relationship with the Company or guarantee continued employment or employment for a specified term or period.  A Salesperson or the Company may terminate employment at any time, with or without cause or prior notice. This at-will employment relationship cannot be changed except in a writing by the CEO.",[14,38858,38860],{"id":38859},"_18-integration-governing-law-and-severability","18. Integration, Governing Law and Severability",[19,38862,38863],{},"The Plan, including Exhibit A, forms the complete and exclusive statement of the subject matter of sales incentive compensation.  The terms in the Plan supersede any other agreements or promises made to any Salesperson by anyone, whether written or oral, regarding sales incentive compensation.  The Plan will be governed by the laws of the State of California (with the exception of its conflict of laws provisions). The invalidity or unenforceability of any provision or provisions of this Plan will not affect the validity or enforceability of any other provision hereof, which will remain in full force and effect.",[14,38865,38867],{"id":38866},"_19-arbitration-of-disputes","19. Arbitration of Disputes",[19,38869,38870],{},"As set forth in the Confidentiality and Arbitration Agreement executed by Salesperson, Salesperson and the Company agree to submit to mandatory and binding arbitration any and all claims relating to Salesperson’s employment, including but not limited to claims arising out of or relating to this Plan.",[14,38872,38874],{"id":38873},"_20-section409a","20. Section 409A",[19,38876,38877],{},"It is intended that any Incentive Compensation and other payments and benefits under this Plan will be exempt from the requirements of Section 409A of the U.S. Internal Revenue Code of 1986, as amended and the regulations and guidance issued thereunder and any applicable state law equivalent (collectively, “Section 409A”), pursuant to the “short-term deferral” exception under Section 409A, and any ambiguities and\u002For ambiguous terms under the Plan will be interpreted to comply with the requirements of such exception or to otherwise comply with the requirements of Section 409A.  Each payment, installment and benefit under this Plan is intended to constitute a separate payment for purposes of Section 1.409A-2(b)(2) of the Treasury Regulations.  The Company may, in good faith and without the consent of any Plan participant, make any amendments to this Plan and take such reasonable actions which it deems necessary, appropriate or desirable to avoid imposition of any additional tax or income recognition under Section 409A prior to actual payment to any participant.  By executing this Plan and\u002For Exhibit A, each Salesperson acknowledges that the Company cannot and has not guaranteed that the IRS will determine that the Plan benefits are not deferred compensation within the meaning of Section 409A.  Each Salesperson agrees that if the Internal Revenue Service (“IRS”) determines that the Plan benefits are deferred compensation, the Salesperson shall be solely responsible for the Salesperson’s costs related to such a determination, if any.",[19,38879,38880],{},[423,38881,38882],{},"ACKNOWLEDGMENT",[19,38884,38885],{},"I acknowledge that I have read, understand, and agree to this FY 2026 SALES COMPENSATION PLAN.",[19,38887,38888],{},[2403,38889,38890],{},"Team members who are eligible for this commission plan will receive a docusign of this as part of their onboarding for signature.",[14,38892,38894],{"id":38893},"exhibit-a","Exhibit A",[19,38896,38897],{},[423,38898,38899],{},"Sales Representative (FSR)",[164,38901,38903],{"id":38902},"_1-effective-date","1. Effective Date",[19,38905,38906,38907,2040,38910,38913],{},"This Plan is effective through ",[2403,38908,38909],{},"start date",[2403,38911,38912],{},"end date"," is subject to the terms and conditions in the “FlowFuse FY 2026 Sales Compensation Plan”.",[164,38915,38917],{"id":38916},"_2-job-titlerole","2. Job Title\u002FRole",[19,38919,38920],{},"The Salesperson holds the job title\u002Frole of: Sales Representative",[164,38922,38924],{"id":38923},"_3-authorized-salesterritory","3. Authorized Sales\u002FTerritory",[19,38926,38927],{},"The Salesperson will be authorized to sell to any customer with an Annual Recurring Revenue in excess of $5,000 per year. The Salesperson recognizes that the Territory will be redistributed when additional Salespersons join the Company.",[164,38929,38931],{"id":38930},"_4-authorized-accounts","4. Authorized Accounts",[19,38933,38779],{},[164,38935,38937],{"id":38936},"_5-authorized-products-and-services","5. Authorized Products and Services",[19,38939,38940],{},"Salesperson is authorized to sell the following products and\u002For services, unless otherwise authorized by Salesperson’s manager:",[144,38942,38943,38946],{},[147,38944,38945],{},"FlowFuse Product Licenses",[147,38947,38948],{},"Professional Services",[164,38950,38952],{"id":38951},"_6-quota-credit","6. Quota Credit",[19,38954,38955],{},"Except as otherwise stated herein, quota credit will be based on the following:",[504,38957,38958,38961],{},[147,38959,38960],{},"Net new Annual Recurring Revenue (ARR) generated from New Business deals within the Salesperson’s authorized territory or accounts; plus",[147,38962,38963],{},"Five percent (5%) of any Non-Recurring Revenue (NRR) associated with the New Business transaction.",[19,38965,38966],{},"Quota credit for upsells and renewals will continue to be based on Incremental ARR only.",[164,38968,38970],{"id":38969},"_7-credit-for-partner-bookings","7. Credit For Partner Bookings",[19,38972,38973],{},"Bookings completed through partners will receive a 20% uplift in the value of the deal for commission purposes. For example, a $100,000 booking sold through a partner where the partner receives a 30% margin, the net value to FlowFuse would be $70,000. The deal would get a 20% uplift for commission credit purposes, the net deal amount for commission purposes would be 84,000.",[164,38975,38977],{"id":38976},"_8-commission-and-quota-credit","8. Commission and Quota Credit",[19,38979,38980],{},"Commission will be calculated based on the Commissionable Value of each Qualifying Sale, defined as:",[19,38982,38983],{},"Incremental ARR + 5% of Non-Recurring Revenue",[19,38985,38986],{},"The Base Rate and Accelerated Rate listed in the table below apply directly to this Commissionable Value. All commissions are earned only upon recognition of a Qualifying Sale according to the terms of this Plan.",[19,38988,38989],{},"If a multi-year contract includes non-recurring components, only the ARR portion is recognized annually for quota credit and commission. The Non-Recurring Revenue component is recognized once at the time of booking, at the 5% rate defined above.",[910,38991,38992,39006],{},[913,38993,38994],{},[916,38995,38996,39000,39003],{},[919,38997,38999],{"align":38998},"center","Transaction Type",[919,39001,39002],{"align":38998},"Base Rate",[919,39004,39005],{},"Accelerated Rate",[930,39007,39008],{},[916,39009,39010,39013,39015],{},[935,39011,39012],{"align":38998},"All FlowFuse License Transactions",[935,39014],{"align":38998},[935,39016],{},[19,39018,39019],{},"Notes: Commissions will be paid on multi-year deals at the base rate according to the multi-year guidelines in sections 10 & 11.",[164,39021,39023],{"id":39022},"_9-quota","9. Quota",[19,39025,39026],{},"New net Annual Recurring Revenue (ARR) plus services sold on New Business deals Quota of $ for Q1 2026 through Q4 2026 assigned quarterly as follows:",[19,39028,39029,39030,39033,39034,39037,39038,39041,39042],{},"Q1\t$  ",[2403,39031,39032],{},"Quota Q1","\nQ2\t$  ",[2403,39035,39036],{},"Quota Q2","\nQ3\t$  ",[2403,39039,39040],{},"Quota Q3","\nQ4\t$  ",[2403,39043,39044],{},"Quota Q4",[164,39046,39048],{"id":39047},"_10-multi-year-bookings","10. Multi-year Bookings",[19,39050,39051],{},"For multi-year bookings that are paid in advance (i.e NET30 or agreed on payment terms for the full multi-year term), the Salesperson will receive 100% commission credit for the calculated value of the booking.",[164,39053,39055],{"id":39054},"_11-multi-year-bookings-with-committed-annual-payments","11. Multi-year Bookings with Committed Annual Payments",[19,39057,39058],{},"When a multi-year order is booked which includes non-cancellable annual payment terms, the Sales Representative will be paid a Booking Advance and quota and commission credit on the schedule noted below:",[19,39060,39061],{},[423,39062,39063],{},"Value Calculation of Orders with Annual Payments",[910,39065,39066,39079],{},[913,39067,39068],{},[916,39069,39070,39073,39076],{},[919,39071,39072],{"align":921},"Year",[919,39074,39075],{"align":38998},"Percentage of Order Commissionable",[919,39077,39078],{"align":38998},"Quota Credit",[930,39080,39081,39091,39102],{},[916,39082,39083,39086,39089],{},[935,39084,39085],{"align":921},"First year’s committed payment",[935,39087,39088],{"align":38998},"100%",[935,39090,39088],{"align":38998},[916,39092,39093,39096,39099],{},[935,39094,39095],{"align":921},"Year 2 value, with committed payment",[935,39097,39098],{"align":38998},"50%",[935,39100,39101],{"align":38998},"0%",[916,39103,39104,39107,39110],{},[935,39105,39106],{"align":921},"Year 3 value, with committed payment",[935,39108,39109],{"align":38998},"25%",[935,39111,39101],{"align":38998},[19,39113,39114,39117,39119],{},[423,39115,39116],{},"Multi-Year Payment Example:",[9379,39118],{},"\nA $300,000 booking with annual payments due equally at signing at year 1, 2 and 3 from signing would be paid commissions and receive quota credit as if it is $175,000 deal:",[910,39121,39122,39134],{},[913,39123,39124],{},[916,39125,39126,39129,39131],{},[919,39127,39128],{"align":921},"3 Year Booking for $300,000 \u000bPaid Annually in 3 Equal Payments",[919,39130,32373],{"align":921},[919,39132,39133],{"align":921},"Commission and Quota Amount",[930,39135,39136,39147,39158,39169,39179],{},[916,39137,39138,39141,39144],{},[935,39139,39140],{"align":921},"At Signing, Year 1:",[935,39142,39143],{"align":921},"$100,000 X 100% =",[935,39145,39146],{"align":921},"$100,000",[916,39148,39149,39152,39155],{},[935,39150,39151],{"align":921},"Year 2:",[935,39153,39154],{"align":921},"$100,000 X 50%   =",[935,39156,39157],{"align":921},"$50,000",[916,39159,39160,39163,39166],{},[935,39161,39162],{"align":921},"Year 3:",[935,39164,39165],{"align":921},"$100,000 X 25%   =",[935,39167,39168],{"align":921},"$25,000",[916,39170,39171,39174,39176],{},[935,39172,39173],{"align":921},"Total Commissionable Value",[935,39175],{"align":921},[935,39177,39178],{"align":921},"$175,000",[916,39180,39181,39184,39186],{},[935,39182,39183],{"align":921},"Total Quota Credit",[935,39185],{"align":921},[935,39187,39178],{"align":921},[164,39189,39191],{"id":39190},"_12-accelerated-commissions","12. Accelerated Commissions",[19,39193,39194],{},"Once Salesperson has achieved 100% of annual quota assignment, the Salesperson will be eligible for commissions at the accelerated rate as identified in the table outlined in section 8 for the remainder of the year.",[164,39196,39198],{"id":39197},"_13-annual-quota-bonus","13. Annual Quota Bonus",[19,39200,39201],{},"Once Salesperson has sold in excess of the assigned annual quota per section 9, Salesperson will be eligible for a bonus of $10,000.",[164,39203,39205],{"id":39204},"_14-200-attainment-bonus","14. 200% Attainment Bonus",[19,39207,39208],{},"Salesperson will receive 2 percentage points additional commission on all bookings for the year retroactive to [Month 2 of the quota] upon achieving 200% of the assigned annual quota.",[164,39210,39212],{"id":39211},"_15-modifications","15.  Modifications",[19,39214,39215],{},"Except as set forth above, the CEO must approve any changes to the terms of this Exhibit in writing.  By his or her signature below, the Employee recognizes and agrees that no compensation shall be considered earned until and unless all terms and conditions have been met and all calculations have been completed.",{"title":75,"searchDepth":76,"depth":76,"links":39217},[39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238],{"id":38517,"depth":76,"text":38518},{"id":38524,"depth":76,"text":38525},{"id":38641,"depth":76,"text":38642},{"id":38654,"depth":76,"text":38655},{"id":38674,"depth":76,"text":38675},{"id":38684,"depth":76,"text":38685},{"id":38694,"depth":76,"text":38695},{"id":38707,"depth":76,"text":38708},{"id":38714,"depth":76,"text":38715},{"id":38741,"depth":76,"text":38742},{"id":38775,"depth":76,"text":38776},{"id":38782,"depth":76,"text":38783},{"id":38789,"depth":76,"text":38790},{"id":38796,"depth":76,"text":38797},{"id":38806,"depth":76,"text":38807},{"id":38845,"depth":76,"text":38846},{"id":38852,"depth":76,"text":38853},{"id":38859,"depth":76,"text":38860},{"id":38866,"depth":76,"text":38867},{"id":38873,"depth":76,"text":38874},{"id":38893,"depth":76,"text":38894,"children":39239},[39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39252,39253,39254],{"id":38902,"depth":605,"text":38903},{"id":38916,"depth":605,"text":38917},{"id":38923,"depth":605,"text":38924},{"id":38930,"depth":605,"text":38931},{"id":38936,"depth":605,"text":38937},{"id":38951,"depth":605,"text":38952},{"id":38969,"depth":605,"text":38970},{"id":38976,"depth":605,"text":38977},{"id":39022,"depth":605,"text":39023},{"id":39047,"depth":605,"text":39048},{"id":39054,"depth":605,"text":39055},{"id":39190,"depth":605,"text":39191},{"id":39197,"depth":605,"text":39198},{"id":39204,"depth":605,"text":39205},{"id":39211,"depth":605,"text":39212},{},"\u002Fhandbook\u002Fsales\u002Fcommission-plan",{"title":38509,"description":75},"handbook\u002Fsales\u002Fcommission-plan\u002Findex","nt8p_lxv2UYeTRtcAttLrjf-HzRCREHGoUL4RCOtPOo",{"id":39261,"title":22442,"body":39262,"description":39269,"extension":81,"meta":39989,"navGroup":83,"navOrder":83,"navTitle":22442,"navigation":84,"path":39990,"seo":39991,"stem":39992,"__hash__":39993},"handbook\u002Fhandbook\u002Fsales\u002Fcustomer-success.md",{"type":7,"value":39263,"toc":39966},[39264,39267,39270,39274,39285,39288,39292,39295,39298,39341,39350,39353,39356,39365,39369,39406,39410,39413,39416,39459,39463,39493,39495,39498,39506,39510,39519,39522,39535,39539,39542,39600,39604,39607,39684,39691,39693,39695,39698,39705,39708,39717,39720,39723,39726,39729,39732,39735,39739,39746,39749,39752,39755,39791,39795,39798,39801,39808,39811,39816,39818,39822,39825,39830,39833,39850,39854,39857,39895,39899,39902,39905,39909,39935,39939,39947,39950],[10,39265,22442],{"id":39266},"customer-success",[19,39268,39269],{},"FlowFuse CSMs are to drive adoption and expansion within accounts. Customers\nshould be provided help and support to connect their assets, build applications\nfor their organisation, and automate workflows. To do so, a playbook is created\nto build one way we do things and have one asset to update with the learnings.\nThe purpose of this playbook is to ensure FlowFuse customers build applications\nto optimize their operations, thereby positioning FlowFuse as the platform over\ntraditional Manufacturing Execution Systems (MES) and Supervisory Control and\nData Acquisition (SCADA) systems. FlowFuse is focussed on\nfarming\u002Fgrowing\u002Fcultivation. We're a hunter organization at first, though, the\nmarket currently accepts our product mostly through internal growth.",[14,39271,39273],{"id":39272},"engagement-and-responsibilities","Engagement and Responsibilities",[19,39275,39276,39277,39280,39281,39284],{},"CSM should be involved as soon as account executives ",[423,39278,39279],{},"commit to a deal",". This\nis before a deal closes and is signed. From the moment an AE commits to a deal\nonboarding starts for CSM. To understand what their high-level goals are with\nour product, and what the company as vendor can provide soon to a new customer.\nThe AE will\n",[46,39282,39283],{"href":30745},"close the deal",", at which\npoint CSM takes over.",[19,39286,39287],{},"Onwards, CSM is responsible for the full customer lifecycle, from establishing\nonboarding progress and completing this process, managing and tracking what's\nbeing built on our platform and the strategic significance, and ensuring\ninspiration to build new things right after. Throughout having customers achieve\nvalue and Return on Investment (ROI), cultivating internal champions, and\ndriving strategic expansion (horizontal and vertical). CSMs are also the primary\nFlowFuse contact that can establish and accelerate the pace of replacing or\naugmenting legacy MES\u002FSCADA systems with our product. In turn resulting in\nhigher net revenue retention (NRR) rates, and the development of strong customer\nadvocacy that will further fuel FlowFuse's growth.",[14,39289,39291],{"id":39290},"customer-success-methodology","Customer Success Methodology",[19,39293,39294],{},"The basic principal of CS is to help customers succeed in their goals by getting\nvalue from our services. The assumption is, where customers get value they are\nlikely to consciously recognize that value, be open to gaining more value, and\nrecommending FlowFuse to potential customers. This should in turn result in\ncustomers remaining with FlowFuse for longer, delivering greater revenue, and\nencouraging more of their professional and personal networks to join FlowFuse.",[19,39296,39297],{},"FlowFuse has a diverse customer-base. When devising a strategy to deliver CS it\nis important to recognise the key cohorts within our customers. They are grouped\nas follows:",[910,39299,39300,39310],{},[913,39301,39302],{},[916,39303,39304,39307],{},[919,39305,39306],{},"Cohort",[919,39308,39309],{},"Key Traits",[930,39311,39312,39320,39327,39334],{},[916,39313,39314,39317],{},[935,39315,39316],{},"Trial",[935,39318,39319],{},"Not paying for services",[916,39321,39322,39324],{},[935,39323,16818],{},[935,39325,39326],{},"Low number of Node-RED instances",[916,39328,39329,39331],{},[935,39330,16855],{},[935,39332,39333],{},"Smaller applications, collaboration on applications",[916,39335,39336,39338],{},[935,39337,16892],{},[935,39339,39340],{},"Large scale applications, extensive use of FlowFuse's features",[19,39342,39343,39344,39349],{},"You can view our current customer-base and their cohorts in\n",[46,39345,39348],{"href":39346,"rel":39347},"https:\u002F\u002Fmain.flowforge.cloud\u002Fui\u002F#!\u002F7?socketid=reLw4efoWf45RfOsAACH",[108],"this report","{rel=\"nofollow}.",[19,39351,39352],{},"CS activity is planned to manage each of the cohorts with appropriate support &\ncommunications. The support and communications will be in some cases fully\nautomated and in others will involve individual actions by our CS team, such as\nholding regular review meetings with customers.",[19,39354,39355],{},"The key goal of CS is to migrate customers from the trial status, down the table\nof cohorts above, and where appropriate onto being an Enterprise customer. It is\nhowever important to consider that some customers would not benefit from our\nbroadest offerings of services. Appropriate resources should be put into\ncustomers who have found lasting value further up the cohorts table.",[19,39357,39358,39359,39364],{},"To ensure a smooth onboarding experience and long-term success for our customers, we follow a structured ",[46,39360,39363],{"href":39361,"rel":39362},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1LqttB5AWueJfahdCciqloS4MSRhDZQRVHjla5xR4toU\u002Fedit?tab=t.0#heading=h.rwalcx5xuqez",[108],"Customer Success Playbook"," for our Pro and Enterprise customers. This playbook outlines key activities, engagement points, and best practices that guide our Customer Success team in supporting each customer’s goals throughout their journey with FlowFuse.",[14,39366,39368],{"id":39367},"playbooks","Playbooks",[144,39370,39371,39378,39385,39392,39399],{},[147,39372,39373],{},[46,39374,39377],{"href":39375,"rel":39376},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1yxO53QHwBChNAoERLlB0kGRCNdPJzzHV9X0aLZKX8HU\u002Fedit?tab=t.0",[108],"Onboarding Playbook",[147,39379,39380],{},[46,39381,39384],{"href":39382,"rel":39383},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1zdbhuljqM9AU5ok9Mq24xOiD7-YUHJunO3NNYLcdtZM\u002Fedit?tab=t.0",[108],"CS health score",[147,39386,39387],{},[46,39388,39391],{"href":39389,"rel":39390},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1jrtTNEFgiY3NTHMBMm67y2P1Pm3qeIsxy8mckOEg9s4\u002F",[108],"Churn Playbook",[147,39393,39394],{},[46,39395,39398],{"href":39396,"rel":39397},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1MPgtKuI3pSD5yIgWaSfywxP8YrqAdFjgmfLPB7V9sGE\u002Fedit?tab=t.0",[108],"Expansion & Growth",[147,39400,39401],{},[46,39402,39405],{"href":39403,"rel":39404},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1_s9JW-cD9yuRKS1Ztcc29wtxGIrdmhKjwZyoDIkkMRE\u002Fedit?tab=t.5xzj4a2p6zxn",[108],"Meeting structures",[14,39407,39409],{"id":39408},"customer-success-tools","Customer Success Tools",[164,39411,39412],{"id":31003},"Data Sources",[19,39414,39415],{},"To drive CS, we need to utilise data across various platforms to understand what\nour customers need from us to succeed. the main platforms we use are as follows:",[910,39417,39418,39427],{},[913,39419,39420],{},[916,39421,39422,39424],{},[919,39423,7812],{},[919,39425,39426],{},"Key Data",[930,39428,39429,39437,39445,39452],{},[916,39430,39431,39434],{},[935,39432,39433],{},"FlowFuse Cloud's Database",[935,39435,39436],{},"Current usage of the platform and uptake of features",[916,39438,39439,39442],{},[935,39440,39441],{},"Stripe",[935,39443,39444],{},"Expenditure",[916,39446,39447,39449],{},[935,39448,21508],{},[935,39450,39451],{},"Interaction with support and marketing content on our website and in emails",[916,39453,39454,39456],{},[935,39455,1047],{},[935,39457,39458],{},"Record of upcoming and shipped features",[164,39460,39462],{"id":39461},"useful-customer-data","Useful Customer Data",[144,39464,39465,39472,39479,39486],{},[147,39466,39467],{},[46,39468,39471],{"href":39469,"rel":39470},"https:\u002F\u002Fmain.flowforge.cloud\u002Fui\u002F#!\u002F0?socketid=LPUnOyHnjGM_GqrnAAAd",[108],"Team, User, Instances & Devices Growth",[147,39473,39474],{},[46,39475,39478],{"href":39476,"rel":39477},"https:\u002F\u002Fmain.flowforge.cloud\u002Fui\u002F#!\u002F1?socketid=LPUnOyHnjGM_GqrnAAAd",[108],"Customer Cohorts",[147,39480,39481],{},[46,39482,39485],{"href":39483,"rel":39484},"https:\u002F\u002Fmain.flowforge.cloud\u002Fui\u002F#!\u002F2?socketid=LPUnOyHnjGM_GqrnAAAd",[108],"Device Agent Adoption",[147,39487,39488],{},[46,39489,39492],{"href":39490,"rel":39491},"https:\u002F\u002Fmain.flowforge.cloud\u002Fui\u002F#!\u002F4?socketid=zuEy1h2ZhTjyhCnuAABB",[108],"User Audit Interactions",[164,39494,623],{"id":628},[19,39496,39497],{},"To deliver automated and manual communication with customers, we use HubSpot\nCRM. HubSpot allows us to collaborate as a team. This is vital when manually\ncommunicating with customers as well as operating automated email campaigns\nbased on a customer's current cohort and interaction with their account.",[19,39499,39500,39501,39349],{},"We have built an integration in Node-RED which can extract data from our\nplatforms then append it to a customer's record in HubSpot. The integration as\nwell as any other CS resources built in Node-RED are hosted on FlowFuse Cloud\nand can be\n",[46,39502,39505],{"href":39503,"rel":39504},"https:\u002F\u002Fmain.flowforge.cloud\u002F",[108],"accessed in this application",[14,39507,39509],{"id":39508},"shipped-feature-updates","Shipped Feature Updates",[19,39511,39512,39513,39518],{},"Customer success contacts FlowFuse customers and prospective customers (anyone we have had in a sales cycle who has requested a feature) when a requested feature is shipped. To facilitate this, there is a view in the Development board on GitHub called ",[46,39514,39517],{"href":39515,"rel":39516},"https:\u002F\u002Fgithub.com\u002Forgs\u002FFlowFuse\u002Fprojects\u002F1\u002Fviews\u002F61",[108],"\"CS View\"",". It filters to all issues marked Done by the Engineering team, and those with the label Sales Request or Customer Request. The Customer Success Manager will review this board upon each release and contact customers or prospects who requested a feature to inform them that it has shipped, and invite a conversation or feedback.",[19,39520,39521],{},"All team members are asked to identify customer and prospect requests in the following way:",[144,39523,39524,39527],{},[147,39525,39526],{},"On a GitHub issue, use the label Sales Request or Customer Request, as appropriate. (A request is a Sales Request when a member of the Sales team learns that a prospect is interested in a feature. It is a Customer Request when an existing customer makes a request. An issue can be both a Customer Request and a Sales Request.)",[147,39528,39529,39530,39534],{},"Customer-specific context (which deal or account the request is tied to) does not go on the public issue. Mention the request on the deal's representative issue inside FlowFuse\u002Fproduct, and if a public issue already exists for the same request, reference that existing one from the deal issue rather than opening a new one. See ",[46,39531,39533],{"href":39532},"\u002Fhandbook\u002Fsales\u002Fhubspot#deal-management","Deal Management",". Sales and Product share responsibility for maintaining this link, including for past requests, so any feature request can be traced back to the deals it pertains to.",[164,39536,39538],{"id":39537},"hubspot-properties","HubSpot Properties",[19,39540,39541],{},"For FlowFuse Cloud customers, we add various useful data to our CRM records to\nhelp us better understand who each customer is and how they are using FlowFuse.\nThey are as follows:",[910,39543,39544,39553],{},[913,39545,39546],{},[916,39547,39548,39551],{},[919,39549,39550],{},"Field name",[919,39552,15152],{},[930,39554,39555,39567,39580,39592],{},[916,39556,39557,39560],{},[935,39558,39559],{},"FFC-Tier",[935,39561,39562,39563,549],{},"This links each contact on HubSpot to the tier their team is currently associated with. Where a contact is in more than one team with different tiers we will show the tier which is expected to deliver the highest ARR. You can view the current contacts by tier in ",[46,39564,39348],{"href":39565,"rel":39566},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Freports-list\u002F26586079\u002F182668969\u002F",[108],[916,39568,39569,39572],{},[935,39570,39571],{},"FFC-Actions",[935,39573,39574,39575,39579],{},"This shows actions which have been taken by someone on a team this contact is on. To see a full list of available actions view ",[46,39576,39348],{"href":39577,"rel":39578},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Freports-list\u002F26586079\u002F182831966\u002F",[108]," in HubSpot",[916,39581,39582,39585],{},[935,39583,39584],{},"FFC-Usage",[935,39586,39587,39588,549],{},"This field shows a contact's answer to how they are planning to use FlowFuse Cloud, you can view the options and current data on ",[46,39589,39348],{"href":39590,"rel":39591},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Freports-list\u002F26586079\u002F182851924\u002F",[108],[916,39593,39594,39597],{},[935,39595,39596],{},"FFC-Events (deprecated)",[935,39598,39599],{},"This legacy field showed email campaigns which had been triggered to be sent to each contact. For example, after 24 hours if a user had not used out snapshots feature the integration between FlowFuse Cloud and HubSpot would add the relevant tag to this user. HubSpot would in turn send the email to the contact. This way of working is being replaced by FFC-Actions as that field can triggered email campaigns based on action or inaction as well as adding value to our CRM.",[14,39601,39603],{"id":39602},"inbound-support","Inbound Support",[19,39605,39606],{},"For FlowFuse customers, there are two ways to get support, through support\ntickets or go to the community forum. Where to go when is described below.",[910,39608,39609,39619],{},[913,39610,39611],{},[916,39612,39613,39616],{},[919,39614,39615],{},"Topic",[919,39617,39618],{},"Support venue",[930,39620,39621,39631,39640,39652,39664,39674],{},[916,39622,39623,39625],{},[935,39624,17600],{},[935,39626,39627],{},[46,39628,39630],{"href":39629},"..\u002F..\u002Fsupport\u002F","Support ticket",[916,39632,39633,39636],{},[935,39634,39635],{},"FlowFuse Application",[935,39637,39638],{},[46,39639,39630],{"href":39629},[916,39641,39642,39645],{},[935,39643,39644],{},"FlowFuse Feature Requests",[935,39646,39647],{},[46,39648,39651],{"href":39649,"rel":39650},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fflowfuse\u002Fissues",[108],"FlowFuse repository",[916,39653,39654,39657],{},[935,39655,39656],{},"Node-RED Application",[935,39658,39659],{},[46,39660,39663],{"href":39661,"rel":39662},"https:\u002F\u002Fdiscourse.nodered.org\u002Fc\u002Fvendors\u002Fflowfuse\u002F24",[108],"Community Forum",[916,39665,39666,39669],{},[935,39667,39668],{},"Node-RED flows",[935,39670,39671],{},[46,39672,39663],{"href":39661,"rel":39673},[108],[916,39675,39676,39679],{},[935,39677,39678],{},"Custom nodes",[935,39680,39681],{},[46,39682,39663],{"href":39661,"rel":39683},[108],[19,39685,39686,39687,549],{},"If you're not a FlowFuse customer, or in your trial phase, please go to the\n",[46,39688,39690],{"href":39661,"rel":39689},[108],"community forum",[164,39692,14798],{"id":14797},[239,39694,21508],{"id":21507},[19,39696,39697],{},"We use HubSpot to manage our customer support tickets for the managed FlowFuse\nplatform. We can give each FlowFuse team member access to HubSpot by assigning\nthem a seat.",[19,39699,39700,39701,39704],{},"If you wish to be granted access to HubSpot please post in the FlowFuse\n",[46,39702,21449],{"href":21311,"rel":39703},[108],"\nSlack channel.",[19,39706,39707],{},"Whenever a customer raises a new ticket, a message is posted into slack\n#support-tickets.",[19,39709,39710,39711,39716],{},"This will allow the whole team visibility of a new ticket, to reply to a ticket\nwe need to use the Help\n",[46,39712,39715],{"href":39713,"rel":39714},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Fhelp-desk\u002F26586079\u002Fview\u002F233410279\u002Flist-view",[108],"Desk UI in HubSpot",".\nOnce you reply to a ticket (if nobody in our team has already replied) you will\nbe assigned as a ticket owner. Once you are a ticket owner you will get alerts\nvia the HubSpot Slack app each time a customer replies. You are the only person\nwho gets these alerts so it's important you deal with them in a timely manner.\nYou can assign the ticket to someone you feel is a more appropriate owner using\nthe HubSpot interface in the top right corner of the help desk. You may want to\nassign a ticket to a team member if you are out of office due to holidays, time\nzones etc so that the customer continues to get the support they need.",[19,39718,39719],{},"When replying to a ticket, you can either send a message to a customer via live\nchat or an email. Please ensure you check if the customer is still online before\nusing live chat, that can be checked by looking for a green circle next to their\navatar on each post. If you don't see the green circle you should switch to\nemailing the customer.",[19,39721,39722],{},"You can also add comments to a ticket which will only be visible to our team.\nThis is a great place to add more context for other team members and ask for\nhelp. You can send an alert to a team member by adding @teammembername to your\ncomments.",[19,39724,39725],{},"When replying to the ticket one should have the intent to always reply with\nlinks to FlowFuse articles or documentation. If these resources are missing,\nplease start or update where applicable.",[19,39727,39728],{},"Where a conversation needs to happen with regards to a ticket between FlowFuse\nteam members, we should use the comments feature in the ticket rather than\nhaving a parallel conversation in Slack. This allows anyone who wants to help\nwith the ticket can see all relevant information in one place.",[19,39730,39731],{},"Where you can help by replying to a customer you should do so rather than asking\nthe ticket owner to relay messages. Working this way saves time, reduces the\nchance of the wrong information being passed to the customer, and shows that our\nwider team is invested in tickets which should have a positive impact on\ncustomer satisfaction.",[19,39733,39734],{},"When a ticket is assigned to you please monitor it for a conclusion. If it's\nunclear to you if the customer's request was satisfied please ask the customer\nto confirm they don't need any further help. Once the customer doesn't need any\nmore help on the ticket please close it using the info bar on the right side of\nthe ticket inbox. Look for the 'Ticket status' section and change the drop down\nto closed.",[239,39736,39738],{"id":39737},"scope-of-support","Scope of Support",[19,39740,39741,39742,549],{},"FlowFuse customers will only get support for issues relating to the FlowFuse\napplication or their account & billing. Any questions around Node-RED itself or\ntheir flows should be redirected to the\n",[46,39743,39745],{"href":39661,"rel":39744},[108],"FlowFuse Community forum",[19,39747,39748],{},"3rd party nodes are not supported at this time. It is reasonable to point a\ncustomer direct to a repo for a 3rd party node question.",[239,39750,21324],{"id":39751},"sla",[19,39753,39754],{},"Support availability and response times are defined by the customer’s subscription level:",[144,39756,39757,39776],{},[147,39758,39759,39760],{},"Pro (Standard Support)",[144,39761,39762,39765,39768],{},[147,39763,39764],{},"Support available 24 × 5 (Monday to Friday, UTC-2 timezone)",[147,39766,39767],{},"First Response SLA: Next business day (within 24 hours)",[147,39769,39770,39771],{},"Support tickets can be submitted at ",[46,39772,39775],{"href":39773,"rel":39774},"https:\u002F\u002Fflowfuse.com\u002Fsupport\u002F",[108],"our Support Form",[147,39777,39778,39779],{},"Enterprise (Enterprise Support)",[144,39780,39781,39783,39786],{},[147,39782,39764],{},[147,39784,39785],{},"First Response SLA: 4 hours",[147,39787,39770,39788],{},[46,39789,39773],{"href":39773,"rel":39790},[108],[239,39792,39794],{"id":39793},"escalation","Escalation",[19,39796,39797],{},"Where the issue relates to a bug in the FlowFuse application then the person\ndealing with the ticket should aim to reproduce that bug and then raise an\nappropriate issue in GitHub, The issue should reference the support ticket but\nnot mention the customer by name. Once raised the issue URL should be added to\nthe ticket and shared with the customer for visibility. The ticket should not be\nclosed until the bug is resolved.",[14,39799,39663],{"id":39800},"community-forum",[19,39802,39803,39804,39807],{},"As the Node-RED forums are intended to be vendor neutral, FlowFuse has a\n",[46,39805,39690],{"href":39661,"rel":39806},[108]," too.",[239,39809,39738],{"id":39810},"scope-of-support-1",[19,39812,39741,39813,549],{},[46,39814,39745],{"href":39661,"rel":39815},[108],[19,39817,39748],{},[14,39819,39821],{"id":39820},"quarterly-business-review","Quarterly Business Review",[19,39823,39824],{},"For all customers that are over $10k ARR, or are manually nominated because of\ntheir growth potential to the company, a quarterly business review is offered to\nthem and scheduled. FlowFuse offers these meetings each quarterly, hence the\nname Quarterly Business Review (QBR). By meeting, FlowFuse can understand,\npro-actively, how the customer is progressing with their adoption.",[19,39826,39827,39828,549],{},"Record customer calls using Fathom per the ",[46,39829,720],{"href":719},[19,39831,39832],{},"For each meeting, the goals are:",[504,39834,39835,39838,39841,39844,39847],{},[147,39836,39837],{},"Relationship building -- By having a conversation instead of email, we hope\nthere's more space for in-depth discussion and candor in the conversation.",[147,39839,39840],{},"Assess Problem-Value alignment -- Understand if the problem the customer felt\nbefore buying FlowFuse has been mitigated, or what FlowFuse needs to do to\nfurther mitigate this.",[147,39842,39843],{},"Issue prevention -- By proactively reviewing progress, potential roadblocks\nor challenges can be identified and addressed early, preventing customer\ndissatisfaction or churn.",[147,39845,39846],{},"Broader feature adoption -- Often customers are paying for a package that\nincludes more value than they're currently extracting. Help the customer with\nadoption and getting more value from the product",[147,39848,39849],{},"Data collection -- Provide space and time for the customer to provide\nfeedback on the product and experience. Allow them to request feature ideas,\nor ask for bug fixes.",[14,39851,39853],{"id":39852},"procedure-for-handling-a-churned-customer","Procedure for Handling a Churned Customer",[19,39855,39856],{},"The Customer Success manager is responsible for executing the following steps\nwhen an annually-billed customer chooses not to renew their subscription:",[504,39858,39859,39871,39877,39883,39889],{},[147,39860,39861,39864,39865,39870],{},[423,39862,39863],{},"Update Contracted Customer Tracker"," Access the\n",[46,39866,39869],{"href":39867,"rel":39868},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1n99ROi49GHdmHjYivbwGlKYH28Qh-x0QZUrxiO9ppHg\u002Fedit?gid=0#gid=0",[108],"CS Customer tracking","\nand move the churned customer to the \"Churned\" tab. Add the churn date and the reason for churning.",[147,39872,39873,39876],{},[423,39874,39875],{},"Cancel Subscription in HubSpot"," Cancel the subscription on their account page in HubSpot, to ensure no further invoices are\nsent.",[147,39878,39879,39882],{},[423,39880,39881],{},"Close Opportunities in HubSpot"," In HubSpot, locate any open Growth and\nRenewal opportunities related to the churned customer. Move these\nopportunities to \"Closed Lost\" to reflect the customer's decision not to\nrenew.",[147,39884,39885,39888],{},[423,39886,39887],{},"Announce Churn in Slack"," Post an announcement in the Slack channel\n#dept-sales, summarizing the reasons for the churn. Encourage the team to ask\nquestions or suggest ways to learn from the situation.",[147,39890,39891,39894],{},[423,39892,39893],{},"Send Customer Acknowledgment and Learning Questions"," Send an\nacknowledgment email to the churned customer. Include any relevant questions\naimed at understanding their reasons for churn and gathering feedback for\ninternal improvement.",[14,39896,39898],{"id":39897},"notifying-customers-of-downtime-for-flowfuse-cloud-kubernetes-migrations","Notifying Customers of Downtime for FlowFuse Cloud Kubernetes Migrations",[19,39900,39901],{},"Occasionally, we need to restart customer instances of Node-RED on FlowFuse\nCloud to migrate them to a new server at AWS. To manage this, we inform\ncustomers in advance, giving them time to restart their instances. If they don’t\ndo so within that time, we’ll restart the instances for them. Sometimes, an\ninstance might not restart properly, so we need to ensure everything works\nsmoothly and notify the customer with instructions if any issues arise.",[19,39903,39904],{},"Our goal is to minimize the number of customers needing to restart their\ninstances and reduce how many we need to handle manually. Ideally, the migration\nshould happen without customers even noticing.",[164,39906,39908],{"id":39907},"steps","Steps",[504,39910,39911,39919,39927],{},[147,39912,39913,39916,39918],{},[423,39914,39915],{},"Set Up the New Server Early:",[9379,39917],{},"\nThe new server should be ready at least 90 days before the migration\ndeadline. This ensures any new instances or manual restarts automatically\nmove to the new server.",[147,39920,39921,39924,39926],{},[423,39922,39923],{},"Notify Customers 30 Days Before:",[9379,39925],{},"\nCreate a list of instances that need to be migrated 30 days before the\ndeadline. Send an email to each team, explaining which instances need to be\nrestarted. Make sure the email is clear, concise, and easy to follow.",[147,39928,39929,39932,39934],{},[423,39930,39931],{},"Review 7 Days Before Deadline:",[9379,39933],{},"\nA week before the deadline, review any remaining instances. If a customer is\nparticularly important or has many instances left to migrate, consider\nproviding personalized help to ensure a smooth process.",[14,39936,39938],{"id":39937},"handling-requests-from-self-hosted-customers-to-enable-flowfuse-assistant","Handling Requests from Self-Hosted Customers to Enable FlowFuse Assistant",[19,39940,1375,39941,39946],{},[46,39942,39945],{"href":39943,"rel":39944},"https:\u002F\u002Fflowfuse.com\u002Fdocs\u002Fuser\u002Fexpert\u002F#flowfuse-assistant-plugin",[108],"FlowFuse Assistant"," is enabled by default for Cloud customers. Self-hosted customers can use it, too, but must request access through support.",[19,39948,39949],{},"When a customer requests access to the FlowFuse Assistant, do the following:",[504,39951,39952,39955,39958],{},[147,39953,39954],{},"Route the request to Engineering",[147,39956,39957],{},"Note in the customer's page on HubSpot that the customer is using the FlowFuse Assistant. This will enable Customer Success to discuss the feature with the customer and adds to our holistic understanding of the customer.",[147,39959,39960,39963,39965],{},[423,39961,39962],{},"Handle Final Restarts on Deadline Day:",[9379,39964],{},"\nOn the deadline day, go through the remaining instances and restart them.\nCheck that each one comes back online properly, and assist customers with any\nissues that come up.",{"title":75,"searchDepth":76,"depth":76,"links":39967},[39968,39969,39970,39971,39976,39979,39982,39983,39984,39985,39988],{"id":39272,"depth":76,"text":39273},{"id":39290,"depth":76,"text":39291},{"id":39367,"depth":76,"text":39368},{"id":39408,"depth":76,"text":39409,"children":39972},[39973,39974,39975],{"id":31003,"depth":605,"text":39412},{"id":39461,"depth":605,"text":39462},{"id":628,"depth":605,"text":623},{"id":39508,"depth":76,"text":39509,"children":39977},[39978],{"id":39537,"depth":605,"text":39538},{"id":39602,"depth":76,"text":39603,"children":39980},[39981],{"id":14797,"depth":605,"text":14798},{"id":39800,"depth":76,"text":39663},{"id":39820,"depth":76,"text":39821},{"id":39852,"depth":76,"text":39853},{"id":39897,"depth":76,"text":39898,"children":39986},[39987],{"id":39907,"depth":605,"text":39908},{"id":39937,"depth":76,"text":39938},{},"\u002Fhandbook\u002Fsales\u002Fcustomer-success",{"title":22442,"description":39269},"handbook\u002Fsales\u002Fcustomer-success","AtBFqioe-LZirB0UsqWbuY10hz4YRa_KYc0fcGums4M",{"id":39995,"title":39996,"body":39997,"description":40004,"extension":81,"meta":40022,"navGroup":40023,"navOrder":83,"navTitle":40024,"navigation":84,"path":40025,"seo":40026,"stem":40027,"__hash__":40028},"handbook\u002Fhandbook\u002Fsales\u002Fdashboard-v2.md","Self Hosted Dashboard v2 Multi User Plugin",{"type":7,"value":39998,"toc":40020},[39999,40002,40005,40013],[10,40000,39996],{"id":40001},"self-hosted-dashboard-v2-multi-user-plugin",[19,40003,40004],{},"The Dashboard v2 multi user plugin has been Open Sourced and can\nbe installed from the public Node-RED catalogue.",[19,40006,40007,40008],{},"The plugin source is on GitHub - ",[46,40009,40012],{"href":40010,"rel":40011},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002Fnode-red-dashboard-ff-auth",[108],"node-red-dashboard-ff-auth",[19,40014,40015,40016],{},"And the catalogue entry - ",[46,40017,40018],{"href":40018,"rel":40019},"https:\u002F\u002Fflows.nodered.org\u002Fnode\u002F@flowfuse\u002Fnode-red-dashboard-2-user-addon",[108],{"title":75,"searchDepth":76,"depth":76,"links":40021},[],{},"Customer department","Self Hosted Dashboard v2 Multi User","\u002Fhandbook\u002Fsales\u002Fdashboard-v2",{"title":39996,"description":40004},"handbook\u002Fsales\u002Fdashboard-v2","wpamnjQtJeyR3tsBh8KfiTvd6sm9KwPsnRGs02PaGwo",{"id":40030,"title":40031,"body":40032,"description":40450,"extension":81,"meta":40451,"navGroup":40452,"navOrder":83,"navTitle":40031,"navigation":84,"path":40453,"seo":40454,"stem":40455,"__hash__":40456},"handbook\u002Fhandbook\u002Fsales\u002Fedge-connect-process.md","Edge Connectivity Sales Process",{"type":7,"value":40033,"toc":40432},[40034,40037,40047,40052,40060,40065,40082,40089,40095,40098,40103,40120,40123,40131,40138,40143,40145,40149,40163,40166,40173,40178,40181,40185,40199,40202,40205,40221,40228,40233,40236,40240,40254,40257,40260,40267,40272,40275,40279,40296,40299,40306,40311,40314,40318,40332,40335,40342,40349,40354,40357,40361,40372,40391,40398,40408,40411,40415,40429],[10,40035,40031],{"id":40036},"edge-connectivity-sales-process",[19,40038,40039,40042,40043,40046],{},[423,40040,40041],{},"Owning function:"," Sales\n",[423,40044,40045],{},"Contributing functions:"," Solution Engineering, Customer Success, Professional Services",[19,40048,40049],{},[423,40050,40051],{},"Typical deal profile:",[144,40053,40054,40057],{},[147,40055,40056],{},"Duration: 3–6 months",[147,40058,40059],{},"Meetings: 6–10",[19,40061,40062],{},[423,40063,40064],{},"Deal Characteristics:",[144,40066,40067,40070,40073,40076,40079],{},[147,40068,40069],{},"6–12 stakeholders with distinct decision roles (operations, IT\u002FOT, engineering, leadership)",[147,40071,40072],{},"Organization-wide scope focused on standardizing how a class of problems is solved (often multi-site or platform-level)",[147,40074,40075],{},"Outcome-driven evaluation where the primary decision is whether to adopt and own an approach, not whether a tool works",[147,40077,40078],{},"High strategic and organizational impact, requiring explicit governance, ownership, and approval",[147,40080,40081],{},"Elevated perceived risk, with early involvement from procurement, legal, and security",[14,40083,40085,40088],{"id":40084},"meeting-1a-discovery-3045-min",[423,40086,40087],{},"Meeting 1a:"," Discovery (30–45 min)",[19,40090,40091,40094],{},[423,40092,40093],{},"Goal:"," Determine whether the customer has a meaningful, organization-level problem that warrants a standardized edge connectivity approach, and whether it is worth deeper technical and business evaluation.",[19,40096,40097],{},"Sales stage: 1-Discovery\nLifecycle stage: SQL\nForecast stage: Best case",[19,40099,40100],{},[423,40101,40102],{},"Agenda:",[144,40104,40105,40108,40111,40114,40117],{},[147,40106,40107],{},"Introductions & context (5 min)",[147,40109,40110],{},"Explore current state (Situation – 10–15 min)",[147,40112,40113],{},"Identify Pain – operational, cost, compliance risks (15–20 min)",[147,40115,40116],{},"Map stakeholders & decision-making process (5–10 min)",[147,40118,40119],{},"Confirm next step and schedule meeting (5 min)",[19,40121,40122],{},"Next Step: Schedule Impact Analysis \u002F Technical Deep Dive.",[19,40124,40125,40126],{},"Resource:\n",[46,40127,40130],{"href":40128,"rel":40129},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1rH1cYQqUg3HTt8a0_kKOWyaClvlAgVjXLmF0jqb3yqY\u002Fedit",[108],"Edge Connectivity Discovery Playbook",[14,40132,40134,40137],{"id":40133},"meeting-1b-impact-technical-deep-dive-4560-min",[423,40135,40136],{},"Meeting 1b:"," Impact \u002F Technical Deep Dive (45–60 min)",[19,40139,40140,40142],{},[423,40141,40093],{}," Validate that the identified problems have material operational and business impact, establish a credible business case, and confirm a time-bound trigger that justifies deeper evaluation and stakeholder involvement.",[19,40144,40097],{},[19,40146,40147],{},[423,40148,40102],{},[144,40150,40151,40154,40157,40160],{},[147,40152,40153],{},"Review problems identified in Discovery (5 min)",[147,40155,40156],{},"Technical landscape & integration points (20 min)",[147,40158,40159],{},"Quantify Impact (cost savings, uptime, compliance) (20 min)",[147,40161,40162],{},"Align on critical event\u002Ftimeline (5–10 min)",[19,40164,40165],{},"Next Step: Prepare tailored demo for champion.",[14,40167,40169,40172],{"id":40168},"meeting-2a-champion-demo-45-min",[423,40170,40171],{},"Meeting 2a:"," Champion Demo (45 min)",[19,40174,40175,40177],{},[423,40176,40093],{}," Equip the champion with a clear narrative and concrete evidence to confidently represent the Edge Connectivity approach internally and secure alignment for broader stakeholder evaluation.",[19,40179,40180],{},"Sales stage: 2-Diagnose\nLifecycle stage: SQO\nForecast stage: Forecast",[19,40182,40183],{},[423,40184,40102],{},[144,40186,40187,40190,40193,40196],{},[147,40188,40189],{},"Context: Discovery & Impact recap (5 min)",[147,40191,40192],{},"Tailored demo (25–30 min)",[147,40194,40195],{},"Business case validation (ROI, impact) (10 min)",[147,40197,40198],{},"Define next step: stakeholder workshop (5 min)",[19,40200,40201],{},"Next Step: Confirm the deal viability.",[19,40203,40204],{},"Resource:",[144,40206,40207,40214],{},[147,40208,40209],{},[46,40210,40213],{"href":40211,"rel":40212},"https:\u002F\u002Fdocs.google.com\u002Fpresentation\u002Fd\u002F1aK87jBFXP9ElvJz_b2U_sBmQqpqFD5ddCyjeuVVnnVs\u002Fedit",[108],"Sales Deck",[147,40215,40216],{},[46,40217,40220],{"href":40218,"rel":40219},"https:\u002F\u002Fflowfuse.com\u002Fhandbook\u002Fsales\u002Fmeetings\u002Fdemo\u002F",[108],"Sales Demo",[14,40222,40224,40227],{"id":40223},"meeting-2b-stakeholder-demo-workshop-6090-min",[423,40225,40226],{},"Meeting 2b:"," Stakeholder Demo \u002F Workshop (60–90 min)**",[19,40229,40230,40232],{},[423,40231,40093],{}," Align cross-functional stakeholders on the problem, proposed Edge Connectivity approach, and expected impact, while identifying and addressing risks or objections that must be resolved before committing to a PoC.",[19,40234,40235],{},"Sales stage: 2-Diagnose (possibly later)\nLifecycle stage: SQO\nForecast stage: Forecast",[19,40237,40238],{},[423,40239,40102],{},[144,40241,40242,40245,40248,40251],{},[147,40243,40244],{},"Executive alignment (5–10 min)",[147,40246,40247],{},"Demo for cross-functional team (30–40 min)",[147,40249,40250],{},"Objection handling & discussion (20–30 min)",[147,40252,40253],{},"Define next step: PoC alignment (10 min)",[19,40255,40256],{},"Deal Vialility Meeting Aka Demo Feedback Meeting.\nBefore this meeting - Discuss the commercial model with the deal desk\nGoal - Understand if the customer resonated with the demo and if there are still some outstanding questions.\nCapture feedback and if alignment is established, Evaluate budgets and sizing and anchor pricing",[19,40258,40259],{},"Next Step: PoC kickoff.",[14,40261,40263,40266],{"id":40262},"meeting-3-poc-kickoff-60-min",[423,40264,40265],{},"Meeting 3:"," PoC Kickoff (60 min)",[19,40268,40269,40271],{},[423,40270,40093],{}," Establish shared success criteria, ownership, and execution plan for the PoC in order to reduce delivery risk and enable a confident go\u002Fno-go decision.",[19,40273,40274],{},"Sales stage: 3-Solution\nLifecycle stage: SQO\nForecast stage: Forecast",[19,40276,40277],{},[423,40278,40102],{},[144,40280,40281,40284,40287,40290,40293],{},[147,40282,40283],{},"Review PoC objectives (10 min)",[147,40285,40286],{},"Setup & responsibilities (20–30 min)",[147,40288,40289],{},"Success metrics & measurement (15 min)",[147,40291,40292],{},"Confirm timeline & checkpoints (10 min)",[147,40294,40295],{},"Next Step: Schedule PoC review.",[19,40297,40298],{},"Resource:\nFlowFuse Enterprise POC Template",[14,40300,40302,40305],{"id":40301},"meeting-4-poc-review-4560-min",[423,40303,40304],{},"Meeting 4:"," PoC Review (45–60 min)",[19,40307,40308,40310],{},[423,40309,40093],{}," Confirm that the PoC has met agreed success criteria, validate solution fit and business impact, and establish readiness to proceed to a commercial proposal.",[19,40312,40313],{},"Sales Stage: 4-Validate\nLifecycle stage: SQO\nForecast stage: Forecast",[19,40315,40316],{},[423,40317,40102],{},[144,40319,40320,40323,40326,40329],{},[147,40321,40322],{},"Present PoC results (15–20 min)",[147,40324,40325],{},"Validate success criteria achieved (10–15 min)",[147,40327,40328],{},"Discuss ROI\u002Fbusiness case (10–15 min)",[147,40330,40331],{},"Confirm readiness to move to proposal (5–10 min)",[19,40333,40334],{},"Next Step: Proposal & pricing review.",[19,40336,40125,40337],{},[46,40338,40341],{"href":40339,"rel":40340},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F11XLqfBeIgaOMCuH4Er15lu9duwGh5qlnUWskHkV7aeM\u002Fedit",[108],"Enterprise pricing model",[14,40343,40345,40348],{"id":40344},"meeting-5-proposal-timeline-review-45-min",[423,40346,40347],{},"Meeting 5:"," Proposal & Timeline Review (45 min)",[19,40350,40351,40353],{},[423,40352,40093],{}," Confirm alignment on commercial terms, contractual structure, and implementation timeline in order to enable executive and procurement approval.",[19,40355,40356],{},"Sales Stage: 5-Commit\nLifecycle stage: SQO\nForecast stage: Commit",[19,40358,40359],{},[423,40360,40102],{},[144,40362,40363,40366,40369],{},[147,40364,40365],{},"Walkthrough proposal & pricing (20 min)",[147,40367,40368],{},"Contract terms discussion (15 min)",[147,40370,40371],{},"Timeline & implementation planning (10 min)",[19,40373,40374,40375,40379,40380,40385,40386,40390],{},"Next Step: Move into executive\u002Fprocurement review. If any non-standard pricing, discounts, or contract terms are on the table, submit a form through this ",[46,40376,2971],{"href":40377,"rel":40378},"https:\u002F\u002Fform.asana.com\u002F?k=hUrD0SJEka-BxHZ5qXAcxQ&d=1213818720452348",[108]," to create a task in the ",[46,40381,40384],{"href":40382,"rel":40383},"https:\u002F\u002Fapp.asana.com\u002Fread-only\u002FDeal-Desk\u002F1213818720452348\u002F35b84534fdbe0d38d02d16cf84565538\u002Flist",[108],"Deal Desk Asana project"," before this meeting — see the ",[46,40387,40389],{"href":40388},"\u002Fhandbook\u002Fsales\u002Fengagements\u002F#asana-deal-desk-tasks","Deal Desk process"," for what context to include.",[14,40392,40394,40397],{"id":40393},"meetings-6-executive-procurement-review-close-3045-min",[423,40395,40396],{},"Meeting(s) 6:"," Executive \u002F Procurement Review + Close (30–45 min)",[19,40399,40400,40402,40403,40407],{},[423,40401,40093],{}," Confirm executive and procurement approval by resolving any remaining commercial, legal, or risk considerations and authorizing contract execution. Ensure a ",[46,40404,40406],{"href":40382,"rel":40405},[108],"Deal Desk Asana task"," exists for any legal review or approval needed at this stage.",[19,40409,40410],{},"Sales Stage: 6-Closing\nLifecycle stage: SQO\nForecast stage: Commit",[19,40412,40413],{},[423,40414,40102],{},[144,40416,40417,40420,40423,40426],{},[147,40418,40419],{},"Final review of solution & ROI (10 min)",[147,40421,40422],{},"Address objections & confirm approvals (10–15 min)",[147,40424,40425],{},"Contract\u002Flegal\u002Fprocurement finalization (10 min)",[147,40427,40428],{},"Obtain decision-maker commitment (5 min)",[19,40430,40431],{},"Next Step: Transition to implementation.",{"title":75,"searchDepth":76,"depth":76,"links":40433},[40434,40436,40438,40440,40442,40444,40446,40448],{"id":40084,"depth":76,"text":40435},"Meeting 1a: Discovery (30–45 min)",{"id":40133,"depth":76,"text":40437},"Meeting 1b: Impact \u002F Technical Deep Dive (45–60 min)",{"id":40168,"depth":76,"text":40439},"Meeting 2a: Champion Demo (45 min)",{"id":40223,"depth":76,"text":40441},"Meeting 2b: Stakeholder Demo \u002F Workshop (60–90 min)**",{"id":40262,"depth":76,"text":40443},"Meeting 3: PoC Kickoff (60 min)",{"id":40301,"depth":76,"text":40445},"Meeting 4: PoC Review (45–60 min)",{"id":40344,"depth":76,"text":40447},"Meeting 5: Proposal & Timeline Review (45 min)",{"id":40393,"depth":76,"text":40449},"Meeting(s) 6: Executive \u002F Procurement Review + Close (30–45 min)","Owning function: Sales\nContributing functions: Solution Engineering, Customer Success, Professional Services",{},"Sales department","\u002Fhandbook\u002Fsales\u002Fedge-connect-process",{"title":40031,"description":40450},"handbook\u002Fsales\u002Fedge-connect-process","Olj_wPAxRgOihs0vzRCx6DjI_wIOREzv-CH_UdkLkF4",{"id":40458,"title":40459,"body":40460,"description":41475,"extension":81,"meta":41476,"navGroup":83,"navOrder":83,"navTitle":41477,"navigation":84,"path":41478,"seo":41479,"stem":41480,"__hash__":41481},"handbook\u002Fhandbook\u002Fsales\u002Fengagements.md","Engagements",{"type":7,"value":40461,"toc":41460},[40462,40465,40479,40483,40491,40494,40510,40514,40517,40521,40524,40581,40589,40593,40596,40648,40652,40655,40674,40677,40681,40789,40793,40889,40899,40903,40906,40910,40928,40931,40969,40972,40976,40980,40987,41111,41115,41118,41299,41303,41314,41458],[10,40463,40459],{"id":40464},"engagements",[19,40466,40467,40468,40472,40473,40478],{},"Pricing is publicly available at ",[46,40469,40471],{"href":40470},"\u002Fpricing\u002F","our pricing page",". When discussing\npricing with enterprise customers, make a copy of\n",[46,40474,40477],{"href":40475,"rel":40476},"https:\u002F\u002Fdocs.google.com\u002Fpresentation\u002Fd\u002F1kaW6aZxpnCaVuQVdVsi0RTulhRMbeqglhZHkzSP-2kM\u002F",[108],"our internal pricing template deck","\nto discuss.",[14,40480,40482],{"id":40481},"creating-a-deal","Creating a Deal",[19,40484,40485,40486,549],{},"A deal is opened when an opportunity has achieved the Sales and Buyer Verifiers for a given ",[46,40487,40490],{"href":40488,"rel":40489},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1WKz_ll6bLxkkRlZ4K94Va1laGksHXleo8Pnv0aB08lU\u002F",[108],"Sales Stage",[19,40492,40493],{},"To open a deal, be sure to set the correct properties.",[504,40495,40496],{},[147,40497,40498,40499],{},"Deal Type\n",[144,40500,40501,40504,40507],{},[147,40502,40503],{},"New Business - For new customers or departments",[147,40505,40506],{},"Expansions - Upsells that are to be booked in-term",[147,40508,40509],{},"Renewal - Changes to the subscription effective on renewal date",[14,40511,40513],{"id":40512},"generating-a-quote","Generating a Quote",[19,40515,40516],{},"Clearly written, easy to understand quotes are crucial for customers to\nunderstand what they are purchasing and how much it costs. To create a quote,\ncombine the (1) product plan and (2) other purchased items according to the\nfollowing guide.",[164,40518,40520],{"id":40519},"what-to-quote","What to Quote",[19,40522,40523],{},"When preparing a quote, include both the plan and any extras that go beyond what\ncomes with the plan at the designated tier. Include a note in the Terms section\nthat indicates what comes with the plan. (This will be pre-filled when using one\nof the HubSpot quote templates). The product plan will be listed as its own\nline, with a quantity of 1, and the minimum purchase price for that plan. The\nadd-on options should also be added to the product section, as referenced by the\npurchase term template.",[910,40525,40526,40542],{},[913,40527,40528],{},[916,40529,40530,40533,40536,40539],{},[919,40531,40532],{},"Item & Description",[919,40534,40535],{},"Quantity",[919,40537,40538],{},"Unit Price",[919,40540,40541],{},"Total",[930,40543,40544,40558,40570],{},[916,40545,40546,40549,40552,40555],{},[935,40547,40548],{},"FlowFuse Enterprise Platform - Cloud",[935,40550,40551],{},"1",[935,40553,40554],{},"$X,000\u002Fyear",[935,40556,40557],{},"$X,000",[916,40559,40560,40563,40566,40568],{},[935,40561,40562],{},"Enterprise - Instance Add-On",[935,40564,40565],{},"10",[935,40567,40554],{},[935,40569,40557],{},[916,40571,40572,40575,40577,40579],{},[935,40573,40574],{},"Enterprise - Remote Device Add-On",[935,40576,40565],{},[935,40578,40557],{},[935,40580,40557],{},[19,40582,40583,40584,40586,40588],{},"Annual Subtotal\t $XX,000",[9379,40585],{},[423,40587,40541],{}," $XX,000",[164,40590,40592],{"id":40591},"creating-a-quote","Creating a Quote",[19,40594,40595],{},"Follow these steps to create a quote.",[504,40597,40598,40606,40609,40612,40639,40642,40645],{},[147,40599,40600,40601],{},"In HubSpot, open the relevant Deal. In the Quotes area, click Add to begin a\nnew quote.\n",[144,40602,40603],{},[147,40604,40605],{},"Ensure the Deal Type is set up, \"Expension\" is an in-term upsel",[147,40607,40608],{},"Fill in the Buyer Information section. This will pre-fill with the\ninformation from the contact in the Deal.",[147,40610,40611],{},"The default Quote creator will be you. Change this if necessary.",[147,40613,40614,40615,40619],{},"Add Line Items per\n",[46,40616,40618],{"href":40617},"\u002Fhandbook\u002Fsales\u002Fengagements\u002F#what-to-quote","the instructions",[144,40620,40621,40624,40633,40636],{},[147,40622,40623],{},"Select the appropriate Plan that is being quoted",[147,40625,40626,40627,40629,40630],{},"For each line item, except Professional Services, check the Billing\nfrequency to ",[542,40628,29137],{}," and if the terms *",[2562,40631,40632],{},"ensure automatic renewal",[147,40634,40635],{},"Adjust fields for Term and discount\u002Ffee\u002Ftax as needed.",[147,40637,40638],{},"Add Add-on line items for purchases that exceed features that are included\nwith the Plan.",[147,40640,40641],{},"Set Signature and Payment settings as needed. Ensure a countersignature is\nrequired from either the CEO or Head of GTM.",[147,40643,40644],{},"In the Template and Details section, choose the appropriate Quote Template\nfrom the dropdown menu. Choosing the correct Quote Template is important\nbecause it will pre-fill the correct plan features onto the quote. You can\ninclude additional Comments to Buyer or Purchase Terms here. They will not\noverwrite the Terms and Comments included with the Quote Template.",[147,40646,40647],{},"Review your Quote, and when everything is correct, click Create to create the\nquote attached to the relevant Deal.",[14,40649,40651],{"id":40650},"closing-a-deal","Closing a deal",[19,40653,40654],{},"A deal is considered closed when all the outlined steps below are completed.\nStarting the closing process can commence when the customer has legally\ncommitted to purchase our products or services. This commitment must be\nevidenced by one of the following:",[144,40656,40657,40663,40669],{},[147,40658,40659,40662],{},[423,40660,40661],{},"Receipt of a Customer Purchase Order (PO)",": A document issued by the\ncustomer, authorizing the purchase of specified goods or services at a\nspecified price.",[147,40664,40665,40668],{},[423,40666,40667],{},"Signed Company Quote",": A formal, written quotation provided by our company,\nwhich has been duly signed, indicating their acceptance of the terms and\nconditions outlined therein.",[147,40670,40671,40673],{},[423,40672,11368],{},": In the event a customer does not return a signed Company Quote,\nthe PO must include the Company Quote Reference Number found in the upper\nright corner of the Company Quote (e.g. Reference: 20250820-153746396)",[19,40675,40676],{},"Important Note: Verbal agreements, informal emails, or other non-binding\nexpressions of interest do not constitute a closed deal. The legal commitment,\nas evidenced by a PO or signed quote, is the sole determinant.",[164,40678,40680],{"id":40679},"steps-for-the-ae-to-complete","Steps for the AE to complete",[504,40682,40683,40738,40758,40766,40773],{},[147,40684,40685,40686,40689,40690],{},"Verify, again, if the quote has all the right properties set according to\n",[46,40687,40513],{"href":40688},"#generating-a-quote"," instructions.\n",[144,40691,40692,40703,40735],{},[147,40693,40694,40695],{},"Verify the Deal amount is set correctly based on Deal Type:\n",[144,40696,40697,40700],{},[147,40698,40699],{},"New Business: ACV (Annual Contract Value)",[147,40701,40702],{},"Expansions\u002FRenewals: Incremental ARR",[147,40704,40705,40706],{},"On the HubSpot Deal view, check and update:\n",[144,40707,40708,40711,40714,40717,40720,40723,40726],{},[147,40709,40710],{},"Hosting Environment",[147,40712,40713],{},"Contract Start Date",[147,40715,40716],{},"Company address",[147,40718,40719],{},"Renewal Date",[147,40721,40722],{},"Use Case",[147,40724,40725],{},"Spiced",[147,40727,40728,40729],{},"Amount in USD based on Deal Type:\n",[144,40730,40731,40733],{},[147,40732,40699],{},[147,40734,40702],{},[147,40736,40737],{},"Under contract management; check the box for MSA if a custom subscription\nagreement is agreed upon.",[147,40739,40740,40741],{},"Upload the documents to the Google Drive in the correct directory\n",[144,40742,40743,40750],{},[147,40744,40745],{},[46,40746,40749],{"href":40747,"rel":40748},"https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Ffolders\u002F1Nb3UqFiE56ymgQnyfkDKHMAe6L3akNzQ",[108],"Signed quotes and P.O.'s",[147,40751,40752,40753],{},"If negotiated custom, the\n",[46,40754,40757],{"href":40755,"rel":40756},"https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Ffolders\u002F1h6jBvkJ2oDrBL7jw751RfAzBKkkprKDc",[108],"Subscription agreement",[147,40759,40760,40761],{},"Send an email to the customer and the assigned CSM to make the introduction.\n",[144,40762,40763],{},[147,40764,40765],{},"Also verify if a P.O. number is known for them internally, to put on the\ninvoice",[147,40767,40768,40769,40772],{},"Move the deal to ",[542,40770,40771],{},"Closing"," in HubSpots Deal overview, update the close date\nto when the customer committed to purchasing.",[147,40774,40775,40776],{},"Send the CSM a direct message on slack with the following information:\n",[144,40777,40778,40780,40783,40786],{},[147,40779,14260],{},[147,40781,40782],{},"Key Champion",[147,40784,40785],{},"Billing Contact",[147,40787,40788],{},"Trial\u002FPoV History: Please specify if they had an active Trial or Proof of Value (PoV) running prior to signing the annual contract.",[164,40790,40792],{"id":40791},"steps-for-the-csm-to-complete","Steps for the CSM to complete",[504,40794,40795,40812,40819,40822,40872,40875,40878,40883,40886],{},[147,40796,40797,40798],{},"Check the signed quote for:\n",[144,40799,40800,40803,40806,40809],{},[147,40801,40802],{},"Start date",[147,40804,40805],{},"Renewal date",[147,40807,40808],{},"Are line items recurring, or not?",[147,40810,40811],{},"Is an MSA agreed upon, and stored in the Google Drive?",[147,40813,40814,40815],{},"Create the\n",[46,40816,40818],{"href":40817},"\u002Fhandbook\u002Foperations\u002Fbilling\u002F#creating-a-subscription","subscription",[147,40820,40821],{},"If the signed quote is either an upsell or renewal, update the subscription with the line items and new pricing.",[147,40823,40824,40825],{},"Provide access to the agreed upon line items\n",[144,40826,40827,40850],{},[147,40828,40829,40832],{},[2562,40830,40831],{},"Cloud",[144,40833,40834,40837,40844,40847],{},[147,40835,40836],{},"Set up a team on FlowFuse Cloud for the customer in the right tier",[147,40838,40839,40840],{},"Set the customer team to\n",[46,40841,40843],{"href":40842},"\u002Fhandbook\u002Foperations\u002Faccounts\u002F#internal-teams-and-contracted-revenue","enter manual billing mode",[147,40845,40846],{},"Invite customer as owner to the team",[147,40848,40849],{},"Remove own email adress after sign up customer",[147,40851,40852,40855],{},[2562,40853,40854],{},"Self-Managed",[144,40856,40857,40864],{},[147,40858,40859,40860],{},"Generate a ",[46,40861,40863],{"href":40862},"\u002Fhandbook\u002Fsales\u002Fmeetings\u002Fpoc#generating-a-license","license key",[147,40865,40866,40867,549],{},"Send the license key with the onboarding email to the customer, following\nthis\n",[46,40868,40871],{"href":40869,"rel":40870},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Ftemplates\u002F26586079\u002Fedit\u002F135404737?q=welco&page=1",[108],"HubSpot Template",[147,40873,40874],{},"If Professional Services are included, inform the PS team of deal.",[147,40876,40877],{},"Add customer to onboarding stage in the CSM tracking document.",[147,40879,40768,40880,40882],{},[542,40881,378],{}," stage.",[147,40884,40885],{},"Check if a new renewal deal is automatically generated under the correct terms and closing date.",[147,40887,40888],{},"Add the following to the deal:",[144,40890,40891,40893,40895,40897],{},[147,40892,40710],{},[147,40894,40713],{},[147,40896,40716],{},[147,40898,40719],{},[14,40900,40902],{"id":40901},"deal-approval-process-deal-desk","Deal Approval Process (Deal Desk)",[19,40904,40905],{},"To ensure consistency and efficiency in our deal cycles, all proposals must follow the established Deal Desk workflow. This process covers the end-to-end journey from initial proposal creation through security review and final legal\u002Fcontract execution.",[164,40907,40909],{"id":40908},"asana-deal-desk-tasks","Asana Deal Desk Tasks",[19,40911,40912,40913,63,40916,40919,40920,40923,40924,549],{},"Any deal that requires ",[423,40914,40915],{},"legal review",[423,40917,40918],{},"pricing\u002Fdiscount approval",", or other operational hand-offs must have a task created in the ",[46,40921,40384],{"href":40382,"rel":40922},[108],". To create a task, submit your request through this ",[46,40925,40927],{"href":40377,"rel":40926},[108],"form",[19,40929,40930],{},"When creating a task, include the following context so reviewers can act without needing to chase down background:",[144,40932,40933,40939,40945,40951,40957,40963],{},[147,40934,40935,40938],{},[423,40936,40937],{},"Deal \u002F company name"," — the customer or prospect this deal is for.",[147,40940,40941,40944],{},[423,40942,40943],{},"Counter-party contacts"," — names, titles, and email addresses of the people involved from the customer side (e.g. economic buyer, legal contact, procurement).",[147,40946,40947,40950],{},[423,40948,40949],{},"Deal summary"," — ARR, contract length, and any non-standard terms being requested.",[147,40952,40953,40956],{},[423,40954,40955],{},"What is needed"," — be explicit: legal redline review, discount approval, MSA exception, etc.",[147,40958,40959,40962],{},[423,40960,40961],{},"Deadline \u002F urgency"," — when a decision is needed and why.",[147,40964,40965,40968],{},[423,40966,40967],{},"Link to HubSpot deal"," — so reviewers can access the full deal record.",[19,40970,40971],{},"Creating a task ensures nothing gets lost in Slack threads and gives the CEO, Legal, and Finance a single place to review, comment, and approve.",[164,40973,40975],{"id":40974},"overview-of-the-flow","Overview of the Flow",[239,40977,40979],{"id":40978},"proposal-stage","Proposal Stage",[19,40981,40982,40983,40986],{},"Sales reps create proposals and determine if the deal structure (discounts, terms, payment schedules) is standard. Non-standard deals are routed to the CEO via Slack for approval, ",[423,40984,40985],{},"and an Asana task must be opened in the Deal Desk project"," (see above).",[557,40988,40990],{"className":3049,"code":40989,"language":3051,"meta":75,"style":75},"graph TD\n    %% Nodes\n    Start[\"Is the deal structure standard?\"]\n    AcceptProposal[\"Customer accepts the Proposal 'Agreed in Principle'?\"]\n    Negotiate[\"Rep must negotiate with the customer\"]\n    DealCriteria[\"Is there a discount?\n                Is the term > 1 year?\n                Payment terms > Net 30\u003Cbr \u002F>\"]\n    CEO[\"Route to CEO for Slack approval\"]\n    Security[\"\u003Cb>Go to Security Process\u003C\u002Fb>\"]\n\n    %% Connections\n    Start -- Yes --> AcceptProposal\n    Start -- No --> DealCriteria\n\n    AcceptProposal -- No --> Negotiate\n    AcceptProposal -- Yes ----> Security\n\n    Negotiate --> Start\n\n    DealCriteria -- No --> Security\n    DealCriteria -- Yes --> CEO\n\n    CEO -- Reject --> Negotiate\n    CEO -- Accept --> Security\n",[542,40991,40992,40996,41001,41006,41011,41016,41021,41026,41031,41036,41041,41045,41050,41055,41060,41064,41069,41074,41078,41083,41087,41092,41097,41101,41106],{"__ignoreMap":75},[2403,40993,40994],{"class":2405,"line":2406},[2403,40995,3058],{},[2403,40997,40998],{"class":2405,"line":76},[2403,40999,41000],{},"    %% Nodes\n",[2403,41002,41003],{"class":2405,"line":605},[2403,41004,41005],{},"    Start[\"Is the deal structure standard?\"]\n",[2403,41007,41008],{"class":2405,"line":2423},[2403,41009,41010],{},"    AcceptProposal[\"Customer accepts the Proposal 'Agreed in Principle'?\"]\n",[2403,41012,41013],{"class":2405,"line":2465},[2403,41014,41015],{},"    Negotiate[\"Rep must negotiate with the customer\"]\n",[2403,41017,41018],{"class":2405,"line":2471},[2403,41019,41020],{},"    DealCriteria[\"Is there a discount?\n",[2403,41022,41023],{"class":2405,"line":3086},[2403,41024,41025],{},"                Is the term > 1 year?\n",[2403,41027,41028],{"class":2405,"line":3092},[2403,41029,41030],{},"                Payment terms > Net 30\u003Cbr \u002F>\"]\n",[2403,41032,41033],{"class":2405,"line":3098},[2403,41034,41035],{},"    CEO[\"Route to CEO for Slack approval\"]\n",[2403,41037,41038],{"class":2405,"line":3104},[2403,41039,41040],{},"    Security[\"\u003Cb>Go to Security Process\u003C\u002Fb>\"]\n",[2403,41042,41043],{"class":2405,"line":3109},[2403,41044,2462],{"emptyLinePlaceholder":84},[2403,41046,41047],{"class":2405,"line":3115},[2403,41048,41049],{},"    %% Connections\n",[2403,41051,41052],{"class":2405,"line":3121},[2403,41053,41054],{},"    Start -- Yes --> AcceptProposal\n",[2403,41056,41057],{"class":2405,"line":3127},[2403,41058,41059],{},"    Start -- No --> DealCriteria\n",[2403,41061,41062],{"class":2405,"line":3132},[2403,41063,2462],{"emptyLinePlaceholder":84},[2403,41065,41066],{"class":2405,"line":3138},[2403,41067,41068],{},"    AcceptProposal -- No --> Negotiate\n",[2403,41070,41071],{"class":2405,"line":3143},[2403,41072,41073],{},"    AcceptProposal -- Yes ----> Security\n",[2403,41075,41076],{"class":2405,"line":3148},[2403,41077,2462],{"emptyLinePlaceholder":84},[2403,41079,41080],{"class":2405,"line":3154},[2403,41081,41082],{},"    Negotiate --> Start\n",[2403,41084,41085],{"class":2405,"line":3160},[2403,41086,2462],{"emptyLinePlaceholder":84},[2403,41088,41089],{"class":2405,"line":3166},[2403,41090,41091],{},"    DealCriteria -- No --> Security\n",[2403,41093,41094],{"class":2405,"line":3172},[2403,41095,41096],{},"    DealCriteria -- Yes --> CEO\n",[2403,41098,41099],{"class":2405,"line":3177},[2403,41100,2462],{"emptyLinePlaceholder":84},[2403,41102,41103],{"class":2405,"line":3183},[2403,41104,41105],{},"    CEO -- Reject --> Negotiate\n",[2403,41107,41108],{"class":2405,"line":3189},[2403,41109,41110],{},"    CEO -- Accept --> Security\n",[239,41112,41114],{"id":41113},"security-review","Security Review",[19,41116,41117],{},"If a customer requires a security review, the AE coordinates between the\ncustomer's questionnaire and the Engineering team to provide approved answers.",[557,41119,41121],{"className":3049,"code":41120,"language":3051,"meta":75,"style":75},"flowchart TD\n    %% Nodes\n    Start[Sales Rep Reviews Security]\n    ReqReview{Requires Security Review?}\n    \n    %% Happy Path Steps\n    ShareQ[Customer Shares Questionnaire]\n    SendToEng[AE sends to Eng]\n    EngAnswers[Eng sends answers to AE]\n    Forward[AE forwards to Customer]\n    \n    %% Approval Decision\n    Accepts{Customer Accepts?}\n    Rework[AE reviews notes\u002FMeeting with Engineering]\n    \n    %% End State\n    EndProcess((Go to Contract\u002FLegal))\n\n    %% Connections\n    Start --> ReqReview\n    \n    %% No Review Path\n    ReqReview -- No --> EndProcess\n    \n    %% Review Needed Path\n    ReqReview -- Yes --> ShareQ\n    ShareQ --> SendToEng\n    SendToEng --> EngAnswers\n    EngAnswers --> Forward\n    Forward --> Accepts\n    \n    %% Outcome Logic\n    Accepts -- Approve --> EndProcess\n    \n    %% Rejection Loop\n    Accepts -- Reject --> Rework\n    Rework --> EngAnswers\n",[542,41122,41123,41128,41132,41137,41142,41147,41152,41157,41162,41167,41172,41176,41181,41186,41191,41195,41200,41205,41209,41213,41218,41222,41227,41232,41236,41241,41246,41251,41256,41261,41266,41270,41275,41280,41284,41289,41294],{"__ignoreMap":75},[2403,41124,41125],{"class":2405,"line":2406},[2403,41126,41127],{},"flowchart TD\n",[2403,41129,41130],{"class":2405,"line":76},[2403,41131,41000],{},[2403,41133,41134],{"class":2405,"line":605},[2403,41135,41136],{},"    Start[Sales Rep Reviews Security]\n",[2403,41138,41139],{"class":2405,"line":2423},[2403,41140,41141],{},"    ReqReview{Requires Security Review?}\n",[2403,41143,41144],{"class":2405,"line":2465},[2403,41145,41146],{},"    \n",[2403,41148,41149],{"class":2405,"line":2471},[2403,41150,41151],{},"    %% Happy Path Steps\n",[2403,41153,41154],{"class":2405,"line":3086},[2403,41155,41156],{},"    ShareQ[Customer Shares Questionnaire]\n",[2403,41158,41159],{"class":2405,"line":3092},[2403,41160,41161],{},"    SendToEng[AE sends to Eng]\n",[2403,41163,41164],{"class":2405,"line":3098},[2403,41165,41166],{},"    EngAnswers[Eng sends answers to AE]\n",[2403,41168,41169],{"class":2405,"line":3104},[2403,41170,41171],{},"    Forward[AE forwards to Customer]\n",[2403,41173,41174],{"class":2405,"line":3109},[2403,41175,41146],{},[2403,41177,41178],{"class":2405,"line":3115},[2403,41179,41180],{},"    %% Approval Decision\n",[2403,41182,41183],{"class":2405,"line":3121},[2403,41184,41185],{},"    Accepts{Customer Accepts?}\n",[2403,41187,41188],{"class":2405,"line":3127},[2403,41189,41190],{},"    Rework[AE reviews notes\u002FMeeting with Engineering]\n",[2403,41192,41193],{"class":2405,"line":3132},[2403,41194,41146],{},[2403,41196,41197],{"class":2405,"line":3138},[2403,41198,41199],{},"    %% End State\n",[2403,41201,41202],{"class":2405,"line":3143},[2403,41203,41204],{},"    EndProcess((Go to Contract\u002FLegal))\n",[2403,41206,41207],{"class":2405,"line":3148},[2403,41208,2462],{"emptyLinePlaceholder":84},[2403,41210,41211],{"class":2405,"line":3154},[2403,41212,41049],{},[2403,41214,41215],{"class":2405,"line":3160},[2403,41216,41217],{},"    Start --> ReqReview\n",[2403,41219,41220],{"class":2405,"line":3166},[2403,41221,41146],{},[2403,41223,41224],{"class":2405,"line":3172},[2403,41225,41226],{},"    %% No Review Path\n",[2403,41228,41229],{"class":2405,"line":3177},[2403,41230,41231],{},"    ReqReview -- No --> EndProcess\n",[2403,41233,41234],{"class":2405,"line":3183},[2403,41235,41146],{},[2403,41237,41238],{"class":2405,"line":3189},[2403,41239,41240],{},"    %% Review Needed Path\n",[2403,41242,41243],{"class":2405,"line":3195},[2403,41244,41245],{},"    ReqReview -- Yes --> ShareQ\n",[2403,41247,41248],{"class":2405,"line":3201},[2403,41249,41250],{},"    ShareQ --> SendToEng\n",[2403,41252,41253],{"class":2405,"line":12342},[2403,41254,41255],{},"    SendToEng --> EngAnswers\n",[2403,41257,41258],{"class":2405,"line":12353},[2403,41259,41260],{},"    EngAnswers --> Forward\n",[2403,41262,41263],{"class":2405,"line":12359},[2403,41264,41265],{},"    Forward --> Accepts\n",[2403,41267,41268],{"class":2405,"line":12370},[2403,41269,41146],{},[2403,41271,41272],{"class":2405,"line":12376},[2403,41273,41274],{},"    %% Outcome Logic\n",[2403,41276,41277],{"class":2405,"line":20448},[2403,41278,41279],{},"    Accepts -- Approve --> EndProcess\n",[2403,41281,41282],{"class":2405,"line":20453},[2403,41283,41146],{},[2403,41285,41286],{"class":2405,"line":20459},[2403,41287,41288],{},"    %% Rejection Loop\n",[2403,41290,41291],{"class":2405,"line":20464},[2403,41292,41293],{},"    Accepts -- Reject --> Rework\n",[2403,41295,41296],{"class":2405,"line":20479},[2403,41297,41298],{},"    Rework --> EngAnswers\n",[239,41300,41302],{"id":41301},"legal-contract-process","Legal & Contract Process",[19,41304,41305,41306,41309,41310,41313],{},"This stage handles the Master Subscription Agreement (MSA).\nDepending on whether the customer accepts our standard MSA or requests minor\u002Fmajor\nredlines, the contract is routed to Legal (Scale) and\u002For the CEO for cost and term\napproval before final signature. ",[423,41307,41308],{},"Any deal entering this stage requires an Asana task in the Deal Desk project"," with full counter-party context (see ",[46,41311,40909],{"href":41312},"#asana-deal-desk-tasks"," above).",[557,41315,41317],{"className":3049,"code":41316,"language":3051,"meta":75,"style":75},"flowchart TD\n    %% Nodes\n    IsStd{Standard MSA?}\n    IsRed{Redlines?}\n    NonStd[Legal Review + Cost Approval]\n    Major[Legal Review - Major\u002FIP]\n    CEO[CEO Approval]\n    Send[Send to Customer]\n    Approved{Customer Approve?}\n    Sign((Sign Contract))\n    \n    %% Non-Standard Path\n    IsStd -- No --> NonStd\n    NonStd --> CEO\n\n    %% Standard Path\n    IsStd -- Yes --> IsRed\n    IsRed -- No --> Sign\n    \n    %% Redline Paths\n    IsRed -- \"Yes (Minor\u002FPayment)\" --> CEO\n    IsRed -- \"Yes (Major\u002FLiability)\" --> Major\n    Major --> CEO\n\n    %% Unified Loop\n    CEO --> Send\n    Send --> Approved\n    Approved -- Yes --> Sign\n    Approved -- No --> CEO\n",[542,41318,41319,41323,41327,41332,41337,41342,41347,41352,41357,41362,41367,41371,41376,41381,41386,41390,41395,41400,41405,41409,41414,41419,41424,41429,41433,41438,41443,41448,41453],{"__ignoreMap":75},[2403,41320,41321],{"class":2405,"line":2406},[2403,41322,41127],{},[2403,41324,41325],{"class":2405,"line":76},[2403,41326,41000],{},[2403,41328,41329],{"class":2405,"line":605},[2403,41330,41331],{},"    IsStd{Standard MSA?}\n",[2403,41333,41334],{"class":2405,"line":2423},[2403,41335,41336],{},"    IsRed{Redlines?}\n",[2403,41338,41339],{"class":2405,"line":2465},[2403,41340,41341],{},"    NonStd[Legal Review + Cost Approval]\n",[2403,41343,41344],{"class":2405,"line":2471},[2403,41345,41346],{},"    Major[Legal Review - Major\u002FIP]\n",[2403,41348,41349],{"class":2405,"line":3086},[2403,41350,41351],{},"    CEO[CEO Approval]\n",[2403,41353,41354],{"class":2405,"line":3092},[2403,41355,41356],{},"    Send[Send to Customer]\n",[2403,41358,41359],{"class":2405,"line":3098},[2403,41360,41361],{},"    Approved{Customer Approve?}\n",[2403,41363,41364],{"class":2405,"line":3104},[2403,41365,41366],{},"    Sign((Sign Contract))\n",[2403,41368,41369],{"class":2405,"line":3109},[2403,41370,41146],{},[2403,41372,41373],{"class":2405,"line":3115},[2403,41374,41375],{},"    %% Non-Standard Path\n",[2403,41377,41378],{"class":2405,"line":3121},[2403,41379,41380],{},"    IsStd -- No --> NonStd\n",[2403,41382,41383],{"class":2405,"line":3127},[2403,41384,41385],{},"    NonStd --> CEO\n",[2403,41387,41388],{"class":2405,"line":3132},[2403,41389,2462],{"emptyLinePlaceholder":84},[2403,41391,41392],{"class":2405,"line":3138},[2403,41393,41394],{},"    %% Standard Path\n",[2403,41396,41397],{"class":2405,"line":3143},[2403,41398,41399],{},"    IsStd -- Yes --> IsRed\n",[2403,41401,41402],{"class":2405,"line":3148},[2403,41403,41404],{},"    IsRed -- No --> Sign\n",[2403,41406,41407],{"class":2405,"line":3154},[2403,41408,41146],{},[2403,41410,41411],{"class":2405,"line":3160},[2403,41412,41413],{},"    %% Redline Paths\n",[2403,41415,41416],{"class":2405,"line":3166},[2403,41417,41418],{},"    IsRed -- \"Yes (Minor\u002FPayment)\" --> CEO\n",[2403,41420,41421],{"class":2405,"line":3172},[2403,41422,41423],{},"    IsRed -- \"Yes (Major\u002FLiability)\" --> Major\n",[2403,41425,41426],{"class":2405,"line":3177},[2403,41427,41428],{},"    Major --> CEO\n",[2403,41430,41431],{"class":2405,"line":3183},[2403,41432,2462],{"emptyLinePlaceholder":84},[2403,41434,41435],{"class":2405,"line":3189},[2403,41436,41437],{},"    %% Unified Loop\n",[2403,41439,41440],{"class":2405,"line":3195},[2403,41441,41442],{},"    CEO --> Send\n",[2403,41444,41445],{"class":2405,"line":3201},[2403,41446,41447],{},"    Send --> Approved\n",[2403,41449,41450],{"class":2405,"line":12342},[2403,41451,41452],{},"    Approved -- Yes --> Sign\n",[2403,41454,41455],{"class":2405,"line":12353},[2403,41456,41457],{},"    Approved -- No --> CEO\n",[2796,41459,3285],{},{"title":75,"searchDepth":76,"depth":76,"links":41461},[41462,41463,41467,41471],{"id":40481,"depth":76,"text":40482},{"id":40512,"depth":76,"text":40513,"children":41464},[41465,41466],{"id":40519,"depth":605,"text":40520},{"id":40591,"depth":605,"text":40592},{"id":40650,"depth":76,"text":40651,"children":41468},[41469,41470],{"id":40679,"depth":605,"text":40680},{"id":40791,"depth":605,"text":40792},{"id":40901,"depth":76,"text":40902,"children":41472},[41473,41474],{"id":40908,"depth":605,"text":40909},{"id":40974,"depth":605,"text":40975},"Pricing is publicly available at our pricing page. When discussing\npricing with enterprise customers, make a copy of\nour internal pricing template deck\nto discuss.",{},"Engagements & Pricing","\u002Fhandbook\u002Fsales\u002Fengagements",{"title":40459,"description":41475},"handbook\u002Fsales\u002Fengagements","ccV5eZbcvkyUOXpvoloTdioP9yCWDQHaY0AU2NaDfP0",{"id":41483,"title":41484,"body":41485,"description":41492,"extension":81,"meta":41576,"navGroup":83,"navOrder":83,"navTitle":41484,"navigation":84,"path":41577,"seo":41578,"stem":41579,"__hash__":41580},"handbook\u002Fhandbook\u002Fsales\u002Fforecast-review.md","Forecast Review",{"type":7,"value":41486,"toc":41569},[41487,41490,41493,41497,41500,41521,41523,41526,41530,41533,41559,41562,41566],[10,41488,41484],{"id":41489},"forecast-review",[19,41491,41492],{},"The weekly Forecast Review is an internal sales meeting designed to create clarity on the team's revenue forecast and drive accountability across Account Executives and Customer Success Managers. The meeting reviews what is in the pipeline, what has changed since the last session, and whether pipeline generation is on track to meet full-year targets.",[14,41494,41496],{"id":41495},"preparation","Preparation",[19,41498,41499],{},"Before the meeting, every AE and CSM must update:",[144,41501,41502,41518],{},[147,41503,41504,41505,41510],{},"Their ",[46,41506,41509],{"href":41507,"rel":41508},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Fforecasting\u002F26586079\u002Fteams\u002F147609275?forecast_type=0&pipeline=default&time_period=THIS_MONTH&deal_grouping_type=DEAL_STAGE",[108],"HubSpot Forecasting",[144,41511,41512,41515],{},[147,41513,41514],{},"Current month",[147,41516,41517],{},"Subsequent 2 months",[147,41519,41520],{},"Ensure an up to date \"Next steps\" property for all deals",[14,41522,6951],{"id":6950},[19,41524,41525],{},"The meeting runs through the pipeline in three phases.",[164,41527,41529],{"id":41528},"month-by-month-review-current-next-2-months","Month-by-month review (current + next 2 months)",[19,41531,41532],{},"For each of the three months, the team walks through what has changed since the last review:",[144,41534,41535,41541,41547,41553],{},[147,41536,41537,41540],{},[423,41538,41539],{},"Closed lost"," — deals that were lost and why",[147,41542,41543,41546],{},[423,41544,41545],{},"New deals"," — newly created opportunities and their expected value",[147,41548,41549,41552],{},[423,41550,41551],{},"Deal growth"," — existing deals that have increased in value",[147,41554,41555,41558],{},[423,41556,41557],{},"Stage movements"," — deals that have advanced or regressed in the pipeline",[19,41560,41561],{},"The goal is to understand the delta: what moved, why, and what it means for the monthly forecast.",[164,41563,41565],{"id":41564},"full-year-pipeline-review","Full-year pipeline review",[19,41567,41568],{},"After the three-month walkthrough, the meeting closes with a full-year view to confirm that pipeline generation is healthy and on track to support annual targets. This surfaces any gaps early so the team can adjust sourcing or coverage.",{"title":75,"searchDepth":76,"depth":76,"links":41570},[41571,41572],{"id":41495,"depth":76,"text":41496},{"id":6950,"depth":76,"text":6951,"children":41573},[41574,41575],{"id":41528,"depth":605,"text":41529},{"id":41564,"depth":605,"text":41565},{},"\u002Fhandbook\u002Fsales\u002Fforecast-review",{"title":41484,"description":41492},"handbook\u002Fsales\u002Fforecast-review","RDDFWtyBzITIlcqwy8UNlKTmHmMLY4dMMpRDaUn6TUI",{"id":41582,"title":41583,"body":41584,"description":42163,"extension":81,"meta":42164,"navGroup":83,"navOrder":83,"navTitle":21508,"navigation":84,"path":42165,"seo":42166,"stem":42167,"__hash__":42168},"handbook\u002Fhandbook\u002Fsales\u002Fhubspot.md","Hubspot",{"type":7,"value":41585,"toc":42151},[41586,41593,41597,41600,41604,41607,41927,41931,41934,41938,41942,41956,41960,41972,41975,42047,42051,42062,42065,42068,42072,42094,42098,42101,42104,42108,42111],[19,41587,9544,41588,41592],{},[46,41589,21508],{"href":41590,"rel":41591},"https:\u002F\u002Fwww.hubspot.com\u002F",[108]," to track and manage all of our customer interactions.\nIt enables the creation of customer contacts, and then logging of emails\u002Fnotes associated to that customer.",[14,41594,41596],{"id":41595},"contact-management","Contact Management",[19,41598,41599],{},"Given that we have multiple client-facing roles within FlowFuse, it's important to document those that\nwe talk to ensure no crossover in sales and conversations.",[164,41601,41603],{"id":41602},"lifecycle-stage","Lifecycle Stage",[19,41605,41606],{},"All contacts in HubSpot need to have a defined lifecycle. It is required that all contacts pass through each lifecycle stage at the appropriate time based on their interaction with FlowFuse marketing and sales. Contacts should not skip a stage.\nIt is up to the contact owner to ensure their contacts have the appropriate lifecycle stage set.",[7556,41608,41611],{"className":41609,"markdown":8477},[41610],"table-wrapper",[910,41612,41613,41637],{},[913,41614,41615],{},[916,41616,41617,41620,41622,41624,41626,41629,41632,41635],{},[919,41618,41619],{"align":921},"Stage Name",[919,41621,41603],{"align":38998},[919,41623,6969],{"align":38998},[919,41625,30781],{"align":38998},[919,41627,41628],{"align":38998},"Deal Probability",[919,41630,41631],{"align":921},"Requirements for this Stage",[919,41633,41634],{"align":921},"Supporting Materials",[919,41636,6854],{"align":921},[930,41638,41639,41675,41702,41754,41800,41837,41868,41887,41907],{},[916,41640,41641,41644,41646,41648,41651,41653,41663,41665],{},[935,41642,41643],{"align":921},"Subscriber",[935,41645,41643],{"align":38998},[935,41647,21080],{"align":38998},[935,41649,41650],{"align":38998},"N\u002FA",[935,41652,39101],{"align":38998},[935,41654,41655],{"align":921},[144,41656,41657,41660],{},[147,41658,41659],{},"Email known in HubSpot",[147,41661,41662],{}," Aware of FlowFuse",[935,41664,41650],{"align":921},[935,41666,41667],{"align":921},[144,41668,41669,41672],{},[147,41670,41671],{}," Total contacts in Database ",[147,41673,41674],{},"Social Media Company Followers",[916,41676,41677,41680,41682,41684,41686,41688,41698,41700],{},[935,41678,41679],{"align":921},"Lead",[935,41681,41679],{"align":38998},[935,41683,21080],{"align":38998},[935,41685,41650],{"align":38998},[935,41687,39101],{"align":38998},[935,41689,41690],{"align":921},[144,41691,41692,41695],{},[147,41693,41694],{},"Demonstrated interested in FlowFuse",[147,41696,41697],{},"Started trial on FlowFuse Cloud OR filled another form on the marketing website",[935,41699,41650],{"align":921},[935,41701,41650],{"align":921},[916,41703,41704,41707,41710,41712,41714,41716,41741,41751],{},[935,41705,41706],{"align":921},"Marketing Qualified Lead",[935,41708,41709],{"align":38998},"MQL",[935,41711,37596],{"align":38998},[935,41713,41650],{"align":38998},[935,41715,39101],{"align":38998},[935,41717,41718,41735,41737,41738,41740],{"align":921},[144,41719,41720,41723,41726,41729,41732],{},[147,41721,41722],{},"Requested a quote or trial license through the website",[147,41724,41725],{},"Is a business user on FlowFuse Cloud",[147,41727,41728],{},"Requested to be contacted via a website or other marketing activity",[147,41730,41731],{},"Confirmation for First Meeting",[147,41733,41734],{},"Technical Fit and Pain is very probable",[9379,41736],{},"See ",[46,41739,25840],{"href":26041}," for inbound vs. outbound definitions.",[935,41742,41743],{"align":921},[144,41744,41745,41748],{},[147,41746,41747],{},"Lead Scoring",[147,41749,41750],{},"Sequences & Templates",[935,41752,41753],{"align":921},"# new MQLs",[916,41755,41756,41759,41762,41764,41766,41768,41787,41797],{},[935,41757,41758],{"align":921},"Sales Qualified Lead",[935,41760,41761],{"align":38998},"SQL",[935,41763,37596],{"align":38998},[935,41765,41650],{"align":38998},[935,41767,39101],{"align":38998},[935,41769,41770],{"align":921},[144,41771,41772,41775,41778,41781,41784],{},[147,41773,41774],{},"SPICED Discovery done",[147,41776,41777],{},"Customer Pain Identified",[147,41779,41780],{},"Confirmed Critical Event",[147,41782,41783],{},"Timeline PoC and Purchase known",[147,41785,41786],{},"Stakeholders Identified",[935,41788,41789],{"align":921},[144,41790,41791,41794],{},[147,41792,41793],{},"Intro meeting Deck",[147,41795,41796],{},"Customer Success Stories",[935,41798,41799],{"align":921},"# New SQLs & # First Meetings Occurred",[916,41801,41802,41805,41807,41809,41811,41814,41824,41834],{},[935,41803,41804],{"align":921},"Opportunity",[935,41806,41804],{"align":38998},[935,41808,37596],{"align":38998},[935,41810,41804],{"align":38998},[935,41812,41813],{"align":38998},"10%",[935,41815,41816],{"align":921},[144,41817,41818,41821],{},[147,41819,41820],{},"Poc \u002F Trial Requestments Documented",[147,41822,41823],{},"Deal Sheet Completed",[935,41825,41826],{"align":921},[144,41827,41828,41831],{},[147,41829,41830],{},"PoC Document",[147,41832,41833],{},"Deal Sheet Template",[935,41835,41836],{"align":921},"Pipeline Forecast Sheet",[916,41838,41839,41842,41844,41846,41848,41851,41863,41866],{},[935,41840,41841],{"align":921},"Value Identified",[935,41843,41804],{"align":38998},[935,41845,37596],{"align":38998},[935,41847,41841],{"align":38998},[935,41849,41850],{"align":38998},"30%",[935,41852,41853],{"align":921},[144,41854,41855,41858,41861],{},[147,41856,41857],{},"PoC \u002F Trial started",[147,41859,41860],{},"Check in call scheduled",[144,41862],{},[935,41864,41865],{"align":921},"TODO: Account Mapping sheet",[935,41867],{"align":921},[916,41869,41870,41873,41875,41877,41879,41881,41883,41885],{},[935,41871,41872],{"align":921},"Value Validated",[935,41874,41804],{"align":38998},[935,41876,37596],{"align":38998},[935,41878,41872],{"align":38998},[935,41880,39098],{"align":38998},[935,41882,41650],{"align":921},[935,41884,41650],{"align":921},[935,41886,41836],{"align":921},[916,41888,41889,41892,41894,41896,41898,41901,41903,41905],{},[935,41890,41891],{"align":921},"Procurement",[935,41893,41804],{"align":38998},[935,41895,37596],{"align":38998},[935,41897,41891],{"align":38998},[935,41899,41900],{"align":38998},"70%",[935,41902,41650],{"align":921},[935,41904,41650],{"align":921},[935,41906,41836],{"align":921},[916,41908,41909,41911,41914,41917,41919,41921,41923,41925],{},[935,41910,378],{"align":921},[935,41912,41913],{"align":38998},"Customer",[935,41915,41916],{"align":38998},"CSM \u002F Sales",[935,41918,41913],{"align":38998},[935,41920,39088],{"align":38998},[935,41922,41650],{"align":921},[935,41924,41650],{"align":921},[935,41926,41650],{"align":921},[239,41928,41930],{"id":41929},"mql-follow-up-expectations","MQL follow-up expectations",[19,41932,41933],{},"MQLs will be engaged by a Sales Representative, according with the appropriate geographic region of the contact (or who is available in the time frame). Sales should reserve time on a daily basis to review new and existing MQLs, reach out to them, and understand the nature of their interest in FlowFuse. The primary goals of this engagement are to clarify context, identify potential opportunities early, and manually update lifecycle stage and lead status so that only genuine opportunities move forward in the pipeline within the first business day since the MQL has landed.",[239,41935,41937],{"id":41936},"lifecycle-changes","Lifecycle changes",[1019,41939,41941],{"id":41940},"from-mql-to-sql-qualifying-questions","From MQL to SQL - Qualifying questions",[144,41943,41944,41947,41950,41953],{},[147,41945,41946],{},"Does the prospect and company fit the target industry \u002F company size \u002F role?",[147,41948,41949],{},"Are they working on an initiative related to connecting systems, industrial data, or operational workflows?",[147,41951,41952],{},"Can they describe a specific problem, use case or goal they’re trying to address?",[147,41954,41955],{},"Are they open to a meeting to explore their use case in more detail?",[164,41957,41959],{"id":41958},"lead-status","Lead Status",[19,41961,41962,41963,41967,41968,41971],{},"For leads who are ",[46,41964,41966],{"href":41965},"#lifecycle-stage","MQLs or SQLs"," the ",[542,41969,41970],{},"Lead status","\nfield is used to mark what the status is. Even though they're beyond being a lead.\nThis field is maintained by the primary contact owner, likely the account executive.",[19,41973,41974],{},"At this stage we're using the default set of status's in HubSpot:",[910,41976,41977,41986],{},[913,41978,41979],{},[916,41980,41981,41983],{},[919,41982,41970],{"align":38998},[919,41984,41985],{"align":921},"When to use",[930,41987,41988,41999,42007,42015,42023,42031,42039],{},[916,41989,41990,41993],{},[935,41991,41992],{"align":38998},"New",[935,41994,41995,41996,41998],{"align":921},"The contact in question has had only ",[2562,41997,18234],{}," contact (E-mails, etc).",[916,42000,42001,42004],{},[935,42002,42003],{"align":38998},"Open",[935,42005,42006],{"align":921},"In the stage where a contact is assigned to a Account exec, but no official connection has be made. Usually contacts are only in this stage for a short while.",[916,42008,42009,42012],{},[935,42010,42011],{"align":38998},"In Progress",[935,42013,42014],{"align":921},"After contact has been made, this status captures the nurturing process toward an opportunity.",[916,42016,42017,42020],{},[935,42018,42019],{"align":38998},"Open Deal",[935,42021,42022],{"align":921},"When a deal is on the board, and the opportunity is real, this is the status!",[916,42024,42025,42028],{},[935,42026,42027],{"align":38998},"Unqualified",[935,42029,42030],{"align":921},"Either this contact specifically cannot lead the sales process, or the account itself has been found unqualified.",[916,42032,42033,42036],{},[935,42034,42035],{"align":38998},"Unresponsive",[935,42037,42038],{"align":921},"We have not received a reply in 2 weeks, they are ghosting us.",[916,42040,42041,42044],{},[935,42042,42043],{"align":38998},"Bad timing",[935,42045,42046],{"align":921},"FlowFuse was, for whatever reason, not a great fit right now. However, it's potentially a good fit later.",[164,42048,42050],{"id":42049},"outbound","Outbound",[19,42052,42053,42055,42056,42058,42059,42061],{},[542,42054,26001],{}," is a custom property that's set to ",[542,42057,26005],{}," when the first meeting with the contact came through outbound\ndrip campaigns or other outbound lead-gen actions. This property will be set to ",[542,42060,26005],{}," when the contact was in HubSpot\nthrough other marketing activities too, but wasn't nurtured to the point of a meeting yet.",[14,42063,39533],{"id":42064},"deal-management",[19,42066,42067],{},"A HubSpot deal represents a specific revenue opportunity with a customer or prospect. Each deal is mirrored daily into a representative GitHub issue in the FlowFuse\u002Fproduct repository, with the deal owner assigned as the issue assignee. The deal issue is the discussion hub and collection point for everything tied to that deal: feature requests blocking or supporting it, customer-specific implementation discussions, and cross-references to the public Sales Request or Customer Request issues filed elsewhere in FlowFuse repositories. Because FlowFuse\u002Fproduct is private, this view is internal-only and lets the team see which feature requests pertain to which deal. Sales and Product share responsibility for maintaining this link.",[164,42069,42071],{"id":42070},"deal-properties","Deal Properties",[910,42073,42074,42082],{},[913,42075,42076],{},[916,42077,42078,42080],{},[919,42079,28371],{"align":921},[919,42081,15152],{"align":921},[930,42083,42084],{},[916,42085,42086,42091],{},[935,42087,42088],{"align":921},[542,42089,42090],{},"github_issue",[935,42092,42093],{"align":921},"URL of the deal's representative GitHub issue in FlowFuse\u002Fproduct. Auto-populated and synced daily; do not edit manually. The linked issue is where deal-tied feature requests, blockers, and customer asks are discussed and cross-referenced.",[14,42095,42097],{"id":42096},"importing-contacts-into-hubspot","Importing Contacts Into HubSpot",[19,42099,42100],{},"If you import contacts into HubSpot, it is important that the First Name and Last Name are populated correctly. Currently the FlowFuse Cloud database stores first and last name in a single field called Name. If you import this field into HubSpot the default is set to populate the Last Name field. The First Name field will not be populated so any email personalization with First Name will not be effective.",[19,42102,42103],{},"The ideal process for importing FlowFuse Cloud contacts is that you first split the Name field into a First Name and Last Name. Google Sheets has the ability to split a column of text into two columns based on the delimiter of a space. Once that is completed then you can import the list into HubSpot.",[14,42105,42107],{"id":42106},"recommended-apps","Recommended Apps",[19,42109,42110],{},"Extension applications for HubSpot that can be beneficial if you're interacting with customers:",[144,42112,42113],{},[147,42114,42115,42122,42123],{},[423,42116,42117,42118,1583],{},"G-Mail Extension (",[46,42119,2971],{"href":42120,"rel":42121},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Fecosystem\u002F26586079\u002Fmarketplace\u002Fapps\u002Fsales\u002Fsales-enablement\u002Fgmail",[108]," - Automatically creates contacts when you e-mail them for the first time, and logs e-mail activity against that contact in HubSpot.\n",[144,42124,42125],{},[147,42126,42127,42130],{},[423,42128,42129],{},"Enhance your meeting invites by following these steps:",[504,42131,42132,42138,42141,42148],{},[147,42133,42134,42135,42137],{},"After installing the extension, click on ",[542,42136,703],{}," in the toolbar that appears in Gmail.",[147,42139,42140],{},"Pick at least three of your available timeslots to be added as options to your e-mail message.",[147,42142,42143,42144],{},"HubSpot will automatically generate three buttons in the email, each corresponding to one of the proposed times. Take into consideration that the displayed time will correspond with the host's timezone.\n",[1724,42145],{"alt":42146,"src":42147,"width":28249},"E-mail message with options","\u002Fhandbook\u002Fsales\u002Fimages\u002Fhs-email-message.png",[147,42149,42150],{},"If none of the options work for the recipient, an additional link to your calendar will also be included.",{"title":75,"searchDepth":76,"depth":76,"links":42152},[42153,42158,42161,42162],{"id":41595,"depth":76,"text":41596,"children":42154},[42155,42156,42157],{"id":41602,"depth":605,"text":41603},{"id":41958,"depth":605,"text":41959},{"id":42049,"depth":605,"text":42050},{"id":42064,"depth":76,"text":39533,"children":42159},[42160],{"id":42070,"depth":605,"text":42071},{"id":42096,"depth":76,"text":42097},{"id":42106,"depth":76,"text":42107},"We use HubSpot to track and manage all of our customer interactions.\nIt enables the creation of customer contacts, and then logging of emails\u002Fnotes associated to that customer.",{},"\u002Fhandbook\u002Fsales\u002Fhubspot",{"description":42163},"handbook\u002Fsales\u002Fhubspot","pWamZCyui_ySNsKN_SquE_aKNIi-P2Hy7YrkFHxRWjQ",{"id":42170,"title":40452,"body":42171,"description":75,"extension":81,"meta":42514,"navGroup":40452,"navOrder":83,"navTitle":37596,"navigation":84,"path":42515,"seo":42516,"stem":42517,"__hash__":42518},"handbook\u002Fhandbook\u002Fsales\u002Findex.md",{"type":7,"value":42172,"toc":42505},[42173,42176,42178,42181,42213,42215,42289,42291,42297,42300,42370,42374,42377,42380,42384,42494,42498],[10,42174,40452],{"id":42175},"sales-department",[14,42177,25605],{"id":25604},[19,42179,42180],{},"The Sales department is responsible for new customer acquisition, existing\ncustomer expansion, and customer success. This includes:",[504,42182,42183,42186,42189,42192,42195,42198,42201,42204,42207,42210],{},[147,42184,42185],{},"Prospecting and outreach for new business.",[147,42187,42188],{},"Conducting introductory calls to determine use-case and fit.",[147,42190,42191],{},"Giving customized product demonstrations to potential customers.",[147,42193,42194],{},"Following up with active business opportunities.",[147,42196,42197],{},"Providing quotations.",[147,42199,42200],{},"Working with external procurement teams.",[147,42202,42203],{},"Navigating subscription agreement terms.",[147,42205,42206],{},"Finalizing contracts and billing details.",[147,42208,42209],{},"Customer success management and support.",[147,42211,42212],{},"Customer onboarding and training.",[14,42214,25037],{"id":25036},[910,42216,42217,42225],{},[913,42218,42219],{},[916,42220,42221,42223],{},[919,42222,5814],{},[919,42224,25684],{},[930,42226,42227,42242,42258,42273],{},[916,42228,42229,42231],{},[935,42230,37318],{},[935,42232,42233,1755,42237],{},[46,42234,42236],{"href":42235},"\u002Fabout#michael-davis","Michael Davis",[46,42238,42241],{"href":42239,"rel":42240},"https:\u002F\u002Fgithub.com\u002FMichaelBDavis",[108],"@MichaelBDavis",[916,42243,42244,42247],{},[935,42245,42246],{},"AE",[935,42248,42249,1755,42253],{},[46,42250,42252],{"href":42251},"\u002Fabout#dan-parry","Dan Parry",[46,42254,42257],{"href":42255,"rel":42256},"https:\u002F\u002Fgithub.com\u002Fdanielgparry-star",[108],"@dgparry32",[916,42259,42260,42262],{},[935,42261,42246],{},[935,42263,42264,1755,42268],{},[46,42265,42267],{"href":42266},"\u002Fabout#kasheef-mohammed","Kasheef Mohammed",[46,42269,42272],{"href":42270,"rel":42271},"https:\u002F\u002Fgithub.com\u002FKasheef13",[108],"@Kasheef",[916,42274,42275,42278],{},[935,42276,42277],{},"CSM",[935,42279,42280,1755,42284],{},[46,42281,42283],{"href":42282},"\u002Fabout#esme-wieringa","Esmé Wieringa",[46,42285,42288],{"href":42286,"rel":42287},"https:\u002F\u002Fgithub.com\u002FEsmewieringa",[108],"@Esmewieringa",[14,42290,25738],{"id":25737},[19,42292,25741,42293,549],{},[46,42294,42296],{"href":25744,"rel":42295},[108],"#dept-sales",[14,42298,25589],{"id":42299},"how-we-work",[144,42301,42302,42308,42312,42318,42323,42327,42334,42341,42348,42355,42360,42366],{},[147,42303,42304],{},[46,42305,42307],{"href":42306},"\u002Fhandbook\u002Fsales\u002Foperating-principles","Sales Team Operating Principles",[147,42309,42310],{},[46,42311,41484],{"href":41577},[147,42313,42314],{},[46,42315,42317],{"href":42316},"\u002Fhandbook\u002Fsales\u002Fmeetings\u002Fdemo","Demo",[147,42319,42320],{},[46,42321,40213],{"href":42322},"\u002Fhandbook\u002Fsales\u002Fsales-deck",[147,42324,42325],{},[46,42326,41477],{"href":41478},[147,42328,42329],{},[46,42330,42333],{"href":42331,"rel":42332},"https:\u002F\u002Fapp-eu1.hubspot.com\u002Fcontacts\u002F26586079\u002Fobjects\u002F0-3\u002Fviews\u002Fall\u002Fboard",[108],"Deal Board",[147,42335,42336],{},[46,42337,42340],{"href":42338,"rel":42339},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1Jrt5sNg46wngQ5UAii8sbN94PTlIAscOWrFcOhSVNPE\u002Fedit",[108],"Sales playbook (internal)",[147,42342,42343],{},[46,42344,42347],{"href":42345,"rel":42346},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1WKz_ll6bLxkkRlZ4K94Va1laGksHXleo8Pnv0aB08lU",[108],"SPICED Sales Framework",[147,42349,42350],{},[46,42351,42354],{"href":42352,"rel":42353},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1wM_o8IWjjkwi-WMRueKfS-lrmkQYzV83xm4BIzZNAO0\u002Fedit#gid=0",[108],"Customer Licenses (internal)",[147,42356,42357],{},[46,42358,27761],{"href":27378,"rel":42359},[108],[147,42361,42362],{},[46,42363,42365],{"href":42364},"\u002Fhandbook\u002Fsales\u002Fregions","Sales Regions",[147,42367,42368],{},[46,42369,22442],{"href":39990},[164,42371,42373],{"id":42372},"sales-tech-stack","Sales tech stack",[19,42375,42376],{},"FlowFuse utilizes a streamlined and integrated tech stack to manage the entire sales process, from initial research to closed-won tracking. Our foundation is built on HubSpot as our primary Customer Relationship Management (CRM) platform, supplemented by specialized tools for enrichment, intelligence, and meeting capture.",[19,42378,42379],{},"Below is the mapping of our core sales capabilities to the specific tools we use:",[239,42381,42383],{"id":42382},"capability-to-tool-mapping","Capability to Tool Mapping",[910,42385,42386,42399],{},[913,42387,42388],{},[916,42389,42390,42393,42396],{},[919,42391,42392],{},"Capability",[919,42394,42395],{},"Tool",[919,42397,42398],{},"Primary Use Case",[930,42400,42401,42415,42429,42443,42458,42473,42483],{},[916,42402,42403,42408,42412],{},[935,42404,42405],{},[423,42406,42407],{},"CRM (Source of Truth)",[935,42409,42410],{},[423,42411,21508],{},[935,42413,42414],{},"Managing all customer relationships, pipeline data, and contact records.",[916,42416,42417,42422,42426],{},[935,42418,42419],{},[423,42420,42421],{},"Emails, Calls & Sequences",[935,42423,42424],{},[423,42425,21508],{},[935,42427,42428],{},"Executing outreach, standardizing email templates, and running automated cadences.",[916,42430,42431,42436,42440],{},[935,42432,42433],{},[423,42434,42435],{},"Subscription Tracking",[935,42437,42438],{},[423,42439,21508],{},[935,42441,42442],{},"Monitoring customer lifecycles, upgrades, renewals, and ongoing subscriptions.",[916,42444,42445,42450,42455],{},[935,42446,42447],{},[423,42448,42449],{},"Call Recording",[935,42451,42452],{},[423,42453,42454],{},"Fathom",[935,42456,42457],{},"Recording, transcribing, and summarizing customer calls and meetings.",[916,42459,42460,42465,42470],{},[935,42461,42462],{},[423,42463,42464],{},"Data Enrichment",[935,42466,42467],{},[423,42468,42469],{},"Clay",[935,42471,42472],{},"Automatically pulling in missing contact or company data to build robust, targeted lead lists.",[916,42474,42475,42478,42480],{},[935,42476,42477],{},"Account Research & Planning",[935,42479,3759],{},[935,42481,42482],{},"Synthesizing account data, conducting deep-dive strategic research, and planning personalized outreach.",[916,42484,42485,42488,42491],{},[935,42486,42487],{},"Account-based Outreach",[935,42489,42490],{},"LinkedIn Sales Navigator",[935,42492,42493],{},"Research and outreach to prospects on LinkedIn.",[164,42495,42497],{"id":42496},"sales-processes","Sales Processes",[144,42499,42500],{},[147,42501,42502],{},[46,42503,42504],{"href":40453},"Edge Connect Process",{"title":75,"searchDepth":76,"depth":76,"links":42506},[42507,42508,42509,42510],{"id":25604,"depth":76,"text":25605},{"id":25036,"depth":76,"text":25037},{"id":25737,"depth":76,"text":25738},{"id":42299,"depth":76,"text":25589,"children":42511},[42512,42513],{"id":42372,"depth":605,"text":42373},{"id":42496,"depth":605,"text":42497},{},"\u002Fhandbook\u002Fsales",{"title":40452,"description":75},"handbook\u002Fsales\u002Findex","w2gjLCOgfs0gK5KVIfsYyRsHTGUJbfFVQVQguEmbKxk",{"id":42520,"title":42521,"body":42522,"description":75,"extension":81,"meta":42763,"navGroup":42764,"navOrder":83,"navTitle":42521,"navigation":84,"path":42765,"seo":42766,"stem":42767,"__hash__":42768},"handbook\u002Fhandbook\u002Fsales\u002Flegal.md","Legal",{"type":7,"value":42523,"toc":42751},[42524,42527,42531,42537,42540,42561,42570,42574,42577,42588,42591,42595,42603,42607,42610,42613,42621,42625,42628,42646,42649,42658,42662,42665,42679,42683,42686,42694,42697,42700,42717,42721],[10,42525,42521],{"id":42526},"legal",[14,42528,42530],{"id":42529},"collecting-signatures","Collecting Signatures",[19,42532,38009,42533,42536],{},[46,42534,31382],{"href":42535},"\u002Fhandbook\u002Foperations\u002Fsignatures\u002F"," page in Operations for procedures on collecting signatures and circulation requirements.",[14,42538,40757],{"id":42539},"subscription-agreement",[19,42541,42542,42543,42547,42548,42553,42554,42557,42558,42560],{},"For self-managed licenses FlowFuse has a standard\n",[46,42544,42546],{"href":42545},"\u002Fhandbook\u002Fsales\u002Fsubscription-agreement-1.5\u002F","subscription agreement template",".\nWhen a customer sends over their Standard terms before signing the subscription\nagreement, we have a\n",[46,42549,42552],{"href":42550,"rel":42551},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1US_eixmRtzzFHybl3l9woP0isrwvK2_t7nPXoKYiuq4\u002Fedit?tab=t.0#heading=h.w8522tz1d0cr",[108],"standard response overview",".\nAny redline or non-standard MSA review must also have a task in the ",[46,42555,40384],{"href":40382,"rel":42556},[108]," — see the ",[46,42559,40389],{"href":40388}," for required context.",[19,42562,42563,42564,42569],{},"All legal document reviews, including NDAs, MSAs, DPAs, security agreements, and customer paper, must be submitted through the ",[46,42565,42568],{"href":42566,"rel":42567},"https:\u002F\u002Fflowfuse.com\u002Fhandbook\u002Fsales\u002Fengagements\u002F#deal-approval-process-(deal-desk)",[108],"Deal Desk"," process in Asana before review or approval.",[14,42571,42573],{"id":42572},"accepted-payment-methods","Accepted Payment Methods",[19,42575,42576],{},"For self-service customers, Stripe handles the payments with a variaty of\nmethods. For Enterprise customers, FlowFuse accepts the following payment\nmethods for vendor payments:",[144,42578,42579,42582,42585],{},[147,42580,42581],{},"ACH (Automated Clearing House) bank transfers",[147,42583,42584],{},"Credit and debit card payments",[147,42586,42587],{},"Wire transfers",[19,42589,42590],{},"FlowFuse does not accept checks or other paper-based payment methods.",[14,42592,42594],{"id":42593},"professional-services-agreement","Professional Services agreement",[19,42596,42597,42598,549],{},"When a customer requires FlowFuse's professional services, this is the\n",[46,42599,42602],{"href":42600,"rel":42601},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1OsasRHu208IOarTiZXp_xLshJX7IKJqfTztgzgovCIA",[108],"Professional Services Agreement",[14,42604,42606],{"id":42605},"partnership-agreement","Partnership agreement",[19,42608,42609],{},"For partners who primarily identify potential opportunities and introduce\nFlowFuse to new clients, we offer a referral partnership program. In this model,\nonce a referral is made and acknowledged, FlowFuse takes the lead in managing\nthe sales cycle and the ongoing customer relationship, compensating the partner\nfor the successful referral. For the contract this is considered a \"Direct\"\ncustomer for the partnership agreement.",[19,42611,42612],{},"Furthermore, Value-Added Resellers (VARs) and System Integrators (SIs) are\ncrucial to our ecosystem. These partners often integrate FlowFuse into broader\nsolutions and deployment projects for their clients. They serve as the primary\nsupport contact for the end-user, backed by FlowFuse's expertise for escalated\nsupport issues, managing the commercial transaction with the end customer. For\nthe partnership agreement, these are considered \"Indirect\" customers, to which\nVARs and SIs might sublicense FlowFuse to.",[19,42614,42615,42616,549],{},"The partnership agreement is provided to the counter party through the Account\nExecutive. They can share our\n",[46,42617,42620],{"href":42618,"rel":42619},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1hlmu75o-QG6OsSoBG60v6c0uUMUi98Mz",[108],"standard referral agreement",[14,42622,42624],{"id":42623},"non-disclosure-agreement-nda","Non-disclosure agreement (NDA)",[19,42626,42627],{},"FlowFuse has templates for standard NDA's:",[144,42629,42630,42638],{},[147,42631,42632,42637],{},[46,42633,42636],{"href":42634,"rel":42635},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1r6a3qgYrfKwNnNwQwx2Wp63QiC_sHGHYca8f9IR_fCI",[108],"One way NDA"," -\nWhen the other parties cannot share to any third parties",[147,42639,42640,42645],{},[46,42641,42644],{"href":42642,"rel":42643},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1YiOQPbcEwbqpLcnrYjaui9ur1iLO_8Y3Ty4TOVJNiTk",[108],"Mutual NDA","{rel=\"nofollow} -\nNeither party can discuss details outside of the listed parties",[19,42647,42648],{},"If you need these for any discussions, please ask the PeopleOps Manager to send\nthem to the CEO and the counterparty.",[19,42650,42651,42652,42657],{},"Signed NDA documents should be stored on the\n",[46,42653,42656],{"href":42654,"rel":42655},"https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Fu\u002F1\u002Ffolders\u002F1BT1KY7B18N4JWlVGEnRsovhwiGnZkm5F",[108],"Google Drive","\nfor future reference.",[164,42659,42661],{"id":42660},"signing-a-non-flowfuse-provided-nda","Signing a non-FlowFuse provided NDA",[19,42663,42664],{},"Clauses we cannot agree to:",[504,42666,42667,42673,42676],{},[147,42668,42669,42670,549],{},"Only keeping Confidential Information at our legal offices. We're a fully\nremote company and keep Confidential Information according to our\n",[46,42671,42672],{"href":22195},"data classification policies",[147,42674,42675],{},"Auditability of destruction of Confidential Information. As a remote company\nwe will not allow third parties access to homes or offices of employees.",[147,42677,42678],{},"Lack of expiration of the NDA. Any NDA must include a defined term, generally 3 years,\nafter which the agreement expires.",[14,42680,42682],{"id":42681},"insurance-coverage","Insurance Coverage",[19,42684,42685],{},"FlowFuse maintains required insurance policies for operational and commercial purposes.",[19,42687,42688,42689,42693],{},"Authorized personnel may access insurance documents via the internal ",[46,42690,42692],{"href":31103,"rel":42691},[108],"Google Drive folder",". Requests for insurance documentation should be directed to Operations or PeopleOps.",[19,42695,42696],{},"The internal document also contains our insurance broker's contact information, policy renewal dates, and key coverage details.",[19,42698,42699],{},"To find employer liability insurance in Deel, follow these steps:",[504,42701,42702,42705,42708,42711,42714],{},[147,42703,42704],{},"Open Deel",[147,42706,42707],{},"Click on People",[147,42709,42710],{},"Click on Documents",[147,42712,42713],{},"Click on Registration & Files",[147,42715,42716],{},"Click on PEO Workers' Compensation Packet",[14,42718,42720],{"id":42719},"miscellaneous","Miscellaneous",[144,42722,42723,42730,42737,42744],{},[147,42724,42725],{},[46,42726,42729],{"href":42727,"rel":42728},"https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1A2_mnPRfc5gWAb4yEYNiViuCHiARkLcD\u002Fview",[108],"W9 with signature",[147,42731,42732],{},[46,42733,42736],{"href":42734,"rel":42735},"https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1ZYSMFZxCksvyPLDb9vDBcH41T6_SurPE\u002Fview?usp=sharing",[108],"Certificate of Insurance",[147,42738,42739],{},[46,42740,42743],{"href":42741,"rel":42742},"https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F11-gdRk-FNxQidcfZlmL7sDc3nDrLgnmW\u002Fview?usp=drive_link",[108],"Certificate of Status (California)",[147,42745,42746],{},[46,42747,42750],{"href":42748,"rel":42749},"https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1ol5lviVP7anxVqESebGiW3Ezku6fPAKx\u002Fview?usp=drive_link",[108],"Charter Admendment, Name Change",{"title":75,"searchDepth":76,"depth":76,"links":42752},[42753,42754,42755,42756,42757,42758,42761,42762],{"id":42529,"depth":76,"text":42530},{"id":42539,"depth":76,"text":40757},{"id":42572,"depth":76,"text":42573},{"id":42593,"depth":76,"text":42594},{"id":42605,"depth":76,"text":42606},{"id":42623,"depth":76,"text":42624,"children":42759},[42760],{"id":42660,"depth":605,"text":42661},{"id":42681,"depth":76,"text":42682},{"id":42719,"depth":76,"text":42720},{},"Customer Department","\u002Fhandbook\u002Fsales\u002Flegal",{"title":42521,"description":75},"handbook\u002Fsales\u002Flegal","2iESw8WyXxyrfjEhgpZ0X8ix0u4lzDevPldv__ov6lg",{"id":42770,"title":42317,"body":42771,"description":42777,"extension":81,"meta":42958,"navGroup":83,"navOrder":83,"navTitle":83,"navigation":84,"path":42316,"seo":42959,"stem":42960,"__hash__":42961},"handbook\u002Fhandbook\u002Fsales\u002Fmeetings\u002Fdemo.md",{"type":7,"value":42772,"toc":42952},[42773,42775,42778,42782,42791,42795,42920,42924,42932,42936,42944],[10,42774,42317],{"id":23226},[19,42776,42777],{},"This document explains the process of delivering a sales demo of the features of FlowFuse. It is not intended to cover all features but to give potential customers a good understanding of FlowFuse's value.\nThe demo outlined below is tailored for customers who are already familiar with Node-RED. A separate demo flow for Node-RED-unaware audiences is currently in development.",[14,42779,42781],{"id":42780},"setup-before-the-demo","Setup - Before the Demo",[19,42783,42784,42785,42790],{},"We have a team prepared on FlowFuse Cloud called ",[46,42786,42789],{"href":42787,"rel":42788},"https:\u002F\u002Fapp.flowfuse.com\u002Fteam\u002Facme-man-corp\u002Foverview",[108],"Acme Manufacturing Corp"," which includes everything you will need to complete this demo.",[14,42792,42794],{"id":42793},"script-for-flowfuse-demo","Script for FlowFuse Demo",[504,42796,42797,42813,42832,42863,42882,42904],{},[147,42798,42799,42802],{},[423,42800,42801],{},"Introduction to FlowFuse",[144,42803,42804,42807,42810],{},[147,42805,42806],{},"Explain that FlowFuse is a platform that allows users to host and manage instances of Node-RED, a popular open-source flow-based programming tool.",[147,42808,42809],{},"Mention that FlowFuse can be deployed in the cloud (e.g., AWS), on-premises, or in air-gapped networks, and the workflows demonstrated will work the same way regardless of the deployment model.",[147,42811,42812],{},"Highlight that FlowFuse provides a centralized way to manage multiple instances of Node-RED, both hosted directly on the FlowFuse server and remote instances running on edge devices.",[147,42814,42815,42818],{},[423,42816,42817],{},"Interacting with Remote Node-RED Instances",[144,42819,42820,42823,42826,42829],{},[147,42821,42822],{},"Demonstrate accessing a remote instance of Node-RED running on an edge device.",[147,42824,42825],{},"Explain the secure tunnel connection established from the web browser to the edge instance using HTTPS, which allows outbound-only connectivity from the edge to the FlowFuse server.",[147,42827,42828],{},"Open the Node-RED editor for the remote instance and show the flow that is simulating data from a production cell, including information about the current shift, temperature, cycle time, recipe, and production progress.",[147,42830,42831],{},"Highlight that the remote instances can continue to operate and collect data even when network connectivity to the FlowFuse server is intermittent, as the data is buffered and sent when the connection is restored.",[147,42833,42834,42837],{},[423,42835,42836],{},"DevOps Workflows",[144,42838,42839,42842,42845,42848,42851,42854,42857,42860],{},[147,42840,42841],{},"Make a simple change to the Node-RED flow, such as adding an inject node that outputs the string \"hello demo\".",[147,42843,42844],{},"Demonstrate the process of creating a new snapshot of the flow, which captures the specific versions of Node-RED and all dependencies.",[147,42846,42847],{},"Explain how the \"target\" setting ensures that the development instance will continue to run the new snapshot after the deployment, rather than reverting to a previous version.",[147,42849,42850],{},"Use the language model feature to automatically generate a concise description of the changes made to the flow.",[147,42852,42853],{},"Show how to deploy the new version from the development environment to the staging environment, highlighting the separation of concerns between the development and testing teams.",[147,42855,42856],{},"Explain the use of environment variables to manage different configurations (e.g., database credentials) for each stage (development, staging, production).",[147,42858,42859],{},"Deploy the new version from staging to the production environments in Japan, Europe, and the USA, demonstrating the speed and consistency of the deployment process.",[147,42861,42862],{},"Validate the deployment by opening a tunnel to one of the production instances and verifying that the \"hello demo\" change is present.",[147,42864,42865,42868],{},[423,42866,42867],{},"Data Aggregation and Visualization",[144,42869,42870,42873,42876,42879],{},[147,42871,42872],{},"Explain how the data from the remote Node-RED instances is being published to an MQTT topic using the Project Link nodes, which abstract away the complexity of setting up the MQTT broker.",[147,42874,42875],{},"Demonstrate a hosted instance of Node-RED that is subscribing to the MQTT topic and formatting the data, including identifying the source of each payload based on the environment variables.",[147,42877,42878],{},"Show the dashboard that is displaying the aggregated data from all the production cells, including the status (running, stopped), production metrics (actual vs. projected), temperature, and the ability to acknowledge and log stoppages.",[147,42880,42881],{},"Highlight the benefits of the Unified Namespace (UNS) approach, which makes the data easily accessible to any authorized application or user within the organization.",[147,42883,42884,42887],{},[423,42885,42886],{},"Additional Features",[144,42888,42889,42892,42895,42898,42901],{},[147,42890,42891],{},"Discuss the Bill of Materials feature, which provides an audit of all the software dependencies (Node-RED versions, custom nodes, etc.) used in the application.",[147,42893,42894],{},"Explain how this information can be used to quickly identify and update dependencies if a security vulnerability is discovered in a specific version.",[147,42896,42897],{},"Demonstrate the user management and role-based access control features, and how they integrate with the organization's identity provider (e.g., Microsoft, Google) for seamless user provisioning and de-provisioning.",[147,42899,42900],{},"Showcase the Team Library and Blueprints features, which allow sharing of best practices and reusable Node-RED flows within the organization.",[147,42902,42903],{},"Highlight how the Team Library can be used to share code snippets, while Blueprints provide complete, ready-to-use Node-RED flows for common use cases.",[147,42905,42906,42909],{},[423,42907,42908],{},"Conclusion",[144,42910,42911,42914,42917],{},[147,42912,42913],{},"Summarize the key capabilities of the FlowFuse platform demonstrated in the demo, such as remote Node-RED management, DevOps workflows, data aggregation, visualization, and the additional features that enhance collaboration and governance.",[147,42915,42916],{},"Emphasize how the platform can help organizations streamline their industrial automation and IoT initiatives by providing a centralized, secure, and scalable solution for managing their Node-RED deployments.",[147,42918,42919],{},"Encourage the audience to explore the FlowFuse platform further and consider how it could benefit their own use cases, whether in manufacturing, energy, transportation, or other industries.",[14,42921,42923],{"id":42922},"white-glove-onboarding-flow","White-Glove Onboarding Flow",[19,42925,42926,42927,549],{},"We've launched a new sign-up flow where we offer white-glove onboarding to all customers. It’s designed to provide a tailored experience based on a lead’s specific operational needs and technical maturity.\nThe process is triggered immediately when a customer signs up via the website, with HubSpot automatically handling contact creation.\nIt also includes steps through a live demo on how to provision the customer with the correct license and start their trial.\nThe entire flow, associated scripts, and documents can be ",[46,42928,42931],{"href":42929,"rel":42930},"https:\u002F\u002Fdocs.google.com\u002Fpresentation\u002Fd\u002F12-Jqi5I9J62L94lBa-Ddi6QATqEzHk4J1qvpfHKeGN4\u002Fedit?slide=id.p#slide=id.p",[108],"found here",[14,42933,42935],{"id":42934},"more-resources","More Resources",[19,42937,42938,42939,549],{},"A video recording of this demo can be ",[46,42940,42943],{"href":42941,"rel":42942},"https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1cHSSQVFol-EyfhHUYtJxSZp4_O7KMYhp\u002Fview?usp=sharing",[108],"accessed here",[19,42945,42946,42947,549],{},"The technical setup for this demo is ",[46,42948,42951],{"href":42949,"rel":42950},"https:\u002F\u002Fgithub.com\u002FFlowFuse\u002FCloudProject\u002Fblob\u002Fmain\u002Finfrastructure\u002Fdocs\u002Fsales_demo_environment.md",[108],"documented here",{"title":75,"searchDepth":76,"depth":76,"links":42953},[42954,42955,42956,42957],{"id":42780,"depth":76,"text":42781},{"id":42793,"depth":76,"text":42794},{"id":42922,"depth":76,"text":42923},{"id":42934,"depth":76,"text":42935},{},{"title":42317,"description":42777},"handbook\u002Fsales\u002Fmeetings\u002Fdemo","StECo9rVBKViKh0TeWayHcYrxq9Fbe_yhn5uD_dyDR4",{"id":42963,"title":366,"body":42964,"description":42968,"extension":81,"meta":42982,"navGroup":83,"navOrder":83,"navTitle":42983,"navigation":84,"path":42984,"seo":42985,"stem":42986,"__hash__":42987},"handbook\u002Fhandbook\u002Fsales\u002Fmeetings\u002Fdiscovery.md",{"type":7,"value":42965,"toc":42980},[42966,42969,42977],[19,42967,42968],{},"The goal of the discovery call is to get to know the prospective client and the\nproblem that FlowFuse may be able to help them.",[19,42970,42971,42972,549],{},"FlowFuse will use the \"Discovery Call Playbook\" in HubSpot, ",[46,42973,42976],{"href":42974,"rel":42975},"https:\u002F\u002Fknowledge.hubspot.com\u002Fplaybooks\u002Fuse-playbooks#use-playbooks-in-contact-company-deal-ticket-or-custom-crm-records",[108],"Learn how to use\nplaybooks",[19,42978,42979],{},"The next step depends on the outcome of the call, but usually results in a more technical discussion, product demonstration, or sending relevant content to follow-up on at an appropriate time in the future.",{"title":75,"searchDepth":76,"depth":76,"links":42981},[],{},"Discovery Meeting","\u002Fhandbook\u002Fsales\u002Fmeetings\u002Fdiscovery",{"description":42968},"handbook\u002Fsales\u002Fmeetings\u002Fdiscovery","Sz6qe1FTKHd1eVsCmd81CHwKVuLIQAayRy94AmonLCY",{"id":42989,"title":75,"body":42990,"description":42994,"extension":81,"meta":43152,"navGroup":83,"navOrder":83,"navTitle":43153,"navigation":84,"path":43154,"seo":43155,"stem":43156,"__hash__":43157},"handbook\u002Fhandbook\u002Fsales\u002Fmeetings\u002Findex.md",{"type":7,"value":42991,"toc":43140},[42992,42995,42999,43002,43005,43008,43012,43019,43025,43031,43035,43038,43042,43058,43062,43070,43074,43082,43086,43097,43101,43109,43125,43129],[19,42993,42994],{},"To understand the prospective customers needs and how FlowFuse can help a process\nhas been created to enhance their experience. Almost all engagements with customers\nare on virtual sites, generally Google Meet.",[14,42996,42998],{"id":42997},"meeting-a-customer","Meeting a customer",[19,43000,43001],{},"For internal training purposes all sales calls should be recorded after getting\nexplicit consent from the customer. On request of the customer, the recording\nwill be shared.",[19,43003,43004],{},"The organizer of the meeting should perform pre-call preparation, including\nresearch on the prospective customer, any goals they have shared, any goals we\nhave, and any relevant background information so all FlowFuse participants can\nknow what to expect.",[19,43006,43007],{},"For each meeting, be 2 minutes early. This allows everyone to check their setup\nand sync up what the goals are for the meeting.",[14,43009,43011],{"id":43010},"meeting-structure","Meeting structure",[19,43013,43014,43015,549],{},"The number of times FlowFuse will meet with a customer depends mostly on the\ncustomer. However, in all cases FlowFuse would like to have an initial\n",[46,43016,43018],{"href":43017},"\u002Fhandbook\u002Fsales\u002Fmeetings\u002Fdiscovery\u002F","Discovery Call",[19,43020,43021,43022,549],{},"A discovery call is generally followed by a ",[46,43023,42317],{"href":43024},"\u002Fhandbook\u002Fsales\u002Fmeetings\u002Fdemo\u002F",[19,43026,43027,43028,549],{},"To validate the solution to the problem the customer is experiencing, FlowFuse will\naid in a ",[46,43029,43030],{"href":26498},"POC",[14,43032,43034],{"id":43033},"using-fathom-notetaker","Using Fathom Notetaker",[19,43036,43037],{},"Fathom Notetaker is an AI-powered tool we use to record, transcribe, and summarize meetings efficiently. This guide will help beginners get started with Fathom, ensuring you can focus on collaboration rather than manual note-taking.",[164,43039,43041],{"id":43040},"install-fathom","Install Fathom",[504,43043,43044,43052,43055],{},[147,43045,43046,43047,43051],{},"Download the Fathom desktop app from the official website (",[46,43048,43049],{"href":43049,"rel":43050},"https:\u002F\u002Ffathom.video\u002F",[108],") or install the browser extension for your preferred video conferencing platform (e.g., Zoom, Google Meet).",[147,43053,43054],{},"Sign in using your FlowFuse-provided email to ensure proper team integration.",[147,43056,43057],{},"Link your Google Calendar to allow Fathom to auto-join your meetings.",[164,43059,43061],{"id":43060},"join-a-meeting","Join a Meeting",[504,43063,43064,43067],{},[147,43065,43066],{},"Open your video conferencing tool and start or join a meeting as usual.",[147,43068,43069],{},"Fathom should detect the active meeting automatically and appear in the waiting room at the scheduled start time. Occasionally there will be a small delay.\n1 . If the \"FlowFuse Notetaker\" does not appear after a minute, you can manually invite it by clicking the Fathom logo on the lower left side of the Google Meet control bar.",[164,43071,43073],{"id":43072},"let-fathom-record","Let Fathom Record",[504,43075,43076,43079],{},[147,43077,43078],{},"Once activated, Fathom will record audio, transcribe speech in real-time, and identify speakers. No action is needed during the meeting — focus on the conversation!",[147,43080,43081],{},"If you want to highlight a key moment, click the “Highlight” button in Fathom’s interface (a star icon) to mark it for later.",[164,43083,43085],{"id":43084},"review-notes-post-meeting","Review Notes Post-Meeting",[504,43087,43088,43091,43094],{},[147,43089,43090],{},"After the meeting ends, Fathom will process the recording (this takes a few minutes). You’ll receive a notification when it’s ready.",[147,43092,43093],{},"Access the transcription and AI-generated summary via the Fathom dashboard (log in at fathom.video). Check the “Highlights” section for flagged moments.",[147,43095,43096],{},"You can prompt the AI for specific questions based on the call using the \"Ask Fathom\" section.",[164,43098,43100],{"id":43099},"share-with-the-team","Share with the Team",[504,43102,43103,43106],{},[147,43104,43105],{},"Click “Share” in the Fathom dashboard to generate a link or download the notes as a PDF.",[147,43107,43108],{},"Paste the link in our team Slack channel or email it to relevant colleagues—keep everyone in the loop effortlessly.",[19,43110,43111,43113,43114,43117,43118,43120,43121,43124],{},[423,43112,11368],{},": the url generated by the Share button (",[542,43115,43116],{},"https:\u002F\u002Ffathom.video\u002Fshare\u002FABCEDFG",") gives fully public access to the recording. It should ",[2562,43119,31546],{}," be posted in public spaces such as GitHub issues unless the content is appropriate to do so. If in doubt, use the page URL (",[542,43122,43123],{},"https:\u002F\u002Ffathom.video\u002Fcalls\u002F12345",") as that will require users to login to view, or provide the share link privately.",[164,43126,43128],{"id":43127},"sharing-externally","Sharing externally",[504,43130,43131,43134,43137],{},[147,43132,43133],{},"Prior to sharing the call with external attendees, ensure there is no internal dialogue included before or after they joined.",[147,43135,43136],{},"If there are portions you'd like to remove, go to the \"Transcript\" tab, find the parts to remove and click the three buttons on the right side of the text. This will allow you to remove specific portions or entire conversations. The video and transcript are both clipped using this method, although it may take a few minutes to reflect changes.",[147,43138,43139],{},"You must own the meeting in order to be able to trim the transcript.",{"title":75,"searchDepth":76,"depth":76,"links":43141},[43142,43143,43144],{"id":42997,"depth":76,"text":42998},{"id":43010,"depth":76,"text":43011},{"id":43033,"depth":76,"text":43034,"children":43145},[43146,43147,43148,43149,43150,43151],{"id":43040,"depth":605,"text":43041},{"id":43060,"depth":605,"text":43061},{"id":43072,"depth":605,"text":43073},{"id":43084,"depth":605,"text":43085},{"id":43099,"depth":605,"text":43100},{"id":43127,"depth":605,"text":43128},{},"Sales Meetings","\u002Fhandbook\u002Fsales\u002Fmeetings",{"description":42994},"handbook\u002Fsales\u002Fmeetings\u002Findex","nRq-HTxb_OLFdJ5v023F-mBlFCM8V5gU0U0xk7HHI1g",{"id":43159,"title":43160,"body":43161,"description":75,"extension":81,"meta":43256,"navGroup":83,"navOrder":83,"navTitle":43166,"navigation":84,"path":43257,"seo":43258,"stem":43259,"__hash__":43260},"handbook\u002Fhandbook\u002Fsales\u002Fmeetings\u002Fpoc.md","Poc",{"type":7,"value":43162,"toc":43248},[43163,43167,43171,43179,43183,43191,43195,43203,43207,43216,43220,43239],[14,43164,43166],{"id":43165},"proof-of-concept","Proof of Concept",[164,43168,43170],{"id":43169},"cloud-trial","Cloud trial",[19,43172,43173,43174,43178],{},"If the prospect would like to trial FlowFuse Cloud, they are able to self-service at ",[46,43175,43176],{"href":43176,"rel":43177},"https:\u002F\u002Fapp.flowfuse.com\u002Faccount\u002Fcreate",[108],". This will give them a 30-day trial of the Pro tier. If they would like to test with Enterprise features, you can apply a coupon code to their Stripe account and elevate their Tier, after they create their trial account.",[239,43180,43182],{"id":43181},"extending-a-trial","Extending a trial",[19,43184,43185,43186,43190],{},"To extend the trial period, including if a trial has expired already, use the 'Extend Trial' button on the Team Settings page. This is only available to platform Administrators. If you do not have admin access, raise a ",[46,43187,43189],{"href":12951,"rel":43188},[108],"CloudProject change request"," with details.",[164,43192,43194],{"id":43193},"self-hosted-trial","Self-hosted trial",[19,43196,43197,43198,43202],{},"If a self-hosted trial is desired, you need to ",[46,43199,43201],{"href":43200},"\u002Fhandbook\u002Fsales\u002Fmeetings\u002Fpoc\u002F#generating-a-license","generate a license key"," to unlock paid-for features.\nEvery self-hosted POC call should have an engineer present.",[164,43204,43206],{"id":43205},"poc-criteria","POC Criteria",[19,43208,43209,43210,43215],{},"During the initial POC meeting, the ",[46,43211,43214],{"href":43212,"rel":43213},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1Dr5S9b9dm7Zn84rx-xV9_AvpEwjUPxSk8ZfQDBgpBgQ\u002Fedit",[108],"POC Criteria document"," should be completed by both FlowFuse and the prospective customer. This ensures both parties are clear about what needs to be technically validated and what the next steps are after the testing is complete.",[164,43217,43219],{"id":43218},"generating-a-license","Generating a license",[144,43221,43222,43230,43233,43236],{},[147,43223,43224,43225,549],{},"Generate one by ",[46,43226,43229],{"href":43227,"rel":43228},"https:\u002F\u002Fenergetic-sanderling-4472.flowfuse.cloud\u002Fdashboard\u002Flicense",[108],"filling out this form",[147,43231,43232],{},"Trial license expiry date should be set for 30 days, even in cases where longer than 30 days may be warranted.",[147,43234,43235],{},"Include 10 users, 10 teams, and 10 Node-RED instances on the Enterprise Tier.",[147,43237,43238],{},"Trial extensions need to be approved by management.",[19,43240,43241,43242,43247],{},"All generated licenses are added ",[46,43243,43246],{"href":43244,"rel":43245},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1wM_o8IWjjkwi-WMRueKfS-lrmkQYzV83xm4BIzZNAO0",[108],"to this sheet"," automatically.",{"title":75,"searchDepth":76,"depth":76,"links":43249},[43250],{"id":43165,"depth":76,"text":43166,"children":43251},[43252,43253,43254,43255],{"id":43169,"depth":605,"text":43170},{"id":43193,"depth":605,"text":43194},{"id":43205,"depth":605,"text":43206},{"id":43218,"depth":605,"text":43219},{},"\u002Fhandbook\u002Fsales\u002Fmeetings\u002Fpoc",{"description":75},"handbook\u002Fsales\u002Fmeetings\u002Fpoc","5ETjPmlgSo1Mm0O1SbQ6MMFZTHECFQT7ChUorrOxBxY",{"id":43262,"title":42307,"body":43263,"description":43549,"extension":81,"meta":43550,"navGroup":83,"navOrder":83,"navTitle":83,"navigation":84,"path":42306,"seo":43551,"stem":43552,"__hash__":43553},"handbook\u002Fhandbook\u002Fsales\u002Foperating-principles.md",{"type":7,"value":43264,"toc":43536},[43265,43268,43271,43273,43276,43280,43283,43300,43304,43307,43321,43325,43328,43354,43358,43361,43381,43385,43388,43416,43420,43423,43440,43444,43447,43464,43468,43471,43488,43492,43495,43509,43513,43516,43533],[10,43266,42307],{"id":43267},"sales-team-operating-principles",[19,43269,43270],{},"The Sales Team Operating Principles define how FlowFuse sales team members conduct themselves in internal and external interactions. These principles create consistency, set expectations, and support a high-performing sales organization.",[14,43272,928],{"id":3412},[19,43274,43275],{},"These principles outline the professional behaviors, standards, and habits required to represent FlowFuse effectively.\nThey apply to all Sales team members and complement related pages in the Sales Handbook, including Discovery, Follow-Up, SPICED, and CRM Requirements.",[14,43277,43279],{"id":43278},"professional-presence","Professional Presence",[19,43281,43282],{},"Sales team members represent FlowFuse at all times. Expectations:",[144,43284,43285,43288,43291,43294,43297],{},[147,43286,43287],{},"Join meetings from a professional, quiet, and distraction-free environment",[147,43289,43290],{},"Ensure stable internet and high-quality audio",[147,43292,43293],{},"Keep cameras on for customer-facing meetings unless the customer prefers otherwise",[147,43295,43296],{},"Maintain a focused presence, avoiding multitasking or unrelated work",[147,43298,43299],{},"Present a professional appearance consistent with the meeting audience",[14,43301,43303],{"id":43302},"punctuality-and-preparation","Punctuality and Preparation",[19,43305,43306],{},"Being prepared and on time reflects professionalism and respect:",[144,43308,43309,43312,43315,43318],{},[147,43310,43311],{},"Arrive 3–5 minutes early to all calls",[147,43313,43314],{},"Test audio and video before joining",[147,43316,43317],{},"Have all required content ready: presentation, demo, documents, pricing ranges, links",[147,43319,43320],{},"Confirm the meeting agenda at the start of the call",[14,43322,43324],{"id":43323},"meeting-preparedness","Meeting Preparedness",[19,43326,43327],{},"Every meeting requires clear preparation and shared expectations. Sales team members:",[144,43329,43330,43333,43336,43339,43342,43345,43348,43351],{},[147,43331,43332],{},"Review previous call notes, Fathom transcripts, HubSpot activity, and prior correspondence",[147,43334,43335],{},"Research the company, use case, buyer personas, and relevant industry context",[147,43337,43338],{},"Identify known pains, buying stage, and expected outcomes",[147,43340,43341],{},"Send an agenda to internal participants before the meeting",[147,43343,43344],{},"When appropriate, send a brief agenda to external participants",[147,43346,43347],{},"Ensure internal participants understand roles and talking points",[147,43349,43350],{},"Prepare and test all demo environments, data, or assets required",[147,43352,43353],{},"Develop tailored questions that reflect knowledge of the account and prior conversations",[14,43355,43357],{"id":43356},"meeting-and-call-excellence","Meeting and Call Excellence",[19,43359,43360],{},"Sales calls follow the standards outlined in the Sales Methodology:",[144,43362,43363,43366,43369,43372,43375,43378],{},[147,43364,43365],{},"Use Fathom Notetaker for all customer calls",[147,43367,43368],{},"Follow the SPICED discovery framework",[147,43370,43371],{},"Validate understanding during and at the end of the meeting",[147,43373,43374],{},"Avoid over-committing or speculating on product delivery",[147,43376,43377],{},"Loop in Solution Engineering, Product, or Customer Success early when support is needed",[147,43379,43380],{},"Maintain a calm, confident, advisory tone throughout",[14,43382,43384],{"id":43383},"follow-through-and-responsiveness","Follow-Through and Responsiveness",[19,43386,43387],{},"Timely follow-up maintains momentum and demonstrates reliability:",[144,43389,43390,43407,43410,43413],{},[147,43391,43392,43393],{},"Send a same-day follow-up email after every meeting",[144,43394,43395,43398,43401,43404],{},[147,43396,43397],{},"Key takeaways",[147,43399,43400],{},"How FlowFuse can help",[147,43402,43403],{},"Agreed next steps",[147,43405,43406],{},"Any materials promised during the call",[147,43408,43409],{},"Update HubSpot immediately with notes, next steps, stakeholders, and tasks",[147,43411,43412],{},"Respond to all customer messages within one business day",[147,43414,43415],{},"Create tasks for internal teams when support is required",[14,43417,43419],{"id":43418},"internal-collaboration","Internal Collaboration",[19,43421,43422],{},"Sales operates as a single team. Expectations:",[144,43424,43425,43428,43431,43434,43437],{},[147,43426,43427],{},"Ask for help early to avoid delays later in the cycle",[147,43429,43430],{},"Use shared Slack channels for visibility",[147,43432,43433],{},"Provide full context when requesting assistance from other teams",[147,43435,43436],{},"Share common objections, patterns, and discoveries with Sales leadership",[147,43438,43439],{},"Use internal communication tools consistently and transparently",[14,43441,43443],{"id":43442},"data-hygiene-and-operational-discipline","Data Hygiene and Operational Discipline",[19,43445,43446],{},"Accurate CRM and process discipline ensure high-quality forecasting and customer experience:",[144,43448,43449,43452,43455,43458,43461],{},[147,43450,43451],{},"Keep HubSpot records accurate, complete, and up to date",[147,43453,43454],{},"Log meetings and communications the same day",[147,43456,43457],{},"Move deals through stages only when exit criteria are met",[147,43459,43460],{},"Document next steps clearly, with ownership and timing",[147,43462,43463],{},"Store pricing proposals, order forms, and documents correctly and consistently",[14,43465,43467],{"id":43466},"professional-ethics-and-conduct","Professional Ethics and Conduct",[19,43469,43470],{},"Sales team members uphold FlowFuse’s values and maintain customer trust:",[144,43472,43473,43476,43479,43482,43485],{},[147,43474,43475],{},"Represent product capabilities and pricing with accuracy",[147,43477,43478],{},"Maintain confidentiality and follow NDA requirements",[147,43480,43481],{},"Escalate concerns, risks, or misaligned expectations immediately",[147,43483,43484],{},"Treat customers, partners, and colleagues with professionalism and respect",[147,43486,43487],{},"Avoid behaviors that could damage FlowFuse’s reputation",[14,43489,43491],{"id":43490},"continuous-improvement","Continuous Improvement",[19,43493,43494],{},"FlowFuse sales culture emphasizes learning, growth, and refinement:",[144,43496,43497,43500,43503,43506],{},[147,43498,43499],{},"Participate actively in call reviews and team training",[147,43501,43502],{},"Regularly self-review calls and opportunities",[147,43504,43505],{},"Stay current on product releases, industrial trends, and competitive landscape",[147,43507,43508],{},"Identify personal improvement areas and work on them consistently",[14,43510,43512],{"id":43511},"accountability","Accountability",[19,43514,43515],{},"These principles guide expectations for professional conduct.\nSales leadership reinforces them through:",[144,43517,43518,43521,43524,43527,43530],{},[147,43519,43520],{},"Coaching",[147,43522,43523],{},"Performance reviews",[147,43525,43526],{},"Pipeline reviews",[147,43528,43529],{},"Deal inspections",[147,43531,43532],{},"Feedback sessions",[19,43534,43535],{},"The goal is consistency, excellence, and trust.",{"title":75,"searchDepth":76,"depth":76,"links":43537},[43538,43539,43540,43541,43542,43543,43544,43545,43546,43547,43548],{"id":3412,"depth":76,"text":928},{"id":43278,"depth":76,"text":43279},{"id":43302,"depth":76,"text":43303},{"id":43323,"depth":76,"text":43324},{"id":43356,"depth":76,"text":43357},{"id":43383,"depth":76,"text":43384},{"id":43418,"depth":76,"text":43419},{"id":43442,"depth":76,"text":43443},{"id":43466,"depth":76,"text":43467},{"id":43490,"depth":76,"text":43491},{"id":43511,"depth":76,"text":43512},"Professional standards and expectations for the FlowFuse Sales organization.",{},{"title":42307,"description":43549},"handbook\u002Fsales\u002Foperating-principles","U-7cwhRpM2NthDQFKPW5c-1aipI8QGlTMMvrnYtR1SI",{"id":43555,"title":43556,"body":43557,"description":75,"extension":81,"meta":43791,"navGroup":40452,"navOrder":83,"navTitle":43556,"navigation":84,"path":43792,"seo":43793,"stem":43794,"__hash__":43795},"handbook\u002Fhandbook\u002Fsales\u002Forg\u002Faccount-executives\u002Findex.md","Account Executives",{"type":7,"value":43558,"toc":43782},[43559,43562,43564,43567,43570,43572,43576,43579,43615,43622,43624,43628,43634,43654,43657,43659,43663,43666,43690,43697,43699,43703,43706,43723,43726,43728,43732,43735,43749,43752,43754,43758,43768,43779],[10,43560,43556],{"id":43561},"account-executives",[14,43563,928],{"id":3412},[19,43565,43566],{},"The Account Executives at FlowFuse are responsible for leading customer-facing commercial engagements from initial qualification through contract execution.\nAccount Executives own opportunity progression, commercial outcomes, and deal accountability, while working in close collaboration with other functions across the Commercial Organization.",[19,43568,43569],{},"Account Executives at FlowFuse are not a transactional function. They operate as the primary orchestrators of complex, multi-stakeholder buying processes and are accountable for guiding customers toward informed, high-confidence decisions.",[3601,43571],{},[14,43573,43575],{"id":43574},"scope-and-responsibilities","Scope and Responsibilities",[19,43577,43578],{},"Account Executives own:",[144,43580,43581,43589,43597,43600,43603,43606,43609,43612],{},[147,43582,43583,43584,43588],{},"Managing all leads from ",[46,43585,43587],{"href":43586},"\u002Fhandbook\u002Fsales\u002Fhubspot\u002F#mql-follow-up-expectations","MQL stage"," onwards, including daily review and outreach",[147,43590,43591,43592,43596],{},"Generating 30% of their own pipeline through ",[46,43593,43595],{"href":43594},"\u002Fhandbook\u002Fsales\u002Fhubspot\u002F#outbound","Cold Outbound"," activities",[147,43598,43599],{},"Opportunity qualification and prioritization",[147,43601,43602],{},"Deal progression through defined sales stages",[147,43604,43605],{},"Commercial positioning and value articulation",[147,43607,43608],{},"Pricing, proposals, and contract negotiation",[147,43610,43611],{},"Forecast accuracy and pipeline discipline",[147,43613,43614],{},"Commercial close and handoff readiness",[19,43616,43617,43618,43621],{},"Account Executives are accountable for ",[423,43619,43620],{},"commercial outcomes",", even when execution involves Solution Engineering, Customer Success, Professional Services, or Sales Partnerships.",[3601,43623],{},[14,43625,43627],{"id":43626},"sales-owned-processes","Sales-Owned Processes",[19,43629,43630,43631,43633],{},"Account Executives own the following customer-facing sales processes. These processes define ",[2562,43632,15776],{}," Account Executives engage customers in different buying contexts.",[144,43635,43636,43645],{},[147,43637,43638,43640,43641],{},[423,43639,40031],{},"\nUsed when customers are evaluating how to standardize or modernize edge connectivity across systems or sites.\n→ ",[46,43642,43644],{"href":43643},"\u002Fhandbook\u002Fsales\u002Fprocesses\u002F","View process",[147,43646,43647,43650,43651],{},[423,43648,43649],{},"Node-RED Scale Sales Process","\nUsed when customers are already using Node-RED and need governance, security, and scale.\n→ ",[2562,43652,43653],{},"Coming soon",[19,43655,43656],{},"Each process defines meeting goals, exit criteria, and collaboration points with other functions.",[3601,43658],{},[14,43660,43662],{"id":43661},"collaboration-model","Collaboration Model",[19,43664,43665],{},"Account Executives operate in close partnership with other functions in the Commercial Organization:",[144,43667,43668,43674,43679,43684],{},[147,43669,43670,43673],{},[423,43671,43672],{},"Solution Engineering","\nSupports technical discovery, demos, and proof-of-concept delivery.",[147,43675,43676,43678],{},[423,43677,22442],{},"\nProvides input on adoption risks, renewal considerations, and expansion opportunities.",[147,43680,43681,43683],{},[423,43682,38948],{},"\nSupports scoped delivery planning, enablement, and services-led engagements.",[147,43685,43686,43689],{},[423,43687,43688],{},"Sales Partnerships","\nSupports partner-led and co-sell opportunities.",[19,43691,43692,43693,43696],{},"While collaboration is essential, ",[423,43694,43695],{},"Account Executives remain accountable"," for opportunity progression and commercial decision-making.",[3601,43698],{},[14,43700,43702],{"id":43701},"metrics-and-accountability","Metrics and Accountability",[19,43704,43705],{},"Account Executive performance is measured by:",[144,43707,43708,43711,43714,43717,43720],{},[147,43709,43710],{},"Qualified pipeline coverage",[147,43712,43713],{},"Forecast accuracy by stage",[147,43715,43716],{},"Win rate and sales cycle duration",[147,43718,43719],{},"Average contract value and deal quality",[147,43721,43722],{},"Progression and conversion between stages",[19,43724,43725],{},"These metrics reinforce disciplined execution and predictable outcomes.",[3601,43727],{},[14,43729,43731],{"id":43730},"tools-and-systems","Tools and Systems",[19,43733,43734],{},"Account Executives primarily use the following systems to execute their responsibilities:",[144,43736,43737,43740,43743,43746],{},[147,43738,43739],{},"CRM for opportunity management and forecasting",[147,43741,43742],{},"Proposal and quoting tools for pricing and contracts",[147,43744,43745],{},"Scheduling and communication tools for customer engagement",[147,43747,43748],{},"Documentation systems for value narratives and deal context",[19,43750,43751],{},"Detailed guidance on tools and systems is documented separately.",[3601,43753],{},[14,43755,43757],{"id":43756},"how-this-page-is-used","How This Page Is Used",[19,43759,43760,43761,43764,43765,43767],{},"This page defines ",[423,43762,43763],{},"what Account Executives own",".\nDetailed guidance on ",[2562,43766,15776],{}," Account Executives execute is documented in:",[144,43769,43770,43773,43776],{},[147,43771,43772],{},"Sales process pages",[147,43774,43775],{},"Playbooks and enablement materials",[147,43777,43778],{},"Systems and tools documentation",[19,43780,43781],{},"This separation is intentional to keep ownership clear and execution flexible.",{"title":75,"searchDepth":76,"depth":76,"links":43783},[43784,43785,43786,43787,43788,43789,43790],{"id":3412,"depth":76,"text":928},{"id":43574,"depth":76,"text":43575},{"id":43626,"depth":76,"text":43627},{"id":43661,"depth":76,"text":43662},{"id":43701,"depth":76,"text":43702},{"id":43730,"depth":76,"text":43731},{"id":43756,"depth":76,"text":43757},{},"\u002Fhandbook\u002Fsales\u002Forg\u002Faccount-executives",{"title":43556,"description":75},"handbook\u002Fsales\u002Forg\u002Faccount-executives\u002Findex","952sbV0me0oUwgLvN4ybbPhAl_4zMMBrNK76Xsi6ZIE",{"id":43797,"title":43798,"body":43799,"description":75,"extension":81,"meta":43908,"navGroup":40452,"navOrder":83,"navTitle":43798,"navigation":84,"path":43909,"seo":43910,"stem":43911,"__hash__":43912},"handbook\u002Fhandbook\u002Fsales\u002Forg\u002Findex.md","Commercial Organization",{"type":7,"value":43800,"toc":43902},[43801,43804,43806,43809,43812,43814,43816,43819,43839,43842,43844,43846,43849,43876,43879,43881,43885,43899],[10,43802,43798],{"id":43803},"commercial-organization",[14,43805,928],{"id":3412},[19,43807,43808],{},"The Commercial Organization at FlowFuse is responsible for guiding customers from initial engagement through adoption, expansion, and long-term success.\nIt owns the customer-facing commercial motions that turn product capability into realized business value.",[19,43810,43811],{},"This organization balances revenue responsibility with customer outcomes, ensuring that growth is durable, scalable, and aligned with how customers actually adopt and operate FlowFuse.",[3601,43813],{},[14,43815,43575],{"id":43574},[19,43817,43818],{},"The Commercial Organization owns:",[144,43820,43821,43824,43827,43830,43833,43836],{},[147,43822,43823],{},"Customer engagement from first commercial interaction through renewal and expansion",[147,43825,43826],{},"Commercial qualification, progression, and close",[147,43828,43829],{},"Technical validation and solution alignment",[147,43831,43832],{},"Customer onboarding, adoption, and renewal readiness",[147,43834,43835],{},"Scoped delivery and enablement services",[147,43837,43838],{},"Partner-led commercial motions",[19,43840,43841],{},"While individual functions own specific processes, the Commercial Organization operates as a coordinated system with shared accountability for customer and commercial outcomes.",[3601,43843],{},[14,43845,2886],{"id":3039},[19,43847,43848],{},"The Commercial Organization is composed of the following functions:",[144,43850,43851,43856,43861,43866,43871],{},[147,43852,43853,43855],{},[423,43854,43556],{},"\nOwns opportunity qualification, deal progression, and commercial close.",[147,43857,43858,43860],{},[423,43859,43672],{},"\nOwns technical discovery, validation, demos, and proof-of-concept delivery.",[147,43862,43863,43865],{},[423,43864,22442],{},"\nOwns onboarding, adoption, health monitoring, renewal readiness, and expansion signals.",[147,43867,43868,43870],{},[423,43869,38948],{},"\nOwns scoped delivery, enablement engagements, and post-engagement handoff.",[147,43872,43873,43875],{},[423,43874,43688],{},"\nOwns partner identification, enablement, co-sell motions, and partner performance.",[19,43877,43878],{},"Each function has clear ownership while operating in close collaboration with the others across the customer lifecycle.",[3601,43880],{},[14,43882,43884],{"id":43883},"how-to-navigate-this-section","How to Navigate This Section",[144,43886,43887,43890,43896],{},[147,43888,43889],{},"Function-specific responsibilities and mandates are documented under each department page.",[147,43891,43892,43893,9745],{},"Sales-owned customer-facing motions are documented in the ",[423,43894,43895],{},"Processes",[147,43897,43898],{},"Supporting guidance on systems, tools, working norms, and lifecycle alignment is documented in dedicated pages.",[19,43900,43901],{},"This structure is intentional: ownership is explicit, collaboration is expected, and accountability is clear.",{"title":75,"searchDepth":76,"depth":76,"links":43903},[43904,43905,43906,43907],{"id":3412,"depth":76,"text":928},{"id":43574,"depth":76,"text":43575},{"id":3039,"depth":76,"text":2886},{"id":43883,"depth":76,"text":43884},{},"\u002Fhandbook\u002Fsales\u002Forg",{"title":43798,"description":75},"handbook\u002Fsales\u002Forg\u002Findex","OzwCUOv35RO_OmTooM4MwL-pmGN9JZGfoSb5Q2yZj9o",{"id":43914,"title":43915,"body":43916,"description":43970,"extension":81,"meta":43971,"navGroup":83,"navOrder":83,"navTitle":43915,"navigation":84,"path":43972,"seo":43973,"stem":43974,"__hash__":43975},"handbook\u002Fhandbook\u002Fsales\u002Fpartnerships.md","Partnerships",{"type":7,"value":43917,"toc":43966},[43918,43921,43929,43933,43947,43951,43954,43957],[10,43919,43915],{"id":43920},"partnerships",[19,43922,43923,43924,549],{},"FlowFuse engages with both hardware parters and referral partners. Here are ",[46,43925,43928],{"href":43926,"rel":43927},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1BVls7LEC1CBQ6wlrb8GeWSYr2vj9fMqgdsWiWLoQZOY\u002Fedit#heading=h.gjdgxs",[108],"our standard terms",[14,43930,43932],{"id":43931},"reseller-agreement","Reseller Agreement",[19,43934,43935,43936,43940,43941,43946],{},"For reseller partnerships, please refer to our ",[46,43937,43932],{"href":43938,"rel":43939},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F1uaRahdTSWYxMvejAXlg0FT-WYXXpcEEKKMPGDtrhf4g",[108],". Upon signing, partners will also receive access to our ",[46,43942,43945],{"href":43943,"rel":43944},"https:\u002F\u002Fdocs.google.com\u002Fdocument\u002Fd\u002F16_ebDfXdC9tenUOhOA5-sTDnJBN2aqTZ4vmqmfJ7v9I",[108],"Deal Registration Form"," for opportunity tracking.",[14,43948,43950],{"id":43949},"partnership-requirements","Partnership Requirements",[19,43952,43953],{},"FlowFuse also continues to build its partner channel by working with strategic System Integrators.",[19,43955,43956],{},"When there's interest in becoming a partner FlowFuse requires a project to collaborate on jointly.\nImplementation projects structure the partnership and learning on both sides.",[19,43958,43959,43960,43965],{},"Please ",[46,43961,43964],{"href":43962,"rel":43963},"https:\u002F\u002Fflowfuse.com\u002Fpartners\u002F",[108],"contact us"," to discuss and complete an agreement.",{"title":75,"searchDepth":76,"depth":76,"links":43967},[43968,43969],{"id":43931,"depth":76,"text":43932},{"id":43949,"depth":76,"text":43950},"FlowFuse engages with both hardware parters and referral partners. Here are our standard terms.",{},"\u002Fhandbook\u002Fsales\u002Fpartnerships",{"title":43915,"description":43970},"handbook\u002Fsales\u002Fpartnerships","8GY3Du1SczGXB8ExC6uh83X6dRUNOp0YDvAQcVK0-dU",{"id":43977,"title":43895,"body":43978,"description":43985,"extension":81,"meta":44147,"navGroup":40452,"navOrder":83,"navTitle":43895,"navigation":84,"path":44148,"seo":44149,"stem":44150,"__hash__":44151},"handbook\u002Fhandbook\u002Fsales\u002Fprocesses\u002Findex.md",{"type":7,"value":43979,"toc":44137},[43980,43983,43986,43988,43991,43993,44001,44006,44008,44011,44018,44022,44024,44028,44031,44048,44053,44055,44059,44062,44079,44083,44085,44089,44092,44106,44110,44112,44116,44119,44133],[10,43981,43895],{"id":43982},"processes",[19,43984,43985],{},"This page is a navigation index for the core processes and methodologies used across the Commercial Organization.\nEach process is owned by a specific function, with other functions contributing as needed.",[3601,43987],{},[14,43989,43990],{"id":43626},"Sales-owned processes",[164,43992,40031],{"id":40036},[19,43994,43995,40042,43997,44000],{},[423,43996,40041],{},[423,43998,43999],{},"Used when:"," The customer is evaluating how to standardize or modernize edge connectivity across systems or sites.",[19,44002,44003,44004],{},"→ ",[46,44005,43644],{"href":40453},[3601,44007],{},[164,44009,43649],{"id":44010},"node-red-scale-sales-process",[19,44012,44013,40042,44015,44017],{},[423,44014,40041],{},[423,44016,43999],{}," The customer is already using Node-RED and needs governance, security, and scale.",[19,44019,44003,44020],{},[2562,44021,43653],{},[3601,44023],{},[14,44025,44027],{"id":44026},"solution-engineering-owned-processes","Solution Engineering-owned processes",[19,44029,44030],{},"These processes support Sales-led motions and ensure technical validation and delivery readiness.",[144,44032,44033,44036,44042,44045],{},[147,44034,44035],{},"Discovery support",[147,44037,44038],{},[46,44039,44041],{"href":44040},"\u002Fhandbook\u002Fsales\u002Fmeetings\u002Fdemo\u002F#demo","Demo execution",[147,44043,44044],{},"Proof of Concept (PoC) delivery",[147,44046,44047],{},"Technical onboarding & enablement",[19,44049,44003,44050],{},[2562,44051,44052],{},"Detailed process pages coming soon",[3601,44054],{},[14,44056,44058],{"id":44057},"customer-success-owned-processes","Customer Success-owned processes",[19,44060,44061],{},"These processes ensure adoption, renewal readiness, and expansion signal identification.",[144,44063,44064,44067,44070,44073,44076],{},[147,44065,44066],{},"Customer onboarding framework",[147,44068,44069],{},"Health monitoring & risk management",[147,44071,44072],{},"Renewal planning",[147,44074,44075],{},"Expansion signal identification",[147,44077,44078],{},"Customer advocacy development",[19,44080,44003,44081],{},[2562,44082,44052],{},[3601,44084],{},[14,44086,44088],{"id":44087},"professional-services-owned-processes","Professional Services-owned processes",[19,44090,44091],{},"These processes govern scoped delivery, enablement, and post-engagement transition.",[144,44093,44094,44097,44100,44103],{},[147,44095,44096],{},"Engagement scoping",[147,44098,44099],{},"Project delivery",[147,44101,44102],{},"Enablement services (workshops, training)",[147,44104,44105],{},"Post-engagement handoff to Customer Success",[19,44107,44003,44108],{},[2562,44109,44052],{},[3601,44111],{},[14,44113,44115],{"id":44114},"sales-partnerships-owned-processes","Sales Partnerships-owned processes",[19,44117,44118],{},"These processes define how FlowFuse identifies, enables, and scales partner-led motions.",[144,44120,44121,44124,44127,44130],{},[147,44122,44123],{},"Partner identification & recruitment",[147,44125,44126],{},"Co-sell enablement",[147,44128,44129],{},"Partner documentation & support",[147,44131,44132],{},"Partner performance monitoring",[19,44134,44003,44135],{},[2562,44136,44052],{},{"title":75,"searchDepth":76,"depth":76,"links":44138},[44139,44143,44144,44145,44146],{"id":43626,"depth":76,"text":43990,"children":44140},[44141,44142],{"id":40036,"depth":605,"text":40031},{"id":44010,"depth":605,"text":43649},{"id":44026,"depth":76,"text":44027},{"id":44057,"depth":76,"text":44058},{"id":44087,"depth":76,"text":44088},{"id":44114,"depth":76,"text":44115},{},"\u002Fhandbook\u002Fsales\u002Fprocesses",{"title":43895,"description":43985},"handbook\u002Fsales\u002Fprocesses\u002Findex","0WStUD7YfdvL3MeM7P8hx2qxkbMAH8rZ5ODkSKdvrbs",{"id":44153,"title":38948,"body":44154,"description":44158,"extension":81,"meta":44161,"navGroup":83,"navOrder":83,"navTitle":38948,"navigation":84,"path":44162,"seo":44163,"stem":44164,"__hash__":44165},"handbook\u002Fhandbook\u002Fsales\u002Fprofessional-services.md",{"type":7,"value":44155,"toc":44159},[44156],[19,44157,44158],{},"FlowFuse may offer support services as part of an annual subscription. If\nProfessional Services are rendered, it is required to document the learnings in\nissues, documentation, and blog content so that the information gleaned is\navailable to the rest of the organization and the public.",{"title":75,"searchDepth":76,"depth":76,"links":44160},[],{},"\u002Fhandbook\u002Fsales\u002Fprofessional-services",{"description":44158},"handbook\u002Fsales\u002Fprofessional-services","sThGAFbtAQnD2VGP9VLMeBKtTMCSf50pKAYN6KrO0yk",{"id":44167,"title":44168,"body":44169,"description":44173,"extension":81,"meta":44384,"navGroup":83,"navOrder":83,"navTitle":42365,"navigation":84,"path":42364,"seo":44385,"stem":44386,"__hash__":44387},"handbook\u002Fhandbook\u002Fsales\u002Fregions.md","Regions",{"type":7,"value":44170,"toc":44376},[44171,44174,44185,44188,44192,44200,44203,44207,44210,44213,44215,44219,44222,44236,44240,44243,44247,44250,44253,44270,44276,44280,44283,44285,44302,44307,44311,44314,44316,44333,44338,44342,44345,44347,44364,44369,44373],[19,44172,44173],{},"We manage our sales opportunities across three primary sales regions:",[144,44175,44176,44179,44182],{},[147,44177,44178],{},"Americas",[147,44180,44181],{},"EMEA (Europe, Middle East, and Africa)",[147,44183,44184],{},"Oceania + East, South, and Southeast Asia",[19,44186,44187],{},"These regions are used for organizing our go-to-market efforts, account coverage,\nand internal reporting.",[14,44189,44191],{"id":44190},"territory-assignments","Territory Assignments",[19,44193,44194,44195,549],{},"Details on Account Executive, Sales Engineering, and Customer Success coverage\nby country or region can be found in the ",[46,44196,44199],{"href":44197,"rel":44198},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F1teQVqMWtyWPWbbe6WQnp9gONyTCucWK_62h4KY7q8BE",[108],"Sales Territory Assignment spreadsheet",[19,44201,44202],{},"If you're unsure which region an account belongs to, use the prospect’s billing\ncountry as the default reference. For exceptions\n(e.g., global accounts or unique organizational structures), please consult the\nVP of Sales.",[14,44204,44206],{"id":44205},"multi-region-deals","Multi Region Deals",[19,44208,44209],{},"Many FlowFuse customers operate across multiple regions. To ensure a consistent\ncustomer experience and fair compensation, each opportunity involving multiple\nterritories must be classified into one of four scenarios before revenue credit\nis determined.",[19,44211,44212],{},"The scenario classification determines who leads the opportunity and how revenue\ncredit is allocated.",[164,44214,32343],{"id":32342},[239,44216,44218],{"id":44217},"account-owner","Account Owner",[19,44220,44221],{},"The Account Owner is the sales representative responsible for the Sales Territories where the headquarters (HQ) of the customer account is located.\nThe Account Owner is responsible for:",[144,44223,44224,44227,44230,44233],{},[147,44225,44226],{},"Managing the overall relationship with the account",[147,44228,44229],{},"Coordinating the sales process across regions",[147,44231,44232],{},"Managing pricing and commercial strategy",[147,44234,44235],{},"Forecasting and pipeline management for opportunities tied to that account",[164,44237,44239],{"id":44238},"scenario-definitions","Scenario Definitions",[19,44241,44242],{},"Opportunities should be classified into one of the following scenarios.",[239,44244,44246],{"id":44245},"_1-opportunity-managed-entirely-by-account-owner","1. Opportunity Managed Entirely by Account Owner",[19,44248,44249],{},"The Account Owner discovers, manages, and closes the opportunity.",[19,44251,44252],{},"Typical indicators:",[144,44254,44255,44258,44261,44264,44267],{},[147,44256,44257],{},"Opportunity originates through account headquarters or the Account Owner’s\nterritories",[147,44259,44260],{},"Central leadership where the opportunity affects multiple regions or has\npotential to become a global standard",[147,44262,44263],{},"Local division, plant, or territory team in the Account Owner’s territories\nis evaluating FlowFuse",[147,44265,44266],{},"The Account Owner runs discovery, deal strategy, and negotiations",[147,44268,44269],{},"Territory reps are not materially involved in the sales process",[19,44271,44272,44275],{},[423,44273,44274],{},"Credit allocation:"," 100% Account Owner",[239,44277,44279],{"id":44278},"_2-territory-support-only","2. Territory Support Only",[19,44281,44282],{},"The Account Owner leads the opportunity, but a territory rep provides local\nsupport.",[19,44284,44252],{},[144,44286,44287,44290,44293,44296,44299],{},[147,44288,44289],{},"Opportunity originates with the Account Owner or headquarters",[147,44291,44292],{},"The Account Owner manages deal strategy and negotiations",[147,44294,44295],{},"A territory rep assists with local meetings, site discussions, or logistics",[147,44297,44298],{},"Decision-making remains centralized",[147,44300,44301],{},"Regional involvement supports execution but does not change deal ownership",[19,44303,44304,44306],{},[423,44305,44274],{}," Account Owner 100%, territory rep receives recognition",[239,44308,44310],{"id":44309},"_3-territory-expansion-opportunity-led-by-local-rep","3. Territory Expansion Opportunity Led by Local Rep",[19,44312,44313],{},"A new opportunity emerges within an existing global customer, and the local\nrep leads the engagement.",[19,44315,44252],{},[144,44317,44318,44321,44324,44327,44330],{},[147,44319,44320],{},"The account already exists as a customer under an Account Owner",[147,44322,44323],{},"A local division, plant, or territory team initiates a new project",[147,44325,44326],{},"The territory rep runs discovery and manages the deal",[147,44328,44329],{},"The Account Owner remains informed and may assist when appropriate",[147,44331,44332],{},"This scenario often occurs when a successful deployment expands to\nadditional regions",[19,44334,44335,44337],{},[423,44336,44274],{}," 70% Account Owner \u002F 30% Territory Rep",[239,44339,44341],{"id":44340},"_4-independent-opportunity-originating-in-territory","4. Independent Opportunity Originating in Territory",[19,44343,44344],{},"A territory rep independently discovers and manages an opportunity within\ntheir territory.",[19,44346,44252],{},[144,44348,44349,44352,44355,44358,44361],{},[147,44350,44351],{},"Opportunity discovered through territory prospecting or local relationships",[147,44353,44354],{},"A partner introduces FlowFuse to a territory team or facility",[147,44356,44357],{},"Headquarters is not actively involved in the evaluation",[147,44359,44360],{},"The territory rep runs the sales process and manages the close",[147,44362,44363],{},"Even if the company operates globally, the opportunity may remain territory\nif the project is limited to a specific site or region",[19,44365,44366,44368],{},[423,44367,44274],{}," 100% Territory Rep",[164,44370,44372],{"id":44371},"scenario-determination","Scenario Determination",[19,44374,44375],{},"The scenario should be determined before a deal progresses to late-stage\nnegotiations to ensure clarity for all parties. If there is uncertainty\nregarding classification, Sales Leadership will review the opportunity and\nmake the final determination.",{"title":75,"searchDepth":76,"depth":76,"links":44377},[44378,44379],{"id":44190,"depth":76,"text":44191},{"id":44205,"depth":76,"text":44206,"children":44380},[44381,44382,44383],{"id":32342,"depth":605,"text":32343},{"id":44238,"depth":605,"text":44239},{"id":44371,"depth":605,"text":44372},{},{"description":44173},"handbook\u002Fsales\u002Fregions","CAEHLiyNJUqgqB1ZKx1zsWxA1hoODwjoyP3rV2h1N6Q",{"id":44389,"title":40213,"body":44390,"description":44485,"extension":81,"meta":44486,"navGroup":83,"navOrder":83,"navTitle":40213,"navigation":84,"path":42322,"seo":44487,"stem":44488,"__hash__":44489},"handbook\u002Fhandbook\u002Fsales\u002Fsales-deck.md",{"type":7,"value":44391,"toc":44480},[44392,44395,44403,44407,44414,44418,44435,44439],[10,44393,40213],{"id":44394},"sales-deck",[19,44396,1375,44397,44402],{},[46,44398,44401],{"href":44399,"rel":44400},"https:\u002F\u002Fdocs.google.com\u002Fpresentation\u002Fd\u002F1xygs4VS6A7sHY8tmx0EoE7eNrlIWHHkHZbMXQ5PhtL0\u002F",[108],"FlowFuse Sales Deck"," is the primary presentation used to introduce FlowFuse to prospects. It establishes the problem we solve, who we solve it for, and why FlowFuse — before moving into a product demo.",[14,44404,44406],{"id":44405},"when-to-use-it","When to Use It",[19,44408,44409,44410,44413],{},"Use it in ",[423,44411,44412],{},"intro and discovery calls"," — the first or second meeting with a new prospect. It's also appropriate for executive briefings or re-engagement conversations where a high-level overview is more useful than a deep technical walkthrough.",[14,44415,44417],{"id":44416},"how-to-use-it","How to Use It",[144,44419,44420,44426,44429,44432],{},[147,44421,44422,44425],{},[423,44423,44424],{},"Make a copy before customizing."," Never edit the master deck.",[147,44427,44428],{},"Tailor the opening to the prospect's industry or known pain points.",[147,44430,44431],{},"Use the slides as a visual anchor, not a script — the goal is dialogue.",[147,44433,44434],{},"Close every meeting with a defined next step.",[14,44436,44438],{"id":44437},"stakeholders","Stakeholders",[910,44440,44441,44449],{},[913,44442,44443],{},[916,44444,44445,44447],{},[919,44446,5814],{},[919,44448,31969],{},[930,44450,44451,44459,44466,44473],{},[916,44452,44453,44456],{},[935,44454,44455],{},"VP of Sales (Michael Davis)",[935,44457,44458],{},"Owns the deck; approves changes to messaging or structure.",[916,44460,44461,44463],{},[935,44462,43556],{},[935,44464,44465],{},"Primary users. Responsible for customizing per engagement.",[916,44467,44468,44470],{},[935,44469,21080],{},[935,44471,44472],{},"Contributes positioning and competitive messaging. Loop them in before making narrative changes.",[916,44474,44475,44477],{},[935,44476,5243],{},[935,44478,44479],{},"Consulted on major positioning shifts or executive\u002Finvestor-level use.",{"title":75,"searchDepth":76,"depth":76,"links":44481},[44482,44483,44484],{"id":44405,"depth":76,"text":44406},{"id":44416,"depth":76,"text":44417},{"id":44437,"depth":76,"text":44438},"The FlowFuse Sales Deck is the primary presentation used to introduce FlowFuse to prospects. It establishes the problem we solve, who we solve it for, and why FlowFuse — before moving into a product demo.",{},{"title":40213,"description":44485},"handbook\u002Fsales\u002Fsales-deck","n8ci0tv0pnP572KMoIs1DtC9kOu7AHkdeg3wp25iigk",1780336919389]