Desktop Wallpaper Calendars: June 2015

We always try our best to challenge your artistic abilities and produce some interesting, beautiful and creative artwork, and as designers we usually turn to different sources of inspiration. As a matter of fact, we’ve discovered the best one—desktop wallpapers that are a little more distinctive than the usual crowd. This creativity mission has been going on for seven years now1, and we are very thankful to all designers who have contributed and are still diligently contributing each month.

This post features free desktop wallpapers created by artists across the globe for June 2015. Both versions with a calendar and without a calendar can be downloaded for free. It’s time to freshen up your wallpaper!

Please note that:

  • All images can be clicked on and lead to the preview of the wallpaper,
  • You can feature your work in our magazine2 by taking part in our Desktop Wallpaper Calendars series. We are regularly looking for creative designers and artists to be featured on Smashing Magazine. Are you one of them?

Fishing Is My Passion!

“The month of June is a wonderful time to go fishing, the most soothing and peaceful activity.” — Designed by Igor Izhik3 from Canada.

Fishing Is My Passion!4

Strawberry Fields

Designed by Nathalie Ouederni45 from France.

Strawberry Fields46

The Amazing Water Park

“Summer is coming. And it’s going to be like an amazing water park, full of stunning encounters.” — Designed by Netzbewegung / Mario Metzger62 from Germany.

The Amazing Water Park63


Designed by Elise Vanoorbeek (Doud Design)105 from Belgium.


R U Ready for Summertime?

“Summer… hair gets lighter, skin gets darker, water gets warmer, nights get longer, music gets louder. Life gets better.” — Designed by Marielle Perikly Kokosidou142 from Greece.

R U Ready for Summertime?143

June Is Here!

“At last, summer has arrived! So enjoy the sunny weather, make happy thoughts and start planning your vacations. Celebrate the fist month of the summer with a fresh orange juice!” — Designed by WebOlution185 from Greece.

June Is Here!186

Let The Spring Set You Free

Designed by Ema Tanaskoska Mitrevska230 from Macedonia.

Let The Spring Set You Free231

Caution! Hot June

Designed by Iquadart269 from Belarus.

Caution! Hot June270

Summer Time…

“I am happy in summer! All you need is fresh and relax!” — Designed by Verónica Valenzuela292 from Spain.

Summer Time...293

Night Night!

“The time we spend with our dads is precious so I picked an activity my dad enjoys a lot, reading.” — Designed by Maria Keller313 from Mexico.

Night Night!314

Knitting For Summer

“I made multiple circles overlapping with close distances. The overall drawing looks like a clothing texture, for something you could wear in coming summer. Let’s have a nice summer.” — Designed by Philippe Brouard366 from France.

Knitting For Summer367

Periodic Table Of HTML5 Elements

“We wanted an easy reference guide to help navigate through HTML5 and that could be updateable” — Designed by Castus389 from the UK.

Periodic Table Of HTML5 Elements390

Shine Your Light

“Shine your light, Before the fight, Just like the sun, Cause we don’t have to run.” — Designed by Anh Nguyet Tran412 from Vietnam.

Shine Your Light413

Lavender Is In The Air!

“June always reminds me of lavender – it just smells wonderful and fresh. For this wallpaper I wanted to create a simple, yet functional design that featured… you guessed it… lavender!” — Designed by Jon Phillips441 from Canada.

Lavender Is In The Air!442

Through The Savannah

“Giraffes are my favorite animal and June 21st is World Giraffe Day, so it was fitting to make it for this month.” — Designed by Megan Jones484 from Pennsylvania, USA.

Through The Savannah485

Only True Love Stays

“June is my wedding anniversary so it has a special place in my heart. And blowing dandelion in the wind is an absolute joy!” — Designed by Thuy Truong513 from the USA.

Only True Love Stays514

Scattered Leaves

Designed by Marlin Jackson526 from South Africa.

Scattered Leaves527

Springtime Bubbles

“I wanted to create a spring/summer vibe and I thought bubbles were a great way to do this because they aren’t too cliche and many people can be seen blowing bubbles during this time of year.” — Designed by Kathleen Reilly571 from United States.

Springtime Bubbles572

Happiness Together, Forever

“June brings with the start of the wedding season and all the joy that togetherness brings to the world.” — Designed by Band Hire UK616 from United Kingdom.

Happiness, Together, Forever617

Hershel The Walking Dead

“I’m a huge fan of The Walking Dead, and so I decided to make a wallpaper of Hershel.” — Designed by Loïs Claassen643 from the Netherlands.

Hershel The Walking Dead644

Join In Next Month!

Please note that we respect and carefully consider the ideas and motivation behind each and every artist’s work. This is why we give all artists the full freedom to explore their creativity and express emotions and experience throughout their works. This is also why the themes of the wallpapers weren’t anyhow influenced by us, but rather designed from scratch by the artists themselves.

A big thank you to all designers for their participation. Join in next month666!

What’s Your Favorite?

