Skip to content
OpenSmartRoute
Skillv1.0.0

clay-architecture-variants

Choose and implement Clay integration architecture for different scales and use cases. Use when designing new Clay integrations, comparing direct vs queue-based vs event-driven, or planning architectu

by jeremylongshore(0) 0 installs
Free
Sign in to install

Free account. Installing gives you the manifest plus copy-paste snippets.

See reviews

About

Imported from jeremylongshore/tons-of-skills-marketplace (plugins/saas-packs/clay-pack/skills/clay-architecture-variants/SKILL.md). Install upstream with npx skills add jeremylongshore/tons-of-skills-marketplace --skill clay-architecture-variants. Copyright stays with the author (MIT).

Clay Architecture Variants

Overview

Three proven architecture patterns for Clay data enrichment at different scales. Clay is a hosted SaaS -- your architecture decisions focus on how you send data in (webhooks), how you get enriched data out (HTTP API columns, CRM sync, or CSV export), and how you orchestrate the flow.

Prerequisites

  • Clay account with appropriate plan tier
  • Clear understanding of data volume and latency requirements
  • Infrastructure for chosen architecture tier (if queue-based or event-driven)

Instructions

Architecture 1: Direct Integration (Simple)

Best for: Small teams, < 1K enrichments/day, ad-hoc usage.

┌──────────────┐     webhook     ┌───────────┐
│ Your App     │───────POST─────>│ Clay Table │
│ (or CSV)     │                 │ (enriches) │
└──────────────┘                 └─────┬─────┘
                                       │
                                  CRM action
                                  or CSV export
                                       │
                                       v
                                 ┌───────────┐
                                 │ CRM / DB  │
                                 └───────────┘
// Direct: send leads synchronously, export results manually
async function directEnrich(leads: Lead[]): Promise<void> {
  for (const lead of leads) {
    await fetch(process.env.CLAY_WEBHOOK_URL!, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(lead),
    });
    await new Promise(r => setTimeout(r, 250)); // Rate limit
  }
  console.log(`Sent ${leads.length} leads. Check Clay table for enriched data.`);
  // Enriched data reaches CRM via Clay's native CRM action column
}

Pros: Zero infrastructure, 5-minute setup, works on all Clay plans. Cons: No retry logic, no programmatic access to enriched data, manual export only.


Architecture 2: Webhook-in, HTTP API-out (Standard)

Best for: Growing teams, 1K-10K enrichments/day, CRM integration.

┌──────────────┐     webhook     ┌───────────┐   HTTP API col   ┌──────────────┐
│ Your App     │───────POST─────>│ Clay Table │──────POST──────>│ Your Webhook │
│              │                 │ (enriches) │                 │ Handler      │
└──────────────┘                 └───────────┘                 └──────┬───────┘
                                                                      │
                                                                 Process +
                                                                 Route
                                                                      │
                                                          ┌───────────┼───────────┐
                                                          │           │           │
                                                          v           v           v
                                                       ┌─────┐   ┌───────┐   ┌──────┐
                                                       │ CRM │   │Outreach│  │ DB   │
                                                       └─────┘   └───────┘   └──────┘
// Standard: send leads via webhook, receive enriched data via HTTP API column
// Inbound: Your app -> Clay
async function sendLeads(leads: Lead[]): Promise<void> {
  const batchResult = await clayClient.sendBatch(leads, 200);
  console.log(`Sent: ${batchResult.sent}, Failed: ${batchResult.failed}`);
}

// Outbound: Clay HTTP API column -> Your webhook handler
app.post('/api/clay/enriched', async (req, res) => {
  res.json({ ok: true }); // Respond fast

  const lead = req.body;
  if (lead.icp_score >= 80 && lead.work_email) {
    await pushToCRM(lead);
    await addToOutreachSequence(lead);
  } else if (lead.icp_score >= 50) {
    await addToNurtureCampaign(lead);
  }
});

