diff --git a/datacenterlight/views.py b/datacenterlight/views.py
index baec4ee6..d9c0fbc1 100644
--- a/datacenterlight/views.py
+++ b/datacenterlight/views.py
@@ -603,21 +603,46 @@ class OrderConfirmationView(DetailView):
                 }
                 return HttpResponse(json.dumps(response),
                                     content_type="application/json")
-            card_details_dict = card_details.get('response_object')
+            card_details_response = card_details['response_object']
+            card_details_dict = {
+                'last4': card_details_response['last4'],
+                'brand': card_details_response['brand'],
+                'card_id': card_details_response['card_id']
+            }
             ucd = UserCardDetail.contains(
                 request.user.stripecustomer, card_details_dict
             )
             if not ucd:
-                stripe_utils.associate_customer_card(
+                acc_result = stripe_utils.associate_customer_card(
                     stripe_api_cus_id, request.session['token'],
                     set_as_default=True
                 )
+                if acc_result['response_object'] is None:
+                    response = {
+                        'status': False,
+                        'redirect': "{url}#{section}".format(
+                            url=reverse('datacenterlight:payment'),
+                            section='payment_error'),
+                        'msg_title': str(_('Error.')),
+                        'msg_body': str(
+                            _('There was a payment related error.'
+                              ' On close of this popup, you will be redirected back to'
+                              ' the payment page.'))
+                    }
+                    logger.error(
+                        "Card association failed. Error {error}".format(
+                            error=acc_result['error']
+                        )
+                    )
+                    return HttpResponse(json.dumps(response),
+                                        content_type="application/json")
         else:
             card_id = request.session.get('card_id')
             user_card_detail = UserCardDetail.objects.get(id=card_id)
             card_details_dict = {
                 'last4': user_card_detail.last4,
-                'brand': user_card_detail.brand
+                'brand': user_card_detail.brand,
+                'card_id': user_card_detail.card_id
             }
             if not user_card_detail.preferred:
                 UserCardDetail.set_default_card(
@@ -646,6 +671,14 @@ class OrderConfirmationView(DetailView):
         # Check if the subscription was approved and is active
         if (stripe_subscription_obj is None
                 or stripe_subscription_obj.status != 'active'):
+            if request.user.is_authenticated():
+                sac_id = request.user.stripecustomer.stripe_id
+            else:
+                sac_id = stripe_api_cus_id
+            stripe_utils.dissociate_customer_card(
+                sac_id,
+                card_details_dict['card_id']
+            )
             msg = subscription_result.get('error')
             messages.add_message(self.request, messages.ERROR, msg,
                                  extra_tags='failed_payment')
diff --git a/hosting/views.py b/hosting/views.py
index f61a4b19..6d5c9a78 100644
--- a/hosting/views.py
+++ b/hosting/views.py
@@ -632,6 +632,18 @@ class SettingsView(LoginRequiredMixin, FormView):
                     msg = _('You seem to have already added this card')
                     messages.add_message(request, messages.ERROR, msg)
                 else:
+                    acc_result = stripe_utils.associate_customer_card(
+                        request.user.stripecustomer.stripe_id, token
+                    )
+                    if acc_result['response_object'] is None:
+                        msg = _(
+                            'An error occurred while associating the card.'
+                            ' Details: {details}'.format(
+                                details=acc_result['error']
+                            )
+                        )
+                        messages.add_message(request, messages.ERROR, msg)
+                        return self.render_to_response(self.get_context_data())
                     preferred = False
                     if stripe_customer.usercarddetail_set.count() == 0:
                         preferred = True
@@ -645,9 +657,6 @@ class SettingsView(LoginRequiredMixin, FormView):
                         card_id=card['card_id'],
                         preferred=preferred
                     )
-                    stripe_utils.associate_customer_card(
-                        request.user.stripecustomer.stripe_id, token
-                    )
                     msg = _(
                         "Successfully associated the card with your account"
                     )
@@ -866,22 +875,48 @@ class OrdersHostingDetailView(LoginRequiredMixin,
             card_details_response = card_details['response_object']
             card_details_dict = {
                 'last4': card_details_response['last4'],
-                'brand': card_details_response['brand']
+                'brand': card_details_response['brand'],
+                'card_id': card_details_response['card_id']
             }
             ucd = UserCardDetail.contains(
                 request.user.stripecustomer, card_details_response
             )
             if not ucd:
-                stripe_utils.associate_customer_card(
+                acc_result = stripe_utils.associate_customer_card(
                     stripe_api_cus_id, request.session['token'],
                     set_as_default=True
                 )
+                if acc_result['response_object'] is None:
+                    msg = _(
+                        'An error occurred while associating the card.'
+                        ' Details: {details}'.format(
+                            details=acc_result['error']
+                        )
+                    )
+                    messages.add_message(self.request, messages.ERROR, msg,
+                                         extra_tags='failed_payment')
+                    response = {
+                        'status': False,
+                        'redirect': "{url}#{section}".format(
+                            url=reverse('hosting:payment'),
+                            section='payment_error'),
+                        'msg_title': str(_('Error.')),
+                        'msg_body': str(
+                            _('There was a payment related error.'
+                              ' On close of this popup, you will be redirected'
+                              ' back to the payment page.')
+                        )
+                    }
+                    return HttpResponse(
+                        json.dumps(response), content_type="application/json"
+                    )
         else:
             card_id = request.session.get('card_id')
             user_card_detail = UserCardDetail.objects.get(id=card_id)
             card_details_dict = {
                 'last4': user_card_detail.last4,
-                'brand': user_card_detail.brand
+                'brand': user_card_detail.brand,
+                'card_id': user_card_detail.card_id
             }
             if not user_card_detail.preferred:
                 UserCardDetail.set_default_card(
@@ -911,6 +946,13 @@ class OrdersHostingDetailView(LoginRequiredMixin,
         # Check if the subscription was approved and is active
         if (stripe_subscription_obj is None or
                 stripe_subscription_obj.status != 'active'):
+            # At this point, we have created a Stripe API card, but and
+            # associated it with the customer; but the transaction failed
+            # due to some reason. So, we dissociate this card.
+            stripe_utils.dissociate_customer_card(
+                request.user.stripecustomer.stripe_id,
+                card_details_dict['card_id']
+            )
             msg = subscription_result.get('error')
             messages.add_message(self.request, messages.ERROR, msg,
                                  extra_tags='failed_payment')