What’s your favorite theme or wallpaper for this month? Please let us know in the comment section below.



  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6×480.jpg
  7. 7×480.jpg
  8. 8×480.jpg
  9. 9×600.jpg
  10. 10×768.jpg
  11. 11×1024.jpg
  12. 12×864.jpg
  13. 13×720.jpg
  14. 14×800.jpg
  15. 15×960.jpg
  16. 16×1024.jpg
  17. 17×1050.jpg
  18. 18×900.jpg
  19. 19×1200.jpg
  20. 20×1050.jpg
  21. 21×1200.jpg
  22. 22×1080.jpg
  23. 23×1200.jpg
  24. 24×1440.jpg
  25. 25×1440.jpg
  26. 26×480.jpg
  27. 27×480.jpg
  28. 28×480.jpg
  29. 29×600.jpg
  30. 30×768.jpg
  31. 31×1024.jpg
  32. 32×864.jpg
  33. 33×720.jpg
  34. 34×800.jpg
  35. 35×960.jpg
  36. 36×1024.jpg
  37. 37×1050.jpg
  38. 38×900.jpg
  39. 39×1200.jpg
  40. 40×1200.jpg
  41. 41×1080.jpg
  42. 42×1200.jpg
  43. 43×1440.jpg
  44. 44×1440.jpg
  45. 45
  46. 46
  47. 47
  48. 48×480.jpg
  49. 49×768.jpg
  50. 50×1024.jpg
  51. 51×900.jpg
  52. 52×1200.jpg
  53. 53×1200.jpg
  54. 54×1440.jpg
  55. 55×480.jpg
  56. 56×768.jpg
  57. 57×1024.jpg
  58. 58×900.jpg
  59. 59×1200.jpg
  60. 60×1200.jpg
  61. 61×1440.jpg
  62. 62
  63. 63
  64. 64
  65. 65×480.jpg
  66. 66×480.jpg
  67. 67×600.jpg
  68. 68×768.jpg
  69. 69×1024.jpg
  70. 70×864.jpg
  71. 71×720.jpg
  72. 72×800.jpg
  73. 73×960.jpg
  74. 74×1024.jpg
  75. 75×768.jpg
  76. 76×1050.jpg
  77. 77×900.jpg
  78. 78×1200.jpg
  79. 79×1050.jpg
  80. 80×1200.jpg
  81. 81×1080.jpg
  82. 82×1200.jpg
  83. 83×1440.jpg
  84. 84×1440.jpg
  85. 85×480.jpg
  86. 86×480.jpg
  87. 87×600.jpg
  88. 88×768.jpg
  89. 89×1024.jpg
  90. 90×864.jpg
  91. 91×720.jpg
  92. 92×800.jpg
  93. 93×960.jpg
  94. 94×1024.jpg
  95. 95×768.jpg
  96. 96×1050.jpg
  97. 97×900.jpg
  98. 98×1200.jpg
  99. 99×1050.jpg
  100. 100×1200.jpg
  101. 101×1080.jpg
  102. 102×1200.jpg
  103. 103×1440.jpg
  104. 104×1440.jpg
  105. 105
  106. 106
  107. 107
  108. 108×768.jpg
  109. 109×1024.jpg
  110. 110×864.jpg
  111. 111×720.jpg
  112. 112×800.jpg
  113. 113×960.jpg
  114. 114×1024.jpg
  115. 115×768.jpg
  116. 116×1050.jpg
  117. 117×900.jpg
  118. 118×1200.jpg
  119. 119×1050.jpg
  120. 120×1200.jpg
  121. 121×1080.jpg
  122. 122×1200.jpg
  123. 123×1440.jpg
  124. 124×1440.jpg
  125. 125×768.jpg
  126. 126×1024.jpg
  127. 127×864.jpg
  128. 128×720.jpg
  129. 129×800.jpg
  130. 130×960.jpg
  131. 131×1024.jpg
  132. 132×768.jpg
  133. 133×1050.jpg
  134. 134×900.jpg
  135. 135×1200.jpg
  136. 136×1050.jpg
  137. 137×1200.jpg
  138. 138×1080.jpg
  139. 139×1200.jpg
  140. 140×1440.jpg
  141. 141×1440.jpg
  142. 142
  143. 143
  144. 144
  145. 145×480.png
  146. 146×480.png
  147. 147×480.png
  148. 148×600.png
  149. 149×768.png
  150. 150×1024.png
  151. 151×864.png
  152. 152×720.png
  153. 153×800.png
  154. 154×960.png
  155. 155×1024.png
  156. 156×900.png
  157. 157×1050.png
  158. 158×1200.png
  159. 159×1050.png
  160. 160×1200.png
  161. 161×1080.png
  162. 162×1200.png
  163. 163×1440.png
  164. 164×1440.png
  165. 165×480.png
  166. 166×480.png
  167. 167×480.png
  168. 168×600.png
  169. 169×768.png
  170. 170×1024.png
  171. 171×864.png
  172. 172×720.png
  173. 173×800.png
  174. 174×960.png
  175. 175×1024.png
  176. 176×900.png
  177. 177×1050.png
  178. 178×1200.png
  179. 179×1050.png
  180. 180×1200.png
  181. 181×1080.png
  182. 182×1200.png
  183. 183×1440.png
  184. 184×1440.png
  185. 185
  186. 186
  187. 187
  188. 188×480.jpg
  189. 189×480.jpg
  190. 190×480.jpg
  191. 191×600.jpg
  192. 192×768.jpg
  193. 193×1024.jpg
  194. 194×864.jpg
  195. 195×720.jpg
  196. 196×800.jpg
  197. 197×960.jpg
  198. 198×1024.jpg
  199. 199×768.jpg
  200. 200×900.jpg
  201. 201×1050.jpg
  202. 202×1200.jpg
  203. 203×1050.jpg
  204. 204×1200.jpg
  205. 205×1080.jpg
  206. 206×1200.jpg
  207. 207×1440.jpg
  208. 208×1440.jpg
  209. 209×480.jpg
  210. 210×480.jpg
  211. 211×480.jpg
  212. 212×600.jpg
  213. 213×768.jpg
  214. 214×1024.jpg
  215. 215×864.jpg
  216. 216×720.jpg
  217. 217×800.jpg
  218. 218×960.jpg
  219. 219×1024.jpg
  220. 220×768.jpg
  221. 221×900.jpg
  222. 222×1050.jpg
  223. 223×1200.jpg
  224. 224×1050.jpg
  225. 225×1200.jpg
  226. 226×1080.jpg
  227. 227×1200.jpg
  228. 228×1440.jpg
  229. 229×1440.jpg
  230. 230
  231. 231
  232. 232
  233. 233×480.jpg
  234. 234×480.jpg
  235. 235×480.jpg
  236. 236×600.jpg
  237. 237×768.jpg
  238. 238×864.jpg
  239. 239×720.jpg
  240. 240×800.jpg
  241. 241×960.jpg
  242. 242×1024.jpg
  243. 243×900.jpg
  244. 244×1200.jpg
  245. 245×1050.jpg
  246. 246×1200.jpg
  247. 247×1080.jpg
  248. 248×1200.jpg
  249. 249×1440.jpg
  250. 250×1440.jpg
  251. 251×480.jpg
  252. 252×480.jpg
  253. 253×480.jpg
  254. 254×600.jpg
  255. 255×768.jpg
  256. 256×864.jpg
  257. 257×720.jpg
  258. 258×800.jpg
  259. 259×960.jpg
  260. 260×1024.jpg
  261. 261×900.jpg
  262. 262×1200.jpg
  263. 263×1050.jpg
  264. 264×1200.jpg
  265. 265×1080.jpg
  266. 266×1200.jpg
  267. 267×1440.jpg
  268. 268×1440.jpg
  269. 269
  270. 270
  271. 271
  272. 272×480.png
  273. 273×600.png
  274. 274×768.png
  275. 275×720.png
  276. 276×800.png
  277. 277×900.png
  278. 278×1050.png
  279. 279×1080.png
  280. 280×1200.png
  281. 281×1440.png
  282. 282×480.png
  283. 283×600.png
  284. 284×768.png
  285. 285×720.png
  286. 286×800.png
  287. 287×900.png
  288. 288×1050.png
  289. 289×1080.png
  290. 290×1200.png
  291. 291×1440.png
  292. 292
  293. 293
  294. 294
  295. 295×480.png
  296. 296×768.png
  297. 297×864.png
  298. 298×800.png
  299. 299×960.png
  300. 300×900.png
  301. 301×1200.png
  302. 302×1080.png
  303. 303×1440.png
  304. 304×480.png
  305. 305×768.png
  306. 306×864.png
  307. 307×800.png
  308. 308×960.png
  309. 309×900.png
  310. 310×1200.png
  311. 311×1080.png
  312. 312×1440.png
  313. 313
  314. 314
  315. 315
  316. 316×480.png
  317. 317×480.png
  318. 318×1136.png
  319. 319×1334.png
  320. 320×480.png
  321. 321×600.png
  322. 322×768.png
  323. 323×1024.png
  324. 324×864.png
  325. 325×2208.png
  326. 326×720.png
  327. 327×800.png
  328. 328×960.png
  329. 329×1024.png
  330. 330×768.png
  331. 331×1050.png
  332. 332×900.png
  333. 333×1200.png
  334. 334×1050.png
  335. 335×1200.png
  336. 336×1080.png
  337. 337×1200.png
  338. 338×1440.png
  339. 339×1440.png
  340. 340×1800.png
  341. 341×480.png
  342. 342×480.png
  343. 343×1136.png
  344. 344×1334.png
  345. 345×480.png
  346. 346×600.png
  347. 347×768.png
  348. 348×1024.png
  349. 349×864.png
  350. 350×2208.png
  351. 351×720.png
  352. 352×800.png
  353. 353×960.png
  354. 354×1024.png
  355. 355×768.png
  356. 356×1050.png
  357. 357×900.png
  358. 358×1200.png
  359. 359×1050.png
  360. 360×1200.png
  361. 361×1080.png
  362. 362×1200.png
  363. 363×1440.png
  364. 364×1440.png
  365. 365×1800.png
  366. 366
  367. 367
  368. 368
  369. 369×480.jpg
  370. 370×768.jpg
  371. 371×720.jpg
  372. 372×800.jpg
  373. 373×900.jpg
  374. 374×1200.jpg
  375. 375×1080.jpg
  376. 376×1200.jpg
  377. 377×1440.jpg
  378. 378×1800.jpg
  379. 379×480.jpg
  380. 380×768.jpg
  381. 381×720.jpg
  382. 382×800.jpg
  383. 383×900.jpg
  384. 384×1200.jpg
  385. 385×1080.jpg
  386. 386×1200.jpg
  387. 387×1440.jpg
  388. 388×1800.jpg
  389. 389
  390. 390
  391. 391
  392. 392×768.jpg
  393. 393×800.jpg
  394. 394×1024.jpg
  395. 395×768.jpg
  396. 396×900.jpg
  397. 397×900.jpg
  398. 398×1200.jpg
  399. 399×1080.jpg
  400. 400×1200.jpg
  401. 401×1440.jpg
  402. 402×768.jpg
  403. 403×800.jpg
  404. 404×1024.jpg
  405. 405×768.jpg
  406. 406×900.jpg
  407. 407×900.jpg
  408. 408×1200.jpg
  409. 409×1080.jpg
  410. 410×1200.jpg
  411. 411×1440.jpg
  412. 412
  413. 413
  414. 414
  415. 415×1280.png
  416. 416×1024.png
  417. 417×800.png
  418. 418×1024.png
  419. 419×768.png
  420. 420×900.png
  421. 421×1200.png
  422. 422×1050.png
  423. 423×1200.png
  424. 424×1080.png
  425. 425×1200.png
  426. 426×1440.png
  427. 427×1440.png
  428. 428×1280.png
  429. 429×1024.png
  430. 430×800.png
  431. 431×1024.png
  432. 432×768.png
  433. 433×900.png
  434. 434×1200.png
  435. 435×1050.png
  436. 436×1200.png
  437. 437×1080.png
  438. 438×1200.png
  439. 439×1440.png
  440. 440×1440.png
  441. 441
  442. 442
  443. 443
  444. 444×480.jpg
  445. 445×480.jpg
  446. 446×480.jpg
  447. 447×600.jpg
  448. 448×768.jpg
  449. 449×1024.jpg
  450. 450×864.jpg
  451. 451×720.jpg
  452. 452×800.jpg
  453. 453×960.jpg
  454. 454×1024.jpg
  455. 455×1050.jpg
  456. 456×900.jpg
  457. 457×1200.jpg
  458. 458×1050.jpg
  459. 459×1200.jpg
  460. 460×1080.jpg
  461. 461×1200.jpg
  462. 462×1440.jpg
  463. 463×1440.jpg
  464. 464×480.jpg
  465. 465×480.jpg
  466. 466×480.jpg
  467. 467×600.jpg
  468. 468×768.jpg
  469. 469×1024.jpg
  470. 470×864.jpg
  471. 471×720.jpg
  472. 472×800.jpg
  473. 473×960.jpg
  474. 474×1024.jpg
  475. 475×1050.jpg
  476. 476×900.jpg
  477. 477×1200.jpg
  478. 478×1050.jpg
  479. 479×1200.jpg
  480. 480×1080.jpg
  481. 481×1200.jpg
  482. 482×1440.jpg
  483. 483×1440.jpg
  484. 484
  485. 485
  486. 486
  487. 487×768.png
  488. 488×864.png
  489. 489×720.png
  490. 490×800.png
  491. 491×960.png
  492. 492×900.png
  493. 493×1200.png
  494. 494×1050.png
  495. 495×1200.png
  496. 496×1080.png
  497. 497×1200.png
  498. 498×1440.png
  499. 499×1440.png
  500. 500×768.png
  501. 501×864.png
  502. 502×720.png
  503. 503×800.png
  504. 504×960.png
  505. 505×900.png
  506. 506×1200.png
  507. 507×1050.png
  508. 508×1200.png
  509. 509×1080.png
  510. 510×1200.png
  511. 511×1440.png
  512. 512×1440.png
  513. 513
  514. 514
  515. 515
  516. 516×480.jpg
  517. 517×768.jpg
  518. 518×768.jpg
  519. 519×1080.jpg
  520. 520×1440.jpg
  521. 521×480.jpg
  522. 522×768.jpg
  523. 523×768.jpg
  524. 524×1080.jpg
  525. 525×1440.jpg
  526. 526
  527. 527
  528. 528
  529. 529×480.png
  530. 530×480.png
  531. 531×480.png
  532. 532×600.png
  533. 533×768.png
  534. 534×1024.png
  535. 535×864.png
  536. 536×720.png
  537. 537×800.png
  538. 538×960.png
  539. 539×1024.png
  540. 540×768.png
  541. 541×1050.png
  542. 542×900.png
  543. 543×1200.png
  544. 544×1050.png
  545. 545×1200.png
  546. 546×1080.png
  547. 547×1200.png
  548. 548×1440.png
  549. 549×1440.png
  550. 550×480.png
  551. 551×480.png
  552. 552×480.png
  553. 553×600.png
  554. 554×768.png
  555. 555×1024.png
  556. 556×864.png
  557. 557×720.png
  558. 558×800.png
  559. 559×960.png
  560. 560×1024.png
  561. 561×768.png
  562. 562×1050.png
  563. 563×900.png
  564. 564×1200.png
  565. 565×1050.png
  566. 566×1200.png
  567. 567×1080.png
  568. 568×1200.png
  569. 569×1440.png
  570. 570×1440.png
  571. 571
  572. 572
  573. 573
  574. 574×480.png
  575. 575×480.png
  576. 576×480.png
  577. 577×600.png
  578. 578×768.png
  579. 579×1024.png
  580. 580×864.png
  581. 581×720.png
  582. 582×800.png
  583. 583×960.png
  584. 584×1024.png
  585. 585×1050.png
  586. 586×900.png
  587. 587×1200.png
  588. 588×1050.png
  589. 589×1200.png
  590. 590×1080.png
  591. 591×1200.png
  592. 592×1440.png
  593. 593×1440.png
  594. 594×768.png
  595. 595×480.png
  596. 596×480.png
  597. 597×480.png
  598. 598×600.png
  599. 599×768.png
  600. 600×1024.png
  601. 601×864.png
  602. 602×720.png
  603. 603×800.png
  604. 604×960.png
  605. 605×1024.png
  606. 606×1050.png
  607. 607×900.png
  608. 608×1200.png
  609. 609×1050.png
  610. 610×1200.png
  611. 611×1080.png
  612. 612×1200.png
  613. 613×1440.png
  614. 614×1440.png
  615. 615×768.png
  616. 616
  617. 617
  618. 618
  619. 619×480.jpg
  620. 620×600.jpg
  621. 621×1024.jpg
  622. 622×768.jpg
  623. 623×1050.jpg
  624. 624×1200.jpg
  625. 625×1050.jpg
  626. 626×1200.jpg
  627. 627×1080.jpg
  628. 628×1200.jpg
  629. 629×1440.jpg
  630. 630×1440.jpg
  631. 631×480.jpg
  632. 632×600.jpg
  633. 633×1024.jpg
  634. 634×768.jpg
  635. 635×1050.jpg
  636. 636×1200.jpg
  637. 637×1050.jpg
  638. 638×1200.jpg
  639. 639×1080.jpg
  640. 640×1200.jpg
  641. 641×1440.jpg
  642. 642×1440.jpg
  643. 643
  644. 644
  645. 645
  646. 646×768.png
  647. 647×1050.png
  648. 648×900.png
  649. 649×1200.png
  650. 650×1050.png
  651. 651×1200.png
  652. 652×1020.png
  653. 653×1200.png
  654. 654×1440.png
  655. 655×1440.png
  656. 656×768.png
  657. 657×1050.png
  658. 658×900.png
  659. 659×1200.png
  660. 660×1050.png
  661. 661×1200.png
  662. 662×1020.png
  663. 663×1200.png
  664. 664×1440.png
  665. 665×1440.png
  666. 666

The post Desktop Wallpaper Calendars: June 2015 appeared first on Smashing Magazine.

Follow this link: 

Desktop Wallpaper Calendars: June 2015

Is Your Designer Killing Your Conversions?

Designer Vs. Marketer
“That big, colorful button looked sooooo 2010, so I made it transparent. It’s much cleaner now.” Image source.

Have you ever worked with a designer who was more interested in fancy animations and cutting-edge technology than in creating a page that actually resonates with you and your audience?

While I’ve been lucky enough to work with many talented, pragmatic designers, I’d be lying if I said I’d never been frustrated with a designer who I felt was working more against me than with me.

Luckily, Jen Gordon isn’t such a designer. As the founder of Convert Themes, a design service explicitly for landing pages, Jen understands the importance of designing pages that are both beautiful and highly-optimized for conversion.

Hoping to help marketers work better with their designers, she recently hosted an unwebinar with us entitled 3 Tools to Keep Your Designer From Killing Your Conversions — which, of course, came packaged with three tools to keep your designer from killing your conversions.

And while those tools are pretty great, the advice Jen gave on easing the tension between design and conversion was just as valuable. Read on for the distilled insights, or click here to watch the full webinar.

Lost in translation

Jen described a situation in which she received a brief for a landing page project. While it gave her basic direction, detailing the offer and the copy, it was left up to her to decide things like:

  • The page’s visual hierarchy — the structure and order of its visual and textual elements
  • The type of imagery that would resonate with the page’s intended audience
  • The problem or pain point the page’s visitor is looking to solve

These are not small decisions to make. Yet they are exactly the kinds of critical decisions that are hoisted upon designers, either implicitly or explicitly. And in a situation like this, designers can be reluctant to ask questions or open a dialogue with the project manager.

But why? What is the root of this tension between marketers and designers?

To answer this, Jen made a word cloud based on the most shared posts on ConversionXL, Hubspot and Unbounce over the past year:


… and then did the same for some of the world’s top design blogs:


Notice that there is very little overlap between these two word clouds. They suggest that marketers are largely interested in results and the techniques that will produce them, while designers are more interested in technology, aesthetics and user experience.

What we can glean from this is that designers and marketers are speaking fundamentally different languages or are, at the very least, interested in completely different things.

And before we can open the doors of communication, we have to better understand where designers are coming from.

Can’t get on the same page as your designer? You just need to speak their language.
Click To Tweet

The evolution of web design

In the webinar, Jen gave an overview of different eras of web design (1990 – present) to show how new technologies can shape forthcoming design trends.

Eras of Web Design
A timeline of the different “eras” in web design. Image source.

For example, the timeline above shows that what we consider the most crucial elements of modern web design didn’t start to emerge until around 1998. That’s the year that usability research came into prominence and people were given more insight than ever into the behavior of their users.

Additionally, the launch of the iPhone in 2007 — and the release of Android soon after — brought with it the mobile design revolution and a renewed focus on user experience.

Each design revolution was triggered by designers searching for more efficient and more enjoyable ways for users to interact with content.

But whereas this kind of user-centered design focuses solely on a user accomplishing their own goals, conversion-centered design is focused towards having the user complete a single business goal.

This can seem like a huge shift, but the goal is essentially the same: getting the user what they need with the least friction possible.

The difference is that conversion-centered design relies more heavily on the use of persuasion and reassurance; it’s not just about enabling the user to take action, but convincing them to.

