PluginBench
Skill
Pass
Audit score 90

sender-profile-architect

sentdm/sent-plugin

Design multi-tenant Sender Profile architecture for Sent messaging systems with isolation, billing, and credential scoping.

What is sender-profile-architect?

Sender Profile Architect guides you through designing operational boundaries for tenant identity, channel configuration, billing, and credentials in multi-tenant Sent deployments. Use this when provisioning systems that require explicit isolation decisions, API-key scoping, WABA integration, or 10DLC campaign management.

  • Choose between profile-specific API keys (tenant-scoped credentials) or organization keys with x-profile-id header (centralized control)
  • Design tenant isolation using one Sent organization with one Sender Profile per tenant, or shared profiles for genuinely unified brands
  • Configure inheritance and sharing for contacts, templates, TCR brands, and campaigns across profile hierarchies
  • Set up dedicated WABA credentials, billing models, and 10DLC brand/campaign management per profile
  • Map message_id and inbound numbers to tenants for webhook attribution and event routing
  • Plan safe tenant offboarding with credential revocation, resource detachment, and audit retention

How to install sender-profile-architect

npx skills add https://github.com/sentdm/sent-plugin --skill sender-profile-architect
Prerequisites
  • Access to Sent v3 API and organization admin credentials
  • Understanding of your multi-tenancy model (isolated vs. shared tenants)
  • Sent dashboard or API client for profile creation and management
Claude Code
Cursor
Windsurf
Cline

How to use sender-profile-architect

  1. 1.Review the recommended tenancy model and decide whether each tenant needs isolation or can share a profile
  2. 2.Choose an authentication pattern: profile-specific API keys for credential isolation, or organization keys with x-profile-id for centralized control
  3. 3.Design profile creation parameters including identity, sharing flags, inheritance rules, billing model, and WABA/brand configuration
  4. 4.Create profiles using POST /v3/profiles with appropriate name, billing_contact, and optional brand/WABA/inheritance settings
  5. 5.Complete profiles with POST /v3/profiles/{profileId}/complete and a webhook URL for status callbacks
  6. 6.Establish message_id and inbound-number mappings to route webhook events back to the correct tenant
  7. 7.Document credential blast radius, number reference cycles, and tenant offboarding procedures

Use cases

Good for
  • Multi-SaaS platform where each customer needs isolated sender identity, rate limits, and webhook endpoints
  • Enterprise with multiple brands requiring separate compliance posture, billing, and WABA credentials under one organization
  • Shared messaging infrastructure where some tenants inherit organization brand/campaigns and others maintain dedicated resources
  • 10DLC SMS campaign management with per-profile brand registration and campaign lifecycle
  • Webhook event routing that correctly attributes inbound messages and delivery status to the originating tenant
Who it's for
  • Backend architects designing multi-tenant messaging platforms
  • DevOps engineers provisioning Sent organizations and profiles
  • Product managers defining tenant isolation and billing boundaries
  • Integration engineers mapping credentials, webhooks, and resource ownership

sender-profile-architect FAQ

When should I use a profile-specific API key vs. an organization key with x-profile-id?

Use profile-specific keys when tenant-level credential isolation and independent revocation are critical. Use organization keys with x-profile-id for centrally controlled integrations that can protect a broader credential and accept a shared organization rate-limit pool.

Can multiple tenants share a single Sender Profile?

Yes, but only when tenants genuinely share one brand, sender resources, compliance posture, billing expectations, and operational blast radius. Otherwise, recommend one profile per tenant for explicit isolation.

How do I route webhook events to the correct tenant?

Persist the returned message_id with tenant_id and profile_id before sending. For inbound messages, map the receiving number/profile resource to the tenant. Do not infer tenant ownership from account_id alone.

What are the three WABA integration paths?

Organization Embedded Signup via the dashboard, child profile inheritance by omitting whatsapp_business_account, or dedicated profile WABA using waba_id and access_token. Do not mix these patterns.

What does the profile status field mean?

Status is surface-specific: create responses show lowercase 'incomplete', completion returns 202 (processing) or 200 (already complete), and callbacks report COMPLETED, SUBMITTED, or failed. Preserve unknown status strings and record the endpoint that produced them.

Full instructions (SKILL.md)

Source of truth, from sentdm/sent-plugin.


name: sender-profile-architect description: Designs Sent Sender Profile architecture for multi-tenant, multi-brand, and multi-channel systems. Use for API-key scoping, x-profile-id, isolation, inheritance, sharing, billing, WABA, 10DLC campaigns, webhooks, or tenant offboarding.

Sender Profile Architect

A Sender Profile is the operational boundary for tenant identity, channel configuration, inherited resources, billing, and credentials. Use this skill before provisioning when a poor boundary would mix brands, compliance posture, rate-limit impact, or webhook ownership.

Recommended tenancy model

When tenants require isolation, recommend one Sent organization with one Sender Profile per tenant. A shared profile is appropriate only when the tenants genuinely share one brand, sender resources, compliance posture, billing/rate-limit expectations, and operational blast radius.

