Swirls

SWIRLS_

  • How it works
  • Pricing

56 matches

OverviewDeliver client operations10Win and grow accounts8Resolve customer issues6Create and distribute content9Run people and operations5Review money and agreements3Monitor systems and data9Compose dependable work6

56 matches

OverviewDeliver client operations10Win and grow accounts8Resolve customer issues6Create and distribute content9Run people and operations5Review money and agreements3Monitor systems and data9Compose dependable work6
← Client OperationsScheduleView on GitHub

SharePoint Industry Brief

Writes a weekly industry brief with AI, saves it to the client's SharePoint library, and emails the link from your own mailbox.

searchaiintegration

Source

/**
 * Weekly industry brief for a client. Searches the web for news in the
 * client's industry, writes a short briefing with AI, saves it into the
 * client's SharePoint document library, and emails them the link from
 * your own Microsoft 365 mailbox.
 *
 * Setup:
 *   1. swirls add microsoft upload_drive_file send_mail
 *   2. Deploy, then authorize the Microsoft connection in Cloud -> Connections.
 *   3. Fill in the drive and folder ids below. Find them with the
 *      list_site_drives and list_drive_items actions, or from SharePoint URLs.
 */

connection client_microsoft {
  label: "Client Microsoft 365"
  provider: microsoft
}

schedule monday_brief {
  label: "Monday Brief"
  cron: "0 8 * * 1"
}

workflow publish_industry_brief {
  label: "Publish Industry Brief"
  description: "Search industry news, write a brief, save it to SharePoint, and email the client the link."

  root {
    type: code
    label: "Configure"
    code: @ts {
      return {
        clientName: "Acme Manufacturing",
        industry: "precision manufacturing",
        clientEmail: "[email protected]",
        driveId: "REPLACE_WITH_DRIVE_ID",
        folderId: "REPLACE_WITH_FOLDER_ID",
        week: new Date().toISOString().slice(0, 10)
      }
    }
    outputSchema: @json {
      {
        "type": "object",
        "properties": {
          "clientName": { "type": "string" },
          "industry": { "type": "string" },
          "clientEmail": { "type": "string" },
          "driveId": { "type": "string" },
          "folderId": { "type": "string" },
          "week": { "type": "string" }
        }
      }
    }
  }

  node find_news {
    type: search
    label: "Find industry news"
    query: @ts {
      return context.nodes.root.output.industry + " industry news this week"
    }
    limit: 8
    sources: ["news"]
  }

  node write_brief {
    type: ai
    label: "Write the brief"
    kind: text
    model: "google/gemini-2.5-flash"
    prompt: @ts {
      const cfg = context.nodes.root.output
      const results = (context.nodes.find_news.output.results || [])
        .map(r => "- " + (r.title || "") + " (" + (r.url || "") + "): " + (r.description || ""))
        .join("\n")
      return "Write a one-page weekly industry brief for " + cfg.clientName + ", a company in " + cfg.industry + ". Use plain language for a business owner, not an analyst. Format as markdown with a short overview, three to five notable developments with source links, and one paragraph on what to watch next week.\n\nThis week's headlines:\n" + results
    }
  }

  node save_to_sharepoint {
    type: integration
    label: "Save to SharePoint"
    connection: client_microsoft
    action: microsoft_upload_drive_file
    params: @ts {
      const cfg = context.nodes.root.output
      return {
        drive_id: cfg.driveId,
        parent_id: cfg.folderId,
        filename: "industry-brief-" + cfg.week + ".md",
        content: context.nodes.write_brief.output,
        contentType: "text/markdown"
      }
    }
  }

  node email_client {
    type: integration
    label: "Email the client"
    connection: client_microsoft
    action: microsoft_send_mail
    params: @ts {
      const cfg = context.nodes.root.output
      const fileUrl = context.nodes.save_to_sharepoint.output.webUrl || ""
      return {
        message: {
          subject: "Your industry brief for the week of " + cfg.week,
          body: {
            contentType: "text",
            content: "Hi,\n\nThis week's industry brief is ready. It is saved in your SharePoint library:\n\n" + fileUrl + "\n\nReply to this email if you want us to dig deeper on anything in it."
          },
          toRecipients: [
            { emailAddress: { address: cfg.clientEmail } }
          ]
        },
        saveToSentItems: true
      }
    }
  }

  flow {
    root -> find_news
    find_news -> write_brief
    write_brief -> save_to_sharepoint
    save_to_sharepoint -> email_client
  }
}

trigger on_monday_brief {
  schedule:monday_brief -> publish_industry_brief
  enabled: true
}

Flow

Trigger to workflow

monday_briefschedule
publish_industry_brief
Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

Workflow nodes

CODE
Code Node
Configure
SEARCH
Search Node
Find industry news
AI
AI Node
Write the brief
INTEGRATION
Integration Node
Save to SharePoint
INTEGRATION
Integration Node
Email the client
Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.