VNYL

VNYL is a curated and personalized vinyl record subscription service. They pride themselves on being the go-to source for passionate music fans looking for an immerse listening experience.

Business Type: Subscription Service

Nick Alt, Founder and CEO

When we began looking into how we could facilitate a vinyl subscription service, we wanted to find a partner who could solve all of the nuances of shipping at scale, without us having to build this product ourselves.

We were able to integrate Shippo API into our app quickly and have everything we needed to scale our business.

Challenge

VNYL ships hundreds of packages of records every day as they service over 100,000 users. They needed a shipping solution that wouldn’t require them to manually generate a label for every package shipped. Since shipping is such a core part of their service, Alt and his team specifically wanted an API solution that could integrate seamlessly into their e-commerce application and experience so that customers wouldn’t need to leave the app to find the status of their deliveries. They also wanted to be able to calculate postage rates for customers, to let them choose their own rates.

Additionally, many of VNYL’s customers don’t know what records they’re getting each month until their package arrives. This element of surprise is a fun experience for customers. VNYL wanted an API that would let them keep the contents of a package a mystery until the date of delivery.

"Most of my team comes from a background in software development. When we began looking into how we could facilitate a vinyl subscription service, we wanted to find a partner who could solve all of the nuances of shipping at scale, without us having to build this product ourselves," says Alt.

  • Manual label generation wasn’t cost-effective or efficient as the business grew
  • Needed an API solution that could be fully integrated into their application
  • Wanted to provide customers with shipping updates that wouldn’t give away the surprise contents of their package

Creating a Shipment

  • cURL
  • Ruby
  • Python
  • PHP
  • Node
  • C#
  • Java
curl https://api.goshippo.com/shipments/ \
    -H "Authorization: ShippoToken {PRIVATE_TOKEN}" \
    -d address_from="d799c2679e644279b59fe661ac8fa488" \
    -d address_to="42236bcf36214f62bcc6d7f12f02a849" \
    -d parcels=["7df2ecf8b4224763ab7c71fae7ec8274"] \
    -d shipment_date="2013-12-03T12:00:00.000Z" \
    -d async=false
# Create the shipment object
shipment = Shippo::Shipment.create(
    :address_from => address_from,
    :address_to => address_to,
    :parcels => parcel,
    :async => false
)
# Create shipment object
shipment = shippo.Shipment.create(
    address_from = address_from,
    address_to = address_to,
    parcels = [parcel],
    async = False
)
// Create shipment object
$shipment = Shippo_Shipment::create(
    array(
        "address_from" => $fromAddress,
        "address_to" => $toAddress,
        "parcels" => array($parcel),
        "async" => false
    )
);
// Create shipment object
var shipment = shippo.shipment.create({
    "address_from": addressFrom,
    "address_to": addressTo,
    "parcels": [parcel],
    "async": true
})
APIResource resource = new APIResource ('');

// to address
Hashtable toAddressTable = new Hashtable();
toAddressTable.Add("name", "Mr Hippo");
toAddressTable.Add("company", "Shippo");
toAddressTable.Add("street1", "215 Clayton St.");
toAddressTable.Add("city", "San Francisco");
toAddressTable.Add("state", "CA");
toAddressTable.Add("zip", "94117");
toAddressTable.Add("country", "US");
toAddressTable.Add("phone", "+1 555 341 9393");
toAddressTable.Add("email", "mrhippo@goshipppo.com");

// from address
Hashtable fromAddressTable = new Hashtable();
fromAddressTable.Add("name", "Ms Hippo");
fromAddressTable.Add("company", "San Diego Zoo");
fromAddressTable.Add("street1", "2920 Zoo Drive");
fromAddressTable.Add("city", "San Diego");
fromAddressTable.Add("state", "CA");
fromAddressTable.Add("zip", "92101");
fromAddressTable.Add("country", "US");
fromAddressTable.Add("email", "mshippo@goshipppo.com");
fromAddressTable.Add("phone", "+1 619 231 1515");
fromAddressTable.Add("metadata", "Customer ID 123456");

Hashtable parcelTable = new Hashtable ();
parcelTable.Add ("length", "5");
parcelTable.Add ("width", "5");
parcelTable.Add ("height", "5");
parcelTable.Add ("distance_unit", "in");
parcelTable.Add ("weight", "2");
parcelTable.Add ("mass_unit", "lb");

resource.CreateShipment(new Hashtable(){
	{ "address_to", toAddressTable},
	{ "address_from", fromAddressTable},
	{ "parcels", parcelTable},
	{ "async", false}});
