Soql Lib Query Builder
beyond-the-cloud-dev/soql-lib
Builds Salesforce SOQL queries using the SOQL Lib fluent builder API (SOQL.cls).
Salesforce Marketing Cloud / Engagement 360 message preview and test-send.
$ npx skills add forcedotcom/sf-skills --skill marketing-message-test -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install forcedotcom/sf-skills marketing-message-test --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/forcedotcom/sf-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/marketing-message-test .claude/skills/marketing-message-test && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "marketing-message-test" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/marketing-message-test into .claude/skills/marketing-message-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "marketing-message-test", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/forcedotcom/sf-skills/tree/main/skills/marketing-message-testType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add forcedotcom/sf-skills --skill marketing-message-test -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install forcedotcom/sf-skills marketing-message-test --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/forcedotcom/sf-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/marketing-message-test .agents/skills/marketing-message-test && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "marketing-message-test" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/marketing-message-test into .agents/skills/marketing-message-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "marketing-message-test", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add forcedotcom/sf-skills --skill marketing-message-test -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install forcedotcom/sf-skills marketing-message-test --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/forcedotcom/sf-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/marketing-message-test .cursor/skills/marketing-message-test && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "marketing-message-test" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/marketing-message-test into .cursor/skills/marketing-message-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "marketing-message-test", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/forcedotcom/sf-skills.git --path skills/marketing-message-test--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add forcedotcom/sf-skills --skill marketing-message-test -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install forcedotcom/sf-skills marketing-message-test --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/forcedotcom/sf-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/marketing-message-test .gemini/skills/marketing-message-test && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "marketing-message-test" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/marketing-message-test into .gemini/skills/marketing-message-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "marketing-message-test", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install forcedotcom/sf-skills marketing-message-testInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add forcedotcom/sf-skills --skill marketing-message-test -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/forcedotcom/sf-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/marketing-message-test .github/skills/marketing-message-test && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "marketing-message-test" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/marketing-message-test into .github/skills/marketing-message-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "marketing-message-test", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add forcedotcom/sf-skills --skill marketing-message-test -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install forcedotcom/sf-skills marketing-message-test --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/forcedotcom/sf-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/marketing-message-test .opencode/skills/marketing-message-test && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "marketing-message-test" agent skill from https://github.com/forcedotcom/sf-skills/tree/main/skills/marketing-message-test into .opencode/skills/marketing-message-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "marketing-message-test", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
marketing-message-testSalesforce Marketing Cloud / Engagement 360 message preview and test-send.
Marketing Message Test is an agent skill from forcedotcom/sf-skills. Salesforce Marketing Cloud / Engagement 360 message preview and test-send. Use this skill when the user wants to render a personalized or unpersonalized preview of an E360 message (Email, SMS, WhatsApp, Push, In-App, RCS) from a content key, or fire a test send, over the headless API — no app UI. TRIGGER when: user has a contentKey and wants to see how a message renders for a recipient, preview a message headlessly, or send a test message. DO NOT TRIGGER when: the task is authoring message content, building Data…
Its SKILL.md is about 5.1k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/api-contract.md`).
It sits in Sales & Support, covering CRM management. It works with Salesforce and WhatsApp. The repository describes itself as: Salesforce's curated collection of agent skills for building applications. Optimized for Agentforce Vibes, compatible with all AI tools. The licence is Apache-2.0.
6 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit e5164d9. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
sfFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Marketing Message Test loads about 5.1k tokens when it runs, and up to ~11k if it reads all its reference files. Until then it costs about 163 tokens; SKILL.md has 1,805 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from forcedotcom/sf-skills at commit e5164d9, republished under its Apache-2.0 licence (© forcedotcom). 1,805 words, ~5,074 tokens.
.claude/skills/marketing-message-test/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Render a per-channel preview (or fire a test send) for a Marketing Cloud / Engagement 360 message, headlessly, starting from a single contentKey. Covers all six channels: Email, SMS, WhatsApp, Push, In-App, RCS.
Full endpoint tables, request bodies, response-field rules, and the version-floor matrix live in references/api-contract.md. This file is the operating procedure; consult the reference for exact payloads.
Use marketing-message-test when the user wants to:
Delegate elsewhere when the user is:
contentKey — required, irreducible. The caller must supply it; it is not derivable.sf org open / access token)toAddresses (Email), toPhoneNumbers (SMS/WhatsApp/RCS), or toIndividualIds (Push/In-App). Never derive these.| Purpose | Transport | Instance-relative path |
|---|---|---|
| Preview · test send · sender lookups | LWR Apex | lwr/apex/v68.0/… — the exact operation path is on each step's Call line |
| Managed content · data space · DMO · segment · profile | Connect REST | services/data/vXX.0/… (per-resource floors; v62.0+ covers all six channels) |
WhatsApp template fetch (whatsapp-template-fetch) | Headless dispatch | /headless/invoke/… — a dispatch route, so invoke it through the dispatch tool, not sf api request rest (see the reference doc for details) |
Versions:
v68.0 (the path just needs a well-formed vXX.0 segment).Always use sf api request rest — never curl. It attaches the org's bearer token internally, so the credential never enters your context. Never extract a token (e.g. sf org display --json) or put one in an Authorization header — that leaks a live credential and is disallowed. Pass the instance-relative path (no host); the CLI prepends the instance URL and accepts both transports (LWR-Apex paths aren't under services/data/, but any instance-relative path works). One step is the exception — whatsapp-template-fetch is a headless /headless/invoke dispatch route, invoked through the dispatch tool rather than sf api request rest.
# GET (default method); path is instance-relative
sf api request rest 'services/data/v63.0/ssot/data-spaces' --target-org <org>
# POST with a flat JSON body from a file (content-type: application/json is sent by default)
# path = the target operation's **Call** line (e.g. the `preview-sms-unpersonalized` step)
sf api request rest '<lwr/apex Call path>' \
--target-org <org> --method POST --body @body.jsonVerb rule (do not violate — wrong verb is rejected):
--method POST) with a flat JSON body whose keys are exactly the parameter names — no envelope, no wrapper object.methodParams query param (URL-encoded JSON string) appended to the path; no-arg methods omit it.segmentId, profileId, DMO name, or destination. Every value is either given by the user or derived from the org via the chain below.contentKey; personalized needs segmentId + recipientDataModelObjectName + contentKey + profileId, and the profileId must be a member of that segmentId (it comes from that segment's member list — see the chain).profileId) comes solely from the chosen segment's member list, and must be a member of the segmentId passed to the render. If the segment has no members — or no segment exists in the content's data space — the personalization render cannot be performed: report cannot personalize — no valid segment member and stop. The unpersonalized preview (contentKey only) is still available; offer it. Never source the recipient from anywhere else (e.g. by listing individuals from the DMO) — a non-member profileId is rejected by the render with an opaque error.send-test-… steps). If the user asked only to preview, never fire a test send.send-test-<channel>, call that channel's permission check (step perm-can-send-test-<channel> — a no-arg GET returning a Boolean). If it returns false, surface a permission error and stop — do not attempt the send. Preview never needs this check.profileId is a Data Cloud profile key (e.g. a1b2c3d4…), NOT a CRM id (003…) or a segment id (1sg…).sf api request rest; don't hand the user raw commands to run.contentKey)Detailed payloads for every step: references/api-contract.md.
GET /services/data/vXX.0/connect/cms/contents/{contentKey} (v57+) → managedContentId, contentBody. Use the CMS Authoring API (keyed by contentKey), not the delivery API — it returns the draft the preview renders.recipientDataModelObjectName. Parse contentBody['lightning:dataProviders'] for objectApiName (that is the DMO) or dataGraphApiName — for the latter, GET /ssot/data-graphs/{dataGraphApiName} (v58+) and read primaryObjectName (its response also returns dataspaceName, usable directly in step 3). If the content declares no data provider, leave the DMO unresolved for now — it comes from the org fallback in step 3, which needs the data space first.dataSpaceName (scopes every /ssot/… call below). GET /ssot/data-spaces (v62+).ssot__… prefix or an unrecognized name → default; a <prefix>_ token → match against the prefix field and take that entry's name. default on single-space orgs.default on a single-space org, otherwise ask the user which space. Then resolve the DMO from the org via the org-fallback lookup (step messaging-selected-uma-dmo, body { dataSpaceName }). A null result means "no personalized preview available for this org" — report that, do NOT retry.GET /ssot/segments?dataspace=<name> (v55+). Keep the apiName (fetches members) and the 1sg… marketSegmentId (the segmentId).GET /ssot/segments/{segmentApiName}/members?limit=10&dataspace=<name> (v58+) → member id. That id is the profileId; because it's a member of the segment, the render accepts it.cannot personalize — no valid segment member and offer the unpersonalized preview instead. Do not source the recipient elsewhere (e.g. by listing individuals from the DMO) — a profileId that isn't a member of the passed segmentId is rejected by the render with an opaque error.preview-<channel>-personalized, or the …-by-locale variant) with the flat body { segmentId, recipientDataModelObjectName, contentKey, profileId, … }.Unpersonalized short-circuits after step 1: call the channel's unpersonalized-preview operation (step preview-<channel>-unpersonalized) with { contentKey } (add locale for Email's …-by-locale variant).
Test send = the channel's permission check (step perm-can-send-test-<channel>; stop if false), then steps 1–6, then a sender lookup (Part 3 of the reference) for fromAddress/senderId, then the channel's test-send operation (step send-test-<channel>) with the user's supplied destination array.
body for personalized calls, nonAggregateHtmlBody for unpersonalized — read body first, fall back to nonAggregateHtmlBody. Also surface subject and preheader.content string; MMS also carries mediaUrl.{ content, metadata } as JSON strings; reassemble {{k}} slots from the fetched template (see the reference — this is the fiddly one).Fetch media from the rendered
<img src>, not the content definition. Rendered srcs are public-CDN URLs (…salesforce-experience.com/_scs/cms/…) that fetch unauthenticated.contentBody/cms/media/…refs are session-gated — unauthenticated they return an HTML login page (HTTP 200, no error), not image bytes.
If the content declares content variables under sfdc_cms:schema.properties, they render empty unless supplied. Ask the user for a value for each — never invent one — and pass them via recipientAttributesJson (a JSON string), on Email/SMS/WhatsApp/RCS only.
Push and In-App personalized previews do not support content variables. If any are declared in the content definition (
sfdc_cms:schema.propertiesnon-empty) for one of those channels, stop and inform the user it's not supported — do not troubleshoot.
methodParams.contentKey is irreducible — every path bottoms out at it; the user must supply it.messaging-selected-uma-dmo) returning null = "no personalized preview available," not a retryable error.profileId comes only from the chosen segment's member list and must be a member of the segmentId passed to the render. No members (or no segment) → personalization cannot be performed; stop and offer unpersonalized. Never source the recipient from a DMO listing — a non-member profileId is rejected with an opaque error.id (a Data Cloud key, e.g. a1b2c3d4… — not a 1sg… segment id or a 003… CRM id); that id is the profileId.v68.0; the path segment just needs to be well-formed); the REST derivation resources have per-resource minimums. Highest REST floor is data-spaces at v62.0, so target v62.0+ for full six-channel coverage (lower channels work below that).Message: <contentKey> (channel: <Email/SMS/WhatsApp/Push/In-App/RCS>)
Mode: <personalized preview / unpersonalized preview / test send>
Target org: <alias>
Derived inputs: dataSpace=<name> DMO=<…__dlm> segmentId=<1sg…> profileId=<profile key>
API calls: <method — verb — endpoint> (one line each)
Rendered output:
<subject / rendered text / HTML body, per channel>
Next step: <act / adjust inputs / follow-up><!-- skill-validate: ignore-start -->
<!-- codey:operations start -->
Operations this skill uses — routing and dependency reference.
| Operation | Purpose | Status | Call | Depends on |
|---|---|---|---|---|
cms-content-fetch | read | — | GET /services/data/v63.0/connect/cms/contents/{contentKeyOrId} | — |
messaging-selected-uma-dmo | read | — | POST lwr/apex/v68.0/interaction__MessagingController/getSelectedUnifiedIndividualDmoForUma | data-spaces-list |
data-graph-primary-object | read | — | GET /services/data/v63.0/ssot/data-graphs/{dataGraphApiName} | — |
data-spaces-list | read | — | GET /services/data/v63.0/ssot/data-spaces | — |
dmo-describe | read | — | GET /services/data/v63.0/ssot/data-model-objects/{dmoName} | — |
segments-list | read | — | GET /services/data/v63.0/ssot/segments | data-spaces-list |
segment-members-list | read | — | GET /services/data/v63.0/ssot/segments/{segmentApiName}/members | segments-list |
profile-fetch-by-id | verify | — | GET /services/data/v63.0/ssot/profile/{dmoName}/{profileId} | — |
cms-spaces-list | read | — | GET /services/data/v63.0/connect/cms/spaces | — |
preview-email-unpersonalized | read | — | POST lwr/apex/v68.0/interaction__JourneyController/getEmailUnpersonalizedPreviewContent | cms-content-fetch |
preview-email-unpersonalized-by-locale | read | — | POST lwr/apex/v68.0/interaction__JourneyController/getEmailUnpersonalizedPreviewContentByLocale | cms-content-fetch |
preview-email-personalized | read | — | POST lwr/apex/v68.0/interaction__JourneyController/getEmailPersonalizedPreviewContent | cms-content-fetch, segments-list |
preview-email-personalized-by-locale | read | — | POST lwr/apex/v68.0/interaction__JourneyController/getEmailPersonalizedPreviewContentByLocale | cms-content-fetch, segments-list |
preview-sms-unpersonalized | read | — | POST lwr/apex/v68.0/interaction__JourneyController/getSmsUnpersonalizedPreviewContent | cms-content-fetch |
preview-sms-personalized | read | — | POST lwr/apex/v68.0/interaction__JourneyController/getSmsPersonalizedPreviewContent | cms-content-fetch, segments-list |
preview-whatsapp-unpersonalized | read | — | POST lwr/apex/v68.0/interaction__JourneyController/getWhatsappUnpersonalizedPreviewContent | cms-content-fetch |
preview-whatsapp-personalized | read | — | POST lwr/apex/v68.0/interaction__JourneyController/getWhatsappPersonalizedPreviewContent | cms-content-fetch, segments-list |
preview-push-unpersonalized | read | — | POST lwr/apex/v68.0/interaction__JourneyController/getPushUnpersonalizedPreviewContent | cms-content-fetch |
preview-push-personalized | read | — | POST lwr/apex/v68.0/interaction__JourneyController/getPushPersonalizedPreviewContent | cms-content-fetch, segments-list |
preview-inapp-unpersonalized | read | — | POST lwr/apex/v68.0/interaction__JourneyController/getInAppUnpersonalizedPreviewContent | cms-content-fetch |
preview-inapp-personalized | read | — | POST lwr/apex/v68.0/interaction__JourneyController/getInAppPersonalizedPreviewContent | cms-content-fetch, segments-list |
preview-rcs-unpersonalized | read | — | POST lwr/apex/v68.0/interaction__JourneyController/getRcsUnpersonalizedPreviewContent | cms-content-fetch |
preview-rcs-personalized | read | — | POST lwr/apex/v68.0/interaction__JourneyController/getRcsPersonalizedPreviewContent | cms-content-fetch, segments-list |
whatsapp-template-fetch | read | — | GET /headless/invoke/platform/conversation-setup/whats-app-templates/get-by-id | — |
send-test-email | write | — | POST lwr/apex/v68.0/interaction__JourneyController/sendTestEmail | cms-content-fetch, segments-list, sender-email-from-addresses, perm-can-send-test-email |
send-test-email-by-locale | write | — | POST lwr/apex/v68.0/interaction__JourneyController/sendTestEmailByLocale | cms-content-fetch, segments-list, sender-email-from-addresses, perm-can-send-test-email |
send-test-sms | write | — | POST lwr/apex/v68.0/interaction__JourneyController/sendTestSms | cms-content-fetch, segments-list, sender-sms-codes, perm-can-send-test-sms |
send-test-whatsapp | write | — | POST lwr/apex/v68.0/interaction__JourneyController/sendTestWhatsapp | cms-content-fetch, segments-list, sender-whatsapp-numbers, perm-can-send-test-whatsapp |
send-test-push | write | — | POST lwr/apex/v68.0/interaction__JourneyController/sendTestPush | cms-content-fetch, segments-list, perm-can-send-test-push |
send-test-inapp | write | — | POST lwr/apex/v68.0/interaction__JourneyController/sendTestInApp | cms-content-fetch, segments-list, perm-can-send-test-inapp |
send-test-rcs | write | — | POST lwr/apex/v68.0/interaction__JourneyController/sendTestRcs | cms-content-fetch, segments-list, sender-rcs-agents, perm-can-send-test-rcs |
sender-email-from-addresses | read | — | GET lwr/apex/v68.0/interaction__JourneyController/getFromAddresses | — |
sender-email-dkim-valid | verify | — | GET lwr/apex/v68.0/interaction__JourneyController/fromAddressHasValidDKIM | sender-email-from-addresses |
sender-sms-codes | read | — | GET lwr/apex/v68.0/interaction__JourneyController/getSenderSmsCodes | — |
sender-whatsapp-numbers | read | — | GET lwr/apex/v68.0/interaction__JourneyController/getSenderWhatsappNumbers | — |
sender-whatsapp-waba-ids | read | — | GET lwr/apex/v68.0/interaction__JourneyController/getSenderWabaIdsAndNames | — |
sender-rcs-agents | read | — | GET lwr/apex/v68.0/interaction__JourneyController/getSenderRcsAgents | — |
perm-can-send-test-email | verify | — | GET lwr/apex/v68.0/interaction__JourneyController/canUserSendTestEmail | — |
perm-can-send-test-sms | verify | — | GET lwr/apex/v68.0/interaction__JourneyController/canUserSendTestSms | — |
perm-can-send-test-whatsapp | verify | — | GET lwr/apex/v68.0/interaction__JourneyController/canUserSendTestWhatsapp | — |
perm-can-send-test-push | verify | — | GET lwr/apex/v68.0/interaction__JourneyController/canUserSendTestPush | — |
perm-can-send-test-inapp | verify | — | GET lwr/apex/v68.0/interaction__JourneyController/canUserSendTestInApp | — |
perm-can-send-test-rcs | verify | — | GET lwr/apex/v68.0/interaction__JourneyController/canUserSendTestRcs | — |
<!-- codey:operations end -->
<!-- skill-validate: ignore-end -->
© forcedotcom, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (references) in skills/marketing-message-test of forcedotcom/sf-skills.
Open the folder on GitHubat commit e5164d9
Marketing Message Test next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Marketing Message Test this skillforcedotcom/sf-skills | 1.1k | — | ~5.1k | Automated safety check: Pass | Apache-2.0 | |
| Soql Lib Query Builderbeyond-the-cloud-dev/soql-lib | 154 | — | ~4.3k | Automated safety check: Pass | MIT | |
| Sf DatacloudJaganpro/sf-skills | 424 | — | ~2.7k | Automated safety check: Pass | MIT | |
| B2b Sdr AgentiPythoning/b2b-sdr-agent-template | 190 | — | ~744 | Automated safety check: Pass | MIT-0 | |
| Soql Lib Selectorbeyond-the-cloud-dev/soql-lib | 154 | — | ~2k | Automated safety check: Pass | MIT | |
| Dev SetupPortwood-Global-Solutions/Portwood | 125 | — | ~1.1k | Automated safety check: Pass | Apache-2.0 |
beyond-the-cloud-dev/soql-lib
Builds Salesforce SOQL queries using the SOQL Lib fluent builder API (SOQL.cls).
Jaganpro/sf-skills
Salesforce Data Cloud product orchestrator for connect→prepare→harmonize→segment→act workflows.
iPythoning/b2b-sdr-agent-template
Open-source B2B AI SDR template. An agent skill from iPythoning/b2b-sdr-agent-template.
beyond-the-cloud-dev/soql-lib
Creates Salesforce Apex selector classes using the SOQL Lib selector pattern.
Portwood-Global-Solutions/Portwood
Get from a fresh clone of Portwood to a working, fully-tested Salesforce org.
Jaganpro/sf-skills
Creates and validates Salesforce Flows with 110-point scoring.
forcedotcom/sf-skills
Declared architecture snapshot for one Agentforce agent: planner, topics, actions, flows, Apex, prompt templates, and NGA plugins.
forcedotcom/sf-skills
Data Cloud 360° view of a single Agentforce session. An agent skill from forcedotcom/sf-skills.
forcedotcom/sf-skills
Apply a Salesforce sandbox post-copy automation JSON config against a target org.
forcedotcom/sf-skills
Apply a Salesforce sandbox post-copy automation JSON config against a target org.
forcedotcom/sf-skills
Apply SLDS-compliant UI using the correct blueprints, styling hooks, utility classes, and icons.
forcedotcom/sf-skills
Lightning Web Components with PICKLES methodology and 165-point scoring.
Works with
Categories
Salesforce Marketing Cloud / Engagement 360 message preview and test-send. Marketing Message Test is an agent skill from forcedotcom/sf-skills. Salesforce Marketing Cloud / Engagement 360 message preview and test-send.
Marketing Message Test fits situations like: the user wants to render a personalized; unpersonalized preview of an E360 message (Email; RCS) from a content key; fire a test send.
Run `npx skills add forcedotcom/sf-skills --skill marketing-message-test -a claude-code`. Or copy the skill folder (skills/marketing-message-test in forcedotcom/sf-skills) into .claude/skills/marketing-message-test in your project. Claude Code loads it when a task matches its description.
Run `npx skills add forcedotcom/sf-skills --skill marketing-message-test -a codex`. Or copy the skill folder (skills/marketing-message-test in forcedotcom/sf-skills) into .agents/skills/marketing-message-test in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add forcedotcom/sf-skills --skill marketing-message-test -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/marketing-message-test, .gemini/skills/marketing-message-test, .github/skills/marketing-message-test and .opencode/skills/marketing-message-test in your project.
Going by SKILL.md and its folder, Marketing Message Test needs the command-line tools its instructions call (sf).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Marketing Message Test is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.1k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 6.3k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Marketing Message Test: Soql Lib Query Builder (beyond-the-cloud-dev/soql-lib, 154 stars), Sf Datacloud (Jaganpro/sf-skills, 424 stars), B2b Sdr Agent (iPythoning/b2b-sdr-agent-template, 190 stars) and Soql Lib Selector (beyond-the-cloud-dev/soql-lib, 154 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
forcedotcom (a GitHub organization) maintains it in forcedotcom/sf-skills, which has 1,060 GitHub stars. The repository holds 251 skills in this directory. The repository was last updated on October 7, 2026.
Source: forcedotcom/sf-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.