User-centered design is about experience. Conversion-centered design is about business goals.
Click To Tweet

What your designer needs to know about CRO

While you and your designer might speak different languages, you’re both (ideally) interested in the same thing: producing a great design that works for both your business goals and the goals of your visitors.

But if you’re designer is relatively new to conversion rate optimization, there are a few things that you should make sure they understand.

#1: A homepage is NOT a landing page

Website indexes/homepages used to be referred to as landing pages — since they were the page one would “land on” when going to the site — but this definition is outdated, particularly since users don’t tend to land on those pages as often as they used to.

Nowadays, a landing page means a page dedicated to fulfilling a single campaign goal. This stands in stark contrast to index pages, which are meant to be generalist and to appeal to a wide range of visitors. Additionally, index pages tend to have an infinite amount of referral sources, whereas you probably have a strong idea of what’s driving traffic to your landing pages.

It’s important that your designer understands this so that they can make sure their design is focused on that single campaign goal, and doesn’t feature any content that could be irrelevant to the page’s audience.

#2: Design isn’t a cure-all

The fact is that design isn’t the primary factor of a page’s success; landing pages can be immensely successful even if they’re pretty ugly. Jen brought up the example of the Super Funnel page, the #2 top-selling page on affiliate-marketing site

Ugly Landing Page

This is both a blessing and a burden. The core of any landing page is its unique value proposition and it’s entirely possible for a landing page to succeed based on the strength of that alone.

But that doesn’t mean that good design isn’t valuable. It just means that a landing page is made up of various elements that all contribute to its success. A page that’s performing well could still perform better with a smarter design. As Jen puts it:

Your designer needs to understand that the success of the page doesn’t fall completely on their shoulders — that it is a combination of design, copy, traffic sources, the offer, etc. that play into the success or failure of the page.

#3: The story matters most

It’s critical for every designer (and marketer and copywriter) to understand the story of their brand and how customers interact with it, looking beyond the user’s “persona” or how they arrived at the page.

Which is exactly why the Eisenberg brothers — who, in Jen’s words, “have been doing CRO before the acronym existed” — pioneered their Buyer Legends philosophy.

Contrary to personas, which are primarily interested in defining who your customers are, buyer legends are more concerned with their journeys and how they feel. From the Buyer Legends website:

Buyer Legends are not the stories you tell your customers; that’s just promotion. Buyer Legends are stories told from the point of view of your customers; because your brand isn’t what you say it is but what your customers say it is.

You can get an introduction to the concept from Bryan Eisenberg’s CRO Day webinar, and then create your own Buyer Legends with the template than Jen has generously made available for anyone to use.

Opening the door to dialogue

When a designer gets a brief for a conversion-focused project like a landing page, they may be reluctant to raise their own objections or propose their own ideas, because they worry it’s not their place. As Jen put it:

“These people, they are the marketers, they think they know best, they see me as a designer, I should just do as they say.” That’s what some of your designers are thinking.

But designers have brought the web this far. While CRO may be a relatively new discipline, its ideas are borrowed heavily from the experience-focused trends of yore; they’ve just been shaken up with digital marketing trends and a dash of Big Data.

Designers have their own expertise to bring to your conversion-focused projects. But the door to collaboration needs to be opened wide, and explicitly so. You should actively solicit the feedback of your designers and encourage them to share their ideas. After all, everything can (and should) be tested!

And in addition to talking, you can also use Jen’s free tools in order to more effectively communicate with your designer. In addition to the Buyer Legends template discussed earlier, you’ll get:

  • An extremely detailed and annotated copywriting template that will make it way easier for designers, copywriters and marketers to work together and understand each other
  • A landing page wireframe template for use with Balsamiq Mockups, which will help your designer understand the structure of a strong landing page while giving them the freedom to actually design it
  • And as a bonus, two free Unbounce landing page templates that you can upload to your account

Get access to both the full webinar and Jen’s free tools here. Together, they will put you on the path to a more productive and communicative relationship with your designers.

3 Tools to Keep Your Designer From Killing Your Conversions

Read more:

Is Your Designer Killing Your Conversions?

5 Easy A/B Test Ideas To Get You Started on Conversion Rate Optimization

(This is a guest post authored by Philip Ryan from

Most websites don’t have a massive traffic problem, however every website in the world has a conversion problem. – Bryan Eisenberg

So you’ve just stepped into the world of Conversion Rate Optimization. Everyone seems to be advocating A/B testing. But you are still a little disoriented and would appreciate some direction to get started.

You are in the right place.

Internet is littered with posts that simply ask you to go ahead and test this CTA or that headline. It’s important to bear in mind that the best performing A/B tests are ones that are planned and executed well — using the scientific method.

Scientific Method


A/B testing comes at the experiment stage of the scientific method. Without such a process, testing becomes a spray-and-pray tactic that yields little dividend.

If you have ever burned your hands doing random tests, you should be reading this –The Complete Guide to A/B Testing.

Without further ado, here are 5 easy A/B test ideas to give you direction and a glimpse of the many possibilities.

Test #1: A/B Test Headline Copy

Let’s start off with this element (some say the most important) that you should consider testing. This should be your launching pad in the A/B testing realm, as headlines act as a doorway, a welcome mat, that all visitors must cross.

Only 2 out of 10 readers ever make it past the headline, on average. This means that 80% of readers never make it past the headline. If you suffer from lack of conversions on your homepage, it should be an indicator to test your headline. As the first message displayed to visitors, the headline holds the greatest (and easiest) opportunity to optimize your landing pages. The saying “you only have one chance to make a first impression” looms large over grabbing that first time visitor, and you only have a few milliseconds according to Carleton University, Canada, before the visitor moves on or bails.

For instance, a company called Monthly 1K wanted to increase the amount of visitors purchasing their online courses. They decided to test if they simply changed how the headline was presented, it would lead to better conversions. The original headline they presented was “How to Make a $1000 a Month Business”. The second headline excluded the dollar sign. The results were crystal clear, providing an actual dollar amount resulted in a higher conversion rate. Visitors were able to visualize themselves making a dollar amount rather than just the number value. Showcase the value of your products, that’s the only thing visitors will every pay for.

Here’s how VWO tested their homepage headline to increase click-throughs to the pricing page by 9.6%.

Test #2: A/B Test Your Colors

The color of your words, calls to action and the purchase buttons are examples of how simple changes can have a huge effect on conversion rates. Say, you have a scenario where your call to action prompts visitors to click through to a “make an appointment” form. You test your calls to actions with a red button in the control version and a green button in the variation. You discover that more visitors were clicking through to the appointment form with the green CTA. By changing your CTA to green your appointment bookings surge. Changing your CTA to a different color won’t work in every situation, but since you’re testing it with your live visitors, you can see firsthand what makes them click.

Take a look at the case study below on how a color change can have a positive effect on conversion rate. Here the color change was done in conjunction with a button design change. The combination of the two led to a nice conversion increase. This particular online seller realized a gain of over 35% in cart additions.

Color Test Image


Test #3: A/B Test Call to Action

This is where all the magic happens. You’ve gotten visitors to this point. You want them to click and your team have come up with 12 different CTA buttons with different combinations of wording, colors and fonts.

Sometimes, all those things do not play much of a role. Often, it’s just the wording on a call to action, not a time-consuming redesign or color change. A key takeaway from the example below is offering the user value. You are offering them something in return for a click on the button.

Call To Action Test


Your landing pages should inspire users to take action, whether it be signing up for your blog, booking an appointment, downloading content or buying a product. There are a number of sub-elements you should take into consideration when testing variations of your CTA.

  • Switch the wording on your CTA button to one that you feel would grab your target. Just one phrase often does the trick and translates to higher conversion. Buy, Click to Purchase, Checkout are just a few.
  • Test a page with a few CTAs against a variation with a single button.
  • Consider switching the location of the CTA on your landing page.

One of VWO’s clients A/B tested the copy on their CTA button from “Go Further” to “More Information” and obtained a 14.41% increase in click-throughs to the sign-up page. Read about it here.

Test #4: A/B Test The Form

Your website might be a five pager or it could be 20 plus. The more entry points your website has the more chance for friction with the visitor. Forms are just such examples for potential friction. Anytime you request visitor-information, just know that the lesser amount you request the better, the simpler the content and image the better.  How you ask it can also make a huge difference.

A site called Huffduffer tested our two different types of form styles. They defeated conventional wisdom and found out that a paragraph-styled form with inline input fields worked much better than a traditional form layout. This type of form style is called “Mad Libs“, and it ultimately increased their conversion rate by 25-40%. This may not work for everyone, so before adopting this or any other fad (or good suggestion, for that matter): do your own form A/B tests.

Form A/B Test

There are plenty of variables to try out. Here are some format ideas to get you started:

  • Test forms with images/video on them versus none.
  • Test 5 field forms against 3 field forms
  • Test a form that includes a special offer or discount to one that does not
  • Test a form with an assurance that the signer will not receive spam or other messages unless they opt in
  • Test a form with larger fields rather than letter sized fields

Test #5: Social Widgets A/B Testing

While Social proof is a big part of increasing user confidence, it can also have a negative effect. Let’s take a look at why:

  • Social sharing buttons are a distraction as they take away from the true call to action
  • Many times, the social numbers are so minute that it actually diminishes social proof

For example, did you know that the addition of social sharing buttons can even actually lead to a decrease in conversions. There are a number of reasons for this. To highlight this fact, I suggest reading this great post highlighting a case study on how one eCommerce site increased their conversions by removing social sharing buttons.

However, each case differs and sometimes social widgets will increase the conversions on your page. Marcus Taylor of Venture Harbour, found that a floating sidebar outperforms share buttons located above or below a blog post. He ran this experiment on this blog post and found that using a floating sidebar with sharing buttons increased the rate of sharing by 52%. The moral of the story is not to follow random suggestions on the best placement for your social sharing buttons. By adding and removing the widgets and testing those versions you’ll be able to decide the better option always.

Social Widget A/B Test


Testing all these elements to determine which one converts better on your landing page is a learning experience. Tracking email click-through rates may prove to show you which headlines work better. Twitter is also a great way to gauge headline effectiveness.

Go ahead and do your first A/B test. Conduct tests with your users in mind and with a definite idea of what you are trying to accomplish.

Let us know how it goes. We are always here to help :)

The post 5 Easy A/B Test Ideas To Get You Started on Conversion Rate Optimization appeared first on VWO Blog.

This article – 

5 Easy A/B Test Ideas To Get You Started on Conversion Rate Optimization

9 Ecommerce Strategies to Optimize Sales

Let’s face it: Website visitors can be skittish.

If you can convert them into paying customers, you can generate more sales without ever having to change a price. But for that to happen, you need to clear the path to purchase.

Now it’s imperative that you get your homepage and site structure down cold.

You’ll want to advertise through paid search campaigns, display advertising or social media ads. But if your site design isn’t optimized for conversions, you won’t get a return on that investment.

Fortunately, there are many ways to encourage your visitors to take action by using simple (and proven) ecommerce techniques.

Here are 9 top tips for encouraging users to take that next step.

Conversion Tip #1: Free Shipping

The most common reason visitors abandon a purchase is shipping cost. Your solution? Offer your customers free shipping, and clearly state that benefit on your site.

  • 39% of customers would purchase enough to get free shipping.

In addition, a study by Compete states that:

  • 93% of online buyers would be encouraged to buy more products if free shipping were offered.

By offering free shipping, you can increase conversions as well as the size of your orders. Check out this article from Web Marketing Today for some great advice on how you can offer free shipping to your customers.

 free shipping

Conversion Tip #2: Show Discounts and Specials Clearly

Discounts and coupons are powerful marketing tools that allow you to:

  • give your clients special offers on products or categories
  • let wholesalers purchase at special rates
  • provide incentives through your offline advertising
  • help clear “difficult to sell” stock amongst many other uses

In the Oneupweb consumer study, 95.5% of respondents cited clearly stated pricing and shipping information as an influential factor in making a purchase decision. Don’t be a victim!

Make sure a product’s price is clearly stated, whether on your homepage or on the product page itself.

If at all possible, try to calculate taxes and shipping when products are added to the cart so your shoppers know the final price before they ever get to checkout.


Conversion Tip #3: Referral Discounts

Test #1

Optimizely tested a call to action (CTA) for an outdoor gear retailer’s refer-a-friend program and found that active outdoor enthusiasts are significantly more motivated by “Earn Rewards” than “Get Rewards.”

In the case above, “Earn $25. Invite Friends,” increased program engagement from the baseline, “Invite a Friend. Get $25,” by 60%.


The lesson? Offer referral discounts, and while you’re at it, test different ways of presenting the offer. They work, obviously, but they can still be optimized.

Test #2

Or take a tip from Airbnb and offer a product credit in return for referrals.


The new program encourages users to invite their friends by offering them cash credits to be used towards future Airbnb bookings.

According to Courtney Boyd Myers, writing for thenextweb, Airbnb got good results from the program.

Airbnb first tested the new referral program in a hugely successful closed-beta program of 2,161 existing members, which brought in 2,107 new members, nearly a 1:1 ratio of community goodness.

