diff --git a/lib/sympto/index.js b/lib/sympto/index.js
index e32f8a29d758affd6413fa0eea129ae6f6042dac..291c378bd2f9a4a67decb21b128d3f6b40d2e506 100644
--- a/lib/sympto/index.js
+++ b/lib/sympto/index.js
@@ -4,7 +4,8 @@ import getPreOvulatoryPhase from './pre-ovulatory'
 import { LocalDate } from 'js-joda'
 
 export default function ({ cycle, previousCycle }) {
-  // TODO check for basic stuff, throw if nonexistent
+  throwIfArgsAreNotInRequiredFormat(cycle, previousCycle)
+
   const status = {
     assumeFertility: true,
     phases: {}
@@ -66,4 +67,26 @@ export default function ({ cycle, previousCycle }) {
   status.assumeFertility = false
 
   return status
+}
+
+function throwIfArgsAreNotInRequiredFormat(cycle, previousCycle) {
+  if (!Array.isArray(cycle) || !cycle.length) throw new Error('Please provide all cycle days as array')
+  if (!Array.isArray(previousCycle) || !previousCycle.length) throw new Error('Please provide previous cycle days as array')
+  if (
+    !cycle[0].bleeding || typeof cycle[0].bleeding.value != 'number' ||
+    !previousCycle[0].bleeding || typeof previousCycle[0].bleeding.value != 'number'
+  ) throw new Error('Cycle must start with bleeding')
+
+  if ([cycle, previousCycle].some(cycle => {
+    return cycle.some(day => {
+      if (!day.date) return true
+      try {
+        LocalDate.parse(day.date)
+      } catch(err) {
+        throw new Error('Please provide dates in ISO8601 format')
+      }
+      if (day.temperature && typeof day.temperature.value != 'number') return true
+      if (day.mucus && typeof day.mucus.value != 'number') return true
+    })
+  })) throw new Error('Cycle days are not in correct format')
 }
\ No newline at end of file
diff --git a/test/sympto/fixtures.js b/test/sympto/fixtures.js
index a7b237d436d60089aa9071888344007f2bd42140..4304f8206da4bc7330ede78fd26c907521bfbff5 100644
--- a/test/sympto/fixtures.js
+++ b/test/sympto/fixtures.js
@@ -10,10 +10,12 @@ function convertToSymptoFormat(val) {
 const cycleWithTempShift = [36.6, 36.6, 36.6, 36.6, 36.6, 36.6, 36.8, 36.8, 36.8]
   .map(num => ({ date: '2018-06-01', temperature: num }))
   .map(convertToSymptoFormat)
+cycleWithTempShift.unshift({date: '2018-05-30', bleeding: { value: 2 }})
 
 const cycleWithoutTempShift = [36.6, 36.6, 36.6, 36.6, 36.6, 36.6, 36.8, 36.8]
   .map(num => ({ date: '2018-06-01', temperature: num }))
   .map(convertToSymptoFormat)
+cycleWithoutTempShift.unshift({date: '2018-05-30', bleeding: { value: 2 }})
 
 const cycleWithTempAndMucusShift = [
   { date: '2018-06-01', temperature: 36.6, bleeding: 2 },
diff --git a/test/sympto/index.spec.js b/test/sympto/index.spec.js
index 46d234f0173c4dcb349902b0be15a58a4f571477..e9502804511a58193da8b41800d53b46fb1a493e 100644
--- a/test/sympto/index.spec.js
+++ b/test/sympto/index.spec.js
@@ -7,47 +7,45 @@ import {
 const expect = chai.expect
 
 describe('sympto', () => {
-  describe('evaluating mucus and temperature shift together', () => {
-    describe('with no previous higher measurement', () => {
-      it('with no shifts detects only peri-ovulatory', function () {
-        const status = getSensiplanStatus({
-          cycle: cycleWithoutAnyShifts,
-          previousCycle: cycleWithoutTempShift
-        })
+  describe('with no previous higher measurement', () => {
+    it('with no shifts detects only peri-ovulatory', function () {
+      const status = getSensiplanStatus({
+        cycle: cycleWithoutAnyShifts,
+        previousCycle: cycleWithoutTempShift
+      })
 
-        expect(status).to.eql({
-          assumeFertility: true,
-          phases: {
-            periOvulatory: {
-              start: { date: '2018-06-01' },
-              cycleDays: cycleWithoutAnyShifts
-            }
-          },
-        })
+      expect(status).to.eql({
+        assumeFertility: true,
+        phases: {
+          periOvulatory: {
+            start: { date: '2018-06-01' },
+            cycleDays: cycleWithoutAnyShifts
+          }
+        },
       })
+    })
 
-      it('with shifts detects only peri-ovulatory and post-ovulatory', function () {
-        const status = getSensiplanStatus({
-          cycle: cycleWithTempAndMucusShift,
-          previousCycle: cycleWithoutTempShift
-        })
+    it('with shifts detects only peri-ovulatory and post-ovulatory', function () {
+      const status = getSensiplanStatus({
+        cycle: cycleWithTempAndMucusShift,
+        previousCycle: cycleWithoutTempShift
+      })
 
-        expect(status.temperatureShift).to.be.an('object')
-        expect(status.mucusShift).to.be.an('object')
-        expect(status.assumeFertility).to.be.false()
-        expect(Object.keys(status.phases).length).to.eql(2)
-        expect(status.phases.periOvulatory).to.eql({
-          start: { date: '2018-06-01' },
-          end: { date: '2018-06-21', time: '18:00' },
-          cycleDays: cycleWithTempAndMucusShift.filter(({date}) => date <= '2018-06-21')
-        })
-        expect(status.phases.postOvulatory).to.eql({
-          start: {
-            date: '2018-06-21',
-            time: '18:00'
-          },
-          cycleDays: cycleWithTempAndMucusShift.filter(({date}) => date >= '2018-06-21')
-        })
+      expect(status.temperatureShift).to.be.an('object')
+      expect(status.mucusShift).to.be.an('object')
+      expect(status.assumeFertility).to.be.false()
+      expect(Object.keys(status.phases).length).to.eql(2)
+      expect(status.phases.periOvulatory).to.eql({
+        start: { date: '2018-06-01' },
+        end: { date: '2018-06-21', time: '18:00' },
+        cycleDays: cycleWithTempAndMucusShift.filter(({date}) => date <= '2018-06-21')
+      })
+      expect(status.phases.postOvulatory).to.eql({
+        start: {
+          date: '2018-06-21',
+          time: '18:00'
+        },
+        cycleDays: cycleWithTempAndMucusShift.filter(({date}) => date >= '2018-06-21')
       })
     })
   })
@@ -117,4 +115,61 @@ describe('sympto', () => {
 
     })
   })
+  describe('when args are wrong', () => {
+    it('throws when arg object is not in right format', () => {
+      const wrongObject = { hello: 'world' }
+      expect(() => getSensiplanStatus(wrongObject)).to.throw('cycle days as array')
+    })
+    it('throws if cycle array is empty', () => {
+      expect(() => getSensiplanStatus({cycle: []})).to.throw('cycle days as array')
+    })
+    it('throws if cycle days are not in right format', () => {
+      expect(() => getSensiplanStatus({
+        cycle: [{
+          hello: 'world',
+          bleeding: { value: 0 }
+        }],
+        previousCycle: [{
+          date: '1992-09-09',
+          bleeding: { value: 0 }
+        }]
+      })).to.throw('correct format')
+      expect(() => getSensiplanStatus({
+        cycle: [{
+          date: '2018-04-13',
+          temperature: {value: '35'},
+          bleeding: { value: 0 }
+        }],
+        previousCycle: [{
+          date: '1992-09-09',
+          bleeding: { value: 0 }
+        }]
+      })).to.throw('correct format')
+      expect(() => getSensiplanStatus({
+        cycle: [{
+          date: '09-14-2017',
+          bleeding: { value: 0 }
+        }],
+        previousCycle: [{
+          date: '1992-09-09',
+          bleeding: { value: 0 }
+        }]
+      })).to.throw('ISO')
+    })
+    it('throws if first cycle day does not have bleeding value', () => {
+      expect(() => getSensiplanStatus({
+        cycle: [{
+          date: '2017-01-01',
+          bleeding: {
+            value: 'medium'
+          }
+        }],
+        previousCycle: [
+          {
+            date: '2017-09-23',
+          }
+        ]
+      })).to.throw('start with bleeding')
+    })
+  })
 })
\ No newline at end of file