Category: Saclab

  • Partner Inventory Crawler

    Goal

    • Keep our product availability in sync with partner’s site so items sold on partner side are immediately set to sold out on our shop.

    • Minimize overselling, manual checks, and customer disappointment.

    As a Saclàb salesperson
    I want partner-sold items to be automatically set to sold out on our shop
    So that customers never purchase items that are already unavailable

    Scenario: Admin sees crawl enable option on airtable
    Given the admin is on Airtable in the Partners table
    When the admin views a partner record
    Then the partner record shows a field "Crawl Enabled"
    And the admin can toggle it on or off

    And the admin can specify where the crawl should be happening (e.g https://houlux.com/nouveautes/)

    Scenario: Admin enables crawl for a partner
    Given the admin is on Airtable in the Partners table
    And the partner record has the field "Crawl Enabled" set to false
    When the admin sets "Crawl Enabled" to true
    Then the crawler includes this partner in its next run
    And all bags linked to this partner are checked for availability

    Scenario: Admin disables crawl for a partner
    Given the admin is on Airtable in the Partners table
    And the partner record has the field "Crawl Enabled" set to true
    When the admin sets "Crawl Enabled" to false
    Then the crawler excludes this partner in its next run
    And no bags linked to this partner are checked for availability

    Scenario: Partner item sold out flips ours to sold out
    Given an active partner-mapped item
    And the partner availability is in_stock
    When the crawler detects partner availability as sold_out twice in a row (3 minutes between crawls)
    Then our item availability is updated to sold_out

    Scenario: Partner page removed
    Given an active partner-mapped item
    When the crawler receives HTTP 404 or 410 for the partner URL
    Then our item availability is updated to sold_out immediately

    Scenario: Temporary glitch does not flip
    Given an active partner-mapped item
    When the crawler detects partner availability as sold_out once
    And the next check returns in_stock
    Then our item remains in_stock
    And an alert is recorded for flapping

    Scenario: Reserved treated as sold out
    Given partner status is reserved
    And the partner’s status mapping treats reserved as sold_out
    When the crawler runs
    Then our item becomes sold_out

  • Story 47.1.2 Update SKU Handling for Drop-Ship Bags

    General info

    Currently, external partner SKUs (long IDs like LAVG6W574CT9K955) are imported but hidden on the product page, leaving customers without a clear reference. Internally, we already generate sequential SACLÀB SKUs (e.g. 6910) for tracking. To improve customer experience while still keeping external partner SKUs for operational flows, we need to introduce a dedicated field, retrofit existing drop-ship items, and update syncing logic.

    User story

    As a Creator on Saclab Airtable,

    I want imported external SKUs to be stored separately from our internal SKUs,

    So that customers always see a clean, short internal SKU on the product page, while external SKUs remain available for drop-ship partner sync, order flows, and communication.

    Acceptance criteria

    #

    Scenario / Gherkin

    Visuals / Notes

    01

    New field in Product Inventory

    Given I am a Creator on Saclab Airtable bases

    When I add or import a new bag via the Import table

    Then the system should generate an internal SKU (sequential number, e.g. 6910)
    And copy any provided SKU into a new field called ESKU (external SKU)

    New Airtable field:
    ESKU

    Internal SKU uses existing rising number logic

    02

    Website visibility

    Given a bag exists in Product Inventory with both an internal SKU and ESKU

    When the bag is displayed on the product detail page

    Then only the internal SKU is shown to customers
    And ESKU (external) is never displayed

    Example frontend: “SKU: 6910”

    03

    Retrofit existing drop-ship items

    Given there are existing bags in Product Inventory with O/C = Drop-Ship and no internal SKU

    When the system is updated

    Then each of these bags should automatically receive a new internal SKU following the rising number logic

    And the current partner’s SKU should be copied into ESKU

    And if the bag already has an internal SKU, it must remain unchanged (no overwriting) And this process should run once at rollout across all live inventory

    04

    WooCommerce sync

    Given a bag is synced to WooCommerce

    When the SKUs are transferred

    Then the internal SKU is synced as the WooCommerce product SKU

    And the ESKU is stored as a WooCommerce but not visible on frontend but queryable via API/admin

    Ensures both SKUs are available in WP, but only internal shown for customers

    05

    HubSpot + Slack sync

    Given a bag is imported into the system

    When it is synced to HubSpot

    Then the internal SKU should be stored in the HubSpot deal for consistency with customer-facing SKU

    And ESKU should also be synced into HubSpot as a separate property for reference in partner-related workflows

    When a sale notification is posted to #bag-sales Slack

    Then only the internal SKU is used in the message “Bag sold: DROP-SHIP [InternalSKU] [Bagname] Order ID: [OrderID] ([Status])”

    Example HubSpot: Deal fields = {Internal SKU: 6910, ESKU: LAVG6W574CT9K955}

    Example Slack: “Bag sold: DROP-SHIP – 6910 – Bag name”

    06

    Drop-ship sale flow

    Given a bag has O/C = Drop-Ship

    When the bag is sold

    Then emails sent to the external partner must include the ESKU in subject and body

    07

    Removal scenario

    Given: an email “Item Status Update” is received at sales@saclab.com with ESKU + bag name

    When the ESKU matches a ESKU in the system

    Then the bag should be moved to Removed by seller as per current logic

    Uses ESKU for partner-triggered removals

  • Duplicate of Story. 49.1 Updated Dropdown Enhancements

    General Info

    We want to optimize the dropdowns on the Sell Your Bag form for faster and clearer selection. The improvements will:

    • Enable search-as-you-type with substring matching, not limited to the first word.

    • Bold only the typed letters within matching options (e.g., typing “han” highlights only han in Timeless Handle).

    • Order entries by brand-specific options first, then general options, and always leave Other at the bottom.

    • Introduce visual separation in dropdowns: clearly distinguishing brand-specific colors/materials/hardware from general ones.

    • Ensure backend management for brand-specific entries in WordPress.

    • Ensure translations are aligned with Airtable (submissions saved in English only).

    Functional Details

    Dropdown Interaction

    • User taps a dropdown → list expands inline below input.

    • At the top, a search bar appears (keyboard opens only when typing).

    • Options filter instantly as the user types.

    • Matching letters are bolded in each result.

    • Substring matching: user input matches any part of the option text (e.g., handle matches Timeless Handle).

    • Selecting an option closes the dropdown and populates the input field.

    Option Ordering

    • Brand-specific entries always appear first.

    • After that, general entries (alphabetical order).

    • Other is always at the very bottom.

    • Remove the “I don’t know” option.

    Brand-Specific vs General Separation

    • Dropdown menu sections should have headers (non-selectable, styled differently, bold or with divider):

      • For colors → “Chanel Colors” or “Hermès Colors”, followed by their specific options.

      • Then a header “General Colors” → followed by standard list (e.g., Yellow, Green, Black).

    • Same logic applies to Main Material and Hardware.

    • Main Material: keep the dropdown but extend it to support brand-specific materials.

    • Hardware: create a new dropdown with Brand Hardware → brand finishes (e.g., Palladium, Gold Tone, Ruthenium) → General Hardware → Other.

    No Match Behavior

    • If no options match the search input → only show Other.

    • Other should always remain visible.

    Backend Notes

    • WordPress backend must allow adding:

      • Brand-specific Colors

      • Brand-specific Materials (for Main Material)

      • Brand-specific Hardware finishes

    • Existing price calculator is linked to the Model, not the Material — confirmed as already working. (Note for Alexander: double-check the calculator just to be sure.)

    • Ensure brand-specific entries can be tagged in the backend, so dropdowns can group and display them automatically.

    Translation Notes

    • In Airtable, ensure that only the English version of the selected value is stored, regardless of frontend translation.

    • Translation handling must apply to dropdown headers (Chanel Colors, General Colors) and option values.

    User Story

    As a seller,

    I want dropdowns that filter instantly and highlight matches across full words,

    So that I can quickly find options even if I only remember part of the name, and clearly distinguish brand-specific from general options.

    Flow Overview

    1. Tap dropdown field → list expands inline with search box on top.

    2. Type search query → options filter instantly with substring match.

    3. Matching letters bolded only where typed.

    4. Options ordered: brand-specific section → general section → Other at bottom.

    5. Select option → dropdown closes, input populated.

    6. If no match → only “Other” visible.

    Acceptance Criteria

    #

    Scenario

    Expected Result

    01

    Given Brand = Hermès, When opening Model dropdown

    Then entries list Hermès-specific models first, then general, then Other

    02

    Given I type “han” in any dropdown

    Then matching options appear with han bolded in Timeless Handle, even though it’s the second word

    03

    Given Brand = Chanel, When opening Color

    Then Chanel Colors section header is shown, followed by Chanel colors; then General Colors header + general options

    04

    Given I type “gris” in Color

    Then “Gris Etain” appears with gris bolded

    05

    Given Hardware dropdown, When opening

    Then Brand Hardware header with brand finishes; then General Hardware; then Other

    06

    Given no options match search

    Then only “Other” remains visible

    07

    Given a selection is made

    Then dropdown closes and selected value populates input

    08

    Given WordPress backend, When admin adds brand-specific Colors/Materials/Hardware

    Then dropdown updates accordingly in the frontend

  • Seller notes section in SYB submission

    As a seller,
    I want to be able to leave a note in a section during SYB submission,
    So that I can clarify details when the dropdown lacks the exact model, or I have something specific to mention.

    When: The seller is on step 4-review your bag

    Then: The seller sees a text input field where they can put in some text

    and (on desktop) the width of the “Add your phone number *” filed is adjusted to the same width

    And: this text is then saved to the SYB submission on Airtable

    And: this text is then shown in the email to sell@saclab.com

    Screenshot 2025-09-11 at 14.08.31.png

    Figma:

    Desktop: https://www.figma.com/proto/6KT0tZfJw3u7R8b5pCH8vw/Saclab-Team-Library?page-id=4842%3A5915&node-id=12021-9841&viewport=-4932%2C146%2C0.5&t=mTEnF6Z752lxvCxA-1&scaling=scale-down&content-scaling=fixed&starting-point-node-id=4842%3A11258

    Mobile: https://www.figma.com/design/6KT0tZfJw3u7R8b5pCH8vw/Saclab-Team-Library?node-id=12028-11092&m=dev

  • Automate cache clearing for special pages after publishing new bags

    Implement an automated cache-clearing mechanism for specific pages after publishing new bags, so the products are displayed immediately without requiring manual cache reset.

    List of URLs where new bags may appear:


    SCLB-1584

    Acceptance Criteria:

    • Cache should be cleared automatically for predefined pages after publishing new bags.

    • List of relevant URLs is provided and configured.

    • New bags appear correctly across all versions (including /de and /fr) without manual cache clearing.

  • AirT product field “Dimension (m)”

    We currently extract the Dimension from Bag Model + Size, however, sometimes the bag has the exact same model and size but still have different dimension. Therefore we would need 2 fields here (similar to “Year” field)

    2 fields, 1 automatically retrieved from Model + size and one manual. The automatic one by default get synced to WooCommerce but if it’s empty then the manual one get synced to WooCommerce.

    New: If both fields are filled, then sync the manual one.

    And When Bag gets updated in WooC (By an order or other), then: Do not sync “dimension” from WooC back to Airtable field “dimension (m)”.

  • Release Notes – Saclab General – 01.09 Release – Sep 02 14:10

    How to use this page:

    Find your selected Jira issues in the table below. Select the expand to use them as your source of truth to write release notes.

    Release

    https://cheitgroup.atlassian.net/projects/SCLB/versions/11408

    Date

    Version

    01.09 Release

    Description

    Contributors

    Anna Nikitina

    Issues in this release

    Before you share the page, review the contents of each Jira issue and remove any sensitive data.

    Issue

    Summary

    Issue Type


    SCLB-1558

    [SEO] "en" hreflang

    Task

    Summary

    New Features

    Improvements to existing features

    Bug fixes

  • Story 48.2 Add-On: Restore “Not Photographed” products that were removed (pre-live)

    Current state

    Products that were Not Photographed with a future (private) publish date get deleted in WooCommerce when removed (qty → 0). They can’t be brought back, even if data/photography work exists.

    New behaviour

    This story extends the restore logic for removed items. For products that were never live and had status Not Photographed, the sales team should be able to bring them back by setting quantity → 1 (via WooC or Airtable).

    On restore, the workflow should basically re-do the existing “bag accepted = Yes” automation with the following extras:

    • Recreate/restore the WooC product and set status: Not Photographed

    • Reapply the future publish date per existing scheduling logic

    • Trigger email: “Your bag will be live soon” (seller)

    • Post Slack in #syb_bag_was_removed_by_seller:

      • “The [Bagname (w/ link)] [SKU] has been put back into status Not Photographed and will be republished on [Publish Date] by [admin email]

    • Allow repeated remove/restore cycles without breaking scheduling, or notification flows

    Limit condition: Only applies if the product’s last valid status was Not Photographed; otherwise ignore/block the qty update.

    Acceptance Criteria

    #

    Scenario & Gherkin

    01

    Scenario: Restore removed “Not Photographed” product

    Given a product had status Not Photographed with a future publish date and was removed (qty = 0, WooC deleted)

    When sales sets quantity to 1 (WooC update or Airtable sync)

    Then the WooC product is restored with status Not Photographed
    And the publish date is re-applied per scheduling logic
    But if the previous status was not Not Photographed, ignore/block the update

    02

    Scenario: Notifications on restoration

    Given the product is restored from Removed to Not Photographed

    When status changes back

    Then send the “Your bag will be live soon” email to the seller

    And post Slack in #syb_bag_was_removed_by_seller: “The [Bagname (w/ link)] [SKU] has been put back into status Not Photographed and will be republished on [Publish Date] by [admin email]”

    03

    Scenario: Repeatability

    Given the product is restored as above

    When the restoration completes

    Then the product may be removed and restored multiple times without breaking scheduling or notifications

  • Feature: Google Sign-up on saclab.com

    Scenario: Show Google sign-up entry points
    When I am on the Register page/pop-up
    Then I see a Continue with Google button
    And a legal note indicates agreeing to Terms and Privacy Policy by continuing