Shippo.setApiKey('');

// To Address
HashMap<String, Object> addressToMap = new HashMap<String, Object>();
addressToMap.put("name", "Mr Hippo");
addressToMap.put("company", "Shippo");
addressToMap.put("street1", "215 Clayton St.");
addressToMap.put("city", "San Francisco");
addressToMap.put("state", "CA");
addressToMap.put("zip", "94117");
addressToMap.put("country", "US");
addressToMap.put("phone", "+1 555 341 9393");
addressToMap.put("email", "mrhippo@goshipppo.com");

// From Address
HashMap<String, Object> addressFromMap = new HashMap<String, Object>();
addressFromMap.put("name", "Ms Hippo");
addressFromMap.put("company", "San Diego Zoo");
addressFromMap.put("street1", "2920 Zoo Drive");
addressFromMap.put("city", "San Diego");
addressFromMap.put("state", "CA");
addressFromMap.put("zip", "92101");
addressFromMap.put("country", "US");
addressFromMap.put("email", "mshippo@goshipppo.com");
addressFromMap.put("phone", "+1 619 231 1515");
addressFromMap.put("metadata", "Customer ID 123456");

// Parcel
HashMap<String, Object> parcelMap = new HashMap<String, Object>();
parcelMap.put("length", "5");
parcelMap.put("width", "5");
parcelMap.put("height", "5");
parcelMap.put("distance_unit", "in");
parcelMap.put("weight", "2");
parcelMap.put("mass_unit", "lb");

// Shipment
HashMap<String, Object> shipmentMap = new HashMap<String, Object>();
shipmentMap.put("address_to", addressToMap);
shipmentMap.put("address_from", addressFromMap);
shipmentMap.put("parcels", parcelMap);
shipmentMap.put("async", false);

Shipment shipment = Shipment.create(shipmentMap);

Solution

Shippo was able to provide VNYL with a shipping API that could be fully integrated into their application, giving customers a completely seamless experience within the VNYL app. Shippo also gives VNYL the ability to select shipping rates for their customers. VNYL can then present their customers with a relevant menu of shipping options. Label generation, package tracking and customer notifications are all built into Shippo’s API as part of their administrative tools.

What’s more, because the Shippo API provides tracking information through webhooks, VNYL’s application is able to detect when new shipping information is available. This allows to VNYL notify customers in real-time with shipment tracking information. This means that their customers don’t need to leave the app in order to look up tracking information on third party carrier websites, like FedEx or USPS. Additionally, the contents of a customer’s package are kept a secret until the day of delivery. VNYL has also been able to create a few new features around the Shippo API. For example, when a package is delivered, the Shippo app triggers VNYL to automatically upload music to a customer’s Spotify playlist.

"Many of the other shipping solutions in the market expect their customers to mostly use their web interface and only offer an APIs as a second thought. When we discovered that Shippo’s API was their primary focus, we knew that their product would be a strong fit for us," says Alt.

  • Provides an API solution that can be fully integrated into VNYL’s application
  • Gives the VNYL team the ability to offer customers a menu of relevant delivery options
  • Webhook pushes shipping updates in the application and sends customers real-time notifications

Tracking with Webhooks

  • cURL
  • Ruby
  • Python
  • PHP
  • Node
  • C#
  • Java
curl https://api.goshippo.com/tracks/ \
    -H "Authorization: ShippoToken {PRIVATE_TOKEN}" \
    -d carrier="usps" \
    -d tracking_number="9205590164917312751089" \
    -d metadata="Order 000123"
Shippo::Track::create({
    :carrier => "usps",
    :tracking_number => "9205590164917312751089",
    :metadata => "Order 000123"
})
shippo.Track.create(
  carrier=carrier_token,
  tracking=tracking_number,
  metadata='optional, up to 100 characters'
)
Shippo_Track::create(
    array(
      "carrier" => "usps",
      "tracking_number" => "9205590164917312751089",
      "metadata" => "Order 000123"
    )
)
shippo.track.create({
    "carrier": "usps",
    "tracking_number":"9205590164917312751089",
    "metadata": "Order 000123"
})
APIResource resource = new APIResource ("{PRIVATE_TOKEN}");
resource.RegisterTrackingWebhook(new Hashtable (){
    {"carrier","usps"},
    {"tracking_number","9205590164917312751089"},
    {"metadata","Order 00123"}
});
Map<String, Object> trackingNumber = new HashMap();
trackingNumber.put("carrier", "usps");
trackingNumber.put("tracking_number","9205590164917312751089");
trackingNumber.put("metadata", "Order 000123");
track.registerTrackingWebhook(trackingNumber);