Pros: Full automation, programmatic access to enriched data, flexible routing. Cons: Requires Growth plan (HTTP API columns), needs public HTTPS endpoint.


Architecture 3: Queue-Based Pipeline (Scale)

Best for: Enterprise, 10K+ enrichments/day, multiple data sources.

┌───────────┐
│ Web Forms │──┐
└───────────┘  │     ┌───────────┐     webhook     ┌───────────┐
               ├────>│ Job Queue │───────POST─────>│ Clay Table │
┌───────────┐  │     │ (BullMQ)  │                 │ (enriches) │
│ CRM Events│──┘     └───────────┘                 └─────┬─────┘
└───────────┘              │                              │
                      DLQ on fail                   HTTP API col
┌───────────┐              │                              │
│ CSV Import│──────────────┘                              v
└───────────┘                                   ┌──────────────┐
                                                │ Your Handler │
                                                │ (w/ circuit  │
                                                │  breaker)    │
                                                └──────┬───────┘
                                                       │
                                            ┌──────────┼──────────┐
                                            │          │          │
                                            v          v          v
                                         ┌─────┐  ┌───────┐  ┌──────┐
                                         │ CRM │  │Outreach│  │ DWH  │
                                         └─────┘  └───────┘  └──────┘
// Scale: queue-based with DLQ, circuit breaker, and multi-source intake
import { Queue, Worker } from 'bullmq';

const enrichQueue = new Queue('clay-enrichment');

// Multiple sources feed the queue
async function onWebFormSubmit(lead: Lead) {
  await enrichQueue.add('web-form', { ...lead, source: 'web-form' });
}

async function onCRMEvent(lead: Lead) {
  await enrichQueue.add('crm-event', { ...lead, source: 'crm-event' });
}

async function onCSVImport(leads: Lead[]) {
  for (const lead of leads) {
    await enrichQueue.add('csv-import', { ...lead, source: 'csv-import' });
  }
}

// Worker sends to Clay with rate limiting and circuit breaker
const worker = new Worker('clay-enrichment', async (job) => {
  const { allowed, reason } = circuitBreaker.canProcess(6);
  if (!allowed) throw new Error(`Circuit open: ${reason}`);

  const res = await fetch(process.env.CLAY_WEBHOOK_URL!, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(job.data),
  });

  if (!res.ok) throw new Error(`Clay webhook failed: ${res.status}`);
  circuitBreaker.recordSuccess(6);
}, {
  concurrency: 1,
  limiter: { max: 5, duration: 1000 }, // 5 per second max
});

Pros: Handles any volume, automatic retries, DLQ for failures, multi-source. Cons: Requires queue infrastructure (Redis), more complex to operate.

Decision Matrix

Factor Direct Webhook + HTTP API Queue-Based
Volume < 1K/day 1K-10K/day 10K+/day
Plan required Any Growth+ Growth+
Infrastructure None HTTPS endpoint Redis + HTTPS endpoint
Retry logic Manual In-app Automatic (BullMQ)
Data access CSV export only Real-time callback Real-time callback
CRM sync Clay native action HTTP API column HTTP API column
Complexity Low Medium High
Time to implement Hours Days 1-2 weeks

Error Handling

Issue Cause Solution
Need real-time enriched data Using Direct (CSV only) Upgrade to Webhook + HTTP API
Queue backing up Webhook rate limiting Reduce concurrency, add delay
HTTP API column timeout Callback endpoint slow Respond 200 immediately, process async
Credits exhausted mid-pipeline No budget control Add circuit breaker with credit limit

Output

Create an architecture decision that names the chosen ingestion pattern, volume/cost assumptions, data classification, idempotency and retry policy, operational owner, monitoring, and rollback route. The decision matrix guides selection but does not replace a staging validation with the actual workspace and downstream CRM permissions.

Examples

