Head and body app embeds from the same extension are not widgets. They run storefront-wide, and member-site pages never include them. See Droplet theme extensions for the extension package format, settings schemas, and app embeds.
What a widget knows about the member
A widget renders as part of the page that places it, so it gets what that page gets.- On member pages, a widget section receives the page’s
memberandmember_contentvalues. Read{{ member.first_name }}directly, as a member page template does. See Member Liquid variables. - On storefront pages, the render is cached and has no member. Use
{% member %}and{% member_name %}for member-only content, and print prices as usual. The SDK fills these in the browser. See Greet members and show member-only content and Member pricing.
Build a widget that works on both
This section greets the member by name on a member page. On a cached storefront page, it leaves the greeting to the SDK:sections/rewards_balance/index.liquid in the extension. The presets entry is what lists the section in the builder.
Do not print the member’s name or other private values outside {% member %} on a storefront page. The cache would serve that HTML to the next visitor.
Place a widget in the builder
- Install the droplet in the company whose theme you are editing, and confirm its extension is published.
- Open the page template in the theme editor. For a member page, open the
members_dashboardtemplate or the page’smembers_pagetemplate. - Open the Widgets panel. The droplet’s sections are listed under the droplet’s name.
- Drag the section onto the page, select it, and edit its settings in the sidebar.
- Save and publish the template.
@app blocks, click Add Block, and choose the droplet’s block.
Each placement keeps its own settings. Removing a placement removes it from that page only. The droplet stays installed.
Place a widget in theme files
A placement is a literalsection tag with the widget’s extension URI, plus a matching entry in the template’s schema. It works the same way in a member page template as in a storefront template. This is members_page/rewards/index.liquid:
{% schema %} block. The tag’s id and the key under sections must match. See Place a page section directly in Liquid for the full rules and app block placement.
Push the changed template with the theme CLI, then publish it. A local edit alone does not change the live site.
Deploy a widget without the admin
An agent or a CI job can ship, install, and place a widget entirely through the API. SendAuthorization: Bearer <token> and Content-Type: application/json to https://api.fluid.app.
Two companies can be involved. The droplet’s owner company uploads the extension. The storefront company installs the droplet and places its widgets. Use a company token for each, or one token when the owner is also the storefront.
1. Package and host the ZIP
Build the extension ZIP withfluid.extension.toml at its root. See Package structure.
Put the ZIP at a public HTTPS URL that Fluid can download, such as a release asset or a signed storage URL. Fluid rejects http URLs and private or internal network addresses. The ZIP limit is 50 MB.
2. Upload it to the droplet
Update the droplet with the ZIP’s URL, using the owner company’s token:extension_zip_url in the create request. See Creating Droplets.
The request queues the import and returns straight away. The Theme Extension upload card in the admin is behind a company feature flag. This request is not.
3. Wait for the import to publish
Fetch the droplet with the owner company’s token:droplet.app_extensions[0].status. It moves from draft through publishing to published. On error, error_message says why the import failed. Poll every few seconds, and stop on published or error.
4. Install the droplet in the storefront company
409 means the droplet is already installed; continue to the next step. Installation is required even when the owner company uses its own droplet. Skip this step when you are only updating a widget that is already installed.
5. Find the widget’s extension URI
List the theme’s section templates with the storefront company’s token. Replace1842 with the id of the theme you are editing:
"source": "droplet". Use their extension_uri, such as fluid://extensions/42/sections/rewards_balance. Request themeable_type=blocks for app blocks. Never build the URI from the droplet’s id: the number in it is the theme extension’s id.
6. Place and publish
Add thesection tag and schema entry to the template, as in Place a widget in theme files. Push the template with the theme CLI and publish it. Open the page as a member and confirm the widget renders.
Update a widget
Upload a new ZIP to the same droplet and wait forpublished again. Every installed company renders the new version, and existing placements keep their settings.
An import replaces all of the extension’s templates and assets, so the ZIP must contain every widget you want to keep. Keep section names and setting ids stable. A placement whose section no longer exists renders nothing.