{"id":28566822,"url":"https://github.com/salsify/customer-success-interview","last_synced_at":"2026-01-29T21:32:40.643Z","repository":{"id":29952888,"uuid":"33499511","full_name":"salsify/customer-success-interview","owner":"salsify","description":null,"archived":false,"fork":false,"pushed_at":"2015-04-06T21:14:55.000Z","size":6168,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":38,"default_branch":"master","last_synced_at":"2025-06-10T15:50:22.361Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/salsify.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-04-06T18:58:26.000Z","updated_at":"2019-09-19T21:22:45.000Z","dependencies_parsed_at":"2022-09-07T08:41:03.572Z","dependency_job_id":null,"html_url":"https://github.com/salsify/customer-success-interview","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/salsify/customer-success-interview","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/salsify%2Fcustomer-success-interview","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/salsify%2Fcustomer-success-interview/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/salsify%2Fcustomer-success-interview/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/salsify%2Fcustomer-success-interview/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/salsify","download_url":"https://codeload.github.com/salsify/customer-success-interview/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/salsify%2Fcustomer-success-interview/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28885563,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-29T21:06:44.224Z","status":"ssl_error","status_checked_at":"2026-01-29T21:06:42.160Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-10T15:39:12.370Z","updated_at":"2026-01-29T21:32:40.616Z","avatar_url":"https://github.com/salsify.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Introduction\n\nMany of Salsify’s customers come to Salsify with lots of various data in lots of various data sources. These sources might be digital assets (manuals, product images, color swatches, etc) stored in a digital asset management system (best), a shared drive (better), or on a particular employee’s laptop (worse), or they may be product information stored in an enterprise resource planner, an Excel spreadsheet, or a series of PDF files, among other sources and systems.\n\nConsequently some of the work we do in Customer Success Engineering is helping customers integrate with existing business systems (and/or business processes). Which brings us to this exercise.\n\nIn this exercise you’ll build code/an integration to upload digital assets to a customer Salsify account. As part of it you’ll learn to upload product data into Salsify, how to work with Salsify’s APIs, and how to handle an integration of asset data with products in Salsify.\n\n# Specification\n\nYour code should, given a set of products and a library of digital assets:\n* Determine what products are in the system\n* Determine what assets are available in the library (we’re providing you with a ZIP file)\n* Upload the assets that match the product name to the product in the system\n\nProducts have an associated external identifier, or ‘sku’. Images are named after this ‘sku’, like so:\n* `sku`_Primary.jpg is the primary image for the product identified by `sku`\n* `sku`_LeftSideView.jpg is the Left side view image for the product identified by `sku`\n  \nImages without a sku prefix, or with a sku that isn’t found shouldn’t be uploaded.\n\nYou are free to use whatever language and framework you would like, however, we primarily use Ruby (on Rails), Scala, and Javascript.\n\n# Salsify API Documentation\nGo here: http://help.salsify.com/category/56-category\n\nIn general, Salsify allows you to export product information in CSV form and then import it back in CSV form (or in Excel, but CSV should be a bit easier to handle programmatically). \n\n# What you should submit\n\nA zip file or an invitation to a source code repository we may access (BitBucket provides free Git hosting) that contains:\n\n1.  A file, build.sh that will do any pre-run steps to setup an environment (build code, run Ant, maven, bundle, etc).\n2.  A file, run.sh that will actually upload images to salsify. We expect it to:\n  1.  Contact Salsify via an API to determine what products are in the system\n  2.  Access it’s image library via a directory, images, that is relative to itself\n  3.  Provide some information to the user as to what it accomplished.\n3.  A file, README, which documents the general approach to what your code does. In it you should cover:\n  1.  How does your system work? (if not addressed in comments in source)\n  2.  How will your system perform with 100 products? 1000 Images? 10,000 products and 1 million images?\n  3.  What documentation, websites, papers, etc did you consult in doing this assignment?\n  4.  What third-party libraries or other tools does the system use? How did you choose each library or framework you used?\n  5.  What was your testing strategy? What automated tests did you write? What would you test if given more time?\n  6.  How long did you spend on this exercise? If you had unlimited time to spend on this, how would you spend it and how would you prioritize each item?\n  7.  If you were to critique your code, what would you have to say about it?\n4.  The rest of the files should be the source code to the system.\n\n# Hints and tips\n\n* Salsify doesn’t have an exposed direct image upload API. You can import and export data, but image files can’t directly be uploaded via a public API. In order to upload images in bulk you must upload a CSV or Excel file with publically accessible URLs of images assigned to products (see the sample .csv file).\n* To get publically accessible URLs for images some service must be used. We recommend Amazon S3 (which has a great Ruby API), and you can get a free account here: https://aws.amazon.com/free/\n* Imports in Salsify overwrite existing data (for properties specified in the import file). If you need to clear all the data in the account however, you can click on your name in the top right, go to Organization, then Data, and click on 'Clear All Data'\n\n# General suggested approach\n\n* Accept your invitation link to Salsify (it will be provided)\n* Checkout the product and the sample data provided (`product_data.csv` in this repository; it will already be imported into the account)\n* Write code to:\n  * Download the product data as Salsify sees it using the ephemeral export API\n  * Upload images for products in the export to get publically accessible urls (sample simples in `assets.zip` in this repository)\n  * Attach those images to products in Salsify by importing the public asset urls (via the Product Bulk Import API)\n\n# What you’ll be judged on\n\n* Did you complete the task assigned? Are the images uploaded and attached to the right products?\n* Were you able to clearly document how the system works and any gotchas associated with it?\n* Is the design scalable? In performance and in feature set? How easy is it to understand the code?\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsalsify%2Fcustomer-success-interview","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsalsify%2Fcustomer-success-interview","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsalsify%2Fcustomer-success-interview/lists"}