Do not recommend pooled-by-default architecture. Make the isolation decision explicit using references/multi-tenancy-patterns.md.

Authentication patterns

Sent v3 supports both:

PatternHeadersBlast radius
Profile-specific API keyx-api-keyProfile-scoped credentials and rate-limit context. Do not add x-profile-id.
Organization API key acting for a childx-api-key plus x-profile-id: <profile UUID>Organization credential can reach permitted child profiles; rate limits remain in the organization pool.

Only organization keys may send x-profile-id. A profile key that sends it receives 403. A profile outside the organization returns 404. X-Profile-Id can be echoed in scoped responses.

x-sender-id is legacy v1/v2 terminology only. Do not use it for v3 authentication or routing.

Choose profile keys when tenant-level credential isolation and revocation are primary. Choose organization-key scoping for centrally controlled integrations that can protect a broader credential and deliberately accept a shared organization rate-limit pool.

Profile creation model

Create with POST /v3/profiles. name is required. Current optional areas include:

  • identity: icon, description, short_name;
  • sharing: allow_contact_sharing, allow_template_sharing;
  • inheritance: inherit_contacts, inherit_templates, inherit_tcr_brand, inherit_tcr_campaign;
  • billing: billing_model, billing_contact, and ephemeral payment_details;
  • dedicated WABA credentials: whatsapp_business_account with waba_id, optional phone_number_id, and access_token;
  • a dedicated brand: brand.contact, brand.business, and brand.compliance.

Do not add a separate brand endpoint. A dedicated brand is created with the profile; campaigns are managed under /v3/profiles/{profileId}/campaigns.

Inheritance rules

  • inherit_tcr_brand: true means the profile uses the organization's brand and cannot submit its own brand object.
  • inherit_tcr_campaign: true makes inherited campaigns read-only for that profile.
  • An inherited brand with inherit_tcr_campaign: false is a supported dedicated-campaign pattern.
  • Sharing flags expose a profile's contacts/templates; inheritance flags consume organization resources. Treat those directions separately.

Billing and number references

billing_model currently supports profile, organization, and profile_and_organization. A profile or fallback billing model requires billing_contact when none exists. Card fields are forwarded to the payment processor and must not be logged or persisted.

Profile update can manage sending_phone_number_profile_id, sending_whatsapp_number_profile_id, sending_phone_number, whatsapp_phone_number, and allow_number_change_during_onboarding. Model reference IDs and direct numbers separately, and prevent cycles when one profile references another.

WABA choices

There are three distinct paths:

  1. Organization Embedded Signup in the dashboard.
  2. Child profile inheritance by omitting whatsapp_business_account after the organization has a WABA.
  3. Dedicated profile WABA using waba_id and access_token; phone_number_id is optional.

There is no public endpoint that starts organization Embedded Signup. Direct credentials on POST /v3/profiles are not an “Embedded Signup endpoint.” Use waba-embedded-signup for the operational flow.

10DLC and campaigns

Use a profile brand object for a dedicated brand. Manage campaigns at:

  • GET|POST /v3/profiles/{profileId}/campaigns
  • PUT|DELETE /v3/profiles/{profileId}/campaigns/{campaignId}

Use sms-10dlc-registration for the payload and policy layer.

Completion and status handling

Complete a profile with POST /v3/profiles/{profileId}/complete and a required webHookUrl:

{
  "webHookUrl": "https://example.com/webhooks/profile-complete",
  "sandbox": true
}

Status is surface-specific:

  • Create response currently demonstrates lowercase incomplete.
  • Completion 202 means processing started and does not contain a final status.
  • Completion 200 currently demonstrates lowercase completed for an already-complete profile.
  • Completion callbacks can report COMPLETED, SUBMITTED, or failed.
  • REST guides and OpenAPI publish different profile status sets.

Do not assert a closed REST enum. Preserve unknown strings and record the endpoint/callback surface that produced them.

Webhook attribution

Sent events do not contain your application tenant ID. Before sending, persist the returned message_id with the tenant and profile. Route outbound status events through that mapping. For inbound messages, map the receiving number/profile resource to the tenant.

message_id -> tenant_id, profile_id, logical_send_id, channel
receiving_number -> tenant_id, profile_id

Do not infer tenant ownership from account_id alone. Multiple tenant profiles can belong to one organization.

Design checklist

  • Tenant/brand isolation decision is explicit.
  • Credential pattern and rate-limit/blast radius are documented.
  • Sharing and inheritance directions are intentional.
  • Billing ownership is named.
  • Number references cannot form cycles.
  • WABA path is organization signup, inheritance, or dedicated credentials—not an invented hybrid.
  • Dedicated brand/campaign paths are profile-based.
  • message_id and inbound-number mappings support webhook attribution.
  • Unknown profile statuses are tolerated.
  • Tenant offboarding revokes credentials, disables sends, detaches resources safely, and retains audit evidence.

See references/sender-profile-data-model.md and references/profile-boundary-examples.md for implementation patterns.