Conversion Tip #4: Add Reviews and Ratings

Figleaves ran an experiment to see how product reviews and ratings affected conversion rates. They found that products with reviews had a 12.5% higher conversion rate than products without reviews.

More importantly, the conversion rate for the same product—after adding reviews—was 35.27% higher than it was before adding reviews.

They also found that the number of reviews mattered a lot. Products with 20 or more reviews had a whopping 83.85% higher conversion rate than those without.


Conversion Tip #5:  Take Your Email Marketing Beyond the Inbox

Over the next few years, we’re likely to see a lot more ecommerce companies combining their email marketing campaigns with related social advertising.

In a study where a leading retailer in the US targeted 925,000 email subscribers with both its regular emails and coordinated Facebook ads, subscribers who received both ads were 22% more likely to make purchases than those who only received emails.

The potential of what you could do with this strategy is mind-boggling.

Imagine a customer purchasing a product online, then finding an advert on Facebook five minutes later with a popular upsell product. If they don’t buy the upsell, you could then send them an email with a discount on that specific upsell product.

Wishpond has written about how to set up these kind of adverts, along with strategic ideas to experiment with in this post.


Conversion Tip #6: Use videos to draw attention to your company’s website

Using video in the right way will have a direct effect on user engagement.

Short explainer videos are an excellent way to help visitors quickly understand your company, your products, and your services.

Visually showing your product in action gives visitors a better understanding of how your product works.

That helps soon-to-be customers get more comfortable with making a purchase, thereby boosting both your revenue and your conversion rate.

In fact recently added an explainer video to its homepage and increased conversion rates by 20%. Approximately 30% of visitors watch the video and approximately 50% of those viewers watch the video in its entirety.


Conversion Tip #7: Add Live Chat to your Conversion Rate Optimization toolkit

Live chat has the potential to close the gap between the online shoppers and retailers. You have the chance to connect with your potential customers and build their trust.

Recent studies have shown that 68.5% of CompUSA customers used live chat while browsing the website:

  • 32% percent of them used live chat during the final phases of the buying process.
  • And out of the 32%, 10% percent converted into a sale. At this point, it is still relatively early in live chat implementation; however 28% of e-commerce websites now offer live chat.

Young helpdesk operators

Conversion Tip #8: Security Badges can Increase your Conversion Rate

With the rise of ecommerce, the need for trust signals has become critical. Many “trust badges” are associated with SSL, or secure sockets layer, and they

Case Studies: There are a number of case studies highlighting the benefits of adding Norton Secured (VeriSign), AllClear and McAfee Secure.

Blue Fountain Media saw a 42% increase in sales.

VeriSign prepared a case study showing a 30% increase in conversions for Central Reservation Service, an online hotel booking site.


Conversion Tip #9: Increase Urgency

There’s a reason why urgency is last in this list. All the points above must be in place before urgency will work.

Adding urgency doesn’t work if your offer is full of distractions, or if your value proposition is crap. It won’t work if your offer’s irrelevant to your audience, or if your audience doesn’t trust you.

Urgency is a strong catalyst, but it doesn’t stand up very well on its own.
After doing everything mentioned above, here’s how urgency skyrocketed one campaign’s conversion rate.

Below are two variations that I tested on the offer’s landing page. As you’ll notice, the only difference is that one communicates urgency and how many packages have been bought, where the other does not.

Variation A:


Variation B:


This is one of the most impactful A/B test I’ve ever run. The conversion rate of variation B was almost 3x that of variation A.

Here’s what happened to our conversion rate as we gradually rolled out variation B to all users. Our conversion rate went from ~3.5% to ~10%.


Since running this campaign two years ago, I’ve become fascinated by the power of urgency, and I’ve found multiple ways to integrate it into my strategy—boosting blog traffic, online sales, and engagement.


By implementing each of the tips above, not only will you see an increase in sales, conversions, revenue, and profit, you’ll build a reputable brand for your products and services.

Whether you’re offering free shipping or discounts, adding reviews or adding a security badge, you’ll see more consistent profit levels—which will allow you to continue to scale and grow your business.

Does a particular ecommerce experience stand out for you? If you’ve had a smooth, hassle-free experience that made you want to order again, I’d love to hear about it. Please tell us about your experience in the comments.

Read other Crazy Egg posts by Chawki Trabelsi.

View the original here: 

9 Ecommerce Strategies to Optimize Sales

How To Use Autoloading And A Plugin Container In WordPress Plugins

Building and maintaining1 a WordPress plugin can be a daunting task. The bigger the codebase, the harder it is to keep track of all the working parts and their relationship to one another. And you can add to that the limitations imposed by working in an antiquated version of PHP, 5.2.

In this article we will explore an alternative way of developing WordPress plugins, using the lessons learned from the greater PHP community, the world outside WordPress. We will walk through the steps of creating a plugin and investigate the use of autoloading and a plugin container.

Let’s Begin

The first thing you need to do when creating a plugin is to give it a unique name. The name is important as it will be the basis for all our unique identifiers (function prefix, class prefix, textdomain, option prefix, etc.). The name should also be unique across the space. It won’t hurt if we make the name catchy. For our sample plugin I chose the name Simplarity, a play on the words “simple” and “clarity”.

We’ll assume you have a working WordPress installation already.

Folder Structure

First, create a directory named simplarity inside wp-content/plugins. Inside it create the following structure:

  • simplarity.php: our main plugin file
  • css/: directory containing our styles
  • js/: directory containing JavaScript files
  • languages/: directory that will contain translation files
  • src/: directory containing our classes
  • views/: directory that will contain our plugin view files

The Main Plugin File

Open the main plugin file, simplarity.php, and add the plugin information header:

Plugin Name: Simplarity
Description: A plugin for
Version: 1.0.0
License: GPL-2.0+

This information is enough for now. The plugin name, description, and version will show up in the plugins area of WordPress admin. The license details are important to let your users know that this is an open source plugin. A full list of header information can found in the WordPress codex2.


Autoloading allows you to automatically load classes using an autoloader so you don’t have to manually include the files containing the class definitions. For example, whenever you need to use a class, you need to do the following:

require_once '/path/to/classes/class-container.php';
require_once '/path/to/classes/class-view.php';
require_once '/path/to/classes/class-settings-page.php';

$plugin = new Container();
$view = new View();
$settings_page = new SettingsPage();

With autoloading, you can use an autoloader instead of multiple require_once3 statements. It also eliminates the need to update these require statements whenever you add, rename, or change the location of your classes. That’s a big plus for maintainability.

Adopting The PEAR Naming Convention For Class Names

Before we create our autoloader we need to create a convention for our class names and their location in the file system. This will aid the autoloader in mapping out the class to its source file.

For our class names we will adopt the PEAR naming convention4. The gist is that class names are alphabetic characters in StudlyCaps. Each level of the hierarchy is separated with a single underscore. Class names will directly map to the directories in which they are stored.

It’s easier to illustrate it using examples:

  • A class named Simplarity_Plugin would be defined in the file src/Simplarity/Plugin.php.
  • A class named Simplarity_SettingsPage would be defined in src/Simplarity/SettingsPage.php.

As you can see with this convention, the autoloader will just replace the underscores with directory separators to locate the class definition.

What About The WordPress Coding Standards For Class Names?

As you might be aware, WordPress has its own naming convention5 for class names. It states:

Class names should use capitalized words separated by underscores. Any acronyms should be all upper case. […] Class file names should be based on the class name with class- prepended and the underscores in the class name replaced with hyphens, for example WP_Error becomes class-wp-error.php

I know that we should follow the standards of the platform that we are developing on. However, we suggest using the PEAR naming convention because:

  • WP coding standards do not cover autoloading.
  • WP does not follow its own coding standards. Examples: class.wp-scripts.php and SimplePie. This is understandable since WordPress grew organically.
  • Interoperability allows you to easily use third-party libraries that follow the PEAR naming convention, like Twig. And conversely, you can easily port your code to other libraries sharing the same convention.
  • It’s important your autoloader is future-ready. When WordPress decides to up the ante and finally move to PHP 5.3 as its minimum requirement, you can easily update the code to be PSR-0 or PSR-4-compatible and take advantage of the built-in namespaces instead of using prefixes. This is a big plus for interoperability.

Note that we are only using this naming convention for classes. The rest of our code will still follow the WordPress coding standards. It’s important to follow and respect the standards of the platform that we are developing on.

Now that we have fully covered the naming convention, we can finally build our autoloader.

Building Our Autoloader

Open our main plugin file and add the following code below the plugin information header:

spl_autoload_register( 'simplarity_autoloader' );
function simplarity_autoloader( $class_name ) 
  if ( false !== strpos( $class_name, 'Simplarity' ) ) 
    $classes_dir = realpath( plugin_dir_path( __FILE__ ) ) . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR;
    $class_file = str_replace( '_', DIRECTORY_SEPARATOR, $class_name ) . '.php';
    require_once $classes_dir . $class_file;

At the heart of our autoloading mechanism is PHP’s built in spl_autoload_register6 function. All it does is register a function to be called automatically when your code references a class that hasn’t been loaded yet.

The first line tells spl_autoload_register to register our function named simplarity_autoloader:

spl_autoload_register( 'simplarity_autoloader' );

Next we define the simplarity_autoloader function:

function simplarity_autoloader( $class_name ) 

Notice that it accepts a $class_name parameter. This parameter holds the class name. For example when you instantiate a class using $plugin = new Simplarity_Plugin(), $class_name will contain the string “Simplarity_Plugin”. Since we are adding this function in the global space, it’s important that we have it prefixed with simplarity_.

The next line checks if $classname contains the string “Simplarity” which is our top level namespace:

if ( false !== strpos( $class_name, 'Simplarity' ) ) 

This will ensure that the autoloader will only run on our classes. Without this check, our autoloader will run every time an unloaded class is referenced, even if the class is not ours, which is not ideal.

The next line constructs the path to the directory where our classes reside:

$classes_dir = realpath( plugin_dir_path( __FILE__ ) ) . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR;

It uses WP’s plugin_dir_path7 to get the plugin root directory. __FILE__ is a magic constant8 that contains the full path and filename of the current file. DIRECTORY_SEPARATOR is a predefined constant that contains either a forward slash or backslash depending on the OS your web server is on. We also use realpath9 to normalize the file path.

This line resolves the path to the class definition file:

$class_file = str_replace( '_', DIRECTORY_SEPARATOR, $class_name ) . '.php';

It replaces the underscore (_) in $class_name with the directory separator and appends .php.

Finally, this line builds the file path to the definition and includes the file using require_once:

require_once $classes_dir . $class_file;

That’s it! You now have an autoloader. Say goodbye to long lines of require_once statements.

Plugin Container

A plugin container is a special class that holds together our plugin code. It simplifies the interaction between the many working parts of your code by providing a centralized location to manage the configuration and objects.

Uses Of Our Plugin Container