Results

With Shippo, VNYL was able to quickly scale their shipping logistics by providing a fast, efficient and cost-effective solution. They offer the best value for shipping with their reliable API that can be seamlessly integrated into the VNYL application. Shippo has also enabled VNYL to build new features into their application, such as notifying customers with real-time delivery updates, that they couldn’t have offered before. Shippo is available at all times and ensures that VNYL customers won’t ever experience an interruption in service.

Since partnering with Shippo, VNYL has been able to focus on delivering an immersive music experience for the passionate customer base, instead of working out complicated shipping logistics.

"Shippo offers the best value in the market in terms of ease-of-use, cost-effectiveness and fast implementation. We were able to integrate their API into our app quickly and have everything we needed to scale our business," says Alt.

  • Reduced friction across the entire shipping, tracking and delivery process
  • Delighting customers using shipping data as triggers
  • VNYL can focus on music discovery and customer delight

Shipment Object with Rates

{
    "status": "SUCCESS",
    "object_created": "2013-12-01T06:24:20.121Z",
    "object_updated": "2013-12-01T06:24:20.121Z",
    "object_id": "5e40ead7cffe4cc1ad45108696162e42",
    "object_owner": "shippotle@goshippo.com",
    "address_from": {
        "object_id": "0943ae4e373e4120a99c337e496dcce8",
        "validation_results": {},
        "is_complete": true,
        "company": "",
        "street_no": "",
        "name": "Mr. Hippo",
        "street1": "215 Clayton St.",
        "street2": "",
        "city": "San Francisco",
        "state": "CA",
        "zip": "94117",
        "country": "US",
        "phone": "+15553419393",
        "email": "support@goshippo.com",
        "is_residential": null
    },
    "address_to": {
        "object_id": "4c7185d353764d0985a6a7825aed8ffb",
        "validation_results": {},
        "is_complete": true,
        "name":"Mrs. Hippo",
        "street1":"965 Mission St.",
        "city":"San Francisco",
        "state":"CA",
        "zip":"94105",
        "country":"US",
        "phone":"+1 555 341 9393",
        "email":"support@goshippo.com",
        "is_residential": false
    },
    "address_return": {
        "object_id": "0943ae4e373e4120a99c337e496dcce8",
        "validation_results": {},
        "is_complete": true,
        "company": "",
        "street_no": "",
        "name": "Mr. Hippo",
        "street1": "215 Clayton St.",
        "street2": "",
        "city": "San Francisco",
        "state": "CA",
        "zip": "94117",
        "country": "US",
        "phone": "+15553419393",
        "email": "support@goshippo.com",
        "is_residential": null
    },
    "parcels": [{
        "object_id": "ec952343dd4843c39b42aca620471fd5",
        "object_created": "2013-12-01T06:24:21.121Z",
        "object_updated": "2013-12-01T06:24:21.121Z",
        "object_owner": "shippotle@goshippo.com",
        "template": null,
        "length":"5",
        "width":"5",
        "height":"5",
        "distance_unit":"in",
        "weight":"2",
        "mass_unit":"lb",
        "value_amount": null,
        "value_currency": null,
        "metadata": "",
        "line_items": [],
        "test": true
    }],
    "shipment_date": "2013-12-03T12:00:00.000Z",
    "extra": {
        "insurance": {
            "currency": "",
            "amount": ""
        }
    },
    "customs_declaration": "",
    "rates": [
        {
            "object_created": "2013-12-01T06:24:21.121Z",
            "object_id": "cf6fea899f1848b494d9568e8266e076",
            "object_owner": "shippotle@goshippo.com",
            "shipment": "5e40ead7cffe4cc1ad45108696162e42",
            "attributes": [],
            "amount": "5.50",
            "currency": "USD",
            "amount_local": "5.50",
            "currency_local": "USD",
            "provider": "USPS",
            "provider_image_75": "https://cdn2.goshippo.com/providers/75/USPS.png",
            "provider_image_200": "https://cdn2.goshippo.com/providers/200/USPS.png",
            "servicelevel": {
                "name": "Priority Mail",
                "token":"usps_priority",
                "terms": "",
            },
            "days": 2,
            "arrives_by": null,
            "duration_terms": "Delivery in 1 to 3 business days.",
            "messages": [],
            "carrier_account": "078870331023437cb917f5187429b093",
            "test": false,
            "zone": 1
        },
        ...
    ],
    "carrier_accounts": [],
    "metadata": "Customer ID 123456",
    "messages": []
}