
First Party Data Collection
- 58 installs
- 41 repo stars
- Updated March 13, 2026
- finsilabs/awesome-ecommerce-skills
Build a first-party data strategy using quizzes, zero-party surveys, preference centers, and progressive profiling to personalize marketing.
About
Collects customer-shared preference data through quizzes and preference centers, then uses it to personalize email, SMS, and recommendations. A developer uses it when paid signal quality drops or when enriching profiles for loyalty programs.
- Per-touchpoint tool table across Shopify and WooCommerce
- Zero-party and progressive-profiling data feeding personalization
First Party Data Collection by the numbers
- 58 all-time installs (skills.sh)
- Ranked #541 of 853 Sales & Marketing skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/finsilabs/awesome-ecommerce-skills --skill first-party-data-collectionAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 58 |
|---|---|
| repo stars | ★ 41 |
| Last updated | March 13, 2026 |
| Repository | finsilabs/awesome-ecommerce-skills ↗ |
What it does
Build a first-party data strategy using quizzes, zero-party surveys, preference centers, and progressive profiling to personalize marketing.
Files
First-Party Data Collection
Overview
Third-party cookies are deprecated across all major browsers, and iOS tracking restrictions have cut paid signal quality by 30–60%. First-party data — information customers actively share with you — is now your most defensible marketing asset. This skill covers collecting preference data through quizzes, surveys, and preference centers, then using that data to personalize email, SMS, and product recommendations. Klaviyo and dedicated quiz apps make this achievable without custom development for most stores.
When to Use This Skill
- When ROAS on Meta and Google is declining due to signal loss from tracking restrictions
- When launching a preference center as part of an email list health initiative
- When wanting to reduce generic emails in favor of category-specific recommendations
- When launching a loyalty or VIP program that requires enriched customer profiles
- When preparing for GDPR/CCPA compliance with a structured consent management system
Core Instructions
Step 1: Choose the right tool for each data collection touchpoint
| Touchpoint | Shopify Tool | WooCommerce Tool | Purpose |
|---|---|---|---|
| Product quiz | Octane AI or Typeform | Typeform + WooCommerce or Quiz Maker plugin | Collect category preferences + recommend products |
| Preference center | Klaviyo Profile Management | Klaviyo + WooCommerce plugin | Let customers control email frequency and content |
| Post-purchase survey | Klaviyo post-purchase flow + Typeform | AutomateWoo + SurveyMonkey/Typeform | NPS, purchase motivation, product feedback |
| Progressive profiling | Klaviyo dynamic forms | Klaviyo + WooCommerce | Ask one question at a time across sessions |
| Birthday/size collection | Klaviyo signup forms | Any email form | Personalization and loyalty triggers |
Step 2: Set up a product quiz for zero-party data
A product quiz collects preferences while immediately rewarding the customer with relevant recommendations — the highest-converting data collection method.
---
Shopify
Using Octane AI (recommended for Shopify):
1. Install Octane AI from the Shopify App Store 2. Go to Octane AI → Quizzes → Create Quiz 3. Build a 3-question flow (keep it under 4 questions to maintain completion rate):
- Q1: "What brings you here today?" (Self / Gift / Work)
- Q2: "Which categories interest you most?" (multi-select with your product categories)
- Q3: "What's your typical budget?" (Under $50 / $50-$100 / $100+)
4. On the results screen, connect each answer combination to specific Shopify collections or products 5. Under Integrations → Klaviyo, enable data sync — Octane AI automatically updates Klaviyo profile properties with quiz answers (e.g., preferred_category: skincare, budget_range: 50-100) 6. Place the quiz at: homepage, dedicated /quiz page, or as a popup for new visitors
Using Typeform + Klaviyo:
1. Create a Typeform quiz at typeform.com 2. Enable the Klaviyo integration in Typeform — quiz answers push to Klaviyo as custom profile properties 3. Embed the Typeform on a Shopify page using an embed block in your theme editor 4. In Klaviyo, use the quiz answers as segment conditions and personalization variables in emails
---
WooCommerce
1. Install Quiz and Survey Master (free WordPress plugin) or use Typeform embedded on a page 2. For product recommendations: configure the quiz to redirect to specific WooCommerce category pages based on answers 3. For Klaviyo sync: use the Klaviyo WooCommerce plugin and Typeform's Klaviyo integration 4. For Mailchimp: use Typeform's Mailchimp integration to tag subscribers with their quiz answers
---
Step 3: Build a preference center
A preference center lets customers control what they receive — reducing unsubscribes while collecting valuable preference data.
---
Shopify with Klaviyo
1. Go to Klaviyo → Sign-up Forms → Create Form 2. Choose Embedded Form type (for a dedicated preferences page) 3. Add fields:
- Email frequency: radio buttons (Daily deals / Weekly digest / Special occasions only)
- Favorite categories: checkboxes for your product categories
- Communication channels: checkbox for SMS consent
4. Embed this form on a /preferences page in your Shopify store 5. Link to this page from every email footer: "Update your preferences" next to the unsubscribe link 6. Klaviyo automatically saves form submissions as custom profile properties — use these as segment conditions
Alternative using Klaviyo's email preferences page: 1. Every Klaviyo email includes an auto-generated preferences link 2. Customers can unsubscribe or adjust frequency from this page without any setup
---
WooCommerce
1. Use Mailchimp or Klaviyo and create an embedded form with preference fields 2. Host the form on a WordPress page (/email-preferences) 3. Link from email footers: "Manage your email preferences"
---
Step 4: Set up progressive profiling
Ask one question at a time across different customer touchpoints — never ask for 10 fields at signup.
In Klaviyo, create different forms for different triggers:
- Post-signup (immediate): "What should we call you?" — captures first name
- Post-first-order (day 2 email): "When is your birthday? (We'll send a gift!)" — captures birth month
- Third email opened: "How often would you like to hear from us?" — captures frequency preference
- After browsing apparel category: "What's your size? We'll filter recommendations" — captures size
Each form is a separate Klaviyo sign-up form shown in the right context, updating the same customer profile properties.
Step 5: Use collected data in personalization
Connect the data to actual campaigns — data that isn't used adds no value:
In Klaviyo:
- Use custom profile properties as segment conditions: "preferred_category equals skincare" → send only skincare product launches to this segment
- Use properties as email personalization variables:
{{ person.clothing_size }}in a size guide email - Use in flow filters: "Birthday month equals current month" → trigger a birthday discount flow
Measuring data collection effectiveness:
- Track profile completeness: go to Klaviyo → Profiles and check what percentage have the key properties filled in
- Target: 50%+ of active subscribers with at least 3 preference fields filled
- Compare email revenue per recipient for profiles with/without preference data — data-driven segments should be 2–4x higher
Best Practices
- Value exchange is mandatory — always explain what the customer gets from sharing data ("so we can send fewer, more relevant emails" or "get personalized product recommendations")
- Keep quizzes to 3 questions maximum — quiz completion drops below 50% at 5+ questions; use progressive profiling to collect more over time
- Quiz completion must lead to immediate value — show product recommendations on the results page; do not just collect data without a reward
- Data minimization — only collect fields you actively use for personalization; every extra field is a privacy liability
- Store consent with timestamp and method — for GDPR compliance, log when and how each preference was set
- Annual re-confirmation — preferences go stale; send an annual "update your preferences" email to refresh data
Common Pitfalls
| Problem | Solution |
|---|---|
| Quiz abandonment above 60% | Reduce to 3 questions maximum; show progress indicator; make it skippable |
| Profile data collected but never used in campaigns | Audit quarterly: for each profile field, identify which campaign uses it; remove fields that map to no campaign |
| Preference center causes more unsubscribes | Add "reduce frequency" option prominently — it prevents full unsubscribes |
| CCPA opt-out not propagating to ad platforms | In Klaviyo, go to Integrations and enable "Do not sync opted-out profiles to Facebook/Google" |
| Quiz answers not syncing to Klaviyo | Check integration connection in Octane AI/Typeform settings; verify custom properties are appearing in test profiles |
Related Skills
- @email-list-segmentation
- @predictive-personalization
- @lifecycle-marketing-automation
- @email-marketing-automation
- @exit-intent-popups
{
"context": "Tests whether the agent implements consent recording with all required metadata fields, designs consent logs as append-only, captures consent server-side, notifies the ESP on GDPR erasure, suppresses customers from ad platforms on CCPA opt-out, and separates marketing consent from transactional email handling.",
"type": "weighted_checklist",
"checklist": [
{
"name": "IP address captured",
"max_score": 8,
"description": "recordConsent captures and stores the customer's IP address in the consent record"
},
{
"name": "User agent captured",
"max_score": 8,
"description": "recordConsent captures and stores the request's user agent string in the consent record"
},
{
"name": "Policy version captured",
"max_score": 8,
"description": "recordConsent captures and stores the privacy policy version in effect at the time of consent"
},
{
"name": "Consent method captured",
"max_score": 6,
"description": "recordConsent captures the method by which consent was given (e.g. 'checkbox', 'preference-center', 'double-opt-in')"
},
{
"name": "Append-only consent log",
"max_score": 10,
"description": "consent-manager.ts uses an insert/create operation (never update/patch/upsert) for storing consent records, and consent-design.md describes the logs as append-only"
},
{
"name": "No consent record deletion",
"max_score": 6,
"description": "consent-manager.ts does NOT call any delete/destroy/remove operation on consent log records"
},
{
"name": "ESP notified on erasure",
"max_score": 10,
"description": "handleErasureRequest calls a method on the email service client to delete or suppress the customer's profile (e.g. emailServiceClient.deleteProfile)"
},
{
"name": "CCPA suppresses Google Customer Match",
"max_score": 9,
"description": "handleCcpaOptOut calls a method to suppress the customer from Google Customer Match (e.g. adPlatformClient.suppressFromCustomerMatch)"
},
{
"name": "CCPA suppresses Meta Custom Audiences",
"max_score": 9,
"description": "handleCcpaOptOut calls a method to suppress the customer from Meta/Facebook Custom Audiences (e.g. adPlatformClient.suppressFromCustomAudiences)"
},
{
"name": "Marketing vs transactional separation",
"max_score": 10,
"description": "consent-design.md explicitly states that transactional emails (order confirmation, shipping) do not require marketing consent, and the code or documentation reflects this separation"
},
{
"name": "Server-side capture documented",
"max_score": 8,
"description": "consent-design.md states that consent is captured server-side (at the API layer), not purely client-side"
},
{
"name": "Consent type enum/union",
"max_score": 8,
"description": "recordConsent or ConsentRecord uses a typed consent type (e.g. 'marketing-email' | 'marketing-sms' | 'data-processing') rather than a plain untyped string"
}
]
}
Privacy Compliance Module for a Multi-Region E-Commerce Platform
Problem/Feature Description
BrightCart is a fashion e-commerce platform operating in both the EU and United States. Following a recent external GDPR audit, their legal team has raised concerns that BrightCart's current consent management system would be difficult to defend in a regulatory investigation: the audit report noted that consent records lacked sufficient metadata to reconstruct what a customer agreed to and under what circumstances, and that historical consent states could not be reliably verified. The auditors also flagged that customer data removal requests were being fulfilled incompletely.
A separate incident this quarter highlighted a CCPA compliance gap: after a California customer submitted a "do not sell my data" request, the customer's data continued to be used in targeted digital advertising, resulting in a formal complaint. The root cause was that the opt-out process only updated an internal database flag without propagating to the downstream advertising systems BrightCart uses for audience targeting.
Additionally, the customer support team has received complaints from customers who opted out of marketing emails but then stopped receiving their order confirmations and shipping updates. Engineering identified that the consent logic was not distinguishing between different categories of customer communication.
The engineering team needs a TypeScript consent management module that addresses all of these issues. The module will be reviewed by the legal team, so the design documentation should explain the architectural decisions clearly.
Output Specification
Produce the following TypeScript files:
consent-manager.ts— therecordConsentfunction andConsentRecordtypeerasure-handler.ts— thehandleErasureRequestfunction implementing GDPR right-to-erasureccpa-handler.ts— thehandleCcpaOptOutfunctionconsent-design.md— a document for the legal team describing:- What data is captured for each consent record and why it is needed for compliance
- How the design ensures historical consent states are auditable over time
- How different categories of customer email are handled differently
- What external systems are notified during data removal and opt-out flows
Assume the following are available as imports:
db— a database client with.consentLogs.create(),.customerProfiles.update(), etc.emailServiceClient— an ESP client with.deleteProfile(customerId)and.updateContactProperty(customerId, key, value)methodsadPlatformClient— with.suppressFromCustomerMatch(customerId)and.suppressFromCustomAudiences(customerId)methods
{
"context": "Tests whether the agent designs the CustomerProfile schema with GDPR-appropriate fields, includes the correct fields for progressive profiling completeness, and implements the profiling logic with the right triggers and completeness computation.",
"type": "weighted_checklist",
"checklist": [
{
"name": "birthMonth not full DOB",
"max_score": 8,
"description": "The CustomerProfile interface uses birthMonth (a number) rather than a full date-of-birth or birthDate field"
},
{
"name": "profileCompleteness field",
"max_score": 7,
"description": "The CustomerProfile interface includes a profileCompleteness field of numeric type (0–100)"
},
{
"name": "consentVersion field",
"max_score": 8,
"description": "The CustomerProfile interface includes a consentVersion field (string type) representing the privacy policy version at consent time"
},
{
"name": "dataSource array field",
"max_score": 7,
"description": "The CustomerProfile interface includes a dataSource field typed as a string array (e.g. string[])"
},
{
"name": "Completeness uses 7 specific fields",
"max_score": 12,
"description": "computeProfileCompleteness calculates the score using exactly these fields: firstName, birthMonth, preferredCategories, clothingSize, emailFrequency, shoppingFrequency, primaryUseCase"
},
{
"name": "One-question-at-a-time pattern",
"max_score": 8,
"description": "getNextProfileQuestion returns only a single next question (not a list), finding the first unanswered field"
},
{
"name": "Trigger-based profiling config",
"max_score": 10,
"description": "PROFILE_QUESTIONS config array associates each question with a specific trigger event (e.g. 'post-signup', 'post-first-order', 'second-visit', 'pdp-apparel-visit')"
},
{
"name": "Post-signup firstName trigger",
"max_score": 8,
"description": "firstName is the first profiling question and is triggered at 'post-signup'"
},
{
"name": "README documents completeness fields",
"max_score": 8,
"description": "README lists which specific fields are used to compute the profile completeness score"
},
{
"name": "README explains DOB choice",
"max_score": 8,
"description": "README mentions a privacy or GDPR-related reason for using birth month rather than a full date of birth"
},
{
"name": "Declared preferences fields present",
"max_score": 8,
"description": "CustomerProfile includes zero-party/declared preference fields: at minimum preferredCategories, shoppingFrequency, budgetRange, and primaryUseCase"
},
{
"name": "Consent fields present",
"max_score": 8,
"description": "CustomerProfile includes gdprConsent, ccpaOptOut, and smsConsent fields"
}
]
}
Customer Profile System for a Fashion E-Commerce Platform
Problem/Feature Description
StyleNest is a mid-sized fashion e-commerce brand that has been running for three years. Their marketing team is struggling with three related problems: their paid ad performance has dropped significantly due to iOS and browser tracking changes, their email campaigns are untargeted (same newsletter to everyone), and their product recommendation engine returns generic results because it has no customer preference data to work with.
The engineering team has been asked to build the foundational data layer for a first-party data strategy. This means designing a customer profile schema that captures both what customers tell you (declared/zero-party data) and what you observe from their behavior, along with an incremental data collection system that asks customers for information progressively rather than overwhelming them with a long form.
The head of engineering wants a TypeScript implementation with two things: (1) a CustomerProfile interface that properly captures all relevant preference, behavioral, and consent fields, and (2) a progressive profiling module that determines what to ask next and computes how complete a customer's profile is. The system should be designed so it can later be connected to a preference center and quiz, but for this task just produce the schema and profiling logic.
Output Specification
Produce the following TypeScript files in your working directory:
customer-profile.ts— theCustomerProfileinterface and any supporting type definitionsprogressive-profiling.ts— thegetNextProfileQuestionfunction, thePROFILE_QUESTIONSconfiguration array, and thecomputeProfileCompletenessfunctionREADME.md— a short explanation of the schema design decisions, especially around privacy fields and what drives the profile completeness score
The README should document:
- Which fields contribute to the profile completeness score
- The list of trigger events used for progressive profiling questions (in order)
- The rationale for any privacy-sensitive field design choices
{
"context": "Tests whether the agent builds a quiz with the correct number of questions, proper UX controls (progress bar, skip option), routes completions to a product results page rather than just collecting data, and implements the full zero-party data pipeline from quiz answers through to ESP properties.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Max 3 questions",
"max_score": 12,
"description": "The quiz implementation contains no more than 3 questions/steps"
},
{
"name": "Progress bar present",
"max_score": 8,
"description": "The quiz component renders a visible progress bar or step indicator that updates as the user advances"
},
{
"name": "Quiz is skippable",
"max_score": 10,
"description": "The quiz component includes a skip or close mechanism so users can opt out of completing it"
},
{
"name": "Post-completion redirect to results",
"max_score": 12,
"description": "On completing the quiz, the user is directed to a product results or recommendations page (not just a thank-you message or data collection confirmation)"
},
{
"name": "Results page with curated recommendations",
"max_score": 8,
"description": "quiz-design.md describes that quiz completion leads to a curated product results or recommendations page (not merely data storage)"
},
{
"name": "Quiz answer maps to profile field",
"max_score": 10,
"description": "Each quiz question maps its answer to a named CustomerProfile field (e.g. primaryUseCase, preferredCategories, budgetRange)"
},
{
"name": "Profile field used as recommendation filter",
"max_score": 10,
"description": "quiz-pipeline.ts uses the profile field value to filter or rank product recommendations"
},
{
"name": "Recommendation filter synced to ESP",
"max_score": 10,
"description": "quiz-pipeline.ts syncs the quiz answer or resulting profile field as a contact property in the ESP (email service provider)"
},
{
"name": "Value exchange explained",
"max_score": 8,
"description": "quiz-design.md or the component includes copy explaining what the customer gets from answering (e.g. personalized recommendations, relevant emails)"
},
{
"name": "Data flow documented",
"max_score": 8,
"description": "quiz-design.md includes a description or diagram of the data flow from quiz answer through to ESP property"
},
{
"name": "Skip rationale documented",
"max_score": 4,
"description": "quiz-design.md explicitly mentions that the quiz is skippable and provides the rationale"
}
]
}
Product Recommendation Quiz for a Home Goods Brand
Problem/Feature Description
Hearth & Co. is a home goods and lifestyle brand that sells everything from kitchen accessories to bedroom furnishings. Their marketing director has noticed that new visitors who land on the homepage bounce at a rate of 72% because they face an undifferentiated product catalog of 800+ items with no clear starting point. Existing product filters help repeat customers who know what they want, but do nothing for first-time visitors.
The team wants to build a short onboarding quiz that helps new visitors find the right products while simultaneously collecting declared preference data that can be stored on the customer profile and fed into their email platform. The quiz will be embedded in the homepage hero for new visitors. Past attempts at long onboarding flows (7+ questions) had very poor completion rates, so the new quiz must be short and feel immediate — users should see relevant product suggestions as soon as they finish.
The quiz must connect to the rest of the data platform: answers should flow through to a named customer profile field, which is then used as a filter when pulling product recommendations, and finally synced as a property on the ESP audience so that targeted email campaigns can be built from the data.
Output Specification
Produce the following files:
quiz-component.tsx— a React component implementing the quiz UIquiz-pipeline.ts— a module that maps quiz answers to profile fields, applies them as recommendation filters, and syncs them to an ESP contact propertyquiz-design.md— a short document describing the quiz UX decisions, including how many questions are included and why, what happens at the end of the quiz, and how users can opt out of completing it
The quiz-design.md should include:
- The number of questions and rationale
- A description of what the user sees after completing the quiz
- How the quiz handles users who do not want to complete it
- A diagram or written description of the data flow from quiz answer to ESP property
{
"name": "finsi/first-party-data-collection",
"version": "0.1.0",
"summary": "Build a first-party data strategy with progressive profiling, zero-party surveys, preference centers, and quiz-based product recommendations",
"skills": {
"first-party-data-collection": {
"path": "SKILL.md"
}
}
}