Here are the things we can expect from the plugin container:

  • Store global parameters in a single location

    Often you’ll find this code in plugins:

    define( 'SIMPLARITY_VERSION', '1.0.0' );
    define( 'SIMPLARITY_PATH', realpath( plugin_dir_path( __FILE__ ) ) . DIRECTORY_SEPARATOR );
    define( 'SIMPLARITY_URL', plugin_dir_url( __FILE__ ) );

    Instead of doing that, we could do this instead:

    $plugin = new Simplarity_Plugin();
    $plugin['version] = '1.0.0';
    $plugin['path'] = realpath( plugin_dir_path( __FILE__ ) ) . DIRECTORY_SEPARATOR;
    $plugin['url'] = plugin_dir_url( __FILE__ );

    This has the added benefit of not polluting the global namespace with our plugin’s constants, which in most cases aren’t needed by other plugins.

  • Store objects in a single location

    Instead of scattering our class instantiations everywhere in our codebase we can just do this in a single location:

    $plugin = new Simplarity_Plugin();
    $plugin['scripts'] = new Simplarity_Scripts(); // A class that loads javascript files
  • Service definitions

    This is the most powerful feature of the container. A service is an object that does something as part of a larger system. Services are defined by functions that return an instance of an object. Almost any global object can be a service.

    $plugin['settings_page'] = function ( $plugin ) 
      return new SettingsPage( $plugin['settings_page_properties'] );

    Services result in lazy initialization whereby objects are only instantiated and initialized when needed.

    It also allows us to easily implement a self-resolving dependency injection design. An example:

    $plugin = new Plugin();
    $plugin['door_width'] = 100;
    $plugin['door_height'] = 500;
    $plugin['door_size'] = function ( $plugin ) 
      return new DoorSize( $plugin['door_width'], $plugin['door_height'] );
    $plugin['door'] = function ( $plugin ) 
      return new Door( $plugin['door_size'] );
    $plugin['window'] = function ( $plugin ) 
      return new Window();
    $plugin['house'] = function ( $plugin ) 
      return new House( $plugin['door'], $plugin['window'] );
    $house = $plugin['house'];

    This is roughly equivalent to:

    $door_width = 100;
    $door_height = 500;
    $door_size = new DoorSize( $door_width, $door_height );
    $door = new Door( $door_size );
    $window = new Window();
    $house = new House( $door, $window );

    Whenever we get an object, as in $house = $plugin['house']; , the object is created (lazy initialization) and dependencies are resolved automatically.

Building The Plugin Container

Let’s start by creating the plugin container class. We will name it “Simplarity_Plugin”. As our naming convention dictates, we should create a corresponding file: src/Simplarity/Plugin.php.

Open Plugin.php and add the following code:

class Simplarity_Plugin implements ArrayAccess 
  protected $contents;
  public function __construct() 
    $this->contents = array();
  public function offsetSet( $offset, $value ) 
    $this->contents[$offset] = $value;

  public function offsetExists($offset) 
    return isset( $this->contents[$offset] );

  public function offsetUnset($offset) 
    unset( $this->contents[$offset] );

  public function offsetGet($offset) 
    if( is_callable($this->contents[$offset]) )
      return call_user_func( $this->contents[$offset], $this );
    return isset( $this->contents[$offset] ) ? $this->contents[$offset] : null;
  public function run() 
    foreach( $this->contents as $key => $content ) // Loop on contents
      if( is_callable($content) )
        $content = $this[$key];
      if( is_object( $content ) )
        $reflection = new ReflectionClass( $content );
        if( $reflection->hasMethod( 'run' ) )
          $content->run(); // Call run method on object

The class implements the ArrayAccess interface:

class Simplarity_Plugin implements ArrayAccess 

This allows us to use it like PHP’s array:

$plugin = new Simplarity_Plugin();
$plugin['version'] = '1.0.0'; // Simplicity is beauty

The functions offsetSet, offsetExists, offsetUnset and offsetGet are required by ArrayAccess to be implemented. The run function will loop through the contents of the container and run the runnable objects.

To better illustrate our plugin container, let’s start by building a sample plugin.

Example Plugin: A Settings Page

This plugin will add a settings page named “Simplarity” under WordPress Admin → Settings.

Let’s go back to the main plugin file. Open up simplarity.php and add the following code. Add this below the autoloader code:

add_action( 'plugins_loaded', 'simplarity_init' ); // Hook initialization function
function simplarity_init() 
  $plugin = new Simplarity_Plugin(); // Create container
  $plugin['path'] = realpath( plugin_dir_path( __FILE__ ) ) . DIRECTORY_SEPARATOR;
  $plugin['url'] = plugin_dir_url( __FILE__ );
  $plugin['version'] = '1.0.0';
  $plugin['settings_page_properties'] = array( 
    'parent_slug' => 'options-general.php',
    'page_title' =>  'Simplarity',
    'menu_title' =>  'Simplarity',
    'capability' => 'manage_options',
    'menu_slug' => 'simplarity-settings',
    'option_group' => 'simplarity_option_group',
    'option_name' => 'simplarity_option_name'
  $plugin['settings_page'] = new Simplarity_SettingsPage( $plugin['settings_page_properties'] );

Here we use WP’s add_action to hook our function simplarity_init into plugins_loaded:

add_action( 'plugins_loaded', 'simplarity_init' );

This is important as this will make our plugin overridable by using remove_action. An example use case would be a premium plugin overriding the free version.

Function simplarity_init contains our plugin’s initialization code. At the start, we simply instantiate our plugin container:

$plugin = new Simplarity_Plugin();

These lines assign global configuration data:

$plugin['path'] = realpath( plugin_dir_path( __FILE__ ) ) . DIRECTORY_SEPARATOR;
$plugin['url'] = plugin_dir_url( __FILE__ );
$plugin['version'] = '1.0.0';

The plugin path contains the full path to our plugin, the url contains the URL to our plugin directory. They will come in handy whenever we need to include files and assets. version contains the current version of the plugin that should match the one in the header info. Useful whenever you need to use the version in code.

This next code assigns various configuration data to settings_page_properties:

$plugin['settings_page_properties'] = array(
  'parent_slug' => 'options-general.php',
  'page_title' =>  'Simplarity',
  'menu_title' =>  'Simplarity',
  'capability' => 'manage_options',
  'menu_slug' => 'simplarity-settings',
  'option_group' => 'simplarity_option_group',
  'option_name' => 'simplarity_option_name'

These configuration data are related to WP settings API10.

This next code instantiates the settings page, passing along settings_page_properties:

$plugin['settings_page'] = new Simplarity_SettingsPage( $plugin['settings_page_properties'] );

The run method is where the fun starts:


It will call Simplarity_SettingsPage‘s own run method.

The Simplarity_SettingsPage Class

Now we need to create the Simplarity_SettingsPage class. It’s a class that groups together the settings API functions.

Create a file named SettingsPage.php in src/Simplarity/. Open it and add the following code:

class Simplarity_SettingsPage 
  protected $settings_page_properties;

  public function __construct( $settings_page_properties )
    $this->settings_page_properties = $settings_page_properties;

  public function run() 
    add_action( 'admin_menu', array( $this, 'add_menu_and_page' ) );
    add_action( 'admin_init', array( $this, 'register_settings' ) );

  public function add_menu_and_page()  

      array( $this, 'render_settings_page' )
  public function register_settings()  
  public function get_settings_data()
    return get_option( $this->settings_page_properties['option_name'], $this->get_default_settings_data() );
  public function render_settings_page() 
    $option_name = $this->settings_page_properties['option_name'];
    $option_group = $this->settings_page_properties['option_group'];
    $settings_data = $this->get_settings_data();
    <div class="wrap">
      <p>This plugin is using the settings API.</p>
      <form method="post" action="options.php">
        settings_fields( $this->plugin['settings_page_properties']['option_group']);
        <table class="form-table">
              <th><label for="textbox">Textbox:</label></th>
                <input type="text" id="textbox"
                  name="<?php echo esc_attr( $option_name."[textbox]" ); ?>"
                  value="<?php echo esc_attr( $settings_data['textbox'] ); ?>" />
        <input type="submit" name="submit" id="submit" class="button button-primary" value="Save Options">
  public function get_default_settings_data() 
    $defaults = array();
    $defaults['textbox'] = '';
    return $defaults;

The class property $settings_page_properties stores the settings related to WP settings API:

class Simplarity_SettingsPage 
  protected $settings_page_properties;

The constructor function accepts the settings_page_properties and stores it:

public function __construct( $settings_page_properties )
  $this->settings_page_properties = $settings_page_properties;

The values are passed from this line in the main plugin file:

$plugin['settings_page'] = new Simplarity_SettingsPage( $plugin['settings_page_properties'] );

The run function is use to run startup code:

public function run() 
  add_action( 'admin_menu', array( $this, 'add_menu_and_page' ) );
  add_action( 'admin_init', array( $this, 'register_settings' ) );

The most likely candidate for startup code are filters11 and action hooks12. Here we add the action hooks related to our settings page.
Do not confuse this run method with the run method of the plugin container. This run method belongs to the settings page class.

This line hooks the add_menu_and_page function on to the admin_menu action:

add_action( 'admin_menu', array( $this, 'add_menu_and_page' ) );

Function add_submenu_page in turn calls WP’s add_submenu_page13 function to add a link under the WP Admin → Settings:

public function add_menu_and_page()  

    array( $this, 'render_settings_page' )

As you can see, we are pulling the info from our class property $settings_page_properties which we specified in the main plugin file.

The parameters for add_submenu_page are:

  • parent_slug: slug name for the parent menu
  • page_title: text to be displayed in the <title> element of the page when the menu is selected
  • menu_title: text to be used for the menu
  • capability: the capability required for this menu to be displayed to the user
  • menu_slug: slug name to refer to this menu by (should be unique for this menu)
  • function: function to be called to output the content for this page

This line hooks the register_settings function on to the admin_init action:

add_action( 'admin_init', array( $this, 'register_settings' ) );

array( $this, 'register_settings' ) means to call register_settings on $this, which points to our SettingsPage instance.

The register_settings then calls WP’s register_setting to register a setting:

public function register_settings()  


Function render_settings_page is responsible for rendering the page:

public function render_settings_page() 
  $option_name = $this->settings_page_properties['option_name'];
  $option_group = $this->settings_page_properties['option_group'];
  $settings_data = $this->get_settings_data();
  <div class="wrap">
    <p>This plugin is using the settings API.</p>
    <form method="post" action="options.php">
      settings_fields( $option_group );
      <table class="form-table">
          <th><label for="textbox">Textbox:</label></th>
            <input type="text" id="textbox"
              name="<?php echo esc_attr( $option_name."[textbox]" ); ?>"
              value="<?php echo esc_attr( $settings_data['textbox'] ); ?>" />
      <input type="submit" name="submit" id="submit" class="button button-primary" value="Save Options">

We hooked render_settings_page earlier using add_submenu_page.

Function get_settings_data is a wrapper function for get_option:

public function get_settings_data()
    return get_option( $this->plugin['settings_page_properties']['option_name'] );

This is to easily get the settings data with a single function call.

Function get_default_settings_data is use to supply us with our own default values:

public function get_default_settings_data() 
  $defaults = array();
  $defaults['textbox'] = '';
  return $defaults;

Abstracting Our Settings Page Class

Right now our settings page class cannot be reused if you want to create another subpage. Let’s move the reusable code for the settings page to another class.

Let’s call this class Simplarity_WpSubPage. Go ahead and create the file src/Simplarity/WpSubPage.php.

Now add the code below:

abstract class Simplarity_WpSubPage 
  protected $settings_page_properties;
  public function __construct( $settings_page_properties )
    $this->settings_page_properties = $settings_page_properties;
  public function run() 
    add_action( 'admin_menu', array( $this, 'add_menu_and_page' ) );
    add_action( 'admin_init', array( $this, 'register_settings' ) );
  public function add_menu_and_page()  

        array( $this, 'render_settings_page' )
  public function register_settings()  
  public function get_settings_data()
    return get_option( $this->settings_page_properties['option_name'], $this->get_default_settings_data() );
  public function render_settings_page()
  public function get_default_settings_data() 
    $defaults = array();
    return $defaults;

Notice that it is an abstract class. This will prevent intantiating this class directly. To use it you need to extend it first with another class, which in our case is Simplarity_SettingsPage:

class Simplarity_SettingsPage extends Simplarity_WpSubPage 
  public function render_settings_page() 
    $option_name = $this->settings_page_properties['option_name'];
    $option_group = $this->settings_page_properties['option_group'];
    $settings_data = $this->get_settings_data();
    <div class="wrap">
      <p>This plugin is using the settings API.</p>
      <form method="post" action="options.php">
        settings_fields( $option_group );
        <table class="form-table">
              <th><label for="textbox">Textbox:</label></th>
                  <input type="text" id="textbox"
                      name="<?php echo esc_attr( $option_name."[textbox]" ); ?>"
                      value="<?php echo esc_attr( $settings_data['textbox'] ); ?>" />
        <input type="submit" name="submit" id="submit" class="button button-primary" value="Save Options">
  public function get_default_settings_data() 
    $defaults = array();
    defaults['textbox'] = '';
    return $defaults;

The only functions we have implemented are render_settings_page and get_default_settings_data, which are customized to this settings page.

To create another WP settings page you’ll just need to create a class and extend the Simplarity_WpSubPage. And implement your own render_settings_page and get_default_settings_data.

Defining A Service

The power of the plugin container is in defining services. A service is a function that contains instantiation and initialization code that will return an object. Whenever we pull a service from our container, the service function is called and will create the object for you. The object is only created when needed. This is called lazy initialization.

To better illustrate this, let’s define a service for our settings page.

Open simplarity.php and add this function below the Simplarity code:

function simplarity_service_settings( $plugin )
  $object = new Simplarity_SettingsPage( $plugin['settings_page_properties'] );
  return $object;

Notice that our service function has a $plugin parameter which contains our plugin container. This allows us to access all configuration, objects, and services that have been stored in our plugin container. We can see that the Simplarity_SettingsPage has a dependency on $plugin['settings_page_properties']. We inject this dependency to Simplarity_SettingsPage here. This is an example of dependency injection. Dependency injection is a practice where objects are designed in a manner where they receive instances of the objects from other pieces of code, instead of constructing them internally. This improves decoupling of code.

Now let’s replace this line in simplarity_init:

$plugin['settings_page'] = new Simplarity_SettingsPage( $plugin['settings_page_properties'] );

with a service definition assignment:

$plugin['settings_page'] = 'simplarity_service_settings'

So instead of assigning our object instance directly, we assign the name of our function as string. Our container handles the rest.

Defining A Shared Service

Right now, every time we get $plugin['settings_page'], a new instance of Simplarity_SettingsPage is returned. Ideally, Simplarity_SettingsPage should only be instantiated once as we are using WP hooks, which in turn should only be registered once.

To solve this we use a shared service. A shared service will return a new instance of an object on first call, on succeeding calls it will return the same instance.

Let’s create a shared service using a static variable:

function simplarity_service_settings( $plugin )
  static $object;

  if (null !== $object) 
    return $object;
  $object = new Simplarity_SettingsPage( $plugin['settings_page_properties'] );
  return $object;

On first call, $object is null, and on succeeding calls it will contain the instance of the object created on first call. Notice that we are using a static variable. A static variable exists only in a local function scope, but it does not lose its value when program execution leaves this scope.

That’s it.

Now if you activate the plugin, an admin menu will appear in Admin → Settings named “Simplarity”. Click on it and you will be taken to the settings page we have created.

Settings Page In Action14
Settings Page In Action

The Future: PHP 5.3+

Earlier we mentioned that our class naming convention was future-ready. In this section we will discuss how our codebase will work in PHP version 5.3 and up. Two of the best features that have graced the PHP world are namespaces and anonymous functions.


PHP does not allow two classes or functions to share the same name. When this happens, a name collision occurs and causes a nasty error.

With namespaces you can have the same class names as long as they live in their own namespace. A good analogy for namespaces are the folders you have in your OS. You cannot have files with the same name in one folder. However, you can have the same filenames in different folders.

With namespaces, class and function names won’t need unique prefixes anymore.

Anonymous Functions

Anonymous functions, also known as closures, allow the creation of functions which have no specified name. They are most useful as the value of callback parameters, but they have many other uses. You can also store closures in variables.

Here’s an example of closure:

$greet = function($name) 
  printf("Hello %srn", $name);


Using Namespaces In Classes

Let’s go ahead and use namespaces in our class definitions. Open up the following files in src/Simplarity:

  • Plugin.php
  • SettingsPage.php
  • WpSubPage.php

In each of these files, add a namespace declaration on top and remove the “Simplarity_” prefix on class names:

// Plugin.php
namespace Simplarity;

class Plugin 

// SettingsPage.php
namespace Simplarity;

class SettingsPage extends WpSubPage 

// WpSubPage.php
namespace Simplarity;

abstract class WpSubPage 

Since we have updated our class names we also need to update our class instantiations in simplarity.php. We do this by deleting the prefixes:

function simplarity_init() 
  $plugin = new Plugin();

function simplarity_service_settings( $plugin )

  $object = new SettingsPage( $plugin['settings_page_properties'] );
  return $object;

By default, PHP will try to load the class from the root namespace so we need to tell it about our namespaced classes. We add this to the top of simplarity.php just above the autoloader code:

use SimplarityPlugin;
use SimplaritySettingsPage;

This is called importing/aliasing with the use operator15.

Updating The Autoloader

Open up simplarity.php and change this line in the autoloader from:

$class_file = str_replace( '_', DIRECTORY_SEPARATOR, $class_name ) . '.php';


$class_file = str_replace( '\', DIRECTORY_SEPARATOR, $class_name ) . '.php';

Remember that in 5.2 code we are using underscores as hierarchy separators. For 5.3+ we are using namespaces which use backslash “” as hierarchy separators. Thus we simply swap “_” for “”. We use another backslash to escape the original one: “\”.

Updating Our Service Definitions To Use Anonymous Functions

We can now replace the global functions we created for our service definitions with anonymous functions. So instead of doing this:

function simplarity_init() 
  $plugin['settings_page'] = 'simplarity_service_settings';

function simplarity_service_settings( $plugin )
  static $object;

  if (null !== $object) 
    return $object;
  $object = new Simplarity_SettingsPage( $plugin['settings_page_properties'] );
  return $object;

we can just replace this with an inline anonymous function:

function simplarity_init() 
  $plugin = new Plugin();
  $plugin['settings_page'] = function ( $plugin ) 
    static $object;
    if (null !== $object) 
      return $object;
    return new SettingsPage( $plugin['settings_page_properties'] );

Using Pimple As A Plugin Container

Pimple is a small dependency injection (DI) container for PHP 5.3+. Pimple has the same syntax as our simple plugin container. In fact our plugin container was inspired by Pimple. In this part, we will extend Pimple and use it.

Download Pimple container from GitHub16 and save it in src/Simplarity/Pimple.php.

Open up Pimple.php and replace the namespace and the classname to:

namespace Simplarity;

 * Container main class.
 * @author  Fabien Potencier
class Pimple implements ArrayAccess

Open up Plugin.php and replace all the code with:

namespace Simplarity;

class Plugin extends Pimple 
  public function run() 
    foreach( $this->values as $key => $content ) // Loop on contents
      $content = $this[$key];
      if( is_object( $content ) )
        $reflection = new ReflectionClass( $content );
        if( $reflection->hasMethod( 'run' ) )
            $content->run(); // Call run method on object

Now let’s change the service definition in simplarity.php to:

$plugin['settings_page'] = function ( $plugin ) 
  return new SettingsPage( $plugin['settings_page_properties'] );

By default, each time you get a service, Pimple returns the same instance of it. If you want a different instance to be returned for all calls, wrap your anonymous function with the factory() method:

$plugin['image_resizer'] = $plugin->factory(function ( $plugin ) 
  return new ImageResizer( $plugin['image_dir'] );


The PHP community is big. A lot of best practices have been learned over the years. It’s good to always look beyond the walled garden of WordPress to look for answers. With autoloading and a plugin container we are one step closer to better code.

Code Samples


(dp, og, il)


  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21

The post How To Use Autoloading And A Plugin Container In WordPress Plugins appeared first on Smashing Magazine.


How To Use Autoloading And A Plugin Container In WordPress Plugins

The A/B and Cs of Email Campaign Testing

The foundation of conversion rate optimization is testing…

Testing your offers.

Testing your messaging.

Testing your web pages and other touch points.

Today, we look at how you can test your email campaigns, with an infographic, courtesy of EmailMonks, that walks you through the process.

But first, secure your seat in our webinar today, featuring Conversion Sciences’ Brian Massey:

Join us for a Crazy Egg Hard-Boiled Conversion Webinar

brian masseyFeaturing Brian Massey, Conversion Sciences
May 28, 2pm US Central Time
Sign up here (it’s free!).

How to Reverse-Engineer a High-Conversion Landing Page

Now, let’s look at how pro email marketers test their email campaigns.

Email Campaign Testing: Choosing Between the A/B and Cs of Email Marketing Elements

04 - email monks - ab testing emails

Let’s Review

A/B testing, also known as split testing, compares two versions of a single variable to find the version that yields the most opens or clicks.

The same rules apply, whether you’re testing a landing page or your email clickthrough. Read here for 6 tips for more successful A/B testing.

For example, one email has two versions, each with a different subject line. Or one email has two versions, each with a different CTA. Half the list is sent to one version, while the other half of the list is sent to the other version.

This tells you which version is more successful at getting your desired goal, whether that’s a higher open rate or a higher clickthrough rate.

7 tips for getting better results

1. Keep it simple!

Focus on one variable at a time. Look for the elements that could yield your biggest wins, and test them first: subject line and call to action.

2. Keep your test campaigns consistent.

Always compare apples to apples. If you’re testing headlines, come up with a hypothesis for types of headlines your subscribers will click on. Then create unique headlines for testing your hypothesis.

3. Determine your end goals before you start testing.

Know what your goal is: higher open rate, for instance. Make sure your test will help you achieve your end goal.

4. Check your pre-testing elements.

There’s no need to reinvent the wheel. Review old test results before setting up your current test. Knowing what worked and what didn’t in previous tests can help you get better results in this test.

5. Frame the test.

One element. One test. Don’t try to rush results.

6. Split the list.

Your list needs to be large enough to run an A/B split test. If it’s very large, you may run your test on only a small test segment. If the test gets good results, you may send that email to your entire list.

7. Change the elements.

If a test yields poor results, try a new version or test a different element. Each test you run should give you more information for the next test.

The idea, friends, is to be always testing.

9 elements to test in email marketing

  • Call to action
  • Personalization
  • Subject line
  • From line
  • Design
  • Time and day of send
  • Type of offers
  • Email copy
  • Rich v. plain text

Advanced email testing tips

  1. Set an annual email marketing goal and strategy. Each year, compare results with the previous year’s results, so you know how to refine your strategy.
  2. Be flexible and agile. If a test fails, revamp and test around.
  3. Look beyond basic email metrics such as open rates, CTR, etc.
  4. Make use of the reports generated in the email campaign software for each campaign you plan.
  5. Make strategic reviews easier by gauging activities on a quarterly basis.
  6. Review Google Analytics, email metrics, and conversion in the same sitting for a holistic view.
  7. Move on once you have judged what works best for a particular element.
  8. While evaluating the results for proposing corrections—don’t put email aesthetics before results.

Share your best tip

What’s your best tip for optimizing email marketing results? Share in the comments below.

Read other Crazy Egg articles by Kathryn Aragon.

View original post here:

The A/B and Cs of Email Campaign Testing

This Cognitive Bias Will Help You Create More Persuasive Landing Pages

PSST: This post was written by Talia Wolf of Conversioner. You can see her speak at the Call to Action Conference in September – so get your early bird tickets now.

While we’d all like to think that we act based on reason and logic, the truth is that we have many cognitive biases that affect our decisions.

Back in 1974, psychologists Tversky and Kahneman were the first to theorize and research the anchoring effect: our tendency to rely too heavily on the first piece of information presented to us (the “anchor”) to make subsequent decisions.

Take the release of the original iPad for example. After Steve Jobs showed off the high-resolution screen and impressive features, he asked the audience how much they thought this “revolutionary” new device should cost.


“What should we price it at?” asked Jobs. “If you listen to the pundits, we’re going to price it at under $1000, which is code for $999.”

He put a giant “$999” up on the screen and left it there for several minutes.

“I am thrilled to announce to you that the iPad pricing starts not at $999, but at just $499.” On-screen, the $999 price was crushed by a falling “$499.”

Bingo. Because of the anchoring effect, $499 is now considered “cheap.”

Understanding biases like anchoring helps us make sense of our personal decision making process, but it also helps us persuade our prospects and create more powerful landing pages.

Let’s dig into how brands and marketers are currently using anchoring – and how you can too.

Present the most expensive option first

As we saw in the Jobs example, when a higher price is presented first, it becomes the benchmark against which other prices are evaluated.

Joanna Wiebe of Copyhackers saw this first-hand when she ran an A/B test for her client’s pricing plans. The original page ordered the pricing from least expensive to most:


Whereas the variation presented it in reverse, starting with the most expensive on the left:


The verdict? The variation took the cake with a whopping 500% uplift in click throughs!

Because people read English from left to right, placing the highest price on the left ensured that people would see it first – making it the anchor against which to judge the price of the other plans. And that made the lower plan seem like that much more of a great deal.

The same effect can be achieved by comparing your pricing schemes to that of competitors. Consider this example by analytics tool Hotjar:


By showing potential customers how much they spend on a monthly basis for using a combination of tools ($265/month) versus how much they could be spending by using their all-in-one solution ($29/month), Hotjar positions itself as the product that offers the best value.

Use anchors to put things into perspective

So much of our decision making is governed by how information is presented. A $40 pricing plan might sound like a lot on its own, but using an anchor can help you put things into perspective for prospects.

Consider this campaign that agency Saatchi & Saatchi put together to collect donations and raise awareness for a worthy cause:


In this example, the image grabs your attention, stands out and makes the immediate connection between the amount we spend on luxury items versus the small amount it costs to donate.

By showing people the amount of money they spend on their luxury items (the higher price) right above the low cost of the donation, they created a campaign that begged the question: “How can you spend so much on fashion but not be bothered to donate?”

Since 50% of our brain’s capacity is geared towards vision, the images we perceive on a landing page affect our emotional state. Images can communicate an idea, thought or feeling much quicker than text and can be used brilliantly with price anchoring.

Beware of negative anchoring

Anchoring isn’t a magic bullet. Sometimes, displaying multiple elements on your page can create an unwanted anchoring effect.

Have a look at the way Buffer displays their pricing plans:


As we’ve already covered, they may want to consider leading with the most expensive plan, but beyond that lies a greater issue. Once you choose a monthly plan, a popup comes up summarizing the amount you’re going to pay.

Suddenly, it isn’t the (reasonable) monthly plan you chose but a yearly payment of $2250.


The initial piece of information I received was $50 per month, but I didn’t get any indication that I was going to be charged annually. The large amount that suddenly appears on my screen comes as a complete shock.

To avoid negative anchoring, Buffer should consider testing the annual price on the pricing page. Why not inform people of the monthly price as well as the summarized annual price? It’d also be a great opportunity to present a discount to those paying for a year upfront.

At the very least, Buffer could test including a note about the annual billing under the call to action button, as on this landing page:


Wrapping it up

There are many different cognitive biases that have an impact on our decision making and purchasing patterns, but few are as impactful as anchoring. When used properly, anchoring can bring you dramatic improvements in your conversion rate.

To use anchoring on your landing page, pay attention to the initial information a customer is presented with when they land on the page.

  • First, set a goal. Which option do you want people to choose?
  • Then set up an anchor. What will make your goal look like the best possible choice?
  • Don’t forget to test, test, test. You want to be sure you’re not inadvertently creating a negative anchoring effect.

Over to you – do you use anchors on your landing pages? I’d love to hear about them in the comments.

Visit source:  

This Cognitive Bias Will Help You Create More Persuasive Landing Pages

How to Know if Your Split Test is Valid (Hint: Statistics Can Lie)

Did you know that conversion optimization can actually decrease your profit?

When you run tests, it’s easier than you might think to misinterpret the results and make faulty conclusions.

The “winner” that you pick might end up being the long-term loser if you’re not careful.

Equally as bad, if the lessons you take from that test are incorrect, you will multiply your losses as you implement tactics based on those bad conclusions elsewhere in your business.

If you’ve never taken an introductory statistics course, don’t worry — I have you covered. We’ll also go over the ways statistics in your split tests can be deceiving.

Stats 101: A Basic Crash Course

If you never had to take Stats 101 at college or university, you missed out on some exciting stuff… um, not really.

However, there are still a few things from that course you need to know before split testing will make any real sense.

I’m going to go over these concepts quickly now so you’re not confused in the future. If you are already a stats pro, just skip down to the next section.

What in the World Is a Confidence Interval?

Whether you use a conversion tool like Optimizely, or a simple web app like IsValid, you’ll notice that conversion rates always come with a range.

For example, check out this screen shot of a sample test:

ISValid split test confidence interval

The conversion rate is currently 4.3%, but there’s a range underneath it from 0.6 to 8.0%. This means that given a large enough sample, the conversion rate could fall anywhere in that range.

Now this doesn’t mean that the far ends (0.6 or 8.0) are likely, it just means that they are possible.

How Important is Significance?

Statistically significant — have you heard that term before?

The significance of a test tells us how confident we should be that we have the right result when we are picking from 2 or more options.

When you run a basic A/B test, you’ll have a confidence interval for each option. In many cases, these 2 confidence intervals will overlap.

See the example below, for example. The original could have a conversion rate of up to 5.6%, while the variation (the current winner) could have a conversion rate as low as 0.6%.

split test interval comparison

Does this mean the current results are useless? No, not at all.

But it means that we need to calculate the significance of the test in order to determine how confident we can be when we choose the variation as the winner.

According to the tool, the significance is currently 91.1%. This means that 91.1% of the time, the variation is the best performing option. However, that leaves 8.9% of the time where the original is actually the best.

ISValid split test significance

In reality, tests are typically run until a 95% or higher significance is achieved. Even at 95%, 1 in 20 tests will end up with you picking the worst option. While it would be ideal to test everything to a 99%+ significance level, it’s not always possible due to traffic or time limitations.

A note on significance: If you can only get to 95% significance in most tests, that’s not ideal, but it’s okay. Just understand that not every lesson you learn is going to be correct, and that you should expect a conflicting result once in a while.

A Critical Variable: Sample Size

Flip a coin 10 times, and you’re fairly likely to get lopsided results, like 3 heads (30%) and 7 tails (70%), even though in theory, they should be split 50/50.

Flip that coin 100 times, and you’ll get closer to the real probability, something like 48 heads and 52 tails.

See where I’m going with this?

The larger the sample size you have when running a test, the more accurate the results are.
Your sample size is one of the most important factors in determining the significance of a test.

There are plenty of simple sample-size calculators out there that you can use for free. Just about every conversion optimization tool has a calculator built-in as well.

Here’s a look at Optimizely’s free web calculator:


In this case, you’d need to run the test until you had 10,170 samples (views) for each option.

So that’s Stats 101 in about 5 minutes. Let’s move on to determining if your split test results are actually valid.

Sample Size is Not Always Accurate — Here’s Why…

Here’s what most business owners do when split testing:

  1. Calculate required sample size
  2. Run test for that long
  3. Pick a winner from the results

That doesn’t seem crazy, does it?

But there are some serious flaws that could have negative effects on your bottom line.

You MUST Segment Your Traffic

Segmenting simply means to divide something up.

In the case of web traffic, you can segment in three main ways:

  1. By source: Traffic comes from different places. Google, Bing, social media, email links and more. Visitors from different sources of traffic tend to behave and convert differently.
  2. By behavior: Did they come to the test page from a certain page on your site? Do some of your visitors read 3+ pages on your site on their first visit or visit at least 5 times a month?
  3. By outcome (conversion): Which visitors convert the best? If applicable, which of those later buy your more expensive service or product?

There are occasions where you can segment by 2 or 3 of the above types all at once. It just depends how detailed you’d like to go.

Getting back to testing validity, the point is that your results can be invalid if you do not pay attention to segments.

Example time…

Your sample size calculator says you need 10,000 visitors for each variation. You do that, and see that one side is the clear winner. However, after digging a bit deeper, you see that the winner had an extra 2,000 visitors from search engines (because of variance, just like flipping a coin). You find that search-engine visitors convert really well on your site, thus skewing the results.

After running the test until the amount of traffic from each traffic source levels out, you see that the original is actually the best — mistake avoided.

You need to consider variation in the most important segments for your business and test before declaring a winner. It may be the sources of traffic, certain behaviors, country, or more. Learn how to segment your visitors with Google Analytics.

Sample Size Does Not Always Reflect a Business Cycle

Check out just about anyone’s analytics reports and what do you see? Massive variation in traffic numbers based on the day. Usually a peak during the week, followed by a massive dip on the the weekend.

However, it’s not always just numbers. You get different visitors based on the day. If you dig a bit deeper, you’ll likely notice that the traffic you get from different sources also changes a bit from day to day.

google analytics dashboard

A “business cycle” typically refers to one week for most businesses, although it may be different for yours. Whatever time period encompasses most types of your typical visitors is a business cycle.

What happens when your sample size calculator says to run a test for 10,000 impressions, and you have 20,000 visitors in one day?

You finish the test in one day. But this doesn’t take your business cycle into account. You might have a valid result for visitors on a Monday, but not necessarily for visitors overall.

This particular testing problem isn’t usually a problem unless you have great traffic numbers. Nonetheless, be aware of it.

Always run a test for at least 1 business cycle.
You can always test more variables (multivariate testing) if you have excess traffic.

Assessing the Validity of a Test

If you’re feeling a bit overwhelmed, don’t worry. We can simplify this process into 3 main steps:

1. Calculate Your Minimum Sample Size

Determine what level of confidence (significance) you’d like in your test’s results, and calculate a sample size based off of it. This will be the minimum number of impressions/visitors that your variations need.

2. Check for Discrepancies in Segments

Before the test is complete, you should already know how to segment the visitors to your website. Once the minimum sample size is complete, dig deeper to determine if there are any major discrepancies. If so, keep the test running.

3. Assess Your Business Cycle

Your tests need to run for a whole number interval of business cycles. If the minimum sample size is up after half a cycle, or 1.75 cycles, keep it running until the next whole number (1 or 2 cycles respectively in this example).

That’s all there is to it, 3 fairly easy steps. Statistics are your friends, as long as you understand them.

Do you have any questions? Leave them below and I’ll answer them the best I can.

Read other Crazy Egg posts by Dale Cudmore

Original link: 

How to Know if Your Split Test is Valid (Hint: Statistics Can Lie)


Benton Modern, A Case Study On Art-Directed Responsive Web Typography

Having the ability to set legible body copy is an absolute must, and we’ve come a long way with web typography since the dawn of web design. However, I feel like we have allowed the lack of variety prior to the rise of web fonts to dampen our creativity now that thousands of web fonts are at our disposal. Have usability conventions and the web’s universality steered us away from proper art direction? Have we forgotten about art direction altogether? I believe so.

As designers, we can achieve much more with type, and with just a little more thought and creativity, we can finally start to take full advantage of the type systems available. Let’s look at ways we can push typographic design on the web further, beyond the status quo of today.

Benton Modern Formal version1
Benton Modern Formal version. (View large version2)

The Benton Modern brochure website3 (a project I was involved in) is a perfect example for showcasing how a large type family can be utilized to improve legibility and readability across breakpoints, while at the same time evoking emotion and providing a pleasant experience. We shall explore the ideas introduced to push the boundaries of typographic design on the web and get practical, too, with a key focus on responsive web typography.

First, The Basics Of Responsive Web Typography

You’re probably aware of responsive web typography by now and how it can solve challenges outside of core responsive web design. However, as the focus of this article isn’t on the ins and outs of responsive web typography, we shall not be exploring it in any great detail.

If you’re interested in learning more about general typesetting for the web and how to approach certain issues, many4 resources exist5 to help you.

Furthermore, my “Responsive Typography6” talk and chapter in Smashing Book 47, in which I propose reusing “traditional” typography rules and translating them to the language of CSS, should help kickstart any aspiring web typographer to improve their typography game.

To also help you on your way, here’s a quick rundown of some of the methods I’ve been advocating in recent years, methods that were applied to the Benton project, too:

  • Provide different font sizes for different reading distances, currently achievable by detecting a device’s form factor using @media queries. Long term, this is probably not ideal — that is, until reading distance-detection techniques8 become more feasible. In the meantime, use Size Calculator9 by Nick Sherman10 and Chris Lewis11 to calculate the physical or perceived font size when factoring in reading distance.
  • Maintain perfect proportions in a paragraph with letter spacing, word spacing and line height properties for each breakpoint. Universal Typography’s demo12 by Tim Brown13 of Nice Web Type14 is a very useful tool that can help you experiment with and adjust your paragraph proportions accordingly.
  • Establish hierarchy using either a typographic scale (Modular Scale15 is a useful tool by Tim Brown and Scott Kellum16) or different styles at the same font size — for instance, uppercase for h2, small caps for h3 and italics for h4 subheads. For more options and ideas on styling subheads, may I suggest you read “Setting Subheads With CSS17” and explore examples of subheads set with CSS18.
  • For small screens, indent paragraphs and separate page sections with white space. For large screens, use block paragraphs and separate page sections with graphical elements (lines, shapes, color).
  • Use graded fonts to normalize rendering across different pixel densities. Font grades are very subtle font weights used to compensate for different ink and paper qualities, as well as for different pixel densities on screen. This method is explained in detail in iA19’s article “New Site With Responsive Typography20.” In short, lighter grades are used for low-DPI screens and heavier grades for high-DPI screens, while graded fonts will also compensate for different sub-pixels’ direction between portrait and landscape mode on mobile and tablet devices.
  • Look for type families that have multiple optical sizes21, and use appropriate styles for body copy, tiny text and display sizes. For instance, Font Bureau22, the company behind the Benton Modern family, makes many families like this with a wide stylistic palette.
  • Use different font widths according to the width of the screen (see what happens with the subheads on the Benton website23 when you resize the browser window). For instance, use a condensed font for small screens and a wider font for larger desktop screens, just like on the brochure website for Input24 (again, resize the window). In the case of the Benton project, we set different font widths manually for each breakpoint, but there’s also a solution for automatic swapping using Font-To-Width25 (by Sherman and Lewis) that takes advantage of multiple-width type families to fit pieces of text snugly within their containers.

    Here’s another tip: If you intend to use Georgia or Verdana on large screens, replace them with Georgia Pro Condensed or Verdana Pro Condensed26 on mobile screens. The reason why Georgia Pro and Verdana Pro’s condensed widths work well at small sizes is because they aren’t extremely condensed and, hence, can still be read comfortably.

With this basic primer on responsive web typography out of the way, let me walk you through the process of designing a web page that is meant not only to inform, but to amaze!

Show, Don’t Tell

Webtype27 commissioned us to build a brochure website for Benton Modern soon after Indra Kupferschmid28 had seen my talk on responsive web typography at Smashing Conference in Oxford. The brief was to showcase what could be achieved typographically with a versatile type family coupled with responsive web typography using as many responsive techniques as possible, essentially putting into practice the elements presented and demonstrated in my talk. With Indra Kupferschmid as the chief type savant and Nick Sherman as the onboard quality assurance director, there was certainly to be no trouble with experimenting and pushing the boundaries.

From the very start, we wanted the user to experience the type family through the design and not just through a full page of body copy. That being said, in searching for the right metaphor to use, we eventually settled on creating two distinctive designs — the formal29 and the expressive30. Both are fully responsive, utilizing the same HTML, and for all intents and purposes showcase the benefits of separating structure from presentation, so don’t forget to resize your browser and inspect the HTML and CSS.

Learning About The Typeface

Indra’s elaborate copy was a good starting point to get to know the typeface. When you receive content up front, as was the case in this project, it’s so much easier to create semantic HTML and to explore different styles. Here’s how we started our investigative testing, bearing in mind that Benton Modern comprises 48 styles in total:

  1. First, we tested all of the styles at large and small sizes, stretching and squeezing every which way possible. We used Reading Edge optical sizes31 (designed for 9- to 14-pixel font sizes) as subheads, and display optical sizes (designed for headlines) for body copy. We wanted to see what could go wrong and challenge the intended use for each style. However, the solution that we settled on was still pretty much in line with the intended use for each optical size.
  2. Next, we tested how different styles behave in narrow columns versus wider blocks of text. Hyphenated and justified verus left-aligned. Tightly spaced versus loosely spaced.
  3. Lastly, we analyzed all of the glyphs one by one, searching for little hidden gems. Apart from the ampersand — which is always an obvious choice — another good candidate was the uppercase R.
An early stage prototype32
An early-stage prototype. (View large version33)

From there, the next step was to apply some basic styles to the page. One of the early ideas was to adopt a traditional newspaper column layout, which we tried. With the exception of this high-level concept, we still didn’t have a definitive layout concept by this point.

Indented paragraphs in columns were too narrow to be justified and hyphenated34 properly, so we just kept the hyphenation to improve the texture a little bit.

.columns p 
   -webkit-hyphens: auto;
   -moz-hyphens: auto;
   hyphens: auto;

.columns p + p 
   text-indent: 1.5rem;

We used columns only when there was enough horizontal space. But we also wanted to avoid columns bleeding out of the screen vertically, because that would require scrolling up and down during reading when moving from column to column. That’s why we introduced another @media query to test the height of the screen before applying columns.

@media only screen and (min-height: 25em) 

   @media only screen and (min-width: 40em) and (max-width: 59.9375em) 
      -webkit-columns: 2;
      -moz-columns: 2;
      columns: 2;
      -webkit-column-gap: 2.7em;
      -moz-column-gap: 2.7em;
      column-gap: 2.7em;

   @media only screen and (min-width: 60em) 
      -webkit-columns: 3;
      -moz-columns: 3;
      columns: 3;
      -webkit-column-gap: 2.7em;
      -moz-column-gap: 2.7em;
      column-gap: 2.7em;

Designing Content

The next step was to analyze the content in more detail. That way, we were able to establish what the different sections were and adjust the details as we went along.

The formal version was the first to be developed. We created a huge headline to reflect newspaper headlines and added the year that the series started. The deck was the obvious element to style next. We experimented with a condensed version, and to our surprise it worked immediately. At that stage, the page navigation still didn’t exist and was only included much later on to improve overall usability, as well as to demonstrate the use of brackets as graphic elements.

The sections were a little dull, though. The hierarchy and arrangement of subhead, intro paragraph and columns were quickly established using the rules explained previously, but something was still missing. After some trial and error, we decided to separate the different sections with dotted borders to further emphasize the fine detail in the design of the Benton Modern series, and we introduced the section sign § (Alt + 6 on a Mac) to mark the sections. However, that still wasn’t good enough, so we again previewed numerous glyphs to find suitable candidates for other sections. We ended up using § for “About,” • for “Optical Sizes,” an italic i for “How to Use,” + for “Bonus Features” and * for “Pairings.” Some of these characters are rarely used in web design, so introducing them as decorations felt natural.

Plenty of little details35
Plenty of little details. (View large version36)

At this point the design was pretty solid, but we still needed to highlight the most impressive facts to showcase to the reader the inherent versatility of the family. So we established a no-nonsense look and feel by enlarging the important numbers: 3 optical sizes, 48 styles to choose from, and 4 widths in display styles.

The first version of pairing swatches was set in Pinterest37-inspired columns, as with the rest of the sections. Yet we had a need to change it — at least slightly — because this section was not about Benton Modern, but about its companions. Benton Modern RE fonts38 are really great at small sizes, so introducing the pairs as contrasting large headlines made sense. Indra’s selection of pairings worked very well without many additional adjustments. The only areas that required special attention were the custom sizes for each headline, especially if we wanted the headlines to resize with the screen.

Viewport Width For Smooth Type Scaling

The only CSS units that support smooth scaling are vw (1% of the viewport’s width), vh (1% of the viewport’s height), vmax (1% of the longest side) and vmin (1% of the shortest side). The resulting CSS for one headline is composed of three font-size declarations — values in pixels, root ems39 (rems) and viewport widths — one for each flexible breakpoint (small to medium screens) that covers older browsers, too:

#swatch-benton-sans h1  
   @include rem(font-size, #208/16); 
@media only screen and (max-width: 29.9375em) 
   #swatch-benton-sans h1 
      @include rem(font-size, #57/16); 
      font-size: 18.75vw; 
@media only screen and (min-width: 30em) and (max-width: 61.9375em) 
   #swatch-benton-sans h1 
      @include rem(font-size, #86/16);
      font-size: 20vw; 

As you can see, we’re using a Sass mixin here. It returns the given property with values in pixels, as well as in root em units.

@mixin rem($property, $values) 
   $max: length($values);
   $pxValues: ‘’;
   $remValues: ‘’;
   @for $i from 1 through $max 
      $value: strip-unit(nth($values, $i));
      $pxValues: #$pxValues + $value*16px;
      @if $i < $max 
         $pxValues: #$pxValues + “ “;
   @for $i from 1 through $max 
      $value: strip-unit(nth($values, $i));
      $remValues: #$remValues + $valuerem;
      @if $i < $max 
         $remValues: #$remValues + “ “;
   #$property: $pxValues; 
   #$property: $remValues; 

OpenType Features

Whenever you need to showcase important details within the content — in this case, OpenType features such as the alternate R, the ligatures and the small caps — it’s always good to highlight these features in an interesting way. We didn’t want to use CSS images for graphic details, so we simply enlarged the type and brought the details to focus. The difference between ligatures and default glyphs is clear, and comparing small caps with uppercase and lowercase counterparts is easy.

OpenType Features40
OpenType Features. (View large version41)

If you were wondering how to enable OpenType features in CSS, here are a couple of examples with vendor prefixes:

/* Alternate characters */
-webkit-font-feature-settings: “ss01”;
-moz-font-feature-settings: “ss01” 1;
font-feature-settings: “ss01”;

/* Common ligatures (ff, fi, ffi, fl, ffl, fj, …) */
-webkit-font-feature-settings: “liga”;
-moz-font-feature-settings: “liga” 1;
font-feature-settings: “liga”;

/* Small caps */
-webkit-font-feature-settings: “smcp”;
-moz-font-feature-settings: “smcp” 1;
font-feature-settings: “smcp”;

You can test all of the OpenType features available with CSS in Richard Rutter42’s CSS3 Font-Feature-Settings OpenType Demo43. Consult Bram Stein44’s excellent The State of Web Type45 to check which features are supported in which browsers and to what extent.

OpenType Features in Safari Are… a Drag

There’s one piece of bad news. Safari on both Mac and iOS support OpenType features but ignores any assigned value46. The safest way to use alternate characters or small caps in Safari is by loading subset fonts (subset fonts contain only a subset of glyphs from the full font file). For the Benton Modern project, we decided to test browser capabilities with @support before applying small caps, and we provided a fallback for browsers that don’t support font-feature-settings:

@supports ((font-feature-settings: “smcp”) or
   (-webkit-font-feature-settings: “smcp”) or 
   (-moz-font-feature-settings: “smcp” 1)) 
      text-transform: lowercase; 
      -webkit-font-feature-settings: “smcp”; 
      -moz-font-feature-settings: “smcp” 1;
      font-feature-settings: “smcp”; 

Expressive Details

The Formal newspaper-inspired style looked really great. It was well organized, with plenty of small details. But we wanted to push the design a little further. How about creating a magazine-inspired design? We retained the same emphasis on elements as in the formal version but fed the opening section and all section subheads with steroids using pseudo-elements (for example, the R and the asterisk on the “cover” page), and we created a specific arrangement for each subhead by repositioning each word in a subhead in a Lubalinesque47 manner.

Expressive Details48
Expressive Details. (View large version49)

3D Effects

The 3D effect on “The Complete Series” was achieved with multiple text shadows, as explained in Tim Brown’s Typekit Practice50 lesson “Using Shades for Eye-Catching Emphasis51.”

3D Effects52
3D Effects. (View large version53)

Drop Caps

Drop caps can be achieved simply by floating the first character. But vertical metrics complexities54 as well as cross-browser inconsistency make it virtually impossible to get drop caps right. Luckily, Adobe engineers wrote dropcap.js55, a small script that solves that problem. The setup is very straightforward, and it’s easy to adjust positioning by specifying the number of lines the drop cap should span, as well as the height of the drop cap itself. There’s a bonus: The script doesn’t require any external JavaScript libraries.

var dropcaps = document.querySelectorAll(‘.drop-cap’);

if (window.innerWidth < 600) 
   window.Dropcap.layout(dropcaps, 3);
   window.Dropcap.layout(dropcaps, 5, 3);

Drop Caps56
Drop Caps. (View large version57)

Flipped and Rotated Type

All elements that needed special treatment were wrapped in their respective spans and given dedicated class names. This meant adding non-semantic markup, but there was no other way around it, especially if we wanted to take full control over the presentation.

Flipped and Rotated Type58
Flipped and Rotated Type. (View large version59)

We flipped parts of the pairings section subhead with the transform: scale rule. The great thing is that if the transform property is not supported by the browser, nothing will happen.

   display: block;
   -webkit-transform: scale(-1, -1);
   -moz-transform: scale(-1, -1);
   transform: scale(-1, -1);

Flipped and Rotated Type60

Flipped and Rotated Type. (View large version61)

The same applies to the O in the “Bonus Features,” which we rotated with the transform: rotate rule. When rotating letters, you might want to readjust the positioning after rotation (watch out for the aforementioned vertical metrics issues). The values will vary from typeface to typeface and glyph to glyph, so there’s no generic rule.

   -webkit-transform: rotate(90deg);
   -moz-transform: rotate(90deg);
   transform: rotate(90deg);
   /* Glyph-specific adjustments */

Setting Expressive Subheads

Setting responsive expressive subheads is a piece of cake when you grasp the underlying concept. We need to do only two things:

  1. set the font size of a container in viewport width units,
  2. size everything that’s inside the container in em units.
<div class="container">
      <span class="s1">You</span>
      <span class="s2">&</span>
      <span class="s3">Me</span>

Elements inside the container can be repositioned either absolutely or using negative margins. If you’re using absolute positioning, then it’s best to fix the aspect ratio of the h1, thus retaining proportions. If you’re fixing the aspect ratio, you can also use percentages instead of ems, because now you have a height reference for vertical properties in place.

Setting Expressive Subheads62

Setting Expressive Subheads. (View large version63)

Example of positioning with margins:

   font-size: 10vw;

.container h1 
   font-size: 1em;
   line-height: 1;
   width: 100%;

   margin-left: 1em;
   margin-top: 1em;

Example of absolute positioning:

   font-size: 10vw;

.container h1 
   font-size: 1em;
   line-height: 1;
   position: relative;
   width: 100%;
   height: 0;
   padding-top: 75%; /* 4:3 aspect ratio */
   padding-top: 50%; /* 2:1 aspect ratio */

   position: absolute;
   left: 10%;
   top: 10%;

Voila! Compare all three positioning variants in the Expressive Web Typography64 demo.

Steal Ideas!

Now you hopefully see how far we can take typography on the web. To take full advantage of the methods discussed in this article, look for type families with multiple font styles and optical sizes. The only reason we were able to make all of these responsive adjustments is that the Benton Modern is such a versatile typeface family with so many variants.

View the HTML and CSS source on Benton Modern65, use those techniques to improve typography in your own projects, and let us know if you come up with something different. Setting type on the web still involves a lot of manual labor, especially for the smaller, more delicate details, but typographic tools are emerging66 to speed up the process. Until then, don’t be intimidated because there is always a solution to a given problem. The next time you are offered a challenging project, bite the bullet, test like crazy, and do whatever it takes.

(al, ml)


  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66

The post Benton Modern, A Case Study On Art-Directed Responsive Web Typography appeared first on Smashing Magazine.

Read original article:

Benton Modern, A Case Study On Art-Directed Responsive Web Typography

Thanks for helping VWO bootstrap its way into the survived-5-year club

Great news! Visual Website Optimizer completed five years today, and oh, we crossed 4k active paying customers, too! We’ve made a special page to share our birthday party with you. Take a look:

I wanted to thank you for sharing this A/B testing industry with us. A big thanks for being a customer, a user, and a well-wisher. As a bootstrapped company commencing with the initial investment of a $20 server and a $10 domain name, I couldn’t have done it without your support and encouragement.

Survival rates for funded tech startups are terrifying. Some estimates put it at a 90% failure rate within the first 18 months! Survival rates for bootstrapped companies must be even worse. I think we survived (and grew!) because we were lucky to be in an industry (A/B testing) that’s growing at a tremendous pace, and even more so when it welcomed us with such open arms.

Most people are smart. Few are lucky.

However, now that we’re into the survived-5-year club, I want to reiterate our commitment and our philosophy. Wait, hang on. The words sound academic and hearty, but it’s actually quite simple.

Why we exist?

For us, the primary driver isn’t making money. Yes, money is a good outcome and it gives us freedom to plan long term. But, money for money’s sake can make individuals and companies short-sighted. We’re driven to make a long-term impact. Our aim is to build a company that delivers exceptional software products and fanatical customer support. We want to work hard enough to make you say – “These guys at VWO, they’re amazing at software!”

In retrospect, it’s the customer-centric approach that has lead us to grow our business into 4000+ paying clients, 90+ people and 2 locations. And our commitment to you is that we’ll continue on this path – putting the users first, and delivering software that amazes and thrills them.

Thanks once again for being a part of our journey. Hope to continue seeing you every now and then for the next 5X years :)

PS: If you want to learn more about our journey, following sources are most useful:

  1. My interview with Sramana Mitra interview: Solo Founder, Bootstrapping to $7 Million in India: Wingify CEO Paras Chopra
  2. How to bootstrap a tech startup: Youtube video of a talk I did last year
  3. How hating my first two jobs helped me create the perfect corporate culture

The post Thanks for helping VWO bootstrap its way into the survived-5-year club appeared first on VWO Blog.


Thanks for helping VWO bootstrap its way into the survived-5-year club