Start a new source at low volume through the webhook pattern, verify durable deduplication and a bounded retry path, then move to a queue only when observed traffic and recovery needs justify it. If the credit guardrail opens, halt new jobs and notify the owner; do not bypass the circuit breaker for a live batch.

Resources

Next Steps

For common pitfalls to avoid, see clay-known-pitfalls.

Use it

Copy one of these into your project. Installing also returns the manifest and these snippets.

yaml
targets:
  - https://api.opensmartroute.ai/api/v1/registry/jeremylongshore-tons-of-skills-marketplace-clay-architec-18f0e2/manifest   # or paste the manifest below

Manifest

An Open Capability Manifest: the router reads it to know what this does, what it costs and when to pick it.

jeremylongshore-tons-of-skills-marketplace-clay-architec-18f0e2.ocm.jsonjson
{
  "ocm": "1",
  "id": "jeremylongshore-tons-of-skills-marketplace-clay-architec-18f0e2",
  "kind": "skill",
  "name": "clay-architecture-variants",
  "description": "Choose and implement Clay integration architecture for different scales and use cases. Use when designing new Clay integrations, comparing direct vs queue-based vs event-driven, or planning architecture for Clay-powered data operations. Trigger with phrases like \"clay architecture\", \"clay blueprint\", \"how to structure clay\", \"clay integration design\", \"clay event-driven\".",
  "publisher": "jeremylongshore",
  "version": "1.0.0",
  "capabilities": {
    "domains": [
      "general"
    ],
    "tags": [
      "skill-md",
      "saas",
      "clay",
      "migration",
      "scaling",
      "skills-sh"
    ],
    "languages": [
      "en"
    ]
  },
  "quality_prior": 0.6,
  "examples": [
    "Choose and implement Clay integration architecture for different scales and use cases. Use when designing new Clay integrations, comparing direct vs queue-based vs event-driven, or planning architecture for Clay-powered data operations. Trigger with phrases like \"clay architecture\", \"clay blueprint\", \"how to structure clay\", \"clay integration design\", \"clay event-driven\"."
  ],
  "primary": false,
  "metadata": {
    "source": {
      "provider": "skills.sh",
      "repository": "https://github.com/jeremylongshore/tons-of-skills-marketplace",
      "path": "plugins/saas-packs/clay-pack/skills/clay-architecture-variants/SKILL.md",
      "ref": "HEAD",
      "url": "https://github.com/jeremylongshore/tons-of-skills-marketplace/blob/HEAD/plugins/saas-packs/clay-pack/skills/clay-architecture-variants/SKILL.md",
      "key": "jeremylongshore/tons-of-skills-marketplace/plugins/saas-packs/clay-pack/skills/clay-architecture-variants/SKILL.md"
    },
    "compatibility": "Designed for Claude Code",
    "allowed_tools": [
      "Read,",
      "Write,",
      "Edit,",
      "Grep"
    ],
    "license": "MIT"
  },
  "instructions": "# Clay Architecture Variants\n\n## Overview\n\nThree proven architecture patterns for Clay data enrichment at different scales. Clay is a hosted SaaS -- your architecture decisions focus on how you send data in (webhooks), how you get enriched data out (HTTP API columns, CRM sync, or CSV export), and how you orchestrate the flow.\n\n## Prerequisites\n\n- Clay account with appropriate plan tier\n- Clear understanding of data volume and latency requirements\n- Infrastructure for chosen architecture tier (if queue-based or event-driven)\n\n## Instructions\n\n### Architecture 1: Direct Integration (Simple)\n\n**B",
  "cost": {
    "context_tokens": 2221
  }
}

Fetch it by URL: GET /api/v1/registry/jeremylongshore-tons-of-skills-marketplace-clay-architec-18f0e2/manifest?version=1.0.0

Reviews

Star ratings from people who tried it. One review per account; edit yours any time.

No reviews yet. Install it, try it, and be the first to rate it.