- Brand
- Flowforth
- Category
- Marketing
- Primary Subcategory
- Email & SMS Lifecycle Marketing Automation
Integration details
Description
Connect your Flowforth account to analyze campaign performance, explore audience and organization data, and create or edit email drafts and templates. Organize campaigns, work with reusable content, and preview drafts. Sending and scheduling remain in Flowforth. Access follows your existing organization and member permissions.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Email & SMS Lifecycle Marketing Automation
- Secondary Subcategories
- None listed
- Brand
- Flowforth
- Access
- Account required
- First tracked
- 2026-11-10
- Tool count
- 85
- Market
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
Not discoverable in ChatGPT yet
ChatGPT now suggests Plugins on its own when they match a user's request, but not every Plugin is being surfaced yet.We haven’t seen Flowforth suggested yet. Sign up and we’ll track it, and your Discoverability Score will appear here once ChatGPT starts surfacing it.
What discovery looks like

Get alerts for Flowforth
Get updates when Flowforth’s Discoverability Score or category rank changes.
Competing in ChatGPT Email & SMS Lifecycle Marketing Automation
View Category85 tools agents can invoke
Add 1-20 NEW blocks to a DRAFT block email or block template, in the order given, at one position. Types: text, image, button, divider, list, columns (with blocks nested per column), cards, html, video, file-download, icons, author. Each block starts from exactly what Flowforth's editor inserts for that type — including the email's own button/divider/image/cards defaults — and the fields you give are laid over it; field names are the stored ones get_email_blocks shows. Text is plain text or simple HTML (<p>, <h1>-<h4>, <strong>, <em>, <u>, <s>, <a href>, lists, <br>) with merge tags as @first-name etc.; unknown merge tags are refused. IMAGES COME ONLY FROM THE ORGANIZATION'S ASSET LIBRARY: image, bgImage, card images and author photos take { asset_id } from search_assets (a file-download takes a document's asset_id); URLs are refused. An author block can be filled from a saved person with saved_author_id (search_saved_authors). A button block, card button or list button can be an Add to Calendar button: give calendarEvent (buttonCalendarEvent on a card or list item) with the event's title, start, time zone and so on instead of a link, and Flowforth builds a link to a page that adds it to Apple, Google or Outlook calendars. Visibility: `conditions` limits a top-level block to people on (or not on) one audience list (list_lists id); `hideOnPublicPage: true` keeps it off the public archive and RSS while recipients still get it. What renders: blocks draw in the email's own design — fonts, text colours and link colour from update_email_design, button/divider/image/cards defaults for any setting a block leaves out — inside the email's footer, which carries the unsubscribe and preferences links. A block with `conditions` goes only to recipients who match (checked per recipient at send time; hidden on the public archive for 'is' conditions unless public_visibility says otherwise). A block with hideOnPublicPage still goes to every recipient but is left out of the public archive and RSS. Use render_email_preview to see the result. Placement: position "end" (default) or "start", or after_block_id / before_block_id (a top-level uuid from get_email_blocks) — pass only one. Nothing existing is changed; an email holds at most 100 blocks. Returns the new blocks' uuids and positions. Anyone with the email open in Flowforth's editor sees the change appear. Shares a budget of 500 block-editor changes per organization per day with the other block, design and footer tools; a refused call is not counted. Never sends or schedules.
add_email_blocks
Give a DRAFT block email or template the DESIGN of a template — the editor's "Apply style only": template_source "organization" takes one of this organization's block templates (or block emails), "flowforth" one of Flowforth's gallery templates (ids from list_email_templates; the two id spaces are separate). What renders: the same content in the template's look. What changes: the email's whole design (backgrounds, fonts, text/link colours, button/divider/image defaults — replaced by the template's), the footer's colours, social-icon style and footer style settings (its content, logo, links and address stay), and existing buttons, dividers, images and videos whose settings still equal the OLD defaults (they follow to the template's; cards follow the button colour). Block content — text, images, links, order — is NEVER changed, and no blocks are added or removed. If someone has a block that would change (or the footer form) selected in Flowforth's editor, the call is refused and names them; if the editor's presence cannot be checked the call is refused too — try again. Anyone with the email open in Flowforth's editor sees the change appear. Shares a budget of 500 block-editor changes per organization per day with the block tools; a refused call is not counted. Never sends or schedules. Use render_email_preview to see the result.
apply_template_style
Archive emails to tidy the emails list, or unarchive them (archived: false). Archived emails leave the app's email list (list_emails shows them with include_archived) and are kept with all their stats. Drafts, sent and failed emails can be archived, as in the app; scheduled and sending emails, templates and emails sent from Planning Center are skipped. ARCHIVING A SENT EMAIL ALSO TAKES IT OFF ITS CATEGORY'S PUBLIC ARCHIVE PAGE, if it was on one; unarchiving puts it back. Nothing is deleted, no content changes and nothing is sent. Up to 50 emails per call; each id succeeds or fails on its own and the response reports "changed", "unchanged", "skipped" and "failed" separately. Shares the 300-calls-per-organization-per-day budget with move_emails_to_folder (one call, however many emails, costs one).
archive_emails
Change the DESIGN of a DRAFT block email or template — what Flowforth's editor calls Email Style: content and outer background colours, layout (Seamless, or Card: an inset card) and its corner radius, fonts, text/accent/link colours and underline, per-style heading/paragraph settings (Heading 1-3, Paragraph), and the defaults for buttons, dividers, images and cards. What renders: every text block draws in these fonts and colours unless it sets its own; buttons, dividers, images, videos and cards use their defaults for new blocks. As in the editor, when a group of defaults changes, existing blocks whose settings still EQUAL the old defaults follow to the new ones (blocks styled by hand are left alone; blocks inside columns included); pass propagate_to_matching_blocks: false to change only the defaults. Colours are hex; fonts are the editor's web-safe fonts or the organization's brand fonts (font_value from get_brand_kit). Block content is never changed. If someone has a block that would change (or the footer form) selected in Flowforth's editor, the call is refused and names them; if the editor's presence cannot be checked the call is refused too — try again. Anyone with the email open in Flowforth's editor sees the change appear. Shares a budget of 500 block-editor changes per organization per day with the block tools; a refused call is not counted. Never sends or schedules. Use render_email_preview to see the result.
update_email_design
Change the FOOTER of a DRAFT block email or template, as the editor's footer form does: title (organization name), subtitle text, logo (an image { asset_id } from search_assets — URLs are refused), logo link, colours, title/text sizes, layout (classic, editorial, minimal) and spacing, social icons (replaced whole, up to 5), text links (replaced whole, up to 10), and the mailing address. What renders: the footer sits under the last block in every layout and ALWAYS includes the mailing address line and the unsubscribe, manage-preferences and view-in-browser links — those links cannot be removed, hidden or re-pointed through this tool (and the footer itself cannot be deleted). If someone has a block that would change (or the footer form) selected in Flowforth's editor, the call is refused and names them; if the editor's presence cannot be checked the call is refused too — try again. Anyone with the email open in Flowforth's editor sees the change appear. Shares a budget of 500 block-editor changes per organization per day with the block tools; a refused call is not counted. Never sends or schedules.
update_email_footer
Run the check the domain page's "Records added" (or "Retry Verification") button runs: Resend re-checks the domain's DNS records, and the domain becomes usable as a from-address domain if they all pass. Use it when someone asks to check or verify a domain, typically after adding the records from get_domain_dns_records. A domain that is already verified is not checked again; the call says so and changes nothing. Returns is_verified after the check, the records with their new statuses, and a `note`. DNS changes can take from a few minutes to a few hours to be seen, so records often still read pending right after they are added. A domain can be checked once every 10 minutes (the same wait as the button), and the error says how long is left. It does not handle a domain being moved from another email account (`transfer` set and not completed); that is confirmed with "I've added the record" on the domain's page. Owners and admins only, like the domain settings page; the domain_id comes from list_domains.
verify_domain
Find every link in one email or template and check that each one works, WITHOUT changing anything. Works for every email type: block emails (text, buttons, images, cards, lists, icons, video, file downloads, authors, HTML blocks, nested columns, and the footer's links and social icons), HTML emails and plain-text emails. Links are read from the rendered email, so anything a recipient can click is found, and each is labelled with where it appears (the block's uuid, the same block_id the block tools take, and its type; column and item for nested blocks; or "footer"/"body"). Bare URLs typed as text are included, since mail clients link them. Each unique https link (up to 50 per call; the rest are listed as unchecked) is requested from Flowforth's servers — with a single HEAD request only, never a GET, so one-click links such as RSVP or confirm links are never triggered — and reported as ok, redirected (with the final URL), broken (404/410, server errors, a domain that does not resolve), blocked (points at a private or non-standard address, or redirects to one), timeout or error (including sites that refuse a HEAD check with 401/403/405/429/501 — those are not fetched any other way; open them in a browser). http:// links are NOT fetched and are reported as insecure_http. Merge-tag links (@unsubscribe and friends), # anchors and the footer's unsubscribe/preferences placeholders, mailto:, tel: and sms: links are listed as skipped; relative links are reported as invalid. Every web link is also looked up in Google Web Risk (malware, phishing, unwanted software): any unsafe link is listed first under unsafe_links. The Web Risk lookup fails open, so its absence of a verdict is "no_threat_reported", not a guarantee, and it says "not_checked" when it could not run. This tool contacts the external sites the email links to. It is limited to 30 calls per organization per day (only calls that find at least one web link are counted).
check_email_links
Start a new DRAFT campaign from a TEMPLATE. With template_source "organization" (the default) the source is one of this organization's templates (template, html-template, plain-text-template) and its footer, blocks (or HTML/plain-text body) and custom merge tags are copied; the result is a draft of the matching kind (standard, html or plain-text) whose subject is copied from the template, so it usually needs changing. With template_source "flowforth" the source is a template from Flowforth's built-in gallery (list_email_templates with source "flowforth"): the result is a standard block draft carrying the template's layout, colours and blocks — including the template's own copy, which is generic gallery text to replace — with the organization's own footer content, and no subject. Either way the new draft has NO audience and NO schedule — set those with update_email, or in Flowforth — and nothing is sent or scheduled. To see what the draft renders to, call render_email_preview with the returned email_id. Counts against the same 200-drafts-per-organization-per-day budget as create_email.
create_email_from_template
Create a folder in the organization's asset library, at the top level or inside another asset folder (parent_folder_id, from list_asset_folders; at most 10 levels deep). Names are unique among a folder's siblings, ignoring case. Shares a 300-changes-per-organization-per-day budget with the other asset folder tools. Returns the new folder.
create_asset_folder
Create a DRAFT email shell (setup only — no content). This tool NEVER sends and NEVER schedules an email: it always creates a draft, and a human must open it in Flowforth to add content and confirm sending. Ideal for batch-setting-up planned campaigns (name, subject, sender, reply-to, audience, folder). The audience can be lists, people, Planning Center Groups and Registrations signups, plus an optional "Don't send to" in the same four kinds (the excluded_* arguments). If you pass proposed_send_time it is stored only as a tentative time and the email stays a draft until a person confirms scheduling in the app. `type` selects the editor the draft opens in and defaults to "standard", a block email (the `type` parameter describes what each kind supports); the three "*-template" types (plus "template") create reusable TEMPLATES, which are never sent and therefore reject subject, audience and send-time arguments. Limited to 200 drafts per organization per day through this connector. Returns the new email_id and an editor link.
create_email
Create a new email category — a subscription group recipients can opt out of individually. The NAME AND DESCRIPTION ARE SHOWN TO RECIPIENTS in the preference center and on unsubscribe pages, so write them for subscribers. An organization can have at most 20 active categories; this refuses once that is reached. Setting is_public PUBLISHES AN ARCHIVE PAGE ON THE ORGANIZATION'S PUBLIC WEBSITE listing every email ever sent in this category, plus an RSS feed — do not turn it on unless the user asked for a public archive. Requires email access without a send restriction (the app hides the categories page from send-restricted members). Limited to 20 categories per organization per day through this connector. Returns the new category, its Flowforth URL and its public-page state.
create_email_category
Create a new email folder for organizing campaigns. Optionally nest it under an existing folder (parent_folder_id, at most 5 levels deep), give it a color, or share it with a team (team_id, from list_teams — only top-level folders can belong to a team). Requires emails access in the organization. Limited to 100 folder writes per organization per day through this connector. Returns the new folder's id and name.
create_email_folder
Create a folder on Flowforth's templates page, for filing templates. Template folders are one level deep and separate from email folders. Only organization owners and members whose email permission is Manage can create one. File templates into it with move_templates_to_folder or save_email_as_template. Shares the 100-folder-writes-per-organization-per-day budget with the email folder tools.
create_template_folder
Delete one image or file from this organization's asset library, by an asset_id from search_assets. It follows the asset library's own rule: an asset that has been used in a SENT email is only removed from the library, and its file is kept so emails already delivered keep showing it; any other asset is permanently deleted from storage, which cannot be undone. Before deleting, it checks where the asset is still used: unsent emails (drafts, scheduled emails, templates, automation emails), the default email footer, saved authors and saved sections (not link pages, websites or social posts). If something still uses an asset that would be permanently deleted, nothing is deleted and the uses are listed: tell the person, and either use replace_asset to point them at another asset first, or call again with confirm_in_use: true only once the person has agreed that those emails will show a broken image. Confirm with the person before deleting, and name the asset. Limited to 50 deletions per organization per day through this connector.
delete_asset
Delete an asset folder. Only the folder goes: its assets and sub-folders move up into its parent folder (or the top level), and a sub-folder whose name clashes there gets " (2)" appended. No asset is deleted and no link changes. Shares the 300-changes-per-day asset budget.
delete_asset_folder
Delete 1-100 top-level blocks (uuids from get_email_blocks) from a DRAFT block email or template. Deleting a columns block deletes everything inside it; to remove one block inside columns, update the columns block's `columns` with update_email_block. This cannot be undone through the connector (the editor's version history still has the earlier version). What renders: the email without those blocks; the footer (with its unsubscribe link) is not a block and cannot be deleted. Blocks someone currently has selected in the Flowforth editor are refused (named in the error) so their work is not overwritten; if the editor's presence cannot be checked the call is refused too — try again. Anyone with the email open in Flowforth's editor sees the change appear. Shares a budget of 500 block-editor changes per organization per day with the other block, design and footer tools; a refused call is not counted. Never sends or schedules.
delete_email_blocks
Permanently delete a DRAFT email or template. This cannot be undone. It refuses anything that is not a pure draft: an email that has been sent, is sending or scheduled, or that already has recipient records, is rejected — as is a template still referenced by an automation (the error names the automations). Emails written in the Planning Center Add-On (created_in "planning_center_add_on") are refused too. Deleting a draft also removes its footer, blocks, audience and custom merge tags through the database's cascades. Limited to 200 deletions per organization per day through this connector.
delete_email
Copy an existing email or template into a NEW DRAFT, including its content — footer, blocks (or HTML/plain-text body), custom merge tags and audience. The copy is always a draft: it is never sent and never scheduled, and it keeps the SOURCE's type (duplicating a template produces a template, which carries no audience). A sender or reply-to whose verified domain has since been ARCHIVED is dropped from the copy; a custom (open-mode) reply-to on any domain is carried over. Canva, quick-send and giving-pledge-status emails cannot be duplicated here. Counts against the same 200-drafts-per-organization-per-day budget as create_email.
duplicate_email
Make exact find-and-replace edits to the HTML body of a DRAFT email of type "html" or "html-template". Edits apply in order, each to the result of the ones before it; every `find` must occur EXACTLY ONCE at that point (case- and whitespace-sensitive), or the whole call is refused naming each failing edit and its match count, and nothing is saved. Match against the STORED HTML — read it with get_email_content (format 'html'); it is the sanitized form, which can differ from what was originally written. The edited result then goes through everything set_email_html does. What renders: the HTML is stored after Flowforth's sanitizer (scripts, event handlers, forms, iframes and javascript:/data: URLs are removed; merge-tag aliases like *|FNAME|* and {{first_name}} become @first-name) and is sent AS IS — no Flowforth header or footer is wrapped around it — with merge tags filled in per recipient. The one addition: when the HTML does not show the organization's street address, the send appends a line with the organization's name and mailing address, as the law requires (render_email_preview shows it). So the HTML must carry its own footer: it is REFUSED (nothing saved) unless it has an unsubscribe link, an <a> element whose href is the merge tag: <a href="@unsubscribe">…</a>; add <a href="@manage-preferences">…</a> beside it, or the response warns. Merge tags are @first-name, @last-name, @email, @view-in-browser, @unsubscribe, @manage-preferences, @current-date, @current-month, @current-year and the email's own custom tags; an unknown @tag is refused (write a literal @ as @). Outside images are not supported for now: an <img> not hosted by Flowforth (churchusercontent.com / Flowforth storage) is saved but warned about — upload images in Flowforth. Returns the stored size in bytes, any warnings and the HTML editor link. It never sends or schedules. Same shared budget as set_email_html (200 content writes per organization per day); a refused call is not counted.
edit_email_html
Make exact find/replace edits to the COPY of a DRAFT block email or template, without rewriting whole blocks. Fields searched: text-block content, button text, card and list titles/subtitles/labels/descriptions/button text, file-download titles and author name/subtitle — including blocks inside columns. Pass block_id to search one block (a columns block includes its nested blocks), or leave it out to search the whole email. Each `find` must occur EXACTLY ONCE in that scope at the moment it is applied (edits run in order, each on the result of the ones before), and it cannot span two fields; text fields are matched against their stored HTML as get_email_blocks shows it, so include tags when the text is split by formatting. `replace` is text, optionally with inline markup (<strong>, <em>, <u>, <s>, <a href>, <br>) in rich fields; titles, labels and button text take no markup. Merge tags (@first-name…) are checked; unknown ones are refused. If any edit fails, NONE are applied. What renders: the same blocks with the new wording, in their existing styling. Blocks someone currently has selected in the Flowforth editor are refused (named in the error) so their work is not overwritten; if the editor's presence cannot be checked the call is refused too — try again. Anyone with the email open in Flowforth's editor sees the change appear. Shares a budget of 500 block-editor changes per organization per day with the other block, design and footer tools; a refused call is not counted. Never sends or schedules.
edit_email_text
Finish an upload started with create_asset_upload, once the file has been PUT to its upload_url: prepares it and adds it to this organization's asset library, then returns its asset_id, ready for an image field (or a file-download block for a document). Images are prepared exactly like an upload in Flowforth: width capped at 1500px with the height left alone, JPEGs compressed toward about 200 KB, images with transparency kept as PNG, WebP, AVIF, TIFF and SVG converted, animated GIFs kept as they are (up to 10 MB). Images over 40 megapixels are refused. Documents are stored as they are, after checking the file really is that type. folder_id files it in an asset folder (from list_asset_folders); by default it goes in the top level. Only the person who started the upload can finish it, in the same organization.
finalize_asset_upload
Build the Flowforth web-app URL for a record you already have the id of, so you can give the user a clickable link instead of a bare id. This tool looks NOTHING up: it does not verify the record exists and it does not search — pass an id you got from another tool or from the user, and never invent one. PREFER the `url` field the other tools already return on their records; use this only when you have an id but no url (for example an id the user pasted out of a Flowforth URL). Kinds: 'email' (any email — draft, scheduled or sent; numeric email id), 'email_template' (a TEMPLATE email's id — opens the block editor; an html-template or plain-text-template needs a different route, so use the url from a tool result for those), 'email_folder' (folder id; folders have no page of their own, so this opens the emails list filtered to it), 'email_category' (category id from list_email_categories), 'automation' (automation id), 'person' (numeric person id from search_people), 'list' (the FLOWFORTH audience list id from list_lists — NOT the Planning Center list id), 'team' (team id from list_teams), 'domain' (sending domain id from list_domains), 'link_page', 'qr_code', and the id-less pages 'dashboard', 'organization_settings', 'templates' and 'assets' (the asset library, where the person uploads images and files).
get_app_link
Get the DNS records a sending domain needs, the same stored rows the domain's page in Flowforth lists: type, name (what goes in the DNS provider's Name/Host field; "@" means the domain itself), value, priority, ttl, purpose (Resend's label for the row, such as DKIM, SPF, DMARC, Tracking, TrackingCAA or Ownership) and status per record (not_started, pending, verified, failed, temporary_failure, or duplicate for a DMARC name with more than one record). `recommended: true` marks the suggested DMARC record, which helps deliverability but is not required to verify. Tracking records only appear when the domain uses a custom tracking subdomain. It does not change anything; `note` says what to do next. Once the records are added, verify_domain runs the domain page's "Records added" check. While the domain is being moved to Flowforth from another email account (`transfer` is set and not completed), the only record is the Ownership TXT record that proves the domain is theirs, and the person clicks "I've added the record" on the domain's page (`url`); the real records appear after the move completes. Owners and admins only, like the domain settings page; the domain_id comes from list_domains.
get_domain_dns_records
Read the organization's brand kit from Settings > Branding: its saved brand colours (title and hex) and its brand fonts (Google Fonts with a web-safe fallback for email clients that can't load web fonts). Use them when designing an email so it matches the organization's look: colours go into update_email_design, add_email_blocks and update_email_block; a brand font's `font_value` goes into update_email_design's font settings exactly as returned. Brand fonts render in block emails and templates; an email client that can't load web fonts shows the fallback. Read-only.
get_brand_kit
List the people who have unsubscribed from a specific email category. Requires a category_id from list_email_categories. Returns email address and (when known) person id and name. Requires BOTH people access and email access without a send restriction. Paginated, 25 rows per page by default and up to 100 with `limit`.
get_category_unsubscribes
See who an email is addressed to — the saved TARGETS, not the resolved recipient list. Works for drafts and for sent emails. Targets come in six kinds: list (Planning Center list, expanded to its members at send time), person (one contact), group (PCO group, expanded to its memberships), registration (PCO signup, expanded to its registrants), pco_add_on_list (a Planning Center list picked in the Planning Center Add-On, reported under planning_center_lists) and csv (an uploaded file; mutually exclusive with all of the above). Lists, groups and registrations are expanded into individual people only at send time, so this tool reports the targets and (where stored) their member counts, not a final headcount. An email with no rows has no recipients set and cannot be sent. `excluded` lists the email's "Don't send to" lists, people, groups and registrations: everyone in them is left out at send time even if a target includes them (Planning Center audiences only). For a sent email's actual delivery numbers use get_email_stats.
get_email_audience
Read one BLOCK-BASED email as a structured document so you can review its copy, block order, formatting and colour contrast. Requires an email_id (from list_sent_emails or list_draft_emails). Returns: the email's resolved styling (layout, canvas and content background colours, text/accent/link defaults, fonts); every block in render order with its content, its own styling, and the background colour it actually sits on (a block that sets its own bgColor overrides the email background for its own cell); a `contrast` report; and a summary of the footer. This works for block-based emails only (standard, template, quick-send, giving-pledge-status) and at any status, INCLUDING an unsent draft that get_email_content cannot read — for html, canva, html-template and plain-text emails use get_email_content instead. `contrast.failing` lists every text/background pair below WCAG AA (4.5:1 for normal text, 3:1 for large text and decorative elements), with the exact foreground and background colours, so you can name the specific block and suggest a concrete colour fix. NOTE two things when reviewing: cards and list blocks have their own stored textColor OVERRIDDEN by the email-level text defaults when the email renders, so their contrast is reported against those email-level colours, not the block's; and a text block's `content_html` is TipTap output (h1-h4, p, a, and spans carrying inline colours or an accent marker) — read it for formatting cues such as heading hierarchy, bold, and link placement, but critique the copy from `content_text` rather than reproducing the markup. Raw HTML blocks are sent as-is and are not contrast-checked. Blocks come back in RENDER order — `position` is 1-based, so `position: 1` is the first thing a recipient sees; use it, not `index` or `path`, when you tell someone where a block sits. A button block's real geometry is under `rendered` (padding, height and corner radius in PIXELS, plus whether it reads as a pill); the stored paddingX/paddingY that `rendered` is derived from are 0-100 settings rather than pixels, so never quote raw padding numbers at a reader. `style.effective.link_color_in_use` is false when no text, card or list copy contains a link — the link colour is then never painted, so leave it out of any critique of the palette; buttons and author/footer links use their own colours and do not set it. Each top-level block has `visibility`: its audience conditions (list, operator, public_visibility override) and `on_public_page`, whether it appears on the public archive and RSS. Pass include_html: false to drop all raw HTML and get a smaller response.
get_email_blocks
Get the content of one email (subject, preview text, status, type, and body). Requires an email_id from list_sent_emails. format defaults to 'text' (tags stripped to readable plain text); pass 'html' for the raw HTML. Long content is truncated to ~50k characters. IMPORTANT: where the body lives depends on the email's type, and `content_location` in the response says which case you got. For html / canva / html-template and plain-text emails the working body is stored as HTML and is readable at any status. For block-based emails (standard, template, quick-send) the body is rows in the block editor and is only rendered to HTML when the email is SENT — so for an unsent block-based DRAFT this tool returns content_location 'block_editor', an empty `content`, and `has_content` telling you whether the draft has blocks. An empty `content` there does NOT mean the draft is empty: it means the body cannot be read through this connector yet. Say so rather than reporting the email as blank. `has_content` always reflects the STORED body, not the rendered output, so an image-only email reports has_content: true with an empty `content` in 'text' format — check `content` itself, and the note, before calling anything blank.
get_email_content
Get per-link click totals for one sent email (which URLs were clicked and how many times). Requires an email_id from list_sent_emails. For overall metrics use get_email_stats instead.
get_email_link_clicks
Get the hour-by-hour open counts for one sent email — useful for send-time analysis ('what hour do my emails get opened most'). Returns rows of { hour_timestamp, opens_count }, one per UTC hour that had at least one open, plus `source` describing what was counted. For emails sent after per-recipient event logging went live the source is `open_events`: every recorded open, so a recipient who opens three times counts three times (so it is higher than the recipient-based total_opens from list_sent_emails and get_email_stats). For older sends the source is `recipient_opened_at`, which holds ONE timestamp per recipient — their most recently recorded open — so those hours count openers, not opens. Requires an email_id from list_sent_emails. The window defaults to the 30 days following the send; pass start / end to widen or move it. With source `open_events` an empty `hours` array means exactly what it says: no opens were recorded in that window. With `recipient_opened_at` it means less: that source sees only each recipient's most recent recorded open, and earlier opens by the same recipient are not visible at all — a recipient who opened inside the window and opened again after it is counted at the later time and drops out of the window entirely, so those counts are a lower bound. Bot/automated opens (scanners, Apple Mail Privacy prefetch) are NOT filtered out — that classification is unavailable to this connector — so early hours right after the send are inflated by prefetches.
get_email_opens_timeline
Get detailed performance stats for one sent email, matching the tiles on its post-send stats page: totals (sent, delivered, opens, unique clickers, click events, unsubscribes, bounces, complaints), computed open/click/bounce rates, per-link click stats, and estimated bot activity (scanners / Apple Mail privacy prefetch) with bot-adjusted open/click numbers. total_opens counts recipients who opened, not open events, so open_rate matches the page's Opened tile. click_rate is distinct clickers (metrics.unique_clicks) over sent; when that count is unavailable — it is null then — it falls back to click events over sent, clamped at 100%, which reads higher than the page's Clicked tile because one recipient can click many times. hidden_from_global_metrics tells you whether this email is excluded from get_org_dashboard_metrics totals. not_sent matches the page's "Sent to X of Y on the list" line: list_size is everyone the send considered (Y), total is how many were skipped, and reasons says why (unsubscribed, previously bounced, duplicate address, blocked in Planning Center and so on), largest first. Requires an email_id from list_sent_emails. For WHO the email was addressed to — the saved lists, people, groups or registrations rather than the delivery numbers — use get_email_audience.
get_email_stats
Get the organization's email sending usage for the current billing period: sends_used, send_limit (the plan's sends per period), sends_remaining on the plan, bonus_sends_remaining (extra sends bought separately; they do not reset and are used after the plan's sends run out), available_to_send (sends_remaining + bonus_sends_remaining, the exact number a send is checked against: an email or automation that would go to more recipients than this is refused; separately, a single send to more than 200,000 people is always refused, whatever the balance), percent_used of the plan, and the period's start and end (usage resets at current_period_end). One recipient is one send. Use it to answer 'how many emails do we have left?' or to check before suggesting a large send. Visible to organization owners and admins, and to members who manage emails; anyone else gets an explanation instead of numbers. Read-only.
get_email_usage
Read one QR code in full: its destination, whether it is active, whether scan tracking is on, its schedule (the raw json behind any automatic activate/deactivate window), and every rendered code attached to it with that code's own scan_url and scan count. `qr_code_id` is the MANAGEMENT row's id — the integer `id` from list_qr_codes — not one of the `codes[].id` uuids a printed code encodes. Use it to answer how many times a printed code has been scanned, or to check where a code currently points before someone reprints it. Read-only: this connector cannot create, repoint or deactivate a QR code.
get_qr_code
Read one email automation IN FULL: its trigger, whether it is switched on, how many people are currently part-way through it, and its steps NESTED IN THE ORDER THEY RUN — including the if/else branches, which are stored flat in the database and are easy to misread as a straight line. Each step carries a plain-language `summary` ("Wait 3 days", "Send email \"Welcome!\"", "If the person is on list \"Members\""), a `label` matching what the builder shows, whether it is enabled, and normalized `details`; a send step also carries the TEMPLATE email it sends, with a url and an id you can pass to get_email_content to read the actual copy. `warnings` calls out the things that change what the automation really does — disabled steps, send steps with no template, steps that could not be placed in the branch structure, and conditions with an empty branch. Take the automation_id from list_automations. This tool is read-only: automations cannot be created, edited, enabled or run through this connector.
get_automation
Read one link page in full: its public title and description, whether it is published, its live address, and every button on it IN THE ORDER VISITORS SEE THEM, with each button's destination, whether it is enabled, and how many times it has been clicked. A disabled button is still stored on the page but is not rendered, so do not describe it as something visitors can click. Take the link_page_id from list_link_pages. Read-only: this connector cannot add, reorder, retarget or remove links.
get_link_page
Get aggregate email metrics for the whole organization over a period (day, week, month, year, or all — default month): totals sent/opened/clicked/unsubscribed/bounced, number of emails sent, and percentage changes vs the prior comparable period. Emails marked 'Hide from Global Metrics' are excluded from every total here (list_sent_emails flags them as hidden_from_global_metrics), so these numbers will not match a hand-summed list that includes them. Includes daily_data. IMPORTANT: this connector queries at most the last 90 days, so 'year' and 'all' return that window rather than the full period — the response reports the exact window in `window` and sets `window_clamped` when this applied. The `changes` are measured against the equally-long window immediately before this one (reported as `compared_to_window`); when that window had no sends there is nothing to compare with, so every entry in `changes` is null and `comparison_available` is false — do not read that as flat or as growth. Use for org-wide trends rather than a single email.
get_org_dashboard_metrics
Get the full record for one contact by their numeric id (from search_people): name fields, PCO id, all email addresses with subscription status, and the email categories they have unsubscribed from. Only the person's primary address has a subscription record — it is marked status_source 'primary_record'; every other address is marked 'assumed' and defaulted to 'subscribed', so do not report those as confirmed subscriptions. A reason is returned only for 'cleaned' and 'suppressed' addresses, where it explains the status; for every other status it is a stale last-action note and is omitted. Returns 'not found' for ids outside your organization.
get_person
Org-wide unsubscribe analytics over a period: the reasons the organization offers people when they unsubscribe, how many responses each reason got, and a day-by-day count of unsubscribes. The daily counts cover every unsubscribe the organization recorded, whether from all email or from one subscription category, once per person per email: including emails hidden from metrics, automation steps and the preference centre. get_org_dashboard_metrics' total_unsubscribes counts only unsubscribes from sent emails that are not hidden from metrics, attributed to the email's SEND date, so daily is usually the larger number and the two are not expected to match. Giving a reason is OPTIONAL and the reason list can be empty, so reason_counts almost always totals less than the unsubscribes in the same window; never read responses_total as the number of people who unsubscribed. reason_counts covers BOTH kinds of unsubscribe: people who stopped all email and people who stopped a single category (the survey asks either way); use list_unsubscribe_responses (its unsubscribed_from field) to tell them apart. Use list_unsubscribe_responses for the individual answers and their free-text comments, and list_people_feed for every unsubscribe including the ones with no reason. Requires BOTH email access and people access.
get_unsubscribe_summary
Copy an image from a public https URL into this organization's asset library, so it can be used in emails (outside image URLs never go into an email directly). The image is prepared exactly like an upload in Flowforth: width capped at 1500px with the height left alone, JPEGs compressed toward about 200 KB, images with transparency kept as PNG, WebP, AVIF, TIFF and SVG converted, animated GIFs kept as they are (up to 10 MB, so the animation survives). Images over 40 megapixels are refused. Up to 50 MB downloaded. Returns the new asset_id, ready for an image field. folder_id files it in an asset folder (from list_asset_folders); by default it goes in the top level. Only import images the person has the right to use. Limited to 100 imports per organization per day.
import_asset_from_url
Add Planning Center content to a DRAFT email or block template, exactly as the Import from Planning Center dialog in Flowforth's editor does. Pass the email_id, the app, and up to 10 item ids from search_planning_center; each item is fetched fresh from Planning Center by id (nothing you write is used as content). `as` picks the dialog's layout: "blocks" adds, per item, an image block (when it has artwork), a text block with the title, the date line (events and signups) or series name (episodes) and the description, and a button linking to it; "cards" adds ONE Cards block with a card per item (image, title, date or group-type label, description, button). An episode's thumbnail gets a play button, as in the editor. The dialog's default choices are used: every field included, signups show their full date range and link to their details page, button labels are "View Event", "Learn More", "Watch Now", "View Group" or "Register" (events can instead get "Add to Calendar" buttons with event_button: "calendar"), and dates are formatted in the organization's date format and its Planning Center timezone. Artwork is copied into Flowforth; an image that cannot be copied is left out and reported. Placement: position "end" (default) or "start", or after_block_id / before_block_id with a block uuid from get_email_blocks (top-level blocks only) — pass only one. The blocks are INSERTED only: nothing existing is changed, and anyone with the email open in the editor sees them appear. Only drafts of type standard or template are accepted, an email can hold at most 100 blocks, and imports are limited to 100 per organization per day. It never sends or schedules anything.
import_from_planning_center
Insert a SECTION — a reusable run of blocks from list_email_sections — into a DRAFT block email or template, exactly as dropping it from the editor's sidebar does: its blocks are copied with fresh ids, in order, at one position. What renders: the section's blocks drawn in THIS email's design (fonts and colours follow the email; settings the section saved on a block itself are kept). source "saved" is one of this organization's saved sections; "prebuilt" is Flowforth's library (section ids are only unique together with source). Placement: position "end" (default) or "start", or after_block_id / before_block_id (top-level uuid). The email may hold at most 100 blocks. Nothing existing is changed. The section's copy is inserted as saved, so replace placeholder text afterwards (edit_email_text / update_email_block). Anyone with the email open in Flowforth's editor sees the change appear. Shares a budget of 500 block-editor changes per organization per day with the other block, design and footer tools; a refused call is not counted. Never sends or schedules.
insert_email_section
List the organization's QR codes — the trackable codes a church prints on bulletins, signage and cards — most recently updated first. Each row is one MANAGEMENT record: a name, the destination it sends people to, whether it is active, and the rendered codes attached to it with their scan counts. A destination is not always a web page: `destination.kind` says whether it is a "link", a "wifi" network payload, an "email", "phone" or "sms" URI, or something else, so do not describe a wifi code as opening a website or try to fetch its payload. `id` is what get_qr_code takes; `codes[].scan_url` is the address a printed code actually opens. An INACTIVE code still exists and is still listed — it just no longer redirects. `search` matches the code's name and its destination url. Paginated, 25 rows per page by default and up to 100 with `limit`. Read-only: QR codes cannot be created or changed through this connector.
list_qr_codes
List the saved versions of a draft block email, newest first — the same list as the Version history panel in Flowforth's editor. Each version has an id, when it was saved, why (while editing in Flowforth, before an AI edit, or before a restore) and the subject it had. The connector saves a version before its first change to an email in any 10-minute stretch, so a run of AI edits can be undone as one. Each email keeps its newest 50 versions. Pass a version id to restore_email_version to go back to it.
list_email_versions
List this organization's ASSET FOLDERS — the folders that organize the asset library (images and files), not email folders. Returns every folder with id, name, parent_id (null at the top level), path (e.g. "Photos / Easter") and url. Not paginated. Use a folder id with search_assets, create_asset_folder, update_asset_folder, delete_asset_folder or move_assets_to_folder.
list_asset_folders
List the organization's Planning Center (PCO) audience lists that can be emailed. Returns each list's id, description/name, current member count, when it was last refreshed from PCO, and its category. Paginated, 25 rows per page by default and up to 100 with `limit`.
list_lists
Same as list_emails, but defaulting to DRAFTS only — campaigns that have been set up but not sent. Kept for compatibility; prefer list_emails, which covers every status (sending, sent, failed, flagged and suppressed included) and takes the same arguments. `include_scheduled` also adds scheduled emails here, and an explicit `statuses` filter overrides both defaults. TEMPLATES ARE NOT INCLUDED even though they are stored as drafts: use list_email_templates for those. Rows with created_in "planning_center_add_on" (types pco-add-on and pco-add-on-designed) were written and sent from the Planning Center Add-On: they can be read, previewed and reported on, but no write or copy tool accepts them.
list_draft_emails
List the organization's email AUTOMATIONS — the multi-step flows that send email on their own when something happens (a person is added to an audience list, a Planning Center form is submitted) or on a schedule (every Sunday at 9am, the 3rd Tuesday of the month). Use it to answer "what runs automatically?", to check whether an automation is switched on, or to turn a name a person used into the automation_id that get_automation needs. Each row carries a rendered `trigger.description` such as "Sundays at 9:00 AM America/Chicago" or "When a person is added to \"New Visitors\"", so you do not have to assemble the schedule from raw columns — the audience list the trigger watches, with a url, and the folder it is filed in (`folder`, null at the top level). STEPS ARE NOT INCLUDED: what an automation actually does, in order, with its if/else branches, comes from get_automation. `search` matches the automation's name and description. Paginated, 25 rows per page by default and up to 100 with `limit`.
list_automations
List the addresses that bounced or complained on ONE sent email, newest first, with the provider's reason. A bounce is a message the receiving server would not accept: 'Permanent' (a hard bounce — the address does not exist, and Flowforth stops sending to it) or 'Transient' (a soft bounce — a full mailbox or a temporary failure). A complaint is a delivered message the recipient marked as spam. Both feed the cleaning and suppression that produce the 'cleaned' and 'suppressed' statuses on a contact, so an address here often turns up later as unmailable. Requires an email_id from list_sent_emails; this is PER-EMAIL — for bounces across the whole organization use list_people_feed. occurred_at is when the failure was recorded, not when the email was sent. Paginated, 25 rows per page by default and up to 100 with `limit`; totals for the whole email are returned alongside the page.
list_email_bounces
List the organization's email categories (subscription groups recipients can opt out of). Returns id, name, description, whether archived, and public/preference-center settings (is_public, slug, public_url). public_url is the category's public archive page on the organization's website and is only present when that page is actually reachable — it needs is_public, a slug AND a website domain or Flowforth subdomain; otherwise it is null. Requires email access without a send restriction — the app hides the categories page from send-restricted members. Paginated, 25 rows per page by default and up to 100 with `limit`.
list_email_categories
List all of the organization's email folders (used to organize campaigns). Returns id, name, parent_id (for nested folders), color, and the owning team name when the folder belongs to a team. Not paginated. Use a folder id with create_email, update_email, create_email_folder or update_email_folder.
list_email_folders
Flowforth ChatGPT Plugin FAQ
How the directory, categories and Discoverability Score work.
Read the methodologyHow do I improve Flowforth's ChatGPT Plugin discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Flowforth alternatives on ChatGPT?
As of 2026-11-10, Flowforth competes with ActiveCampaign, Aivie, Apsis Vega, Attentive, AWeber, Banger, beehiiv, Bizgo and 49 more in ChatGPT Email & SMS Lifecycle Marketing Automation, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.


