Short answer / recommendation
Use a single Zap triggered by Shopify -> New Customer (or New Order if you prefer order-qualified leads) that: 1) normalizes data, 2) deduplicates, 3) computes a lead score, 4) pushes/updates the record in your CRM with tags, and 5) routes high-score leads to Slack/email/owner. For high-volume stores, add a durable queuing + scheduled retry layer (Storage or a Google Sheet + scheduled Zap) to avoid dropped tasks and respect rate limits.
Practical Zap steps (one Zap, multi-step)
1) Trigger: Shopify — New Customer (or New Order). Include only required fields (email, name, tags, total_spent, location).
2) Filter: Use Filter by Zapier to exclude tests, zero-email, internal accounts, or blacklisted domains.
3) Formatter / Formatter or Code: Normalize email (lowercase), parse phone, compute derived fields (country, currency). Optionally run a small Code by Zapier step to compute score from rules (see scoring below).
4) Deduplicate: Use Find/Create action in your CRM (find by email or Shopify customer ID). If found, update; if not found, create. As extra protection, set Storage by Zapier GET to see if customer_id has been processed in last X hours; if present, stop.
5) Lead scoring: Use a simple weighted scoring implementation (e.g., total_spent, order_count, lifetime_value, location, discount use, product tags). Implement in Code by Zapier or a Lookup Table (Google Sheets or Lookup Table by Zapier). Assign score bands (Cold/Warm/Hot).
6) Tagging & Update: Push tags and score to CRM record (add/update tags and custom score field). Also update Shopify customer tags via Shopify action if needed.
7) Routing paths: Use Paths or Filters to send Hot leads to Slack/Email/Sales CRM owner, Warm to nurture list, Cold to long-term drip.
8) Error handling: On CRM API error, write failed payload to Storage by Zapier or append a row in a Google Sheet (failure queue) and return success to avoid endless retries.
9) Scheduled retry job: Separate Zap running hourly/15-minutes that reads failure queue and retries with exponential backoff logic (retry_count field). Move permanently failed to an “exceptions” sheet and notify ops.
Filters and rate-limit best practices
- Filter aggressively at trigger (country, email present, total_spent threshold) to reduce task usage.
- Batch heavy operations when possible (use scheduled batch processing for enrichment calls).
- Respect CRM rate limits: add Delay between calls or chunk retries in scheduled Zap.
Retry logic for high volume
- Immediate: For transient CRM 5xx errors, try a single quick retry (Delay 30s then retry step). If still failing, push to Failure Queue.
- Durable: Store failures in a sheet/storage and run a scheduled Zap that retries with exponential backoff (retry_count * 2 minutes or similar). Mark after N attempts and alert ops.
Decision criteria (helps choose architecture)
- Volume 100k/month or strict latency/SLAs: Avoid pure Zapier; use webhooks + middleware or an ETL/queue system.
Best-for / Avoid-if
- Best-for: Small-to-mid stores, teams that want low-code, quick setup, and moderate volume.
- Avoid-if: Very high volumes (>100k/mo), strict latency or complex ML scoring — use middleware.
Practical checklist before you go live
- Set trigger filters to remove test customers.
- Implement dedupe (Find/Create + Storage check).
- Build scoring logic and store mapping for tags.
- Add failure queue (Storage/Google Sheet) and a scheduled retry Zap.
- Add monitoring alert (Slack/email) for repeated failures.
- Confirm Zapier/CRM API rate limits and adjust delays/batching.
If you want, I can write a sample Code by Zapier scoring snippet and a retry schedule example. Tool to use: zapier.
Compare Zapier and Make